diff options
Diffstat (limited to 'target/linux')
88 files changed, 66817 insertions, 51065 deletions
diff --git a/target/linux/coldfire/patches/001-cf.patch b/target/linux/coldfire/patches/001-cf.patch deleted file mode 100644 index 66417e7076..0000000000 --- a/target/linux/coldfire/patches/001-cf.patch +++ /dev/null @@ -1,51053 +0,0 @@ ---- /dev/null -+++ b/arch/m68k/coldfire/cache.c -@@ -0,0 +1,43 @@ -+/* -+ * linux/arch/m68k/coldfire/cache.c -+ * -+ * Matt Waddel Matt.Waddel@freescale.com -+ * Kurt Mahan kmahan@freescale.com -+ * Copyright Freescale Semiconductor, Inc. 2007 -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ */ -+ -+#include <linux/interrupt.h> -+#include <asm/cfcache.h> -+#include <asm/coldfire.h> -+#include <asm/system.h> -+ -+/* Cache Control Reg shadow reg */ -+unsigned long shadow_cacr; -+ -+/** -+ * cacr_set - Set the Cache Control Register -+ * @x Value to set -+ */ -+void cacr_set(unsigned long x) -+{ -+ shadow_cacr = x; -+ -+ __asm__ __volatile__ ("movec %0, %%cacr" -+ : /* no outputs */ -+ : "r" (shadow_cacr)); -+} -+ -+/** -+ * cacr_get - Get the current value of the Cache Control Register -+ * -+ * @return CACR value -+ */ -+unsigned long cacr_get(void) -+{ -+ return shadow_cacr; -+} ---- /dev/null -+++ b/arch/m68k/coldfire/config.c -@@ -0,0 +1,483 @@ -+/* -+ * linux/arch/m68k/coldfire/config.c -+ * -+ * Kurt Mahan kmahan@freescale.com -+ * Matt Waddel Matt.Waddel@freescale.com -+ * Copyright Freescale Semiconductor, Inc. 2007, 2008 -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ */ -+ -+#include <linux/module.h> -+#include <linux/init.h> -+#include <linux/string.h> -+#include <linux/kernel.h> -+#include <linux/console.h> -+#include <linux/bootmem.h> -+#include <linux/mm.h> -+#include <asm/bootinfo.h> -+#include <asm/machdep.h> -+#include <asm/coldfire.h> -+#include <asm/cfcache.h> -+#include <asm/cacheflush.h> -+#include <asm/io.h> -+#include <asm/cfmmu.h> -+#include <asm/setup.h> -+#include <asm/irq.h> -+#include <asm/traps.h> -+#include <asm/movs.h> -+#include <asm/movs.h> -+#include <asm/page.h> -+#include <asm/pgalloc.h> -+ -+#include <asm/mcfsim.h> -+ -+#if defined(CONFIG_M5445X) -+#define UBOOT_EXTRA_CLOCKS -+#elif defined(CONFIG_M547X_8X) -+#define UBOOT_PCI -+#endif -+#include <asm/bootinfo.h> -+ -+#ifdef CONFIG_M5445X -+#include <asm/mcf5445x_intc.h> -+#include <asm/mcf5445x_sdramc.h> -+#include <asm/mcf5445x_fbcs.h> -+#include <asm/mcf5445x_dtim.h> -+#include <asm/mcf5445x_xbs.h> -+#endif -+ -+#ifdef CONFIG_M547X_8X -+#include <asm/m5485gpt.h> -+#endif -+ -+extern int get_irq_list(struct seq_file *p, void *v); -+extern char _text, _end; -+extern char _etext, _edata, __init_begin, __init_end; -+extern struct console mcfrs_console; -+extern char m68k_command_line[CL_SIZE]; -+extern unsigned long availmem; -+ -+static int irq_enable[NR_IRQS]; -+unsigned long num_pages; -+ -+/* ethernet mac addresses from uboot */ -+unsigned char uboot_enet0[6]; -+unsigned char uboot_enet1[6]; -+ -+void coldfire_sort_memrec(void) -+{ -+ int i, j; -+ -+ /* Sort the m68k_memory records by address */ -+ for (i = 0; i < m68k_num_memory; ++i) { -+ for (j = i + 1; j < m68k_num_memory; ++j) { -+ if (m68k_memory[i].addr > m68k_memory[j].addr) { -+ struct mem_info tmp; -+ tmp = m68k_memory[i]; -+ m68k_memory[i] = m68k_memory[j]; -+ m68k_memory[j] = tmp; -+ } -+ } -+ } -+ /* Trim off discontiguous bits */ -+ for (i = 1; i < m68k_num_memory; ++i) { -+ if ((m68k_memory[i-1].addr + m68k_memory[i-1].size) != -+ m68k_memory[i].addr) { -+ printk(KERN_DEBUG "m68k_parse_bootinfo: addr gap between \ -+ 0x%lx & 0x%lx\n", -+ m68k_memory[i-1].addr+m68k_memory[i-1].size, -+ m68k_memory[i].addr); -+ m68k_num_memory = i; -+ break; -+ } -+ } -+} -+ -+/* -+ * UBoot Handler -+ */ -+int __init uboot_commandline(char *bootargs) -+{ -+ int len = 0, cmd_line_len; -+ static struct uboot_record uboot_info; -+ u32 offset = PAGE_OFFSET_RAW - PHYS_OFFSET; -+ -+ extern unsigned long uboot_info_stk; -+ -+ /* validate address */ -+ if ((uboot_info_stk < PAGE_OFFSET_RAW) || -+ (uboot_info_stk >= (PAGE_OFFSET_RAW + CONFIG_SDRAM_SIZE))) -+ return 0; -+ -+ /* Add offset to get post-remapped kernel memory location */ -+ uboot_info.bdi = (struct bd_info *)((*(u32 *)(uboot_info_stk)) + offset); -+ uboot_info.initrd_start = (*(u32 *)(uboot_info_stk+4)) + offset; -+ uboot_info.initrd_end = (*(u32 *)(uboot_info_stk+8)) + offset; -+ uboot_info.cmd_line_start = (*(u32 *)(uboot_info_stk+12)) + offset; -+ uboot_info.cmd_line_stop = (*(u32 *)(uboot_info_stk+16)) + offset; -+ -+ /* copy over mac addresses */ -+ memcpy(uboot_enet0, uboot_info.bdi->bi_enet0addr, 6); -+ memcpy(uboot_enet1, uboot_info.bdi->bi_enet1addr, 6); -+ -+ /* copy command line */ -+ cmd_line_len = uboot_info.cmd_line_stop - uboot_info.cmd_line_start; -+ if ((cmd_line_len > 0) && (cmd_line_len < CL_SIZE-1)) -+ len = (int)strncpy(bootargs, (char *)uboot_info.cmd_line_start,\ -+ cmd_line_len); -+ -+ return len; -+} -+ -+/* -+ * This routine does things not done in the bootloader. -+ */ -+#if defined(CONFIG_M54451) -+#define DEFAULT_COMMAND_LINE "debug root=/dev/nfs rw nfsroot=172.27.155.1:/tftpboot/redstripe/rootfs/ ip=172.27.155.51:172.27.155.1" -+#elif defined(CONFIG_M54455) -+#define MTD_DEFAULT_COMMAND_LINE "root=/dev/mtdblock1 rw rootfstype=jffs2 ip=none mtdparts=physmap-flash.0:5M(kernel)ro,-(jffs2)" -+#define DEFAULT_COMMAND_LINE "debug root=/dev/nfs rw nfsroot=172.27.155.1:/tftpboot/redstripe/rootfs/ ip=172.27.155.55:172.27.155.1" -+#elif defined(CONFIG_M547X_8X) -+#define DEFAULT_COMMAND_LINE "debug root=/dev/nfs rw nfsroot=172.27.155.1:/tftpboot/rigo/rootfs/ ip=172.27.155.75:172.27.155.1" -+#endif -+asmlinkage void __init cf_early_init(void) -+{ -+ struct bi_record *record = (struct bi_record *) &_end; -+ -+ extern char _end; -+ -+#if defined(CONFIG_M5445X) -+ SET_VBR((void *)MCF_RAMBAR1); -+#elif defined(CONFIG_M547X_8X) -+ SET_VBR((void *)MCF_RAMBAR0); -+#endif -+ -+ /* Mask all interrupts */ -+#if defined(CONFIG_M5445X) -+ MCF_INTC0_IMRL = 0xFFFFFFFF; -+ MCF_INTC0_IMRH = 0xFFFFFFFF; -+ MCF_INTC1_IMRL = 0xFFFFFFFF; -+ MCF_INTC1_IMRH = 0xFFFFFFFF; -+#elif defined(CONFIG_M547X_8X) -+ MCF_IMRL = 0xFFFFFFFF; -+ MCF_IMRH = 0xFFFFFFFF; -+#endif -+ -+#if defined(CONFIG_M5445X) -+#if defined(CONFIG_NOR_FLASH_BASE) -+ MCF_FBCS_CSAR(1) = CONFIG_NOR_FLASH_BASE; -+#else -+ MCF_FBCS_CSAR(1) = 0x00000000; -+#endif -+ -+#if CONFIG_SDRAM_SIZE > (256*1024*1024) -+ /* Init optional SDRAM chip select */ -+ MCF_SDRAMC_SDCS(1) = (256*1024*1024) | 0x1B; -+#endif -+#endif /* CONFIG_M5445X */ -+ -+#if defined(CONFIG_M5445X) -+ /* Setup SDRAM crossbar(XBS) priorities */ -+ MCF_XBS_PRS2 = (MCF_XBS_PRS_M0(MCF_XBS_PRI_2) | -+ MCF_XBS_PRS_M1(MCF_XBS_PRI_3) | -+ MCF_XBS_PRS_M2(MCF_XBS_PRI_4) | -+ MCF_XBS_PRS_M3(MCF_XBS_PRI_5) | -+ MCF_XBS_PRS_M5(MCF_XBS_PRI_6) | -+ MCF_XBS_PRS_M6(MCF_XBS_PRI_1) | -+ MCF_XBS_PRS_M7(MCF_XBS_PRI_7)); -+#endif -+ -+ m68k_machtype = MACH_CFMMU; -+ m68k_fputype = FPU_CFV4E; -+ m68k_mmutype = MMU_CFV4E; -+ m68k_cputype = CPU_CFV4E; -+ -+ m68k_num_memory = 0; -+ m68k_memory[m68k_num_memory].addr = CONFIG_SDRAM_BASE; -+ m68k_memory[m68k_num_memory++].size = CONFIG_SDRAM_SIZE; -+ -+ if (!uboot_commandline(m68k_command_line)) { -+#if defined(CONFIG_BOOTPARAM) -+ strncpy(m68k_command_line, CONFIG_BOOTPARAM_STRING, CL_SIZE-1); -+#else -+ strcpy(m68k_command_line, DEFAULT_COMMAND_LINE); -+#endif -+ } -+ -+#if defined(CONFIG_BLK_DEV_INITRD) -+ /* add initrd image */ -+ record = (struct bi_record *) ((void *)record + record->size); -+ record->tag = BI_RAMDISK; -+ record->size = sizeof(record->tag) + sizeof(record->size) -+ + sizeof(record->data[0]) + sizeof(record->data[1]); -+#endif -+ -+ /* Mark end of tags. */ -+ record = (struct bi_record *) ((void *) record + record->size); -+ record->tag = 0; -+ record->data[0] = 0; -+ record->data[1] = 0; -+ record->size = sizeof(record->tag) + sizeof(record->size) -+ + sizeof(record->data[0]) + sizeof(record->data[1]); -+ -+ /* Invalidate caches via CACR */ -+ flush_bcache(); -+ cacr_set(CACHE_DISABLE_MODE); -+ -+ /* Turn on caches via CACR, enable EUSP */ -+ cacr_set(CACHE_INITIAL_MODE); -+ -+} -+ -+#if defined(CONFIG_M5445X) -+void settimericr(unsigned int timer, unsigned int level) -+{ -+ volatile unsigned char *icrp; -+ unsigned int icr; -+ unsigned char irq; -+ -+ if (timer <= 2) { -+ switch (timer) { -+ case 2: irq = 33; icr = MCFSIM_ICR_TIMER2; break; -+ default: irq = 32; icr = MCFSIM_ICR_TIMER1; break; -+ } -+ -+ icrp = (volatile unsigned char *) (icr); -+ *icrp = level; -+ coldfire_enable_irq0(irq); -+ } -+} -+#endif -+ -+/* Assembler routines */ -+asmlinkage void buserr(void); -+asmlinkage void trap(void); -+asmlinkage void system_call(void); -+asmlinkage void inthandler(void); -+ -+void __init coldfire_trap_init(void) -+{ -+ int i = 0; -+ e_vector *vectors; -+ -+#if defined(CONFIG_M5445X) -+ vectors = (e_vector *)MCF_RAMBAR1; -+#elif defined(CONFIG_M547X_8X) -+ vectors = (e_vector *)MCF_RAMBAR0; -+#endif -+ /* -+ * There is a common trap handler and common interrupt -+ * handler that handle almost every vector. We treat -+ * the system call and bus error special, they get their -+ * own first level handlers. -+ */ -+ for (i = 3; (i <= 23); i++) -+ vectors[i] = trap; -+ for (i = 33; (i <= 63); i++) -+ vectors[i] = trap; -+ for (i = 24; (i <= 31); i++) -+ vectors[i] = inthandler; -+ for (i = 64; (i < 255); i++) -+ vectors[i] = inthandler; -+ -+ vectors[255] = 0; -+ vectors[2] = buserr; -+ vectors[32] = system_call; -+} -+ -+#if defined(CONFIG_M5445X) -+ -+void coldfire_tick(void) -+{ -+ /* Reset the ColdFire timer */ -+ __raw_writeb(MCF_DTIM_DTER_CAP | MCF_DTIM_DTER_REF, MCF_DTIM0_DTER); -+} -+ -+void __init coldfire_sched_init(irq_handler_t handler) -+{ -+ unsigned int mcf_timerlevel = 5; -+ unsigned int mcf_timervector = 64+32; -+ -+ __raw_writew(MCF_DTIM_DTMR_RST_RST, MCF_DTIM0_DTMR); -+ __raw_writel(((MCF_BUSCLK / 16) / HZ), MCF_DTIM0_DTRR); -+ __raw_writew(MCF_DTIM_DTMR_ORRI | MCF_DTIM_DTMR_CLK_DIV16 | -+ MCF_DTIM_DTMR_FRR | MCF_DTIM_DTMR_RST_EN, \ -+ MCF_DTIM0_DTMR); -+ -+ request_irq(mcf_timervector, handler, IRQF_DISABLED, \ -+ "timer", (void *)MCF_DTIM0_DTMR); -+ -+ settimericr(1, mcf_timerlevel); -+} -+ -+int timerirqpending(int timer) -+{ -+ unsigned int imr = 0; -+ -+ switch (timer) { -+ case 1: imr = 0x1; break; -+ case 2: imr = 0x2; break; -+ default: break; -+ } -+ -+ return (getiprh() & imr); -+} -+ -+unsigned long coldfire_gettimeoffset(void) -+{ -+ volatile unsigned long trr, tcn, offset; -+ -+ tcn = __raw_readw(MCF_DTIM0_DTCN); -+ trr = __raw_readl(MCF_DTIM0_DTRR); -+ offset = (tcn * (1000000 / HZ)) / trr; -+ -+ /* Check if we just wrapped the counters and maybe missed a tick */ -+ if ((offset < (1000000 / HZ / 2)) && timerirqpending(1)) -+ offset += 1000000 / HZ; -+ return offset; -+} -+ -+#elif defined(CONFIG_M547X_8X) -+ -+void coldfire_tick(void) -+{ -+ /* Reset the ColdFire timer */ -+ MCF_SSR(0) = MCF_SSR_ST; -+} -+ -+void __init coldfire_sched_init(irq_handler_t handler) -+{ -+ int irq = ISC_SLTn(0); -+ -+ MCF_SCR(0) = 0; -+ MCF_ICR(irq) = ILP_SLT0; -+ request_irq(64 + irq, handler, IRQF_DISABLED, "ColdFire Timer 0", NULL); -+ MCF_SLTCNT(0) = MCF_BUSCLK / HZ; -+ MCF_SCR(0) |= MCF_SCR_TEN | MCF_SCR_IEN | MCF_SCR_RUN; -+} -+ -+unsigned long coldfire_gettimeoffset(void) -+{ -+ volatile unsigned long trr, tcn, offset; -+ trr = MCF_SLTCNT(0); -+ tcn = MCF_SCNT(0); -+ -+ offset = (trr - tcn) * ((1000000 >> 3) / HZ) / (trr >> 3); -+ if (MCF_SSR(0) & MCF_SSR_ST) -+ offset += 1000000 / HZ; -+ -+ return offset; -+} -+ -+#endif -+ -+void coldfire_reboot(void) -+{ -+#if defined(CONFIG_M5445X) -+ /* disable interrupts and do a software reset */ -+ asm("movew #0x2700, %%sr\n\t" -+ "moveb #0x80, %%d0\n\t" -+ "moveb %%d0, 0xfc0a0000\n\t" -+ : : : "%d0"); -+#elif defined(CONFIG_M547X_8X) -+ /* disable interrupts and enable the watchdog */ -+ printk(KERN_INFO "Rebooting\n"); -+ asm("movew #0x2700, %sr\n"); -+ MCF_GPT_GMS0 = MCF_GPT_GMS_WDEN | MCF_GPT_GMS_CE | MCF_GPT_GMS_TMS(4); -+#endif -+} -+ -+static void coldfire_get_model(char *model) -+{ -+ sprintf(model, "Version 4 ColdFire"); -+} -+ -+static void __init -+coldfire_bootmem_alloc(unsigned long memory_start, unsigned long memory_end) -+{ -+ unsigned long base_pfn; -+ -+ /* compute total pages in system */ -+ num_pages = PAGE_ALIGN(memory_end - PAGE_OFFSET) >> PAGE_SHIFT; -+ -+ /* align start/end to page boundries */ -+ memory_start = PAGE_ALIGN(memory_start); -+ memory_end = memory_end & PAGE_MASK; -+ -+ /* page numbers */ -+ base_pfn = __pa(PAGE_OFFSET) >> PAGE_SHIFT; -+ min_low_pfn = __pa(memory_start) >> PAGE_SHIFT; -+ max_low_pfn = __pa(memory_end) >> PAGE_SHIFT; -+ -+ high_memory = (void *)memory_end; -+ availmem = memory_start; -+ -+ /* setup bootmem data */ -+ m68k_setup_node(0); -+ availmem += init_bootmem_node(NODE_DATA(0), min_low_pfn, -+ base_pfn, max_low_pfn); -+ availmem = PAGE_ALIGN(availmem); -+ free_bootmem(__pa(availmem), memory_end - (availmem)); -+} -+ -+void __init config_coldfire(void) -+{ -+ unsigned long endmem, startmem; -+ int i; -+ -+ /* -+ * Calculate endmem from m68k_memory, assume all are contiguous -+ */ -+ startmem = ((((int) &_end) + (PAGE_SIZE - 1)) & PAGE_MASK); -+ endmem = PAGE_OFFSET; -+ for (i = 0; i < m68k_num_memory; ++i) -+ endmem += m68k_memory[i].size; -+ -+ printk(KERN_INFO "starting up linux startmem 0x%lx, endmem 0x%lx, \ -+ size %luMB\n", startmem, endmem, (endmem - startmem) >> 20); -+ -+ memset(irq_enable, 0, sizeof(irq_enable)); -+ -+ /* -+ * Setup coldfire mach-specific handlers -+ */ -+ mach_max_dma_address = 0xffffffff; -+ mach_sched_init = coldfire_sched_init; -+ mach_tick = coldfire_tick; -+ mach_gettimeoffset = coldfire_gettimeoffset; -+ mach_reset = coldfire_reboot; -+/* mach_hwclk = coldfire_hwclk; to be done */ -+ mach_get_model = coldfire_get_model; -+ -+ coldfire_bootmem_alloc(startmem, endmem-1); -+ -+ /* -+ * initrd setup -+ */ -+/* #ifdef CONFIG_BLK_DEV_INITRD -+ if (m68k_ramdisk.size) { -+ reserve_bootmem (__pa(m68k_ramdisk.addr), m68k_ramdisk.size); -+ initrd_start = (unsigned long) m68k_ramdisk.addr; -+ initrd_end = initrd_start + m68k_ramdisk.size; -+ printk (KERN_DEBUG "initrd: %08lx - %08lx\n", initrd_start, -+ initrd_end); -+ } -+#endif */ -+ -+#if defined(CONFIG_DUMMY_CONSOLE) || defined(CONFIG_FRAMEBUFFER_CONSOLE) -+ conswitchp = &dummy_con; -+#endif -+ -+#if defined(CONFIG_SERIAL_COLDFIRE) -+ /* -+ * This causes trouble when it is re-registered later. -+ * Currently this is fixed by conditionally commenting -+ * out the register_console in mcf_serial.c -+ */ -+ register_console(&mcfrs_console); -+#endif -+} ---- /dev/null -+++ b/arch/m68k/coldfire/entry.S -@@ -0,0 +1,711 @@ -+/* -+ * arch/m68k/coldfire/entry.S -+ * -+ * Copyright (C) 1999-2002, Greg Ungerer (gerg@snapgear.com) -+ * Copyright (C) 1998 D. Jeff Dionne <jeff@lineo.ca>, -+ * Kenneth Albanowski <kjahds@kjahds.com>, -+ * Copyright (C) 2000 Lineo Inc. (www.lineo.com) -+ * Copyright (C) 2004-2006 Macq Electronique SA. (www.macqel.com) -+ * Matt Waddel Matt.Waddel@freescale.com -+ * Kurt Mahan kmahan@freescale.com -+ * Copyright Freescale Semiconductor, Inc. 2007 -+ * -+ * Modify irq status in buserr -- (c) Copyright 2008, SYSTEM electronic Gmbh -+ * -+ * Based on: -+ * -+ * arch/m68knommu/platform/5307/entry.S & -+ * arch/m68k/kernel/entry.S -+ * -+ * Copyright (C) 1991, 1992 Linus Torvalds -+ * -+ * This file is subject to the terms and conditions of the GNU General Public -+ * License. See the file README.legal in the main directory of this archive -+ * for more details. -+ * -+ * Linux/m68k support by Hamish Macdonald -+ * -+ * ColdFire support by Greg Ungerer (gerg@snapgear.com) -+ * 5307 fixes by David W. Miller -+ * linux 2.4 support David McCullough <davidm@snapgear.com> -+ * Bug, speed and maintainability fixes by Philippe De Muyter <phdm@macqel.be> -+ * Ported to mmu Coldfire by Matt Waddel -+ */ -+ -+#include <linux/sys.h> -+#include <linux/linkage.h> -+#include <asm/cf_entry.h> -+#include <asm/errno.h> -+#include <asm/setup.h> -+#include <asm/segment.h> -+#include <asm/traps.h> -+#include <asm/unistd.h> -+ -+/* -+ * TASK_INFO: -+ * -+ * - TINFO_PREEMPT (struct thread_info / preempt_count) -+ * Used to keep track of preemptability -+ * - TINFO_FLAGS (struct thread_info / flags - include/asm-m68k/thread_info.h) -+ * Various bit flags that are checked for scheduling/tracing -+ * Bits 0-7 are checked every exception exit -+ * 8-15 are checked every syscall exit -+ * -+ * TIF_SIGPENDING 6 -+ * TIF_NEED_RESCHED 7 -+ * TIF_DELAYED_TRACE 14 -+ * TIF_SYSCALL_TRACE 15 -+ * TIF_MEMDIE 16 (never checked here) -+ */ -+ -+.bss -+ -+sw_ksp: -+.long 0 -+ -+sw_usp: -+.long 0 -+ -+.text -+ -+.globl system_call -+.globl buserr -+.globl trap -+.globl resume -+.globl ret_from_exception -+.globl ret_from_signal -+.globl sys_call_table -+.globl ret_from_interrupt -+.globl inthandler -+ -+ENTRY(buserr) -+#ifdef CONFIG_COLDFIRE_FOO -+ movew #0x2700,%sr /* lock interrupts */ -+#endif -+ SAVE_ALL_INT -+#ifdef CONFIG_COLDFIRE_FOO -+ movew PT_SR(%sp),%d3 /* get original %sr */ -+ oril #0x2000,%d3 /* set supervisor mode in it */ -+ movew %d3,%sr /* recover irq state */ -+#endif -+ GET_CURRENT(%d0) -+ movel %sp,%sp@- /* stack frame pointer argument */ -+ jsr buserr_c -+ addql #4,%sp -+ jra .Lret_from_exception -+ -+ENTRY(trap) -+ SAVE_ALL_INT -+ GET_CURRENT(%d0) -+ movel %sp,%sp@- /* stack frame pointer argument */ -+ jsr trap_c -+ addql #4,%sp -+ jra .Lret_from_exception -+ -+ /* After a fork we jump here directly from resume, -+ %d1 contains the previous task schedule_tail */ -+ENTRY(ret_from_fork) -+ movel %d1,%sp@- -+ jsr schedule_tail -+ addql #4,%sp -+ jra .Lret_from_exception -+ -+do_trace_entry: -+ movel #-ENOSYS,%d1 /* needed for strace */ -+ movel %d1,%sp@(PT_D0) -+ subql #4,%sp -+ SAVE_SWITCH_STACK -+ jbsr syscall_trace -+ RESTORE_SWITCH_STACK -+ addql #4,%sp -+ movel %sp@(PT_ORIG_D0),%d0 -+ cmpl #NR_syscalls,%d0 -+ jcs syscall -+badsys: -+ movel #-ENOSYS,%d1 -+ movel %d1,%sp@(PT_D0) -+ jra ret_from_exception -+ -+do_trace_exit: -+ subql #4,%sp -+ SAVE_SWITCH_STACK -+ jbsr syscall_trace -+ RESTORE_SWITCH_STACK -+ addql #4,%sp -+ jra .Lret_from_exception -+ -+ENTRY(ret_from_signal) -+ RESTORE_SWITCH_STACK -+ addql #4,%sp -+ jra .Lret_from_exception -+ -+ENTRY(system_call) -+ SAVE_ALL_SYS -+ -+ GET_CURRENT(%d1) -+ /* save top of frame */ -+ movel %sp,%curptr@(TASK_THREAD+THREAD_ESP0) -+ -+ /* syscall trace */ -+ tstb %curptr@(TASK_INFO+TINFO_FLAGS+2) -+ jmi do_trace_entry /* SYSCALL_TRACE is set */ -+ cmpl #NR_syscalls,%d0 -+ jcc badsys -+syscall: -+ movel #sys_call_table,%a0 -+ asll #2,%d0 -+ addl %d0,%a0 -+ movel %a0@,%a0 -+ jsr %a0@ -+ movel %d0,%sp@(PT_D0) /* save the return value */ -+ret_from_syscall: -+ movew %curptr@(TASK_INFO+TINFO_FLAGS+2),%d0 -+ jne syscall_exit_work /* flags set so process */ -+1: RESTORE_ALL -+ -+syscall_exit_work: -+ btst #5,%sp@(PT_SR) /* check if returning to kernel */ -+ bnes 1b /* if so, skip resched, signals */ -+ -+ btstl #15,%d0 /* check if SYSCALL_TRACE */ -+ jne do_trace_exit -+ btstl #14,%d0 /* check if DELAYED_TRACE */ -+ jne do_delayed_trace -+ btstl #6,%d0 /* check if SIGPENDING */ -+ jne do_signal_return -+ pea resume_userspace -+ jra schedule -+ -+ENTRY(ret_from_exception) -+.Lret_from_exception: -+ btst #5,%sp@(PT_SR) /* check if returning to kernel */ -+ bnes 1f /* if so, skip resched, signals */ -+ movel %d0,%sp@- /* Only allow interrupts when we are */ -+ move %sr,%d0 /* last one on the kernel stack, */ -+ andl #ALLOWINT,%d0 /* otherwise stack overflow can occur */ -+ move %d0,%sr /* during heavy interrupt load. */ -+ movel %sp@+,%d0 -+ -+resume_userspace: -+ moveb %curptr@(TASK_INFO+TINFO_FLAGS+3),%d0 -+ jne exit_work /* SIGPENDING and/or NEED_RESCHED set */ -+1: RESTORE_ALL -+ -+exit_work: -+ /* save top of frame */ -+ movel %sp,%curptr@(TASK_THREAD+THREAD_ESP0) -+ btstl #6,%d0 /* check for SIGPENDING in flags */ -+ jne do_signal_return -+ pea resume_userspace -+ jra schedule -+ -+do_signal_return: -+ subql #4,%sp /* dummy return address */ -+ SAVE_SWITCH_STACK -+ pea %sp@(SWITCH_STACK_SIZE) -+ clrl %sp@- -+ bsrl do_signal -+ addql #8,%sp -+ RESTORE_SWITCH_STACK -+ addql #4,%sp -+ jbra resume_userspace -+ -+do_delayed_trace: -+ bclr #7,%sp@(PT_SR) /* clear trace bit in SR */ -+ pea 1 /* send SIGTRAP */ -+ movel %curptr,%sp@- -+ pea LSIGTRAP -+ jbsr send_sig -+ addql #8,%sp -+ addql #4,%sp -+ jbra resume_userspace -+ -+/* -+ * This is the interrupt handler (for all hardware interrupt -+ * sources). It figures out the vector number and calls the appropriate -+ * interrupt service routine directly. -+ */ -+ENTRY(inthandler) -+ SAVE_ALL_INT -+ GET_CURRENT(%d0) -+ addql #1,%curptr@(TASK_INFO+TINFO_PREEMPT) -+ /* put exception # in d0 */ -+ movel %sp@(PT_VECTOR),%d0 -+ swap %d0 /* extract bits 25:18 */ -+ lsrl #2,%d0 -+ andl #0x0ff,%d0 -+ -+ movel %sp,%sp@- -+ movel %d0,%sp@- /* put vector # on stack */ -+auto_irqhandler_fixup = . + 2 -+ jbsr process_int /* process the IRQ */ -+ addql #8,%sp /* pop parameters off stack */ -+ -+ENTRY(ret_from_interrupt) -+ret_from_interrupt: -+ -+ subql #1,%curptr@(TASK_INFO+TINFO_PREEMPT) -+ jeq ret_from_last_interrupt -+2: RESTORE_ALL -+ -+ ALIGN -+ret_from_last_interrupt: -+ moveb %sp@(PT_SR),%d0 -+ andl #(~ALLOWINT>>8)&0xff,%d0 -+ jne 2b -+ -+ /* check if we need to do software interrupts */ -+ tstl irq_stat+CPUSTAT_SOFTIRQ_PENDING -+ jeq .Lret_from_exception -+ pea ret_from_exception -+ jra do_softirq -+ -+ENTRY(user_inthandler) -+ SAVE_ALL_INT -+ GET_CURRENT(%d0) -+ addql #1,%curptr@(TASK_INFO+TINFO_PREEMPT) -+ /* put exception # in d0 */ -+ movel %sp@(PT_VECTOR),%d0 -+user_irqvec_fixup = . + 2 -+ swap %d0 /* extract bits 25:18 */ -+ lsrl #2,%d0 -+ andl #0x0ff,%d0 -+ -+ movel %sp,%sp@- -+ movel %d0,%sp@- /* put vector # on stack */ -+user_irqhandler_fixup = . + 2 -+ jbsr process_int /* process the IRQ */ -+ addql #8,%sp /* pop parameters off stack */ -+ -+ subql #1,%curptr@(TASK_INFO+TINFO_PREEMPT) -+ jeq ret_from_last_interrupt -+ RESTORE_ALL -+ -+/* Handler for uninitialized and spurious interrupts */ -+ -+ENTRY(bad_inthandler) -+ SAVE_ALL_INT -+ GET_CURRENT(%d0) -+ addql #1,%curptr@(TASK_INFO+TINFO_PREEMPT) -+ -+ movel %sp,%sp@- -+ jsr handle_badint -+ addql #4,%sp -+ -+ subql #1,%curptr@(TASK_INFO+TINFO_PREEMPT) -+ jeq ret_from_last_interrupt -+ RESTORE_ALL -+ -+ENTRY(sys_fork) -+ SAVE_SWITCH_STACK -+ pea %sp@(SWITCH_STACK_SIZE) -+ jbsr m68k_fork -+ addql #4,%sp -+ RESTORE_SWITCH_STACK -+ rts -+ -+ENTRY(sys_clone) -+ SAVE_SWITCH_STACK -+ pea %sp@(SWITCH_STACK_SIZE) -+ jbsr m68k_clone -+ addql #4,%sp -+ RESTORE_SWITCH_STACK -+ rts -+ -+ENTRY(sys_vfork) -+ SAVE_SWITCH_STACK -+ pea %sp@(SWITCH_STACK_SIZE) -+ jbsr m68k_vfork -+ addql #4,%sp -+ RESTORE_SWITCH_STACK -+ rts -+ -+ENTRY(sys_sigsuspend) -+ SAVE_SWITCH_STACK -+ pea %sp@(SWITCH_STACK_SIZE) -+ jbsr do_sigsuspend -+ addql #4,%sp -+ RESTORE_SWITCH_STACK -+ rts -+ -+ENTRY(sys_rt_sigsuspend) -+ SAVE_SWITCH_STACK -+ pea %sp@(SWITCH_STACK_SIZE) -+ jbsr do_rt_sigsuspend -+ addql #4,%sp -+ RESTORE_SWITCH_STACK -+ rts -+ -+ENTRY(sys_sigreturn) -+ SAVE_SWITCH_STACK -+ jbsr do_sigreturn -+ RESTORE_SWITCH_STACK -+ rts -+ -+ENTRY(sys_rt_sigreturn) -+ SAVE_SWITCH_STACK -+ jbsr do_rt_sigreturn -+ RESTORE_SWITCH_STACK -+ rts -+ -+resume: -+ /* -+ * Beware - when entering resume, prev (the current task) is -+ * in a0, next (the new task) is in a1,so don't change these -+ * registers until their contents are no longer needed. -+ */ -+ -+ /* save sr */ -+ movew %sr,%d0 -+ movew %d0,%a0@(TASK_THREAD+THREAD_SR) -+ -+ /* save usp */ -+ /* Save USP via %a1 (which is saved/restored from %d0) */ -+ movel %a1,%d0 -+ movel %usp,%a1 -+ movel %a1,%a0@(TASK_THREAD+THREAD_USP) -+ movel %d0,%a1 -+ -+ /* save non-scratch registers on stack */ -+ SAVE_SWITCH_STACK -+ -+ /* save current kernel stack pointer */ -+ movel %sp,%a0@(TASK_THREAD+THREAD_KSP) -+ -+ /* Return previous task in %d1 */ -+ movel %curptr,%d1 -+ -+ /* switch to new task (a1 contains new task) */ -+ movel %a1,%curptr -+ -+ /* restore the kernel stack pointer */ -+ movel %a1@(TASK_THREAD+THREAD_KSP),%sp -+ -+ /* restore non-scratch registers */ -+ RESTORE_SWITCH_STACK -+ -+ /* restore user stack pointer */ -+ movel %a1@(TASK_THREAD+THREAD_USP),%a0 -+ movel %a0,%usp -+ -+ /* restore status register */ -+ movew %a1@(TASK_THREAD+THREAD_SR),%d0 -+ movew %d0,%sr -+ -+ rts -+ -+.data -+ALIGN -+sys_call_table: -+ .long sys_ni_syscall /* 0 - old "setup()" system call*/ -+ .long sys_exit -+ .long sys_fork -+ .long sys_read -+ .long sys_write -+ .long sys_open /* 5 */ -+ .long sys_close -+ .long sys_waitpid -+ .long sys_creat -+ .long sys_link -+ .long sys_unlink /* 10 */ -+ .long sys_execve -+ .long sys_chdir -+ .long sys_time -+ .long sys_mknod -+ .long sys_chmod /* 15 */ -+ .long sys_chown16 -+ .long sys_ni_syscall /* old break syscall holder */ -+ .long sys_stat -+ .long sys_lseek -+ .long sys_getpid /* 20 */ -+ .long sys_mount -+ .long sys_oldumount -+ .long sys_setuid16 -+ .long sys_getuid16 -+ .long sys_stime /* 25 */ -+ .long sys_ptrace -+ .long sys_alarm -+ .long sys_fstat -+ .long sys_pause -+ .long sys_utime /* 30 */ -+ .long sys_ni_syscall /* old stty syscall holder */ -+ .long sys_ni_syscall /* old gtty syscall holder */ -+ .long sys_access -+ .long sys_nice -+ .long sys_ni_syscall /* 35 */ /* old ftime syscall holder */ -+ .long sys_sync -+ .long sys_kill -+ .long sys_rename -+ .long sys_mkdir -+ .long sys_rmdir /* 40 */ -+ .long sys_dup -+ .long sys_pipe -+ .long sys_times -+ .long sys_ni_syscall /* old prof syscall holder */ -+ .long sys_brk /* 45 */ -+ .long sys_setgid16 -+ .long sys_getgid16 -+ .long sys_signal -+ .long sys_geteuid16 -+ .long sys_getegid16 /* 50 */ -+ .long sys_acct -+ .long sys_umount /* recycled never used phys() */ -+ .long sys_ni_syscall /* old lock syscall holder */ -+ .long sys_ioctl -+ .long sys_fcntl /* 55 */ -+ .long sys_ni_syscall /* old mpx syscall holder */ -+ .long sys_setpgid -+ .long sys_ni_syscall /* old ulimit syscall holder */ -+ .long sys_ni_syscall -+ .long sys_umask /* 60 */ -+ .long sys_chroot -+ .long sys_ustat -+ .long sys_dup2 -+ .long sys_getppid -+ .long sys_getpgrp /* 65 */ -+ .long sys_setsid -+ .long sys_sigaction -+ .long sys_sgetmask -+ .long sys_ssetmask -+ .long sys_setreuid16 /* 70 */ -+ .long sys_setregid16 -+ .long sys_sigsuspend -+ .long sys_sigpending -+ .long sys_sethostname -+ .long sys_setrlimit /* 75 */ -+ .long sys_old_getrlimit -+ .long sys_getrusage -+ .long sys_gettimeofday -+ .long sys_settimeofday -+ .long sys_getgroups16 /* 80 */ -+ .long sys_setgroups16 -+ .long old_select -+ .long sys_symlink -+ .long sys_lstat -+ .long sys_readlink /* 85 */ -+ .long sys_uselib -+ .long sys_swapon -+ .long sys_reboot -+ .long old_readdir -+ .long old_mmap /* 90 */ -+ .long sys_munmap -+ .long sys_truncate -+ .long sys_ftruncate -+ .long sys_fchmod -+ .long sys_fchown16 /* 95 */ -+ .long sys_getpriority -+ .long sys_setpriority -+ .long sys_ni_syscall /* old profil syscall holder */ -+ .long sys_statfs -+ .long sys_fstatfs /* 100 */ -+ .long sys_ni_syscall /* ioperm for i386 */ -+ .long sys_socketcall -+ .long sys_syslog -+ .long sys_setitimer -+ .long sys_getitimer /* 105 */ -+ .long sys_newstat -+ .long sys_newlstat -+ .long sys_newfstat -+ .long sys_ni_syscall -+ .long sys_ni_syscall /* 110 */ /* iopl for i386 */ -+ .long sys_vhangup -+ .long sys_ni_syscall /* obsolete idle() syscall */ -+ .long sys_ni_syscall /* vm86old for i386 */ -+ .long sys_wait4 -+ .long sys_swapoff /* 115 */ -+ .long sys_sysinfo -+ .long sys_ipc -+ .long sys_fsync -+ .long sys_sigreturn -+ .long sys_clone /* 120 */ -+ .long sys_setdomainname -+ .long sys_newuname -+ .long sys_cacheflush /* modify_ldt for i386 */ -+ .long sys_adjtimex -+ .long sys_mprotect /* 125 */ -+ .long sys_sigprocmask -+ .long sys_ni_syscall /* old "create_module" */ -+ .long sys_init_module -+ .long sys_delete_module -+ .long sys_ni_syscall /* 130 - old "get_kernel_syms" */ -+ .long sys_quotactl -+ .long sys_getpgid -+ .long sys_fchdir -+ .long sys_bdflush -+ .long sys_sysfs /* 135 */ -+ .long sys_personality -+ .long sys_ni_syscall /* for afs_syscall */ -+ .long sys_setfsuid16 -+ .long sys_setfsgid16 -+ .long sys_llseek /* 140 */ -+ .long sys_getdents -+ .long sys_select -+ .long sys_flock -+ .long sys_msync -+ .long sys_readv /* 145 */ -+ .long sys_writev -+ .long sys_getsid -+ .long sys_fdatasync -+ .long sys_sysctl -+ .long sys_mlock /* 150 */ -+ .long sys_munlock -+ .long sys_mlockall -+ .long sys_munlockall -+ .long sys_sched_setparam -+ .long sys_sched_getparam /* 155 */ -+ .long sys_sched_setscheduler -+ .long sys_sched_getscheduler -+ .long sys_sched_yield -+ .long sys_sched_get_priority_max -+ .long sys_sched_get_priority_min /* 160 */ -+ .long sys_sched_rr_get_interval -+ .long sys_nanosleep -+ .long sys_mremap -+ .long sys_setresuid16 -+ .long sys_getresuid16 /* 165 */ -+ .long sys_getpagesize -+ .long sys_ni_syscall /* old sys_query_module */ -+ .long sys_poll -+ .long sys_nfsservctl -+ .long sys_setresgid16 /* 170 */ -+ .long sys_getresgid16 -+ .long sys_prctl -+ .long sys_rt_sigreturn -+ .long sys_rt_sigaction -+ .long sys_rt_sigprocmask /* 175 */ -+ .long sys_rt_sigpending -+ .long sys_rt_sigtimedwait -+ .long sys_rt_sigqueueinfo -+ .long sys_rt_sigsuspend -+ .long sys_pread64 /* 180 */ -+ .long sys_pwrite64 -+ .long sys_lchown16; -+ .long sys_getcwd -+ .long sys_capget -+ .long sys_capset /* 185 */ -+ .long sys_sigaltstack -+ .long sys_sendfile -+ .long sys_ni_syscall /* streams1 */ -+ .long sys_ni_syscall /* streams2 */ -+ .long sys_vfork /* 190 */ -+ .long sys_getrlimit -+ .long sys_mmap2 -+ .long sys_truncate64 -+ .long sys_ftruncate64 -+ .long sys_stat64 /* 195 */ -+ .long sys_lstat64 -+ .long sys_fstat64 -+ .long sys_chown -+ .long sys_getuid -+ .long sys_getgid /* 200 */ -+ .long sys_geteuid -+ .long sys_getegid -+ .long sys_setreuid -+ .long sys_setregid -+ .long sys_getgroups /* 205 */ -+ .long sys_setgroups -+ .long sys_fchown -+ .long sys_setresuid -+ .long sys_getresuid -+ .long sys_setresgid /* 210 */ -+ .long sys_getresgid -+ .long sys_lchown -+ .long sys_setuid -+ .long sys_setgid -+ .long sys_setfsuid /* 215 */ -+ .long sys_setfsgid -+ .long sys_pivot_root -+ .long sys_ni_syscall -+ .long sys_ni_syscall -+ .long sys_getdents64 /* 220 */ -+ .long sys_gettid -+ .long sys_tkill -+ .long sys_setxattr -+ .long sys_lsetxattr -+ .long sys_fsetxattr /* 225 */ -+ .long sys_getxattr -+ .long sys_lgetxattr -+ .long sys_fgetxattr -+ .long sys_listxattr -+ .long sys_llistxattr /* 230 */ -+ .long sys_flistxattr -+ .long sys_removexattr -+ .long sys_lremovexattr -+ .long sys_fremovexattr -+ .long sys_futex /* 235 */ -+ .long sys_sendfile64 -+ .long sys_mincore -+ .long sys_madvise -+ .long sys_fcntl64 -+ .long sys_readahead /* 240 */ -+ .long sys_io_setup -+ .long sys_io_destroy -+ .long sys_io_getevents -+ .long sys_io_submit -+ .long sys_io_cancel /* 245 */ -+ .long sys_fadvise64 -+ .long sys_exit_group -+ .long sys_lookup_dcookie -+ .long sys_epoll_create -+ .long sys_epoll_ctl /* 250 */ -+ .long sys_epoll_wait -+ .long sys_remap_file_pages -+ .long sys_set_tid_address -+ .long sys_timer_create -+ .long sys_timer_settime /* 255 */ -+ .long sys_timer_gettime -+ .long sys_timer_getoverrun -+ .long sys_timer_delete -+ .long sys_clock_settime -+ .long sys_clock_gettime /* 260 */ -+ .long sys_clock_getres -+ .long sys_clock_nanosleep -+ .long sys_statfs64 -+ .long sys_fstatfs64 -+ .long sys_tgkill /* 265 */ -+ .long sys_utimes -+ .long sys_fadvise64_64 -+ .long sys_mbind -+ .long sys_get_mempolicy -+ .long sys_set_mempolicy /* 270 */ -+ .long sys_mq_open -+ .long sys_mq_unlink -+ .long sys_mq_timedsend -+ .long sys_mq_timedreceive -+ .long sys_mq_notify /* 275 */ -+ .long sys_mq_getsetattr -+ .long sys_waitid -+ .long sys_ni_syscall /* for sys_vserver */ -+ .long sys_add_key -+ .long sys_request_key /* 280 */ -+ .long sys_keyctl -+ .long sys_ioprio_set -+ .long sys_ioprio_get -+ .long sys_inotify_init -+ .long sys_inotify_add_watch /* 285 */ -+ .long sys_inotify_rm_watch -+ .long sys_migrate_pages -+ .long sys_openat -+ .long sys_mkdirat -+ .long sys_mknodat /* 290 */ -+ .long sys_fchownat -+ .long sys_futimesat -+ .long sys_fstatat64 -+ .long sys_unlinkat -+ .long sys_renameat /* 295 */ -+ .long sys_linkat -+ .long sys_symlinkat -+ .long sys_readlinkat -+ .long sys_fchmodat -+ .long sys_faccessat /* 300 */ -+ .long sys_ni_syscall /* Reserved for pselect6 */ -+ .long sys_ni_syscall /* Reserved for ppoll */ -+ .long sys_unshare -+ .long sys_set_robust_list -+ .long sys_get_robust_list /* 305 */ -+ .long sys_splice -+ .long sys_sync_file_range -+ .long sys_tee -+ .long sys_vmsplice -+ .long sys_move_pages /* 310 */ -+ ---- /dev/null -+++ b/arch/m68k/coldfire/head.S -@@ -0,0 +1,661 @@ -+/* -+ * head.S is the MMU enabled ColdFire specific initial boot code -+ * -+ * Ported to ColdFire by -+ * Matt Waddel Matt.Waddel@freescale.com -+ * Kurt Mahan kmahan@freescale.com -+ * Copyright Freescale Semiconductor, Inc. 2007, 2008 -+ * Phys kernel mapping Copyright Daniel Krueger, SYSTEC electornic GmbH 2008 -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * Parts of this code came from arch/m68k/kernel/head.S -+ */ -+#include <linux/linkage.h> -+#include <linux/init.h> -+#include <asm/bootinfo.h> -+#include <asm/setup.h> -+#include <asm/entry.h> -+#include <asm/pgtable.h> -+#include <asm/page.h> -+#include <asm/coldfire.h> -+#include <asm/mcfuart.h> -+#include <asm/cfcache.h> -+ -+#define DEBUG -+ -+.globl kernel_pg_dir -+.globl availmem -+.globl set_context -+.globl set_fpga -+ -+#ifdef DEBUG -+/* When debugging use readable names for labels */ -+#ifdef __STDC__ -+#define L(name) .head.S.##name -+#else -+#define L(name) .head.S./**/name -+#endif -+#else -+#ifdef __STDC__ -+#define L(name) .L##name -+#else -+#define L(name) .L/**/name -+#endif -+#endif -+ -+/* The __INITDATA stuff is a no-op when ftrace or kgdb are turned on */ -+#ifndef __INITDATA -+#define __INITDATA .data -+#define __FINIT .previous -+#endif -+ -+#if CONFIG_SDRAM_BASE != PAGE_OFFSET -+/* -+ * Kernel mapped to virtual ram address. -+ * -+ * M5445x: -+ * Data[0]: 0xF0000000 -> 0xFFFFFFFF System regs -+ * Data[1]: 0xA0000000 -> 0xAFFFFFFF PCI -+ * Code[0]: Not Mapped -+ * Code[1]: Not Mapped -+ * -+ * M547x/M548x -+ * Data[0]: 0xF0000000 -> 0xFFFFFFFF System regs -+ * Data[1]: Not Mapped -+ * Code[0]: Not Mapped -+ * Code[1]: Not Mapped -+ */ -+#if defined(CONFIG_M5445X) -+#define ACR0_DEFAULT #0xF00FA048 /* System regs */ -+#define ACR1_DEFAULT #0xA00FA048 /* PCI */ -+#define ACR2_DEFAULT #0x00000000 /* Not Mapped */ -+#define ACR3_DEFAULT #0x00000000 /* Not Mapped */ -+#elif defined(CONFIG_M547X_8X) -+#define ACR0_DEFAULT #0xF00FA048 /* System Regs */ -+#define ACR1_DEFAULT #0x00000000 /* Not Mapped */ -+#define ACR2_DEFAULT #0x00000000 /* Not Mapped */ -+#define ACR3_DEFAULT #0x00000000 /* Not Mapped */ -+#endif -+ -+#else /* CONFIG_SDRAM_BASE = PAGE_OFFSET */ -+/* -+ * Kernel mapped to physical ram address. -+ * -+ * M5445x: -+ * Data[0]: 0xF0000000 -> 0xFFFFFFFF System regs -+ * Data[1]: 0x40000000 -> 0x4FFFFFFF SDRAM - uncached -+ * Code[0]: Not Mapped -+ * Code[1]: 0x40000000 -> 0x4FFFFFFF SDRAM - cached -+ * -+ * M547x/M548x -+ * Data[0]: 0xF0000000 -> 0xFFFFFFFF System regs -+ * Data[1]: 0x00000000 -> 0x0FFFFFFF SDRAM - uncached -+ * Code[0]: Not Mapped -+ * Code[1]: 0x00000000 -> 0x0FFFFFFF SDRAM - cached -+ */ -+#if defined(CONFIG_M5445X) -+#define ACR0_DEFAULT #0xF00FA048 /* System Regs */ -+#define ACR1_DEFAULT #0x400FA048 /* SDRAM uncached */ -+#define ACR2_DEFAULT #0x00000000 /* Not mapped */ -+#define ACR3_DEFAULT #0x400FA008 /* SDRAM cached */ -+#elif defined(CONFIG_M547X_8X) -+#define ACR0_DEFAULT #0xF00FA048 /* System Regs */ -+#define ACR1_DEFAULT #0x000FA048 /* SDRAM uncached */ -+#define ACR2_DEFAULT #0x00000000 /* Not mapped */ -+#define ACR3_DEFAULT #0x000FA008 /* SDRAM cached */ -+#endif -+#endif -+ -+/* Several macros to make the writing of subroutines easier: -+ * - func_start marks the beginning of the routine which setups the frame -+ * register and saves the registers, it also defines another macro -+ * to automatically restore the registers again. -+ * - func_return marks the end of the routine and simply calls the prepared -+ * macro to restore registers and jump back to the caller. -+ * - func_define generates another macro to automatically put arguments -+ * onto the stack call the subroutine and cleanup the stack again. -+ */ -+ -+.macro load_symbol_address symbol,register -+ movel #\symbol,\register -+.endm -+ -+.macro func_start name,saveregs,savesize,stack=0 -+L(\name): -+ linkw %a6,#-\stack -+ subal #(\savesize),%sp -+ moveml \saveregs,%sp@ -+.set stackstart,-\stack -+ -+.macro func_return_\name -+ moveml %sp@,\saveregs -+ addal #(\savesize),%sp -+ unlk %a6 -+ rts -+.endm -+.endm -+ -+.macro func_return name -+ func_return_\name -+.endm -+ -+.macro func_call name -+ jbsr L(\name) -+.endm -+ -+.macro move_stack nr,arg1,arg2,arg3,arg4 -+.if \nr -+ move_stack "(\nr-1)",\arg2,\arg3,\arg4 -+ movel \arg1,%sp@- -+.endif -+.endm -+ -+.macro func_define name,nr=0 -+.macro \name arg1,arg2,arg3,arg4 -+ move_stack \nr,\arg1,\arg2,\arg3,\arg4 -+ func_call \name -+.if \nr -+ lea %sp@(\nr*4),%sp -+.endif -+.endm -+.endm -+ -+func_define serial_putc,1 -+ -+.macro putc ch -+ pea \ch -+ func_call serial_putc -+ addql #4,%sp -+.endm -+ -+.macro dputc ch -+#ifdef DEBUG -+ putc \ch -+#endif -+.endm -+ -+func_define putn,1 -+ -+.macro dputn nr -+#ifdef DEBUG -+ putn \nr -+#endif -+.endm -+ -+#if CONFIG_SDRAM_BASE != PAGE_OFFSET -+/* -+ mmu_map - creates a new TLB entry -+ -+ virt_addr Must be on proper boundary -+ phys_addr Must be on proper boundary -+ itlb MMUOR_ITLB if instruction TLB or 0 -+ asid address space ID -+ shared_global MMUTR_SG if shared between different ASIDs or 0 -+ size_code MMUDR_SZ1M 1 MB -+ MMUDR_SZ4K 4 KB -+ MMUDR_SZ8K 8 KB -+ MMUDR_SZ16M 16 MB -+ cache_mode MMUDR_INC instruction non-cacheable -+ MMUDR_IC instruction cacheable -+ MMUDR_DWT data writethrough -+ MMUDR_DCB data copyback -+ MMUDR_DNCP data non-cacheable, precise -+ MMUDR_DNCIP data non-cacheable, imprecise -+ super_prot MMUDR_SP if user mode generates exception or 0 -+ readable MMUDR_R if permits read access (data TLB) or 0 -+ writable MMUDR_W if permits write access (data TLB) or 0 -+ executable MMUDR_X if permits execute access (instruction TLB) or 0 -+ locked MMUDR_LK prevents TLB entry from being replaced or 0 -+ temp_data_reg a data register to use for temporary values -+*/ -+.macro mmu_map virt_addr,phys_addr,itlb,asid,shared_global,size_code,cache_mode,super_prot,readable,writable,executable,locked,temp_data_reg -+ /* Set up search of TLB. */ -+ movel #(\virt_addr+1), \temp_data_reg -+ movel \temp_data_reg, MMUAR -+ /* Search. */ -+ movel #(MMUOR_STLB + MMUOR_ADR +\itlb), \temp_data_reg -+ movew \temp_data_reg, (MMUOR) -+ /* Set up tag value. */ -+ movel #(\virt_addr + \asid + \shared_global + MMUTR_V), \temp_data_reg -+ movel \temp_data_reg, MMUTR -+ /* Set up data value. */ -+ movel #(\phys_addr + \size_code + \cache_mode + \super_prot + \readable + \writable + \executable + \locked), \temp_data_reg -+ movel \temp_data_reg, MMUDR -+ /* Save it. */ -+ movel #(MMUOR_ACC + MMUOR_UAA + \itlb), \temp_data_reg -+ movew \temp_data_reg, (MMUOR) -+.endm /* mmu_map */ -+ -+.macro mmu_unmap virt_addr,itlb,temp_data_reg -+ /* Set up search of TLB. */ -+ movel #(\virt_addr+1), \temp_data_reg -+ movel \temp_data_reg, MMUAR -+ /* Search. */ -+ movel #(MMUOR_STLB + MMUOR_ADR +\itlb), \temp_data_reg -+ movew \temp_data_reg, (MMUOR) -+ /* Test for hit. */ -+ movel MMUSR,\temp_data_reg -+ btst #MMUSR_HITN,\temp_data_reg -+ beq 1f -+ /* Read the TLB. */ -+ movel #(MMUOR_RW + MMUOR_ACC +\itlb), \temp_data_reg -+ movew \temp_data_reg, (MMUOR) -+ movel MMUSR,\temp_data_reg -+ /* Set up tag value. */ -+ movel #0, \temp_data_reg -+ movel \temp_data_reg, MMUTR -+ /* Set up data value. */ -+ movel #0, \temp_data_reg -+ movel \temp_data_reg, MMUDR -+ /* Save it. */ -+ movel #(MMUOR_ACC + MMUOR_UAA + \itlb), \temp_data_reg -+ movew \temp_data_reg, (MMUOR) -+1: -+.endm /* mmu_unmap */ -+#endif /* CONFIG_SDRAM_BASE != PAGE_OFFSET */ -+ -+/* .text */ -+.section ".text.head","ax" -+ENTRY(_stext) -+/* Version numbers of the bootinfo interface -- if we later pass info -+ * from boot ROM we might want to put something real here. -+ * -+ * The area from _stext to _start will later be used as kernel pointer table -+ */ -+ bras 1f /* Jump over bootinfo version numbers */ -+ -+ .long BOOTINFOV_MAGIC -+ .long 0 -+#if CONFIG_SDRAM_BASE != PAGE_OFFSET -+1: jmp __start-(0xc0000000-CONFIG_SDRAM_BASE) -+#else -+1: jmp __start -+#endif -+ -+.equ kernel_pg_dir,_stext -+.equ .,_stext+0x1000 -+ -+ENTRY(_start) -+ jra __start -+__INIT -+ENTRY(__start) -+/* Save the location of u-boot info - cmd line, bd_info, etc. */ -+ movel %a7,%a4 /* Don't use %a4 before cf_early_init */ -+ addl #0x00000004,%a4 /* offset past top */ -+ addl #(PAGE_OFFSET-CONFIG_SDRAM_BASE),%a4 /* high mem offset */ -+ -+/* Setup initial stack pointer */ -+ movel #CONFIG_SDRAM_BASE+0x1000,%sp -+ -+/* Setup usp */ -+ subl %a0,%a0 -+ movel %a0,%usp -+ -+#if defined(CONFIG_M5445X) -+ movel #0x80000000, %d0 -+ movec %d0, %rambar1 -+#elif defined(CONFIG_M547X_8X) -+ movel #MCF_MBAR, %d0 -+ movec %d0, %mbar -+ move.l #(MCF_RAMBAR0 + 0x21), %d0 -+ movec %d0, %rambar0 -+ move.l #(MCF_RAMBAR1 + 0x21), %d0 -+ movec %d0, %rambar1 -+#endif -+ -+ movew #0x2700,%sr -+ -+/* reset cache */ -+ movel #(CF_CACR_ICINVA + CF_CACR_DCINVA),%d0 -+ movecl %d0,%cacr -+ -+ movel #(MMU_BASE+1),%d0 -+ movecl %d0,%mmubar -+ movel #MMUOR_CA,%a0 /* Clear tlb entries */ -+ movew %a0,(MMUOR) -+ movel #(MMUOR_CA + MMUOR_ITLB),%a0 /* Use ITLB for searches */ -+ movew %a0,(MMUOR) -+ movel #0,%a0 /* Clear Addr Space User ID */ -+ movecl %a0,%asid -+ -+/* setup ACRs */ -+ movel ACR0_DEFAULT, %d0 /* ACR0 (DATA) setup */ -+ movec %d0, %acr0 -+ nop -+ movel ACR1_DEFAULT, %d0 /* ACR1 (DATA) setup */ -+ movec %d0, %acr1 -+ nop -+ movel ACR2_DEFAULT, %d0 /* ACR2 (CODE) setup */ -+ movec %d0, %acr2 -+ nop -+ movel ACR3_DEFAULT, %d0 /* ACR3 (CODE) setup */ -+ movec %d0, %acr3 -+ nop -+ -+ /* If you change the memory size to another value make a matching -+ change in paging_init(cf-mmu.c) to zones_size[]. */ -+ -+#if CONFIG_SDRAM_BASE != PAGE_OFFSET -+#if defined(CONFIG_M5445X) -+ /* Map 256MB as code */ -+ mmu_map (PAGE_OFFSET+0*0x1000000), (PHYS_OFFSET+0*0x1000000), \ -+ MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC, MMUDR_SP, \ -+ 0, 0, MMUDR_X, MMUDR_LK, %d0 -+ mmu_map (PAGE_OFFSET+1*0x1000000), (PHYS_OFFSET+1*0x1000000), \ -+ MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC, MMUDR_SP, \ -+ 0, 0, MMUDR_X, MMUDR_LK, %d0 -+ mmu_map (PAGE_OFFSET+2*0x1000000), (PHYS_OFFSET+2*0x1000000), \ -+ MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC, MMUDR_SP, \ -+ 0, 0, MMUDR_X, MMUDR_LK, %d0 -+ mmu_map (PAGE_OFFSET+3*0x1000000), (PHYS_OFFSET+3*0x1000000), \ -+ MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC, MMUDR_SP, \ -+ 0, 0, MMUDR_X, MMUDR_LK, %d0 -+ mmu_map (PAGE_OFFSET+4*0x1000000), (PHYS_OFFSET+4*0x1000000), \ -+ MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC, MMUDR_SP, \ -+ 0, 0, MMUDR_X, MMUDR_LK, %d0 -+ mmu_map (PAGE_OFFSET+5*0x1000000), (PHYS_OFFSET+5*0x1000000), \ -+ MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC, MMUDR_SP, \ -+ 0, 0, MMUDR_X, MMUDR_LK, %d0 -+ mmu_map (PAGE_OFFSET+6*0x1000000), (PHYS_OFFSET+6*0x1000000), \ -+ MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC, MMUDR_SP, \ -+ 0, 0, MMUDR_X, MMUDR_LK, %d0 -+ mmu_map (PAGE_OFFSET+7*0x1000000), (PHYS_OFFSET+7*0x1000000), \ -+ MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC, MMUDR_SP, \ -+ 0, 0, MMUDR_X, MMUDR_LK, %d0 -+ mmu_map (PAGE_OFFSET+8*0x1000000), (PHYS_OFFSET+8*0x1000000), \ -+ MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC, MMUDR_SP, \ -+ 0, 0, MMUDR_X, MMUDR_LK, %d0 -+ mmu_map (PAGE_OFFSET+9*0x1000000), (PHYS_OFFSET+9*0x1000000), \ -+ MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC, MMUDR_SP, \ -+ 0, 0, MMUDR_X, MMUDR_LK, %d0 -+ mmu_map (PAGE_OFFSET+10*0x1000000), (PHYS_OFFSET+10*0x1000000), \ -+ MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC, MMUDR_SP, \ -+ 0, 0, MMUDR_X, MMUDR_LK, %d0 -+ mmu_map (PAGE_OFFSET+11*0x1000000), (PHYS_OFFSET+11*0x1000000), \ -+ MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC, MMUDR_SP, \ -+ 0, 0, MMUDR_X, MMUDR_LK, %d0 -+ mmu_map (PAGE_OFFSET+12*0x1000000), (PHYS_OFFSET+12*0x1000000), \ -+ MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC, MMUDR_SP, \ -+ 0, 0, MMUDR_X, MMUDR_LK, %d0 -+ mmu_map (PAGE_OFFSET+13*0x1000000), (PHYS_OFFSET+13*0x1000000), \ -+ MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC, MMUDR_SP, \ -+ 0, 0, MMUDR_X, MMUDR_LK, %d0 -+ mmu_map (PAGE_OFFSET+14*0x1000000), (PHYS_OFFSET+14*0x1000000), \ -+ MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC, MMUDR_SP, \ -+ 0, 0, MMUDR_X, MMUDR_LK, %d0 -+ mmu_map (PAGE_OFFSET+15*0x1000000), (PHYS_OFFSET+15*0x1000000), \ -+ MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC, MMUDR_SP, \ -+ 0, 0, MMUDR_X, MMUDR_LK, %d0 -+ -+ /* Map 256MB as data also */ -+ mmu_map (PAGE_OFFSET+0*0x1000000), (PHYS_OFFSET+0*0x1000000), 0, 0, \ -+ MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \ -+ 0, MMUDR_LK, %d0 -+ mmu_map (PAGE_OFFSET+1*0x1000000), (PHYS_OFFSET+1*0x1000000), 0, 0, \ -+ MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \ -+ 0, MMUDR_LK, %d0 -+ mmu_map (PAGE_OFFSET+2*0x1000000), (PHYS_OFFSET+2*0x1000000), 0, 0, \ -+ MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \ -+ 0, MMUDR_LK, %d0 -+ mmu_map (PAGE_OFFSET+3*0x1000000), (PHYS_OFFSET+3*0x1000000), 0, 0, \ -+ MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \ -+ 0, MMUDR_LK, %d0 -+ mmu_map (PAGE_OFFSET+4*0x1000000), (PHYS_OFFSET+4*0x1000000), 0, 0, \ -+ MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \ -+ 0, MMUDR_LK, %d0 -+ mmu_map (PAGE_OFFSET+5*0x1000000), (PHYS_OFFSET+5*0x1000000), 0, 0, \ -+ MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \ -+ 0, MMUDR_LK, %d0 -+ mmu_map (PAGE_OFFSET+6*0x1000000), (PHYS_OFFSET+6*0x1000000), 0, 0, \ -+ MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \ -+ 0, MMUDR_LK, %d0 -+ mmu_map (PAGE_OFFSET+7*0x1000000), (PHYS_OFFSET+7*0x1000000), 0, 0, \ -+ MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \ -+ 0, MMUDR_LK, %d0 -+ mmu_map (PAGE_OFFSET+8*0x1000000), (PHYS_OFFSET+8*0x1000000), 0, 0, \ -+ MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \ -+ 0, MMUDR_LK, %d0 -+ mmu_map (PAGE_OFFSET+9*0x1000000), (PHYS_OFFSET+9*0x1000000), 0, 0, \ -+ MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \ -+ 0, MMUDR_LK, %d0 -+ mmu_map (PAGE_OFFSET+10*0x1000000), (PHYS_OFFSET+10*0x1000000), 0, 0, \ -+ MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \ -+ 0, MMUDR_LK, %d0 -+ mmu_map (PAGE_OFFSET+11*0x1000000), (PHYS_OFFSET+11*0x1000000), 0, 0, \ -+ MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \ -+ 0, MMUDR_LK, %d0 -+ mmu_map (PAGE_OFFSET+12*0x1000000), (PHYS_OFFSET+12*0x1000000), 0, 0, \ -+ MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \ -+ 0, MMUDR_LK, %d0 -+ mmu_map (PAGE_OFFSET+13*0x1000000), (PHYS_OFFSET+13*0x1000000), 0, 0, \ -+ MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \ -+ 0, MMUDR_LK, %d0 -+ mmu_map (PAGE_OFFSET+14*0x1000000), (PHYS_OFFSET+14*0x1000000), 0, 0, \ -+ MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \ -+ 0, MMUDR_LK, %d0 -+ mmu_map (PAGE_OFFSET+15*0x1000000), (PHYS_OFFSET+15*0x1000000), 0, 0, \ -+ MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \ -+ 0, MMUDR_LK, %d0 -+ -+ /* Map ATA registers -- sacrifice a data TLB due to the hw design */ -+ mmu_map (0x90000000), (0x90000000), 0, 0, \ -+ MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \ -+ 0, MMUDR_LK, %d0 -+ -+#elif defined(CONFIG_M547X_8X) -+ -+ /* Map first 8 MB as code */ -+ mmu_map (PAGE_OFFSET+0*1024*1024), (0*1024*1024), MMUOR_ITLB, 0, \ -+ MMUTR_SG, MMUDR_SZ1M, MMUDR_IC, MMUDR_SP, 0, 0, MMUDR_X, \ -+ MMUDR_LK, %d0 -+ mmu_map (PAGE_OFFSET+1*1024*1024), (1*1024*1024), MMUOR_ITLB, 0, \ -+ MMUTR_SG, MMUDR_SZ1M, MMUDR_IC, MMUDR_SP, 0, 0, MMUDR_X, \ -+ MMUDR_LK, %d0 -+ mmu_map (PAGE_OFFSET+2*1024*1024), (2*1024*1024), MMUOR_ITLB, 0, \ -+ MMUTR_SG, MMUDR_SZ1M, MMUDR_IC, MMUDR_SP, 0, 0, MMUDR_X, \ -+ MMUDR_LK, %d0 -+ mmu_map (PAGE_OFFSET+3*1024*1024), (3*1024*1024), MMUOR_ITLB, 0, \ -+ MMUTR_SG, MMUDR_SZ1M, MMUDR_IC, MMUDR_SP, 0, 0, MMUDR_X, \ -+ MMUDR_LK, %d0 -+ mmu_map (PAGE_OFFSET+4*1024*1024), (4*1024*1024), MMUOR_ITLB, 0, \ -+ MMUTR_SG, MMUDR_SZ1M, MMUDR_IC, MMUDR_SP, 0, 0, MMUDR_X, \ -+ MMUDR_LK, %d0 -+ mmu_map (PAGE_OFFSET+5*1024*1024), (5*1024*1024), MMUOR_ITLB, 0, \ -+ MMUTR_SG, MMUDR_SZ1M, MMUDR_IC, MMUDR_SP, 0, 0, MMUDR_X, \ -+ MMUDR_LK, %d0 -+ mmu_map (PAGE_OFFSET+6*1024*1024), (6*1024*1024), MMUOR_ITLB, 0, \ -+ MMUTR_SG, MMUDR_SZ1M, MMUDR_IC, MMUDR_SP, 0, 0, MMUDR_X, \ -+ MMUDR_LK, %d0 -+ mmu_map (PAGE_OFFSET+7*1024*1024), (7*1024*1024), MMUOR_ITLB, 0, \ -+ MMUTR_SG, MMUDR_SZ1M, MMUDR_IC, MMUDR_SP, 0, 0, MMUDR_X, \ -+ MMUDR_LK, %d0 -+ -+ /* Map first 8 MB as data */ -+ mmu_map (PAGE_OFFSET+0*1024*1024), (0*1024*1024), 0, 0, \ -+ MMUTR_SG, MMUDR_SZ1M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, \ -+ MMUDR_W, 0, MMUDR_LK, %d0 -+ mmu_map (PAGE_OFFSET+1*1024*1024), (1*1024*1024), 0, 0, \ -+ MMUTR_SG, MMUDR_SZ1M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, \ -+ MMUDR_W, 0, MMUDR_LK, %d0 -+ mmu_map (PAGE_OFFSET+2*1024*1024), (2*1024*1024), 0, 0, \ -+ MMUTR_SG, MMUDR_SZ1M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, \ -+ MMUDR_W, 0, MMUDR_LK, %d0 -+ mmu_map (PAGE_OFFSET+3*1024*1024), (3*1024*1024), 0, 0, \ -+ MMUTR_SG, MMUDR_SZ1M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, \ -+ MMUDR_W, 0, MMUDR_LK, %d0 -+ mmu_map (PAGE_OFFSET+4*1024*1024), (4*1024*1024), 0, 0, \ -+ MMUTR_SG, MMUDR_SZ1M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, \ -+ MMUDR_W, 0, MMUDR_LK, %d0 -+ mmu_map (PAGE_OFFSET+5*1024*1024), (5*1024*1024), 0, 0, \ -+ MMUTR_SG, MMUDR_SZ1M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, \ -+ MMUDR_W, 0, MMUDR_LK, %d0 -+ mmu_map (PAGE_OFFSET+6*1024*1024), (6*1024*1024), 0, 0, \ -+ MMUTR_SG, MMUDR_SZ1M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, \ -+ MMUDR_W, 0, MMUDR_LK, %d0 -+ mmu_map (PAGE_OFFSET+7*1024*1024), (7*1024*1024), 0, 0, \ -+ MMUTR_SG, MMUDR_SZ1M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, \ -+ MMUDR_W, 0, MMUDR_LK, %d0 -+#endif -+ /* -+ * Do unity mapping to enable the MMU. Map first chunk of memory -+ * in place as code/data. The TLBs will be deleted after the MMU is -+ * enabled and we are executing in high memory. -+ */ -+ -+#if defined(CONFIG_M5445X) -+ /* Map first 16 MB as code */ -+ mmu_map (PHYS_OFFSET+0*0x1000000), (PHYS_OFFSET+0*0x1000000), \ -+ MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_INC, MMUDR_SP, 0, \ -+ 0, MMUDR_X, 0, %d0 -+ /* Map first 16 MB as data too */ -+ mmu_map (PHYS_OFFSET+0*0x1000000), (PHYS_OFFSET+0*0x1000000), 0, 0, \ -+ MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \ -+ 0, 0, %d0 -+#elif defined(CONFIG_M547X_8X) -+ /* Map first 4 MB as code */ -+ mmu_map (0*1024*1024), (0*1024*1024), MMUOR_ITLB, 0, \ -+ MMUTR_SG, MMUDR_SZ1M, MMUDR_IC, MMUDR_SP, 0, 0, \ -+ MMUDR_X, 0, %d0 -+ mmu_map (1*1024*1024), (1*1024*1024), MMUOR_ITLB, 0, \ -+ MMUTR_SG, MMUDR_SZ1M, MMUDR_IC, MMUDR_SP, 0, 0, \ -+ MMUDR_X, 0, %d0 -+ mmu_map (2*1024*1024), (2*1024*1024), MMUOR_ITLB, 0, \ -+ MMUTR_SG, MMUDR_SZ1M, MMUDR_IC, MMUDR_SP, 0, 0, \ -+ MMUDR_X, 0, %d0 -+ mmu_map (3*1024*1024), (3*1024*1024), MMUOR_ITLB, 0, \ -+ MMUTR_SG, MMUDR_SZ1M, MMUDR_IC, MMUDR_SP, 0, 0, \ -+ MMUDR_X, 0, %d0 -+ -+ /* Map first 4 MB as data too */ -+ mmu_map (0*1024*1024), (0*1024*1024), 0, 0, \ -+ MMUTR_SG, MMUDR_SZ1M, MMUDR_DCB, MMUDR_SP, MMUDR_R, \ -+ MMUDR_W, 0, 0, %d0 -+ mmu_map (1*1024*1024), (1*1024*1024), 0, 0, \ -+ MMUTR_SG, MMUDR_SZ1M, MMUDR_DCB, MMUDR_SP, MMUDR_R, \ -+ MMUDR_W, 0, 0, %d0 -+ mmu_map (2*1024*1024), (2*1024*1024), 0, 0, \ -+ MMUTR_SG, MMUDR_SZ1M, MMUDR_DCB, MMUDR_SP, MMUDR_R, \ -+ MMUDR_W, 0, 0, %d0 -+ mmu_map (3*1024*1024), (3*1024*1024), 0, 0, \ -+ MMUTR_SG, MMUDR_SZ1M, MMUDR_DCB, MMUDR_SP, MMUDR_R, \ -+ MMUDR_W, 0, 0, %d0 -+#endif -+#endif /* CONFIG_SDRAM_BASE != PAGE_OFFSET */ -+ -+ /* Turn on MMU */ -+ movel #(MMUCR_EN),%a0 -+ movel %a0,MMUCR -+ nop /* This synchs the pipeline after a write to MMUCR */ -+ -+ movel #__running_high,%a0 /* Get around PC-relative addressing. */ -+ jmp %a0@ -+ -+ENTRY(__running_high) -+ load_symbol_address _stext,%sp -+ movel L(memory_start),%a0 -+ movel %a0,availmem -+ load_symbol_address L(phys_kernel_start),%a0 -+ load_symbol_address _stext,%a1 -+ subl #_stext,%a1 -+ addl #PAGE_OFFSET,%a1 -+ movel %a1,%a0@ -+ -+/* zero bss */ -+ lea _sbss,%a0 -+ lea _ebss,%a1 -+ clrl %d0 -+_loop_bss: -+ movel %d0,(%a0)+ -+ cmpl %a0,%a1 -+ bne _loop_bss -+ -+ /* Unmap unity mappings */ -+#if CONFIG_SDRAM_BASE != PAGE_OFFSET -+#if defined(CONFIG_M5445X) -+ mmu_unmap (PHYS_OFFSET+0*0x1000000), MMUOR_ITLB, %d0 -+ mmu_unmap (PHYS_OFFSET+0*0x1000000), 0, %d0 -+#elif defined(CONFIG_M547X_8X) -+ mmu_unmap (PHYS_OFFSET+0*0x1000000), MMUOR_ITLB, %d0 -+ mmu_unmap (PHYS_OFFSET+1*0x1000000), MMUOR_ITLB, %d0 -+ mmu_unmap (PHYS_OFFSET+2*0x1000000), MMUOR_ITLB, %d0 -+ mmu_unmap (PHYS_OFFSET+3*0x1000000), MMUOR_ITLB, %d0 -+ mmu_unmap (PHYS_OFFSET+0*0x1000000), 0, %d0 -+ mmu_unmap (PHYS_OFFSET+1*0x1000000), 0, %d0 -+ mmu_unmap (PHYS_OFFSET+2*0x1000000), 0, %d0 -+ mmu_unmap (PHYS_OFFSET+3*0x1000000), 0, %d0 -+#endif -+#endif /* CONFIG_SDRAM_BASE != PAGE_OFFSET */ -+ -+/* Setup initial stack pointer */ -+ lea init_task,%a2 -+ lea init_thread_union+THREAD_SIZE,%sp -+ subl %a6,%a6 /* clear a6 for gdb */ -+ -+#ifdef CONFIG_MCF_USER_HALT -+/* Setup debug control reg to allow halts from user space */ -+ lea wdbg_uhe,%a0 -+ wdebug (%a0) -+#endif -+ -+ movel %a4,uboot_info_stk /* save uboot info to variable */ -+ jsr cf_early_init -+ jmp start_kernel -+ -+.section ".text.head","ax" -+set_context: -+func_start set_context,%d0,(1*4) -+ movel 12(%sp),%d0 -+ movec %d0,%asid -+func_return set_context -+ -+#ifdef CONFIG_M5445X -+/* -+ * set_fpga(addr,val) on the M5445X -+ * -+ * Map in 0x00000000 -> 0x0fffffff and then do the write. -+ */ -+set_fpga: -+#if 0 -+ movew %sr,%d1 -+ movew #0x2700,%sr -+ movel ACR0_FPGA, %d0 -+ movec %d0, %acr0 -+ nop -+ moveal 4(%sp),%a0 -+ movel 8(%sp),%a0@ -+ movel ACR0_DEFAULT, %d0 -+ movec %d0, %acr0 -+ nop -+ movew %d1,%sr -+#endif -+ rts -+#endif -+ -+ .data -+ .align 4 -+ -+availmem: -+ .long 0 -+L(phys_kernel_start): -+ .long PAGE_OFFSET -+L(kernel_end): -+ .long 0 -+L(memory_start): -+ .long PAGE_OFFSET_RAW -+ -+#ifdef CONFIG_MCF_USER_HALT -+/* -+ * Enable User Halt Enable in the debug control register. -+ */ -+wdbg_uhe: -+ .word 0x2c80 /* DR0 */ -+ .word 0x00b0 /* 31:16 */ -+ .word 0x0400 /* 15:0 -- enable UHE */ -+ .word 0x0000 /* unused */ -+#endif -+ -+ ---- /dev/null -+++ b/arch/m68k/coldfire/ints.c -@@ -0,0 +1,463 @@ -+/* -+ * linux/arch/m68k/coldfire/ints.c -- General interrupt handling code -+ * -+ * Copyright (C) 1999-2002 Greg Ungerer (gerg@snapgear.com) -+ * Copyright (C) 1998 D. Jeff Dionne <jeff@lineo.ca>, -+ * Kenneth Albanowski <kjahds@kjahds.com>, -+ * Copyright (C) 2000 Lineo Inc. (www.lineo.com) -+ * -+ * Copyright Freescale Semiconductor, Inc. 2007, 2008 -+ * Kurt Mahan kmahan@freescale.com -+ * Matt Waddel Matt.Waddel@freescale.com -+ * -+ * Based on: -+ * linux/arch/m68k/kernel/ints.c & -+ * linux/arch/m68knommu/5307/ints.c -+ * -+ * This file is subject to the terms and conditions of the GNU General Public -+ * License. See the file COPYING in the main directory of this archive -+ * for more details. -+ */ -+ -+#include <linux/module.h> -+#include <linux/types.h> -+#include <linux/init.h> -+#include <linux/sched.h> -+#include <linux/kernel_stat.h> -+#include <linux/errno.h> -+#include <linux/seq_file.h> -+#include <linux/interrupt.h> -+ -+#include <asm/system.h> -+#include <asm/irq.h> -+#include <asm/traps.h> -+#include <asm/page.h> -+#include <asm/machdep.h> -+#include <asm/irq_regs.h> -+ -+#include <asm/mcfsim.h> -+ -+/* -+ * IRQ Handler lists. -+ */ -+static struct irq_node *irq_list[SYS_IRQS]; -+static struct irq_controller *irq_controller[SYS_IRQS]; -+static int irq_depth[SYS_IRQS]; -+ -+/* -+ * IRQ Controller -+ */ -+#if defined(CONFIG_M5445X) -+void m5445x_irq_enable(unsigned int irq); -+void m5445x_irq_disable(unsigned int irq); -+static struct irq_controller m5445x_irq_controller = { -+ .name = "M5445X", -+ .lock = SPIN_LOCK_UNLOCKED, -+ .enable = m5445x_irq_enable, -+ .disable = m5445x_irq_disable, -+}; -+#elif defined(CONFIG_M547X_8X) -+void m547x_8x_irq_enable(unsigned int irq); -+void m547x_8x_irq_disable(unsigned int irq); -+static struct irq_controller m547x_8x_irq_controller = { -+ .name = "M547X_8X", -+ .lock = SPIN_LOCK_UNLOCKED, -+ .enable = m547x_8x_irq_enable, -+ .disable = m547x_8x_irq_disable, -+}; -+#else -+# error No IRQ controller defined -+#endif -+ -+#define POOL_SIZE SYS_IRQS -+static struct irq_node pool[POOL_SIZE]; -+static struct irq_node *get_irq_node(void); -+ -+/* The number of spurious interrupts */ -+unsigned int num_spurious; -+asmlinkage void handle_badint(struct pt_regs *regs); -+ -+/* -+ * void init_IRQ(void) -+ * -+ * This function should be called during kernel startup to initialize -+ * the IRQ handling routines. -+ */ -+void __init init_IRQ(void) -+{ -+ int i; -+ -+#if defined(CONFIG_M5445X) -+ for (i = 0; i < SYS_IRQS; i++) -+ irq_controller[i] = &m5445x_irq_controller; -+#elif defined(CONFIG_M547X_8X) -+ for (i = 0; i < SYS_IRQS; i++) -+ irq_controller[i] = &m547x_8x_irq_controller; -+#endif -+} -+ -+/* -+ * process_int(unsigned long vec, struct pt_regs *fp) -+ * -+ * Process an interrupt. Called from entry.S. -+ */ -+asmlinkage void process_int(unsigned long vec, struct pt_regs *fp) -+{ -+ struct pt_regs *old_regs; -+ struct irq_node *node; -+ old_regs = set_irq_regs(fp); -+ kstat_cpu(0).irqs[vec]++; -+ -+ node = irq_list[vec]; -+ if (!node) -+ handle_badint(fp); -+ else { -+ do { -+ node->handler(vec, node->dev_id); -+ node = node->next; -+ } while (node); -+ } -+ -+ set_irq_regs(old_regs); -+} -+ -+/* -+ * show_interrupts( struct seq_file *p, void *v) -+ * -+ * Called to show all the current interrupt information. -+ */ -+int show_interrupts(struct seq_file *p, void *v) -+{ -+ struct irq_controller *contr; -+ struct irq_node *node; -+ int i = *(loff_t *) v; -+ -+ if ((i < NR_IRQS) && (irq_list[i])) { -+ contr = irq_controller[i]; -+ node = irq_list[i]; -+ seq_printf(p, "%-8s %3u: %10u %s", contr->name, i, -+ kstat_cpu(0).irqs[i], node->devname); -+ while ((node = node->next)) -+ seq_printf(p, ", %s", node->devname); -+ -+ seq_printf(p, "\n"); -+ } -+ -+ return 0; -+} -+ -+/* -+ * get_irq_node(void) -+ * -+ * Get an irq node from the pool. -+ */ -+struct irq_node *get_irq_node(void) -+{ -+ struct irq_node *p = pool; -+ int i; -+ -+ for (i = 0; i < POOL_SIZE; i++, p++) { -+ if (!p->handler) { -+ memset(p, 0, sizeof(struct irq_node)); -+ return p; -+ } -+ } -+ printk(KERN_INFO "%s(%s:%d): No more irq nodes, I suggest you \ -+ increase POOL_SIZE", __FUNCTION__, __FILE__, __LINE__); -+ return NULL; -+} -+ -+void init_irq_proc(void) -+{ -+ /* Insert /proc/irq driver here */ -+} -+ -+int setup_irq(unsigned int irq, struct irq_node *node) -+{ -+ struct irq_controller *contr; -+ struct irq_node **prev; -+ unsigned long flags; -+ -+ if (irq >= NR_IRQS || !irq_controller[irq]) { -+ printk("%s: Incorrect IRQ %d from %s\n", -+ __FUNCTION__, irq, node->devname); -+ return -ENXIO; -+ } -+ -+ contr = irq_controller[irq]; -+ spin_lock_irqsave(&contr->lock, flags); -+ -+ prev = irq_list + irq; -+ if (*prev) { -+ /* Can't share interrupts unless both agree to */ -+ if (!((*prev)->flags & node->flags & IRQF_SHARED)) { -+ spin_unlock_irqrestore(&contr->lock, flags); -+ printk(KERN_INFO "%s: -BUSY-Incorrect IRQ %d \n", -+ __FUNCTION__, irq); -+ return -EBUSY; -+ } -+ while (*prev) -+ prev = &(*prev)->next; -+ } -+ -+ if (!irq_list[irq]) { -+ if (contr->startup) -+ contr->startup(irq); -+ else -+ contr->enable(irq); -+ } -+ node->next = NULL; -+ *prev = node; -+ -+ spin_unlock_irqrestore(&contr->lock, flags); -+ -+ return 0; -+} -+ -+int request_irq(unsigned int irq, -+ irq_handler_t handler, -+ unsigned long flags, const char *devname, void *dev_id) -+{ -+ struct irq_node *node = get_irq_node(); -+ int res; -+ -+ if (!node) { -+ printk(KERN_INFO "%s:get_irq_node error %x\n", -+ __FUNCTION__,(unsigned int) node); -+ return -ENOMEM; -+ } -+ node->handler = handler; -+ node->flags = flags; -+ node->dev_id = dev_id; -+ node->devname = devname; -+ -+ res = setup_irq(irq, node); -+ if (res) -+ node->handler = NULL; -+ -+ return res; -+} -+EXPORT_SYMBOL(request_irq); -+ -+void free_irq(unsigned int irq, void *dev_id) -+{ -+ struct irq_controller *contr; -+ struct irq_node **p, *node; -+ unsigned long flags; -+ -+ if (irq >= NR_IRQS || !irq_controller[irq]) { -+ printk(KERN_DEBUG "%s: Incorrect IRQ %d\n", __FUNCTION__, irq); -+ return; -+ } -+ -+ contr = irq_controller[irq]; -+ spin_lock_irqsave(&contr->lock, flags); -+ -+ p = irq_list + irq; -+ while ((node = *p)) { -+ if (node->dev_id == dev_id) -+ break; -+ p = &node->next; -+ } -+ -+ if (node) { -+ *p = node->next; -+ node->handler = NULL; -+ } else -+ printk(KERN_DEBUG "%s: Removing probably wrong IRQ %d\n", -+ __FUNCTION__, irq); -+ -+ if (!irq_list[irq]) { -+ if (contr->shutdown) -+ contr->shutdown(irq); -+ else -+ contr->disable(irq); -+ } -+ -+ spin_unlock_irqrestore(&contr->lock, flags); -+} -+EXPORT_SYMBOL(free_irq); -+ -+void enable_irq(unsigned int irq) -+{ -+ struct irq_controller *contr; -+ unsigned long flags; -+ -+ if (irq >= NR_IRQS || !irq_controller[irq]) { -+ printk(KERN_DEBUG "%s: Incorrect IRQ %d\n", __FUNCTION__, irq); -+ return; -+ } -+ -+ contr = irq_controller[irq]; -+ spin_lock_irqsave(&contr->lock, flags); -+ if (irq_depth[irq]) { -+ if (!--irq_depth[irq]) { -+ if (contr->enable) -+ contr->enable(irq); -+ } -+ } else -+ WARN_ON(1); -+ spin_unlock_irqrestore(&contr->lock, flags); -+} -+EXPORT_SYMBOL(enable_irq); -+ -+void disable_irq(unsigned int irq) -+{ -+ struct irq_controller *contr; -+ unsigned long flags; -+ -+ if (irq >= NR_IRQS || !irq_controller[irq]) { -+ printk(KERN_DEBUG "%s: Incorrect IRQ %d\n", __FUNCTION__, irq); -+ return; -+ } -+ -+ contr = irq_controller[irq]; -+ spin_lock_irqsave(&contr->lock, flags); -+ if (!irq_depth[irq]++) { -+ if (contr->disable) -+ contr->disable(irq); -+ } -+ spin_unlock_irqrestore(&contr->lock, flags); -+} -+EXPORT_SYMBOL(disable_irq); -+ -+void disable_irq_nosync(unsigned int irq) __attribute__((alias("disable_irq"))); -+EXPORT_SYMBOL(disable_irq_nosync); -+ -+ -+unsigned long probe_irq_on(void) -+{ -+ return 0; -+} -+EXPORT_SYMBOL(probe_irq_on); -+ -+int probe_irq_off(unsigned long irqs) -+{ -+ return 0; -+} -+EXPORT_SYMBOL(probe_irq_off); -+ -+asmlinkage void handle_badint(struct pt_regs *regs) -+{ -+ kstat_cpu(0).irqs[0]++; -+ num_spurious++; -+ printk(KERN_DEBUG "unexpected interrupt from %u\n", regs->vector); -+} -+EXPORT_SYMBOL(handle_badint); -+ -+#ifdef CONFIG_M5445X -+/* -+ * M5445X Implementation -+ */ -+void m5445x_irq_enable(unsigned int irq) -+{ -+ /* enable the interrupt hardware */ -+ if (irq < 64) -+ return; -+ -+ /* adjust past non-hardware ints */ -+ irq -= 64; -+ -+ /* check for eport */ -+ if ((irq > 0) && (irq < 8)) { -+ /* enable eport */ -+ MCF_EPORT_EPPAR &= ~(3 << (irq*2)); /* level */ -+ MCF_EPORT_EPDDR &= ~(1 << irq); /* input */ -+ MCF_EPORT_EPIER |= 1 << irq; /* irq enabled */ -+ } -+ -+ if (irq < 64) { -+ /* controller 0 */ -+ MCF_INTC0_ICR(irq) = 0x02; -+ MCF_INTC0_CIMR = irq; -+ } else { -+ /* controller 1 */ -+ irq -= 64; -+ MCF_INTC1_ICR(irq) = 0x02; -+ MCF_INTC1_CIMR = irq; -+ } -+} -+ -+void m5445x_irq_disable(unsigned int irq) -+{ -+ /* disable the interrupt hardware */ -+ if (irq < 64) -+ return; -+ -+ /* adjust past non-hardware ints */ -+ irq -= 64; -+ -+ /* check for eport */ -+ if ((irq > 0) && (irq < 8)) { -+ /* disable eport */ -+ MCF_EPORT_EPIER &= ~(1 << irq); -+ } -+ -+ if (irq < 64) { -+ /* controller 0 */ -+ MCF_INTC0_ICR(irq) = 0x00; -+ MCF_INTC0_SIMR = irq; -+ } else { -+ /* controller 1 */ -+ irq -= 64; -+ MCF_INTC1_ICR(irq) = 0x00; -+ MCF_INTC1_SIMR = irq; -+ } -+} -+#elif defined(CONFIG_M547X_8X) -+/* -+ * M547X_8X Implementation -+ */ -+void m547x_8x_irq_enable(unsigned int irq) -+{ -+ /* enable the interrupt hardware */ -+ if (irq < 64) -+ return; -+ -+ /* adjust past non-hardware ints */ -+ irq -= 64; -+ -+/* JKM -- re-add EPORT later */ -+#if 0 -+ /* check for eport */ -+ if ((irq > 0) && (irq < 8)) { -+ /* enable eport */ -+ MCF_EPORT_EPPAR &= ~(3 << (irq*2)); /* level */ -+ MCF_EPORT_EPDDR &= ~(1 << irq); /* input */ -+ MCF_EPORT_EPIER |= 1 << irq; /* irq enabled */ -+ } -+#endif -+ -+ if (irq < 32) { -+ /* *grumble* don't set low bit of IMRL */ -+ MCF_IMRL &= (~(1 << irq) & 0xfffffffe); -+ } -+ else { -+ MCF_IMRH &= ~(1 << (irq - 32)); -+ } -+} -+ -+void m547x_8x_irq_disable(unsigned int irq) -+{ -+ /* disable the interrupt hardware */ -+ if (irq < 64) -+ return; -+ -+ /* adjust past non-hardware ints */ -+ irq -= 64; -+ -+/* JKM -- re-add EPORT later */ -+#if 0 -+ /* check for eport */ -+ if ((irq > 0) && (irq < 8)) { -+ /* disable eport */ -+ MCF_EPORT_EPIER &= ~(1 << irq); -+ } -+#endif -+ -+ if (irq < 32) -+ MCF_IMRL |= (1 << irq); -+ else -+ MCF_IMRH |= (1 << (irq - 32)); -+} -+#endif ---- /dev/null -+++ b/arch/m68k/coldfire/iomap.c -@@ -0,0 +1,56 @@ -+/* -+ * arch/m68k/coldfire/iomap.c -+ * -+ * Generic coldfire iomap interface -+ * -+ * Based on the sh64 iomap.c by Paul Mundt. -+ * -+ * This file is subject to the terms and conditions of the GNU General Public -+ * License. See the file "COPYING" in the main directory of this archive -+ * for more details. -+ */ -+#include <linux/pci.h> -+#include <asm/io.h> -+ -+#if 0 -+void __iomem *__attribute__ ((weak)) -+ioport_map(unsigned long port, unsigned int len) -+{ -+ return (void __iomem *)port; -+} -+EXPORT_SYMBOL(pci_iomap); -+ -+void ioport_unmap(void __iomem *addr) -+{ -+ /* Nothing .. */ -+} -+EXPORT_SYMBOL(pci_iounmap); -+ -+void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long max) -+{ -+ unsigned long start = pci_resource_start(dev, bar); -+ unsigned long len = pci_resource_len(dev, bar); -+ unsigned long flags = pci_resource_flags(dev, bar); -+printk(KERN_INFO "PCI_IOMAP: BAR=%d START=0x%lx LEN=0x%lx FLAGS=0x%lx\n", -+ bar, start, len, flags); -+ -+ if (!len) -+ return NULL; -+ if (max && len > max) -+ len = max; -+ if (flags & IORESOURCE_IO) -+ return ioport_map(start, len); -+ if (flags & IORESOURCE_MEM) -+ return (void __iomem *)start; -+ -+ /* What? */ -+ return NULL; -+} -+EXPORT_SYMBOL(ioport_map); -+ -+void pci_iounmap(struct pci_dev *dev, void __iomem *addr) -+{ -+ /* Nothing .. */ -+} -+EXPORT_SYMBOL(ioport_unmap); -+#endif ---- /dev/null -+++ b/arch/m68k/coldfire/m547x_8x-devices.c -@@ -0,0 +1,163 @@ -+/* -+ * arch/m68k/coldfire/m547x_8x-devices.c -+ * -+ * Coldfire M547x/M548x Platform Device Configuration -+ * -+ * Copyright (c) 2008 Freescale Semiconductor, Inc. -+ * Kurt Mahan <kmahan@freescale.com> -+ */ -+#include <linux/module.h> -+#include <linux/kernel.h> -+#include <linux/init.h> -+#include <linux/platform_device.h> -+#include <linux/fsl_devices.h> -+#include <linux/spi/spi.h> -+ -+#include <asm/coldfire.h> -+#include <asm/mcfsim.h> -+#include <asm/mcfqspi.h> -+ -+ -+#ifdef CONFIG_SPI -+/* -+ * -+ * DSPI -+ * -+ */ -+ -+/* number of supported SPI selects */ -+#define SPI_NUM_CHIPSELECTS 8 -+ -+void coldfire_spi_cs_control(u8 cs, u8 command) -+{ -+ /* nothing special required */ -+} -+ -+#if defined(CONFIG_SPI_SPIDEV) || defined(CONFIG_SPI_SPIDEV_MODULE) -+static struct coldfire_spi_chip spidev_chip_info = { -+ .bits_per_word = 8, -+}; -+#endif -+ -+static struct spi_board_info spi_board_info[] = { -+#if defined(CONFIG_SPI_SPIDEV) || defined(CONFIG_SPI_SPIDEV_MODULE) -+ { -+ .modalias = "spidev", -+ .max_speed_hz = 16000000, /* max clk (SCK) speed in HZ */ -+ .bus_num = 1, -+ .chip_select = 0, /* CS0 */ -+ .controller_data = &spidev_chip_info, -+ } -+#endif -+}; -+ -+static int spi_irq_list[] = { -+ /* IRQ, ICR Offset, ICR Val,Mask */ -+ 64 + ISC_DSPI_OVRFW, ISC_DSPI_OVRFW, 0x18, 0, -+ 64 + ISC_DSPI_RFOF, ISC_DSPI_RFOF, 0x18, 0, -+ 64 + ISC_DSPI_RFDF, ISC_DSPI_RFDF, 0x18, 0, -+ 64 + ISC_DSPI_TFUF, ISC_DSPI_TFUF, 0x18, 0, -+ 64 + ISC_DSPI_TCF, ISC_DSPI_TCF, 0x18, 0, -+ 64 + ISC_DSPI_TFFF, ISC_DSPI_TFFF, 0x18, 0, -+ 64 + ISC_DSPI_EOQF, ISC_DSPI_EOQF, 0x18, 0, -+ 0,0,0,0, -+}; -+ -+static struct coldfire_spi_master coldfire_master_info = { -+ .bus_num = 1, -+ .num_chipselect = SPI_NUM_CHIPSELECTS, -+ .irq_list = spi_irq_list, -+ .irq_source = 0, /* not used */ -+ .irq_vector = 0, /* not used */ -+ .irq_mask = 0, /* not used */ -+ .irq_lp = 0, /* not used */ -+ .par_val = 0, /* not used */ -+ .cs_control = coldfire_spi_cs_control, -+}; -+ -+static struct resource coldfire_spi_resources[] = { -+ [0] = { -+ .name = "spi-par", -+ .start = MCF_MBAR + 0x00000a50, /* PAR_DSPI */ -+ .end = MCF_MBAR + 0x00000a50, /* PAR_DSPI */ -+ .flags = IORESOURCE_MEM -+ }, -+ -+ [1] = { -+ .name = "spi-module", -+ .start = MCF_MBAR + 0x00008a00, /* DSPI MCR Base */ -+ .end = MCF_MBAR + 0x00008ab8, /* DSPI mem map end */ -+ .flags = IORESOURCE_MEM -+ }, -+ -+ [2] = { -+ .name = "spi-int-level", -+ .start = MCF_MBAR + 0x740, /* ICR start */ -+ .end = MCF_MBAR + 0x740 + ISC_DSPI_EOQF, /* ICR end */ -+ .flags = IORESOURCE_MEM -+ }, -+ -+ [3] = { -+ .name = "spi-int-mask", -+ .start = MCF_MBAR + 0x70c, /* IMRL */ -+ .end = MCF_MBAR + 0x70c, /* IMRL */ -+ .flags = IORESOURCE_MEM -+ } -+}; -+ -+static struct platform_device coldfire_spi = { -+ .name = "spi_coldfire", -+ .id = -1, -+ .resource = coldfire_spi_resources, -+ .num_resources = ARRAY_SIZE(coldfire_spi_resources), -+ .dev = { -+ .platform_data = &coldfire_master_info, -+ } -+}; -+ -+/** -+ * m547x_8x_spi_init - Initialize SPI -+ */ -+static int __init m547x_8x_spi_init(void) -+{ -+ int retval; -+ -+ /* initialize the DSPI PAR */ -+ MCF_GPIO_PAR_DSPI = (MCF_GPIO_PAR_DSPI_PAR_CS5 | -+ MCF_GPIO_PAR_DSPI_PAR_CS3_DSPICS | -+ MCF_GPIO_PAR_DSPI_PAR_CS2_DSPICS | -+ MCF_GPIO_PAR_DSPI_PAR_CS0_DSPICS | -+ MCF_GPIO_PAR_DSPI_PAR_SCK_SCK | -+ MCF_GPIO_PAR_DSPI_PAR_SIN_SIN | -+ MCF_GPIO_PAR_DSPI_PAR_SOUT_SOUT); -+ -+ /* register device */ -+ retval = platform_device_register(&coldfire_spi); -+ if (retval < 0) { -+ goto out; -+ } -+ -+ /* register board info */ -+ if (ARRAY_SIZE(spi_board_info)) -+ retval = spi_register_board_info(spi_board_info, ARRAY_SIZE(spi_board_info)); -+ -+out: -+ return retval; -+} -+#endif -+ -+ -+/** -+ * m547x_8x_init_devices - Initialize M547X_8X devices -+ * -+ * Returns 0 on success. -+ */ -+static int __init m547x_8x_init_devices(void) -+{ -+#ifdef CONFIG_SPI -+ m547x_8x_spi_init(); -+#endif -+ -+ return 0; -+} -+arch_initcall(m547x_8x_init_devices); ---- /dev/null -+++ b/arch/m68k/coldfire/m547x_8x-dma.c -@@ -0,0 +1,516 @@ -+/* -+ * arch/m68k/coldfire/m547x_8x-dma.c -+ * -+ * Coldfire M547x/M548x DMA -+ * -+ * Copyright (c) 2008 Freescale Semiconductor, Inc. -+ * Kurt Mahan <kmahan@freescale.com> -+ * -+ * This code is based on patches from the Freescale M547x_8x BSP -+ * release mcf547x_8x-20070107-ltib.iso -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -+ */ -+#include <linux/kernel.h> -+#include <linux/sched.h> -+#include <linux/mm.h> -+#include <linux/init.h> -+#include <linux/interrupt.h> -+#include <asm/io.h> -+#include <asm/irq.h> -+#include <asm/dma.h> -+#include <asm/coldfire.h> -+#include <asm/m5485sram.h> -+#include <asm/mcfsim.h> -+ -+/* -+ * This global keeps track of which initiators have been -+ * used of the available assignments. Initiators 0-15 are -+ * hardwired. Initiators 16-31 are multiplexed and controlled -+ * via the Initiatior Mux Control Registe (IMCR). The -+ * assigned requestor is stored with the associated initiator -+ * number. -+ */ -+static int used_reqs[32] = { -+ DMA_ALWAYS, DMA_DSPI_RX, DMA_DSPI_TX, DMA_DREQ0, -+ DMA_PSC0_RX, DMA_PSC0_TX, DMA_USBEP0, DMA_USBEP1, -+ DMA_USBEP2, DMA_USBEP3, DMA_PCI_TX, DMA_PCI_RX, -+ DMA_PSC1_RX, DMA_PSC1_TX, DMA_I2C_RX, DMA_I2C_TX, -+ 0, 0, 0, 0, -+ 0, 0, 0, 0, -+ 0, 0, 0, 0, -+ 0, 0, 0, 0 -+}; -+ -+/* -+ * This global keeps track of which channels have been assigned -+ * to tasks. This methology assumes that no single initiator -+ * will be tied to more than one task/channel -+ */ -+static char used_channel[16] = { -+ -1, -1, -1, -1, -1, -1, -1, -1, -+ -1, -1, -1, -1, -1, -1, -1, -1 -+}; -+ -+unsigned int connected_channel[16] = { -+ 0, 0, 0, 0, 0, 0, 0, 0, -+ 0, 0, 0, 0, 0, 0, 0, 0 -+}; -+ -+/** -+ * dma_set_initiator - enable initiator -+ * @initiator: initiator identifier -+ * -+ * Returns 0 of successful, non-zero otherwise -+ * -+ * Attempt to enable the provided Initiator in the Initiator -+ * Mux Control Register. -+ */ -+int dma_set_initiator(int initiator) -+{ -+ switch (initiator) { -+ case DMA_ALWAYS: -+ case DMA_DSPI_RX: -+ case DMA_DSPI_TX: -+ case DMA_DREQ0: -+ case DMA_PSC0_RX: -+ case DMA_PSC0_TX: -+ case DMA_USBEP0: -+ case DMA_USBEP1: -+ case DMA_USBEP2: -+ case DMA_USBEP3: -+ case DMA_PCI_TX: -+ case DMA_PCI_RX: -+ case DMA_PSC1_RX: -+ case DMA_PSC1_TX: -+ case DMA_I2C_RX: -+ case DMA_I2C_TX: -+ /* -+ * These initiators are always active -+ */ -+ break; -+ -+ case DMA_FEC0_RX: -+ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC16(3)) -+ | MCF_DMA_IMCR_SRC16_FEC0RX; -+ used_reqs[16] = DMA_FEC0_RX; -+ break; -+ -+ case DMA_FEC0_TX: -+ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC17(3)) -+ | MCF_DMA_IMCR_SRC17_FEC0TX; -+ used_reqs[17] = DMA_FEC0_TX; -+ break; -+ -+ case DMA_FEC1_RX: -+ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC20(3)) -+ | MCF_DMA_IMCR_SRC20_FEC1RX; -+ used_reqs[20] = DMA_FEC1_RX; -+ break; -+ -+ case DMA_FEC1_TX: -+ if (used_reqs[21] == 0) { -+ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC21(3)) -+ | MCF_DMA_IMCR_SRC21_FEC1TX; -+ used_reqs[21] = DMA_FEC1_TX; -+ } else if (used_reqs[25] == 0) { -+ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC25(3)) -+ | MCF_DMA_IMCR_SRC25_FEC1TX; -+ used_reqs[25] = DMA_FEC1_TX; -+ } else if (used_reqs[31] == 0) { -+ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC31(3)) -+ | MCF_DMA_IMCR_SRC31_FEC1TX; -+ used_reqs[31] = DMA_FEC1_TX; -+ } else /* No empty slots */ -+ return 1; -+ break; -+ -+ case DMA_DREQ1: -+ if (used_reqs[29] == 0) { -+ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC29(3)) -+ | MCF_DMA_IMCR_SRC29_DREQ1; -+ used_reqs[29] = DMA_DREQ1; -+ } else if (used_reqs[21] == 0) { -+ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC21(3)) -+ | MCF_DMA_IMCR_SRC21_DREQ1; -+ used_reqs[21] = DMA_DREQ1; -+ } else /* No empty slots */ -+ return 1; -+ break; -+ -+ case DMA_CTM0: -+ if (used_reqs[24] == 0) { -+ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC24(3)) -+ | MCF_DMA_IMCR_SRC24_CTM0; -+ used_reqs[24] = DMA_CTM0; -+ } else /* No empty slots */ -+ return 1; -+ break; -+ -+ case DMA_CTM1: -+ if (used_reqs[25] == 0) { -+ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC25(3)) -+ | MCF_DMA_IMCR_SRC25_CTM1; -+ used_reqs[25] = DMA_CTM1; -+ } else /* No empty slots */ -+ return 1; -+ break; -+ -+ case DMA_CTM2: -+ if (used_reqs[26] == 0) { -+ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC26(3)) -+ | MCF_DMA_IMCR_SRC26_CTM2; -+ used_reqs[26] = DMA_CTM2; -+ } else /* No empty slots */ -+ return 1; -+ break; -+ -+ case DMA_CTM3: -+ if (used_reqs[27] == 0) { -+ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC27(3)) -+ | MCF_DMA_IMCR_SRC27_CTM3; -+ used_reqs[27] = DMA_CTM3; -+ } else /* No empty slots */ -+ return 1; -+ break; -+ -+ case DMA_CTM4: -+ if (used_reqs[28] == 0) { -+ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC28(3)) -+ | MCF_DMA_IMCR_SRC28_CTM4; -+ used_reqs[28] = DMA_CTM4; -+ } else /* No empty slots */ -+ return 1; -+ break; -+ -+ case DMA_CTM5: -+ if (used_reqs[29] == 0) { -+ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC29(3)) -+ | MCF_DMA_IMCR_SRC29_CTM5; -+ used_reqs[29] = DMA_CTM5; -+ } else /* No empty slots */ -+ return 1; -+ break; -+ -+ case DMA_CTM6: -+ if (used_reqs[30] == 0) { -+ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC30(3)) -+ | MCF_DMA_IMCR_SRC30_CTM6; -+ used_reqs[30] = DMA_CTM6; -+ } else /* No empty slots */ -+ return 1; -+ break; -+ -+ case DMA_CTM7: -+ if (used_reqs[31] == 0) { -+ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC31(3)) -+ | MCF_DMA_IMCR_SRC31_CTM7; -+ used_reqs[31] = DMA_CTM7; -+ } else /* No empty slots */ -+ return 1; -+ break; -+ -+ case DMA_USBEP4: -+ if (used_reqs[26] == 0) { -+ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC26(3)) -+ | MCF_DMA_IMCR_SRC26_USBEP4; -+ used_reqs[26] = DMA_USBEP4; -+ } else /* No empty slots */ -+ return 1; -+ break; -+ -+ case DMA_USBEP5: -+ if (used_reqs[27] == 0) { -+ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC27(3)) -+ | MCF_DMA_IMCR_SRC27_USBEP5; -+ used_reqs[27] = DMA_USBEP5; -+ } else /* No empty slots */ -+ return 1; -+ break; -+ -+ case DMA_USBEP6: -+ if (used_reqs[28] == 0) { -+ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC28(3)) -+ | MCF_DMA_IMCR_SRC28_USBEP6; -+ used_reqs[28] = DMA_USBEP6; -+ } else /* No empty slots */ -+ return 1; -+ break; -+ -+ case DMA_PSC2_RX: -+ if (used_reqs[28] == 0) { -+ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC28(3)) -+ | MCF_DMA_IMCR_SRC28_PSC2RX; -+ used_reqs[28] = DMA_PSC2_RX; -+ } else /* No empty slots */ -+ return 1; -+ break; -+ -+ case DMA_PSC2_TX: -+ if (used_reqs[29] == 0) { -+ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC29(3)) -+ | MCF_DMA_IMCR_SRC29_PSC2TX; -+ used_reqs[29] = DMA_PSC2_TX; -+ } else /* No empty slots */ -+ return 1; -+ break; -+ -+ case DMA_PSC3_RX: -+ if (used_reqs[30] == 0) { -+ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC30(3)) -+ | MCF_DMA_IMCR_SRC30_PSC3RX; -+ used_reqs[30] = DMA_PSC3_RX; -+ } else /* No empty slots */ -+ return 1; -+ break; -+ -+ case DMA_PSC3_TX: -+ if (used_reqs[31] == 0) { -+ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC31(3)) -+ | MCF_DMA_IMCR_SRC31_PSC3TX; -+ used_reqs[31] = DMA_PSC3_TX; -+ } else /* No empty slots */ -+ return 1; -+ break; -+ -+ default: -+ return 1; -+ } -+ return 0; -+} -+ -+/** -+ * dma_get_initiator - get the initiator for the given requestor -+ * @requestor: initiator identifier -+ * -+ * Returns initiator number (0-31) if assigned or just 0 -+ */ -+unsigned int dma_get_initiator(int requestor) -+{ -+ u32 i; -+ -+ for (i = 0; i < sizeof(used_reqs); ++i) { -+ if (used_reqs[i] == requestor) -+ return i; -+ } -+ return 0; -+} -+ -+/** -+ * dma_remove_initiator - remove the given initiator from active list -+ * @requestor: requestor to remove -+ */ -+void dma_remove_initiator(int requestor) -+{ -+ u32 i; -+ -+ for (i = 0; i < sizeof(used_reqs); ++i) { -+ if (used_reqs[i] == requestor) { -+ used_reqs[i] = -1; -+ break; -+ } -+ } -+} -+ -+/** -+ * dma_set_channel_fec: find available channel for fec and mark -+ * @requestor: initiator/requestor identifier -+ * -+ * Returns first avaialble channel (0-5) or -1 if all occupied -+ */ -+int dma_set_channel_fec(int requestor) -+{ -+ u32 i, t; -+ -+#ifdef CONFIG_FEC_548x_ENABLE_FEC2 -+ t = 4; -+#else -+ t = 2; -+#endif -+ -+ for (i = 0; i < t ; ++i) { -+ if (used_channel[i] == -1) { -+ used_channel[i] = requestor; -+ return i; -+ } -+ } -+ /* All channels taken */ -+ return -1; -+} -+ -+/** -+ * dma_set_channel - find an available channel and mark as used -+ * @requestor: initiator/requestor identifier -+ * -+ * Returns first available channel (6-15) or -1 if all occupied -+ */ -+int dma_set_channel(int requestor) -+{ -+ u32 i; -+#ifdef CONFIG_NET_FEC2 -+ i = 4; -+#else -+ i = 2; -+#endif -+ -+ for (; i < 16; ++i) -+ if (used_channel[i] == -1) { -+ used_channel[i] = requestor; -+ return i; -+ } -+ -+ /* All channels taken */ -+ return -1; -+} -+ -+/** -+ * dma_get_channel - get the channel being initiated by the requestor -+ * @requestor: initiator/requestor identifier -+ * -+ * Returns Initiator for requestor or -1 if not found -+ */ -+int dma_get_channel(int requestor) -+{ -+ u32 i; -+ -+ for (i = 0; i < sizeof(used_channel); ++i) { -+ if (used_channel[i] == requestor) -+ return i; -+ } -+ return -1; -+} -+ -+/** -+ * dma_connect - connect a channel with reference on data -+ * @channel: channel number -+ * @address: reference address of data -+ * -+ * Returns 0 if success or -1 if invalid channel -+ */ -+int dma_connect(int channel, int address) -+{ -+ if ((channel < 16) && (channel >= 0)) { -+ connected_channel[channel] = address; -+ return 0; -+ } -+ return -1; -+} -+ -+/** -+ * dma_disconnect - disconnect a channel -+ * @channel: channel number -+ * -+ * Returns 0 if success or -1 if invalid channel -+ */ -+int dma_disconnect(int channel) -+{ -+ if ((channel < 16) && (channel >= 0)) { -+ connected_channel[channel] = 0; -+ return 0; -+ } -+ return -1; -+} -+ -+/** -+ * dma_remove_channel - remove channel from the active list -+ * @requestor: initiator/requestor identifier -+ */ -+void dma_remove_channel(int requestor) -+{ -+ u32 i; -+ -+ for (i = 0; i < sizeof(used_channel); ++i) { -+ if (used_channel[i] == requestor) { -+ used_channel[i] = -1; -+ break; -+ } -+ } -+} -+ -+/** -+ * dma_interrupt_handler - dma interrupt handler -+ * @irq: interrupt number -+ * @dev_id: data -+ * -+ * Returns IRQ_HANDLED -+ */ -+irqreturn_t dma_interrupt_handler(int irq, void *dev_id) -+{ -+ u32 i, interrupts; -+ -+ /* -+ * Determine which interrupt(s) triggered by AND'ing the -+ * pending interrupts with those that aren't masked. -+ */ -+ interrupts = MCF_DMA_DIPR; -+ MCF_DMA_DIPR = interrupts; -+ -+ for (i = 0; i < 16; ++i, interrupts >>= 1) { -+ if (interrupts & 0x1) -+ if (connected_channel[i] != 0) -+ ((void (*)(void)) (connected_channel[i])) (); -+ } -+ -+ return IRQ_HANDLED; -+} -+ -+/** -+ * dma_remove_channel_by_number - clear dma channel -+ * @channel: channel number to clear -+ */ -+void dma_remove_channel_by_number(int channel) -+{ -+ if ((channel < sizeof(used_channel)) && (channel >= 0)) -+ used_channel[channel] = -1; -+} -+ -+/** -+ * dma_init - initialize the dma subsystem -+ * -+ * Returns 0 if success non-zero if failure -+ * -+ * Handles the DMA initialization during device setup. -+ */ -+int __devinit dma_init() -+{ -+ int result; -+ char *dma_version_str; -+ -+ MCD_getVersion(&dma_version_str); -+ printk(KERN_INFO "m547x_8x DMA: Initialize %s\n", dma_version_str); -+ -+ /* attempt to setup dma interrupt handler */ -+ if (request_irq(64 + ISC_DMA, dma_interrupt_handler, IRQF_DISABLED, -+ "MCD-DMA", NULL)) { -+ printk(KERN_ERR "MCD-DMA: Cannot allocate the DMA IRQ(48)\n"); -+ return 1; -+ } -+ -+ MCF_DMA_DIMR = 0; -+ MCF_DMA_DIPR = 0xFFFFFFFF; -+ -+ MCF_ICR(ISC_DMA) = ILP_DMA; -+ -+ result = MCD_initDma((dmaRegs *) (MCF_MBAR + 0x8000), -+ (void *) SYS_SRAM_DMA_START, MCD_RELOC_TASKS); -+ if (result != MCD_OK) { -+ printk(KERN_ERR "MCD-DMA: Cannot perform DMA initialization\n"); -+ free_irq(64 + ISC_DMA, NULL); -+ return 1; -+ } -+ -+ return 0; -+} -+device_initcall(dma_init); ---- /dev/null -+++ b/arch/m68k/coldfire/Makefile -@@ -0,0 +1,20 @@ -+# -+# Makefile for Linux arch/m68k/coldfire source directory -+# -+ -+obj-y:= entry.o config.o cache.o signal.o muldi3.o traps.o ints.o -+ifdef CONFIG_M5445X -+ifneq ($(strip $(CONFIG_USB) $(CONFIG_USB_GADGET_MCF5445X)),) -+ obj-y += usb.o usb/ -+endif -+endif -+ -+ifdef CONFIG_M547X_8X -+obj-$(CONFIG_PCI) += mcf548x-pci.o -+else -+obj-$(CONFIG_PCI) += pci.o mcf5445x-pci.o iomap.o -+endif -+obj-$(CONFIG_M5445X) += mcf5445x-devices.o -+obj-$(CONFIG_M547X_8X) += m547x_8x-devices.o -+obj-$(CONFIG_M547X_8X) += mcf548x-devices.o -+obj-$(CONFIG_MCD_DMA) += m547x_8x-dma.o ---- /dev/null -+++ b/arch/m68k/coldfire/mcf5445x-devices.c -@@ -0,0 +1,136 @@ -+/* -+ * arch/m68k/coldfire/mcf5445x-devices.c -+ * -+ * Coldfire M5445x Platform Device Configuration -+ * -+ * Based on the Freescale MXC devices.c -+ * -+ * Copyright (c) 2007 Freescale Semiconductor, Inc. -+ * Kurt Mahan <kmahan@freescale.com> -+ */ -+#include <linux/module.h> -+#include <linux/kernel.h> -+#include <linux/init.h> -+#include <linux/platform_device.h> -+#include <linux/fsl_devices.h> -+ -+#include <asm/coldfire.h> -+#include <asm/mcfsim.h> -+ -+/* ATA Interrupt */ -+#define IRQ_ATA (64 + 64 + 54) -+ -+/* ATA Base */ -+#define BASE_IO_ATA 0x90000000 -+ -+#define ATA_IER MCF_REG08(BASE_IO_ATA+0x2c) /* int enable reg */ -+#define ATA_ICR MCF_REG08(BASE_IO_ATA+0x30) /* int clear reg */ -+ -+/* -+ * On-chip PATA -+ */ -+#if defined(CONFIG_PATA_FSL) || defined(CONFIG_PATA_FSL_MODULE) -+static int ata_init(struct platform_device *pdev) -+{ -+ /* clear ints */ -+ ATA_IER = 0x00; -+ ATA_ICR = 0xff; -+ -+ /* setup shared pins */ -+ MCF_GPIO_PAR_FEC = (MCF_GPIO_PAR_FEC & MCF_GPIO_PAR_FEC_FEC1_MASK) | -+ MCF_GPIO_PAR_FEC_FEC1_ATA; -+ -+ MCF_GPIO_PAR_FECI2C = (MCF_GPIO_PAR_FECI2C & -+ (MCF_GPIO_PAR_FECI2C_MDC1_MASK & -+ MCF_GPIO_PAR_FECI2C_MDIO1_MASK)) | -+ MCF_GPIO_PAR_FECI2C_MDC1_ATA_DIOR | -+ MCF_GPIO_PAR_FECI2C_MDIO1_ATA_DIOW; -+ -+ MCF_GPIO_PAR_ATA = MCF_GPIO_PAR_ATA_BUFEN | -+ MCF_GPIO_PAR_ATA_CS1 | -+ MCF_GPIO_PAR_ATA_CS0 | -+ MCF_GPIO_PAR_ATA_DA2 | -+ MCF_GPIO_PAR_ATA_DA1 | -+ MCF_GPIO_PAR_ATA_DA0 | -+ MCF_GPIO_PAR_ATA_RESET_RESET | -+ MCF_GPIO_PAR_ATA_DMARQ_DMARQ | -+ MCF_GPIO_PAR_ATA_IORDY_IORDY; -+ -+ MCF_GPIO_PAR_PCI = (MCF_GPIO_PAR_PCI & -+ (MCF_GPIO_PAR_PCI_GNT3_MASK & -+ MCF_GPIO_PAR_PCI_REQ3_MASK)) | -+ MCF_GPIO_PAR_PCI_GNT3_ATA_DMACK | -+ MCF_GPIO_PAR_PCI_REQ3_ATA_INTRQ; -+ -+ return 0; -+} -+ -+static void ata_exit(void) -+{ -+ printk(KERN_INFO "** ata_exit\n"); -+} -+ -+static int ata_get_clk_rate(void) -+{ -+ return MCF_BUSCLK; -+} -+ -+/* JKM -- move these to a header file */ -+#define MCF_IDE_DMA_WATERMARK 32 /* DMA watermark level in bytes */ -+#define MCF_IDE_DMA_BD_NR (512/3/4) /* number of BDs per channel */ -+ -+static struct fsl_ata_platform_data ata_data = { -+ .init = ata_init, -+ .exit = ata_exit, -+ .get_clk_rate = ata_get_clk_rate, -+#ifdef CONFIG_PATA_FSL_USE_DMA -+ .udma_mask = 0x0F, /* the board handles up to UDMA3 */ -+ .fifo_alarm = MCF_IDE_DMA_WATERMARK / 2, -+ .max_sg = MCF_IDE_DMA_BD_NR, -+#endif -+}; -+ -+static struct resource pata_fsl_resources[] = { -+ [0] = { /* I/O */ -+ .start = BASE_IO_ATA, -+ .end = BASE_IO_ATA + 0x000000d8, -+ .flags = IORESOURCE_MEM, -+ }, -+ [2] = { /* IRQ */ -+ .start = IRQ_ATA, -+ .end = IRQ_ATA, -+ .flags = IORESOURCE_IRQ, -+ }, -+}; -+ -+static struct platform_device pata_fsl_device = { -+ .name = "pata_fsl", -+ .id = -1, -+ .num_resources = ARRAY_SIZE(pata_fsl_resources), -+ .resource = pata_fsl_resources, -+ .dev = { -+ .platform_data = &ata_data, -+ .coherent_dma_mask = ~0, /* $$$ REVISIT */ -+ }, -+}; -+ -+static inline void mcf5445x_init_pata(void) -+{ -+ (void)platform_device_register(&pata_fsl_device); -+} -+#else -+static inline void mcf5445x_init_pata(void) -+{ -+} -+#endif -+ -+static int __init mcf5445x_init_devices(void) -+{ -+ printk(KERN_INFO "MCF5445x INIT_DEVICES\n"); -+#if 0 -+ mcf5445x_init_pata(); -+#endif -+ -+ return 0; -+} -+arch_initcall(mcf5445x_init_devices); ---- /dev/null -+++ b/arch/m68k/coldfire/mcf5445x-pci.c -@@ -0,0 +1,431 @@ -+/* -+ * arch/m68k/coldfire/mcf5445x-pci.c -+ * -+ * Coldfire M5445x specific PCI implementation. -+ * -+ * Copyright (c) 2007 Freescale Semiconductor, Inc. -+ * Kurt Mahan <kmahan@freescale.com> -+ */ -+ -+#include <linux/delay.h> -+#include <linux/interrupt.h> -+#include <linux/pci.h> -+ -+#include <asm/mcfsim.h> -+#include <asm/pci.h> -+#include <asm/irq.h> -+ -+/* -+ * Layout MCF5445x to PCI memory mappings: -+ * -+ * WIN MCF5445x PCI TYPE -+ * --- -------- --- ---- -+ * [0] 0xA0000000 -> 0xA7FFFFFF 0xA0000000 -> 0xA7FFFFFF MEM -+ * [1] 0xA8000000 -> 0xABFFFFFF 0xA8000000 -> 0xABFFFFFF MEM -+ * [2] 0xAC000000 -> 0xAFFFFFFF 0xAC000000 -> 0xAFFFFFFF IO -+ */ -+ -+#define MCF5445X_PCI_MEM_BASE 0xA0000000 -+#define MCF5445X_PCI_MEM_SIZE 0x0C000000 -+ -+#define MCF5445X_PCI_CONFIG_BASE 0xAC000000 -+#define MCF5445X_PCI_CONFIG_SIZE 0x04000000 -+ -+#define MCF5445X_PCI_IO_BASE 0xAC000000 -+#define MCF5445X_PCI_IO_SIZE 0x04000000 -+ -+/* PCI Bus memory resource block */ -+struct resource pci_iomem_resource = { -+ .name = "PCI memory space", -+ .start = MCF5445X_PCI_MEM_BASE, -+ .flags = IORESOURCE_MEM, -+ .end = MCF5445X_PCI_MEM_BASE + MCF5445X_PCI_MEM_SIZE - 1 -+}; -+ -+/* PCI Bus ioport resource block */ -+struct resource pci_ioport_resource = { -+ .name = "PCI I/O space", -+ .start = MCF5445X_PCI_IO_BASE, -+ .flags = IORESOURCE_IO, -+ .end = MCF5445X_PCI_IO_BASE + MCF5445X_PCI_IO_SIZE - 1 -+}; -+ -+/* -+ * The M54455EVB multiplexes all the PCI interrupts via -+ * the FPGA and routes them to a single interrupt. The -+ * PCI spec requires all PCI interrupt routines be smart -+ * enough to sort out their own interrupts. -+ * The interrupt source from the FPGA is configured -+ * to EPORT 3. -+ */ -+#define MCF5445X_PCI_IRQ 0x43 -+ -+#define PCI_SLOTS 4 -+ -+/* -+ * FPGA Info -+ */ -+#define FPGA_PCI_IRQ_ENABLE (u32 *)0x09000000 -+#define FPGA_PCI_IRQ_STATUS (u32 *)0x09000004 -+#define FPGA_PCI_IRQ_ROUTE (u32 *)0x0900000c -+#define FPGA_SEVEN_LED (u32 *)0x09000014 -+ -+extern void set_fpga(u32 *addr, u32 val); -+ -+#ifdef DEBUG -+void mcf5445x_pci_dumpregs(void); -+#endif -+ -+/* -+ * mcf5445x_conf_device(struct pci_dev *dev) -+ * -+ * Machine dependent Configure the given device. -+ * -+ * Parameters: -+ * -+ * dev - the pci device. -+ */ -+void -+mcf5445x_conf_device(struct pci_dev *dev) -+{ -+ set_fpga(FPGA_PCI_IRQ_ENABLE, 0x0f); -+} -+ -+/* -+ * int mcf5445x_pci_config_read(unsigned int seg, unsigned int bus, -+ * unsigned int devfn, int reg, -+ * u32 *value) -+ * -+ * Read from PCI configuration space. -+ * -+ */ -+int mcf5445x_pci_config_read(unsigned int seg, unsigned int bus, -+ unsigned int devfn, int reg, int len, u32 *value) -+{ -+ u32 addr = MCF_PCI_PCICAR_BUSNUM(bus) | -+ MCF_PCI_PCICAR_DEVNUM(PCI_SLOT(devfn)) | -+ MCF_PCI_PCICAR_FUNCNUM(PCI_FUNC(devfn)) | -+ MCF_PCI_PCICAR_DWORD(reg) | -+ MCF_PCI_PCICAR_E; -+ -+ if ((bus > 255) || (devfn > 255) || (reg > 255)) { -+ *value = -1; -+ return -EINVAL; -+ } -+ -+ /* setup for config mode */ -+ MCF_PCI_PCICAR = addr; -+ __asm__ __volatile__("nop"); -+ -+ switch (len) { -+ case 1: -+ *value = *(volatile u8 *)(MCF5445X_PCI_CONFIG_BASE+(reg&3)); -+ break; -+ case 2: -+ *value = le16_to_cpu(*(volatile u16 *) -+ (MCF5445X_PCI_CONFIG_BASE + (reg&2))); -+ break; -+ case 4: -+ *value = le32_to_cpu(*(volatile u32 *) -+ (MCF5445X_PCI_CONFIG_BASE)); -+ break; -+ } -+ -+ /* clear config mode */ -+ MCF_PCI_PCICAR = ~MCF_PCI_PCICAR_E; -+ __asm__ __volatile__("nop"); -+ -+ return 0; -+} -+ -+/* -+ * int mcf5445x_pci_config_write(unsigned int seg, unsigned int bus, -+ * unsigned int devfn, int reg, -+ * u32 *value) -+ * -+ * Write to PCI configuration space -+ */ -+int mcf5445x_pci_config_write(unsigned int seg, unsigned int bus, -+ unsigned int devfn, int reg, int len, u32 value) -+{ -+ u32 addr = MCF_PCI_PCICAR_BUSNUM(bus) | -+ MCF_PCI_PCICAR_DEVNUM(PCI_SLOT(devfn)) | -+ MCF_PCI_PCICAR_FUNCNUM(PCI_FUNC(devfn)) | -+ MCF_PCI_PCICAR_DWORD(reg) | -+ MCF_PCI_PCICAR_E; -+ -+ if ((bus > 255) || (devfn > 255) || (reg > 255)) -+ return -EINVAL; -+ -+ /* setup for config mode */ -+ MCF_PCI_PCICAR = addr; -+ __asm__ __volatile__("nop"); -+ -+ switch (len) { -+ case 1: -+ *(volatile u8 *)(MCF5445X_PCI_CONFIG_BASE+(reg&3)) = (u8)value; -+ break; -+ case 2: -+ *(volatile u16 *)(MCF5445X_PCI_CONFIG_BASE+(reg&2)) = -+ cpu_to_le16((u16)value); -+ break; -+ case 4: -+ *(volatile u32 *)(MCF5445X_PCI_CONFIG_BASE) = -+ cpu_to_le32(value); -+ break; -+ } -+ -+ /* clear config mode */ -+ MCF_PCI_PCICAR = ~MCF_PCI_PCICAR_E; -+ __asm__ __volatile__("nop"); -+ -+ return 0; -+} -+ -+/* hardware operations */ -+static struct pci_raw_ops mcf5445x_pci_ops = { -+ .read = mcf5445x_pci_config_read, -+ .write = mcf5445x_pci_config_write, -+}; -+ -+/* -+ * irqreturn_t mcf5445x_pci_interrupt( int irq, void *dev) -+ * -+ * PCI controller interrupt handler. -+ */ -+static irqreturn_t -+mcf5445x_pci_interrupt(int irq, void *dev) -+{ -+ u32 status = MCF_PCI_PCIGSCR; -+#ifdef DEBUG -+ printk(KERN_INFO "PCI: Controller irq status=0x%08x\n", status); -+#endif -+ /* clear */ -+ MCF_PCI_PCIGSCR = status; -+ -+ return IRQ_HANDLED; -+} -+ -+/* -+ * irqreturn_t mcf5445x_pci_arb_interrupt( int irq, void *dev) -+ * -+ * PCI Arbiter interrupt handler. -+ */ -+static irqreturn_t -+mcf5445x_pci_arb_interrupt(int irq, void *dev) -+{ -+ u32 status = MCF_PCIARB_PASR; -+#ifdef DEBUG -+ printk(KERN_INFO "PCI: Arbiter irq status=0x%08x\n", status); -+#endif -+ /* clear */ -+ MCF_PCIARB_PASR = status; -+ return IRQ_HANDLED; -+} -+ -+/* -+ * struct pci_bus_info *init_mcf5445x_pci(void) -+ * -+ * Machine specific initialisation: -+ * -+ * - Allocate and initialise a 'pci_bus_info' structure -+ * - Initialize hardware -+ * -+ * Result: pointer to 'pci_bus_info' structure. -+ */ -+int __init -+init_mcf5445x_pci(void) -+{ -+ return 0; -+#if 0 -+ /* -+ * Initialize the PCI core -+ */ -+ -+ /* arbitration controller */ -+ MCF_PCIARB_PACR = MCF_PCIARB_PACR_INTMPRI | -+ MCF_PCIARB_PACR_EXTMPRI(0x0f) | -+ MCF_PCIARB_PACR_INTMINTEN | -+ MCF_PCIARB_PACR_EXTMINTEN(0x0f); -+ -+ /* pci pin assignment regs */ -+ MCF_GPIO_PAR_PCI = MCF_GPIO_PAR_PCI_GNT0 | -+ MCF_GPIO_PAR_PCI_GNT1 | -+ MCF_GPIO_PAR_PCI_GNT2 | -+ MCF_GPIO_PAR_PCI_GNT3_GNT3 | -+ MCF_GPIO_PAR_PCI_REQ0 | -+ MCF_GPIO_PAR_PCI_REQ1 | -+ MCF_GPIO_PAR_PCI_REQ2 | -+ MCF_GPIO_PAR_PCI_REQ3_REQ3; -+ -+ /* target control reg */ -+ MCF_PCI_PCITCR = MCF_PCI_PCITCR_P | -+ MCF_PCI_PCITCR_WCT(8); -+ -+ /* PCI MEM address */ -+ MCF_PCI_PCIIW0BTAR = 0xA007A000; -+ -+ /* PCI MEM address */ -+ MCF_PCI_PCIIW1BTAR = 0xA803A800; -+ -+ /* PCI IO address */ -+ MCF_PCI_PCIIW2BTAR = 0xAC03AC00; -+ -+ /* window control */ -+ MCF_PCI_PCIIWCR = MCF_PCI_PCIIWCR_WINCTRL0_ENABLE | -+ MCF_PCI_PCIIWCR_WINCTRL0_MEMREAD | -+ MCF_PCI_PCIIWCR_WINCTRL1_ENABLE | -+ MCF_PCI_PCIIWCR_WINCTRL1_MEMREAD | -+ MCF_PCI_PCIIWCR_WINCTRL2_ENABLE | -+ MCF_PCI_PCIIWCR_WINCTRL2_IO; -+ -+ /* initiator control reg */ -+ MCF_PCI_PCIICR = 0x00ff; -+ -+ /* type 0 - command */ -+ MCF_PCI_PCISCR = MCF_PCI_PCISCR_MW | /* mem write/inval */ -+ MCF_PCI_PCISCR_B | /* bus master enable */ -+ MCF_PCI_PCISCR_M; /* mem access enable */ -+ -+ /* type 0 - config reg */ -+ MCF_PCI_PCICR1 = MCF_PCI_PCICR1_CACHELINESIZE(8) | -+ MCF_PCI_PCICR1_LATTIMER(0xff); -+ -+ /* type 0 - config 2 reg */ -+ MCF_PCI_PCICR2 = 0; -+ -+ /* target control reg */ -+ MCF_PCI_PCITCR2 = MCF_PCI_PCITCR2_B0E | -+ MCF_PCI_PCITCR2_B4E; -+ -+ /* translate addresses from PCI[0] to CF[SDRAM] */ -+ MCF_PCI_PCITBATR0 = MCF_RAMBAR1 | MCF_PCI_PCITBATR0_EN; -+ MCF_PCI_PCITBATR4 = MCF_RAMBAR1 | MCF_PCI_PCITBATR4_EN; -+ -+ /* setup controller interrupt handlers */ -+ if (request_irq(55+128, mcf5445x_pci_interrupt, IRQF_SHARED, -+ "PCI Controller", NULL)) -+ printk(KERN_ERR "PCI: Unable to register controller irq\n"); -+ -+ if (request_irq (56+128, mcf5445x_pci_arb_interrupt, IRQF_SHARED, "PCI Arbiter", NULL)) -+ printk(KERN_ERR "PCI: Unable to register arbiter irq\n"); -+ -+ /* global control - clear reset bit */ -+ MCF_PCI_PCIGSCR = MCF_PCI_PCIGSCR_SEE | -+ MCF_PCI_PCIGSCR_PEE; -+ -+ /* let everything settle */ -+ udelay(1000); -+ -+ /* allocate bus ioport resource */ -+ if (request_resource(&ioport_resource, &pci_ioport_resource) < 0) -+ printk(KERN_ERR "PCI: Unable to alloc ioport resource\n"); -+ -+ /* allocate bus iomem resource */ -+ if (request_resource(&iomem_resource, &pci_iomem_resource) < 0) -+ printk(KERN_ERR "PCI: Unable to alloc iomem resource\n"); -+ -+ /* setup FPGA to route PCI to IRQ3(67), SW7 to IRQ7, SW6 to IRQ4 */ -+ set_fpga(FPGA_PCI_IRQ_ENABLE, 0x00000000); -+ set_fpga(FPGA_PCI_IRQ_ROUTE, 0x00000039); -+ set_fpga(FPGA_SEVEN_LED, 0x000000FF); -+ -+ raw_pci_ops = &mcf5445x_pci_ops; -+ -+ return 0; -+#endif -+} -+ -+/* -+ * DEBUGGING -+ */ -+ -+#ifdef DEBUG -+struct regdump { -+ u32 addr; -+ char regname[16]; -+}; -+ -+struct regdump type0regs[] = { -+ { 0xfc0a8000, "PCIIDR" }, -+ { 0xfc0a8004, "PCISCR" }, -+ { 0xfc0a8008, "PCICCRIR" }, -+ { 0xfc0a800c, "PCICR1" }, -+ { 0xfc0a8010, "PCIBAR0" }, -+ { 0xfc0a8014, "PCIBAR1" }, -+ { 0xfc0a8018, "PCIBAR2" }, -+ { 0xfc0a801c, "PCIBAR3" }, -+ { 0xfc0a8020, "PCIBAR4" }, -+ { 0xfc0a8024, "PCIBAR5" }, -+ { 0xfc0a8028, "PCICCPR" }, -+ { 0xfc0a802c, "PCISID" }, -+ { 0xfc0a8030, "PCIERBAR" }, -+ { 0xfc0a8034, "PCICPR" }, -+ { 0xfc0a803c, "PCICR2" }, -+ { 0, "" } -+}; -+ -+struct regdump genregs[] = { -+ { 0xfc0a8060, "PCIGSCR" }, -+ { 0xfc0a8064, "PCITBATR0" }, -+ { 0xfc0a8068, "PCITBATR1" }, -+ { 0xfc0a806c, "PCITCR1" }, -+ { 0xfc0a8070, "PCIIW0BTAR" }, -+ { 0xfc0a8074, "PCIIW1BTAR" }, -+ { 0xfc0a8078, "PCIIW2BTAR" }, -+ { 0xfc0a8080, "PCIIWCR" }, -+ { 0xfc0a8084, "PCIICR" }, -+ { 0xfc0a8088, "PCIISR" }, -+ { 0xfc0a808c, "PCITCR2" }, -+ { 0xfc0a8090, "PCITBATR0" }, -+ { 0xfc0a8094, "PCITBATR1" }, -+ { 0xfc0a8098, "PCITBATR2" }, -+ { 0xfc0a809c, "PCITBATR3" }, -+ { 0xfc0a80a0, "PCITBATR4" }, -+ { 0xfc0a80a4, "PCITBATR5" }, -+ { 0xfc0a80a8, "PCIINTR" }, -+ { 0xfc0a80f8, "PCICAR" }, -+ { 0, "" } -+}; -+ -+struct regdump arbregs[] = { -+ { 0xfc0ac000, "PACR" }, -+ { 0xfc0ac004, "PASR" }, /* documentation error */ -+ { 0, "" } -+}; -+ -+/* -+ * void mcf5445x_pci_dumpregs() -+ * -+ * Dump out all the PCI registers -+ */ -+void -+mcf5445x_pci_dumpregs(void) -+{ -+ struct regdump *reg; -+ -+ printk(KERN_INFO "*** MCF5445x PCI TARGET 0 REGISTERS ***\n"); -+ -+ reg = type0regs; -+ while (reg->addr) { -+ printk(KERN_INFO "0x%08x 0x%08x %s\n", reg->addr, -+ *((u32 *)reg->addr), reg->regname); -+ reg++; -+ } -+ -+ printk(KERN_INFO "\n*** MCF5445x PCI GENERAL REGISTERS ***\n"); -+ reg = genregs; -+ while (reg->addr) { -+ printk(KERN_INFO "0x%08x 0x%08x %s\n", reg->addr, -+ *((u32 *)reg->addr), reg->regname); -+ reg++; -+ } -+ printk(KERN_INFO "\n*** MCF5445x PCI ARBITER REGISTERS ***\n"); -+ reg = arbregs; -+ while (reg->addr) { -+ printk(KERN_INFO "0x%08x 0x%08x %s\n", reg->addr, -+ *((u32 *)reg->addr), reg->regname); -+ reg++; -+ } -+} -+#endif /* DEBUG */ ---- /dev/null -+++ b/arch/m68k/coldfire/mcf548x-devices.c -@@ -0,0 +1,94 @@ -+/* -+ * arch/m68k/coldfire/mcf5445x-devices.c -+ * -+ * Coldfire M5445x Platform Device Configuration -+ * -+ * Based on the Freescale MXC devices.c -+ * -+ * Copyright (c) 2007 Freescale Semiconductor, Inc. -+ * Kurt Mahan <kmahan@freescale.com> -+ */ -+#include <linux/module.h> -+#include <linux/kernel.h> -+#include <linux/init.h> -+#include <linux/mtd/physmap.h> -+#include <linux/platform_device.h> -+#include <linux/fsl_devices.h> -+ -+#include <asm/coldfire.h> -+#include <asm/mcfsim.h> -+ -+static struct resource coldfire_i2c_resources[] = { -+ [0] = { /* I/O */ -+ .start = MCF_MBAR + 0x008F00, -+ .end = MCF_MBAR + 0x008F20, -+ .flags = IORESOURCE_MEM, -+ }, -+ [2] = { /* IRQ */ -+ .start = 40, -+ .end = 40, -+ .flags = IORESOURCE_IRQ, -+ }, -+}; -+ -+static struct platform_device coldfire_i2c_device = { -+ .name = "MCF548X-i2c", -+ .id = -1, -+ .num_resources = ARRAY_SIZE(coldfire_i2c_resources), -+ .resource = coldfire_i2c_resources, -+}; -+ -+static struct resource coldfire_sec_resources[] = { -+ [0] = { /* I/O */ -+ .start = MCF_MBAR + 0x00020000, -+ .end = MCF_MBAR + 0x00033000, -+ .flags = IORESOURCE_MEM, -+ }, -+ [2] = { /* IRQ */ -+ .start = ISC_SEC, -+ .end = ISC_SEC, -+ .flags = IORESOURCE_IRQ, -+ }, -+}; -+ -+static struct platform_device coldfire_sec_device = { -+ .name = "fsl-sec1", -+ .id = -1, -+ .num_resources = ARRAY_SIZE(coldfire_sec_resources), -+ .resource = coldfire_sec_resources, -+}; -+ -+#if defined(CONFIG_MTD_PHYSMAP) -+static struct physmap_flash_data mcf5485_flash_data = { -+ .width = 2, -+}; -+ -+static struct resource mcf5485_flash_resource = { -+ .start = 0xf8000000, -+ .end = 0xf80fffff, -+ .flags = IORESOURCE_MEM, -+}; -+ -+static struct platform_device mcf5485_flash_device = { -+ .name = "physmap-flash", -+ .id = 0, -+ .dev = { -+ .platform_data = &mcf5485_flash_data, -+ }, -+ .num_resources = 1, -+ .resource = &mcf5485_flash_resource, -+}; -+#endif -+ -+static int __init mcf5485_init_devices(void) -+{ -+ printk(KERN_INFO "MCF5485x INIT_DEVICES\n"); -+ -+ platform_device_register(&coldfire_i2c_device); -+ platform_device_register(&coldfire_sec_device); -+/*#if defined(CONFIG_MTD_PHYSMAP) -+ platform_device_register(&mcf5485_flash_device); -+#endif*/ -+ return 0; -+} -+arch_initcall(mcf5485_init_devices); ---- /dev/null -+++ b/arch/m68k/coldfire/mcf548x-pci.c -@@ -0,0 +1,959 @@ -+/* -+ * ColdFire 547x/548x PCI Host Controller functions -+ * -+ * Copyright (c) 2005-2008 Freescale Semiconductor, Inc. -+ * -+ * This code is based on the 2.6.10 version of pci.c -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -+ */ -+#include <linux/kernel.h> -+#include <linux/types.h> -+#include <linux/init.h> -+#include <linux/mm.h> -+#include <linux/string.h> -+#include <linux/pci.h> -+#include <linux/ioport.h> -+#include <linux/slab.h> -+#include <linux/version.h> -+#include <linux/interrupt.h> -+ -+#include <linux/dma-mapping.h> -+#include <asm/coldfire.h> -+#include <asm/io.h> -+#include <asm/m5485sim.h> -+#include <asm/m5485pci.h> -+#include <asm/irq.h> -+#include <asm/pci.h> -+#include <asm/virtconvert.h> -+ -+ -+#undef DEBUG -+//#define DEBUG -+ -+#ifdef DEBUG -+//#define DBG(x...) printk(KERN_DEBUG x) -+#define DBG(x...) printk(x) -+#else -+#define DBG(x...) -+#endif -+ -+#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,5,75)) -+# define irqreturn_t void -+# define IRQ_HANDLED -+# define IRQ_NONE -+#endif -+ -+/* -+ * Bridge configration dafaults -+ */ -+#define PCI_RETRIES 0 -+#define PCI_CACHE_LINE 8 -+#define PCI_MINGNT 1 -+#define PCI_MAXLAT 42 -+ -+ -+/* -+ * Initiator windows setting -+ */ -+#define HOST_MEM_BASE 0xD0000000 /* ColdFire Memory window base */ -+#define PCI_MEM_BASE 0xD0000000 /* PCI Memory window base */ -+#define PCI_MEM_SIZE 0x08000000 /* Memory window size (128M) */ -+#define HOST_IO_BASE 0xD8000000 /* ColdFire I/O window base */ -+#define PCI_IO_BASE_ADDR 0x00000000 /* PCI I/O window base */ -+#define PCI_IO_SIZE 0x00010000 /* I/O window size (64K) */ -+#define HOST_CFG_BASE 0xD8000000 /* ColdFire config window base */ -+#define HOST_DMA_BASE CONFIG_SDRAM_BASE /* ColdFire PCI-DMA window base */ -+#define PCI_HDR_BASE (MCF_MBAR+0xB00)/* ColdFire config registers */ -+ -+#define PCI_MEM_MASK (PCI_MEM_SIZE-1) -+#define PCI_IO_MASK (PCI_IO_SIZE-1) -+ -+/* Macro to set initiator window */ -+#define WxBAR(host_address, pci_address, size) \ -+ (((host_address) & 0xff000000) | \ -+ ((((size)-1) & 0xff000000) >> 8) | \ -+ ((pci_address) & 0xff000000) >> 16) -+ -+/* -+ * BIOS internal data -+ */ -+static u8 revision; /* controller revision */ -+ -+/* -+ * Board specific setting -+ */ -+const unsigned int irq_lines[] = { 5, 7 }; -+ -+#define N_SLOTS (sizeof(board_info) / sizeof(board_info[0])) -+#define N_IRQS (sizeof(irq_lines) / sizeof(irq_lines[0])) -+#define BRIDGE_SLOT 0 -+ -+const struct slotinfo { -+ unsigned char idsel; /* device number */ -+ unsigned char irq; /* external IRQ */ -+ unsigned char req; /* REQ line number */ -+ unsigned char gnt; /* GNT line number */ -+} board_info[] = { -+ {0, 0, 0, 0}, /* Bridge */ -+ {17, 5, 1, 1}, /* Slot #1 */ -+ {18, 5, 2, 2}, /* Slot #2 */ -+ {20, 7, 3, 3}, /* Slot #3 */ -+ {21, 7, 4, 4}, /* Slot #4 */ -+}; -+ -+/************************************************************************/ -+ -+/* -+ * static int mk_conf_addr() -+ * -+ * Return type0 or type1 configuration address -+ * by the means of device address and PCI dword location -+ * 0 - for not existing slots -+ */ -+static int mk_conf_addr(/*struct pci_dev *dev*/struct pci_bus *bus, unsigned int devfn, int where) -+{ -+ int slot, func, address, idsel, dev_fn; -+ -+ if (bus->number) { -+ address = MCF_PCICAR_E | (bus->number << 16) | -+ (devfn << 8) | (where & 0xfc); -+ } else { -+ slot = PCI_SLOT(devfn); -+ if (slot > N_SLOTS || slot == BRIDGE_SLOT) -+ return 0; -+ else { -+ func = PCI_FUNC(devfn); -+ idsel = board_info[slot].idsel; -+ -+ dev_fn = PCI_DEVFN(idsel, func); -+ address = MCF_PCICAR_E | (bus->number << 16) | -+ (dev_fn << 8) | (where & 0xfc); -+ } -+ } -+ -+ return (address); -+} -+ -+/* -+ * static int read_config_byte() -+ * -+ * Read a byte from configuration space of specified device -+ */ -+static int read_config_byte(/*struct pci_dev *dev*/struct pci_bus *bus, unsigned int devfn, int where, u8 *value) -+{ -+ int slot; -+ int address; -+ int result; -+ -+ *value = 0xff; -+ result = PCIBIOS_SUCCESSFUL; -+ -+ slot = PCI_SLOT(devfn); -+ if (slot == BRIDGE_SLOT) { -+ if (where <= 0x40) -+ *value = *(volatile u8 *) (PCI_HDR_BASE + (where ^ 3)); -+ else -+ *value = 0; -+ } else { -+ address = mk_conf_addr(bus, devfn, where); -+ if (!address) -+ result = PCIBIOS_DEVICE_NOT_FOUND; -+ else { -+ MCF_PCICAR = address; -+ *value = *(volatile u8 *) (HOST_CFG_BASE + (where & 3)); -+ } -+ } -+ __asm__ __volatile__("nop"); -+ __asm__ __volatile__("nop"); -+ MCF_PCICAR &= ~MCF_PCICAR_E; -+ -+ DBG("PCI: read_config_byte bus=%d, devfn=%d, addr=0x%02X, val=0x%02X, ret=%02X\n", -+ bus->number, devfn, where, *value, result); -+ -+ return (result); -+} -+ -+/* -+ * static int read_config_word() -+ * -+ * Read a word from configuration space of specified device -+ */ -+static int read_config_word(/*struct pci_dev *dev*/struct pci_bus *bus, unsigned int devfn, int where, u16 *value) -+{ -+ int slot; -+ int address; -+ int result; -+ -+ *value = 0xffff; -+ result = PCIBIOS_SUCCESSFUL; -+ -+ if (where & 0x1) -+ result = PCIBIOS_BAD_REGISTER_NUMBER; -+ else { -+ slot = PCI_SLOT(devfn); -+ if (slot == BRIDGE_SLOT) { -+ if (where <= 0x3f) -+ *value = -+ *(volatile u16 *) (PCI_HDR_BASE + -+ (where ^ 2)); -+ else -+ *value = 0; -+ } else { -+ address = mk_conf_addr(bus, devfn, where); -+ if (!address) -+ result = PCIBIOS_DEVICE_NOT_FOUND; -+ else { -+ MCF_PCICAR = address; -+ *value = le16_to_cpu(*(volatile u16 *) -+ (HOST_CFG_BASE + -+ (where & 2))); -+ } -+ } -+ } -+ __asm__ __volatile__("nop"); -+ __asm__ __volatile__("nop"); -+ MCF_PCICAR &= ~MCF_PCICAR_E; -+ -+ DBG("PCI: read_config_word bus=%d, devfn=%d, addr=0x%02X, val=0x%04X ret=%02X\n", -+ bus->number, devfn, where, *value, result); -+ -+ return (result); -+} -+ -+/* -+ * static int read_config_dword() -+ * -+ * Read a long word from configuration space of specified device -+ */ -+static int read_config_dword(/*struct pci_dev *dev*/struct pci_bus *bus, unsigned int devfn, int where, u32 *value) -+{ -+ int slot; -+ int address; -+ int result; -+ -+ *value = 0xffffffff; -+ result = PCIBIOS_SUCCESSFUL; -+ -+ if (where & 0x3) -+ result = PCIBIOS_BAD_REGISTER_NUMBER; -+ else { -+ slot = PCI_SLOT(devfn); -+ if (slot == BRIDGE_SLOT) { -+ if (where <= 0x3d) -+ *value = -+ *(volatile u32 *) (PCI_HDR_BASE + where); -+ else -+ *value = 0; -+ __asm__ __volatile__("nop"); -+ __asm__ __volatile__("nop"); -+ } else { -+ address = mk_conf_addr(bus, devfn, where); -+ if (!address) -+ result = PCIBIOS_DEVICE_NOT_FOUND; -+ else { -+ MCF_PCICAR = address; -+ *value = le32_to_cpu(*(volatile u32 *) -+ (HOST_CFG_BASE)); -+ __asm__ __volatile__("nop"); -+ __asm__ __volatile__("nop"); -+ if (bus->number != 0 && revision < 1) { -+ volatile u32 temp; -+ -+ MCF_PCICAR |= 0xff0000; -+ temp = *(volatile u32 *) (HOST_CFG_BASE); -+ } -+ } -+ } -+ } -+ -+ MCF_PCICAR &= ~MCF_PCICAR_E; -+ -+ DBG("PCI: read_config_dword bus=%d, devfn=%d, addr=0x%02X, value=0x%08X ret=%02X\n", -+ bus->number, devfn, where, *value, result); -+ -+ return (result); -+} -+ -+/* -+ * static int write_config_byte() -+ * -+ * Write a byte to configuration space of specified device -+ */ -+static int write_config_byte(/*struct pci_dev *dev*/struct pci_bus *bus, unsigned int devfn, int where, u8 value) -+{ -+ int slot; -+ int address; -+ int result; -+ -+ result = PCIBIOS_SUCCESSFUL; -+ -+ slot = PCI_SLOT(devfn); -+ if (slot == BRIDGE_SLOT) { -+ if (where <= 0x40) -+ *(volatile u8 *) (PCI_HDR_BASE + (where ^ 3)) = value; -+ } else { -+ address = mk_conf_addr(bus, devfn, where); -+ if (!address) -+ result = PCIBIOS_DEVICE_NOT_FOUND; -+ else { -+ MCF_PCICAR = address; -+ *(volatile u8 *) (HOST_CFG_BASE + (where & 3)) = value; -+ } -+ } -+ __asm__ __volatile__("nop"); -+ __asm__ __volatile__("nop"); -+ MCF_PCICAR &= ~MCF_PCICAR_E; -+ -+ DBG("PCI: write_config_byte bus=%d, devfn=%d, addr=0x%02X, value=0x%02X ret=%02X\n", -+ bus->number, devfn, where, value, result); -+ -+ return (result); -+} -+ -+/* -+ * static int write_config_word() -+ * -+ * Write a word to configuration space of specified device -+ */ -+static int write_config_word(/*struct pci_dev *dev*/struct pci_bus *bus, unsigned int devfn, int where, u16 value) -+{ -+ int slot; -+ int address; -+ int result; -+ -+ result = PCIBIOS_SUCCESSFUL; -+ -+ if (where & 0x1) -+ result = PCIBIOS_BAD_REGISTER_NUMBER; -+ else { -+ slot = PCI_SLOT(devfn); -+ if (slot == BRIDGE_SLOT) { -+ if (where <= 0x3f) -+ *(volatile u16 *) (PCI_HDR_BASE + (where ^ 2)) = -+ value; -+ } else { -+ address = mk_conf_addr(bus, devfn, where); -+ if (!address) -+ result = PCIBIOS_DEVICE_NOT_FOUND; -+ else { -+ MCF_PCICAR = address; -+ *(volatile u16 *) (HOST_CFG_BASE + (where & 2)) = -+ cpu_to_le16(value); -+ } -+ } -+ } -+ __asm__ __volatile__("nop"); -+ __asm__ __volatile__("nop"); -+ MCF_PCICAR &= ~MCF_PCICAR_E; -+ -+ DBG("PCI: write_config_word bus=%d, devfn=%d, addr=0x%02X, value=0x%04X ret=%02X\n", -+ bus->number, devfn, where, value, result); -+ -+ return (result); -+} -+ -+/* -+ * static int write_config_dword() -+ * -+ * Write a long word to configuration space of specified device -+ */ -+static int write_config_dword(/*struct pci_dev *dev*/struct pci_bus *bus, unsigned int devfn, int where, u32 value) -+{ -+ int slot; -+ int address; -+ int result; -+ -+ result = PCIBIOS_SUCCESSFUL; -+ -+ if (where & 0x3) -+ result = PCIBIOS_BAD_REGISTER_NUMBER; -+ else { -+ slot = PCI_SLOT(devfn); -+ if (slot == BRIDGE_SLOT) { -+ if (where <= 0x3d) -+ *(volatile u32 *) (PCI_HDR_BASE + where) = -+ value; -+ } else { -+ address = mk_conf_addr(bus, devfn, where); -+ if (!address) -+ result = PCIBIOS_DEVICE_NOT_FOUND; -+ else { -+ MCF_PCICAR = address; -+ *(volatile u32 *) (HOST_CFG_BASE) = -+ cpu_to_le32(value); -+ } -+ } -+ } -+ __asm__ __volatile__("nop"); -+ __asm__ __volatile__("nop"); -+ MCF_PCICAR &= ~MCF_PCICAR_E; -+ -+ DBG("PCI: write_config_dword dev=%d, fn=%d, addr=0x%02X, value=0x%08X ret=%02X\n", -+ PCI_SLOT(devfn), PCI_FUNC(devfn), where, value, result); -+ -+ return (result); -+} -+ -+static int config_read(struct pci_bus *bus, unsigned int devfn, -+ int where, int size, u32 * val) -+{ -+ switch (size) { -+ case 1: -+ return read_config_byte(bus, devfn, where, (u8 *) val); -+ case 2: -+ return read_config_word(bus, devfn, where, (u16 *) val); -+ default: -+ return read_config_dword(bus, devfn, where, val); -+ } -+} -+ -+static int config_write(struct pci_bus *bus, unsigned int devfn, -+ int where, int size, u32 val) -+{ -+ switch (size) { -+ case 1: -+ return write_config_byte(bus, devfn, where, (u8) val); -+ case 2: -+ return write_config_word(bus, devfn, where, (u16) val); -+ default: -+ return write_config_dword(bus, devfn, where, val); -+ } -+} -+ -+/* -+ * configuration routines entry points -+ */ -+static struct pci_ops bus_ops = { -+ read: config_read, -+ write: config_write -+}; -+ -+/************************************************************************/ -+ -+/* -+ * u8 pci_inb() -+ * -+ * Read a byte at specified address from I/O space -+ */ -+unsigned char pci_inb(long addr) -+{ -+ char value; -+ -+ value = *(volatile unsigned char *) (HOST_IO_BASE | (addr & PCI_IO_MASK)); -+ DBG("PCI: inb addr=0x%08X, value=0x%02X\n", addr, value); -+ -+ return (unsigned char) value; -+} -+ -+ -+/* -+ * u16 pci_inw() -+ * -+ * Read a word at specified address from I/O space -+ */ -+unsigned short pci_inw(long addr) -+{ -+ short value; -+ volatile unsigned short *ptr; -+ -+ ptr = (volatile unsigned short *) (HOST_IO_BASE | (addr & PCI_IO_MASK)); -+ value = le16_to_cpu(*ptr); -+ -+ DBG("PCI: inw addr=0x%08X, value=0x%04X\n", addr, value); -+ return (unsigned short) value; -+} -+ -+/* -+ * u16 pci_raw_inw() -+ * -+ * Read a raw word at specified address from I/O space -+ */ -+unsigned short pci_raw_inw(long addr) -+{ -+ short value; -+ volatile unsigned short *ptr; -+ -+ ptr = (volatile unsigned short *) (HOST_IO_BASE | (addr & PCI_IO_MASK)); -+ value = *ptr; -+ -+ DBG("PCI: raw_inw addr=0x%08X, value=0x%04X\n", addr, value); -+ return (unsigned short) value; -+} -+ -+/* -+ * u32 pci_inl() -+ * -+ * Read a dword at specified address from I/O space -+ */ -+unsigned long pci_inl(long addr) -+{ -+ long value; -+ volatile unsigned long *ptr; -+ -+ ptr = (volatile unsigned long *) (HOST_IO_BASE | (addr & PCI_IO_MASK)); -+ value = le32_to_cpu(*ptr); -+ -+ DBG("PCI: inl addr=0x%08X, value=0x%08X\n", addr, value); -+ return (unsigned long) value; -+} -+ -+/* -+ * u32 pci_raw_inl() -+ * -+ * Read a raw dword at specified address from I/O space -+ */ -+unsigned long pci_raw_inl(long addr) -+{ -+ long value; -+ volatile unsigned long *ptr; -+ -+ ptr = (volatile unsigned long *) (HOST_IO_BASE | (addr & PCI_IO_MASK)); -+ value = *ptr; -+ -+ DBG("PCI: raw_inl addr=0x%08X, value=0x%08X\n", addr, value); -+ return (unsigned long) value; -+} -+ -+/* -+ * void pci_outb() -+ * -+ * Write a byte value at specified address to I/O space -+ */ -+void pci_outb( unsigned char value, long addr) -+{ -+ -+ *(volatile unsigned char *) (HOST_IO_BASE | (addr & PCI_IO_MASK)) = value; -+ DBG("PCI: outb addr=0x%08X, value=0x%02X\n", addr, value); -+} -+ -+ -+/* -+ * void pci_outw() -+ * -+ * Write a word value at specified address to I/O space -+ */ -+void pci_outw(volatile unsigned short value, volatile long addr) -+{ -+ volatile unsigned short *ptr; -+ -+ ptr = (volatile unsigned short *) (HOST_IO_BASE | (addr & PCI_IO_MASK)); -+ *ptr = cpu_to_le16(value); -+ DBG("PCI: outw addr=0x%08X, value=0x%04X\n", addr, value); -+} -+ -+/* -+ * void pci_raw_outw() -+ * -+ * Write a raw word value at specified address to I/O space -+ */ -+void pci_raw_outw(volatile unsigned short value, volatile long addr) -+{ -+ volatile unsigned short *ptr; -+ -+ ptr = (volatile unsigned short *) (HOST_IO_BASE | (addr & PCI_IO_MASK)); -+ *ptr = value; -+ DBG("PCI: raw_outw addr=0x%08X, value=0x%04X\n", addr, value); -+} -+ -+/* -+ * void pci_outl() -+ * -+ * Write a long word value at specified address to I/O space -+ */ -+void pci_outl(volatile unsigned long value, volatile long addr) -+{ -+ volatile unsigned long *ptr; -+ -+ ptr = (volatile unsigned long *)(HOST_IO_BASE | (addr & PCI_IO_MASK)); -+ *ptr = cpu_to_le32(value); -+ DBG("PCI: outl addr=0x%08X, value=0x%08X\n", addr, value); -+} -+ -+/* -+ * void pci_raw_outl() -+ * -+ * Write a raw long word value at specified address to I/O space -+ */ -+void pci_raw_outl(volatile unsigned long value, volatile long addr) -+{ -+ volatile unsigned long *ptr; -+ -+ ptr = (volatile unsigned long *)(HOST_IO_BASE | (addr & PCI_IO_MASK)); -+ *ptr = value; -+ DBG("PCI: raw_outl addr=0x%08X, value=0x%08X\n", addr, value); -+} -+ -+/* -+ * void pci_insb() -+ * -+ * Read several byte values from specified I/O port -+ */ -+void pci_insb(volatile unsigned char *addr, unsigned char *buf, int len) -+{ -+ for (; len--; buf++) -+ *buf = pci_inb((unsigned long)addr); -+ DBG("PCI: pci_insb addr=0x%08X, buf=%p, len=%d\n", addr, buf, len); -+} -+ -+ -+/* -+ * void pci_insw() -+ * -+ * Read several word values from specified I/O port -+ */ -+void pci_insw(volatile unsigned short *addr, unsigned short *buf, int len) -+{ -+ for (; len--; buf++) -+ *buf = pci_inw((unsigned long)addr); -+ DBG("PCI: pci_insw addr=0x%08X, buf=%p, len=%d\n", addr, buf, len); -+} -+ -+/* -+ * void pci_insl() -+ * -+ * Read several dword values from specified I/O port -+ */ -+void pci_insl(volatile unsigned long *addr, unsigned long *buf, int len) -+{ -+ for (; len--; buf++) -+ *buf = pci_inl((unsigned long)addr); -+ DBG("PCI: pci_insl addr=0x%08X, buf=%p, len=%d\n", addr, buf, len); -+} -+ -+/* -+ * void pci_outsb() -+ * -+ * Write several byte values to specified I/O port -+ */ -+void pci_outsb(volatile unsigned char *addr, const unsigned char *buf, int len) -+{ -+ for (; len--; buf++) -+ pci_outb((unsigned long)addr, *buf); -+ DBG("PCI: pci_outsb addr=0x%08X, buf=%p, len=%d\n", addr, buf, len); -+} -+ -+/* -+ * void pci_outsw() -+ * -+ * Write several word values to specified I/O port -+ */ -+void pci_outsw(volatile unsigned short *addr, const unsigned short *buf, int len) -+{ -+ for (; len--; buf++) -+ pci_outw((unsigned long)addr, *buf); -+ DBG("PCI: pci_outsw addr=0x%08X, buf=%p, len=%d\n", addr, buf, len); -+} -+ -+/* -+ * void pci_outsl() -+ * -+ * Write several dword values to specified I/O port -+ */ -+void pci_outsl(volatile unsigned long *addr, const unsigned long *buf, int len) -+{ -+ for (; len--; buf++) -+ pci_outl((unsigned long)addr, *buf); -+ DBG("PCI: pci_outsl addr=0x%08X, buf=%p, len=%d\n", addr, buf, len); -+} -+ -+/* -+ * void pci_xlb_handler() -+ * -+ * PCI XLB interrupt handler -+ */ -+irqreturn_t xlb_interrupt(int irq, void *dev) -+{ -+ volatile int xlb_error = MCF_PCIISR; -+ -+ /* Acknowlege interrupt */ -+ MCF_PCIISR = xlb_error; -+ -+ /* Dump interrupt reason */ -+ if (xlb_error & MCF_PCIISR_RE) -+ DBG("PCI: Retry Error Received\n"); -+ -+ if (xlb_error & MCF_PCIISR_IA) -+ DBG("PCI: Initiator Abort Received\n"); -+ -+ if (xlb_error & MCF_PCIISR_TA) -+ DBG("PCI: Target Abort Received\n"); -+ -+ return IRQ_HANDLED; -+} -+ -+ -+/* -+ * void pci_arbiter_handler() -+ * -+ * PCI arbiter interrupt handler -+ */ -+irqreturn_t arb_interrupt(int irq, void *dev) -+{ -+ volatile unsigned long arb_error = MCF_PCIARB_PASR; -+ -+ /* Acknowlege interrupt */ -+ printk("%s\n",__FUNCTION__); -+ MCF_PCIARB_PASR = arb_error; -+ -+ if (arb_error & MCF_PCIARB_PASR_ITLMBK) { -+ DBG("PCI: coldfire master time-out\n"); -+ -+ /* Set infinite number of retries */ -+ MCF_PCIICR &= ~0xFF; -+ } -+ -+ if (arb_error & MCF_PCIARB_PASR_EXTMBK(0x1F)) { -+ arb_error >>= 17; -+ DBG("PCI: external master time-out (mask = 0x%X)\n", arb_error); -+ -+ /* raise arbitration priority level */ -+ MCF_PCIARB_PACR = MCF_PCIARB_PACR_EXTMPRI(arb_error); -+ } -+ -+ return IRQ_HANDLED; -+} -+ -+ -+/* -+ * void pci_eint_handler() -+ * -+ * Eport interrupt handler -+ */ -+irqreturn_t eint_handler(int irq, void *dev) -+{ -+ /* Just acknowlege interrupt and exit */ -+ MCF_EPFR = 0x1 << (irq - 64); -+ return IRQ_HANDLED; -+} -+ -+ -+/* -+ * void __init coldfire_fixup(int pci_modify) -+ * -+ * Assign IRQ numbers as used by Linux to the interrupt pins -+ * of the PCI cards. -+ */ -+static void __init coldfire_fixup(int pci_modify) -+{ -+ struct pci_dev *dev; -+ unsigned char slot, pin; -+ -+ DBG("%s\n",__FUNCTION__); -+#ifdef NL_ORIGINAL -+ pci_for_each_dev(dev) { -+#else -+ dev = NULL; -+ while ((dev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) { -+#endif -+ if (dev->class >> 16 != PCI_BASE_CLASS_BRIDGE) { -+ slot = PCI_SLOT(dev->devfn); -+ dev->irq = 64 + board_info[slot].irq; -+ -+ /* Check if device needs interrupt */ -+#ifdef NL_ORIGINAL -+ pcibios_read_config_byte( -+ dev->bus->number, dev->devfn, -+ PCI_INTERRUPT_PIN, &pin); -+ -+ if ( pin ) { -+ pcibios_write_config_byte( -+ dev->bus->number, dev->devfn, -+ PCI_INTERRUPT_LINE, dev->irq); -+ } -+#else -+ pci_read_config_byte(dev, -+ PCI_INTERRUPT_PIN, &pin); -+ -+ if ( pin ) { -+ pci_write_config_byte(dev, -+ PCI_INTERRUPT_LINE, dev->irq); -+ } -+#endif -+ } -+ } -+} -+ -+static void __init configure_device(struct pci_dev *dev) -+{ -+ /* TODO: This should depend from disable_pci_burst setting */ -+ DBG("%s\n",__FUNCTION__); -+#ifdef NL_ORIGINAL -+ pcibios_write_config_byte(bus, devfn, PCI_CACHE_LINE_SIZE, PCI_CACHE_LINE); -+#else -+ pci_write_config_byte(dev, PCI_CACHE_LINE_SIZE, PCI_CACHE_LINE); -+#endif -+} -+ -+struct pci_bus_info *__init init_coldfire_pci(void) -+{ -+ static struct pci_bus_info bus; -+ int i; -+ int pci_mem_va; -+ static char irq_name[N_IRQS][15]; -+ -+ /* Get controller revision */ -+ revision = MCF_PCICCRIR; -+ printk("ColdFire PCI Host Bridge (Rev. %d) detected:" -+ "MEMBase %x,MEMLen %x,IOBase %x,IOLen %x\n", -+ revision, HOST_MEM_BASE, PCI_MEM_SIZE - 1, 0, PCI_IO_SIZE - 1); -+ -+ /* Setup bus info structure. */ -+ memset(&bus, 0, sizeof (struct pci_bus_info)); -+ -+ /* Request intiator memory resource */ -+ bus.mem_space.start = PCI_MEM_BASE;//HOST_MEM_BASE; -+ bus.mem_space.end = bus.mem_space.start + PCI_MEM_SIZE - 1; -+ bus.mem_space.name = "PCI Bus #0"; -+ if (request_resource(&iomem_resource, &bus.mem_space) != 0) -+ { -+ printk("Failed to request bridge iomem resource\n"); -+ return NULL; -+ } -+ -+ /* Request intiator memory resource */ -+ bus.io_space.start = 0; -+ bus.io_space.end = bus.io_space.start + PCI_IO_SIZE - 1; -+ bus.io_space.name = "PCI Bus #0"; -+ if (request_resource(&ioport_resource, &bus.io_space) != 0) -+ { -+ printk("Failed to request bridge ioport resource\n"); -+ return NULL; -+ } -+ -+ /* Must Reset!!! If bootloader has PCI enabled, it will cause -+ * problem in linux when it tries to configure/find resources -+ * for the pci devices. Both registers need to be reset. -+ */ -+ MCF_PCIGSCR = 0x1; -+ MCF_PCITCR = 0x00000000; -+ -+ /* Set up the arbiter */ -+ MCF_PCIARB_PACR = 0 /*MCF_PCIARB_PACR_PKMD*/ -+ | MCF_PCIARB_PACR_INTMPRI -+ | MCF_PCIARB_PACR_INTMINTEN -+ | MCF_PCIARB_PACR_EXTMPRI(0x1F) -+ | MCF_PCIARB_PACR_EXTMINTEN(0x1F); -+ -+ /* GNT and REQ */ -+ MCF_PAR_PCIBG = 0x3FF; -+ MCF_PAR_PCIBR = 0x3FF; -+ -+ /* Enable bus mastering, memory access and MWI */ -+ MCF_PCISCR = MCF_PCISCR_B | MCF_PCISCR_M | MCF_PCISCR_MW; -+ -+ /* Setup burst parameters */ -+ MCF_PCICR1 = MCF_PCICR1_LATTIMER(32) | -+ MCF_PCICR1_CACHELINESIZE(PCI_CACHE_LINE); -+ -+ MCF_PCICR2 = 0; -+ /*MCF_PCICR2_MINGNT(PCI_MINGNT) | -+ MCF_PCICR2_MAXLAT(PCI_MAXLAT); -+ */ -+ /* Turn on error signaling */ -+ MCF_PCIICR = MCF_PCIICR_TAE | MCF_PCIICR_IAE | PCI_RETRIES; -+ MCF_PCIGSCR |= MCF_PCIGSCR_SEE; -+ /* -+ * Configure Initiator Windows -+ * Window 0: 128M PCI Memory @ HOST_MEM_BASE, 1:1 mapping -+ * Window 1: 64K I/O Memory @ HOST_IO_BASE, 1:0 mapping -+ */ -+ MCF_PCIIW0BTAR = WxBAR(HOST_MEM_BASE, PCI_MEM_BASE, PCI_MEM_SIZE); -+ MCF_PCIIW1BTAR = WxBAR(HOST_IO_BASE, PCI_IO_BASE_ADDR, PCI_IO_SIZE); -+ -+ MCF_PCIIWCR = MCF_PCIIWCR_WINCTRL1_IO | -+ MCF_PCIIWCR_WINCTRL0_MEMRDLINE; -+ -+ /* Target PCI DMA Windows */ -+ MCF_PCIBAR1 = PCI_DMA_BASE; -+ MCF_PCITBATR1 = HOST_DMA_BASE | MCF_PCITBATR1_EN; -+ MCF_PCIBAR0 = MCF_RAMBAR0;; -+ MCF_PCITBATR0 = MCF_RAMBAR0 | MCF_PCITBATR0_EN; -+ DBG("PCI TCR %x,MCF_PCIBAR1 %x,MCF_PCITBATR1 %x." -+ "MCF_PCIBAR0 %x,MCF_PCITBATR9 %x\n", MCF_PCITCR, MCF_PCIBAR1, -+ MCF_PCITBATR1, MCF_PCIBAR0, MCF_PCITBATR0); -+ /* Enable internal PCI controller interrupts */ -+ MCF_ICR(ISC_PCI_XLB) = ILP_PCI_XLB; -+ /*request_irq(64+ISC_PCI_XLB, xlb_interrupt, -+ SA_INTERRUPT, "PCI XL Bus", (void*)-1); -+ enable_irq (64+ISC_PCI_XLB); -+ */ -+ if(request_irq(64+ISC_PCI_XLB, xlb_interrupt, -+ IRQF_DISABLED, "PCI XL Bus", (void*)-1)){ -+ printk("Cannot allocate ISC_PCI_XLB IRQ\n"); -+ return (struct pci_bus_info *)-EBUSY; -+ } -+ -+ MCF_ICR(ISC_PCI_ARB) = ILP_PCI_ARB; -+ /*request_irq(64+ISC_PCI_ARB, arb_interrupt, -+ SA_INTERRUPT, "PCI Arbiter", (void*)-1); -+ enable_irq (64+ISC_PCI_ARB); -+ */ -+ if(request_irq(64+ISC_PCI_ARB, arb_interrupt, -+ IRQF_DISABLED, "PCI Arbiter", (void*)-1)){ -+ printk("Cannot allocate ISC_PCI_ARB IRQ\n"); -+ return (struct pci_bus_info *)-EBUSY; -+ } -+ -+ /* Set slots interrupt setting */ -+ for (i = 0; i < N_IRQS; i++) -+ { -+ /* Set trailing edge for PCI interrupts */ -+ MCF_EPPAR &= ~MCF_EPPAR_EPPA(irq_lines[i], 0x3); -+ if (irq_lines[i] == 5) -+ MCF_EPPAR |= MCF_EPPAR_EPPA(irq_lines[i], MCF_EPPAR_EPPAx_FALLING); -+ else -+ MCF_EPPAR |= MCF_EPPAR_EPPA(irq_lines[i], 0/*MCF_EPPAR_EPPAx_FALLING*/); -+ /* Turn on irq line in eport */ -+ MCF_EPIER |= MCF_EPIER_EPIE(irq_lines[i]); -+ -+ /* Enable irq in gpio */ -+ if (irq_lines[i] == 5) -+ MCF_PAR_FECI2CIRQ |= 1; -+ -+ if (irq_lines[i] == 6) -+ MCF_PAR_FECI2CIRQ |= 2; -+ -+ /* Register external interrupt handlers */ -+ sprintf(irq_name[i], "PCI IRQ%d", irq_lines[i]); -+ /*request_irq(64 + irq_lines[i], eint_handler, -+ SA_SHIRQ, irq_name[i], (void*)-1); -+ enable_irq(64 + irq_lines[i]);*/ -+ if(request_irq(64 + irq_lines[i], eint_handler, -+ IRQF_SHARED, irq_name[i], (void*)-1)){ -+ printk("Cannot allocate irq_lines[%d] IRQ\n", irq_lines[i]); -+ return (struct pci_bus_info *)-EBUSY; -+ } -+ } -+ -+ /* Clear PCI Reset and wait for devices to reset */ -+ MCF_PCIGSCR &= ~MCF_PCIGSCR_PR; -+ schedule_timeout((5 * HZ) / 10); -+ /* Remap initiator windows (should be 1:1 to the physical memory) */ -+ pci_mem_va = (int) ioremap_nocache(HOST_MEM_BASE, PCI_MEM_SIZE + PCI_IO_SIZE); -+#if 1 -+ printk("%s: MEMBase_phy %x, Virt %x, len %x\n",__FUNCTION__, -+ HOST_MEM_BASE,pci_mem_va,PCI_MEM_SIZE + PCI_IO_SIZE); -+#endif -+ BUG_ON(pci_mem_va != HOST_MEM_BASE); -+ -+ /* Setup bios32 and pci bus driver callbacks */ -+ bus.m68k_pci_ops = &bus_ops; -+ bus.fixup = coldfire_fixup; -+ bus.conf_device = configure_device; -+ -+ return &bus; -+} -+ ---- /dev/null -+++ b/arch/m68k/coldfire/muldi3.S -@@ -0,0 +1,64 @@ -+/* -+ * Coldfire muldi3 assembly verion -+ */ -+ -+#include <linux/linkage.h> -+.globl __muldi3 -+ -+ENTRY(__muldi3) -+ linkw %fp,#0 -+ lea %sp@(-32),%sp -+ moveml %d2-%d7/%a2-%a3,%sp@ -+ moveal %fp@(8), %a2 -+ moveal %fp@(12), %a3 -+ moveal %fp@(16), %a0 -+ moveal %fp@(20),%a1 -+ movel %a3,%d2 -+ andil #65535,%d2 -+ movel %a3,%d3 -+ clrw %d3 -+ swap %d3 -+ movel %a1,%d0 -+ andil #65535,%d0 -+ movel %a1,%d1 -+ clrw %d1 -+ swap %d1 -+ movel %d2,%d7 -+ mulsl %d0,%d7 -+ movel %d2,%d4 -+ mulsl %d1,%d4 -+ movel %d3,%d2 -+ mulsl %d0,%d2 -+ mulsl %d1,%d3 -+ movel %d7,%d0 -+ clrw %d0 -+ swap %d0 -+ addl %d0,%d4 -+ addl %d2,%d4 -+ cmpl %d4,%d2 -+ blss 1f -+ addil #65536,%d3 -+1: -+ movel %d4,%d0 -+ clrw %d0 -+ swap %d0 -+ movel %d3,%d5 -+ addl %d0,%d5 -+ movew %d4,%d6 -+ swap %d6 -+ movew %d7,%d6 -+ movel %d5,%d0 -+ movel %d6,%d1 -+ movel %a3,%d2 -+ movel %a0,%d3 -+ mulsl %d3,%d2 -+ movel %a2,%d3 -+ movel %a1,%d4 -+ mulsl %d4,%d3 -+ addl %d3,%d2 -+ movel %d2,%d0 -+ addl %d5,%d0 -+ moveml %sp@, %d2-%d7/%a2-%a3 -+ lea %sp@(32),%sp -+ unlk %fp -+ rts ---- /dev/null -+++ b/arch/m68k/coldfire/pci.c -@@ -0,0 +1,245 @@ -+/* -+ * linux/arch/m68k/coldfire/pci.c -+ * -+ * PCI initialization for Coldfire architectures. -+ * -+ * Currently Supported: -+ * M5445x -+ * -+ * Copyright (c) 2007 Freescale Semiconductor, Inc. -+ * Kurt Mahan <kmahan@freescale.com> -+ */ -+ -+#include <linux/kernel.h> -+#include <linux/init.h> -+#include <linux/pci.h> -+ -+#include <asm/mcfsim.h> -+#include <asm/pci.h> -+ -+/* pci ops for reading/writing config */ -+struct pci_raw_ops *raw_pci_ops; -+ -+/* pci debug flag */ -+static int debug_pci; -+ -+#ifdef CONFIG_M54455 -+extern int init_mcf5445x_pci(void); -+extern void mcf5445x_conf_device(struct pci_dev *dev); -+extern void mcf5445x_pci_dumpregs(void); -+ -+extern struct resource pci_ioport_resource; -+extern struct resource pci_iomem_resource; -+#endif -+ -+static int -+pci_read(struct pci_bus *bus, unsigned int devfn, int where, -+ int size, u32 *value) -+{ -+ return raw_pci_ops->read(0, bus->number, devfn, where, size, value); -+} -+ -+static int -+pci_write(struct pci_bus *bus, unsigned int devfn, int where, -+ int size, u32 value) -+{ -+ return raw_pci_ops->write(0, bus->number, devfn, where, size, value); -+} -+ -+struct pci_ops pci_root_ops = { -+ .read = pci_read, -+ .write = pci_write, -+}; -+ -+/* -+ * pcibios_setup(char *) -+ * -+ * Initialize the pcibios based on cmd line params. -+ */ -+char * -+pcibios_setup(char *str) -+{ -+ if (!strcmp(str, "debug")) { -+ debug_pci = 1; -+ return NULL; -+ } -+ return str; -+} -+ -+/* -+ * We need to avoid collisions with `mirrored' VGA ports -+ * and other strange ISA hardware, so we always want the -+ * addresses to be allocated in the 0x000-0x0ff region -+ * modulo 0x400. -+ * -+ * Why? Because some silly external IO cards only decode -+ * the low 10 bits of the IO address. The 0x00-0xff region -+ * is reserved for motherboard devices that decode all 16 -+ * bits, so it's ok to allocate at, say, 0x2800-0x28ff, -+ * but we want to try to avoid allocating at 0x2900-0x2bff -+ * which might have be mirrored at 0x0100-0x03ff.. -+ */ -+void -+pcibios_align_resource(void *data, struct resource *res, resource_size_t size, -+ resource_size_t align) -+{ -+ struct pci_dev *dev = data; -+ -+ if (res->flags & IORESOURCE_IO) { -+ resource_size_t start = res->start; -+ -+ if (size > 0x100) -+ printk(KERN_ERR "PCI: I/O Region %s/%d too large" -+ " (%ld bytes)\n", pci_name(dev), -+ dev->resource - res, (long int)size); -+ -+ if (start & 0x300) { -+ start = (start + 0x3ff) & ~0x3ff; -+ res->start = start; -+ } -+ } -+} -+ -+/* -+ * Swizzle the device pin each time we cross a bridge -+ * and return the slot number. -+ */ -+static u8 __devinit -+pcibios_swizzle(struct pci_dev *dev, u8 *pin) -+{ -+ return 0; -+} -+ -+/* -+ * Map a slot/pin to an IRQ. -+ */ -+static int -+pcibios_map_irq(struct pci_dev *dev, u8 slot, u8 pin) -+{ -+ return 0x43; -+} -+ -+/* -+ * pcibios_update_irq(struct pci_dev *dev, int irq) -+ * -+ * Update a PCI interrupt. -+ */ -+void -+pcibios_update_irq(struct pci_dev *dev, int irq) -+{ -+ pci_write_config_byte(dev, PCI_INTERRUPT_LINE, irq); -+} -+ -+/* -+ * pcibios_enable_device(struct pci_dev *dev, int mask) -+ * -+ * Enable a device on the PCI bus. -+ */ -+int -+pcibios_enable_device(struct pci_dev *dev, int mask) -+{ -+ u16 cmd, old_cmd; -+ int idx; -+ struct resource *r; -+ -+ pci_read_config_word(dev, PCI_COMMAND, &cmd); -+ old_cmd = cmd; -+ for (idx = 0; idx < 6; idx++) { -+ r = &dev->resource[idx]; -+ if (!r->start && r->end) { -+ printk(KERN_ERR "PCI: Device %s not available because " -+ "of resource collisions\n", pci_name(dev)); -+ return -EINVAL; -+ } -+ if (r->flags & IORESOURCE_IO) -+ cmd |= PCI_COMMAND_IO; -+ if (r->flags & IORESOURCE_MEM) -+ cmd |= PCI_COMMAND_MEMORY; -+ } -+ if (cmd != old_cmd) { -+ printk("PCI: Enabling device %s (%04x -> %04x)\n", -+ pci_name(dev), old_cmd, cmd); -+ pci_write_config_word(dev, PCI_COMMAND, cmd); -+#ifdef CONFIG_M54455 -+ mcf5445x_conf_device(dev); -+#endif -+ } -+ -+ return 0; -+} -+ -+/* -+ * pcibios_fixup_bus(struct pci_bus *bus) -+ */ -+void -+pcibios_fixup_bus(struct pci_bus *bus) -+{ -+ struct pci_dev *dev = bus->self; -+ -+ if (!dev) { -+ /* Root bus. */ -+#ifdef CONFIG_M54455 -+ bus->resource[0] = &pci_ioport_resource; -+ bus->resource[1] = &pci_iomem_resource; -+#endif -+ } -+} -+ -+/* -+ * pcibios_init(void) -+ * -+ * Allocate/initialize low level pci bus/devices. -+ */ -+static int __init -+pcibios_init(void) -+{ -+ struct pci_bus *bus; -+ -+ if (!raw_pci_ops) { -+ printk(KERN_WARNING "PCIBIOS: FATAL: NO PCI Hardware found\n"); -+ return 0; -+ } -+ -+ /* allocate and scan the (only) bus */ -+ bus = pci_scan_bus_parented(NULL, 0, &pci_root_ops, NULL); -+ -+ /* setup everything */ -+ if (bus) { -+ /* compute the bridge window sizes */ -+ pci_bus_size_bridges(bus); -+ -+ /* (re)assign device resources */ -+ pci_bus_assign_resources(bus); -+ -+ /* add the bus to the system */ -+ pci_bus_add_devices(bus); -+ -+ /* fixup irqs */ -+ pci_fixup_irqs(pcibios_swizzle, pcibios_map_irq); -+ } -+ -+ return 0; -+} -+ -+/* -+ * pci_init(void) -+ * -+ * Initialize the PCI Hardware. -+ */ -+static int __init -+pci_init(void) -+{ -+#if defined(CONFIG_M54455) -+ init_mcf5445x_pci(); -+#endif -+ if (!raw_pci_ops) -+ printk(KERN_ERR "PCI: FATAL: NO PCI Detected\n"); -+ -+ return 0; -+} -+ -+/* low level hardware (first) */ -+arch_initcall(pci_init); -+ -+/* basic bios init (second) */ -+subsys_initcall(pcibios_init); ---- /dev/null -+++ b/arch/m68k/coldfire/signal.c -@@ -0,0 +1,871 @@ -+/* -+ * linux/arch/m68k/kernel/signal.c -+ * -+ * Copyright (C) 1991, 1992 Linus Torvalds -+ * -+ * This file is subject to the terms and conditions of the GNU General Public -+ * License. See the file COPYING in the main directory of this archive -+ * for more details. -+ */ -+ -+/* -+ * Derived from m68k/kernel/signal.c and the original authors are credited -+ * there. -+ * -+ * Coldfire support by: -+ * Matt Waddel Matt.Waddel@freescale.com -+ * Copyright Freescale Semiconductor, Inc 2007 -+ */ -+ -+#include <linux/sched.h> -+#include <linux/mm.h> -+#include <linux/kernel.h> -+#include <linux/signal.h> -+#include <linux/syscalls.h> -+#include <linux/errno.h> -+#include <linux/wait.h> -+#include <linux/ptrace.h> -+#include <linux/unistd.h> -+#include <linux/stddef.h> -+#include <linux/highuid.h> -+#include <linux/personality.h> -+#include <linux/tty.h> -+#include <linux/binfmts.h> -+ -+#include <asm/setup.h> -+#include <asm/cf_uaccess.h> -+#include <asm/cf_pgtable.h> -+#include <asm/traps.h> -+#include <asm/ucontext.h> -+#include <asm/cacheflush.h> -+ -+#define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) -+ -+asmlinkage int do_signal(sigset_t *oldset, struct pt_regs *regs); -+ -+const int frame_extra_sizes[16] = { -+ [1] = -1, -+ [2] = sizeof(((struct frame *)0)->un.fmt2), -+ [3] = sizeof(((struct frame *)0)->un.fmt3), -+ [4] = 0, -+ [5] = -1, -+ [6] = -1, -+ [7] = sizeof(((struct frame *)0)->un.fmt7), -+ [8] = -1, -+ [9] = sizeof(((struct frame *)0)->un.fmt9), -+ [10] = sizeof(((struct frame *)0)->un.fmta), -+ [11] = sizeof(((struct frame *)0)->un.fmtb), -+ [12] = -1, -+ [13] = -1, -+ [14] = -1, -+ [15] = -1, -+}; -+ -+/* -+ * Atomically swap in the new signal mask, and wait for a signal. -+ */ -+asmlinkage int do_sigsuspend(struct pt_regs *regs) -+{ -+ old_sigset_t mask = regs->d3; -+ sigset_t saveset; -+ -+ mask &= _BLOCKABLE; -+ spin_lock_irq(¤t->sighand->siglock); -+ saveset = current->blocked; -+ siginitset(¤t->blocked, mask); -+ recalc_sigpending(); -+ spin_unlock_irq(¤t->sighand->siglock); -+ -+ regs->d0 = -EINTR; -+ while (1) { -+ current->state = TASK_INTERRUPTIBLE; -+ schedule(); -+ if (do_signal(&saveset, regs)) -+ return -EINTR; -+ } -+} -+ -+asmlinkage int -+do_rt_sigsuspend(struct pt_regs *regs) -+{ -+ sigset_t __user *unewset = (sigset_t __user *)regs->d1; -+ size_t sigsetsize = (size_t)regs->d2; -+ sigset_t saveset, newset; -+ -+ /* XXX: Don't preclude handling different sized sigset_t's. */ -+ if (sigsetsize != sizeof(sigset_t)) -+ return -EINVAL; -+ -+ if (copy_from_user(&newset, unewset, sizeof(newset))) -+ return -EFAULT; -+ sigdelsetmask(&newset, ~_BLOCKABLE); -+ -+ spin_lock_irq(¤t->sighand->siglock); -+ saveset = current->blocked; -+ current->blocked = newset; -+ recalc_sigpending(); -+ spin_unlock_irq(¤t->sighand->siglock); -+ -+ regs->d0 = -EINTR; -+ while (1) { -+ current->state = TASK_INTERRUPTIBLE; -+ schedule(); -+ if (do_signal(&saveset, regs)) -+ return -EINTR; -+ } -+} -+ -+asmlinkage int -+sys_sigaction(int sig, const struct old_sigaction __user *act, -+ struct old_sigaction __user *oact) -+{ -+ struct k_sigaction new_ka, old_ka; -+ int ret; -+ -+ if (act) { -+ old_sigset_t mask; -+ if (!access_ok(VERIFY_READ, act, sizeof(*act)) || -+ __get_user(new_ka.sa.sa_handler, &act->sa_handler) || -+ __get_user(new_ka.sa.sa_restorer, &act->sa_restorer)) -+ return -EFAULT; -+ __get_user(new_ka.sa.sa_flags, &act->sa_flags); -+ __get_user(mask, &act->sa_mask); -+ siginitset(&new_ka.sa.sa_mask, mask); -+ } -+ -+ ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL); -+ -+ if (!ret && oact) { -+ if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) || -+ __put_user(old_ka.sa.sa_handler, &oact->sa_handler) || -+ __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer)) -+ return -EFAULT; -+ __put_user(old_ka.sa.sa_flags, &oact->sa_flags); -+ __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask); -+ } -+ -+ return ret; -+} -+ -+asmlinkage int -+sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss) -+{ -+ return do_sigaltstack(uss, uoss, rdusp()); -+} -+ -+ -+/* -+ * Do a signal return; undo the signal stack. -+ * -+ * Keep the return code on the stack quadword aligned! -+ * That makes the cache flush below easier. -+ */ -+ -+struct sigframe -+{ -+ char __user *pretcode; -+ int sig; -+ int code; -+ struct sigcontext __user *psc; -+ char retcode[16]; -+ unsigned long extramask[_NSIG_WORDS-1]; -+ struct sigcontext sc; -+}; -+ -+struct rt_sigframe -+{ -+ char __user *pretcode; -+ int sig; -+ struct siginfo __user *pinfo; -+ void __user *puc; -+ char retcode[16]; -+ struct siginfo info; -+ struct ucontext uc; -+}; -+ -+#define FPCONTEXT_SIZE 216 -+#define uc_fpstate uc_filler[0] -+#define uc_formatvec uc_filler[FPCONTEXT_SIZE/4] -+#define uc_extra uc_filler[FPCONTEXT_SIZE/4+1] -+ -+#ifdef CONFIG_FPU -+static unsigned char fpu_version; /* version num of fpu, set by setup_frame */ -+ -+static inline int restore_fpu_state(struct sigcontext *sc) -+{ -+ int err = 1; -+ -+ if (FPU_IS_EMU) { -+ /* restore registers */ -+ memcpy(current->thread.fpcntl, sc->sc_fpcntl, 12); -+ memcpy(current->thread.fp, sc->sc_fpregs, 24); -+ return 0; -+ } -+ -+ if (CPU_IS_060 ? sc->sc_fpstate[2] : sc->sc_fpstate[0]) { -+ /* Verify the frame format. */ -+ if (!CPU_IS_060 && (sc->sc_fpstate[0] != fpu_version)) -+ goto out; -+ if (CPU_IS_020_OR_030) { -+ if (m68k_fputype & FPU_68881 && -+ !(sc->sc_fpstate[1] == 0x18 || sc->sc_fpstate[1] == 0xb4)) -+ goto out; -+ if (m68k_fputype & FPU_68882 && -+ !(sc->sc_fpstate[1] == 0x38 || sc->sc_fpstate[1] == 0xd4)) -+ goto out; -+ } else if (CPU_IS_040) { -+ if (!(sc->sc_fpstate[1] == 0x00 || -+ sc->sc_fpstate[1] == 0x28 || -+ sc->sc_fpstate[1] == 0x60)) -+ goto out; -+ } else if (CPU_IS_060) { -+ if (!(sc->sc_fpstate[3] == 0x00 || -+ sc->sc_fpstate[3] == 0x60 || -+ sc->sc_fpstate[3] == 0xe0)) -+ goto out; -+ } else -+ goto out; -+ -+ } -+ err = 0; -+ -+out: -+ return err; -+} -+ -+static inline int rt_restore_fpu_state(struct ucontext __user *uc) -+{ -+ unsigned char fpstate[FPCONTEXT_SIZE]; -+ int context_size = CPU_IS_060 ? 8 : 0; -+ fpregset_t fpregs; -+ int err = 1; -+ -+ if (FPU_IS_EMU) { -+ /* restore fpu control register */ -+ if (__copy_from_user(current->thread.fpcntl, -+ uc->uc_mcontext.fpregs.f_fpcntl, 12)) -+ goto out; -+ /* restore all other fpu register */ -+ if (__copy_from_user(current->thread.fp, -+ uc->uc_mcontext.fpregs.f_fpregs, 96)) -+ goto out; -+ return 0; -+ } -+ -+ if (__get_user(*(long *)fpstate, (long __user *)&uc->uc_fpstate)) -+ goto out; -+ if (CPU_IS_060 ? fpstate[2] : fpstate[0]) { -+ if (!CPU_IS_060) -+ context_size = fpstate[1]; -+ /* Verify the frame format. */ -+ if (!CPU_IS_060 && (fpstate[0] != fpu_version)) -+ goto out; -+ if (CPU_IS_020_OR_030) { -+ if (m68k_fputype & FPU_68881 && -+ !(context_size == 0x18 || context_size == 0xb4)) -+ goto out; -+ if (m68k_fputype & FPU_68882 && -+ !(context_size == 0x38 || context_size == 0xd4)) -+ goto out; -+ } else if (CPU_IS_040) { -+ if (!(context_size == 0x00 || -+ context_size == 0x28 || -+ context_size == 0x60)) -+ goto out; -+ } else if (CPU_IS_060) { -+ if (!(fpstate[3] == 0x00 || -+ fpstate[3] == 0x60 || -+ fpstate[3] == 0xe0)) -+ goto out; -+ } else -+ goto out; -+ if (__copy_from_user(&fpregs, &uc->uc_mcontext.fpregs, -+ sizeof(fpregs))) -+ goto out; -+ } -+ if (context_size && -+ __copy_from_user(fpstate + 4, (long __user *)&uc->uc_fpstate + 1, -+ context_size)) -+ goto out; -+ err = 0; -+ -+out: -+ return err; -+} -+#endif -+ -+static inline int -+restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *usc, -+ void __user *fp, int *pd0) -+{ -+ int fsize, formatvec; -+ struct sigcontext context; -+ int err = 0; -+ -+ /* get previous context */ -+ if (copy_from_user(&context, usc, sizeof(context))) -+ goto badframe; -+ -+ /* restore passed registers */ -+ regs->d1 = context.sc_d1; -+ regs->a0 = context.sc_a0; -+ regs->a1 = context.sc_a1; -+ regs->sr = (regs->sr & 0xff00) | (context.sc_sr & 0xff); -+ regs->pc = context.sc_pc; -+ regs->orig_d0 = -1; /* disable syscall checks */ -+ wrusp(context.sc_usp); -+ formatvec = context.sc_formatvec; -+ regs->format = formatvec >> 12; -+ regs->vector = formatvec & 0xfff; -+ -+#ifdef CONFIG_FPU -+ err = restore_fpu_state(&context); -+#endif -+ -+ fsize = frame_extra_sizes[regs->format]; -+ if (fsize < 0) { -+ /* -+ * user process trying to return with weird frame format -+ */ -+#ifdef DEBUG -+ printk(KERN_DEBUG "user process returning with weird \ -+ frame format\n"); -+#endif -+ goto badframe; -+ } -+ -+ /* OK. Make room on the supervisor stack for the extra junk, -+ * if necessary. -+ */ -+ -+ { -+ struct switch_stack *sw = (struct switch_stack *)regs - 1; -+ regs->d0 = context.sc_d0; -+#define frame_offset (sizeof(struct pt_regs)+sizeof(struct switch_stack)) -+ __asm__ __volatile__ -+ (" movel %0,%/sp\n\t" -+ " bra ret_from_signal\n" -+ "4:\n" -+ ".section __ex_table,\"a\"\n" -+ " .align 4\n" -+ " .long 2b,4b\n" -+ ".previous" -+ : /* no outputs, it doesn't ever return */ -+ : "a" (sw), "d" (fsize), "d" (frame_offset/4-1), -+ "n" (frame_offset), "a" (fp) -+ : "a0"); -+#undef frame_offset -+ /* -+ * If we ever get here an exception occurred while -+ * building the above stack-frame. -+ */ -+ goto badframe; -+ } -+ -+ *pd0 = context.sc_d0; -+ return err; -+ -+badframe: -+ return 1; -+} -+ -+static inline int -+rt_restore_ucontext(struct pt_regs *regs, struct switch_stack *sw, -+ struct ucontext __user *uc, int *pd0) -+{ -+ int fsize, temp; -+ greg_t __user *gregs = uc->uc_mcontext.gregs; -+ unsigned long usp; -+ int err; -+ -+ err = __get_user(temp, &uc->uc_mcontext.version); -+ if (temp != MCONTEXT_VERSION) -+ goto badframe; -+ /* restore passed registers */ -+ err |= __get_user(regs->d0, &gregs[0]); -+ err |= __get_user(regs->d1, &gregs[1]); -+ err |= __get_user(regs->d2, &gregs[2]); -+ err |= __get_user(regs->d3, &gregs[3]); -+ err |= __get_user(regs->d4, &gregs[4]); -+ err |= __get_user(regs->d5, &gregs[5]); -+ err |= __get_user(sw->d6, &gregs[6]); -+ err |= __get_user(sw->d7, &gregs[7]); -+ err |= __get_user(regs->a0, &gregs[8]); -+ err |= __get_user(regs->a1, &gregs[9]); -+ err |= __get_user(regs->a2, &gregs[10]); -+ err |= __get_user(sw->a3, &gregs[11]); -+ err |= __get_user(sw->a4, &gregs[12]); -+ err |= __get_user(sw->a5, &gregs[13]); -+ err |= __get_user(sw->a6, &gregs[14]); -+ err |= __get_user(usp, &gregs[15]); -+ wrusp(usp); -+ err |= __get_user(regs->pc, &gregs[16]); -+ err |= __get_user(temp, &gregs[17]); -+ regs->sr = (regs->sr & 0xff00) | (temp & 0xff); -+ regs->orig_d0 = -1; /* disable syscall checks */ -+ err |= __get_user(temp, &uc->uc_formatvec); -+ regs->format = temp >> 12; -+ regs->vector = temp & 0xfff; -+ -+#ifdef CONFIG_FPU -+ err |= rt_restore_fpu_state(uc); -+#endif -+ -+ if (do_sigaltstack(&uc->uc_stack, NULL, usp) == -EFAULT) -+ goto badframe; -+ -+ fsize = frame_extra_sizes[regs->format]; -+ if (fsize < 0) { -+ /* -+ * user process trying to return with weird frame format -+ */ -+#ifdef DEBUG -+ printk(KERN_DEBUG "user process returning with weird \ -+ frame format\n"); -+#endif -+ goto badframe; -+ } -+ -+ /* OK. Make room on the supervisor stack for the extra junk, -+ * if necessary. -+ */ -+ -+ { -+#define frame_offset (sizeof(struct pt_regs)+sizeof(struct switch_stack)) -+ __asm__ __volatile__ -+ (" movel %0,%/sp\n\t" -+ " bra ret_from_signal\n" -+ "4:\n" -+ ".section __ex_table,\"a\"\n" -+ " .align 4\n" -+ " .long 2b,4b\n" -+ ".previous" -+ : /* no outputs, it doesn't ever return */ -+ : "a" (sw), "d" (fsize), "d" (frame_offset/4-1), -+ "n" (frame_offset), "a" (&uc->uc_extra) -+ : "a0"); -+#undef frame_offset -+ /* -+ * If we ever get here an exception occurred while -+ * building the above stack-frame. -+ */ -+ goto badframe; -+ } -+ -+ *pd0 = regs->d0; -+ return err; -+ -+badframe: -+ return 1; -+} -+ -+asmlinkage int do_sigreturn(unsigned long __unused) -+{ -+ struct switch_stack *sw = (struct switch_stack *) &__unused; -+ struct pt_regs *regs = (struct pt_regs *) (sw + 1); -+ unsigned long usp = rdusp(); -+ struct sigframe __user *frame = (struct sigframe __user *)(usp - 4); -+ sigset_t set; -+ int d0; -+ -+ if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) -+ goto badframe; -+ if (__get_user(set.sig[0], &frame->sc.sc_mask) || -+ (_NSIG_WORDS > 1 && -+ __copy_from_user(&set.sig[1], &frame->extramask, -+ sizeof(frame->extramask)))) -+ goto badframe; -+ -+ sigdelsetmask(&set, ~_BLOCKABLE); -+ spin_lock_irq(¤t->sighand->siglock); -+ current->blocked = set; -+ recalc_sigpending(); -+ spin_unlock_irq(¤t->sighand->siglock); -+ -+ if (restore_sigcontext(regs, &frame->sc, frame + 1, &d0)) -+ goto badframe; -+ return d0; -+ -+badframe: -+ force_sig(SIGSEGV, current); -+ return 0; -+} -+ -+asmlinkage int do_rt_sigreturn(unsigned long __unused) -+{ -+ struct switch_stack *sw = (struct switch_stack *) &__unused; -+ struct pt_regs *regs = (struct pt_regs *) (sw + 1); -+ unsigned long usp = rdusp(); -+ struct rt_sigframe __user *frame = -+ (struct rt_sigframe __user *)(usp - 4); -+ sigset_t set; -+ int d0; -+ -+ if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) -+ goto badframe; -+ if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set))) -+ goto badframe; -+ -+ sigdelsetmask(&set, ~_BLOCKABLE); -+ spin_lock_irq(¤t->sighand->siglock); -+ current->blocked = set; -+ recalc_sigpending(); -+ spin_unlock_irq(¤t->sighand->siglock); -+ -+ if (rt_restore_ucontext(regs, sw, &frame->uc, &d0)) -+ goto badframe; -+ return d0; -+ -+badframe: -+ force_sig(SIGSEGV, current); -+ return 0; -+} -+ -+#ifdef CONFIG_FPU -+/* -+ * Set up a signal frame. -+ */ -+ -+static inline void save_fpu_state(struct sigcontext *sc, struct pt_regs *regs) -+{ -+ if (FPU_IS_EMU) { -+ /* save registers */ -+ memcpy(sc->sc_fpcntl, current->thread.fpcntl, 12); -+ memcpy(sc->sc_fpregs, current->thread.fp, 24); -+ return; -+ } -+} -+ -+static inline int rt_save_fpu_state(struct ucontext __user *uc, -+ struct pt_regs *regs) -+{ -+ int err = 0; -+ -+ if (FPU_IS_EMU) { -+ /* save fpu control register */ -+ err |= copy_to_user(uc->uc_mcontext.fpregs.f_fpcntl, -+ current->thread.fpcntl, 12); -+ /* save all other fpu register */ -+ err |= copy_to_user(uc->uc_mcontext.fpregs.f_fpregs, -+ current->thread.fp, 96); -+ return err; -+ } -+ -+ return err; -+} -+#endif -+ -+static void setup_sigcontext(struct sigcontext *sc, struct pt_regs *regs, -+ unsigned long mask) -+{ -+ sc->sc_mask = mask; -+ sc->sc_usp = rdusp(); -+ sc->sc_d0 = regs->d0; -+ sc->sc_d1 = regs->d1; -+ sc->sc_a0 = regs->a0; -+ sc->sc_a1 = regs->a1; -+ sc->sc_sr = regs->sr; -+ sc->sc_pc = regs->pc; -+ sc->sc_formatvec = regs->format << 12 | regs->vector; -+#ifdef CONFIG_FPU -+ save_fpu_state(sc, regs); -+#endif -+} -+ -+static inline int rt_setup_ucontext(struct ucontext __user *uc, -+ struct pt_regs *regs) -+{ -+ struct switch_stack *sw = (struct switch_stack *)regs - 1; -+ greg_t __user *gregs = uc->uc_mcontext.gregs; -+ int err = 0; -+ -+ err |= __put_user(MCONTEXT_VERSION, &uc->uc_mcontext.version); -+ err |= __put_user(regs->d0, &gregs[0]); -+ err |= __put_user(regs->d1, &gregs[1]); -+ err |= __put_user(regs->d2, &gregs[2]); -+ err |= __put_user(regs->d3, &gregs[3]); -+ err |= __put_user(regs->d4, &gregs[4]); -+ err |= __put_user(regs->d5, &gregs[5]); -+ err |= __put_user(sw->d6, &gregs[6]); -+ err |= __put_user(sw->d7, &gregs[7]); -+ err |= __put_user(regs->a0, &gregs[8]); -+ err |= __put_user(regs->a1, &gregs[9]); -+ err |= __put_user(regs->a2, &gregs[10]); -+ err |= __put_user(sw->a3, &gregs[11]); -+ err |= __put_user(sw->a4, &gregs[12]); -+ err |= __put_user(sw->a5, &gregs[13]); -+ err |= __put_user(sw->a6, &gregs[14]); -+ err |= __put_user(rdusp(), &gregs[15]); -+ err |= __put_user(regs->pc, &gregs[16]); -+ err |= __put_user(regs->sr, &gregs[17]); -+ err |= __put_user((regs->format << 12) | regs->vector, -+ &uc->uc_formatvec); -+#ifdef CONFIG_FPU -+ err |= rt_save_fpu_state(uc, regs); -+#endif -+ return err; -+} -+ -+static inline void push_cache(unsigned long vaddr) -+{ -+#if 0 -+// JKM -- need to add into the old cpushl cache stuff -+ cf_cache_push(__pa(vaddr), 8); -+#endif -+} -+ -+static inline void __user * -+get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size) -+{ -+ unsigned long usp; -+ -+ /* Default to using normal stack. */ -+ usp = rdusp(); -+ -+ /* This is the X/Open sanctioned signal stack switching. */ -+ if (ka->sa.sa_flags & SA_ONSTACK) { -+ if (!sas_ss_flags(usp)) -+ usp = current->sas_ss_sp + current->sas_ss_size; -+ } -+ return (void __user *)((usp - frame_size) & -8UL); -+} -+ -+static void setup_frame(int sig, struct k_sigaction *ka, -+ sigset_t *set, struct pt_regs *regs) -+{ -+ struct sigframe __user *frame; -+ int fsize = frame_extra_sizes[regs->format]; -+ struct sigcontext context; -+ int err = 0; -+ -+ if (fsize < 0) { -+#ifdef DEBUG -+ printk(KERN_DEBUG "setup_frame: Unknown frame format %#x\n", -+ regs->format); -+#endif -+ goto give_sigsegv; -+ } -+ -+ frame = get_sigframe(ka, regs, sizeof(*frame)); -+ -+ err |= __put_user((current_thread_info()->exec_domain -+ && current_thread_info()->exec_domain->signal_invmap -+ && sig < 32 -+ ? current_thread_info()->exec_domain->signal_invmap[sig] -+ : sig), -+ &frame->sig); -+ -+ err |= __put_user(regs->vector, &frame->code); -+ err |= __put_user(&frame->sc, &frame->psc); -+ -+ if (_NSIG_WORDS > 1) -+ err |= copy_to_user(frame->extramask, &set->sig[1], -+ sizeof(frame->extramask)); -+ -+ setup_sigcontext(&context, regs, set->sig[0]); -+ err |= copy_to_user(&frame->sc, &context, sizeof(context)); -+ -+ /* Set up to return from userspace. */ -+ err |= __put_user(frame->retcode, &frame->pretcode); -+ /* moveq #,d0; trap #0 */ -+ err |= __put_user(0x70004e40 + (__NR_sigreturn << 16), -+ (long __user *)(frame->retcode)); -+ -+ if (err) -+ goto give_sigsegv; -+ -+ push_cache((unsigned long) &frame->retcode); -+ -+ /* Set up registers for signal handler */ -+ wrusp((unsigned long) frame); -+ regs->pc = (unsigned long) ka->sa.sa_handler; -+ -+adjust_stack: -+ /* Prepare to skip over the extra stuff in the exception frame. */ -+ if (regs->stkadj) { -+ struct pt_regs *tregs = -+ (struct pt_regs *)((ulong)regs + regs->stkadj); -+#ifdef DEBUG -+ printk(KERN_DEBUG "Performing stackadjust=%04x\n", -+ regs->stkadj); -+#endif -+ /* This must be copied with decreasing addresses to -+ handle overlaps. */ -+ tregs->vector = 0; -+ tregs->format = 0; -+ tregs->pc = regs->pc; -+ tregs->sr = regs->sr; -+ } -+ return; -+ -+give_sigsegv: -+ force_sigsegv(sig, current); -+ goto adjust_stack; -+} -+ -+static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, -+ sigset_t *set, struct pt_regs *regs) -+{ -+ struct rt_sigframe __user *frame; -+ int fsize = frame_extra_sizes[regs->format]; -+ int err = 0; -+ -+ if (fsize < 0) { -+#ifdef DEBUG -+ printk(KERN_DEBUG "setup_frame: Unknown frame format %#x\n", -+ regs->format); -+#endif -+ goto give_sigsegv; -+ } -+ -+ frame = get_sigframe(ka, regs, sizeof(*frame)); -+ -+ if (fsize) { -+ err |= copy_to_user(&frame->uc.uc_extra, regs + 1, fsize); -+ regs->stkadj = fsize; -+ } -+ -+ err |= __put_user((current_thread_info()->exec_domain -+ && current_thread_info()->exec_domain->signal_invmap -+ && sig < 32 -+ ? current_thread_info()->exec_domain->signal_invmap[sig] -+ : sig), -+ &frame->sig); -+ err |= __put_user(&frame->info, &frame->pinfo); -+ err |= __put_user(&frame->uc, &frame->puc); -+ err |= copy_siginfo_to_user(&frame->info, info); -+ -+ /* Create the ucontext. */ -+ err |= __put_user(0, &frame->uc.uc_flags); -+ err |= __put_user(NULL, &frame->uc.uc_link); -+ err |= __put_user((void __user *)current->sas_ss_sp, -+ &frame->uc.uc_stack.ss_sp); -+ err |= __put_user(sas_ss_flags(rdusp()), -+ &frame->uc.uc_stack.ss_flags); -+ err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size); -+ err |= rt_setup_ucontext(&frame->uc, regs); -+ err |= copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); -+ -+ /* Set up to return from userspace. */ -+ err |= __put_user(frame->retcode, &frame->pretcode); -+ -+ /* moveq #,d0; andi.l #,D0; trap #0 */ -+ err |= __put_user(0x70AD0280, (long *)(frame->retcode + 0)); -+ err |= __put_user(0x000000ff, (long *)(frame->retcode + 4)); -+ err |= __put_user(0x4e400000, (long *)(frame->retcode + 8)); -+ -+ if (err) -+ goto give_sigsegv; -+ -+ push_cache((unsigned long) &frame->retcode); -+ -+ /* Set up registers for signal handler */ -+ wrusp((unsigned long) frame); -+ regs->pc = (unsigned long) ka->sa.sa_handler; -+ -+adjust_stack: -+ /* Prepare to skip over the extra stuff in the exception frame. */ -+ if (regs->stkadj) { -+ struct pt_regs *tregs = -+ (struct pt_regs *)((ulong)regs + regs->stkadj); -+#ifdef DEBUG -+ printk(KERN_DEBUG "Performing stackadjust=%04x\n", -+ regs->stkadj); -+#endif -+ /* This must be copied with decreasing addresses to -+ handle overlaps. */ -+ tregs->vector = 0; -+ tregs->format = 0; -+ tregs->pc = regs->pc; -+ tregs->sr = regs->sr; -+ } -+ return; -+ -+give_sigsegv: -+ force_sigsegv(sig, current); -+ goto adjust_stack; -+} -+ -+static inline void -+handle_restart(struct pt_regs *regs, struct k_sigaction *ka, int has_handler) -+{ -+ switch (regs->d0) { -+ case -ERESTARTNOHAND: -+ if (!has_handler) -+ goto do_restart; -+ regs->d0 = -EINTR; -+ break; -+ -+ case -ERESTARTSYS: -+ if (has_handler && !(ka->sa.sa_flags & SA_RESTART)) { -+ regs->d0 = -EINTR; -+ break; -+ } -+ /* fallthrough */ -+ case -ERESTARTNOINTR: -+do_restart: -+ regs->d0 = regs->orig_d0; -+ regs->pc -= 2; -+ break; -+ } -+} -+ -+/* -+ * OK, we're invoking a handler -+ */ -+static void -+handle_signal(int sig, struct k_sigaction *ka, siginfo_t *info, -+ sigset_t *oldset, struct pt_regs *regs) -+{ -+ /* are we from a system call? */ -+ if (regs->orig_d0 >= 0) -+ /* If so, check system call restarting.. */ -+ handle_restart(regs, ka, 1); -+ -+ /* set up the stack frame */ -+ if (ka->sa.sa_flags & SA_SIGINFO) -+ setup_rt_frame(sig, ka, info, oldset, regs); -+ else -+ setup_frame(sig, ka, oldset, regs); -+ -+ if (ka->sa.sa_flags & SA_ONESHOT) -+ ka->sa.sa_handler = SIG_DFL; -+ -+ spin_lock_irq(¤t->sighand->siglock); -+ sigorsets(¤t->blocked, ¤t->blocked, &ka->sa.sa_mask); -+ if (!(ka->sa.sa_flags & SA_NODEFER)) -+ sigaddset(¤t->blocked, sig); -+ recalc_sigpending(); -+ spin_unlock_irq(¤t->sighand->siglock); -+} -+ -+/* -+ * Note that 'init' is a special process: it doesn't get signals it doesn't -+ * want to handle. Thus you cannot kill init even with a SIGKILL even by -+ * mistake. -+ */ -+asmlinkage int do_signal(sigset_t *oldset, struct pt_regs *regs) -+{ -+ siginfo_t info; -+ struct k_sigaction ka; -+ int signr; -+ -+ current->thread.esp0 = (unsigned long) regs; -+ -+ if (!oldset) -+ oldset = ¤t->blocked; -+ -+ signr = get_signal_to_deliver(&info, &ka, regs, NULL); -+ if (signr > 0) { -+ /* Whee! Actually deliver the signal. */ -+ handle_signal(signr, &ka, &info, oldset, regs); -+ return 1; -+ } -+ -+ /* Did we come from a system call? */ -+ if (regs->orig_d0 >= 0) -+ /* Restart the system call - no handlers present */ -+ handle_restart(regs, NULL, 0); -+ -+ return 0; -+} ---- /dev/null -+++ b/arch/m68k/coldfire/traps.c -@@ -0,0 +1,455 @@ -+/* -+ * linux/arch/m68knommu/kernel/traps.c -+ * -+ * Copyright (C) 1993, 1994 by Hamish Macdonald -+ * -+ * 68040 fixes by Michael Rausch -+ * 68040 fixes by Martin Apel -+ * 68060 fixes by Roman Hodek -+ * 68060 fixes by Jesper Skov -+ * Coldfire fixes by Kurt Mahan -+ * -+ * This file is subject to the terms and conditions of the GNU General Public -+ * License. See the file COPYING in the main directory of this archive -+ * for more details. -+ */ -+ -+/* -+ * Sets up all exception vectors -+ */ -+#include <linux/sched.h> -+#include <linux/signal.h> -+#include <linux/kernel.h> -+#include <linux/mm.h> -+#include <linux/module.h> -+#include <linux/types.h> -+#include <linux/a.out.h> -+#include <linux/user.h> -+#include <linux/string.h> -+#include <linux/linkage.h> -+#include <linux/init.h> -+#include <linux/ptrace.h> -+#include <linux/kallsyms.h> -+ -+#include <asm/setup.h> -+#include <asm/fpu.h> -+#include <asm/system.h> -+#include <asm/uaccess.h> -+#include <asm/traps.h> -+#include <asm/pgtable.h> -+#include <asm/machdep.h> -+#include <asm/siginfo.h> -+ -+static char const * const vec_names[] = { -+ "RESET SP", "RESET PC", "BUS ERROR", "ADDRESS ERROR", -+ "ILLEGAL INSTRUCTION", "ZERO DIVIDE", "CHK", "TRAPcc", -+ "PRIVILEGE VIOLATION", "TRACE", "LINE 1010", "LINE 1111", -+ "UNASSIGNED RESERVED 12", "COPROCESSOR PROTOCOL VIOLATION", -+ "FORMAT ERROR", "UNINITIALIZED INTERRUPT", -+ "UNASSIGNED RESERVED 16", "UNASSIGNED RESERVED 17", -+ "UNASSIGNED RESERVED 18", "UNASSIGNED RESERVED 19", -+ "UNASSIGNED RESERVED 20", "UNASSIGNED RESERVED 21", -+ "UNASSIGNED RESERVED 22", "UNASSIGNED RESERVED 23", -+ "SPURIOUS INTERRUPT", "LEVEL 1 INT", "LEVEL 2 INT", "LEVEL 3 INT", -+ "LEVEL 4 INT", "LEVEL 5 INT", "LEVEL 6 INT", "LEVEL 7 INT", -+ "SYSCALL", "TRAP #1", "TRAP #2", "TRAP #3", -+ "TRAP #4", "TRAP #5", "TRAP #6", "TRAP #7", -+ "TRAP #8", "TRAP #9", "TRAP #10", "TRAP #11", -+ "TRAP #12", "TRAP #13", "TRAP #14", "TRAP #15", -+ "FPCP BSUN", "FPCP INEXACT", "FPCP DIV BY 0", "FPCP UNDERFLOW", -+ "FPCP OPERAND ERROR", "FPCP OVERFLOW", "FPCP SNAN", -+ "FPCP UNSUPPORTED OPERATION", -+ "MMU CONFIGURATION ERROR" -+}; -+ -+asmlinkage int do_page_fault(struct pt_regs *regs, unsigned long address, -+ unsigned long error_code); -+asmlinkage void trap_c(struct frame *fp); -+extern void __init coldfire_trap_init(void); -+ -+void __init trap_init(void) -+{ -+ coldfire_trap_init(); -+} -+ -+/* The following table converts the FS encoding of a ColdFire -+ exception stack frame into the error_code value needed by -+ do_fault. */ -+ -+static const unsigned char fs_err_code[] = { -+ 0, /* 0000 */ -+ 0, /* 0001 */ -+ 0, /* 0010 */ -+ 0, /* 0011 */ -+ 1, /* 0100 */ -+ 0, /* 0101 */ -+ 0, /* 0110 */ -+ 0, /* 0111 */ -+ 2, /* 1000 */ -+ 3, /* 1001 */ -+ 2, /* 1010 */ -+ 0, /* 1011 */ -+ 1, /* 1100 */ -+ 1, /* 1101 */ -+ 0, /* 1110 */ -+ 0 /* 1111 */ -+}; -+ -+#ifdef DEBUG -+static const char *fs_err_msg[16] = { -+ "Normal", -+ "Reserved", -+ "Interrupt during debug service routine", -+ "Reserved", -+ "X Protection", -+ "TLB X miss (opword)", -+ "TLB X miss (ext. word)", -+ "IFP in emulator mode", -+ "W Protection", -+ "Write error", -+ "TLB W miss", -+ "Reserved", -+ "R Protection", -+ "R/RMW Protection", -+ "TLB R miss", -+ "OEP in emulator mode", -+}; -+#endif -+ -+static inline void access_errorCF(struct frame *fp) -+{ -+ unsigned long int mmusr, complainingAddress; -+ unsigned int err_code, fs; -+ int need_page_fault; -+ -+ mmusr = fp->ptregs.mmusr; -+ complainingAddress = fp->ptregs.mmuar; -+#ifdef DEBUG -+ printk(KERN_DEBUG "pc %#lx, mmusr %#lx, complainingAddress %#lx\n", \ -+ fp->ptregs.pc, mmusr, complainingAddress); -+#endif -+ -+ /* -+ * error_code: -+ * bit 0 == 0 means no page found, 1 means protection fault -+ * bit 1 == 0 means read, 1 means write -+ */ -+ -+ fs = (fp->ptregs.fs2 << 2) | fp->ptregs.fs1; -+ switch (fs) { -+ case 5: /* 0101 TLB opword X miss */ -+ need_page_fault = cf_tlb_miss(&fp->ptregs, 0, 0, 0); -+ complainingAddress = fp->ptregs.pc; -+ break; -+ case 6: /* 0110 TLB extension word X miss */ -+ need_page_fault = cf_tlb_miss(&fp->ptregs, 0, 0, 1); -+ complainingAddress = fp->ptregs.pc + sizeof(long); -+ break; -+ case 10: /* 1010 TLB W miss */ -+ need_page_fault = cf_tlb_miss(&fp->ptregs, 1, 1, 0); -+ break; -+ case 14: /* 1110 TLB R miss */ -+ need_page_fault = cf_tlb_miss(&fp->ptregs, 0, 1, 0); -+ break; -+ default: -+ /* 0000 Normal */ -+ /* 0001 Reserved */ -+ /* 0010 Interrupt during debug service routine */ -+ /* 0011 Reserved */ -+ /* 0100 X Protection */ -+ /* 0111 IFP in emulator mode */ -+ /* 1000 W Protection*/ -+ /* 1001 Write error*/ -+ /* 1011 Reserved*/ -+ /* 1100 R Protection*/ -+ /* 1101 R Protection*/ -+ /* 1111 OEP in emulator mode*/ -+ need_page_fault = 1; -+ break; -+ } -+ -+ if (need_page_fault) { -+ err_code = fs_err_code[fs]; -+ if ((fs == 13) && (mmusr & MMUSR_WF)) /* rd-mod-wr access */ -+ err_code |= 2; /* bit1 - write, bit0 - protection */ -+ do_page_fault(&fp->ptregs, complainingAddress, err_code); -+ } -+} -+ -+void die_if_kernel(char *str, struct pt_regs *fp, int nr) -+{ -+ if (!(fp->sr & PS_S)) -+ return; -+ -+ console_verbose(); -+ printk(KERN_EMERG "%s: %08x\n", str, nr); -+ printk(KERN_EMERG "PC: [<%08lx>]", fp->pc); -+ print_symbol(" %s", fp->pc); -+ printk(KERN_EMERG "\nSR: %04x SP: %p a2: %08lx\n", -+ fp->sr, fp, fp->a2); -+ printk(KERN_EMERG "d0: %08lx d1: %08lx d2: %08lx d3: %08lx\n", -+ fp->d0, fp->d1, fp->d2, fp->d3); -+ printk(KERN_EMERG "d4: %08lx d5: %08lx a0: %08lx a1: %08lx\n", -+ fp->d4, fp->d5, fp->a0, fp->a1); -+ -+ printk(KERN_EMERG "Process %s (pid: %d, stackpage=%08lx)\n", -+ current->comm, current->pid, PAGE_SIZE+(unsigned long)current); -+ show_stack(NULL, (unsigned long *)fp); -+ do_exit(SIGSEGV); -+} -+ -+asmlinkage void buserr_c(struct frame *fp) -+{ -+ unsigned int fs; -+ -+ /* Only set esp0 if coming from user mode */ -+ if (user_mode(&fp->ptregs)) -+ current->thread.esp0 = (unsigned long) fp; -+ -+ fs = (fp->ptregs.fs2 << 2) | fp->ptregs.fs1; -+#if defined(DEBUG) -+ printk(KERN_DEBUG "*** Bus Error *** (%x)%s\n", fs, -+ fs_err_msg[fs & 0xf]); -+#endif -+ switch (fs) { -+ case 0x5: -+ case 0x6: -+ case 0x7: -+ case 0x9: -+ case 0xa: -+ case 0xd: -+ case 0xe: -+ case 0xf: -+ access_errorCF(fp); -+ break; -+ default: -+ die_if_kernel("bad frame format", &fp->ptregs, 0); -+#if defined(DEBUG) -+ printk(KERN_DEBUG "Unknown SIGSEGV - 4\n"); -+#endif -+ force_sig(SIGSEGV, current); -+ } -+} -+ -+ -+int kstack_depth_to_print = 48; -+ -+void show_stack(struct task_struct *task, unsigned long *stack) -+{ -+ unsigned long *endstack, addr, symaddr; -+ extern char _start, _etext; -+ int i; -+ -+ if (!stack) { -+ if (task) -+ stack = (unsigned long *)task->thread.ksp; -+ else -+ stack = (unsigned long *)&stack; -+ } -+ -+ addr = (unsigned long) stack; -+ endstack = (unsigned long *) PAGE_ALIGN(addr); -+ -+ printk(KERN_EMERG "Stack from %08lx:", (unsigned long)stack); -+ for (i = 0; i < kstack_depth_to_print; i++) { -+ if (stack + 1 > endstack) -+ break; -+ if (i % 8 == 0) -+ printk("\n" KERN_EMERG " "); -+ symaddr = *stack; -+ printk(KERN_EMERG " %08lx", *stack++); -+ if ((symaddr >= 0xc0000000) && (symaddr < 0xc1000000)) -+ print_symbol("(%s)", symaddr); -+ } -+ printk("\n"); -+ -+ printk(KERN_EMERG "Call Trace:"); -+ i = 0; -+ while (stack + 1 <= endstack) { -+ addr = *stack++; -+ /* -+ * If the address is either in the text segment of the -+ * kernel, or in the region which contains vmalloc'ed -+ * memory, it *may* be the address of a calling -+ * routine; if so, print it so that someone tracing -+ * down the cause of the crash will be able to figure -+ * out the call path that was taken. -+ */ -+ if (((addr >= (unsigned long) &_start) && -+ (addr <= (unsigned long) &_etext))) { -+ if (i % 4 == 0) -+ printk("\n" KERN_EMERG " "); -+ printk(KERN_EMERG " [<%08lx>]", addr); -+ i++; -+ } -+ } -+ printk("\n"); -+} -+ -+void bad_super_trap(struct frame *fp) -+{ -+ console_verbose(); -+ if (fp->ptregs.vector < sizeof(vec_names)/sizeof(vec_names[0])) -+ printk(KERN_WARNING "*** %s *** FORMAT=%X\n", -+ vec_names[fp->ptregs.vector], -+ fp->ptregs.format); -+ else -+ printk(KERN_WARNING "*** Exception %d *** FORMAT=%X\n", -+ fp->ptregs.vector, -+ fp->ptregs.format); -+ printk(KERN_WARNING "Current process id is %d\n", current->pid); -+ die_if_kernel("BAD KERNEL TRAP", &fp->ptregs, 0); -+} -+ -+asmlinkage void trap_c(struct frame *fp) -+{ -+ int sig; -+ siginfo_t info; -+ -+ if (fp->ptregs.sr & PS_S) { -+ if (fp->ptregs.vector == VEC_TRACE) { -+ /* traced a trapping instruction */ -+ current->ptrace |= PT_DTRACE; -+ } else -+ bad_super_trap(fp); -+ return; -+ } -+ -+ /* send the appropriate signal to the user program */ -+ switch (fp->ptregs.vector) { -+ case VEC_ADDRERR: -+ info.si_code = BUS_ADRALN; -+ sig = SIGBUS; -+ break; -+ case VEC_ILLEGAL: -+ case VEC_LINE10: -+ case VEC_LINE11: -+ info.si_code = ILL_ILLOPC; -+ sig = SIGILL; -+ break; -+ case VEC_PRIV: -+ info.si_code = ILL_PRVOPC; -+ sig = SIGILL; -+ break; -+ case VEC_COPROC: -+ info.si_code = ILL_COPROC; -+ sig = SIGILL; -+ break; -+ case VEC_TRAP1: /* gdbserver breakpoint */ -+ fp->ptregs.pc -= 2; -+ info.si_code = TRAP_TRACE; -+ sig = SIGTRAP; -+ break; -+ case VEC_TRAP2: -+ case VEC_TRAP3: -+ case VEC_TRAP4: -+ case VEC_TRAP5: -+ case VEC_TRAP6: -+ case VEC_TRAP7: -+ case VEC_TRAP8: -+ case VEC_TRAP9: -+ case VEC_TRAP10: -+ case VEC_TRAP11: -+ case VEC_TRAP12: -+ case VEC_TRAP13: -+ case VEC_TRAP14: -+ info.si_code = ILL_ILLTRP; -+ sig = SIGILL; -+ break; -+ case VEC_FPBRUC: -+ case VEC_FPOE: -+ case VEC_FPNAN: -+ info.si_code = FPE_FLTINV; -+ sig = SIGFPE; -+ break; -+ case VEC_FPIR: -+ info.si_code = FPE_FLTRES; -+ sig = SIGFPE; -+ break; -+ case VEC_FPDIVZ: -+ info.si_code = FPE_FLTDIV; -+ sig = SIGFPE; -+ break; -+ case VEC_FPUNDER: -+ info.si_code = FPE_FLTUND; -+ sig = SIGFPE; -+ break; -+ case VEC_FPOVER: -+ info.si_code = FPE_FLTOVF; -+ sig = SIGFPE; -+ break; -+ case VEC_ZERODIV: -+ info.si_code = FPE_INTDIV; -+ sig = SIGFPE; -+ break; -+ case VEC_CHK: -+ case VEC_TRAP: -+ info.si_code = FPE_INTOVF; -+ sig = SIGFPE; -+ break; -+ case VEC_TRACE: /* ptrace single step */ -+ info.si_code = TRAP_TRACE; -+ sig = SIGTRAP; -+ break; -+ case VEC_TRAP15: /* breakpoint */ -+ info.si_code = TRAP_BRKPT; -+ sig = SIGTRAP; -+ break; -+ default: -+ info.si_code = ILL_ILLOPC; -+ sig = SIGILL; -+ break; -+ } -+ info.si_signo = sig; -+ info.si_errno = 0; -+ switch (fp->ptregs.format) { -+ default: -+ info.si_addr = (void *) fp->ptregs.pc; -+ break; -+ case 2: -+ info.si_addr = (void *) fp->un.fmt2.iaddr; -+ break; -+ case 7: -+ info.si_addr = (void *) fp->un.fmt7.effaddr; -+ break; -+ case 9: -+ info.si_addr = (void *) fp->un.fmt9.iaddr; -+ break; -+ case 10: -+ info.si_addr = (void *) fp->un.fmta.daddr; -+ break; -+ case 11: -+ info.si_addr = (void *) fp->un.fmtb.daddr; -+ break; -+ } -+ force_sig_info(sig, &info, current); -+} -+ -+asmlinkage void set_esp0(unsigned long ssp) -+{ -+ current->thread.esp0 = ssp; -+} -+ -+/* -+ * The architecture-independent backtrace generator -+ */ -+void dump_stack(void) -+{ -+ unsigned long stack; -+ -+ show_stack(current, &stack); -+} -+EXPORT_SYMBOL(dump_stack); -+ -+#ifdef CONFIG_M68KFPU_EMU -+asmlinkage void fpemu_signal(int signal, int code, void *addr) -+{ -+ siginfo_t info; -+ -+ info.si_signo = signal; -+ info.si_errno = 0; -+ info.si_code = code; -+ info.si_addr = addr; -+ force_sig_info(signal, &info, current); -+} -+#endif ---- /dev/null -+++ b/arch/m68k/coldfire/usb/Makefile -@@ -0,0 +1,28 @@ -+# -+# Makefile for the linux kernel. -+# -+ -+# Object file lists. -+ -+ifneq ($(CONFIG_USB_EHCI_HCD),) -+ obj-y += otg_host.o -+endif -+ -+ifneq ($(CONFIG_USB_GADGET_MCF5445X),) -+ obj-y += otg_device.o -+endif -+ -+ifneq ($(strip $(CONFIG_USB_GADGET_MCF5445X) $(CONFIG_USB_EHCI_HCD)),) -+ obj-y += otg_cmn.o -+endif -+ -+ifneq ($(CONFIG_USB_OTG),) -+ obj-y += otg_otg.o -+endif -+ -+ -+# USB Transceiver driver: -+ifneq ($(strip $(CONFIG_USB) $(CONFIG_USB_GADGET_MCF5445X)),) -+ obj-y += xcvr.o -+endif -+ ---- /dev/null -+++ b/arch/m68k/coldfire/usb/otg_cmn.c -@@ -0,0 +1,106 @@ -+/* -+ * Copyright 2004-2007 Freescale Semiconductor, Inc. All Rights Reserved. -+ */ -+ -+/* -+ * The code contained herein is licensed under the GNU General Public -+ * License. You may obtain a copy of the GNU General Public License -+ * Version 2 or later at the following locations: -+ * -+ * http://www.opensource.org/licenses/gpl-license.html -+ * http://www.gnu.org/copyleft/gpl.html -+ */ -+ -+#include <linux/module.h> -+#include <linux/kernel.h> -+#include <linux/types.h> -+#include <linux/err.h> -+#include <linux/errno.h> -+#include <linux/init.h> -+#include <linux/io.h> -+#include <linux/irq.h> -+#include <linux/platform_device.h> -+#include <linux/delay.h> -+#include <linux/fsl_devices.h> -+#include <linux/usb/fsl_xcvr.h> -+ -+#include <asm/system.h> -+#include <asm/coldfire.h> -+ -+extern void fsl_usb_enable_clk(void); -+extern void fsl_usb_disable_clk(void); -+extern int fsl_usb_mem_init(struct platform_device *pdev); -+ -+extern struct fsl_xcvr_ops *xc_ops[]; -+ -+static int otg_used; -+ -+int usbotg_init(struct platform_device *pdev) -+{ -+ struct fsl_usb2_platform_data *pdata; -+ struct fsl_xcvr_ops *xops = xc_ops[USB_CTRLR_OTG]; -+ int rc; -+ -+ pdata = (struct fsl_usb2_platform_data *)pdev->dev.platform_data; -+ -+ pr_debug("%s: pdev=0x%p pdata=0x%p\n", __FUNCTION__, pdev, pdata); -+ -+ if (!xops) { -+ printk(KERN_ERR "OTG transceiver ops missing\n"); -+ return -EINVAL; -+ } -+ pdata->xcvr_ops = xops; -+ pdata->xcvr_type = xops->xcvr_type; -+ -+ if (!otg_used) { -+ /* request_mem_region and ioremap registers */ -+ rc = fsl_usb_mem_init(pdev); -+ if (rc) -+ return rc; -+ -+ fsl_usb_enable_clk(); -+ -+ if (xops->init) -+ xops->init(pdev); -+ } -+ -+ otg_used++; -+ pr_debug("%s: success\n", __FUNCTION__); -+ return 0; -+} -+ -+void usbotg_uninit(struct platform_device *pdev) -+{ -+ struct fsl_usb2_platform_data *pdata; -+ pdata = (struct fsl_usb2_platform_data *)pdev->dev.platform_data; -+ -+ pr_debug("%s\n", __FUNCTION__); -+ -+ otg_used--; -+ if (!otg_used) { -+ if (pdata->xcvr_ops && pdata->xcvr_ops->uninit) -+ pdata->xcvr_ops->uninit(pdev); -+ -+ iounmap(pdata->regs); -+ release_mem_region(pdata->r_start, pdata->r_len); -+ -+ pdata->regs = NULL; -+ pdata->r_start = pdata->r_len = 0; -+ -+ fsl_usb_disable_clk(); -+ } -+} -+ -+struct fsl_usb2_platform_data mxc_otg_config = { -+ .name = "OTG", -+ .platform_init = usbotg_init, -+ .platform_uninit = usbotg_uninit, -+ .es = 1, -+ .big_endian_mmio = 1, -+ .big_endian_desc = 1, -+ .le_setup_buf = 1, -+ .does_otg = 1, -+ .power_budget = 500, /* 500 mA max power */ -+ .max_ep_nr = 4, /* DDD read from a register ? */ -+ .phy_mode = FSL_USB2_PHY_ULPI, /* DDD redundant with xcvr_type */ -+}; ---- /dev/null -+++ b/arch/m68k/coldfire/usb/otg_device.c -@@ -0,0 +1,89 @@ -+/* -+ * Copyright 2004-2007 Freescale Semiconductor, Inc. All Rights Reserved. -+ */ -+ -+/* -+ * The code contained herein is licensed under the GNU General Public -+ * License. You may obtain a copy of the GNU General Public License -+ * Version 2 or later at the following locations: -+ * -+ * http://www.opensource.org/licenses/gpl-license.html -+ * http://www.gnu.org/copyleft/gpl.html -+ */ -+ -+#include <linux/module.h> -+#include <linux/kernel.h> -+#include <linux/types.h> -+#include <linux/errno.h> -+#include <linux/init.h> -+#include <linux/io.h> -+#include <linux/irq.h> -+#include <linux/err.h> -+#include <linux/platform_device.h> -+#include <linux/usb/otg.h> -+#include <linux/delay.h> -+#include <linux/fsl_devices.h> -+#include <linux/usb/fsl_xcvr.h> -+ -+#include <asm/system.h> -+#include <asm/coldfire.h> -+ -+#define USB_OTGREGS_BASE MCF_REG32(0xFC0B0000) -+#define INT_USB (64 + 64 + 47) /* INTC1:47 16.2.9.1 */ -+#define INT_UOCSR (64 + 64 + 53) /* INTC1:53 16.2.9.1 */ -+ -+extern int usbotg_init(struct platform_device *pdev); -+extern void usbotg_uninit(struct fsl_usb2_platform_data *pdata); -+extern struct fsl_usb2_platform_data mxc_otg_config; -+ -+struct platform_device otg_udc_device; -+ -+/*! -+ * OTG Gadget device -+ */ -+ -+static void usb_release(struct device *dev) -+{ -+ /* normally not freed */ -+} -+ -+static u64 udc_dmamask = ~(u32) 0; -+static struct resource otg_udc_resources[] = { -+ [0] = { -+ .start = (u32) (&USB_OTGREGS_BASE), -+ .end = (u32) (&USB_OTGREGS_BASE + 0x1ff), -+ .flags = IORESOURCE_MEM, -+ }, -+ [1] = { -+ .start = INT_USB, -+ .flags = IORESOURCE_IRQ, -+ }, -+}; -+ -+ -+struct platform_device otg_udc_device = { -+ .name = "fsl-usb2-udc", -+ .id = -1, -+ .dev = { -+ .release = usb_release, -+ .dma_mask = &udc_dmamask, -+ .coherent_dma_mask = 0xffffffff, -+ .platform_data = &mxc_otg_config, -+ }, -+ .resource = otg_udc_resources, -+ .num_resources = ARRAY_SIZE(otg_udc_resources), -+}; -+ -+static int __init udc_init(void) -+{ -+ int rc __attribute((unused)); -+ -+ rc = platform_device_register(&otg_udc_device); -+ if (rc) -+ printk(KERN_ERR "usb: can't register OTG Gadget, rc=%d\n", rc); -+ else -+ printk(KERN_INFO "usb: OTG Gadget registered\n"); -+ return rc; -+} -+ -+subsys_initcall(udc_init); ---- /dev/null -+++ b/arch/m68k/coldfire/usb/otg_host.c -@@ -0,0 +1,68 @@ -+/* -+ * Copyright 2004-2007 Freescale Semiconductor, Inc. All Rights Reserved. -+ */ -+ -+/* -+ * The code contained herein is licensed under the GNU General Public -+ * License. You may obtain a copy of the GNU General Public License -+ * Version 2 or later at the following locations: -+ * -+ * http://www.opensource.org/licenses/gpl-license.html -+ * http://www.gnu.org/copyleft/gpl.html -+ */ -+ -+#include <linux/module.h> -+#include <linux/kernel.h> -+#include <linux/types.h> -+#include <linux/errno.h> -+#include <linux/init.h> -+#include <linux/io.h> -+#include <linux/irq.h> -+#include <linux/err.h> -+#include <linux/platform_device.h> -+#include <linux/delay.h> -+#include <linux/fsl_devices.h> -+#include <linux/usb/fsl_xcvr.h> -+ -+#include <asm/system.h> -+#include <asm/mcfsim.h> -+ -+#define USB_OTGREGS_BASE MCF_REG32(0xFC0B0000) -+#define INT_USB (64 + 64 + 47) /* INTC1:47 16.2.9.1 */ -+#define INT_UOCSR (64 + 64 + 53) /* INTC1:53 16.2.9.1 */ -+ -+struct platform_device *otg_host_device; -+ -+extern struct platform_device *host_pdev_register(struct resource *res, -+ int n_res, -+ struct fsl_usb2_platform_data -+ *config); -+ -+extern int usbotg_init(struct platform_device *pdev); -+extern void usbotg_uninit(struct fsl_usb2_platform_data *pdata); -+extern struct fsl_usb2_platform_data mxc_otg_config; -+ -+/*! -+ * OTG host config -+ */ -+static struct resource otg_host_resources[] = { -+ [0] = { -+ .start = (u32) (&USB_OTGREGS_BASE), -+ .end = (u32) (&USB_OTGREGS_BASE + 0x1ff), -+ .flags = IORESOURCE_MEM, -+ }, -+ [1] = { -+ .start = INT_USB, -+ .flags = IORESOURCE_IRQ, -+ }, -+}; -+ -+static int __init otg_host_init(void) -+{ -+ otg_host_device = host_pdev_register(otg_host_resources, -+ ARRAY_SIZE(otg_host_resources), -+ &mxc_otg_config); -+ return 0; -+} -+ -+subsys_initcall(otg_host_init); ---- /dev/null -+++ b/arch/m68k/coldfire/usb/otg_otg.c -@@ -0,0 +1,96 @@ -+/* -+ * Copyright 2005-2007 Freescale Semiconductor, Inc. All Rights Reserved. -+ */ -+ -+/* -+ * The code contained herein is licensed under the GNU General Public -+ * License. You may obtain a copy of the GNU General Public License -+ * Version 2 or later at the following locations: -+ * -+ * http://www.opensource.org/licenses/gpl-license.html -+ * http://www.gnu.org/copyleft/gpl.html -+ */ -+ -+/* -+ * platform_device registration for ULPI OTG device -+ */ -+ -+#include <linux/module.h> -+#include <linux/kernel.h> -+#include <linux/types.h> -+#include <linux/errno.h> -+#include <linux/init.h> -+#include <linux/err.h> -+#include <linux/platform_device.h> -+#include <linux/fsl_devices.h> -+ -+#include <asm/mcfsim.h> -+ -+#define USB_OTGREGS_BASE MCF_REG32(0xFC0B0000) -+#define INT_USB (64 + 64 + 47) /* INTC1:47 16.2.9.1 */ -+#define INT_UOCSR (64 + 64 + 53) /* INTC1:53 16.2.9.1 */ -+ -+extern int usbotg_init(struct platform_device *pdev); -+extern void usbotg_uninit(struct fsl_usb2_platform_data *pdata); -+extern struct fsl_usb2_platform_data mxc_otg_config; -+ -+static void otg_otg_release(struct device *dev) -+{ -+ /* normally not freed */ -+} -+ -+/* *INDENT-OFF* */ -+static struct resource otg_otg_resources[] = { -+ [0] = { -+ .start = (u32) (&USB_OTGREGS_BASE), -+ .end = (u32) (&USB_OTGREGS_BASE + 0x1ff), -+ .flags = IORESOURCE_MEM, -+ }, -+ [1] = { -+ .start = INT_USB, -+ .flags = IORESOURCE_IRQ, -+ }, -+}; -+ -+/*! -+ * OTG device -+ */ -+static u64 otg_otg_dmamask = ~(u32) 0; -+static struct platform_device otg_otg_device = { -+ .name = "fsl-usb2-otg", -+ .id = -1, -+ .dev = { -+ .release = otg_otg_release, -+ .dma_mask = &otg_otg_dmamask, -+ .coherent_dma_mask = 0xffffffff, -+ .platform_data = &mxc_otg_config, -+ }, -+ .resource = otg_otg_resources, -+ .num_resources = ARRAY_SIZE(otg_otg_resources), -+}; -+/* *INDENT-ON* */ -+ -+static int __init mx31_otg_otg_init(void) -+{ -+ int rc = 0; -+ -+ pr_debug("register OTG otg res=0x%p, size=%d\n", -+ otg_otg_device.resource, otg_otg_device.num_resources); -+ -+ rc = platform_device_register(&otg_otg_device); -+ if (rc) { -+ pr_debug("can't register ULPI OTG dvc, %d\n", rc); -+ } else { -+ printk(KERN_INFO "usb: OTG ULPI transceiver registered\n"); -+ pr_debug("otg_otg_device=0x%p resources=0x%p.\n", -+ &otg_otg_device, otg_otg_device.resource); -+ } -+ -+ return rc; -+} -+ -+subsys_initcall(mx31_otg_otg_init); -+ -+MODULE_AUTHOR("Freescale Semiconductor, Inc."); -+MODULE_DESCRIPTION("ULPI OTG device registration"); -+MODULE_LICENSE("GPL"); ---- /dev/null -+++ b/arch/m68k/coldfire/usb/xcvr.c -@@ -0,0 +1,156 @@ -+/* -+ * Copyright 2005-2007 Freescale Semiconductor, Inc. All Rights Reserved. -+ */ -+ -+/* -+ * The code contained herein is licensed under the GNU General Public -+ * License. You may obtain a copy of the GNU General Public License -+ * Version 2 or later at the following locations: -+ * -+ * http://www.opensource.org/licenses/gpl-license.html -+ * http://www.gnu.org/copyleft/gpl.html -+ */ -+ -+#include <linux/module.h> -+#include <linux/kernel.h> -+#include <linux/types.h> -+#include <linux/errno.h> -+#include <linux/init.h> -+#include <linux/err.h> -+#include <linux/platform_device.h> -+#include <linux/delay.h> -+#include <linux/fsl_devices.h> -+#include <linux/usb/fsl_xcvr.h> -+#include <linux/usb/fsl_usb2.h> -+ -+#include <asm/mcfsim.h> -+ -+extern void fsl_usb_xcvr_register(struct fsl_xcvr_ops *xcvr_ops); -+extern void fsl_usb_xcvr_unregister(enum fsl_usb_ctrlr ctrlr); -+ -+#define MCF_SCM_BCR MCF_REG32(0xFC040024) -+#define MCF_SCM_BCR_GBR (1 << 9) /* global bursts for read */ -+#define MCF_SCM_BCR_GBW (1 << 8) /* global bursts for write */ -+#define MCF_SCM_BCR_SBE_ALL (0xff << 0) /* slave burst enable */ -+ -+ -+#ifdef ULPI_DEBUG -+void print_ulpi_regs(void) -+{ -+ pr_debug("MCF_SCM_BCR=0x%08lx MCF_CCM_MISCCR=0x%08x " -+ "MCF_GPIO_PAR_DMA=0x%08x MCF_GPIO_PAR_USB=08%08x " -+ "MCF_GPIO_PAR_FEC=08%08x\n", -+ MCF_SCM_BCR, MCF_CCM_MISCCR, MCF_GPIO_PAR_DMA, -+ MCF_GPIO_PAR_USB, MCF_GPIO_PAR_FEC); -+} -+EXPORT_SYMBOL(print_ulpi_regs); -+#endif -+ -+ -+static void xcvr_init(struct platform_device *pdev) -+{ -+ struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data; -+ struct fsl_xcvr_ops *this = pdata->xcvr_ops; -+ struct fsl_usb_host_regs *regs = pdata->regs; -+ -+ pr_debug("%s: ctrlr=%d pdata=0x%p regs=0x%p\n", __FUNCTION__, -+ this->ctrlr, pdata, pdata->regs); -+ -+ /* enable USB read, write and slave bursts */ -+ MCF_SCM_BCR = MCF_SCM_BCR_GBR | MCF_SCM_BCR_GBW | MCF_SCM_BCR_SBE_ALL; -+ -+ /* Use external clock source if PLL isn't a multiple of 60MHz */ -+ MCF_CCM_MISCCR &= ~MCF_CCM_MISCCR_USBSRC; -+ -+ /* Initialize the USB Clock: use USB input clock */ -+ MCF_GPIO_PAR_DMA = (MCF_GPIO_PAR_DMA & MCF_GPIO_PAR_DMA_DREQ1_MASK) | -+ MCF_GPIO_PAR_DMA_DREQ1_USB_CLKIN; -+ -+ switch (this->xcvr_type) { -+ case PORTSCX_PTS_ULPI: -+ /* Enable the required ULPI signals */ -+ MCF_GPIO_PAR_DMA = (MCF_GPIO_PAR_DMA & -+ MCF_GPIO_PAR_DMA_DACK1_MASK) | -+ MCF_GPIO_PAR_DMA_DACK1_ULPI_DIR; -+ -+ MCF_GPIO_PAR_USB = MCF_GPIO_PAR_USB_VBUSEN_ULPI_NXT | -+ MCF_GPIO_PAR_USB_VBUSOC_ULPI_STP; -+ -+ MCF_GPIO_PAR_FEC = (MCF_GPIO_PAR_FEC & -+ MCF_GPIO_PAR_FEC_FEC0_MASK) | -+ MCF_GPIO_PAR_FEC_FEC0_RMII_ULPI; -+ break; -+ case PORTSCX_PTS_ONCHIP: -+ /* Enable VBUS_EN and VBUS_OC signals */ -+ MCF_GPIO_PAR_USB = MCF_GPIO_PAR_USB_VBUSEN_VBUSEN | -+ MCF_GPIO_PAR_USB_VBUSOC_VBUSOC; -+ -+ /* Setup USB_VBUS_OC signal to be active-low */ -+ MCF_CCM_MISCCR |= MCF_CCM_MISCCR_USBOC; -+ -+ break; -+ } -+ -+ pr_debug("®s->portsc1=0x%p old portsc1=0x%x \n", ®s->portsc1, -+ regs->portsc1); -+ -+ regs->portsc1 &= ~PORTSCX_PTS_MASK; -+ regs->portsc1 |= this->xcvr_type; -+ -+ /* -+ * need to reset the controller here so that the ID pin -+ * is correctly detected. -+ */ -+ regs->usbcmd |= USB_CMD_CTRL_RESET; -+ -+ /* -+ * allow controller to reset, and leave time for -+ * the ULPI transceiver to reset too. -+ */ -+ mdelay(10); -+ -+ pr_debug("DDD %s: done. portsc1=0x%x\n", __FUNCTION__, regs->portsc1); -+} -+ -+static void xcvr_uninit(struct platform_device *pdev) -+{ -+ pr_debug("%s: pdev=0x%p\n", __FUNCTION__, pdev); -+} -+ -+ -+struct fsl_xcvr_ops xcvr_ops_otg = { -+ .ctrlr = USB_CTRLR_OTG, -+ .init = xcvr_init, -+ .uninit = xcvr_uninit, -+ -+#ifdef CONFIG_USB_M5445X_ULPI -+ .xcvr_type = PORTSCX_PTS_ULPI, -+#elif defined CONFIG_USB_M5445X_FSLS -+ .xcvr_type = PORTSCX_PTS_ONCHIP, -+#else -+#error "Invalid USB transceiver selection." -+#endif -+}; -+ -+static int __init usb_xcvr_init(void) -+{ -+ pr_debug("%s\n", __FUNCTION__); -+ -+ fsl_usb_xcvr_register(&xcvr_ops_otg); -+ -+ pr_debug("%s done\n", __FUNCTION__); -+ return 0; -+} -+ -+static void __exit usb_xcvr_exit(void) -+{ -+ fsl_usb_xcvr_unregister(USB_CTRLR_OTG); -+} -+ -+module_init(usb_xcvr_init); -+module_exit(usb_xcvr_exit); -+ -+MODULE_AUTHOR("Freescale Semiconductor, Inc."); -+MODULE_DESCRIPTION("External ULPI xcvr driver"); -+MODULE_LICENSE("GPL"); -+ ---- /dev/null -+++ b/arch/m68k/coldfire/usb.c -@@ -0,0 +1,182 @@ -+/* -+ * -+ * Copyright 2004-2007 Freescale Semiconductor, Inc. All Rights Reserved. -+ * -+ * otg_{get,set}_transceiver() are from arm/plat-omap/usb.c. -+ * which is Copyright (C) 2004 Texas Instruments, Inc. -+ */ -+ -+/* -+ * The code contained herein is licensed under the GNU General Public -+ * License. You may obtain a copy of the GNU General Public License -+ * Version 2 or later at the following locations: -+ * -+ * http://www.opensource.org/licenses/gpl-license.html -+ * http://www.gnu.org/copyleft/gpl.html -+ */ -+ -+#include <linux/module.h> -+#include <linux/kernel.h> -+#include <linux/types.h> -+#include <linux/errno.h> -+#include <linux/init.h> -+#include <linux/io.h> -+#include <linux/err.h> -+#include <linux/platform_device.h> -+#include <linux/usb/otg.h> -+#include <linux/delay.h> -+#include <linux/fsl_devices.h> -+#include <linux/usb/fsl_xcvr.h> -+ -+ -+/* The dmamask must be set for EHCI to work */ -+static u64 ehci_dmamask = ~(u32) 0; -+ -+struct fsl_xcvr_ops *xc_ops[3] = { NULL }; -+ -+void fsl_usb_enable_clk(void) -+{ -+} -+EXPORT_SYMBOL(fsl_usb_enable_clk); -+ -+void fsl_usb_disable_clk(void) -+{ -+} -+EXPORT_SYMBOL(fsl_usb_disable_clk); -+ -+void fsl_usb_xcvr_register(struct fsl_xcvr_ops *xcvr_ops) -+{ -+ pr_debug("%s ctrlr=%d\n", __FUNCTION__, xcvr_ops->ctrlr); -+ xc_ops[xcvr_ops->ctrlr] = xcvr_ops; -+ -+} -+EXPORT_SYMBOL(fsl_usb_xcvr_register); -+ -+void fsl_usb_xcvr_unregister(enum fsl_usb_ctrlr ctrlr) -+{ -+ pr_debug("%s ctrlr=%d\n", __FUNCTION__, ctrlr); -+ xc_ops[ctrlr] = NULL; -+} -+EXPORT_SYMBOL(fsl_usb_xcvr_unregister); -+ -+/*! -+ * Register an instance of a USB host platform device. -+ * -+ * @param res: resource pointer -+ * @param n_res: number of resources -+ * @param config: config pointer -+ * -+ * @return newly-registered platform_device -+ * -+ * DDD fix this comment: -+ * The USB controller supports 3 host interfaces, and the -+ * kernel can be configured to support some number of them. -+ * Each supported host interface is registered as an instance -+ * of the "fsl-ehci" device. Call this function multiple times -+ * to register each host interface. -+ */ -+static int instance_id; -+struct platform_device *host_pdev_register(struct resource *res, int n_res, -+ struct fsl_usb2_platform_data *config) -+{ -+ struct platform_device *pdev; -+ -+ pr_debug("register host res=0x%p, size=%d\n", res, n_res); -+ -+ pdev = platform_device_register_simple("fsl-ehci", -+ instance_id, res, n_res); -+ if (IS_ERR(pdev)) { -+ printk(KERN_ERR "usb: can't register %s Host, %ld\n", -+ config->name, PTR_ERR(pdev)); -+ return NULL; -+ } -+ -+ pdev->dev.coherent_dma_mask = 0xffffffff; -+ pdev->dev.dma_mask = &ehci_dmamask; -+ -+ /* -+ * platform_device_add_data() makes a copy of -+ * the platform_data passed in. That makes it -+ * impossible to share the same config struct for -+ * all OTG devices (host,gadget,otg). So, just -+ * set the platform_data pointer ourselves. -+ */ -+ pdev->dev.platform_data = config; -+ -+ printk(KERN_INFO "usb: %s Host registered\n", config->name); -+ pr_debug("pdev=0x%p dev=0x%p resources=0x%p pdata=0x%p\n", -+ pdev, &pdev->dev, pdev->resource, pdev->dev.platform_data); -+ -+ instance_id++; -+ -+ return pdev; -+} -+ -+ -+int fsl_usb_mem_init(struct platform_device *pdev) -+{ -+ struct resource *res; -+ struct fsl_usb2_platform_data *pdata; -+ -+ pdata = (struct fsl_usb2_platform_data *)pdev->dev.platform_data; -+ -+ pr_debug("%s: pdev=0x%p pdata=0x%p\n", __FUNCTION__, pdev, pdata); -+ -+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0); -+ if (!res) { -+ dev_err(&pdev->dev, "no MEM resource.\n"); -+ return -ENODEV; -+ } -+ -+ pdata->r_start = res->start; -+ pdata->r_len = res->end - res->start + 1; -+ pr_debug("%s: MEM resource start=0x%x len=0x%x\n", pdata->name, -+ res->start, pdata->r_len); -+ -+ if (!request_mem_region(pdata->r_start, pdata->r_len, "OTG")) { -+ dev_err(&pdev->dev, "request_mem_region failed\n"); -+ return -EBUSY; -+ } -+ pdata->regs = ioremap(pdata->r_start, pdata->r_len); -+ pr_debug("ioremapped to 0x%p\n", pdata->regs); -+ -+ if (pdata->regs == NULL) { -+ dev_err(&pdev->dev, "ioremap failed\n"); -+ release_mem_region(pdata->r_start, pdata->r_len); -+ return -EFAULT; -+ } -+ -+ pr_debug("%s: success\n", __FUNCTION__); -+ return 0; -+} -+ -+ -+#if defined(CONFIG_USB_OTG) -+static struct otg_transceiver *xceiv; -+ -+/** -+ * otg_get_transceiver - find the (single) OTG transceiver driver -+ * -+ * Returns the transceiver driver, after getting a refcount to it; or -+ * null if there is no such transceiver. The caller is responsible for -+ * releasing that count. -+ */ -+struct otg_transceiver *otg_get_transceiver(void) -+{ -+ pr_debug("%s xceiv=0x%p\n", __FUNCTION__, xceiv); -+ if (xceiv) -+ get_device(xceiv->dev); -+ return xceiv; -+} -+EXPORT_SYMBOL(otg_get_transceiver); -+ -+int otg_set_transceiver(struct otg_transceiver *x) -+{ -+ pr_debug("%s xceiv=0x%p x=0x%p\n", __FUNCTION__, xceiv, x); -+ if (xceiv && x) -+ return -EBUSY; -+ xceiv = x; -+ return 0; -+} -+EXPORT_SYMBOL(otg_set_transceiver); -+#endif ---- /dev/null -+++ b/arch/m68k/coldfire/vmlinux-cf.lds -@@ -0,0 +1,130 @@ -+/* ld script to make m68k Coldfire Linux kernel -+ * -+ * Derived from arch/m68k/kernel/vmlinux-std.lds -+ * -+ * Updated 11/26/2007 for new CodeSourcery toolset -+ * by Kurt Mahan <kmahan@freescale.com> -+ */ -+ -+#define LOAD_OFFSET 0x00000000 -+ -+#include <asm-generic/vmlinux.lds.h> -+#include <asm/page_offset.h> -+ -+#define START_OFFSET 0x00020000 -+#define IMAGE_START PAGE_OFFSET_RAW + START_OFFSET -+ -+OUTPUT_FORMAT("elf32-m68k", "elf32-m68k", "elf32-m68k") -+OUTPUT_ARCH(m68k) -+ENTRY(_stext) -+jiffies = jiffies_64 + 4; -+ -+SECTIONS -+{ -+ . = IMAGE_START; -+ .text.head : AT(ADDR(.text.head) - LOAD_OFFSET) { -+ _text = .; /* Text and read-only data */ -+ *(.text.head) -+ } :text = 0x4e75 -+ -+ .text : AT(ADDR(.text) - LOAD_OFFSET) { -+ TEXT_TEXT -+ SCHED_TEXT -+ LOCK_TEXT -+ *(.fixup) -+ *(.gnu.warning) -+ } :text = 0x4e75 -+ _etext = .; /* End of text section */ -+ -+ . = ALIGN(16); -+ __ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) { -+ __start___ex_table = .; -+ *(__ex_table) -+ __stop___ex_table = .; -+ } -+ -+ RODATA -+ -+ . = ALIGN(8192); -+ .data : AT(ADDR(.data) - LOAD_OFFSET) { /* Data */ -+ DATA_DATA -+ CONSTRUCTORS -+ } :data -+ -+ -+ . = ALIGN(16); -+ .data.cacheline_aligned : AT(ADDR(.data.cacheline_aligned) - LOAD_OFFSET ) { -+ *(.data.cacheline_aligned) -+ } :data -+ -+ _edata = .; /* End of data section */ -+ -+ NOTES /* support ld --build-id */ -+ -+ . = ALIGN(8192); /* Initrd */ -+ .init.text : AT(ADDR(.init.text) - LOAD_OFFSET) { -+ __init_begin = .; -+ _sinittext = .; -+ *(.init.text) -+ _einittext = .; -+ } -+ -+ .init.data : AT(ADDR(.init.data) - LOAD_OFFSET) { -+ *(.init.data) -+ } -+ -+ . = ALIGN(16); -+ .init.setup : AT(ADDR(.init.setup) - LOAD_OFFSET) { -+ __setup_start = .; -+ *(.init.setup) -+ __setup_end = .; -+ } -+ -+ .initcall.init : AT(ADDR(.initcall.init) - LOAD_OFFSET) { -+ __initcall_start = .; -+ INITCALLS -+ __initcall_end = .; -+ } -+ -+ .con_initcall.init : AT(ADDR(.con_initcall.init) - LOAD_OFFSET) { -+ __con_initcall_start = .; -+ *(.con_initcall.init) -+ __con_initcall_end = .; -+ } -+ -+ SECURITY_INIT -+ -+#ifdef CONFIG_BLK_DEV_INITRD -+ . = ALIGN(8192); -+ .init.ramfs : AT(ADDR(.init.ramfs) - LOAD_OFFSET) { -+ __initramfs_start = .; -+ *(.init.ramfs) -+ __initramfs_end = .; -+ } -+#endif -+ -+ . = ALIGN(8192); -+ __init_end = .; -+ -+ .data.init_task : AT(ADDR(.data.init_task) - LOAD_OFFSET) { -+ *(.data.init_task) /* The initial task and kernel stack */ -+ } -+ -+ _sbss = .; -+ .bss : AT(ADDR(.bss) - LOAD_OFFSET) { /* BSS */ -+ *(.bss) -+ } -+ _ebss = .; -+ -+ _end = . ; -+ -+ /* Sections to be discarded */ -+ /DISCARD/ : { -+ *(.exit.text) -+ *(.exit.data) -+ *(.exitcall.exit) -+ } -+ -+ /* Stabs debugging sections. */ -+ STABS_DEBUG -+} ---- /dev/null -+++ b/arch/m68k/configs/55_defconfig -@@ -0,0 +1,830 @@ -+# -+# Automatically generated make config: don't edit -+# Linux kernel version: 2.6.25 -+# Thu Jun 26 16:17:41 2008 -+# -+CONFIG_M68K=y -+CONFIG_MMU=y -+# CONFIG_GENERIC_TIME is not set -+# CONFIG_GENERIC_CLOCKEVENTS is not set -+CONFIG_RWSEM_GENERIC_SPINLOCK=y -+# CONFIG_ARCH_HAS_ILOG2_U32 is not set -+# CONFIG_ARCH_HAS_ILOG2_U64 is not set -+CONFIG_GENERIC_HWEIGHT=y -+CONFIG_GENERIC_CALIBRATE_DELAY=y -+CONFIG_TIME_LOW_RES=y -+CONFIG_GENERIC_IOMAP=y -+# CONFIG_NO_IOPORT is not set -+# CONFIG_NO_DMA is not set -+CONFIG_ARCH_SUPPORTS_AOUT=y -+CONFIG_HZ=100 -+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" -+ -+# -+# General setup -+# -+CONFIG_EXPERIMENTAL=y -+CONFIG_BROKEN_ON_SMP=y -+CONFIG_INIT_ENV_ARG_LIMIT=32 -+CONFIG_LOCALVERSION="" -+CONFIG_LOCALVERSION_AUTO=y -+CONFIG_SWAP=y -+CONFIG_SYSVIPC=y -+CONFIG_SYSVIPC_SYSCTL=y -+# CONFIG_POSIX_MQUEUE is not set -+# CONFIG_BSD_PROCESS_ACCT is not set -+# CONFIG_TASKSTATS is not set -+# CONFIG_AUDIT is not set -+CONFIG_IKCONFIG=y -+CONFIG_IKCONFIG_PROC=y -+CONFIG_LOG_BUF_SHIFT=17 -+# CONFIG_CGROUPS is not set -+CONFIG_GROUP_SCHED=y -+CONFIG_FAIR_GROUP_SCHED=y -+# CONFIG_RT_GROUP_SCHED is not set -+CONFIG_USER_SCHED=y -+# CONFIG_CGROUP_SCHED is not set -+CONFIG_SYSFS_DEPRECATED=y -+CONFIG_SYSFS_DEPRECATED_V2=y -+# CONFIG_RELAY is not set -+CONFIG_NAMESPACES=y -+# CONFIG_UTS_NS is not set -+# CONFIG_IPC_NS is not set -+# CONFIG_USER_NS is not set -+# CONFIG_PID_NS is not set -+# CONFIG_BLK_DEV_INITRD is not set -+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set -+CONFIG_SYSCTL=y -+# CONFIG_EMBEDDED is not set -+CONFIG_UID16=y -+CONFIG_SYSCTL_SYSCALL=y -+CONFIG_KALLSYMS=y -+# CONFIG_KALLSYMS_ALL is not set -+# CONFIG_KALLSYMS_EXTRA_PASS is not set -+CONFIG_HOTPLUG=y -+CONFIG_PRINTK=y -+CONFIG_BUG=y -+CONFIG_ELF_CORE=y -+CONFIG_COMPAT_BRK=y -+CONFIG_BASE_FULL=y -+CONFIG_FUTEX=y -+CONFIG_ANON_INODES=y -+CONFIG_EPOLL=y -+CONFIG_SIGNALFD=y -+CONFIG_TIMERFD=y -+CONFIG_EVENTFD=y -+CONFIG_SHMEM=y -+CONFIG_VM_EVENT_COUNTERS=y -+CONFIG_SLAB=y -+# CONFIG_SLUB is not set -+# CONFIG_SLOB is not set -+# CONFIG_PROFILING is not set -+# CONFIG_MARKERS is not set -+# CONFIG_HAVE_OPROFILE is not set -+# CONFIG_HAVE_KPROBES is not set -+# CONFIG_HAVE_KRETPROBES is not set -+CONFIG_PROC_PAGE_MONITOR=y -+CONFIG_SLABINFO=y -+CONFIG_RT_MUTEXES=y -+# CONFIG_TINY_SHMEM is not set -+CONFIG_BASE_SMALL=0 -+CONFIG_MODULES=y -+CONFIG_MODULE_UNLOAD=y -+CONFIG_MODULE_FORCE_UNLOAD=y -+# CONFIG_MODVERSIONS is not set -+# CONFIG_MODULE_SRCVERSION_ALL is not set -+# CONFIG_KMOD is not set -+CONFIG_BLOCK=y -+CONFIG_LBD=y -+# CONFIG_BLK_DEV_IO_TRACE is not set -+# CONFIG_LSF is not set -+# CONFIG_BLK_DEV_BSG is not set -+ -+# -+# IO Schedulers -+# -+CONFIG_IOSCHED_NOOP=y -+CONFIG_IOSCHED_AS=y -+CONFIG_IOSCHED_DEADLINE=y -+CONFIG_IOSCHED_CFQ=y -+# CONFIG_DEFAULT_AS is not set -+# CONFIG_DEFAULT_DEADLINE is not set -+CONFIG_DEFAULT_CFQ=y -+# CONFIG_DEFAULT_NOOP is not set -+CONFIG_DEFAULT_IOSCHED="cfq" -+CONFIG_CLASSIC_RCU=y -+ -+# -+# Platform dependent setup -+# -+# CONFIG_SUN3 is not set -+CONFIG_COLDFIRE=y -+CONFIG_CFV4E=y -+# CONFIG_AMIGA is not set -+# CONFIG_ATARI is not set -+# CONFIG_PCI is not set -+# CONFIG_MAC is not set -+# CONFIG_APOLLO is not set -+# CONFIG_VME is not set -+# CONFIG_HP300 is not set -+# CONFIG_SUN3X is not set -+# CONFIG_Q40 is not set -+ -+# -+# Processor type -+# -+# CONFIG_M68020 is not set -+# CONFIG_M68030 is not set -+# CONFIG_M68040 is not set -+# CONFIG_M68060 is not set -+CONFIG_M5445X=y -+# CONFIG_M54451 is not set -+CONFIG_M54455=y -+# CONFIG_M54451EVB is not set -+CONFIG_M54455EVB=y -+# CONFIG_M547X_8X is not set -+CONFIG_MCFCLK=266666666 -+# CONFIG_MCF_USER_HALT is not set -+CONFIG_MMU_CFV4E=y -+CONFIG_SDRAM_BASE=0x40000000 -+CONFIG_SDRAM_SIZE=0x10000000 -+CONFIG_NOR_FLASH_BASE=0x00000000 -+# CONFIG_M68KFPU_EMU is not set -+CONFIG_ADVANCED=y -+# CONFIG_RMW_INSNS is not set -+CONFIG_SINGLE_MEMORY_CHUNK=y -+# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set -+CONFIG_SELECT_MEMORY_MODEL=y -+CONFIG_FLATMEM_MANUAL=y -+# CONFIG_DISCONTIGMEM_MANUAL is not set -+# CONFIG_SPARSEMEM_MANUAL is not set -+CONFIG_FLATMEM=y -+CONFIG_FLAT_NODE_MEM_MAP=y -+CONFIG_NEED_MULTIPLE_NODES=y -+# CONFIG_SPARSEMEM_STATIC is not set -+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set -+CONFIG_SPLIT_PTLOCK_CPUS=4 -+# CONFIG_RESOURCES_64BIT is not set -+CONFIG_ZONE_DMA_FLAG=1 -+CONFIG_BOUNCE=y -+CONFIG_VIRT_TO_BUS=y -+ -+# -+# General setup -+# -+CONFIG_BINFMT_ELF=y -+# CONFIG_BINFMT_AOUT is not set -+# CONFIG_BINFMT_MISC is not set -+CONFIG_PROC_HARDWARE=y -+CONFIG_ZONE_DMA=y -+# CONFIG_ARCH_SUPPORTS_MSI is not set -+ -+# -+# Power management options -+# -+# CONFIG_PM is not set -+ -+# -+# Networking -+# -+CONFIG_NET=y -+ -+# -+# Networking options -+# -+CONFIG_PACKET=y -+# CONFIG_PACKET_MMAP is not set -+CONFIG_UNIX=y -+CONFIG_XFRM=y -+# CONFIG_XFRM_USER is not set -+# CONFIG_XFRM_SUB_POLICY is not set -+# CONFIG_XFRM_MIGRATE is not set -+# CONFIG_XFRM_STATISTICS is not set -+CONFIG_NET_KEY=y -+# CONFIG_NET_KEY_MIGRATE is not set -+CONFIG_INET=y -+# CONFIG_IP_MULTICAST is not set -+CONFIG_IP_ADVANCED_ROUTER=y -+CONFIG_ASK_IP_FIB_HASH=y -+# CONFIG_IP_FIB_TRIE is not set -+CONFIG_IP_FIB_HASH=y -+# CONFIG_IP_MULTIPLE_TABLES is not set -+# CONFIG_IP_ROUTE_MULTIPATH is not set -+# CONFIG_IP_ROUTE_VERBOSE is not set -+CONFIG_IP_PNP=y -+# CONFIG_IP_PNP_DHCP is not set -+# CONFIG_IP_PNP_BOOTP is not set -+# CONFIG_IP_PNP_RARP is not set -+# CONFIG_NET_IPIP is not set -+# CONFIG_NET_IPGRE is not set -+# CONFIG_ARPD is not set -+# CONFIG_SYN_COOKIES is not set -+CONFIG_INET_AH=y -+CONFIG_INET_ESP=y -+# CONFIG_INET_IPCOMP is not set -+# CONFIG_INET_XFRM_TUNNEL is not set -+# CONFIG_INET_TUNNEL is not set -+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set -+# CONFIG_INET_XFRM_MODE_TUNNEL is not set -+# CONFIG_INET_XFRM_MODE_BEET is not set -+# CONFIG_INET_LRO is not set -+CONFIG_INET_DIAG=y -+CONFIG_INET_TCP_DIAG=y -+# CONFIG_TCP_CONG_ADVANCED is not set -+CONFIG_TCP_CONG_CUBIC=y -+CONFIG_DEFAULT_TCP_CONG="cubic" -+# CONFIG_TCP_MD5SIG is not set -+# CONFIG_IPV6 is not set -+# CONFIG_INET6_XFRM_TUNNEL is not set -+# CONFIG_INET6_TUNNEL is not set -+# CONFIG_NETWORK_SECMARK is not set -+# CONFIG_NETFILTER is not set -+# CONFIG_IP_DCCP is not set -+# CONFIG_IP_SCTP is not set -+# CONFIG_TIPC is not set -+# CONFIG_ATM is not set -+# CONFIG_BRIDGE is not set -+# CONFIG_VLAN_8021Q is not set -+# CONFIG_DECNET is not set -+# CONFIG_LLC2 is not set -+# CONFIG_IPX is not set -+# CONFIG_ATALK is not set -+# CONFIG_X25 is not set -+# CONFIG_LAPB is not set -+# CONFIG_ECONET is not set -+# CONFIG_WAN_ROUTER is not set -+# CONFIG_NET_SCHED is not set -+ -+# -+# Network testing -+# -+# CONFIG_NET_PKTGEN is not set -+# CONFIG_HAMRADIO is not set -+# CONFIG_CAN is not set -+# CONFIG_IRDA is not set -+# CONFIG_BT is not set -+# CONFIG_AF_RXRPC is not set -+ -+# -+# Wireless -+# -+# CONFIG_CFG80211 is not set -+# CONFIG_WIRELESS_EXT is not set -+# CONFIG_MAC80211 is not set -+# CONFIG_IEEE80211 is not set -+# CONFIG_RFKILL is not set -+# CONFIG_NET_9P is not set -+ -+# -+# Device Drivers -+# -+ -+# -+# Generic Driver Options -+# -+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" -+# CONFIG_STANDALONE is not set -+CONFIG_PREVENT_FIRMWARE_BUILD=y -+CONFIG_FW_LOADER=y -+# CONFIG_DEBUG_DRIVER is not set -+# CONFIG_DEBUG_DEVRES is not set -+# CONFIG_SYS_HYPERVISOR is not set -+# CONFIG_CONNECTOR is not set -+# CONFIG_MTD is not set -+# CONFIG_PARPORT is not set -+CONFIG_BLK_DEV=y -+# CONFIG_BLK_DEV_COW_COMMON is not set -+CONFIG_BLK_DEV_LOOP=y -+# CONFIG_BLK_DEV_CRYPTOLOOP is not set -+# CONFIG_BLK_DEV_NBD is not set -+CONFIG_BLK_DEV_RAM=y -+CONFIG_BLK_DEV_RAM_COUNT=16 -+CONFIG_BLK_DEV_RAM_SIZE=64000 -+# CONFIG_BLK_DEV_XIP is not set -+# CONFIG_CDROM_PKTCDVD is not set -+# CONFIG_ATA_OVER_ETH is not set -+CONFIG_MISC_DEVICES=y -+# CONFIG_COLDFIRE_SEC is not set -+# CONFIG_EEPROM_93CX6 is not set -+# CONFIG_ENCLOSURE_SERVICES is not set -+CONFIG_HAVE_IDE=y -+# CONFIG_IDE is not set -+ -+# -+# SCSI device support -+# -+# CONFIG_RAID_ATTRS is not set -+CONFIG_SCSI=y -+CONFIG_SCSI_DMA=y -+# CONFIG_SCSI_TGT is not set -+# CONFIG_SCSI_NETLINK is not set -+CONFIG_SCSI_PROC_FS=y -+ -+# -+# SCSI support type (disk, tape, CD-ROM) -+# -+CONFIG_BLK_DEV_SD=y -+# CONFIG_CHR_DEV_ST is not set -+# CONFIG_CHR_DEV_OSST is not set -+# CONFIG_BLK_DEV_SR is not set -+# CONFIG_CHR_DEV_SG is not set -+# CONFIG_CHR_DEV_SCH is not set -+ -+# -+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs -+# -+CONFIG_SCSI_MULTI_LUN=y -+# CONFIG_SCSI_CONSTANTS is not set -+# CONFIG_SCSI_LOGGING is not set -+# CONFIG_SCSI_SCAN_ASYNC is not set -+CONFIG_SCSI_WAIT_SCAN=m -+ -+# -+# SCSI Transports -+# -+# CONFIG_SCSI_SPI_ATTRS is not set -+# CONFIG_SCSI_FC_ATTRS is not set -+# CONFIG_SCSI_ISCSI_ATTRS is not set -+# CONFIG_SCSI_SAS_LIBSAS is not set -+# CONFIG_SCSI_SRP_ATTRS is not set -+CONFIG_SCSI_LOWLEVEL=y -+# CONFIG_ISCSI_TCP is not set -+# CONFIG_SCSI_DEBUG is not set -+# CONFIG_ATA is not set -+# CONFIG_MD is not set -+CONFIG_NETDEVICES=y -+# CONFIG_NETDEVICES_MULTIQUEUE is not set -+# CONFIG_DUMMY is not set -+# CONFIG_BONDING is not set -+# CONFIG_MACVLAN is not set -+# CONFIG_EQUALIZER is not set -+# CONFIG_TUN is not set -+# CONFIG_VETH is not set -+# CONFIG_PHYLIB is not set -+CONFIG_NET_ETHERNET=y -+CONFIG_MII=y -+# CONFIG_IBM_NEW_EMAC_ZMII is not set -+# CONFIG_IBM_NEW_EMAC_RGMII is not set -+# CONFIG_IBM_NEW_EMAC_TAH is not set -+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set -+# CONFIG_B44 is not set -+CONFIG_FEC=y -+# CONFIG_FEC2 is not set -+# CONFIG_NETDEV_1000 is not set -+# CONFIG_NETDEV_10000 is not set -+ -+# -+# Wireless LAN -+# -+# CONFIG_WLAN_PRE80211 is not set -+# CONFIG_WLAN_80211 is not set -+# CONFIG_WAN is not set -+# CONFIG_PPP is not set -+# CONFIG_SLIP is not set -+# CONFIG_NETCONSOLE is not set -+# CONFIG_NETPOLL is not set -+# CONFIG_NET_POLL_CONTROLLER is not set -+# CONFIG_ISDN is not set -+# CONFIG_PHONE is not set -+ -+# -+# Input device support -+# -+CONFIG_INPUT=y -+# CONFIG_INPUT_FF_MEMLESS is not set -+# CONFIG_INPUT_POLLDEV is not set -+ -+# -+# Userland interfaces -+# -+CONFIG_INPUT_MOUSEDEV=y -+# CONFIG_INPUT_MOUSEDEV_PSAUX is not set -+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 -+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 -+# CONFIG_INPUT_JOYDEV is not set -+CONFIG_INPUT_EVDEV=y -+# CONFIG_INPUT_EVBUG is not set -+ -+# -+# Input Device Drivers -+# -+CONFIG_INPUT_KEYBOARD=y -+# CONFIG_KEYBOARD_ATKBD is not set -+# CONFIG_KEYBOARD_SUNKBD is not set -+# CONFIG_KEYBOARD_LKKBD is not set -+# CONFIG_KEYBOARD_XTKBD is not set -+# CONFIG_KEYBOARD_NEWTON is not set -+# CONFIG_KEYBOARD_STOWAWAY is not set -+# CONFIG_INPUT_MOUSE is not set -+# CONFIG_INPUT_JOYSTICK is not set -+# CONFIG_INPUT_TABLET is not set -+# CONFIG_INPUT_TOUCHSCREEN is not set -+# CONFIG_INPUT_MISC is not set -+ -+# -+# Hardware I/O ports -+# -+CONFIG_SERIO=y -+CONFIG_SERIO_SERPORT=y -+# CONFIG_SERIO_RAW is not set -+# CONFIG_GAMEPORT is not set -+ -+# -+# Character devices -+# -+CONFIG_VT=y -+CONFIG_VT_CONSOLE=y -+CONFIG_HW_CONSOLE=y -+# CONFIG_VT_HW_CONSOLE_BINDING is not set -+# CONFIG_SERIAL_NONSTANDARD is not set -+ -+# -+# Serial drivers -+# -+# CONFIG_SERIAL_8250 is not set -+ -+# -+# Non-8250 serial port support -+# -+CONFIG_SERIAL_COLDFIRE=y -+# CONFIG_SERIAL_MCF is not set -+CONFIG_UNIX98_PTYS=y -+# CONFIG_LEGACY_PTYS is not set -+# CONFIG_IPMI_HANDLER is not set -+# CONFIG_HW_RANDOM is not set -+# CONFIG_GEN_RTC is not set -+# CONFIG_R3964 is not set -+# CONFIG_RAW_DRIVER is not set -+# CONFIG_TCG_TPM is not set -+CONFIG_I2C=y -+CONFIG_I2C_BOARDINFO=y -+CONFIG_I2C_CHARDEV=y -+ -+# -+# I2C Algorithms -+# -+# CONFIG_I2C_ALGOBIT is not set -+# CONFIG_I2C_ALGOPCF is not set -+# CONFIG_I2C_ALGOPCA is not set -+ -+# -+# I2C Hardware Bus support -+# -+# CONFIG_I2C_MCF548x is not set -+CONFIG_I2C_MCF=y -+# CONFIG_I2C_OCORES is not set -+# CONFIG_I2C_PARPORT_LIGHT is not set -+# CONFIG_I2C_SIMTEC is not set -+# CONFIG_I2C_TAOS_EVM is not set -+# CONFIG_I2C_STUB is not set -+ -+# -+# Miscellaneous I2C Chip support -+# -+# CONFIG_DS1682 is not set -+# CONFIG_SENSORS_EEPROM is not set -+# CONFIG_SENSORS_PCF8574 is not set -+# CONFIG_PCF8575 is not set -+# CONFIG_SENSORS_PCF8591 is not set -+# CONFIG_TPS65010 is not set -+# CONFIG_SENSORS_MAX6875 is not set -+# CONFIG_SENSORS_TSL2550 is not set -+# CONFIG_I2C_DEBUG_CORE is not set -+# CONFIG_I2C_DEBUG_ALGO is not set -+# CONFIG_I2C_DEBUG_BUS is not set -+# CONFIG_I2C_DEBUG_CHIP is not set -+ -+# -+# SPI support -+# -+# CONFIG_SPI is not set -+# CONFIG_COLDFIRE_EDMA is not set -+# CONFIG_SPI_MASTER is not set -+# CONFIG_W1 is not set -+# CONFIG_POWER_SUPPLY is not set -+# CONFIG_HWMON is not set -+# CONFIG_THERMAL is not set -+# CONFIG_WATCHDOG is not set -+ -+# -+# Sonics Silicon Backplane -+# -+CONFIG_SSB_POSSIBLE=y -+# CONFIG_SSB is not set -+ -+# -+# Multifunction device drivers -+# -+# CONFIG_MFD_SM501 is not set -+ -+# -+# Multimedia devices -+# -+# CONFIG_VIDEO_DEV is not set -+# CONFIG_DVB_CORE is not set -+CONFIG_DAB=y -+ -+# -+# Graphics support -+# -+# CONFIG_VGASTATE is not set -+CONFIG_VIDEO_OUTPUT_CONTROL=m -+# CONFIG_FB is not set -+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set -+ -+# -+# Display device support -+# -+# CONFIG_DISPLAY_SUPPORT is not set -+ -+# -+# Console display driver support -+# -+CONFIG_DUMMY_CONSOLE=y -+ -+# -+# Sound -+# -+# CONFIG_SOUND is not set -+# CONFIG_HID_SUPPORT is not set -+# CONFIG_USB_SUPPORT is not set -+# CONFIG_MMC is not set -+# CONFIG_MEMSTICK is not set -+# CONFIG_NEW_LEDS is not set -+# CONFIG_RTC_CLASS is not set -+ -+# -+# Userspace I/O -+# -+# CONFIG_UIO is not set -+ -+# -+# Character devices -+# -+# CONFIG_SERIAL_CONSOLE is not set -+ -+# -+# File systems -+# -+CONFIG_EXT2_FS=y -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XIP is not set -+CONFIG_EXT3_FS=y -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_POSIX_ACL is not set -+# CONFIG_EXT3_FS_SECURITY is not set -+# CONFIG_EXT4DEV_FS is not set -+CONFIG_JBD=y -+CONFIG_FS_MBCACHE=y -+# CONFIG_REISERFS_FS is not set -+# CONFIG_JFS_FS is not set -+# CONFIG_FS_POSIX_ACL is not set -+# CONFIG_XFS_FS is not set -+# CONFIG_GFS2_FS is not set -+# CONFIG_OCFS2_FS is not set -+CONFIG_DNOTIFY=y -+# CONFIG_INOTIFY is not set -+# CONFIG_QUOTA is not set -+# CONFIG_AUTOFS_FS is not set -+# CONFIG_AUTOFS4_FS is not set -+# CONFIG_FUSE_FS is not set -+ -+# -+# CD-ROM/DVD Filesystems -+# -+# CONFIG_ISO9660_FS is not set -+# CONFIG_UDF_FS is not set -+ -+# -+# DOS/FAT/NT Filesystems -+# -+CONFIG_FAT_FS=y -+CONFIG_MSDOS_FS=y -+CONFIG_VFAT_FS=y -+CONFIG_FAT_DEFAULT_CODEPAGE=437 -+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" -+CONFIG_NTFS_FS=y -+# CONFIG_NTFS_DEBUG is not set -+CONFIG_NTFS_RW=y -+ -+# -+# Pseudo filesystems -+# -+CONFIG_PROC_FS=y -+# CONFIG_PROC_KCORE is not set -+CONFIG_PROC_SYSCTL=y -+CONFIG_SYSFS=y -+CONFIG_TMPFS=y -+# CONFIG_TMPFS_POSIX_ACL is not set -+# CONFIG_HUGETLB_PAGE is not set -+# CONFIG_CONFIGFS_FS is not set -+ -+# -+# Miscellaneous filesystems -+# -+# CONFIG_ADFS_FS is not set -+# CONFIG_AFFS_FS is not set -+# CONFIG_HFS_FS is not set -+# CONFIG_HFSPLUS_FS is not set -+# CONFIG_BEFS_FS is not set -+# CONFIG_BFS_FS is not set -+# CONFIG_EFS_FS is not set -+# CONFIG_CRAMFS is not set -+# CONFIG_VXFS_FS is not set -+CONFIG_MINIX_FS=y -+# CONFIG_HPFS_FS is not set -+# CONFIG_QNX4FS_FS is not set -+# CONFIG_ROMFS_FS is not set -+# CONFIG_SYSV_FS is not set -+# CONFIG_UFS_FS is not set -+CONFIG_NETWORK_FILESYSTEMS=y -+CONFIG_NFS_FS=y -+# CONFIG_NFS_V3 is not set -+# CONFIG_NFS_V4 is not set -+# CONFIG_NFS_DIRECTIO is not set -+# CONFIG_NFSD is not set -+CONFIG_ROOT_NFS=y -+CONFIG_LOCKD=y -+CONFIG_NFS_COMMON=y -+CONFIG_SUNRPC=y -+# CONFIG_SUNRPC_BIND34 is not set -+# CONFIG_RPCSEC_GSS_KRB5 is not set -+# CONFIG_RPCSEC_GSS_SPKM3 is not set -+# CONFIG_SMB_FS is not set -+# CONFIG_CIFS is not set -+# CONFIG_NCP_FS is not set -+# CONFIG_CODA_FS is not set -+# CONFIG_AFS_FS is not set -+ -+# -+# Partition Types -+# -+CONFIG_PARTITION_ADVANCED=y -+# CONFIG_ACORN_PARTITION is not set -+# CONFIG_OSF_PARTITION is not set -+# CONFIG_AMIGA_PARTITION is not set -+# CONFIG_ATARI_PARTITION is not set -+# CONFIG_MAC_PARTITION is not set -+CONFIG_MSDOS_PARTITION=y -+# CONFIG_BSD_DISKLABEL is not set -+# CONFIG_MINIX_SUBPARTITION is not set -+# CONFIG_SOLARIS_X86_PARTITION is not set -+# CONFIG_UNIXWARE_DISKLABEL is not set -+# CONFIG_LDM_PARTITION is not set -+# CONFIG_SGI_PARTITION is not set -+# CONFIG_ULTRIX_PARTITION is not set -+# CONFIG_SUN_PARTITION is not set -+# CONFIG_KARMA_PARTITION is not set -+# CONFIG_EFI_PARTITION is not set -+# CONFIG_SYSV68_PARTITION is not set -+CONFIG_NLS=y -+CONFIG_NLS_DEFAULT="iso8859-1" -+CONFIG_NLS_CODEPAGE_437=y -+# CONFIG_NLS_CODEPAGE_737 is not set -+# CONFIG_NLS_CODEPAGE_775 is not set -+# CONFIG_NLS_CODEPAGE_850 is not set -+# CONFIG_NLS_CODEPAGE_852 is not set -+# CONFIG_NLS_CODEPAGE_855 is not set -+# CONFIG_NLS_CODEPAGE_857 is not set -+# CONFIG_NLS_CODEPAGE_860 is not set -+# CONFIG_NLS_CODEPAGE_861 is not set -+# CONFIG_NLS_CODEPAGE_862 is not set -+# CONFIG_NLS_CODEPAGE_863 is not set -+# CONFIG_NLS_CODEPAGE_864 is not set -+# CONFIG_NLS_CODEPAGE_865 is not set -+# CONFIG_NLS_CODEPAGE_866 is not set -+# CONFIG_NLS_CODEPAGE_869 is not set -+# CONFIG_NLS_CODEPAGE_936 is not set -+# CONFIG_NLS_CODEPAGE_950 is not set -+# CONFIG_NLS_CODEPAGE_932 is not set -+# CONFIG_NLS_CODEPAGE_949 is not set -+# CONFIG_NLS_CODEPAGE_874 is not set -+# CONFIG_NLS_ISO8859_8 is not set -+# CONFIG_NLS_CODEPAGE_1250 is not set -+# CONFIG_NLS_CODEPAGE_1251 is not set -+# CONFIG_NLS_ASCII is not set -+CONFIG_NLS_ISO8859_1=y -+# CONFIG_NLS_ISO8859_2 is not set -+# CONFIG_NLS_ISO8859_3 is not set -+# CONFIG_NLS_ISO8859_4 is not set -+# CONFIG_NLS_ISO8859_5 is not set -+# CONFIG_NLS_ISO8859_6 is not set -+# CONFIG_NLS_ISO8859_7 is not set -+# CONFIG_NLS_ISO8859_9 is not set -+# CONFIG_NLS_ISO8859_13 is not set -+# CONFIG_NLS_ISO8859_14 is not set -+# CONFIG_NLS_ISO8859_15 is not set -+# CONFIG_NLS_KOI8_R is not set -+# CONFIG_NLS_KOI8_U is not set -+CONFIG_NLS_UTF8=y -+# CONFIG_DLM is not set -+ -+# -+# Kernel hacking -+# -+# CONFIG_PRINTK_TIME is not set -+CONFIG_ENABLE_WARN_DEPRECATED=y -+# CONFIG_ENABLE_MUST_CHECK is not set -+# CONFIG_MAGIC_SYSRQ is not set -+# CONFIG_UNUSED_SYMBOLS is not set -+# CONFIG_DEBUG_FS is not set -+# CONFIG_HEADERS_CHECK is not set -+CONFIG_DEBUG_KERNEL=y -+CONFIG_DETECT_SOFTLOCKUP=y -+CONFIG_SCHED_DEBUG=y -+# CONFIG_SCHEDSTATS is not set -+# CONFIG_TIMER_STATS is not set -+CONFIG_DEBUG_SLAB=y -+# CONFIG_DEBUG_SLAB_LEAK is not set -+# CONFIG_DEBUG_RT_MUTEXES is not set -+# CONFIG_RT_MUTEX_TESTER is not set -+# CONFIG_DEBUG_SPINLOCK is not set -+# CONFIG_DEBUG_MUTEXES is not set -+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set -+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set -+# CONFIG_DEBUG_KOBJECT is not set -+CONFIG_DEBUG_BUGVERBOSE=y -+CONFIG_DEBUG_INFO=y -+# CONFIG_DEBUG_VM is not set -+# CONFIG_DEBUG_LIST is not set -+# CONFIG_DEBUG_SG is not set -+# CONFIG_FRAME_POINTER is not set -+# CONFIG_BOOT_PRINTK_DELAY is not set -+# CONFIG_RCU_TORTURE_TEST is not set -+# CONFIG_BACKTRACE_SELF_TEST is not set -+# CONFIG_FAULT_INJECTION is not set -+# CONFIG_SAMPLES is not set -+CONFIG_BOOTPARAM=y -+CONFIG_BOOTPARAM_STRING="root=/dev/nfs rw nfsroot=172.27.155.1:/tftpboot/redstripe ip=172.27.155.55:172.27.155.1:172.27.255.254:255.255.0.0::eth0:off mtdparts=phys_mapped_flash:16m(User)" -+ -+# -+# Security options -+# -+# CONFIG_KEYS is not set -+# CONFIG_SECURITY is not set -+# CONFIG_SECURITY_FILE_CAPABILITIES is not set -+CONFIG_CRYPTO=y -+CONFIG_CRYPTO_ALGAPI=y -+CONFIG_CRYPTO_AEAD=y -+CONFIG_CRYPTO_BLKCIPHER=y -+# CONFIG_CRYPTO_SEQIV is not set -+CONFIG_CRYPTO_HASH=y -+CONFIG_CRYPTO_MANAGER=y -+CONFIG_CRYPTO_HMAC=y -+# CONFIG_CRYPTO_XCBC is not set -+# CONFIG_CRYPTO_NULL is not set -+# CONFIG_CRYPTO_MD4 is not set -+CONFIG_CRYPTO_MD5=y -+CONFIG_CRYPTO_SHA1=y -+# CONFIG_CRYPTO_SHA256 is not set -+# CONFIG_CRYPTO_SHA512 is not set -+# CONFIG_CRYPTO_WP512 is not set -+# CONFIG_CRYPTO_TGR192 is not set -+# CONFIG_CRYPTO_GF128MUL is not set -+CONFIG_CRYPTO_ECB=y -+CONFIG_CRYPTO_CBC=y -+CONFIG_CRYPTO_PCBC=m -+# CONFIG_CRYPTO_LRW is not set -+# CONFIG_CRYPTO_XTS is not set -+# CONFIG_CRYPTO_CTR is not set -+# CONFIG_CRYPTO_GCM is not set -+# CONFIG_CRYPTO_CCM is not set -+# CONFIG_CRYPTO_CRYPTD is not set -+CONFIG_CRYPTO_DES=y -+# CONFIG_CRYPTO_FCRYPT is not set -+# CONFIG_CRYPTO_BLOWFISH is not set -+# CONFIG_CRYPTO_TWOFISH is not set -+# CONFIG_CRYPTO_SERPENT is not set -+# CONFIG_CRYPTO_AES is not set -+# CONFIG_CRYPTO_CAST5 is not set -+# CONFIG_CRYPTO_CAST6 is not set -+# CONFIG_CRYPTO_TEA is not set -+# CONFIG_CRYPTO_ARC4 is not set -+# CONFIG_CRYPTO_KHAZAD is not set -+# CONFIG_CRYPTO_ANUBIS is not set -+# CONFIG_CRYPTO_SEED is not set -+# CONFIG_CRYPTO_SALSA20 is not set -+# CONFIG_CRYPTO_DEFLATE is not set -+# CONFIG_CRYPTO_MICHAEL_MIC is not set -+# CONFIG_CRYPTO_CRC32C is not set -+# CONFIG_CRYPTO_CAMELLIA is not set -+CONFIG_CRYPTO_TEST=m -+CONFIG_CRYPTO_AUTHENC=y -+# CONFIG_CRYPTO_LZO is not set -+CONFIG_CRYPTO_HW=y -+# CONFIG_CRYPTO_DEV_MCFCAU is not set -+ -+# -+# Library routines -+# -+CONFIG_BITREVERSE=y -+CONFIG_CRC_CCITT=y -+CONFIG_CRC16=y -+# CONFIG_CRC_ITU_T is not set -+CONFIG_CRC32=y -+# CONFIG_CRC7 is not set -+CONFIG_LIBCRC32C=y -+CONFIG_PLIST=y -+CONFIG_HAS_IOMEM=y -+CONFIG_HAS_IOPORT=y -+CONFIG_HAS_DMA=y ---- /dev/null -+++ b/arch/m68k/configs/m54455evb_defconfig -@@ -0,0 +1,1037 @@ -+# -+# Automatically generated make config: don't edit -+# Linux kernel version: 2.6.23 -+# Thu Dec 6 12:14:18 2007 -+# -+CONFIG_M68K=y -+CONFIG_MMU=y -+CONFIG_RWSEM_GENERIC_SPINLOCK=y -+# CONFIG_ARCH_HAS_ILOG2_U32 is not set -+# CONFIG_ARCH_HAS_ILOG2_U64 is not set -+CONFIG_GENERIC_HWEIGHT=y -+CONFIG_GENERIC_CALIBRATE_DELAY=y -+CONFIG_TIME_LOW_RES=y -+CONFIG_GENERIC_IOMAP=y -+CONFIG_NO_IOPORT=y -+# CONFIG_NO_DMA is not set -+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" -+ -+# -+# General setup -+# -+CONFIG_EXPERIMENTAL=y -+CONFIG_BROKEN_ON_SMP=y -+CONFIG_INIT_ENV_ARG_LIMIT=32 -+CONFIG_LOCALVERSION="" -+CONFIG_LOCALVERSION_AUTO=y -+CONFIG_SWAP=y -+CONFIG_SYSVIPC=y -+CONFIG_SYSVIPC_SYSCTL=y -+# CONFIG_POSIX_MQUEUE is not set -+# CONFIG_BSD_PROCESS_ACCT is not set -+# CONFIG_TASKSTATS is not set -+# CONFIG_USER_NS is not set -+# CONFIG_AUDIT is not set -+CONFIG_IKCONFIG=y -+CONFIG_IKCONFIG_PROC=y -+CONFIG_LOG_BUF_SHIFT=17 -+CONFIG_SYSFS_DEPRECATED=y -+# CONFIG_RELAY is not set -+# CONFIG_BLK_DEV_INITRD is not set -+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set -+CONFIG_SYSCTL=y -+# CONFIG_EMBEDDED is not set -+CONFIG_UID16=y -+CONFIG_SYSCTL_SYSCALL=y -+CONFIG_KALLSYMS=y -+# CONFIG_KALLSYMS_ALL is not set -+# CONFIG_KALLSYMS_EXTRA_PASS is not set -+CONFIG_HOTPLUG=y -+CONFIG_PRINTK=y -+CONFIG_BUG=y -+CONFIG_ELF_CORE=y -+CONFIG_BASE_FULL=y -+CONFIG_FUTEX=y -+CONFIG_ANON_INODES=y -+CONFIG_EPOLL=y -+CONFIG_SIGNALFD=y -+CONFIG_EVENTFD=y -+CONFIG_SHMEM=y -+CONFIG_VM_EVENT_COUNTERS=y -+CONFIG_SLAB=y -+# CONFIG_SLUB is not set -+# CONFIG_SLOB is not set -+CONFIG_RT_MUTEXES=y -+# CONFIG_TINY_SHMEM is not set -+CONFIG_BASE_SMALL=0 -+CONFIG_MODULES=y -+CONFIG_MODULE_UNLOAD=y -+CONFIG_MODULE_FORCE_UNLOAD=y -+# CONFIG_MODVERSIONS is not set -+# CONFIG_MODULE_SRCVERSION_ALL is not set -+# CONFIG_KMOD is not set -+CONFIG_BLOCK=y -+CONFIG_LBD=y -+# CONFIG_BLK_DEV_IO_TRACE is not set -+# CONFIG_LSF is not set -+# CONFIG_BLK_DEV_BSG is not set -+ -+# -+# IO Schedulers -+# -+CONFIG_IOSCHED_NOOP=y -+CONFIG_IOSCHED_AS=y -+CONFIG_IOSCHED_DEADLINE=y -+CONFIG_IOSCHED_CFQ=y -+# CONFIG_DEFAULT_AS is not set -+# CONFIG_DEFAULT_DEADLINE is not set -+CONFIG_DEFAULT_CFQ=y -+# CONFIG_DEFAULT_NOOP is not set -+CONFIG_DEFAULT_IOSCHED="cfq" -+ -+# -+# Platform dependent setup -+# -+# CONFIG_SUN3 is not set -+CONFIG_COLDFIRE=y -+CONFIG_CFV4E=y -+# CONFIG_AMIGA is not set -+# CONFIG_ATARI is not set -+# CONFIG_MAC is not set -+# CONFIG_APOLLO is not set -+# CONFIG_VME is not set -+# CONFIG_HP300 is not set -+# CONFIG_SUN3X is not set -+# CONFIG_Q40 is not set -+ -+# -+# Processor type -+# -+# CONFIG_M68020 is not set -+# CONFIG_M68030 is not set -+# CONFIG_M68040 is not set -+# CONFIG_M68060 is not set -+CONFIG_M54455=y -+CONFIG_MCFCLK=266666666 -+# CONFIG_MCF_USER_HALT is not set -+CONFIG_MMU_CFV4E=y -+CONFIG_SDRAM_BASE=0x40000000 -+CONFIG_SDRAM_SIZE=0x0FFFFFFF -+CONFIG_NOR_FLASH_BASE=0x00000000 -+# CONFIG_M68KFPU_EMU is not set -+CONFIG_ADVANCED=y -+# CONFIG_RMW_INSNS is not set -+CONFIG_SINGLE_MEMORY_CHUNK=y -+# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set -+CONFIG_SELECT_MEMORY_MODEL=y -+CONFIG_FLATMEM_MANUAL=y -+# CONFIG_DISCONTIGMEM_MANUAL is not set -+# CONFIG_SPARSEMEM_MANUAL is not set -+CONFIG_FLATMEM=y -+CONFIG_FLAT_NODE_MEM_MAP=y -+CONFIG_NEED_MULTIPLE_NODES=y -+# CONFIG_SPARSEMEM_STATIC is not set -+CONFIG_SPLIT_PTLOCK_CPUS=4 -+# CONFIG_RESOURCES_64BIT is not set -+CONFIG_ZONE_DMA_FLAG=1 -+CONFIG_BOUNCE=y -+CONFIG_VIRT_TO_BUS=y -+ -+# -+# General setup -+# -+CONFIG_BINFMT_ELF=y -+# CONFIG_BINFMT_AOUT is not set -+# CONFIG_BINFMT_MISC is not set -+CONFIG_PROC_HARDWARE=y -+CONFIG_ZONE_DMA=y -+# CONFIG_ARCH_SUPPORTS_MSI is not set -+ -+# -+# Power management options -+# -+# CONFIG_PM is not set -+ -+# -+# Networking -+# -+CONFIG_NET=y -+ -+# -+# Networking options -+# -+CONFIG_PACKET=y -+# CONFIG_PACKET_MMAP is not set -+CONFIG_UNIX=y -+CONFIG_XFRM=y -+# CONFIG_XFRM_USER is not set -+# CONFIG_XFRM_SUB_POLICY is not set -+# CONFIG_XFRM_MIGRATE is not set -+CONFIG_NET_KEY=y -+# CONFIG_NET_KEY_MIGRATE is not set -+CONFIG_INET=y -+# CONFIG_IP_MULTICAST is not set -+CONFIG_IP_ADVANCED_ROUTER=y -+CONFIG_ASK_IP_FIB_HASH=y -+# CONFIG_IP_FIB_TRIE is not set -+CONFIG_IP_FIB_HASH=y -+# CONFIG_IP_MULTIPLE_TABLES is not set -+# CONFIG_IP_ROUTE_MULTIPATH is not set -+# CONFIG_IP_ROUTE_VERBOSE is not set -+CONFIG_IP_PNP=y -+# CONFIG_IP_PNP_DHCP is not set -+# CONFIG_IP_PNP_BOOTP is not set -+# CONFIG_IP_PNP_RARP is not set -+# CONFIG_NET_IPIP is not set -+# CONFIG_NET_IPGRE is not set -+# CONFIG_ARPD is not set -+# CONFIG_SYN_COOKIES is not set -+CONFIG_INET_AH=y -+CONFIG_INET_ESP=y -+# CONFIG_INET_IPCOMP is not set -+# CONFIG_INET_XFRM_TUNNEL is not set -+# CONFIG_INET_TUNNEL is not set -+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set -+# CONFIG_INET_XFRM_MODE_TUNNEL is not set -+# CONFIG_INET_XFRM_MODE_BEET is not set -+CONFIG_INET_DIAG=y -+CONFIG_INET_TCP_DIAG=y -+# CONFIG_TCP_CONG_ADVANCED is not set -+CONFIG_TCP_CONG_CUBIC=y -+CONFIG_DEFAULT_TCP_CONG="cubic" -+# CONFIG_TCP_MD5SIG is not set -+# CONFIG_IPV6 is not set -+# CONFIG_INET6_XFRM_TUNNEL is not set -+# CONFIG_INET6_TUNNEL is not set -+# CONFIG_NETWORK_SECMARK is not set -+# CONFIG_NETFILTER is not set -+# CONFIG_IP_DCCP is not set -+# CONFIG_IP_SCTP is not set -+# CONFIG_TIPC is not set -+# CONFIG_ATM is not set -+# CONFIG_BRIDGE is not set -+# CONFIG_VLAN_8021Q is not set -+# CONFIG_DECNET is not set -+# CONFIG_LLC2 is not set -+# CONFIG_IPX is not set -+# CONFIG_ATALK is not set -+# CONFIG_X25 is not set -+# CONFIG_LAPB is not set -+# CONFIG_ECONET is not set -+# CONFIG_WAN_ROUTER is not set -+ -+# -+# QoS and/or fair queueing -+# -+# CONFIG_NET_SCHED is not set -+ -+# -+# Network testing -+# -+# CONFIG_NET_PKTGEN is not set -+# CONFIG_HAMRADIO is not set -+# CONFIG_IRDA is not set -+# CONFIG_BT is not set -+# CONFIG_AF_RXRPC is not set -+ -+# -+# Wireless -+# -+# CONFIG_CFG80211 is not set -+# CONFIG_WIRELESS_EXT is not set -+# CONFIG_MAC80211 is not set -+# CONFIG_IEEE80211 is not set -+# CONFIG_RFKILL is not set -+# CONFIG_NET_9P is not set -+ -+# -+# Device Drivers -+# -+ -+# -+# Generic Driver Options -+# -+# CONFIG_STANDALONE is not set -+CONFIG_PREVENT_FIRMWARE_BUILD=y -+CONFIG_FW_LOADER=y -+# CONFIG_DEBUG_DRIVER is not set -+# CONFIG_DEBUG_DEVRES is not set -+# CONFIG_SYS_HYPERVISOR is not set -+# CONFIG_CONNECTOR is not set -+CONFIG_MTD=y -+CONFIG_MTD_DEBUG=y -+CONFIG_MTD_DEBUG_VERBOSE=0 -+CONFIG_MTD_CONCAT=y -+CONFIG_MTD_PARTITIONS=y -+# CONFIG_MTD_REDBOOT_PARTS is not set -+CONFIG_MTD_CMDLINE_PARTS=y -+ -+# -+# User Modules And Translation Layers -+# -+CONFIG_MTD_CHAR=y -+CONFIG_MTD_BLKDEVS=y -+CONFIG_MTD_BLOCK=y -+# CONFIG_FTL is not set -+# CONFIG_NFTL is not set -+# CONFIG_INFTL is not set -+# CONFIG_RFD_FTL is not set -+# CONFIG_SSFDC is not set -+ -+# -+# RAM/ROM/Flash chip drivers -+# -+CONFIG_MTD_CFI=y -+# CONFIG_MTD_JEDECPROBE is not set -+CONFIG_MTD_GEN_PROBE=y -+CONFIG_MTD_CFI_ADV_OPTIONS=y -+CONFIG_MTD_CFI_NOSWAP=y -+# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set -+# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set -+CONFIG_MTD_CFI_GEOMETRY=y -+CONFIG_MTD_MAP_BANK_WIDTH_1=y -+# CONFIG_MTD_MAP_BANK_WIDTH_2 is not set -+# CONFIG_MTD_MAP_BANK_WIDTH_4 is not set -+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set -+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set -+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set -+CONFIG_MTD_CFI_I1=y -+# CONFIG_MTD_CFI_I2 is not set -+# CONFIG_MTD_CFI_I4 is not set -+# CONFIG_MTD_CFI_I8 is not set -+# CONFIG_MTD_OTP is not set -+CONFIG_MTD_CFI_INTELEXT=y -+# CONFIG_MTD_CFI_AMDSTD is not set -+# CONFIG_MTD_CFI_STAA is not set -+CONFIG_MTD_CFI_UTIL=y -+# CONFIG_MTD_RAM is not set -+# CONFIG_MTD_ROM is not set -+# CONFIG_MTD_ABSENT is not set -+ -+# -+# Mapping drivers for chip access -+# -+# CONFIG_MTD_COMPLEX_MAPPINGS is not set -+CONFIG_MTD_PHYSMAP=y -+CONFIG_MTD_PHYSMAP_START=0x00000000 -+CONFIG_MTD_PHYSMAP_LEN=0x1000000 -+CONFIG_MTD_PHYSMAP_BANKWIDTH=1 -+# CONFIG_MTD_PLATRAM is not set -+ -+# -+# Self-contained MTD device drivers -+# -+# CONFIG_MTD_DATAFLASH is not set -+# CONFIG_MTD_M25P80 is not set -+# CONFIG_MTD_SLRAM is not set -+# CONFIG_MTD_PHRAM is not set -+# CONFIG_MTD_MTDRAM is not set -+# CONFIG_MTD_BLOCK2MTD is not set -+ -+# -+# Disk-On-Chip Device Drivers -+# -+# CONFIG_MTD_DOC2000 is not set -+# CONFIG_MTD_DOC2001 is not set -+# CONFIG_MTD_DOC2001PLUS is not set -+# CONFIG_MTD_NAND is not set -+# CONFIG_MTD_ONENAND is not set -+ -+# -+# UBI - Unsorted block images -+# -+# CONFIG_MTD_UBI is not set -+# CONFIG_PARPORT is not set -+CONFIG_BLK_DEV=y -+# CONFIG_BLK_DEV_COW_COMMON is not set -+CONFIG_BLK_DEV_LOOP=y -+# CONFIG_BLK_DEV_CRYPTOLOOP is not set -+# CONFIG_BLK_DEV_NBD is not set -+# CONFIG_BLK_DEV_UB is not set -+CONFIG_BLK_DEV_RAM=y -+CONFIG_BLK_DEV_RAM_COUNT=16 -+CONFIG_BLK_DEV_RAM_SIZE=64000 -+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 -+# CONFIG_CDROM_PKTCDVD is not set -+# CONFIG_ATA_OVER_ETH is not set -+CONFIG_MISC_DEVICES=y -+# CONFIG_EEPROM_93CX6 is not set -+# CONFIG_IDE is not set -+ -+# -+# SCSI device support -+# -+# CONFIG_RAID_ATTRS is not set -+CONFIG_SCSI=y -+CONFIG_SCSI_DMA=y -+# CONFIG_SCSI_TGT is not set -+# CONFIG_SCSI_NETLINK is not set -+CONFIG_SCSI_PROC_FS=y -+ -+# -+# SCSI support type (disk, tape, CD-ROM) -+# -+CONFIG_BLK_DEV_SD=y -+# CONFIG_CHR_DEV_ST is not set -+# CONFIG_CHR_DEV_OSST is not set -+# CONFIG_BLK_DEV_SR is not set -+# CONFIG_CHR_DEV_SG is not set -+# CONFIG_CHR_DEV_SCH is not set -+ -+# -+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs -+# -+CONFIG_SCSI_MULTI_LUN=y -+# CONFIG_SCSI_CONSTANTS is not set -+# CONFIG_SCSI_LOGGING is not set -+# CONFIG_SCSI_SCAN_ASYNC is not set -+CONFIG_SCSI_WAIT_SCAN=m -+ -+# -+# SCSI Transports -+# -+# CONFIG_SCSI_SPI_ATTRS is not set -+# CONFIG_SCSI_FC_ATTRS is not set -+# CONFIG_SCSI_ISCSI_ATTRS is not set -+# CONFIG_SCSI_SAS_LIBSAS is not set -+CONFIG_SCSI_LOWLEVEL=y -+# CONFIG_ISCSI_TCP is not set -+# CONFIG_SCSI_DEBUG is not set -+CONFIG_ATA=m -+# CONFIG_ATA_NONSTANDARD is not set -+CONFIG_PATA_FSL=m -+# CONFIG_MD is not set -+CONFIG_NETDEVICES=y -+# CONFIG_NETDEVICES_MULTIQUEUE is not set -+# CONFIG_DUMMY is not set -+# CONFIG_BONDING is not set -+# CONFIG_MACVLAN is not set -+# CONFIG_EQUALIZER is not set -+# CONFIG_TUN is not set -+# CONFIG_PHYLIB is not set -+CONFIG_NET_ETHERNET=y -+CONFIG_MII=y -+CONFIG_FEC=y -+# CONFIG_FEC2 is not set -+CONFIG_NETDEV_1000=y -+CONFIG_NETDEV_10000=y -+ -+# -+# Wireless LAN -+# -+# CONFIG_WLAN_PRE80211 is not set -+# CONFIG_WLAN_80211 is not set -+ -+# -+# USB Network Adapters -+# -+# CONFIG_USB_CATC is not set -+# CONFIG_USB_KAWETH is not set -+CONFIG_USB_PEGASUS=m -+CONFIG_USB_RTL8150=m -+CONFIG_USB_USBNET_MII=m -+CONFIG_USB_USBNET=m -+CONFIG_USB_NET_AX8817X=m -+CONFIG_USB_NET_CDCETHER=m -+# CONFIG_USB_NET_DM9601 is not set -+# CONFIG_USB_NET_GL620A is not set -+# CONFIG_USB_NET_NET1080 is not set -+# CONFIG_USB_NET_PLUSB is not set -+# CONFIG_USB_NET_MCS7830 is not set -+# CONFIG_USB_NET_RNDIS_HOST is not set -+# CONFIG_USB_NET_CDC_SUBSET is not set -+# CONFIG_USB_NET_ZAURUS is not set -+# CONFIG_WAN is not set -+# CONFIG_PPP is not set -+# CONFIG_SLIP is not set -+# CONFIG_SHAPER is not set -+# CONFIG_NETCONSOLE is not set -+# CONFIG_NETPOLL is not set -+# CONFIG_NET_POLL_CONTROLLER is not set -+# CONFIG_ISDN is not set -+# CONFIG_PHONE is not set -+ -+# -+# Input device support -+# -+CONFIG_INPUT=y -+# CONFIG_INPUT_FF_MEMLESS is not set -+# CONFIG_INPUT_POLLDEV is not set -+ -+# -+# Userland interfaces -+# -+CONFIG_INPUT_MOUSEDEV=y -+# CONFIG_INPUT_MOUSEDEV_PSAUX is not set -+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 -+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 -+# CONFIG_INPUT_JOYDEV is not set -+# CONFIG_INPUT_TSDEV is not set -+CONFIG_INPUT_EVDEV=y -+# CONFIG_INPUT_EVBUG is not set -+ -+# -+# Input Device Drivers -+# -+CONFIG_INPUT_KEYBOARD=y -+# CONFIG_KEYBOARD_ATKBD is not set -+# CONFIG_KEYBOARD_SUNKBD is not set -+# CONFIG_KEYBOARD_LKKBD is not set -+# CONFIG_KEYBOARD_XTKBD is not set -+# CONFIG_KEYBOARD_NEWTON is not set -+# CONFIG_KEYBOARD_STOWAWAY is not set -+# CONFIG_INPUT_MOUSE is not set -+# CONFIG_INPUT_JOYSTICK is not set -+# CONFIG_INPUT_TABLET is not set -+# CONFIG_INPUT_TOUCHSCREEN is not set -+# CONFIG_INPUT_MISC is not set -+ -+# -+# Hardware I/O ports -+# -+CONFIG_SERIO=y -+CONFIG_SERIO_SERPORT=y -+# CONFIG_SERIO_RAW is not set -+# CONFIG_GAMEPORT is not set -+ -+# -+# Character devices -+# -+CONFIG_VT=y -+CONFIG_VT_CONSOLE=y -+CONFIG_HW_CONSOLE=y -+# CONFIG_VT_HW_CONSOLE_BINDING is not set -+# CONFIG_SERIAL_NONSTANDARD is not set -+ -+# -+# Serial drivers -+# -+# CONFIG_SERIAL_8250 is not set -+ -+# -+# Non-8250 serial port support -+# -+CONFIG_SERIAL_COLDFIRE=y -+CONFIG_UNIX98_PTYS=y -+# CONFIG_LEGACY_PTYS is not set -+# CONFIG_IPMI_HANDLER is not set -+# CONFIG_WATCHDOG is not set -+# CONFIG_HW_RANDOM is not set -+# CONFIG_GEN_RTC is not set -+# CONFIG_R3964 is not set -+# CONFIG_RAW_DRIVER is not set -+# CONFIG_TCG_TPM is not set -+# CONFIG_I2C is not set -+ -+# -+# SPI support -+# -+CONFIG_SPI=y -+# CONFIG_SPI_DEBUG is not set -+CONFIG_COLDFIRE_EDMA=y -+CONFIG_SPI_MASTER=y -+ -+# -+# SPI Master Controller Drivers -+# -+# CONFIG_SPI_BITBANG is not set -+CONFIG_SPI_COLDFIRE=y -+CONFIG_SPI_COLDFIRE_DSPI_EDMA=y -+ -+# -+# SPI Protocol Masters -+# -+# CONFIG_SPI_AT25 is not set -+# CONFIG_SPI_SPIDEV is not set -+# CONFIG_SPI_TLE62X0 is not set -+CONFIG_SPI_COLDFIRE_SSI_AUDIO=y -+# CONFIG_SSIAUDIO_USE_EDMA is not set -+# CONFIG_W1 is not set -+# CONFIG_POWER_SUPPLY is not set -+# CONFIG_HWMON is not set -+ -+# -+# Multifunction device drivers -+# -+# CONFIG_MFD_SM501 is not set -+ -+# -+# Multimedia devices -+# -+# CONFIG_VIDEO_DEV is not set -+# CONFIG_DVB_CORE is not set -+CONFIG_DAB=y -+# CONFIG_USB_DABUSB is not set -+ -+# -+# Graphics support -+# -+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set -+ -+# -+# Display device support -+# -+# CONFIG_DISPLAY_SUPPORT is not set -+# CONFIG_VGASTATE is not set -+CONFIG_VIDEO_OUTPUT_CONTROL=m -+# CONFIG_FB is not set -+ -+# -+# Console display driver support -+# -+CONFIG_DUMMY_CONSOLE=y -+ -+# -+# Sound -+# -+# CONFIG_SOUND is not set -+CONFIG_HID_SUPPORT=y -+CONFIG_HID=y -+CONFIG_HID_DEBUG=y -+ -+# -+# USB Input Devices -+# -+CONFIG_USB_HID=y -+# CONFIG_USB_HIDINPUT_POWERBOOK is not set -+# CONFIG_HID_FF is not set -+# CONFIG_USB_HIDDEV is not set -+CONFIG_USB_SUPPORT=y -+CONFIG_USB_ARCH_HAS_HCD=y -+# CONFIG_USB_ARCH_HAS_OHCI is not set -+CONFIG_USB_ARCH_HAS_EHCI=y -+CONFIG_USB=y -+# CONFIG_USB_DEBUG is not set -+ -+# -+# Miscellaneous USB options -+# -+CONFIG_USB_DEVICEFS=y -+# CONFIG_USB_DEVICE_CLASS is not set -+# CONFIG_USB_DYNAMIC_MINORS is not set -+# CONFIG_USB_OTG is not set -+ -+# -+# USB Host Controller Drivers -+# -+CONFIG_USB_EHCI_HCD=m -+CONFIG_USB_EHCI_SPLIT_ISO=y -+CONFIG_USB_EHCI_ROOT_HUB_TT=y -+# CONFIG_USB_EHCI_TT_NEWSCHED is not set -+CONFIG_USB_EHCI_BIG_ENDIAN_MMIO=y -+CONFIG_USB_EHCI_BIG_ENDIAN_DESC=y -+# CONFIG_USB_ISP116X_HCD is not set -+# CONFIG_USB_SL811_HCD is not set -+# CONFIG_USB_R8A66597_HCD is not set -+CONFIG_USB_M5445X_ULPI=y -+# CONFIG_USB_M5445X_FSLS is not set -+ -+# -+# USB Device Class drivers -+# -+# CONFIG_USB_ACM is not set -+# CONFIG_USB_PRINTER is not set -+ -+# -+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' -+# -+ -+# -+# may also be needed; see USB_STORAGE Help for more information -+# -+CONFIG_USB_STORAGE=y -+# CONFIG_USB_STORAGE_DEBUG is not set -+# CONFIG_USB_STORAGE_DATAFAB is not set -+# CONFIG_USB_STORAGE_FREECOM is not set -+# CONFIG_USB_STORAGE_DPCM is not set -+# CONFIG_USB_STORAGE_USBAT is not set -+# CONFIG_USB_STORAGE_SDDR09 is not set -+# CONFIG_USB_STORAGE_SDDR55 is not set -+# CONFIG_USB_STORAGE_JUMPSHOT is not set -+# CONFIG_USB_STORAGE_ALAUDA is not set -+# CONFIG_USB_STORAGE_ONETOUCH is not set -+# CONFIG_USB_STORAGE_KARMA is not set -+# CONFIG_USB_LIBUSUAL is not set -+ -+# -+# USB Imaging devices -+# -+# CONFIG_USB_MDC800 is not set -+# CONFIG_USB_MICROTEK is not set -+# CONFIG_USB_MON is not set -+ -+# -+# USB port drivers -+# -+ -+# -+# USB Serial Converter support -+# -+# CONFIG_USB_SERIAL is not set -+ -+# -+# USB Miscellaneous drivers -+# -+# CONFIG_USB_EMI62 is not set -+# CONFIG_USB_EMI26 is not set -+# CONFIG_USB_ADUTUX is not set -+# CONFIG_USB_AUERSWALD is not set -+# CONFIG_USB_RIO500 is not set -+# CONFIG_USB_LEGOTOWER is not set -+# CONFIG_USB_LCD is not set -+# CONFIG_USB_BERRY_CHARGE is not set -+# CONFIG_USB_LED is not set -+# CONFIG_USB_CYPRESS_CY7C63 is not set -+# CONFIG_USB_CYTHERM is not set -+# CONFIG_USB_PHIDGET is not set -+# CONFIG_USB_IDMOUSE is not set -+# CONFIG_USB_FTDI_ELAN is not set -+# CONFIG_USB_APPLEDISPLAY is not set -+# CONFIG_USB_SISUSBVGA is not set -+# CONFIG_USB_LD is not set -+# CONFIG_USB_TRANCEVIBRATOR is not set -+# CONFIG_USB_IOWARRIOR is not set -+# CONFIG_USB_TEST is not set -+ -+# -+# USB DSL modem support -+# -+ -+# -+# USB Gadget Support -+# -+CONFIG_USB_GADGET=m -+# CONFIG_USB_GADGET_DEBUG is not set -+# CONFIG_USB_GADGET_DEBUG_FILES is not set -+CONFIG_USB_GADGET_SELECTED=y -+# CONFIG_USB_GADGET_AMD5536UDC is not set -+# CONFIG_USB_GADGET_FSL_USB2 is not set -+# CONFIG_USB_GADGET_NET2280 is not set -+# CONFIG_USB_GADGET_PXA2XX is not set -+# CONFIG_USB_GADGET_M66592 is not set -+CONFIG_USB_GADGET_MCF5445X=y -+CONFIG_USB_MCF5445X=m -+# CONFIG_USB_GADGET_GOKU is not set -+# CONFIG_USB_GADGET_LH7A40X is not set -+# CONFIG_USB_GADGET_OMAP is not set -+# CONFIG_USB_GADGET_S3C2410 is not set -+# CONFIG_USB_GADGET_AT91 is not set -+# CONFIG_USB_GADGET_DUMMY_HCD is not set -+CONFIG_USB_GADGET_DUALSPEED=y -+# CONFIG_USB_ZERO is not set -+CONFIG_USB_ETH=m -+CONFIG_USB_ETH_RNDIS=y -+CONFIG_USB_GADGETFS=m -+CONFIG_USB_FILE_STORAGE=m -+# CONFIG_USB_FILE_STORAGE_TEST is not set -+# CONFIG_USB_G_SERIAL is not set -+# CONFIG_USB_MIDI_GADGET is not set -+# CONFIG_MMC is not set -+# CONFIG_NEW_LEDS is not set -+# CONFIG_RTC_CLASS is not set -+ -+# -+# DMA Engine support -+# -+# CONFIG_DMA_ENGINE is not set -+ -+# -+# DMA Clients -+# -+ -+# -+# DMA Devices -+# -+ -+# -+# Userspace I/O -+# -+# CONFIG_UIO is not set -+ -+# -+# Character devices -+# -+# CONFIG_SERIAL_CONSOLE is not set -+ -+# -+# File systems -+# -+CONFIG_EXT2_FS=y -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XIP is not set -+CONFIG_EXT3_FS=y -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_POSIX_ACL is not set -+# CONFIG_EXT3_FS_SECURITY is not set -+# CONFIG_EXT4DEV_FS is not set -+CONFIG_JBD=y -+# CONFIG_JBD_DEBUG is not set -+CONFIG_FS_MBCACHE=y -+# CONFIG_REISERFS_FS is not set -+# CONFIG_JFS_FS is not set -+# CONFIG_FS_POSIX_ACL is not set -+# CONFIG_XFS_FS is not set -+# CONFIG_GFS2_FS is not set -+# CONFIG_OCFS2_FS is not set -+CONFIG_MINIX_FS=y -+# CONFIG_ROMFS_FS is not set -+# CONFIG_INOTIFY is not set -+# CONFIG_QUOTA is not set -+CONFIG_DNOTIFY=y -+# CONFIG_AUTOFS_FS is not set -+# CONFIG_AUTOFS4_FS is not set -+# CONFIG_FUSE_FS is not set -+ -+# -+# CD-ROM/DVD Filesystems -+# -+# CONFIG_ISO9660_FS is not set -+# CONFIG_UDF_FS is not set -+ -+# -+# DOS/FAT/NT Filesystems -+# -+CONFIG_FAT_FS=y -+CONFIG_MSDOS_FS=y -+CONFIG_VFAT_FS=y -+CONFIG_FAT_DEFAULT_CODEPAGE=437 -+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" -+CONFIG_NTFS_FS=y -+# CONFIG_NTFS_DEBUG is not set -+CONFIG_NTFS_RW=y -+ -+# -+# Pseudo filesystems -+# -+CONFIG_PROC_FS=y -+# CONFIG_PROC_KCORE is not set -+CONFIG_PROC_SYSCTL=y -+CONFIG_SYSFS=y -+CONFIG_TMPFS=y -+# CONFIG_TMPFS_POSIX_ACL is not set -+# CONFIG_HUGETLB_PAGE is not set -+CONFIG_RAMFS=y -+# CONFIG_CONFIGFS_FS is not set -+ -+# -+# Miscellaneous filesystems -+# -+# CONFIG_ADFS_FS is not set -+# CONFIG_AFFS_FS is not set -+# CONFIG_HFS_FS is not set -+# CONFIG_HFSPLUS_FS is not set -+# CONFIG_BEFS_FS is not set -+# CONFIG_BFS_FS is not set -+# CONFIG_EFS_FS is not set -+CONFIG_JFFS2_FS=y -+CONFIG_JFFS2_FS_DEBUG=0 -+CONFIG_JFFS2_FS_WRITEBUFFER=y -+# CONFIG_JFFS2_SUMMARY is not set -+# CONFIG_JFFS2_FS_XATTR is not set -+# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set -+CONFIG_JFFS2_ZLIB=y -+CONFIG_JFFS2_RTIME=y -+# CONFIG_JFFS2_RUBIN is not set -+# CONFIG_CRAMFS is not set -+# CONFIG_VXFS_FS is not set -+# CONFIG_HPFS_FS is not set -+# CONFIG_QNX4FS_FS is not set -+# CONFIG_SYSV_FS is not set -+# CONFIG_UFS_FS is not set -+ -+# -+# Network File Systems -+# -+CONFIG_NFS_FS=y -+# CONFIG_NFS_V3 is not set -+# CONFIG_NFS_V4 is not set -+# CONFIG_NFS_DIRECTIO is not set -+# CONFIG_NFSD is not set -+CONFIG_ROOT_NFS=y -+CONFIG_LOCKD=y -+CONFIG_NFS_COMMON=y -+CONFIG_SUNRPC=y -+# CONFIG_SUNRPC_BIND34 is not set -+# CONFIG_RPCSEC_GSS_KRB5 is not set -+# CONFIG_RPCSEC_GSS_SPKM3 is not set -+# CONFIG_SMB_FS is not set -+# CONFIG_CIFS is not set -+# CONFIG_NCP_FS is not set -+# CONFIG_CODA_FS is not set -+# CONFIG_AFS_FS is not set -+ -+# -+# Partition Types -+# -+CONFIG_PARTITION_ADVANCED=y -+# CONFIG_ACORN_PARTITION is not set -+# CONFIG_OSF_PARTITION is not set -+# CONFIG_AMIGA_PARTITION is not set -+# CONFIG_ATARI_PARTITION is not set -+# CONFIG_MAC_PARTITION is not set -+CONFIG_MSDOS_PARTITION=y -+# CONFIG_BSD_DISKLABEL is not set -+# CONFIG_MINIX_SUBPARTITION is not set -+# CONFIG_SOLARIS_X86_PARTITION is not set -+# CONFIG_UNIXWARE_DISKLABEL is not set -+# CONFIG_LDM_PARTITION is not set -+# CONFIG_SGI_PARTITION is not set -+# CONFIG_ULTRIX_PARTITION is not set -+# CONFIG_SUN_PARTITION is not set -+# CONFIG_KARMA_PARTITION is not set -+# CONFIG_EFI_PARTITION is not set -+# CONFIG_SYSV68_PARTITION is not set -+ -+# -+# Native Language Support -+# -+CONFIG_NLS=y -+CONFIG_NLS_DEFAULT="iso8859-1" -+CONFIG_NLS_CODEPAGE_437=y -+# CONFIG_NLS_CODEPAGE_737 is not set -+# CONFIG_NLS_CODEPAGE_775 is not set -+# CONFIG_NLS_CODEPAGE_850 is not set -+# CONFIG_NLS_CODEPAGE_852 is not set -+# CONFIG_NLS_CODEPAGE_855 is not set -+# CONFIG_NLS_CODEPAGE_857 is not set -+# CONFIG_NLS_CODEPAGE_860 is not set -+# CONFIG_NLS_CODEPAGE_861 is not set -+# CONFIG_NLS_CODEPAGE_862 is not set -+# CONFIG_NLS_CODEPAGE_863 is not set -+# CONFIG_NLS_CODEPAGE_864 is not set -+# CONFIG_NLS_CODEPAGE_865 is not set -+# CONFIG_NLS_CODEPAGE_866 is not set -+# CONFIG_NLS_CODEPAGE_869 is not set -+# CONFIG_NLS_CODEPAGE_936 is not set -+# CONFIG_NLS_CODEPAGE_950 is not set -+# CONFIG_NLS_CODEPAGE_932 is not set -+# CONFIG_NLS_CODEPAGE_949 is not set -+# CONFIG_NLS_CODEPAGE_874 is not set -+# CONFIG_NLS_ISO8859_8 is not set -+# CONFIG_NLS_CODEPAGE_1250 is not set -+# CONFIG_NLS_CODEPAGE_1251 is not set -+# CONFIG_NLS_ASCII is not set -+CONFIG_NLS_ISO8859_1=y -+# CONFIG_NLS_ISO8859_2 is not set -+# CONFIG_NLS_ISO8859_3 is not set -+# CONFIG_NLS_ISO8859_4 is not set -+# CONFIG_NLS_ISO8859_5 is not set -+# CONFIG_NLS_ISO8859_6 is not set -+# CONFIG_NLS_ISO8859_7 is not set -+# CONFIG_NLS_ISO8859_9 is not set -+# CONFIG_NLS_ISO8859_13 is not set -+# CONFIG_NLS_ISO8859_14 is not set -+# CONFIG_NLS_ISO8859_15 is not set -+# CONFIG_NLS_KOI8_R is not set -+# CONFIG_NLS_KOI8_U is not set -+CONFIG_NLS_UTF8=y -+ -+# -+# Distributed Lock Manager -+# -+# CONFIG_DLM is not set -+ -+# -+# Kernel hacking -+# -+# CONFIG_PRINTK_TIME is not set -+# CONFIG_ENABLE_MUST_CHECK is not set -+# CONFIG_MAGIC_SYSRQ is not set -+# CONFIG_UNUSED_SYMBOLS is not set -+# CONFIG_DEBUG_FS is not set -+# CONFIG_HEADERS_CHECK is not set -+CONFIG_DEBUG_KERNEL=y -+CONFIG_DETECT_SOFTLOCKUP=y -+CONFIG_SCHED_DEBUG=y -+# CONFIG_SCHEDSTATS is not set -+# CONFIG_TIMER_STATS is not set -+CONFIG_DEBUG_SLAB=y -+# CONFIG_DEBUG_SLAB_LEAK is not set -+# CONFIG_DEBUG_RT_MUTEXES is not set -+# CONFIG_RT_MUTEX_TESTER is not set -+# CONFIG_DEBUG_SPINLOCK is not set -+# CONFIG_DEBUG_MUTEXES is not set -+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set -+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set -+# CONFIG_DEBUG_KOBJECT is not set -+CONFIG_DEBUG_BUGVERBOSE=y -+CONFIG_DEBUG_INFO=y -+# CONFIG_DEBUG_VM is not set -+# CONFIG_DEBUG_LIST is not set -+# CONFIG_FRAME_POINTER is not set -+CONFIG_FORCED_INLINING=y -+# CONFIG_RCU_TORTURE_TEST is not set -+# CONFIG_FAULT_INJECTION is not set -+CONFIG_BOOTPARAM=y -+CONFIG_BOOTPARAM_STRING="root=/dev/nfs rw nfsroot=172.27.155.1:/tftpboot/redstripe ip=172.27.155.55:172.27.155.1:172.27.255.254:255.255.0.0::eth0:off mtdparts=phys_mapped_flash:16m(User)" -+ -+# -+# CodeTEST Setup -+# -+# CONFIG_CODETEST is not set -+ -+# -+# Security options -+# -+# CONFIG_KEYS is not set -+# CONFIG_SECURITY is not set -+CONFIG_CRYPTO=y -+CONFIG_CRYPTO_ALGAPI=y -+CONFIG_CRYPTO_BLKCIPHER=y -+CONFIG_CRYPTO_HASH=y -+CONFIG_CRYPTO_MANAGER=y -+CONFIG_CRYPTO_HMAC=y -+# CONFIG_CRYPTO_XCBC is not set -+# CONFIG_CRYPTO_NULL is not set -+# CONFIG_CRYPTO_MD4 is not set -+CONFIG_CRYPTO_MD5=y -+CONFIG_CRYPTO_SHA1=y -+# CONFIG_CRYPTO_SHA256 is not set -+# CONFIG_CRYPTO_SHA512 is not set -+# CONFIG_CRYPTO_WP512 is not set -+# CONFIG_CRYPTO_TGR192 is not set -+# CONFIG_CRYPTO_GF128MUL is not set -+CONFIG_CRYPTO_ECB=y -+CONFIG_CRYPTO_CBC=y -+CONFIG_CRYPTO_PCBC=m -+# CONFIG_CRYPTO_LRW is not set -+# CONFIG_CRYPTO_CRYPTD is not set -+CONFIG_CRYPTO_DES=y -+# CONFIG_CRYPTO_FCRYPT is not set -+# CONFIG_CRYPTO_BLOWFISH is not set -+# CONFIG_CRYPTO_TWOFISH is not set -+# CONFIG_CRYPTO_SERPENT is not set -+# CONFIG_CRYPTO_AES is not set -+# CONFIG_CRYPTO_CAST5 is not set -+# CONFIG_CRYPTO_CAST6 is not set -+# CONFIG_CRYPTO_TEA is not set -+# CONFIG_CRYPTO_ARC4 is not set -+# CONFIG_CRYPTO_KHAZAD is not set -+# CONFIG_CRYPTO_ANUBIS is not set -+# CONFIG_CRYPTO_DEFLATE is not set -+# CONFIG_CRYPTO_MICHAEL_MIC is not set -+# CONFIG_CRYPTO_CRC32C is not set -+# CONFIG_CRYPTO_CAMELLIA is not set -+CONFIG_CRYPTO_TEST=m -+CONFIG_CRYPTO_HW=y -+CONFIG_CRYPTO_DEV_MCFCAU=y -+CONFIG_CRYPTO_DEV_MCFCAU_DES=y -+CONFIG_CRYPTO_DEV_MCFCAU_AES=y -+CONFIG_CRYPTO_DEV_MCFCAU_MD5=y -+CONFIG_CRYPTO_DEV_MCFCAU_SHA1=y -+ -+# -+# Library routines -+# -+CONFIG_BITREVERSE=y -+CONFIG_CRC_CCITT=y -+CONFIG_CRC16=y -+# CONFIG_CRC_ITU_T is not set -+CONFIG_CRC32=y -+# CONFIG_CRC7 is not set -+CONFIG_LIBCRC32C=y -+CONFIG_ZLIB_INFLATE=y -+CONFIG_ZLIB_DEFLATE=y -+CONFIG_PLIST=y -+CONFIG_HAS_IOMEM=y -+CONFIG_HAS_DMA=y ---- /dev/null -+++ b/arch/m68k/configs/m5475evb_defconfig -@@ -0,0 +1,954 @@ -+# -+# Automatically generated make config: don't edit -+# Linux kernel version: 2.6.25 -+# Wed Jul 9 16:09:19 2008 -+# -+CONFIG_M68K=y -+CONFIG_MMU=y -+# CONFIG_GENERIC_TIME is not set -+# CONFIG_GENERIC_CLOCKEVENTS is not set -+CONFIG_RWSEM_GENERIC_SPINLOCK=y -+# CONFIG_ARCH_HAS_ILOG2_U32 is not set -+# CONFIG_ARCH_HAS_ILOG2_U64 is not set -+CONFIG_GENERIC_HWEIGHT=y -+CONFIG_GENERIC_CALIBRATE_DELAY=y -+CONFIG_TIME_LOW_RES=y -+CONFIG_GENERIC_IOMAP=y -+# CONFIG_NO_IOPORT is not set -+# CONFIG_NO_DMA is not set -+CONFIG_ARCH_SUPPORTS_AOUT=y -+CONFIG_HZ=100 -+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" -+ -+# -+# General setup -+# -+CONFIG_EXPERIMENTAL=y -+CONFIG_BROKEN_ON_SMP=y -+CONFIG_INIT_ENV_ARG_LIMIT=32 -+CONFIG_LOCALVERSION="" -+CONFIG_LOCALVERSION_AUTO=y -+CONFIG_SWAP=y -+CONFIG_SYSVIPC=y -+CONFIG_SYSVIPC_SYSCTL=y -+# CONFIG_POSIX_MQUEUE is not set -+# CONFIG_BSD_PROCESS_ACCT is not set -+# CONFIG_TASKSTATS is not set -+# CONFIG_AUDIT is not set -+CONFIG_IKCONFIG=y -+CONFIG_IKCONFIG_PROC=y -+CONFIG_LOG_BUF_SHIFT=17 -+# CONFIG_CGROUPS is not set -+CONFIG_GROUP_SCHED=y -+CONFIG_FAIR_GROUP_SCHED=y -+# CONFIG_RT_GROUP_SCHED is not set -+CONFIG_USER_SCHED=y -+# CONFIG_CGROUP_SCHED is not set -+CONFIG_SYSFS_DEPRECATED=y -+CONFIG_SYSFS_DEPRECATED_V2=y -+# CONFIG_RELAY is not set -+CONFIG_NAMESPACES=y -+# CONFIG_UTS_NS is not set -+# CONFIG_IPC_NS is not set -+# CONFIG_USER_NS is not set -+# CONFIG_PID_NS is not set -+# CONFIG_BLK_DEV_INITRD is not set -+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set -+CONFIG_SYSCTL=y -+# CONFIG_EMBEDDED is not set -+CONFIG_UID16=y -+CONFIG_SYSCTL_SYSCALL=y -+CONFIG_KALLSYMS=y -+# CONFIG_KALLSYMS_ALL is not set -+# CONFIG_KALLSYMS_EXTRA_PASS is not set -+CONFIG_HOTPLUG=y -+CONFIG_PRINTK=y -+CONFIG_BUG=y -+CONFIG_ELF_CORE=y -+CONFIG_COMPAT_BRK=y -+CONFIG_BASE_FULL=y -+CONFIG_FUTEX=y -+CONFIG_ANON_INODES=y -+CONFIG_EPOLL=y -+CONFIG_SIGNALFD=y -+CONFIG_TIMERFD=y -+CONFIG_EVENTFD=y -+CONFIG_SHMEM=y -+CONFIG_VM_EVENT_COUNTERS=y -+CONFIG_SLAB=y -+# CONFIG_SLUB is not set -+# CONFIG_SLOB is not set -+# CONFIG_PROFILING is not set -+# CONFIG_MARKERS is not set -+# CONFIG_HAVE_OPROFILE is not set -+# CONFIG_HAVE_KPROBES is not set -+# CONFIG_HAVE_KRETPROBES is not set -+CONFIG_PROC_PAGE_MONITOR=y -+CONFIG_SLABINFO=y -+CONFIG_RT_MUTEXES=y -+# CONFIG_TINY_SHMEM is not set -+CONFIG_BASE_SMALL=0 -+CONFIG_MODULES=y -+CONFIG_MODULE_UNLOAD=y -+CONFIG_MODULE_FORCE_UNLOAD=y -+# CONFIG_MODVERSIONS is not set -+# CONFIG_MODULE_SRCVERSION_ALL is not set -+# CONFIG_KMOD is not set -+CONFIG_BLOCK=y -+CONFIG_LBD=y -+# CONFIG_BLK_DEV_IO_TRACE is not set -+# CONFIG_LSF is not set -+# CONFIG_BLK_DEV_BSG is not set -+ -+# -+# IO Schedulers -+# -+CONFIG_IOSCHED_NOOP=y -+CONFIG_IOSCHED_AS=y -+CONFIG_IOSCHED_DEADLINE=y -+CONFIG_IOSCHED_CFQ=y -+# CONFIG_DEFAULT_AS is not set -+# CONFIG_DEFAULT_DEADLINE is not set -+CONFIG_DEFAULT_CFQ=y -+# CONFIG_DEFAULT_NOOP is not set -+CONFIG_DEFAULT_IOSCHED="cfq" -+CONFIG_CLASSIC_RCU=y -+ -+# -+# Platform dependent setup -+# -+# CONFIG_SUN3 is not set -+CONFIG_COLDFIRE=y -+CONFIG_CFV4E=y -+CONFIG_MCD_DMA=y -+# CONFIG_AMIGA is not set -+# CONFIG_ATARI is not set -+CONFIG_PCI=y -+# CONFIG_MAC is not set -+# CONFIG_APOLLO is not set -+# CONFIG_VME is not set -+# CONFIG_HP300 is not set -+# CONFIG_SUN3X is not set -+# CONFIG_Q40 is not set -+ -+# -+# Processor type -+# -+# CONFIG_M68020 is not set -+# CONFIG_M68030 is not set -+# CONFIG_M68040 is not set -+# CONFIG_M68060 is not set -+# CONFIG_M5445X is not set -+CONFIG_M547X_8X=y -+CONFIG_M547X=y -+# CONFIG_M548X is not set -+# CONFIG_M5475AFE is not set -+# CONFIG_M5475BFE is not set -+CONFIG_M5475CFE=y -+# CONFIG_M5475DFE is not set -+# CONFIG_M5475EFE is not set -+# CONFIG_M5475FFE is not set -+# CONFIG_M5485AFE is not set -+# CONFIG_M5485BFE is not set -+# CONFIG_M5485CFE is not set -+# CONFIG_M5485DFE is not set -+# CONFIG_M5485EFE is not set -+# CONFIG_M5485FFE is not set -+CONFIG_MCFCLK=266000000 -+# CONFIG_MCF_USER_HALT is not set -+CONFIG_MMU_CFV4E=y -+CONFIG_SDRAM_BASE=0x00000000 -+CONFIG_SDRAM_SIZE=0x04000000 -+CONFIG_NOR_FLASH_BASE=0xE0000000 -+# CONFIG_M68KFPU_EMU is not set -+CONFIG_ADVANCED=y -+# CONFIG_RMW_INSNS is not set -+CONFIG_SINGLE_MEMORY_CHUNK=y -+# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set -+CONFIG_SELECT_MEMORY_MODEL=y -+CONFIG_FLATMEM_MANUAL=y -+# CONFIG_DISCONTIGMEM_MANUAL is not set -+# CONFIG_SPARSEMEM_MANUAL is not set -+CONFIG_FLATMEM=y -+CONFIG_FLAT_NODE_MEM_MAP=y -+CONFIG_NEED_MULTIPLE_NODES=y -+# CONFIG_SPARSEMEM_STATIC is not set -+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set -+CONFIG_SPLIT_PTLOCK_CPUS=4 -+# CONFIG_RESOURCES_64BIT is not set -+CONFIG_ZONE_DMA_FLAG=1 -+CONFIG_BOUNCE=y -+CONFIG_VIRT_TO_BUS=y -+ -+# -+# General setup -+# -+CONFIG_BINFMT_ELF=y -+# CONFIG_BINFMT_AOUT is not set -+# CONFIG_BINFMT_MISC is not set -+CONFIG_PROC_HARDWARE=y -+CONFIG_ZONE_DMA=y -+# CONFIG_ARCH_SUPPORTS_MSI is not set -+CONFIG_PCI_LEGACY=y -+# CONFIG_PCI_DEBUG is not set -+ -+# -+# Power management options -+# -+# CONFIG_PM is not set -+ -+# -+# Networking -+# -+CONFIG_NET=y -+ -+# -+# Networking options -+# -+CONFIG_PACKET=y -+# CONFIG_PACKET_MMAP is not set -+CONFIG_UNIX=y -+CONFIG_XFRM=y -+# CONFIG_XFRM_USER is not set -+# CONFIG_XFRM_SUB_POLICY is not set -+# CONFIG_XFRM_MIGRATE is not set -+# CONFIG_XFRM_STATISTICS is not set -+CONFIG_NET_KEY=y -+# CONFIG_NET_KEY_MIGRATE is not set -+CONFIG_INET=y -+# CONFIG_IP_MULTICAST is not set -+CONFIG_IP_ADVANCED_ROUTER=y -+CONFIG_ASK_IP_FIB_HASH=y -+# CONFIG_IP_FIB_TRIE is not set -+CONFIG_IP_FIB_HASH=y -+# CONFIG_IP_MULTIPLE_TABLES is not set -+# CONFIG_IP_ROUTE_MULTIPATH is not set -+# CONFIG_IP_ROUTE_VERBOSE is not set -+CONFIG_IP_PNP=y -+# CONFIG_IP_PNP_DHCP is not set -+# CONFIG_IP_PNP_BOOTP is not set -+# CONFIG_IP_PNP_RARP is not set -+# CONFIG_NET_IPIP is not set -+# CONFIG_NET_IPGRE is not set -+# CONFIG_ARPD is not set -+# CONFIG_SYN_COOKIES is not set -+CONFIG_INET_AH=y -+CONFIG_INET_ESP=y -+# CONFIG_INET_IPCOMP is not set -+# CONFIG_INET_XFRM_TUNNEL is not set -+# CONFIG_INET_TUNNEL is not set -+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set -+# CONFIG_INET_XFRM_MODE_TUNNEL is not set -+# CONFIG_INET_XFRM_MODE_BEET is not set -+# CONFIG_INET_LRO is not set -+CONFIG_INET_DIAG=y -+CONFIG_INET_TCP_DIAG=y -+# CONFIG_TCP_CONG_ADVANCED is not set -+CONFIG_TCP_CONG_CUBIC=y -+CONFIG_DEFAULT_TCP_CONG="cubic" -+# CONFIG_TCP_MD5SIG is not set -+# CONFIG_IPV6 is not set -+# CONFIG_INET6_XFRM_TUNNEL is not set -+# CONFIG_INET6_TUNNEL is not set -+# CONFIG_NETWORK_SECMARK is not set -+# CONFIG_NETFILTER is not set -+# CONFIG_IP_DCCP is not set -+# CONFIG_IP_SCTP is not set -+# CONFIG_TIPC is not set -+# CONFIG_ATM is not set -+# CONFIG_BRIDGE is not set -+# CONFIG_VLAN_8021Q is not set -+# CONFIG_DECNET is not set -+# CONFIG_LLC2 is not set -+# CONFIG_IPX is not set -+# CONFIG_ATALK is not set -+# CONFIG_X25 is not set -+# CONFIG_LAPB is not set -+# CONFIG_ECONET is not set -+# CONFIG_WAN_ROUTER is not set -+# CONFIG_NET_SCHED is not set -+ -+# -+# Network testing -+# -+# CONFIG_NET_PKTGEN is not set -+# CONFIG_HAMRADIO is not set -+CONFIG_CAN=y -+CONFIG_CAN_RAW=y -+# CONFIG_CAN_BCM is not set -+ -+# -+# CAN Device Drivers -+# -+# CONFIG_CAN_VCAN is not set -+CONFIG_CAN_FLEXCAN=y -+CONFIG_CAN_MCF547X_8X=y -+# CONFIG_CAN_DEBUG_DEVICES is not set -+# CONFIG_IRDA is not set -+# CONFIG_BT is not set -+# CONFIG_AF_RXRPC is not set -+ -+# -+# Wireless -+# -+# CONFIG_CFG80211 is not set -+# CONFIG_WIRELESS_EXT is not set -+# CONFIG_MAC80211 is not set -+# CONFIG_IEEE80211 is not set -+# CONFIG_RFKILL is not set -+# CONFIG_NET_9P is not set -+ -+# -+# Device Drivers -+# -+ -+# -+# Generic Driver Options -+# -+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" -+# CONFIG_STANDALONE is not set -+CONFIG_PREVENT_FIRMWARE_BUILD=y -+CONFIG_FW_LOADER=y -+# CONFIG_DEBUG_DRIVER is not set -+# CONFIG_DEBUG_DEVRES is not set -+# CONFIG_SYS_HYPERVISOR is not set -+# CONFIG_CONNECTOR is not set -+CONFIG_MTD=y -+# CONFIG_MTD_DEBUG is not set -+# CONFIG_MTD_CONCAT is not set -+CONFIG_MTD_PARTITIONS=y -+# CONFIG_MTD_REDBOOT_PARTS is not set -+CONFIG_MTD_CMDLINE_PARTS=y -+ -+# -+# User Modules And Translation Layers -+# -+# CONFIG_MTD_CHAR is not set -+CONFIG_MTD_BLKDEVS=y -+CONFIG_MTD_BLOCK=y -+# CONFIG_FTL is not set -+# CONFIG_NFTL is not set -+# CONFIG_INFTL is not set -+# CONFIG_RFD_FTL is not set -+# CONFIG_SSFDC is not set -+# CONFIG_MTD_OOPS is not set -+ -+# -+# RAM/ROM/Flash chip drivers -+# -+# CONFIG_MTD_CFI is not set -+# CONFIG_MTD_JEDECPROBE is not set -+CONFIG_MTD_MAP_BANK_WIDTH_1=y -+CONFIG_MTD_MAP_BANK_WIDTH_2=y -+CONFIG_MTD_MAP_BANK_WIDTH_4=y -+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set -+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set -+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set -+CONFIG_MTD_CFI_I1=y -+CONFIG_MTD_CFI_I2=y -+# CONFIG_MTD_CFI_I4 is not set -+# CONFIG_MTD_CFI_I8 is not set -+CONFIG_MTD_RAM=y -+CONFIG_MTD_ROM=y -+# CONFIG_MTD_ABSENT is not set -+ -+# -+# Mapping drivers for chip access -+# -+# CONFIG_MTD_COMPLEX_MAPPINGS is not set -+# CONFIG_MTD_PHYSMAP is not set -+# CONFIG_MTD_INTEL_VR_NOR is not set -+# CONFIG_MTD_PLATRAM is not set -+ -+# -+# Self-contained MTD device drivers -+# -+# CONFIG_MTD_PMC551 is not set -+# CONFIG_MTD_DATAFLASH is not set -+# CONFIG_MTD_M25P80 is not set -+# CONFIG_MTD_SLRAM is not set -+# CONFIG_MTD_PHRAM is not set -+# CONFIG_MTD_MTDRAM is not set -+# CONFIG_MTD_BLOCK2MTD is not set -+ -+# -+# Disk-On-Chip Device Drivers -+# -+# CONFIG_MTD_DOC2000 is not set -+# CONFIG_MTD_DOC2001 is not set -+# CONFIG_MTD_DOC2001PLUS is not set -+# CONFIG_MTD_NAND is not set -+# CONFIG_MTD_ONENAND is not set -+ -+# -+# UBI - Unsorted block images -+# -+# CONFIG_MTD_UBI is not set -+# CONFIG_PARPORT is not set -+CONFIG_BLK_DEV=y -+# CONFIG_BLK_CPQ_DA is not set -+# CONFIG_BLK_CPQ_CISS_DA is not set -+# CONFIG_BLK_DEV_DAC960 is not set -+# CONFIG_BLK_DEV_UMEM is not set -+# CONFIG_BLK_DEV_COW_COMMON is not set -+CONFIG_BLK_DEV_LOOP=y -+# CONFIG_BLK_DEV_CRYPTOLOOP is not set -+# CONFIG_BLK_DEV_NBD is not set -+# CONFIG_BLK_DEV_SX8 is not set -+CONFIG_BLK_DEV_RAM=y -+CONFIG_BLK_DEV_RAM_COUNT=16 -+CONFIG_BLK_DEV_RAM_SIZE=64000 -+# CONFIG_BLK_DEV_XIP is not set -+# CONFIG_CDROM_PKTCDVD is not set -+# CONFIG_ATA_OVER_ETH is not set -+CONFIG_MISC_DEVICES=y -+CONFIG_COLDFIRE_SEC=y -+CONFIG_SEC_DEVICE=y -+# CONFIG_PHANTOM is not set -+# CONFIG_EEPROM_93CX6 is not set -+# CONFIG_SGI_IOC4 is not set -+# CONFIG_TIFM_CORE is not set -+# CONFIG_ENCLOSURE_SERVICES is not set -+CONFIG_HAVE_IDE=y -+# CONFIG_IDE is not set -+ -+# -+# SCSI device support -+# -+# CONFIG_RAID_ATTRS is not set -+CONFIG_SCSI=y -+CONFIG_SCSI_DMA=y -+# CONFIG_SCSI_TGT is not set -+# CONFIG_SCSI_NETLINK is not set -+CONFIG_SCSI_PROC_FS=y -+ -+# -+# SCSI support type (disk, tape, CD-ROM) -+# -+CONFIG_BLK_DEV_SD=y -+# CONFIG_CHR_DEV_ST is not set -+# CONFIG_CHR_DEV_OSST is not set -+# CONFIG_BLK_DEV_SR is not set -+# CONFIG_CHR_DEV_SG is not set -+# CONFIG_CHR_DEV_SCH is not set -+ -+# -+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs -+# -+CONFIG_SCSI_MULTI_LUN=y -+# CONFIG_SCSI_CONSTANTS is not set -+# CONFIG_SCSI_LOGGING is not set -+# CONFIG_SCSI_SCAN_ASYNC is not set -+CONFIG_SCSI_WAIT_SCAN=m -+ -+# -+# SCSI Transports -+# -+# CONFIG_SCSI_SPI_ATTRS is not set -+# CONFIG_SCSI_FC_ATTRS is not set -+# CONFIG_SCSI_ISCSI_ATTRS is not set -+# CONFIG_SCSI_SAS_LIBSAS is not set -+# CONFIG_SCSI_SRP_ATTRS is not set -+# CONFIG_SCSI_LOWLEVEL is not set -+# CONFIG_ATA is not set -+# CONFIG_MD is not set -+# CONFIG_FUSION is not set -+ -+# -+# IEEE 1394 (FireWire) support -+# -+# CONFIG_FIREWIRE is not set -+# CONFIG_IEEE1394 is not set -+# CONFIG_I2O is not set -+CONFIG_NETDEVICES=y -+# CONFIG_NETDEVICES_MULTIQUEUE is not set -+# CONFIG_DUMMY is not set -+# CONFIG_BONDING is not set -+# CONFIG_MACVLAN is not set -+# CONFIG_EQUALIZER is not set -+# CONFIG_TUN is not set -+# CONFIG_VETH is not set -+# CONFIG_ARCNET is not set -+# CONFIG_PHYLIB is not set -+CONFIG_NET_ETHERNET=y -+CONFIG_MII=y -+CONFIG_FEC_548x=y -+CONFIG_FEC_548x_AUTO_NEGOTIATION=y -+# CONFIG_FEC_548x_ENABLE_FEC2 is not set -+# CONFIG_HAPPYMEAL is not set -+# CONFIG_SUNGEM is not set -+# CONFIG_CASSINI is not set -+# CONFIG_NET_VENDOR_3COM is not set -+# CONFIG_ENC28J60 is not set -+# CONFIG_NET_TULIP is not set -+# CONFIG_HP100 is not set -+# CONFIG_IBM_NEW_EMAC_ZMII is not set -+# CONFIG_IBM_NEW_EMAC_RGMII is not set -+# CONFIG_IBM_NEW_EMAC_TAH is not set -+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set -+# CONFIG_NET_PCI is not set -+# CONFIG_B44 is not set -+# CONFIG_NETDEV_1000 is not set -+# CONFIG_NETDEV_10000 is not set -+# CONFIG_TR is not set -+ -+# -+# Wireless LAN -+# -+# CONFIG_WLAN_PRE80211 is not set -+# CONFIG_WLAN_80211 is not set -+# CONFIG_WAN is not set -+# CONFIG_FDDI is not set -+# CONFIG_HIPPI is not set -+# CONFIG_PPP is not set -+# CONFIG_SLIP is not set -+# CONFIG_NET_FC is not set -+# CONFIG_NETCONSOLE is not set -+# CONFIG_NETPOLL is not set -+# CONFIG_NET_POLL_CONTROLLER is not set -+# CONFIG_ISDN is not set -+# CONFIG_PHONE is not set -+ -+# -+# Input device support -+# -+CONFIG_INPUT=y -+# CONFIG_INPUT_FF_MEMLESS is not set -+# CONFIG_INPUT_POLLDEV is not set -+ -+# -+# Userland interfaces -+# -+CONFIG_INPUT_MOUSEDEV=y -+# CONFIG_INPUT_MOUSEDEV_PSAUX is not set -+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 -+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 -+# CONFIG_INPUT_JOYDEV is not set -+CONFIG_INPUT_EVDEV=y -+# CONFIG_INPUT_EVBUG is not set -+ -+# -+# Input Device Drivers -+# -+CONFIG_INPUT_KEYBOARD=y -+# CONFIG_KEYBOARD_ATKBD is not set -+# CONFIG_KEYBOARD_SUNKBD is not set -+# CONFIG_KEYBOARD_LKKBD is not set -+# CONFIG_KEYBOARD_XTKBD is not set -+# CONFIG_KEYBOARD_NEWTON is not set -+# CONFIG_KEYBOARD_STOWAWAY is not set -+# CONFIG_INPUT_MOUSE is not set -+# CONFIG_INPUT_JOYSTICK is not set -+# CONFIG_INPUT_TABLET is not set -+# CONFIG_INPUT_TOUCHSCREEN is not set -+# CONFIG_INPUT_MISC is not set -+ -+# -+# Hardware I/O ports -+# -+CONFIG_SERIO=y -+CONFIG_SERIO_SERPORT=y -+# CONFIG_SERIO_PCIPS2 is not set -+# CONFIG_SERIO_RAW is not set -+# CONFIG_GAMEPORT is not set -+ -+# -+# Character devices -+# -+CONFIG_VT=y -+CONFIG_VT_CONSOLE=y -+CONFIG_HW_CONSOLE=y -+# CONFIG_VT_HW_CONSOLE_BINDING is not set -+# CONFIG_SERIAL_NONSTANDARD is not set -+# CONFIG_NOZOMI is not set -+ -+# -+# Serial drivers -+# -+# CONFIG_SERIAL_8250 is not set -+ -+# -+# Non-8250 serial port support -+# -+CONFIG_SERIAL_COLDFIRE=y -+CONFIG_SERIAL_COLDFIRE_IRDA=y -+# CONFIG_SERIAL_MCF is not set -+# CONFIG_SERIAL_JSM is not set -+CONFIG_UNIX98_PTYS=y -+# CONFIG_LEGACY_PTYS is not set -+# CONFIG_IPMI_HANDLER is not set -+# CONFIG_HW_RANDOM is not set -+# CONFIG_GEN_RTC is not set -+# CONFIG_R3964 is not set -+# CONFIG_APPLICOM is not set -+# CONFIG_RAW_DRIVER is not set -+# CONFIG_TCG_TPM is not set -+# CONFIG_I2C is not set -+ -+# -+# SPI support -+# -+CONFIG_SPI=y -+CONFIG_SPI_DEBUG=y -+# CONFIG_COLDFIRE_EDMA is not set -+CONFIG_SPI_MASTER=y -+ -+# -+# SPI Master Controller Drivers -+# -+# CONFIG_SPI_BITBANG is not set -+CONFIG_SPI_COLDFIRE=y -+ -+# -+# SPI Protocol Masters -+# -+# CONFIG_SPI_AT25 is not set -+# CONFIG_SPI_SPIDEV is not set -+# CONFIG_SPI_TLE62X0 is not set -+# CONFIG_SPI_COLDFIRE_SSI_AUDIO is not set -+# CONFIG_W1 is not set -+# CONFIG_POWER_SUPPLY is not set -+# CONFIG_HWMON is not set -+# CONFIG_THERMAL is not set -+CONFIG_WATCHDOG=y -+# CONFIG_WATCHDOG_NOWAYOUT is not set -+ -+# -+# Watchdog Device Drivers -+# -+# CONFIG_SOFT_WATCHDOG is not set -+CONFIG_COLDFIRE_WATCHDOG=m -+ -+# -+# PCI-based Watchdog Cards -+# -+# CONFIG_PCIPCWATCHDOG is not set -+# CONFIG_WDTPCI is not set -+ -+# -+# Sonics Silicon Backplane -+# -+CONFIG_SSB_POSSIBLE=y -+# CONFIG_SSB is not set -+ -+# -+# Multifunction device drivers -+# -+# CONFIG_MFD_SM501 is not set -+ -+# -+# Multimedia devices -+# -+# CONFIG_VIDEO_DEV is not set -+# CONFIG_DVB_CORE is not set -+CONFIG_DAB=y -+ -+# -+# Graphics support -+# -+# CONFIG_DRM is not set -+# CONFIG_VGASTATE is not set -+CONFIG_VIDEO_OUTPUT_CONTROL=m -+# CONFIG_FB is not set -+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set -+ -+# -+# Display device support -+# -+# CONFIG_DISPLAY_SUPPORT is not set -+ -+# -+# Console display driver support -+# -+CONFIG_DUMMY_CONSOLE=y -+ -+# -+# Sound -+# -+# CONFIG_SOUND is not set -+CONFIG_HID_SUPPORT=y -+CONFIG_HID=y -+CONFIG_HID_DEBUG=y -+# CONFIG_HIDRAW is not set -+# CONFIG_USB_SUPPORT is not set -+# CONFIG_MMC is not set -+# CONFIG_MEMSTICK is not set -+# CONFIG_NEW_LEDS is not set -+# CONFIG_INFINIBAND is not set -+# CONFIG_RTC_CLASS is not set -+ -+# -+# Userspace I/O -+# -+# CONFIG_UIO is not set -+ -+# -+# Character devices -+# -+# CONFIG_SERIAL_CONSOLE is not set -+ -+# -+# File systems -+# -+CONFIG_EXT2_FS=y -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XIP is not set -+CONFIG_EXT3_FS=y -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_POSIX_ACL is not set -+# CONFIG_EXT3_FS_SECURITY is not set -+# CONFIG_EXT4DEV_FS is not set -+CONFIG_JBD=y -+CONFIG_FS_MBCACHE=y -+# CONFIG_REISERFS_FS is not set -+# CONFIG_JFS_FS is not set -+# CONFIG_FS_POSIX_ACL is not set -+# CONFIG_XFS_FS is not set -+# CONFIG_GFS2_FS is not set -+# CONFIG_OCFS2_FS is not set -+CONFIG_DNOTIFY=y -+# CONFIG_INOTIFY is not set -+# CONFIG_QUOTA is not set -+# CONFIG_AUTOFS_FS is not set -+# CONFIG_AUTOFS4_FS is not set -+# CONFIG_FUSE_FS is not set -+ -+# -+# CD-ROM/DVD Filesystems -+# -+# CONFIG_ISO9660_FS is not set -+# CONFIG_UDF_FS is not set -+ -+# -+# DOS/FAT/NT Filesystems -+# -+CONFIG_FAT_FS=y -+CONFIG_MSDOS_FS=y -+CONFIG_VFAT_FS=y -+CONFIG_FAT_DEFAULT_CODEPAGE=437 -+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" -+CONFIG_NTFS_FS=y -+# CONFIG_NTFS_DEBUG is not set -+CONFIG_NTFS_RW=y -+ -+# -+# Pseudo filesystems -+# -+CONFIG_PROC_FS=y -+# CONFIG_PROC_KCORE is not set -+CONFIG_PROC_SYSCTL=y -+CONFIG_SYSFS=y -+CONFIG_TMPFS=y -+# CONFIG_TMPFS_POSIX_ACL is not set -+# CONFIG_HUGETLB_PAGE is not set -+# CONFIG_CONFIGFS_FS is not set -+ -+# -+# Miscellaneous filesystems -+# -+# CONFIG_ADFS_FS is not set -+# CONFIG_AFFS_FS is not set -+# CONFIG_HFS_FS is not set -+# CONFIG_HFSPLUS_FS is not set -+# CONFIG_BEFS_FS is not set -+# CONFIG_BFS_FS is not set -+# CONFIG_EFS_FS is not set -+# CONFIG_JFFS2_FS is not set -+# CONFIG_CRAMFS is not set -+# CONFIG_VXFS_FS is not set -+CONFIG_MINIX_FS=y -+# CONFIG_HPFS_FS is not set -+# CONFIG_QNX4FS_FS is not set -+CONFIG_ROMFS_FS=y -+# CONFIG_SYSV_FS is not set -+# CONFIG_UFS_FS is not set -+CONFIG_NETWORK_FILESYSTEMS=y -+CONFIG_NFS_FS=y -+# CONFIG_NFS_V3 is not set -+# CONFIG_NFS_V4 is not set -+# CONFIG_NFS_DIRECTIO is not set -+# CONFIG_NFSD is not set -+CONFIG_ROOT_NFS=y -+CONFIG_LOCKD=y -+CONFIG_NFS_COMMON=y -+CONFIG_SUNRPC=y -+# CONFIG_SUNRPC_BIND34 is not set -+# CONFIG_RPCSEC_GSS_KRB5 is not set -+# CONFIG_RPCSEC_GSS_SPKM3 is not set -+# CONFIG_SMB_FS is not set -+# CONFIG_CIFS is not set -+# CONFIG_NCP_FS is not set -+# CONFIG_CODA_FS is not set -+# CONFIG_AFS_FS is not set -+ -+# -+# Partition Types -+# -+CONFIG_PARTITION_ADVANCED=y -+# CONFIG_ACORN_PARTITION is not set -+# CONFIG_OSF_PARTITION is not set -+# CONFIG_AMIGA_PARTITION is not set -+# CONFIG_ATARI_PARTITION is not set -+# CONFIG_MAC_PARTITION is not set -+CONFIG_MSDOS_PARTITION=y -+# CONFIG_BSD_DISKLABEL is not set -+# CONFIG_MINIX_SUBPARTITION is not set -+# CONFIG_SOLARIS_X86_PARTITION is not set -+# CONFIG_UNIXWARE_DISKLABEL is not set -+# CONFIG_LDM_PARTITION is not set -+# CONFIG_SGI_PARTITION is not set -+# CONFIG_ULTRIX_PARTITION is not set -+# CONFIG_SUN_PARTITION is not set -+# CONFIG_KARMA_PARTITION is not set -+# CONFIG_EFI_PARTITION is not set -+# CONFIG_SYSV68_PARTITION is not set -+CONFIG_NLS=y -+CONFIG_NLS_DEFAULT="iso8859-1" -+CONFIG_NLS_CODEPAGE_437=y -+# CONFIG_NLS_CODEPAGE_737 is not set -+# CONFIG_NLS_CODEPAGE_775 is not set -+# CONFIG_NLS_CODEPAGE_850 is not set -+# CONFIG_NLS_CODEPAGE_852 is not set -+# CONFIG_NLS_CODEPAGE_855 is not set -+# CONFIG_NLS_CODEPAGE_857 is not set -+# CONFIG_NLS_CODEPAGE_860 is not set -+# CONFIG_NLS_CODEPAGE_861 is not set -+# CONFIG_NLS_CODEPAGE_862 is not set -+# CONFIG_NLS_CODEPAGE_863 is not set -+# CONFIG_NLS_CODEPAGE_864 is not set -+# CONFIG_NLS_CODEPAGE_865 is not set -+# CONFIG_NLS_CODEPAGE_866 is not set -+# CONFIG_NLS_CODEPAGE_869 is not set -+# CONFIG_NLS_CODEPAGE_936 is not set -+# CONFIG_NLS_CODEPAGE_950 is not set -+# CONFIG_NLS_CODEPAGE_932 is not set -+# CONFIG_NLS_CODEPAGE_949 is not set -+# CONFIG_NLS_CODEPAGE_874 is not set -+# CONFIG_NLS_ISO8859_8 is not set -+# CONFIG_NLS_CODEPAGE_1250 is not set -+# CONFIG_NLS_CODEPAGE_1251 is not set -+# CONFIG_NLS_ASCII is not set -+CONFIG_NLS_ISO8859_1=y -+# CONFIG_NLS_ISO8859_2 is not set -+# CONFIG_NLS_ISO8859_3 is not set -+# CONFIG_NLS_ISO8859_4 is not set -+# CONFIG_NLS_ISO8859_5 is not set -+# CONFIG_NLS_ISO8859_6 is not set -+# CONFIG_NLS_ISO8859_7 is not set -+# CONFIG_NLS_ISO8859_9 is not set -+# CONFIG_NLS_ISO8859_13 is not set -+# CONFIG_NLS_ISO8859_14 is not set -+# CONFIG_NLS_ISO8859_15 is not set -+# CONFIG_NLS_KOI8_R is not set -+# CONFIG_NLS_KOI8_U is not set -+CONFIG_NLS_UTF8=y -+# CONFIG_DLM is not set -+ -+# -+# Kernel hacking -+# -+# CONFIG_PRINTK_TIME is not set -+CONFIG_ENABLE_WARN_DEPRECATED=y -+# CONFIG_ENABLE_MUST_CHECK is not set -+# CONFIG_MAGIC_SYSRQ is not set -+# CONFIG_UNUSED_SYMBOLS is not set -+# CONFIG_DEBUG_FS is not set -+# CONFIG_HEADERS_CHECK is not set -+CONFIG_DEBUG_KERNEL=y -+CONFIG_DETECT_SOFTLOCKUP=y -+CONFIG_SCHED_DEBUG=y -+# CONFIG_SCHEDSTATS is not set -+# CONFIG_TIMER_STATS is not set -+CONFIG_DEBUG_SLAB=y -+# CONFIG_DEBUG_SLAB_LEAK is not set -+# CONFIG_DEBUG_RT_MUTEXES is not set -+# CONFIG_RT_MUTEX_TESTER is not set -+# CONFIG_DEBUG_SPINLOCK is not set -+# CONFIG_DEBUG_MUTEXES is not set -+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set -+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set -+# CONFIG_DEBUG_KOBJECT is not set -+CONFIG_DEBUG_BUGVERBOSE=y -+CONFIG_DEBUG_INFO=y -+# CONFIG_DEBUG_VM is not set -+# CONFIG_DEBUG_LIST is not set -+# CONFIG_DEBUG_SG is not set -+# CONFIG_FRAME_POINTER is not set -+# CONFIG_BOOT_PRINTK_DELAY is not set -+# CONFIG_RCU_TORTURE_TEST is not set -+# CONFIG_BACKTRACE_SELF_TEST is not set -+# CONFIG_FAULT_INJECTION is not set -+# CONFIG_SAMPLES is not set -+CONFIG_BOOTPARAM=y -+CONFIG_BOOTPARAM_STRING="root=/dev/nfs rw nfsroot=172.27.163.2:/tftpboot/ltib ip=172.27.163.3:172.27.163.2:172.27.255.254:255.255.0.0::eth0:off mtdparts=phys_mapped_flash:16m(User)" -+ -+# -+# Security options -+# -+# CONFIG_KEYS is not set -+# CONFIG_SECURITY is not set -+# CONFIG_SECURITY_FILE_CAPABILITIES is not set -+CONFIG_CRYPTO=y -+CONFIG_CRYPTO_ALGAPI=y -+CONFIG_CRYPTO_AEAD=y -+CONFIG_CRYPTO_BLKCIPHER=y -+# CONFIG_CRYPTO_SEQIV is not set -+CONFIG_CRYPTO_HASH=y -+CONFIG_CRYPTO_MANAGER=y -+CONFIG_CRYPTO_HMAC=y -+# CONFIG_CRYPTO_XCBC is not set -+# CONFIG_CRYPTO_NULL is not set -+# CONFIG_CRYPTO_MD4 is not set -+CONFIG_CRYPTO_MD5=y -+CONFIG_CRYPTO_SHA1=y -+# CONFIG_CRYPTO_SHA256 is not set -+# CONFIG_CRYPTO_SHA512 is not set -+# CONFIG_CRYPTO_WP512 is not set -+# CONFIG_CRYPTO_TGR192 is not set -+# CONFIG_CRYPTO_GF128MUL is not set -+# CONFIG_CRYPTO_ECB is not set -+CONFIG_CRYPTO_CBC=y -+# CONFIG_CRYPTO_PCBC is not set -+# CONFIG_CRYPTO_LRW is not set -+# CONFIG_CRYPTO_XTS is not set -+# CONFIG_CRYPTO_CTR is not set -+# CONFIG_CRYPTO_GCM is not set -+# CONFIG_CRYPTO_CCM is not set -+# CONFIG_CRYPTO_CRYPTD is not set -+CONFIG_CRYPTO_DES=y -+# CONFIG_CRYPTO_FCRYPT is not set -+# CONFIG_CRYPTO_BLOWFISH is not set -+# CONFIG_CRYPTO_TWOFISH is not set -+# CONFIG_CRYPTO_SERPENT is not set -+# CONFIG_CRYPTO_AES is not set -+# CONFIG_CRYPTO_CAST5 is not set -+# CONFIG_CRYPTO_CAST6 is not set -+# CONFIG_CRYPTO_TEA is not set -+# CONFIG_CRYPTO_ARC4 is not set -+# CONFIG_CRYPTO_KHAZAD is not set -+# CONFIG_CRYPTO_ANUBIS is not set -+# CONFIG_CRYPTO_SEED is not set -+# CONFIG_CRYPTO_SALSA20 is not set -+# CONFIG_CRYPTO_DEFLATE is not set -+# CONFIG_CRYPTO_MICHAEL_MIC is not set -+# CONFIG_CRYPTO_CRC32C is not set -+# CONFIG_CRYPTO_CAMELLIA is not set -+CONFIG_CRYPTO_TEST=m -+CONFIG_CRYPTO_AUTHENC=y -+# CONFIG_CRYPTO_LZO is not set -+# CONFIG_CRYPTO_HW is not set -+ -+# -+# Library routines -+# -+CONFIG_BITREVERSE=y -+CONFIG_CRC_CCITT=y -+CONFIG_CRC16=y -+# CONFIG_CRC_ITU_T is not set -+CONFIG_CRC32=y -+# CONFIG_CRC7 is not set -+CONFIG_LIBCRC32C=y -+CONFIG_PLIST=y -+CONFIG_HAS_IOMEM=y -+CONFIG_HAS_IOPORT=y -+CONFIG_HAS_DMA=y ---- /dev/null -+++ b/arch/m68k/configs/m5485evb_defconfig -@@ -0,0 +1,859 @@ -+# -+# Automatically generated make config: don't edit -+# Linux kernel version: 2.6.25 -+# Thu Jul 10 16:12:53 2008 -+# -+CONFIG_M68K=y -+CONFIG_MMU=y -+# CONFIG_GENERIC_TIME is not set -+# CONFIG_GENERIC_CLOCKEVENTS is not set -+CONFIG_RWSEM_GENERIC_SPINLOCK=y -+# CONFIG_ARCH_HAS_ILOG2_U32 is not set -+# CONFIG_ARCH_HAS_ILOG2_U64 is not set -+CONFIG_GENERIC_HWEIGHT=y -+CONFIG_GENERIC_CALIBRATE_DELAY=y -+CONFIG_TIME_LOW_RES=y -+CONFIG_GENERIC_IOMAP=y -+# CONFIG_NO_IOPORT is not set -+# CONFIG_NO_DMA is not set -+CONFIG_ARCH_SUPPORTS_AOUT=y -+CONFIG_HZ=100 -+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" -+ -+# -+# General setup -+# -+CONFIG_EXPERIMENTAL=y -+CONFIG_BROKEN_ON_SMP=y -+CONFIG_INIT_ENV_ARG_LIMIT=32 -+CONFIG_LOCALVERSION="" -+CONFIG_LOCALVERSION_AUTO=y -+CONFIG_SWAP=y -+CONFIG_SYSVIPC=y -+CONFIG_SYSVIPC_SYSCTL=y -+# CONFIG_POSIX_MQUEUE is not set -+# CONFIG_BSD_PROCESS_ACCT is not set -+# CONFIG_TASKSTATS is not set -+# CONFIG_AUDIT is not set -+CONFIG_IKCONFIG=y -+CONFIG_IKCONFIG_PROC=y -+CONFIG_LOG_BUF_SHIFT=17 -+# CONFIG_CGROUPS is not set -+CONFIG_GROUP_SCHED=y -+CONFIG_FAIR_GROUP_SCHED=y -+# CONFIG_RT_GROUP_SCHED is not set -+CONFIG_USER_SCHED=y -+# CONFIG_CGROUP_SCHED is not set -+CONFIG_SYSFS_DEPRECATED=y -+CONFIG_SYSFS_DEPRECATED_V2=y -+# CONFIG_RELAY is not set -+CONFIG_NAMESPACES=y -+# CONFIG_UTS_NS is not set -+# CONFIG_IPC_NS is not set -+# CONFIG_USER_NS is not set -+# CONFIG_PID_NS is not set -+# CONFIG_BLK_DEV_INITRD is not set -+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set -+CONFIG_SYSCTL=y -+# CONFIG_EMBEDDED is not set -+CONFIG_UID16=y -+CONFIG_SYSCTL_SYSCALL=y -+CONFIG_KALLSYMS=y -+# CONFIG_KALLSYMS_ALL is not set -+# CONFIG_KALLSYMS_EXTRA_PASS is not set -+CONFIG_HOTPLUG=y -+CONFIG_PRINTK=y -+CONFIG_BUG=y -+CONFIG_ELF_CORE=y -+CONFIG_COMPAT_BRK=y -+CONFIG_BASE_FULL=y -+CONFIG_FUTEX=y -+CONFIG_ANON_INODES=y -+CONFIG_EPOLL=y -+CONFIG_SIGNALFD=y -+CONFIG_TIMERFD=y -+CONFIG_EVENTFD=y -+CONFIG_SHMEM=y -+CONFIG_VM_EVENT_COUNTERS=y -+CONFIG_SLAB=y -+# CONFIG_SLUB is not set -+# CONFIG_SLOB is not set -+# CONFIG_PROFILING is not set -+# CONFIG_MARKERS is not set -+# CONFIG_HAVE_OPROFILE is not set -+# CONFIG_HAVE_KPROBES is not set -+# CONFIG_HAVE_KRETPROBES is not set -+CONFIG_PROC_PAGE_MONITOR=y -+CONFIG_SLABINFO=y -+CONFIG_RT_MUTEXES=y -+# CONFIG_TINY_SHMEM is not set -+CONFIG_BASE_SMALL=0 -+CONFIG_MODULES=y -+CONFIG_MODULE_UNLOAD=y -+CONFIG_MODULE_FORCE_UNLOAD=y -+# CONFIG_MODVERSIONS is not set -+# CONFIG_MODULE_SRCVERSION_ALL is not set -+# CONFIG_KMOD is not set -+CONFIG_BLOCK=y -+CONFIG_LBD=y -+# CONFIG_BLK_DEV_IO_TRACE is not set -+# CONFIG_LSF is not set -+# CONFIG_BLK_DEV_BSG is not set -+ -+# -+# IO Schedulers -+# -+CONFIG_IOSCHED_NOOP=y -+CONFIG_IOSCHED_AS=y -+CONFIG_IOSCHED_DEADLINE=y -+CONFIG_IOSCHED_CFQ=y -+# CONFIG_DEFAULT_AS is not set -+# CONFIG_DEFAULT_DEADLINE is not set -+CONFIG_DEFAULT_CFQ=y -+# CONFIG_DEFAULT_NOOP is not set -+CONFIG_DEFAULT_IOSCHED="cfq" -+CONFIG_CLASSIC_RCU=y -+ -+# -+# Platform dependent setup -+# -+# CONFIG_SUN3 is not set -+CONFIG_COLDFIRE=y -+CONFIG_CFV4E=y -+CONFIG_MCD_DMA=y -+# CONFIG_AMIGA is not set -+# CONFIG_ATARI is not set -+# CONFIG_MAC is not set -+# CONFIG_APOLLO is not set -+# CONFIG_VME is not set -+# CONFIG_HP300 is not set -+# CONFIG_SUN3X is not set -+# CONFIG_Q40 is not set -+ -+# -+# Processor type -+# -+# CONFIG_M68020 is not set -+# CONFIG_M68030 is not set -+# CONFIG_M68040 is not set -+# CONFIG_M68060 is not set -+# CONFIG_M5445X is not set -+CONFIG_M547X_8X=y -+# CONFIG_M547X is not set -+CONFIG_M548X=y -+# CONFIG_M5475AFE is not set -+# CONFIG_M5475BFE is not set -+# CONFIG_M5475CFE is not set -+# CONFIG_M5475DFE is not set -+# CONFIG_M5475EFE is not set -+# CONFIG_M5475FFE is not set -+# CONFIG_M5485AFE is not set -+# CONFIG_M5485BFE is not set -+CONFIG_M5485CFE=y -+# CONFIG_M5485DFE is not set -+# CONFIG_M5485EFE is not set -+# CONFIG_M5485FFE is not set -+CONFIG_MCFCLK=200000000 -+# CONFIG_MCF_USER_HALT is not set -+CONFIG_MMU_CFV4E=y -+CONFIG_SDRAM_BASE=0x00000000 -+CONFIG_SDRAM_SIZE=0x04000000 -+CONFIG_NOR_FLASH_BASE=0xE0000000 -+# CONFIG_M68KFPU_EMU is not set -+CONFIG_ADVANCED=y -+# CONFIG_RMW_INSNS is not set -+CONFIG_SINGLE_MEMORY_CHUNK=y -+# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set -+CONFIG_SELECT_MEMORY_MODEL=y -+CONFIG_FLATMEM_MANUAL=y -+# CONFIG_DISCONTIGMEM_MANUAL is not set -+# CONFIG_SPARSEMEM_MANUAL is not set -+CONFIG_FLATMEM=y -+CONFIG_FLAT_NODE_MEM_MAP=y -+CONFIG_NEED_MULTIPLE_NODES=y -+# CONFIG_SPARSEMEM_STATIC is not set -+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set -+CONFIG_SPLIT_PTLOCK_CPUS=4 -+# CONFIG_RESOURCES_64BIT is not set -+CONFIG_ZONE_DMA_FLAG=1 -+CONFIG_BOUNCE=y -+CONFIG_VIRT_TO_BUS=y -+ -+# -+# General setup -+# -+CONFIG_BINFMT_ELF=y -+# CONFIG_BINFMT_AOUT is not set -+# CONFIG_BINFMT_MISC is not set -+CONFIG_PROC_HARDWARE=y -+CONFIG_ZONE_DMA=y -+# CONFIG_ARCH_SUPPORTS_MSI is not set -+ -+# -+# Power management options -+# -+# CONFIG_PM is not set -+ -+# -+# Networking -+# -+CONFIG_NET=y -+ -+# -+# Networking options -+# -+CONFIG_PACKET=y -+# CONFIG_PACKET_MMAP is not set -+CONFIG_UNIX=y -+CONFIG_XFRM=y -+# CONFIG_XFRM_USER is not set -+# CONFIG_XFRM_SUB_POLICY is not set -+# CONFIG_XFRM_MIGRATE is not set -+# CONFIG_XFRM_STATISTICS is not set -+CONFIG_NET_KEY=y -+# CONFIG_NET_KEY_MIGRATE is not set -+CONFIG_INET=y -+# CONFIG_IP_MULTICAST is not set -+CONFIG_IP_ADVANCED_ROUTER=y -+CONFIG_ASK_IP_FIB_HASH=y -+# CONFIG_IP_FIB_TRIE is not set -+CONFIG_IP_FIB_HASH=y -+# CONFIG_IP_MULTIPLE_TABLES is not set -+# CONFIG_IP_ROUTE_MULTIPATH is not set -+# CONFIG_IP_ROUTE_VERBOSE is not set -+CONFIG_IP_PNP=y -+# CONFIG_IP_PNP_DHCP is not set -+# CONFIG_IP_PNP_BOOTP is not set -+# CONFIG_IP_PNP_RARP is not set -+# CONFIG_NET_IPIP is not set -+# CONFIG_NET_IPGRE is not set -+# CONFIG_ARPD is not set -+# CONFIG_SYN_COOKIES is not set -+CONFIG_INET_AH=y -+CONFIG_INET_ESP=y -+# CONFIG_INET_IPCOMP is not set -+# CONFIG_INET_XFRM_TUNNEL is not set -+# CONFIG_INET_TUNNEL is not set -+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set -+# CONFIG_INET_XFRM_MODE_TUNNEL is not set -+# CONFIG_INET_XFRM_MODE_BEET is not set -+# CONFIG_INET_LRO is not set -+CONFIG_INET_DIAG=y -+CONFIG_INET_TCP_DIAG=y -+# CONFIG_TCP_CONG_ADVANCED is not set -+CONFIG_TCP_CONG_CUBIC=y -+CONFIG_DEFAULT_TCP_CONG="cubic" -+# CONFIG_TCP_MD5SIG is not set -+# CONFIG_IPV6 is not set -+# CONFIG_INET6_XFRM_TUNNEL is not set -+# CONFIG_INET6_TUNNEL is not set -+# CONFIG_NETWORK_SECMARK is not set -+# CONFIG_NETFILTER is not set -+# CONFIG_IP_DCCP is not set -+# CONFIG_IP_SCTP is not set -+# CONFIG_TIPC is not set -+# CONFIG_ATM is not set -+# CONFIG_BRIDGE is not set -+# CONFIG_VLAN_8021Q is not set -+# CONFIG_DECNET is not set -+# CONFIG_LLC2 is not set -+# CONFIG_IPX is not set -+# CONFIG_ATALK is not set -+# CONFIG_X25 is not set -+# CONFIG_LAPB is not set -+# CONFIG_ECONET is not set -+# CONFIG_WAN_ROUTER is not set -+# CONFIG_NET_SCHED is not set -+ -+# -+# Network testing -+# -+# CONFIG_NET_PKTGEN is not set -+# CONFIG_HAMRADIO is not set -+# CONFIG_CAN is not set -+# CONFIG_IRDA is not set -+# CONFIG_BT is not set -+# CONFIG_AF_RXRPC is not set -+ -+# -+# Wireless -+# -+# CONFIG_CFG80211 is not set -+# CONFIG_WIRELESS_EXT is not set -+# CONFIG_MAC80211 is not set -+# CONFIG_IEEE80211 is not set -+# CONFIG_RFKILL is not set -+# CONFIG_NET_9P is not set -+ -+# -+# Device Drivers -+# -+ -+# -+# Generic Driver Options -+# -+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" -+# CONFIG_STANDALONE is not set -+CONFIG_PREVENT_FIRMWARE_BUILD=y -+CONFIG_FW_LOADER=y -+# CONFIG_DEBUG_DRIVER is not set -+# CONFIG_DEBUG_DEVRES is not set -+# CONFIG_SYS_HYPERVISOR is not set -+# CONFIG_CONNECTOR is not set -+# CONFIG_MTD is not set -+# CONFIG_PARPORT is not set -+CONFIG_BLK_DEV=y -+# CONFIG_BLK_DEV_COW_COMMON is not set -+CONFIG_BLK_DEV_LOOP=y -+# CONFIG_BLK_DEV_CRYPTOLOOP is not set -+# CONFIG_BLK_DEV_NBD is not set -+CONFIG_BLK_DEV_RAM=y -+CONFIG_BLK_DEV_RAM_COUNT=16 -+CONFIG_BLK_DEV_RAM_SIZE=64000 -+# CONFIG_BLK_DEV_XIP is not set -+# CONFIG_CDROM_PKTCDVD is not set -+# CONFIG_ATA_OVER_ETH is not set -+CONFIG_MISC_DEVICES=y -+CONFIG_COLDFIRE_SEC=y -+CONFIG_SEC_DEVICE=y -+# CONFIG_EEPROM_93CX6 is not set -+# CONFIG_ENCLOSURE_SERVICES is not set -+CONFIG_HAVE_IDE=y -+# CONFIG_IDE is not set -+ -+# -+# SCSI device support -+# -+# CONFIG_RAID_ATTRS is not set -+CONFIG_SCSI=y -+CONFIG_SCSI_DMA=y -+# CONFIG_SCSI_TGT is not set -+# CONFIG_SCSI_NETLINK is not set -+CONFIG_SCSI_PROC_FS=y -+ -+# -+# SCSI support type (disk, tape, CD-ROM) -+# -+CONFIG_BLK_DEV_SD=y -+# CONFIG_CHR_DEV_ST is not set -+# CONFIG_CHR_DEV_OSST is not set -+# CONFIG_BLK_DEV_SR is not set -+# CONFIG_CHR_DEV_SG is not set -+# CONFIG_CHR_DEV_SCH is not set -+ -+# -+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs -+# -+CONFIG_SCSI_MULTI_LUN=y -+# CONFIG_SCSI_CONSTANTS is not set -+# CONFIG_SCSI_LOGGING is not set -+# CONFIG_SCSI_SCAN_ASYNC is not set -+CONFIG_SCSI_WAIT_SCAN=m -+ -+# -+# SCSI Transports -+# -+# CONFIG_SCSI_SPI_ATTRS is not set -+# CONFIG_SCSI_FC_ATTRS is not set -+# CONFIG_SCSI_ISCSI_ATTRS is not set -+# CONFIG_SCSI_SAS_LIBSAS is not set -+# CONFIG_SCSI_SRP_ATTRS is not set -+# CONFIG_SCSI_LOWLEVEL is not set -+# CONFIG_ATA is not set -+# CONFIG_MD is not set -+CONFIG_NETDEVICES=y -+# CONFIG_NETDEVICES_MULTIQUEUE is not set -+# CONFIG_DUMMY is not set -+# CONFIG_BONDING is not set -+# CONFIG_MACVLAN is not set -+# CONFIG_EQUALIZER is not set -+# CONFIG_TUN is not set -+# CONFIG_VETH is not set -+# CONFIG_PHYLIB is not set -+CONFIG_NET_ETHERNET=y -+CONFIG_MII=y -+CONFIG_FEC_548x=y -+CONFIG_FEC_548x_AUTO_NEGOTIATION=y -+# CONFIG_FEC_548x_ENABLE_FEC2 is not set -+# CONFIG_ENC28J60 is not set -+# CONFIG_IBM_NEW_EMAC_ZMII is not set -+# CONFIG_IBM_NEW_EMAC_RGMII is not set -+# CONFIG_IBM_NEW_EMAC_TAH is not set -+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set -+# CONFIG_B44 is not set -+# CONFIG_NETDEV_1000 is not set -+# CONFIG_NETDEV_10000 is not set -+ -+# -+# Wireless LAN -+# -+# CONFIG_WLAN_PRE80211 is not set -+# CONFIG_WLAN_80211 is not set -+# CONFIG_WAN is not set -+# CONFIG_PPP is not set -+# CONFIG_SLIP is not set -+# CONFIG_NETCONSOLE is not set -+# CONFIG_NETPOLL is not set -+# CONFIG_NET_POLL_CONTROLLER is not set -+# CONFIG_ISDN is not set -+# CONFIG_PHONE is not set -+ -+# -+# Input device support -+# -+CONFIG_INPUT=y -+# CONFIG_INPUT_FF_MEMLESS is not set -+# CONFIG_INPUT_POLLDEV is not set -+ -+# -+# Userland interfaces -+# -+CONFIG_INPUT_MOUSEDEV=y -+# CONFIG_INPUT_MOUSEDEV_PSAUX is not set -+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 -+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 -+# CONFIG_INPUT_JOYDEV is not set -+CONFIG_INPUT_EVDEV=y -+# CONFIG_INPUT_EVBUG is not set -+ -+# -+# Input Device Drivers -+# -+CONFIG_INPUT_KEYBOARD=y -+# CONFIG_KEYBOARD_ATKBD is not set -+# CONFIG_KEYBOARD_SUNKBD is not set -+# CONFIG_KEYBOARD_LKKBD is not set -+# CONFIG_KEYBOARD_XTKBD is not set -+# CONFIG_KEYBOARD_NEWTON is not set -+# CONFIG_KEYBOARD_STOWAWAY is not set -+# CONFIG_INPUT_MOUSE is not set -+# CONFIG_INPUT_JOYSTICK is not set -+# CONFIG_INPUT_TABLET is not set -+# CONFIG_INPUT_TOUCHSCREEN is not set -+# CONFIG_INPUT_MISC is not set -+ -+# -+# Hardware I/O ports -+# -+CONFIG_SERIO=y -+CONFIG_SERIO_SERPORT=y -+# CONFIG_SERIO_RAW is not set -+# CONFIG_GAMEPORT is not set -+ -+# -+# Character devices -+# -+CONFIG_VT=y -+CONFIG_VT_CONSOLE=y -+CONFIG_HW_CONSOLE=y -+# CONFIG_VT_HW_CONSOLE_BINDING is not set -+# CONFIG_SERIAL_NONSTANDARD is not set -+ -+# -+# Serial drivers -+# -+# CONFIG_SERIAL_8250 is not set -+ -+# -+# Non-8250 serial port support -+# -+CONFIG_SERIAL_COLDFIRE=y -+# CONFIG_SERIAL_COLDFIRE_IRDA is not set -+# CONFIG_SERIAL_MCF is not set -+CONFIG_UNIX98_PTYS=y -+# CONFIG_LEGACY_PTYS is not set -+# CONFIG_IPMI_HANDLER is not set -+# CONFIG_HW_RANDOM is not set -+# CONFIG_GEN_RTC is not set -+# CONFIG_R3964 is not set -+# CONFIG_RAW_DRIVER is not set -+# CONFIG_TCG_TPM is not set -+CONFIG_I2C=y -+CONFIG_I2C_BOARDINFO=y -+# CONFIG_I2C_CHARDEV is not set -+ -+# -+# I2C Algorithms -+# -+# CONFIG_I2C_ALGOBIT is not set -+# CONFIG_I2C_ALGOPCF is not set -+# CONFIG_I2C_ALGOPCA is not set -+ -+# -+# I2C Hardware Bus support -+# -+CONFIG_I2C_MCF548x=y -+# CONFIG_I2C_MCF is not set -+# CONFIG_I2C_OCORES is not set -+# CONFIG_I2C_PARPORT_LIGHT is not set -+# CONFIG_I2C_SIMTEC is not set -+# CONFIG_I2C_TAOS_EVM is not set -+# CONFIG_I2C_STUB is not set -+ -+# -+# Miscellaneous I2C Chip support -+# -+# CONFIG_DS1682 is not set -+# CONFIG_SENSORS_EEPROM is not set -+# CONFIG_SENSORS_PCF8574 is not set -+# CONFIG_PCF8575 is not set -+# CONFIG_SENSORS_PCF8591 is not set -+# CONFIG_TPS65010 is not set -+# CONFIG_SENSORS_MAX6875 is not set -+# CONFIG_SENSORS_TSL2550 is not set -+# CONFIG_I2C_DEBUG_CORE is not set -+# CONFIG_I2C_DEBUG_ALGO is not set -+# CONFIG_I2C_DEBUG_BUS is not set -+# CONFIG_I2C_DEBUG_CHIP is not set -+ -+# -+# SPI support -+# -+CONFIG_SPI=y -+CONFIG_SPI_DEBUG=y -+# CONFIG_COLDFIRE_EDMA is not set -+CONFIG_SPI_MASTER=y -+ -+# -+# SPI Master Controller Drivers -+# -+# CONFIG_SPI_BITBANG is not set -+CONFIG_SPI_COLDFIRE=y -+ -+# -+# SPI Protocol Masters -+# -+# CONFIG_SPI_AT25 is not set -+# CONFIG_SPI_SPIDEV is not set -+# CONFIG_SPI_TLE62X0 is not set -+# CONFIG_SPI_COLDFIRE_SSI_AUDIO is not set -+# CONFIG_W1 is not set -+# CONFIG_POWER_SUPPLY is not set -+# CONFIG_HWMON is not set -+# CONFIG_THERMAL is not set -+# CONFIG_WATCHDOG is not set -+ -+# -+# Sonics Silicon Backplane -+# -+CONFIG_SSB_POSSIBLE=y -+# CONFIG_SSB is not set -+ -+# -+# Multifunction device drivers -+# -+# CONFIG_MFD_SM501 is not set -+ -+# -+# Multimedia devices -+# -+# CONFIG_VIDEO_DEV is not set -+# CONFIG_DVB_CORE is not set -+CONFIG_DAB=y -+ -+# -+# Graphics support -+# -+# CONFIG_VGASTATE is not set -+CONFIG_VIDEO_OUTPUT_CONTROL=m -+# CONFIG_FB is not set -+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set -+ -+# -+# Display device support -+# -+# CONFIG_DISPLAY_SUPPORT is not set -+ -+# -+# Console display driver support -+# -+CONFIG_DUMMY_CONSOLE=y -+ -+# -+# Sound -+# -+# CONFIG_SOUND is not set -+CONFIG_HID_SUPPORT=y -+CONFIG_HID=y -+CONFIG_HID_DEBUG=y -+# CONFIG_HIDRAW is not set -+# CONFIG_USB_SUPPORT is not set -+# CONFIG_MMC is not set -+# CONFIG_MEMSTICK is not set -+# CONFIG_NEW_LEDS is not set -+# CONFIG_RTC_CLASS is not set -+ -+# -+# Userspace I/O -+# -+# CONFIG_UIO is not set -+ -+# -+# Character devices -+# -+# CONFIG_SERIAL_CONSOLE is not set -+ -+# -+# File systems -+# -+CONFIG_EXT2_FS=y -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XIP is not set -+CONFIG_EXT3_FS=y -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_POSIX_ACL is not set -+# CONFIG_EXT3_FS_SECURITY is not set -+# CONFIG_EXT4DEV_FS is not set -+CONFIG_JBD=y -+CONFIG_FS_MBCACHE=y -+# CONFIG_REISERFS_FS is not set -+# CONFIG_JFS_FS is not set -+# CONFIG_FS_POSIX_ACL is not set -+# CONFIG_XFS_FS is not set -+# CONFIG_GFS2_FS is not set -+# CONFIG_OCFS2_FS is not set -+CONFIG_DNOTIFY=y -+# CONFIG_INOTIFY is not set -+# CONFIG_QUOTA is not set -+# CONFIG_AUTOFS_FS is not set -+# CONFIG_AUTOFS4_FS is not set -+# CONFIG_FUSE_FS is not set -+ -+# -+# CD-ROM/DVD Filesystems -+# -+# CONFIG_ISO9660_FS is not set -+# CONFIG_UDF_FS is not set -+ -+# -+# DOS/FAT/NT Filesystems -+# -+CONFIG_FAT_FS=y -+CONFIG_MSDOS_FS=y -+CONFIG_VFAT_FS=y -+CONFIG_FAT_DEFAULT_CODEPAGE=437 -+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" -+CONFIG_NTFS_FS=y -+# CONFIG_NTFS_DEBUG is not set -+CONFIG_NTFS_RW=y -+ -+# -+# Pseudo filesystems -+# -+CONFIG_PROC_FS=y -+# CONFIG_PROC_KCORE is not set -+CONFIG_PROC_SYSCTL=y -+CONFIG_SYSFS=y -+CONFIG_TMPFS=y -+# CONFIG_TMPFS_POSIX_ACL is not set -+# CONFIG_HUGETLB_PAGE is not set -+# CONFIG_CONFIGFS_FS is not set -+ -+# -+# Miscellaneous filesystems -+# -+# CONFIG_ADFS_FS is not set -+# CONFIG_AFFS_FS is not set -+# CONFIG_HFS_FS is not set -+# CONFIG_HFSPLUS_FS is not set -+# CONFIG_BEFS_FS is not set -+# CONFIG_BFS_FS is not set -+# CONFIG_EFS_FS is not set -+# CONFIG_CRAMFS is not set -+# CONFIG_VXFS_FS is not set -+CONFIG_MINIX_FS=y -+# CONFIG_HPFS_FS is not set -+# CONFIG_QNX4FS_FS is not set -+CONFIG_ROMFS_FS=y -+# CONFIG_SYSV_FS is not set -+# CONFIG_UFS_FS is not set -+CONFIG_NETWORK_FILESYSTEMS=y -+CONFIG_NFS_FS=y -+# CONFIG_NFS_V3 is not set -+# CONFIG_NFS_V4 is not set -+# CONFIG_NFS_DIRECTIO is not set -+# CONFIG_NFSD is not set -+CONFIG_ROOT_NFS=y -+CONFIG_LOCKD=y -+CONFIG_NFS_COMMON=y -+CONFIG_SUNRPC=y -+# CONFIG_SUNRPC_BIND34 is not set -+# CONFIG_RPCSEC_GSS_KRB5 is not set -+# CONFIG_RPCSEC_GSS_SPKM3 is not set -+# CONFIG_SMB_FS is not set -+# CONFIG_CIFS is not set -+# CONFIG_NCP_FS is not set -+# CONFIG_CODA_FS is not set -+# CONFIG_AFS_FS is not set -+ -+# -+# Partition Types -+# -+CONFIG_PARTITION_ADVANCED=y -+# CONFIG_ACORN_PARTITION is not set -+# CONFIG_OSF_PARTITION is not set -+# CONFIG_AMIGA_PARTITION is not set -+# CONFIG_ATARI_PARTITION is not set -+# CONFIG_MAC_PARTITION is not set -+CONFIG_MSDOS_PARTITION=y -+# CONFIG_BSD_DISKLABEL is not set -+# CONFIG_MINIX_SUBPARTITION is not set -+# CONFIG_SOLARIS_X86_PARTITION is not set -+# CONFIG_UNIXWARE_DISKLABEL is not set -+# CONFIG_LDM_PARTITION is not set -+# CONFIG_SGI_PARTITION is not set -+# CONFIG_ULTRIX_PARTITION is not set -+# CONFIG_SUN_PARTITION is not set -+# CONFIG_KARMA_PARTITION is not set -+# CONFIG_EFI_PARTITION is not set -+# CONFIG_SYSV68_PARTITION is not set -+CONFIG_NLS=y -+CONFIG_NLS_DEFAULT="iso8859-1" -+CONFIG_NLS_CODEPAGE_437=y -+# CONFIG_NLS_CODEPAGE_737 is not set -+# CONFIG_NLS_CODEPAGE_775 is not set -+# CONFIG_NLS_CODEPAGE_850 is not set -+# CONFIG_NLS_CODEPAGE_852 is not set -+# CONFIG_NLS_CODEPAGE_855 is not set -+# CONFIG_NLS_CODEPAGE_857 is not set -+# CONFIG_NLS_CODEPAGE_860 is not set -+# CONFIG_NLS_CODEPAGE_861 is not set -+# CONFIG_NLS_CODEPAGE_862 is not set -+# CONFIG_NLS_CODEPAGE_863 is not set -+# CONFIG_NLS_CODEPAGE_864 is not set -+# CONFIG_NLS_CODEPAGE_865 is not set -+# CONFIG_NLS_CODEPAGE_866 is not set -+# CONFIG_NLS_CODEPAGE_869 is not set -+# CONFIG_NLS_CODEPAGE_936 is not set -+# CONFIG_NLS_CODEPAGE_950 is not set -+# CONFIG_NLS_CODEPAGE_932 is not set -+# CONFIG_NLS_CODEPAGE_949 is not set -+# CONFIG_NLS_CODEPAGE_874 is not set -+# CONFIG_NLS_ISO8859_8 is not set -+# CONFIG_NLS_CODEPAGE_1250 is not set -+# CONFIG_NLS_CODEPAGE_1251 is not set -+# CONFIG_NLS_ASCII is not set -+CONFIG_NLS_ISO8859_1=y -+# CONFIG_NLS_ISO8859_2 is not set -+# CONFIG_NLS_ISO8859_3 is not set -+# CONFIG_NLS_ISO8859_4 is not set -+# CONFIG_NLS_ISO8859_5 is not set -+# CONFIG_NLS_ISO8859_6 is not set -+# CONFIG_NLS_ISO8859_7 is not set -+# CONFIG_NLS_ISO8859_9 is not set -+# CONFIG_NLS_ISO8859_13 is not set -+# CONFIG_NLS_ISO8859_14 is not set -+# CONFIG_NLS_ISO8859_15 is not set -+# CONFIG_NLS_KOI8_R is not set -+# CONFIG_NLS_KOI8_U is not set -+CONFIG_NLS_UTF8=y -+# CONFIG_DLM is not set -+ -+# -+# Kernel hacking -+# -+# CONFIG_PRINTK_TIME is not set -+CONFIG_ENABLE_WARN_DEPRECATED=y -+# CONFIG_ENABLE_MUST_CHECK is not set -+# CONFIG_MAGIC_SYSRQ is not set -+# CONFIG_UNUSED_SYMBOLS is not set -+# CONFIG_DEBUG_FS is not set -+# CONFIG_HEADERS_CHECK is not set -+CONFIG_DEBUG_KERNEL=y -+CONFIG_DETECT_SOFTLOCKUP=y -+CONFIG_SCHED_DEBUG=y -+# CONFIG_SCHEDSTATS is not set -+# CONFIG_TIMER_STATS is not set -+CONFIG_DEBUG_SLAB=y -+# CONFIG_DEBUG_SLAB_LEAK is not set -+# CONFIG_DEBUG_RT_MUTEXES is not set -+# CONFIG_RT_MUTEX_TESTER is not set -+# CONFIG_DEBUG_SPINLOCK is not set -+# CONFIG_DEBUG_MUTEXES is not set -+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set -+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set -+# CONFIG_DEBUG_KOBJECT is not set -+CONFIG_DEBUG_BUGVERBOSE=y -+CONFIG_DEBUG_INFO=y -+# CONFIG_DEBUG_VM is not set -+# CONFIG_DEBUG_LIST is not set -+# CONFIG_DEBUG_SG is not set -+# CONFIG_FRAME_POINTER is not set -+# CONFIG_BOOT_PRINTK_DELAY is not set -+# CONFIG_RCU_TORTURE_TEST is not set -+# CONFIG_BACKTRACE_SELF_TEST is not set -+# CONFIG_FAULT_INJECTION is not set -+# CONFIG_SAMPLES is not set -+CONFIG_BOOTPARAM=y -+CONFIG_BOOTPARAM_STRING="root=/dev/nfs rw nfsroot=172.27.163.2:/tftpboot/ltib ip=172.27.163.3:172.27.163.2:172.27.255.254:255.255.0.0::eth0:off mtdparts=phys_mapped_flash:16m(User)" -+ -+# -+# Security options -+# -+# CONFIG_KEYS is not set -+# CONFIG_SECURITY is not set -+# CONFIG_SECURITY_FILE_CAPABILITIES is not set -+CONFIG_CRYPTO=y -+CONFIG_CRYPTO_ALGAPI=y -+CONFIG_CRYPTO_AEAD=y -+CONFIG_CRYPTO_BLKCIPHER=y -+# CONFIG_CRYPTO_SEQIV is not set -+CONFIG_CRYPTO_HASH=y -+CONFIG_CRYPTO_MANAGER=y -+CONFIG_CRYPTO_HMAC=y -+# CONFIG_CRYPTO_XCBC is not set -+# CONFIG_CRYPTO_NULL is not set -+# CONFIG_CRYPTO_MD4 is not set -+CONFIG_CRYPTO_MD5=y -+CONFIG_CRYPTO_SHA1=y -+# CONFIG_CRYPTO_SHA256 is not set -+# CONFIG_CRYPTO_SHA512 is not set -+# CONFIG_CRYPTO_WP512 is not set -+# CONFIG_CRYPTO_TGR192 is not set -+# CONFIG_CRYPTO_GF128MUL is not set -+# CONFIG_CRYPTO_ECB is not set -+CONFIG_CRYPTO_CBC=y -+# CONFIG_CRYPTO_PCBC is not set -+# CONFIG_CRYPTO_LRW is not set -+# CONFIG_CRYPTO_XTS is not set -+# CONFIG_CRYPTO_CTR is not set -+# CONFIG_CRYPTO_GCM is not set -+# CONFIG_CRYPTO_CCM is not set -+# CONFIG_CRYPTO_CRYPTD is not set -+CONFIG_CRYPTO_DES=y -+# CONFIG_CRYPTO_FCRYPT is not set -+# CONFIG_CRYPTO_BLOWFISH is not set -+# CONFIG_CRYPTO_TWOFISH is not set -+# CONFIG_CRYPTO_SERPENT is not set -+# CONFIG_CRYPTO_AES is not set -+# CONFIG_CRYPTO_CAST5 is not set -+# CONFIG_CRYPTO_CAST6 is not set -+# CONFIG_CRYPTO_TEA is not set -+# CONFIG_CRYPTO_ARC4 is not set -+# CONFIG_CRYPTO_KHAZAD is not set -+# CONFIG_CRYPTO_ANUBIS is not set -+# CONFIG_CRYPTO_SEED is not set -+# CONFIG_CRYPTO_SALSA20 is not set -+# CONFIG_CRYPTO_DEFLATE is not set -+# CONFIG_CRYPTO_MICHAEL_MIC is not set -+# CONFIG_CRYPTO_CRC32C is not set -+# CONFIG_CRYPTO_CAMELLIA is not set -+CONFIG_CRYPTO_TEST=m -+CONFIG_CRYPTO_AUTHENC=y -+# CONFIG_CRYPTO_LZO is not set -+# CONFIG_CRYPTO_HW is not set -+ -+# -+# Library routines -+# -+CONFIG_BITREVERSE=y -+CONFIG_CRC_CCITT=y -+CONFIG_CRC16=y -+# CONFIG_CRC_ITU_T is not set -+CONFIG_CRC32=y -+# CONFIG_CRC7 is not set -+CONFIG_LIBCRC32C=y -+CONFIG_PLIST=y -+CONFIG_HAS_IOMEM=y -+CONFIG_HAS_IOPORT=y -+CONFIG_HAS_DMA=y ---- a/arch/m68k/Kconfig -+++ b/arch/m68k/Kconfig -@@ -11,6 +11,14 @@ config MMU - bool - default y - -+config GENERIC_TIME -+ bool -+ default n -+ -+config GENERIC_CLOCKEVENTS -+ bool -+ default n -+ - config RWSEM_GENERIC_SPINLOCK - bool - default y -@@ -48,7 +56,7 @@ config ARCH_MAY_HAVE_PC_FDC - default y - - config NO_IOPORT -- def_bool y -+ def_bool !(M5445X || M547X_8X) - - config NO_DMA - def_bool SUN3 -@@ -119,6 +127,29 @@ config SUN3 - - If you don't want to compile a kernel exclusively for a Sun 3, say N. - -+config COLDFIRE -+ bool "ColdFire V4e support" -+ default y -+ select CFV4E -+ help -+ Say Y if you want to build a kernel to run on one of the ColdFire -+ V4e boards. -+ -+config CFV4E -+ bool -+ depends on COLDFIRE -+ select MMU_CFV4E if MMU -+ default y -+ -+config MCD_DMA -+ bool "ColdFire MCD DMA support" -+ depends on M547X_8X -+ default y -+ help -+ This enables support for the ColdFire 547x/548x family -+ multichannel DMA support. Many drivers need it. -+ If you want it, say Y -+ - config AMIGA - bool "Amiga support" - depends on !MMU_SUN3 -@@ -144,9 +175,9 @@ config HADES - to use this kernel on a Hades, say Y here; otherwise say N. - - config PCI -- bool -- depends on HADES -- default y -+ bool "PCI bus support" -+ depends on HADES || M54455 || M547X_8X -+ default n - help - Find out whether you have a PCI motherboard. PCI is the name of a - bus system, i.e. the way the CPU talks to the other stuff inside -@@ -294,14 +325,142 @@ config M68060 - If you anticipate running this kernel on a computer with a MC68060 - processor, say Y. Otherwise, say N. - -+config M5445X -+ bool "MCF5445x support" -+ depends on COLDFIRE -+ help -+ This option will add support for the MCF5445 processor with mmu. -+ -+config M54451 -+ bool -+ depends on M5445X -+ default n -+ -+config M54455 -+ bool -+ depends on M5445X -+ default n -+ -+choice -+ prompt "Model" -+ depends on M5445X -+ default M54451EVB -+ config M54451EVB -+ bool "M54451EVB" -+ select M54451 -+ config M54455EVB -+ bool "M54455EVB" -+ select M54455 -+endchoice -+ -+ -+config M547X_8X -+ bool "MCF547x/MCF548x support" -+ depends on COLDFIRE -+ help -+ This option will add support for the MCF547x/MCF548x processor with mmu. -+ -+config M547X -+ bool -+ depends on M547X_8X -+ default n -+ -+config M548X -+ bool -+ depends on M547X_8X -+ default n -+ -+choice -+ prompt "Model" -+ depends on M547X_8X -+ default M5485CFE -+ config M5475AFE -+ bool "MCF5475AFE" -+ select M547X -+ config M5475BFE -+ bool "MCF5475BFE" -+ select M547X -+ config M5475CFE -+ bool "MCF5475CFE" -+ select M547X -+ config M5475DFE -+ bool "MCF5475DFE" -+ select M547X -+ config M5475EFE -+ bool "MCF5475EFE" -+ select M547X -+ config M5475FFE -+ bool "MCF5475FFE" -+ select M547X -+ -+ config M5485AFE -+ bool "MCF5485AFE" -+ select M548X -+ config M5485BFE -+ bool "MCF5485BFE" -+ select M548X -+ config M5485CFE -+ bool "MCF5485CFE" -+ select M548X -+ config M5485DFE -+ bool "MCF5485DFE" -+ select M548X -+ config M5485EFE -+ bool "MCF5485EFE" -+ select M548X -+ config M5485FFE -+ bool "MCF5485FFE" -+ select M548X -+ -+endchoice -+ -+config MCFCLK -+ int -+ default 266666666 if M54455EVB -+ default 240000000 if M54451EVB -+ default 266000000 if M547X -+ default 200000000 if M548X -+ help -+ Coldfire System clock. -+ -+config MCF_USER_HALT -+ bool "Coldfire User Halt Enable" -+ depends on M5445X || M547X_8X -+ default n -+ help -+ Enables the HALT instruction in User Mode. -+ - config MMU_MOTOROLA - bool -- depends on MMU && !MMU_SUN3 -+ depends on MMU && !MMU_SUN3 && !COLDFIRE - default y - - config MMU_SUN3 - bool - -+config MMU_CFV4E -+ bool -+ -+config SDRAM_BASE -+ hex -+ depends on COLDFIRE -+ default 0x40000000 if M5445X -+ default 0x00000000 if M547X_8X -+ -+config SDRAM_SIZE -+ hex -+ depends on COLDFIRE -+ default 0x08000000 if M54451EVB -+ default 0x10000000 if M54455EVB -+ default 0x04000000 if M547X_8X -+ -+config NOR_FLASH_BASE -+ hex "NOR Flash Base Address" -+ depends on COLDFIRE -+ default 0x00000000 if M54451EVB -+ default 0x00000000 if M54455EVB -+ default 0xE0000000 if M547X_8X -+ - config M68KFPU_EMU - bool "Math emulation support (EXPERIMENTAL)" - depends on EXPERIMENTAL -@@ -468,6 +627,14 @@ config ZONE_DMA - source "drivers/pci/Kconfig" - - source "drivers/zorro/Kconfig" -+endmenu -+ -+menu "Power management options" -+ -+config PM -+ bool "Power Management support" -+ help -+ Support processor power management modes - - endmenu - -@@ -647,7 +814,7 @@ config DN_SERIAL - - config SERIAL_CONSOLE - bool "Support for serial port console" -- depends on (AMIGA || ATARI || MAC || SUN3 || SUN3X || VME || APOLLO) && (ATARI_MFPSER=y || ATARI_SCC=y || ATARI_MIDI=y || MAC_SCC=y || AMIGA_BUILTIN_SERIAL=y || GVPIOEXT=y || MULTIFACE_III_TTY=y || SERIAL=y || MVME147_SCC || SERIAL167 || MVME162_SCC || BVME6000_SCC || DN_SERIAL) -+ depends on (AMIGA || ATARI || MAC || SUN3 || SUN3X || VME || APOLLO || COLDFIRE) && (ATARI_MFPSER=y || ATARI_SCC=y || ATARI_MIDI=y || MAC_SCC=y || AMIGA_BUILTIN_SERIAL=y || GVPIOEXT=y || MULTIFACE_III_TTY=y || SERIAL=y || MVME147_SCC || SERIAL167 || MVME162_SCC || BVME6000_SCC || DN_SERIAL || SERIAL_COLDFIRE) - ---help--- - If you say Y here, it will be possible to use a serial port as the - system console (the system console is the device which receives all ---- a/arch/m68k/Kconfig.debug -+++ b/arch/m68k/Kconfig.debug -@@ -2,4 +2,13 @@ menu "Kernel hacking" - - source "lib/Kconfig.debug" - -+config BOOTPARAM -+ bool 'Compiled-in Kernel Boot Parameter' -+ depends on COLDFIRE -+ -+config BOOTPARAM_STRING -+ string 'Kernel Boot Parameter' -+ default 'console=ttyS0,115200' -+ depends on BOOTPARAM -+ - endmenu ---- a/arch/m68k/kernel/asm-offsets.c -+++ b/arch/m68k/kernel/asm-offsets.c -@@ -58,8 +58,15 @@ int main(void) - DEFINE(PT_A2, offsetof(struct pt_regs, a2)); - DEFINE(PT_PC, offsetof(struct pt_regs, pc)); - DEFINE(PT_SR, offsetof(struct pt_regs, sr)); -+#ifdef CONFIG_COLDFIRE -+ /* Need to get the context out of struct mm for ASID setting */ -+ DEFINE(MM_CONTEXT, offsetof(struct mm_struct, context)); -+ /* Coldfire exception frame has vector *before* pc */ -+ DEFINE(PT_VECTOR, offsetof(struct pt_regs, pc) - 4); -+#else - /* bitfields are a bit difficult */ - DEFINE(PT_VECTOR, offsetof(struct pt_regs, pc) + 4); -+#endif - - /* offsets into the irq_handler struct */ - DEFINE(IRQ_HANDLER, offsetof(struct irq_node, handler)); ---- /dev/null -+++ b/arch/m68k/kernel/bios32_mcf548x.c -@@ -0,0 +1,631 @@ -+/* -+ * bios32.c - PCI BIOS functions for m68k systems. -+ * -+ * Written by Wout Klaren. -+ * -+ * Based on the DEC Alpha bios32.c by Dave Rusling and David Mosberger. -+ */ -+#include <linux/init.h> -+#include <linux/kernel.h> -+ -+#if 0 -+# define DBG_DEVS(args) printk args -+#else -+# define DBG_DEVS(args) -+#endif -+ -+#ifdef CONFIG_PCI -+ -+/* -+ * PCI support for Linux/m68k. Currently only the Hades is supported. -+ * -+ * The support for PCI bridges in the DEC Alpha version has -+ * been removed in this version. -+ */ -+ -+#include <linux/pci.h> -+#include <linux/slab.h> -+#include <linux/mm.h> -+ -+#include <asm/io.h> -+#include <asm/pci.h> -+#include <asm/uaccess.h> -+ -+#define KB 1024 -+#define MB (1024*KB) -+#define GB (1024*MB) -+ -+#define MAJOR_REV 0 -+#define MINOR_REV 5 -+ -+/* -+ * Align VAL to ALIGN, which must be a power of two. -+ */ -+ -+#define MAX(val1, val2) (((val1) > (val2)) ? val1 : val2) -+ -+/* -+ * Offsets relative to the I/O and memory base addresses from where resources -+ * are allocated. -+ */ -+ -+#ifdef CONFIG_COLDFIRE -+#define IO_ALLOC_OFFSET 0x00000100 -+#define MEM_ALLOC_OFFSET 0x00000000 -+#else /* CONFIG_COLDFIRE */ -+#define IO_ALLOC_OFFSET 0x00004000 -+#define MEM_ALLOC_OFFSET 0x04000000 -+#endif /* CONFIG_COLDFIRE */ -+ -+/* -+ * Declarations of hardware specific initialisation functions. -+ */ -+ -+extern struct pci_bus_info *init_hades_pci(void); -+ -+/* -+ * Bus info structure of the PCI bus. A pointer to this structure is -+ * put in the sysdata member of the pci_bus structure. -+ */ -+ -+static struct pci_bus_info *bus_info; -+ -+static int pci_modify = 1; /* If set, layout the PCI bus ourself. */ -+static int skip_vga; /* If set do not modify base addresses -+ of vga cards.*/ -+static int disable_pci_burst; /* If set do not allow PCI bursts. */ -+ -+static unsigned int io_base; -+static unsigned int mem_base; -+ -+/* -+ * static void disable_dev(struct pci_dev *dev) -+ * -+ * Disable PCI device DEV so that it does not respond to I/O or memory -+ * accesses. -+ * -+ * Parameters: -+ * -+ * dev - device to disable. -+ */ -+ -+static void __init disable_dev(struct pci_dev *dev) -+{ -+ unsigned short cmd; -+ -+ if (((dev->class >> 8 == PCI_CLASS_NOT_DEFINED_VGA) || -+ (dev->class >> 8 == PCI_CLASS_DISPLAY_VGA) || -+ (dev->class >> 8 == PCI_CLASS_DISPLAY_XGA)) && skip_vga) -+ return; -+ -+ pci_read_config_word(dev, PCI_COMMAND, &cmd); -+ -+ cmd &= (~PCI_COMMAND_IO & ~PCI_COMMAND_MEMORY & ~PCI_COMMAND_MASTER); -+ pci_write_config_word(dev, PCI_COMMAND, cmd); -+} -+ -+/* Stolen from pcibios_enable_resources/i386 */ -+int pcibios_enable_device(struct pci_dev *dev, int mask) -+{ -+ u16 cmd, old_cmd; -+ int idx; -+ struct resource *r; -+ -+ pci_read_config_word(dev, PCI_COMMAND, &cmd); -+ old_cmd = cmd; -+ for(idx=0; idx<6; idx++) { -+ /* Only set up the requested stuff */ -+ if (!(mask & (1<<idx))) -+ continue; -+ -+ r = &dev->resource[idx]; -+ if (!r->start && r->end) { -+ printk("PCI: Device %s not available because" -+ " of resource collisions\n", dev->dev.bus_id); -+ return -EINVAL; -+ } -+ if (r->flags & IORESOURCE_IO) -+ cmd |= PCI_COMMAND_IO; -+ if (r->flags & IORESOURCE_MEM) -+ cmd |= PCI_COMMAND_MEMORY; -+ } -+ if (dev->resource[PCI_ROM_RESOURCE].start) -+ cmd |= PCI_COMMAND_MEMORY; -+ if (cmd != old_cmd) { -+ printk("PCI: Enabling device %s (%04x -> %04x)\n", dev->dev.bus_id, old_cmd, cmd); -+ pci_write_config_word(dev, PCI_COMMAND, cmd); -+ } -+ return 0; -+} -+ -+/* -+ * static void layout_dev(struct pci_dev *dev) -+ * -+ * Layout memory and I/O for a device. -+ * -+ * Parameters: -+ * -+ * device - device to layout memory and I/O for. -+ */ -+ -+static void __init layout_dev(struct pci_dev *dev) -+{ -+ unsigned short cmd; -+ unsigned int base, mask, size, reg; -+ unsigned int alignto; -+ int i; -+ -+ /* -+ * Skip video cards if requested. -+ */ -+ if (((dev->class >> 8 == PCI_CLASS_NOT_DEFINED_VGA) || -+ (dev->class >> 8 == PCI_CLASS_DISPLAY_VGA) || -+ (dev->class >> 8 == PCI_CLASS_DISPLAY_XGA)) && skip_vga){ -+ printk("%s: VGA\n",__FUNCTION__); -+ return; -+ } -+ pci_read_config_word(dev, PCI_COMMAND, &cmd); -+ -+ for (reg = PCI_BASE_ADDRESS_0, i = 0; reg <= PCI_BASE_ADDRESS_5; reg += 4, i++) -+ { -+ /* -+ * Figure out how much space and of what type this -+ * device wants. -+ */ -+ -+ pci_write_config_dword(dev, reg, 0xffffffff); -+ pci_read_config_dword(dev, reg, &base); -+ if (!base) -+ { -+ /* this base-address register is unused */ -+ dev->resource[i].start = 0; -+ dev->resource[i].end = 0; -+ dev->resource[i].flags = 0; -+ continue; -+ } -+ -+ /* -+ * We've read the base address register back after -+ * writing all ones and so now we must decode it. -+ */ -+ -+ if (base & PCI_BASE_ADDRESS_SPACE_IO) -+ { -+ /* -+ * I/O space base address register. -+ */ -+ -+ cmd |= PCI_COMMAND_IO; -+ -+ base &= PCI_BASE_ADDRESS_IO_MASK; -+ mask = (~base << 1) | 0x1; -+ size = (mask & base) & 0xffffffff; -+ -+ /* -+ * Align to multiple of size of minimum base. -+ */ -+ -+#ifdef CONFIG_COLDFIRE -+ alignto = MAX(PAGE_SIZE, size) ; -+#else /* CONFIG_COLDFIRE */ -+ alignto = MAX(0x040, size) ; -+#endif /* CONFIG_COLDFIRE */ -+ base = ALIGN(io_base, alignto); -+ io_base = base + size; -+ pci_write_config_dword(dev, reg, base | PCI_BASE_ADDRESS_SPACE_IO); -+ -+ dev->resource[i].start = base; -+ dev->resource[i].end = dev->resource[i].start + size - 1; -+ dev->resource[i].flags = IORESOURCE_IO | PCI_BASE_ADDRESS_SPACE_IO; -+ -+ DBG_DEVS(("layout_dev: IO address: %x\n", base)); -+ } -+ else -+ { -+ unsigned int type; -+ -+ /* -+ * Memory space base address register. -+ */ -+ -+ cmd |= PCI_COMMAND_MEMORY; -+ type = base & PCI_BASE_ADDRESS_MEM_TYPE_MASK; -+ base &= PCI_BASE_ADDRESS_MEM_MASK; -+ mask = (~base << 1) | 0x1; -+ size = (mask & base) & 0xffffffff; -+ switch (type) -+ { -+ case PCI_BASE_ADDRESS_MEM_TYPE_32: -+ case PCI_BASE_ADDRESS_MEM_TYPE_64: -+ break; -+ -+ case PCI_BASE_ADDRESS_MEM_TYPE_1M: -+ printk("bios32 WARNING: slot %d, function %d " -+ "requests memory below 1MB---don't " -+ "know how to do that.\n", -+ PCI_SLOT(dev->devfn), -+ PCI_FUNC(dev->devfn)); -+ continue; -+ } -+ DBG_DEVS(("%s MEM: base %x,type %x,mask %x,size %x\n", -+ __FUNCTION__, base, type, mask, size)); -+ /* -+ * Align to multiple of size of minimum base. -+ */ -+ -+ alignto = max_t(unsigned int, 0x1000, size); -+ base = ALIGN(mem_base, alignto); -+ mem_base = base + size; -+ pci_write_config_dword(dev, reg, base); -+ -+ dev->resource[i].start = base; -+ dev->resource[i].end = dev->resource[i].start + size - 1; -+ dev->resource[i].flags = IORESOURCE_MEM; -+ DBG_DEVS(("%s MEM :base %x,size %x\n", -+ __FUNCTION__, base, size)); -+ if (type == PCI_BASE_ADDRESS_MEM_TYPE_64) -+ { -+ /* -+ * 64-bit address, set the highest 32 bits -+ * to zero. -+ */ -+ -+ reg += 4; -+ pci_write_config_dword(dev, reg, 0); -+ -+ i++; -+ dev->resource[i].start = 0; -+ dev->resource[i].end = 0; -+ dev->resource[i].flags = 0; -+ printk("%s:type == 64\n",__FUNCTION__); -+ } -+ } -+ } -+ -+ /* -+ * Enable device: -+ */ -+ -+ if (dev->class >> 8 == PCI_CLASS_NOT_DEFINED || -+ dev->class >> 8 == PCI_CLASS_NOT_DEFINED_VGA || -+ dev->class >> 8 == PCI_CLASS_DISPLAY_VGA || -+ dev->class >> 8 == PCI_CLASS_DISPLAY_XGA) -+ { -+ /* -+ * All of these (may) have I/O scattered all around -+ * and may not use i/o-base address registers at all. -+ * So we just have to always enable I/O to these -+ * devices. -+ */ -+ cmd |= PCI_COMMAND_IO; -+ } -+ -+ pci_write_config_word(dev, PCI_COMMAND, cmd | PCI_COMMAND_MASTER); -+ -+ pci_write_config_byte(dev, PCI_LATENCY_TIMER, (disable_pci_burst) ? 0 : 32); -+ -+ if (bus_info != NULL) -+ bus_info->conf_device(dev); /* Machine dependent configuration. */ -+ -+ printk(KERN_INFO "layout_dev: bus %d slot 0x%x VID 0x%x DID 0x%x class 0x%x\n", -+ dev->bus->number, PCI_SLOT(dev->devfn), -+ dev->vendor, dev->device, dev->class); -+} -+ -+/* -+ * static void layout_bus(struct pci_bus *bus) -+ * -+ * Layout memory and I/O for all devices on the given bus. -+ * -+ * Parameters: -+ * -+ * bus - bus. -+ */ -+ -+static void __init layout_bus(struct pci_bus *bus) -+{ -+ unsigned int bio, bmem; -+ struct pci_dev *dev; -+ -+ DBG_DEVS(("layout_bus: starting bus %d\n", bus->number)); -+ -+ if (list_empty(&bus->devices) && list_empty(&bus->children)) -+ return; -+ -+ /* -+ * Align the current bases on appropriate boundaries (4K for -+ * IO and 1MB for memory). -+ */ -+ -+ bio = io_base = ALIGN(io_base, 4*KB); -+ bmem = mem_base = ALIGN(mem_base, 1*MB); -+ -+ /* -+ * PCI devices might have been setup by a PCI BIOS emulation -+ * running under TOS. In these cases there is a -+ * window during which two devices may have an overlapping -+ * address range. To avoid this causing trouble, we first -+ * turn off the I/O and memory address decoders for all PCI -+ * devices. They'll be re-enabled only once all address -+ * decoders are programmed consistently. -+ */ -+ -+ DBG_DEVS(("layout_bus: disable_dev for bus %d\n", bus->number)); -+ -+#ifdef NL_ORIGINAL -+ for (dev = bus->devices; dev; dev = dev->sibling) -+#else -+ dev = NULL; -+ while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) -+#endif -+ { -+ if ((dev->class >> 16 != PCI_BASE_CLASS_BRIDGE) || -+ (dev->class >> 8 == PCI_CLASS_BRIDGE_PCMCIA)) -+ disable_dev(dev); -+ } -+ -+ /* -+ * Allocate space to each device: -+ */ -+ -+ DBG_DEVS(("layout_bus: starting bus %d devices\n", bus->number)); -+ -+#ifdef NL_ORIGINAL -+ for (dev = bus->devices; dev; dev = dev->sibling) -+#else -+ dev = NULL; -+ while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) -+#endif -+ { -+ if ((dev->class >> 16 != PCI_BASE_CLASS_BRIDGE) || -+ (dev->class >> 8 == PCI_CLASS_BRIDGE_PCMCIA)) -+ layout_dev(dev); -+ } -+ -+ DBG_DEVS(("layout_bus: bus %d finished\n", bus->number)); -+} -+ -+/* -+ * static void pcibios_fixup(void) -+ * -+ * Layout memory and I/O of all devices on the PCI bus if 'pci_modify' is -+ * true. This might be necessary because not every m68k machine with a PCI -+ * bus has a PCI BIOS. This function should be called right after -+ * pci_scan_bus() in pcibios_init(). -+ */ -+ -+static void __init pcibios_fixup(void) -+{ -+ DBG_DEVS(("%s\n", __FUNCTION__)); -+ if (pci_modify) -+ { -+ /* -+ * Set base addresses for allocation of I/O and memory space. -+ */ -+ -+ io_base = bus_info->io_space.start + IO_ALLOC_OFFSET; -+ mem_base = bus_info->mem_space.start + MEM_ALLOC_OFFSET; -+ -+ /* -+ * Scan the tree, allocating PCI memory and I/O space. -+ */ -+ -+#ifdef NL_ORIGINAL -+ layout_bus(pci_bus_b(pci_root.next)); -+#else -+ layout_bus(pci_bus_b(pci_root_buses.next)); -+#endif -+ } -+ -+ /* -+ * Fix interrupt assignments, etc. -+ */ -+ -+ bus_info->fixup(pci_modify); -+} -+ -+/* -+ * static void pcibios_claim_resources(struct pci_bus *bus) -+ * -+ * Claim all resources that are assigned to devices on the given bus. -+ * -+ * Parameters: -+ * -+ * bus - bus. -+ */ -+ -+static void __init pcibios_claim_resources(struct pci_bus *bus) -+{ -+ struct pci_dev *dev; -+ int i; -+ DBG_DEVS(("%s\n", __FUNCTION__)); -+#ifdef NL_ORIGINAL -+ while (bus) -+#else -+ while ((bus = pci_find_next_bus(bus)) != NULL) -+#endif -+ { -+ -+#ifdef NL_ORIGINAL -+ for (dev = bus->devices; (dev != NULL); dev = dev->sibling) -+#else -+ dev = NULL; -+ while ((dev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) -+#endif -+ { -+ for (i = 0; i < PCI_NUM_RESOURCES; i++) -+ { -+ struct resource *r = &dev->resource[i]; -+ struct resource *pr; -+ struct pci_bus_info *bus_info = -+ (struct pci_bus_info *) dev->sysdata; -+ -+ if ((r->start == 0) || (r->parent != NULL)) -+ continue; -+ -+#ifdef CONFIG_COLDFIRE -+ if (dev->class >> 16 == PCI_BASE_CLASS_BRIDGE) -+ continue; -+#endif /* CONFIG_COLDFIRE */ -+#if 1 -+ if (r->flags & IORESOURCE_IO) -+ pr = &bus_info->io_space; -+ else -+ pr = &bus_info->mem_space; -+#else -+ if (r->flags & IORESOURCE_IO) -+ pr = &ioport_resource; -+ else -+ pr = &iomem_resource; -+#endif -+ if (request_resource(pr, r) < 0) -+ { -+#ifdef NL_ORIGINAL -+ DBG_DEVS(("PCI: Address space collision on " -+ "region %d of device %s\n", i, dev->name)); -+#else -+ printk("PCI: Address space collision on region %d of device %s\n", i, dev->dev.bus_id); -+#endif -+ } -+ } -+ } -+ -+#ifdef NL_ORIGINAL -+ if (bus->children) -+ pcibios_claim_resources(bus->children); -+#else -+ if (!list_empty(&bus->children)) -+ pcibios_claim_resources(pci_bus_b(bus->children.next)); -+#endif -+ -+#ifdef NL_ORIGINAL -+ bus = bus->next; -+#endif -+ } -+} -+ -+/* -+ * int pcibios_assign_resource(struct pci_dev *dev, int i) -+ * -+ * Assign a new address to a PCI resource. -+ * -+ * Parameters: -+ * -+ * dev - device. -+ * i - resource. -+ * -+ * Result: 0 if successful. -+ */ -+ -+int __init pcibios_assign_resource(struct pci_dev *dev, int i) -+{ -+ struct resource *r = &dev->resource[i]; -+ struct resource *pr = pci_find_parent_resource(dev, r); -+ unsigned long size = r->end + 1; -+ DBG_DEVS(("%s:IO_ALLOC_OFFSET %x\n", __FUNCTION__, IO_ALLOC_OFFSET)); -+ if (!pr) -+ return -EINVAL; -+ -+ if (r->flags & IORESOURCE_IO) -+ { -+ DBG_DEVS(("%s:IORESOURCE_IO:start %x, size %lx\n", -+ __FUNCTION__, bus_info->io_space.start, size)); -+ if (size > 0x100) -+ return -EFBIG; -+ -+#ifdef NL_ORIGINAL -+ if (allocate_resource(pr, r, size, bus_info->io_space.start + -+ IO_ALLOC_OFFSET, bus_info->io_space.end, 1024)) -+#else -+ if (allocate_resource(pr, r, size, bus_info->io_space.start + -+ IO_ALLOC_OFFSET, bus_info->io_space.end, 1024, NULL, NULL)) -+#endif -+ return -EBUSY; -+ } -+ else -+ { -+ DBG_DEVS(("%s:IORESOURCE_MEM:start %x, size %lx\n", -+ __FUNCTION__, bus_info->mem_space.start, size)); -+#ifdef NL_ORIGINAL -+ if (allocate_resource(pr, r, size, bus_info->mem_space.start + -+ MEM_ALLOC_OFFSET, bus_info->mem_space.end, size)) -+#else -+ if (allocate_resource(pr, r, size, bus_info->io_space.start + -+ IO_ALLOC_OFFSET, bus_info->io_space.end, 1024, NULL, NULL)) -+#endif -+ return -EBUSY; -+ } -+ -+ if (i < 6) -+ pci_write_config_dword(dev, PCI_BASE_ADDRESS_0 + 4 * i, r->start); -+ -+ return 0; -+} -+ -+void pcibios_fixup_bus(struct pci_bus *bus) -+{ -+ struct pci_dev *dev; -+ void *sysdata; -+ -+ sysdata = (bus->parent) ? bus->parent->sysdata : bus->sysdata; -+ -+#ifdef NL_ORIGINAL -+ for (dev = bus->devices; (dev != NULL); dev = dev->sibling) -+#else -+ dev = NULL; -+ while ((dev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) -+#endif -+ dev->sysdata = sysdata; -+} -+ -+int __init pcibios_init(void) -+{ -+ printk("Linux/m68k PCI BIOS32 revision %x.%02x\n", MAJOR_REV, MINOR_REV); -+ -+ bus_info = NULL; -+#ifdef CONFIG_COLDFIRE -+ bus_info = init_coldfire_pci(); -+#endif /* CONFIG_COLDFIRE */ -+#ifdef CONFIG_HADES -+ if (MACH_IS_HADES) -+ bus_info = init_hades_pci(); -+#endif -+ if (bus_info != NULL) -+ { -+ printk("PCI: Probing PCI hardware\n"); -+ pci_scan_bus(0, bus_info->m68k_pci_ops, bus_info); -+ pcibios_fixup(); -+#ifdef NL_ORIGINAL -+ pcibios_claim_resources(pci_root); -+#else -+ pcibios_claim_resources(pci_bus_b(pci_root_buses.next)); -+#endif -+ } -+ else -+ printk("PCI: No PCI bus detected\n"); -+ return 0; -+} -+ -+subsys_initcall(pcibios_init); -+ -+char * pcibios_setup(char *str) -+{ -+ if (!strcmp(str, "nomodify")) -+ { -+ pci_modify = 0; -+ return NULL; -+ } -+ else if (!strcmp(str, "skipvga")) -+ { -+ skip_vga = 1; -+ return NULL; -+ } -+ else if (!strcmp(str, "noburst")) -+ { -+ disable_pci_burst = 1; -+ return NULL; -+ } -+ -+ return str; -+} -+#endif /* CONFIG_PCI */ ---- a/arch/m68k/kernel/dma.c -+++ b/arch/m68k/kernel/dma.c -@@ -11,12 +11,24 @@ - #include <linux/kernel.h> - #include <linux/scatterlist.h> - #include <linux/vmalloc.h> -- -+#include <linux/pci.h> - #include <asm/pgalloc.h> - - void *dma_alloc_coherent(struct device *dev, size_t size, - dma_addr_t *handle, gfp_t flag) - { -+#if defined(CONFIG_M547X_8X) | defined(CONFIG_M54455) -+ /* -+ * On the M5445x platform the memory allocated with GFP_DMA -+ * is guaranteed to be DMA'able. -+ */ -+ void *addr; -+ -+ size = PAGE_ALIGN(size); -+ addr = kmalloc(size, GFP_DMA); -+ *handle = virt_to_phys(addr); -+ return addr; -+#else - struct page *page, **map; - pgprot_t pgprot; - void *addr; -@@ -55,6 +67,7 @@ void *dma_alloc_coherent(struct device * - kfree(map); - - return addr; -+#endif - } - EXPORT_SYMBOL(dma_alloc_coherent); - -@@ -62,7 +75,11 @@ void dma_free_coherent(struct device *de - void *addr, dma_addr_t handle) - { - pr_debug("dma_free_coherent: %p, %x\n", addr, handle); -+#if defined(CONFIG_M547X_8X) | defined(CONFIG_M54455) -+ kfree(addr); -+#else - vfree(addr); -+#endif - } - EXPORT_SYMBOL(dma_free_coherent); - ---- a/arch/m68k/kernel/Makefile -+++ b/arch/m68k/kernel/Makefile -@@ -2,19 +2,27 @@ - # Makefile for the linux kernel. - # - --ifndef CONFIG_SUN3 -- extra-y := head.o -+ifdef CONFIG_SUN3 -+ extra-y := sun3-head.o vmlinux.lds -+ obj-y := entry.o signal.o ints.o - else -- extra-y := sun3-head.o -+ifndef CONFIG_COLDFIRE -+ extra-y := head.o vmlinux.lds -+ obj-y := entry.o signal.o traps.o ints.o -+ obj-$(CONFIG_PCI) += bios32.o -+else # CONFIG_COLDFIRE -+ extra-y := ../coldfire/head.o vmlinux.lds -+ifdef CONFIG_M547X_8X -+ obj-$(CONFIG_PCI) += bios32_mcf548x.o -+endif -+endif - endif --extra-y += vmlinux.lds - --obj-y := entry.o process.o traps.o ints.o signal.o ptrace.o module.o \ -+obj-y += process.o ptrace.o module.o \ - sys_m68k.o time.o semaphore.o setup.o m68k_ksyms.o devres.o - - devres-y = ../../../kernel/irq/devres.o - --obj-$(CONFIG_PCI) += bios32.o - obj-y$(CONFIG_MMU_SUN3) += dma.o # no, it's not a typo - - EXTRA_AFLAGS := -traditional ---- a/arch/m68k/kernel/process.c -+++ b/arch/m68k/kernel/process.c -@@ -191,6 +191,7 @@ EXPORT_SYMBOL(kernel_thread); - - void flush_thread(void) - { -+#if !defined(CONFIG_COLDFIRE) - unsigned long zero = 0; - set_fs(USER_DS); - current->thread.fs = __USER_DS; -@@ -198,6 +199,14 @@ void flush_thread(void) - asm volatile (".chip 68k/68881\n\t" - "frestore %0@\n\t" - ".chip 68k" : : "a" (&zero)); -+#else -+ set_fs(USER_DS); -+ current->thread.fs = USER_DS; -+#if defined(CONFIG_FPU) -+ if (!FPU_IS_EMU) -+ asm volatile ("frestore %0@\n\t" : : "a" (&zero)); -+#endif -+#endif - } - - /* -@@ -261,6 +270,7 @@ int copy_thread(int nr, unsigned long cl - * Must save the current SFC/DFC value, NOT the value when - * the parent was last descheduled - RGH 10-08-96 - */ -+#if !defined(CONFIG_COLDFIRE) - p->thread.fs = get_fs().seg; - - if (!FPU_IS_EMU) { -@@ -272,9 +282,34 @@ int copy_thread(int nr, unsigned long cl - "fmoveml %/fpiar/%/fpcr/%/fpsr,%1" - : : "m" (p->thread.fp[0]), "m" (p->thread.fpcntl[0]) - : "memory"); -+#else -+ p->thread.fs = get_fs(); -+ -+#if defined(CONFIG_FPU) -+ if (!FPU_IS_EMU) { -+ /* Copy the current fpu state */ -+ asm volatile ("fsave %0" : : "m" (p->thread.fpstate[0]) -+ : "memory"); -+ -+ if (p->thread.fpstate[0]) { -+ asm volatile ("fmovemd %/fp0-%/fp7,%0" -+ : : "m" (p->thread.fp[0]) -+ : "memory"); -+ asm volatile ("fmovel %/fpiar,%0" -+ : : "m" (p->thread.fpcntl[0]) -+ : "memory"); -+ asm volatile ("fmovel %/fpcr,%0" -+ : : "m" (p->thread.fpcntl[1]) -+ : "memory"); -+ asm volatile ("fmovel %/fpsr,%0" -+ : : "m" (p->thread.fpcntl[2]) -+ : "memory"); -+ } - /* Restore the state in case the fpu was busy */ - asm volatile ("frestore %0" : : "m" (p->thread.fpstate[0])); - } -+#endif -+#endif - - return 0; - } -@@ -283,7 +318,9 @@ int copy_thread(int nr, unsigned long cl - - int dump_fpu (struct pt_regs *regs, struct user_m68kfp_struct *fpu) - { -+#if !defined(CONFIG_COLDFIRE) || defined(CONFIG_FPU) - char fpustate[216]; -+#endif - - if (FPU_IS_EMU) { - int i; -@@ -300,6 +337,7 @@ int dump_fpu (struct pt_regs *regs, stru - } - - /* First dump the fpu context to avoid protocol violation. */ -+#if !defined(CONFIG_COLDFIRE) - asm volatile ("fsave %0" :: "m" (fpustate[0]) : "memory"); - if (!CPU_IS_060 ? !fpustate[0] : !fpustate[2]) - return 0; -@@ -310,6 +348,25 @@ int dump_fpu (struct pt_regs *regs, stru - asm volatile ("fmovemx %/fp0-%/fp7,%0" - :: "m" (fpu->fpregs[0]) - : "memory"); -+#elif defined(CONFIG_FPU) -+ asm volatile ("fsave %0" :: "m" (fpustate[0]) : "memory"); -+ if (!CPU_IS_060 ? !fpustate[0] : !fpustate[2]) -+ return 0; -+ -+ asm volatile ("fmovel %/fpiar,%0" -+ : : "m" (fpu->fpcntl[0]) -+ : "memory"); -+ asm volatile ("fmovel %/fpcr,%0" -+ : : "m" (fpu->fpcntl[1]) -+ : "memory"); -+ asm volatile ("fmovel %/fpsr,%0" -+ : : "m" (fpu->fpcntl[2]) -+ : "memory"); -+ asm volatile ("fmovemd %/fp0-%/fp7,%0" -+ : : "m" (fpu->fpregs[0]) -+ : "memory"); -+#endif -+ - return 1; - } - EXPORT_SYMBOL(dump_fpu); ---- a/arch/m68k/kernel/setup.c -+++ b/arch/m68k/kernel/setup.c -@@ -67,13 +67,22 @@ EXPORT_SYMBOL(m68k_memory); - - struct mem_info m68k_ramdisk; - -+#if !defined(CONFIG_COLDFIRE) - static char m68k_command_line[CL_SIZE]; -+#else -+char m68k_command_line[CL_SIZE]; -+unsigned long uboot_info_stk; -+EXPORT_SYMBOL(uboot_info_stk); -+#endif - - void (*mach_sched_init) (irq_handler_t handler) __initdata = NULL; - /* machine dependent irq functions */ - void (*mach_init_IRQ) (void) __initdata = NULL; - void (*mach_get_model) (char *model); - int (*mach_get_hardware_list) (char *buffer); -+#ifdef CONFIG_COLDFIRE -+void (*mach_tick)(void); -+#endif - /* machine dependent timer functions */ - unsigned long (*mach_gettimeoffset) (void); - int (*mach_hwclk) (int, struct rtc_time*); -@@ -128,13 +137,17 @@ extern void config_hp300(void); - extern void config_q40(void); - extern void config_sun3x(void); - -+#ifdef CONFIG_COLDFIRE -+void coldfire_sort_memrec(void); -+#endif -+ - #define MASK_256K 0xfffc0000 - - extern void paging_init(void); - - static void __init m68k_parse_bootinfo(const struct bi_record *record) - { -- while (record->tag != BI_LAST) { -+ while ((record->tag != BI_LAST) && !(CONFIG_COLDFIRE)) { - int unknown = 0; - const unsigned long *data = record->data; - -@@ -192,7 +205,11 @@ static void __init m68k_parse_bootinfo(c - record->size); - } - -- m68k_realnum_memory = m68k_num_memory; -+#ifdef CONFIG_COLDFIRE -+ coldfire_sort_memrec(); -+#endif -+ -+ m68k_realnum_memory = m68k_num_memory; - #ifdef CONFIG_SINGLE_MEMORY_CHUNK - if (m68k_num_memory > 1) { - printk("Ignoring last %i chunks of physical memory\n", -@@ -205,7 +222,9 @@ static void __init m68k_parse_bootinfo(c - void __init setup_arch(char **cmdline_p) - { - extern int _etext, _edata, _end; -+#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE) - int i; -+#endif - - /* The bootinfo is located right after the kernel bss */ - m68k_parse_bootinfo((const struct bi_record *)&_end); -@@ -220,9 +239,10 @@ void __init setup_arch(char **cmdline_p) - * We should really do our own FPU check at startup. - * [what do we do with buggy 68LC040s? if we have problems - * with them, we should add a test to check_bugs() below] */ --#ifndef CONFIG_M68KFPU_EMU_ONLY -+#if !defined(CONFIG_M68KFPU_EMU_ONLY) && defined(CONFIG_FPU) - /* clear the fpu if we have one */ -- if (m68k_fputype & (FPU_68881|FPU_68882|FPU_68040|FPU_68060)) { -+ if (m68k_fputype & (FPU_68881|FPU_68882|FPU_68040|FPU_68060| -+ FPU_CFV4E)) { - volatile int zero = 0; - asm volatile ("frestore %0" : : "m" (zero)); - } -@@ -310,13 +330,18 @@ void __init setup_arch(char **cmdline_p) - config_sun3x(); - break; - #endif -+#ifdef CONFIG_COLDFIRE -+ case MACH_CFMMU: -+ config_coldfire(); -+ break; -+#endif - default: - panic("No configuration setup"); - } - - paging_init(); - --#ifndef CONFIG_SUN3 -+#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE) - for (i = 1; i < m68k_num_memory; i++) - free_bootmem_node(NODE_DATA(i), m68k_memory[i].addr, - m68k_memory[i].size); -@@ -343,6 +368,10 @@ void __init setup_arch(char **cmdline_p) - - #endif /* !CONFIG_SUN3 */ - -+#ifdef CONFIG_COLDFIRE -+ mmu_context_init(); -+#endif -+ - /* set ISA defs early as possible */ - #if defined(CONFIG_ISA) && defined(MULTI_ISA) - #if defined(CONFIG_Q40) -@@ -373,6 +402,7 @@ static int show_cpuinfo(struct seq_file - #define LOOP_CYCLES_68030 (8) - #define LOOP_CYCLES_68040 (3) - #define LOOP_CYCLES_68060 (1) -+#define LOOP_CYCLES_COLDFIRE (2) - - if (CPU_IS_020) { - cpu = "68020"; -@@ -386,6 +416,9 @@ static int show_cpuinfo(struct seq_file - } else if (CPU_IS_060) { - cpu = "68060"; - clockfactor = LOOP_CYCLES_68060; -+ } else if (CPU_IS_CFV4E) { -+ cpu = "ColdFire V4e"; -+ clockfactor = LOOP_CYCLES_COLDFIRE; - } else { - cpu = "680x0"; - clockfactor = 0; -@@ -404,6 +437,8 @@ static int show_cpuinfo(struct seq_file - fpu = "68060"; - else if (m68k_fputype & FPU_SUNFPA) - fpu = "Sun FPA"; -+ else if (m68k_fputype & FPU_CFV4E) -+ fpu = "ColdFire V4e"; - else - fpu = "none"; - #endif -@@ -420,6 +455,8 @@ static int show_cpuinfo(struct seq_file - mmu = "Sun-3"; - else if (m68k_mmutype & MMU_APOLLO) - mmu = "Apollo"; -+ else if (m68k_mmutype & MMU_CFV4E) -+ mmu = "ColdFire"; - else - mmu = "unknown"; - -@@ -482,7 +519,7 @@ int get_hardware_list(char *buffer) - - void check_bugs(void) - { --#ifndef CONFIG_M68KFPU_EMU -+#if !defined(CONFIG_M68KFPU_EMU) && !defined(CONFIG_M5445X) - if (m68k_fputype == 0) { - printk(KERN_EMERG "*** YOU DO NOT HAVE A FLOATING POINT UNIT, " - "WHICH IS REQUIRED BY LINUX/M68K ***\n"); ---- a/arch/m68k/kernel/sys_m68k.c -+++ b/arch/m68k/kernel/sys_m68k.c -@@ -29,6 +29,9 @@ - #include <asm/traps.h> - #include <asm/page.h> - #include <asm/unistd.h> -+#ifdef CONFIG_COLDFIRE -+#include <asm/cacheflush.h> -+#endif - - /* - * sys_pipe() is the normal C calling standard for creating -@@ -257,6 +260,7 @@ asmlinkage int sys_ipc (uint call, int f - return -EINVAL; - } - -+#ifndef CONFIG_COLDFIRE - /* Convert virtual (user) address VADDR to physical address PADDR */ - #define virt_to_phys_040(vaddr) \ - ({ \ -@@ -580,6 +584,7 @@ cache_flush_060 (unsigned long addr, int - } - return 0; - } -+#endif /* CONFIG_COLDFIRE */ - - /* sys_cacheflush -- flush (part of) the processor cache. */ - asmlinkage int -@@ -612,6 +617,7 @@ sys_cacheflush (unsigned long addr, int - goto out; - } - -+#ifndef CONFIG_COLDFIRE - if (CPU_IS_020_OR_030) { - if (scope == FLUSH_SCOPE_LINE && len < 256) { - unsigned long cacr; -@@ -656,6 +662,16 @@ sys_cacheflush (unsigned long addr, int - ret = cache_flush_060 (addr, scope, cache, len); - } - } -+#else /* CONFIG_COLDFIRE */ -+ if ((cache & FLUSH_CACHE_INSN) && (cache & FLUSH_CACHE_DATA)) -+ flush_bcache(); -+ else if (cache & FLUSH_CACHE_INSN) -+ flush_icache(); -+ else -+ flush_dcache(); -+ -+ ret = 0; -+#endif /* CONFIG_COLDFIRE */ - out: - unlock_kernel(); - return ret; ---- a/arch/m68k/kernel/time.c -+++ b/arch/m68k/kernel/time.c -@@ -40,6 +40,11 @@ static inline int set_rtc_mmss(unsigned - */ - static irqreturn_t timer_interrupt(int irq, void *dummy) - { -+#ifdef CONFIG_COLDFIRE -+ /* kick hardware timer if necessary */ -+ if (mach_tick) -+ mach_tick(); -+#endif - do_timer(1); - #ifndef CONFIG_SMP - update_process_times(user_mode(get_irq_regs())); ---- a/arch/m68k/kernel/vmlinux.lds.S -+++ b/arch/m68k/kernel/vmlinux.lds.S -@@ -1,10 +1,13 @@ - PHDRS - { -- text PT_LOAD FILEHDR PHDRS FLAGS (7); -+ headers PT_PHDR PHDRS ; -+ text PT_LOAD FILEHDR PHDRS FLAGS (5); - data PT_LOAD FLAGS (7); - } - #ifdef CONFIG_SUN3 - #include "vmlinux-sun3.lds" -+#elif CONFIG_COLDFIRE -+#include "../coldfire/vmlinux-cf.lds" - #else - #include "vmlinux-std.lds" - #endif ---- a/arch/m68k/lib/checksum.c -+++ b/arch/m68k/lib/checksum.c -@@ -39,8 +39,131 @@ - * computes a partial checksum, e.g. for TCP/UDP fragments - */ - -+#ifdef CONFIG_COLDFIRE -+ -+static inline unsigned short from32to16(unsigned long x) -+{ -+ /* add up 16-bit and 16-bit for 16+c bit */ -+ x = (x & 0xffff) + (x >> 16); -+ /* add up carry.. */ -+ x = (x & 0xffff) + (x >> 16); -+ return x; -+} -+ -+static unsigned long do_csum(const unsigned char *buff, int len) -+{ -+ int odd, count; -+ unsigned long result = 0; -+ -+ if (len <= 0) -+ goto out; -+ odd = 1 & (unsigned long) buff; -+ if (odd) { -+ result = *buff; -+ len--; -+ buff++; -+ } -+ count = len >> 1; /* nr of 16-bit words.. */ -+ if (count) { -+ if (2 & (unsigned long) buff) { -+ result += *(unsigned short *) buff; -+ count--; -+ len -= 2; -+ buff += 2; -+ } -+ count >>= 1; /* nr of 32-bit words.. */ -+ if (count) { -+ unsigned long carry = 0; -+ do { -+ unsigned long w = *(unsigned long *) buff; -+ count--; -+ buff += 4; -+ result += carry; -+ result += w; -+ carry = (w > result); -+ } while (count); -+ result += carry; -+ result = (result & 0xffff) + (result >> 16); -+ } -+ if (len & 2) { -+ result += *(unsigned short *) buff; -+ buff += 2; -+ } -+ } -+ if (len & 1) -+ result += (*buff << 8); -+ result = from32to16(result); -+ if (odd) -+ result = ((result >> 8) & 0xff) | ((result & 0xff) << 8); -+out: -+ return result; -+} -+ -+/* -+ * This is a version of ip_compute_csum() optimized for IP headers, -+ * which always checksum on 4 octet boundaries. -+ */ -+__sum16 ip_fast_csum(const void *iph, unsigned int ihl) -+{ -+ return ~do_csum(iph, ihl*4); -+} -+EXPORT_SYMBOL(ip_fast_csum); -+ -+/* -+ * computes the checksum of a memory block at buff, length len, -+ * and adds in "sum" (32-bit) -+ * -+ * returns a 32-bit number suitable for feeding into itself -+ * or csum_tcpudp_magic -+ * -+ * this function must be called with even lengths, except -+ * for the last fragment, which may be odd -+ * -+ * it's best to have buff aligned on a 32-bit boundary -+ */ - __wsum csum_partial(const void *buff, int len, __wsum sum) - { -+ unsigned int result = do_csum(buff, len); -+ -+ /* add in old sum, and carry.. */ -+ result += sum; -+ if (sum > result) -+ result += 1; -+ return result; -+} -+EXPORT_SYMBOL(csum_partial); -+ -+/* -+ * copy from fs while checksumming, otherwise like csum_partial -+ */ -+ -+__wsum -+csum_partial_copy_from_user(const void __user *src, void *dst, int len, -+ __wsum sum, int *csum_err) -+{ -+ if (csum_err) *csum_err = 0; -+ memcpy(dst, src, len); -+ return csum_partial(dst, len, sum); -+} -+EXPORT_SYMBOL(csum_partial_copy_from_user); -+ -+/* -+ * copy from ds while checksumming, otherwise like csum_partial -+ */ -+ -+__wsum -+csum_partial_copy_nocheck(const void *src, void *dst, int len, __wsum sum) -+{ -+ memcpy(dst, src, len); -+ return csum_partial(dst, len, sum); -+} -+EXPORT_SYMBOL(csum_partial_copy_nocheck); -+ -+#else /* !CONFIG_COLDFIRE */ -+ -+unsigned int -+csum_partial(const unsigned char *buff, int len, unsigned int sum) -+{ - unsigned long tmp1, tmp2; - /* - * Experiments with ethernet and slip connections show that buff -@@ -423,3 +546,4 @@ csum_partial_copy_nocheck(const void *sr - return(sum); - } - EXPORT_SYMBOL(csum_partial_copy_nocheck); -+#endif /* CONFIG_COLDFIRE */ ---- a/arch/m68k/lib/muldi3.c -+++ b/arch/m68k/lib/muldi3.c -@@ -21,12 +21,22 @@ Boston, MA 02111-1307, USA. */ - - #define BITS_PER_UNIT 8 - -+#ifdef CONFIG_COLDFIRE -+#define umul_ppmm(w1, w0, u, v) \ -+ do { \ -+ unsigned long long x; \ -+ x = (unsigned long long)u * v; \ -+ w0 = (unsigned long)(x & 0x00000000ffffffff); \ -+ w1 = (unsigned long)(x & 0xffffffff00000000) >> 32; \ -+ } while (0) -+#else /* CONFIG_COLDFIRE */ - #define umul_ppmm(w1, w0, u, v) \ - __asm__ ("mulu%.l %3,%1:%0" \ - : "=d" ((USItype)(w0)), \ - "=d" ((USItype)(w1)) \ - : "%0" ((USItype)(u)), \ - "dmi" ((USItype)(v))) -+#endif /* CONFIG_COLDFIRE */ - - #define __umulsidi3(u, v) \ - ({DIunion __w; \ ---- a/arch/m68k/lib/semaphore.S -+++ b/arch/m68k/lib/semaphore.S -@@ -16,11 +16,24 @@ - * there is contention on the semaphore. - */ - ENTRY(__down_failed) -+#ifndef CONFIG_COLDFIRE - moveml %a0/%d0/%d1,-(%sp) -+#else -+ movel %a0,-(%sp) -+ movel %d0,-(%sp) -+ movel %d1,-(%sp) -+#endif - movel %a1,-(%sp) - jbsr __down - movel (%sp)+,%a1 -+#ifndef CONFIG_COLDFIRE - moveml (%sp)+,%a0/%d0/%d1 -+#else -+ movel (%sp)+,%d1 -+ movel (%sp)+,%d0 -+ movel (%sp)+,%a0 -+#endif -+ - rts - - ENTRY(__down_failed_interruptible) -@@ -44,10 +57,22 @@ ENTRY(__down_failed_trylock) - rts - - ENTRY(__up_wakeup) -+#ifndef CONFIG_COLDFIRE - moveml %a0/%d0/%d1,-(%sp) -+#else -+ movel %a0,-(%sp) -+ movel %d0,-(%sp) -+ movel %d1,-(%sp) -+#endif - movel %a1,-(%sp) - jbsr __up - movel (%sp)+,%a1 -+#ifndef CONFIG_COLDFIRE - moveml (%sp)+,%a0/%d0/%d1 -+#else -+ movel (%sp)+,%d1 -+ movel (%sp)+,%d0 -+ movel (%sp)+,%a0 -+#endif - rts - ---- a/arch/m68k/lib/string.c -+++ b/arch/m68k/lib/string.c -@@ -15,6 +15,7 @@ char *strcpy(char *dest, const char *src - } - EXPORT_SYMBOL(strcpy); - -+#ifndef CONFIG_COLDFIRE - void *memset(void *s, int c, size_t count) - { - void *xs = s; -@@ -143,6 +144,69 @@ void *memcpy(void *to, const void *from, - } - EXPORT_SYMBOL(memcpy); - -+#else /* CONFIG_COLDFIRE */ -+ -+void *memset(void *s, int c, size_t count) -+{ -+ unsigned long x; -+ void *originalTo; -+ -+ for (x = 0; x < count; x++) -+ *(unsigned char *)s++ = (unsigned char)c; -+ -+ return originalTo; -+} -+EXPORT_SYMBOL(memset); -+ -+void *memcpy(void *to, const void *from, size_t n) -+{ -+ void *xto = to; -+ size_t temp; -+ -+ if (!n) -+ return xto; -+ if ((long) to & 1) { -+ char *cto = to; -+ const char *cfrom = from; -+ *cto++ = *cfrom++; -+ to = cto; -+ from = cfrom; -+ n--; -+ } -+ if (n > 2 && (long) to & 2) { -+ short *sto = to; -+ const short *sfrom = from; -+ *sto++ = *sfrom++; -+ to = sto; -+ from = sfrom; -+ n -= 2; -+ } -+ temp = n >> 2; -+ if (temp) { -+ long *lto = to; -+ const long *lfrom = from; -+ for (; temp; temp--) -+ *lto++ = *lfrom++; -+ to = lto; -+ from = lfrom; -+ } -+ if (n & 2) { -+ short *sto = to; -+ const short *sfrom = from; -+ *sto++ = *sfrom++; -+ to = sto; -+ from = sfrom; -+ } -+ if (n & 1) { -+ char *cto = to; -+ const char *cfrom = from; -+ *cto = *cfrom; -+ } -+ return xto; -+} -+EXPORT_SYMBOL(memcpy); -+#endif /* CONFIG_COLDFIRE */ -+ - void *memmove(void *dest, const void *src, size_t n) - { - void *xdest = dest; ---- a/arch/m68k/lib/uaccess.c -+++ b/arch/m68k/lib/uaccess.c -@@ -5,6 +5,7 @@ - */ - - #include <linux/module.h> -+#ifndef CONFIG_COLDFIRE - #include <asm/uaccess.h> - - unsigned long __generic_copy_from_user(void *to, const void __user *from, -@@ -220,3 +221,244 @@ unsigned long __clear_user(void __user * - return res; - } - EXPORT_SYMBOL(__clear_user); -+ -+#else /* CONFIG_COLDFIRE */ -+ -+#include <asm/cf_uaccess.h> -+ -+unsigned long __generic_copy_from_user(void *to, const void *from, -+ unsigned long n) -+{ -+ unsigned long tmp; -+ __asm__ __volatile__ -+ (" tstl %2\n" -+ " jeq 2f\n" -+ "1: movel (%1)+,%3\n" -+ " movel %3,(%0)+\n" -+ " subql #1,%2\n" -+ " jne 1b\n" -+ "2: movel %4,%2\n" -+ " bclr #1,%2\n" -+ " jeq 4f\n" -+ "3: movew (%1)+,%3\n" -+ " movew %3,(%0)+\n" -+ "4: bclr #0,%2\n" -+ " jeq 6f\n" -+ "5: moveb (%1)+,%3\n" -+ " moveb %3,(%0)+\n" -+ "6:\n" -+ ".section .fixup,\"ax\"\n" -+ " .even\n" -+ "7: movel %2,%%d0\n" -+ "71:clrl (%0)+\n" -+ " subql #1,%%d0\n" -+ " jne 71b\n" -+ " lsll #2,%2\n" -+ " addl %4,%2\n" -+ " btst #1,%4\n" -+ " jne 81f\n" -+ " btst #0,%4\n" -+ " jne 91f\n" -+ " jra 6b\n" -+ "8: addql #2,%2\n" -+ "81:clrw (%0)+\n" -+ " btst #0,%4\n" -+ " jne 91f\n" -+ " jra 6b\n" -+ "9: addql #1,%2\n" -+ "91:clrb (%0)+\n" -+ " jra 6b\n" -+ ".previous\n" -+ ".section __ex_table,\"a\"\n" -+ " .align 4\n" -+ " .long 1b,7b\n" -+ " .long 3b,8b\n" -+ " .long 5b,9b\n" -+ ".previous" -+ : "=a"(to), "=a"(from), "=d"(n), "=&d"(tmp) -+ : "d"(n & 3), "0"(to), "1"(from), "2"(n/4) -+ : "d0", "memory"); -+ return n; -+} -+EXPORT_SYMBOL(__generic_copy_from_user); -+ -+ -+unsigned long __generic_copy_to_user(void *to, const void *from, -+ unsigned long n) -+{ -+ unsigned long tmp; -+ __asm__ __volatile__ -+ (" tstl %2\n" -+ " jeq 3f\n" -+ "1: movel (%1)+,%3\n" -+ "22:movel %3,(%0)+\n" -+ "2: subql #1,%2\n" -+ " jne 1b\n" -+ "3: movel %4,%2\n" -+ " bclr #1,%2\n" -+ " jeq 4f\n" -+ " movew (%1)+,%3\n" -+ "24:movew %3,(%0)+\n" -+ "4: bclr #0,%2\n" -+ " jeq 5f\n" -+ " moveb (%1)+,%3\n" -+ "25:moveb %3,(%0)+\n" -+ "5:\n" -+ ".section .fixup,\"ax\"\n" -+ " .even\n" -+ "60:addql #1,%2\n" -+ "6: lsll #2,%2\n" -+ " addl %4,%2\n" -+ " jra 5b\n" -+ "7: addql #2,%2\n" -+ " jra 5b\n" -+ "8: addql #1,%2\n" -+ " jra 5b\n" -+ ".previous\n" -+ ".section __ex_table,\"a\"\n" -+ " .align 4\n" -+ " .long 1b,60b\n" -+ " .long 22b,6b\n" -+ " .long 2b,6b\n" -+ " .long 24b,7b\n" -+ " .long 3b,60b\n" -+ " .long 4b,7b\n" -+ " .long 25b,8b\n" -+ " .long 5b,8b\n" -+ ".previous" -+ : "=a"(to), "=a"(from), "=d"(n), "=&d"(tmp) -+ : "r"(n & 3), "0"(to), "1"(from), "2"(n / 4) -+ : "memory"); -+ return n; -+} -+EXPORT_SYMBOL(__generic_copy_to_user); -+ -+/* -+ * Copy a null terminated string from userspace. -+ */ -+ -+long strncpy_from_user(char *dst, const char *src, long count) -+{ -+ long res = -EFAULT; -+ if (!(access_ok(VERIFY_READ, src, 1))) /* --tym-- */ -+ return res; -+ if (count == 0) return count; -+ __asm__ __volatile__ -+ ("1: moveb (%2)+,%%d0\n" -+ "12:moveb %%d0,(%1)+\n" -+ " jeq 2f\n" -+ " subql #1,%3\n" -+ " jne 1b\n" -+ "2: subl %3,%0\n" -+ "3:\n" -+ ".section .fixup,\"ax\"\n" -+ " .even\n" -+ "4: movel %4,%0\n" -+ " jra 3b\n" -+ ".previous\n" -+ ".section __ex_table,\"a\"\n" -+ " .align 4\n" -+ " .long 1b,4b\n" -+ " .long 12b,4b\n" -+ ".previous" -+ : "=d"(res), "=a"(dst), "=a"(src), "=d"(count) -+ : "i"(-EFAULT), "0"(count), "1"(dst), "2"(src), "3"(count) -+ : "d0", "memory"); -+ return res; -+} -+EXPORT_SYMBOL(strncpy_from_user); -+ -+/* -+ * Return the size of a string (including the ending 0) -+ * -+ * Return 0 on exception, a value greater than N if too long -+ */ -+long strnlen_user(const char *src, long n) -+{ -+ long res = -EFAULT; -+ if (!(access_ok(VERIFY_READ, src, 1))) /* --tym-- */ -+ return res; -+ -+ res = -(long)src; -+ __asm__ __volatile__ -+ ("1:\n" -+ " tstl %2\n" -+ " jeq 3f\n" -+ "2: moveb (%1)+,%%d0\n" -+ "22:\n" -+ " subql #1,%2\n" -+ " tstb %%d0\n" -+ " jne 1b\n" -+ " jra 4f\n" -+ "3:\n" -+ " addql #1,%0\n" -+ "4:\n" -+ " addl %1,%0\n" -+ "5:\n" -+ ".section .fixup,\"ax\"\n" -+ " .even\n" -+ "6: moveq %3,%0\n" -+ " jra 5b\n" -+ ".previous\n" -+ ".section __ex_table,\"a\"\n" -+ " .align 4\n" -+ " .long 2b,6b\n" -+ " .long 22b,6b\n" -+ ".previous" -+ : "=d"(res), "=a"(src), "=d"(n) -+ : "i"(0), "0"(res), "1"(src), "2"(n) -+ : "d0"); -+ return res; -+} -+EXPORT_SYMBOL(strnlen_user); -+ -+ -+/* -+ * Zero Userspace -+ */ -+ -+unsigned long __clear_user(void *to, unsigned long n) -+{ -+ __asm__ __volatile__ -+ (" tstl %1\n" -+ " jeq 3f\n" -+ "1: movel %3,(%0)+\n" -+ "2: subql #1,%1\n" -+ " jne 1b\n" -+ "3: movel %2,%1\n" -+ " bclr #1,%1\n" -+ " jeq 4f\n" -+ "24:movew %3,(%0)+\n" -+ "4: bclr #0,%1\n" -+ " jeq 5f\n" -+ "25:moveb %3,(%0)+\n" -+ "5:\n" -+ ".section .fixup,\"ax\"\n" -+ " .even\n" -+ "61:addql #1,%1\n" -+ "6: lsll #2,%1\n" -+ " addl %2,%1\n" -+ " jra 5b\n" -+ "7: addql #2,%1\n" -+ " jra 5b\n" -+ "8: addql #1,%1\n" -+ " jra 5b\n" -+ ".previous\n" -+ ".section __ex_table,\"a\"\n" -+ " .align 4\n" -+ " .long 1b,61b\n" -+ " .long 2b,6b\n" -+ " .long 3b,61b\n" -+ " .long 24b,7b\n" -+ " .long 4b,7b\n" -+ " .long 25b,8b\n" -+ " .long 5b,8b\n" -+ ".previous" -+ : "=a"(to), "=d"(n) -+ : "r"(n & 3), "d"(0), "0"(to), "1"(n/4)); -+ return n; -+} -+EXPORT_SYMBOL(__clear_user); -+ -+#endif /* CONFIG_COLDFIRE */ -+ ---- a/arch/m68k/Makefile -+++ b/arch/m68k/Makefile -@@ -16,7 +16,9 @@ - KBUILD_DEFCONFIG := amiga_defconfig - - # override top level makefile -+ifndef CONFIG_COLDFIRE - AS += -m68020 -+endif - LDFLAGS := -m m68kelf - LDFLAGS_MODULE += -T $(srctree)/arch/m68k/kernel/module.lds - ifneq ($(SUBARCH),$(ARCH)) -@@ -30,12 +32,18 @@ ifdef CONFIG_SUN3 - LDFLAGS_vmlinux = -N - endif - -+ifdef CONFIG_COLDFIRE -+# OBJCOPYFLAGS := -R .note -R .note.gnu.build-id -R .comment -S -+# LDFLAGS_vmlinux = --verbose -+endif -+ - CHECKFLAGS += -D__mc68000__ - - # without -fno-strength-reduce the 53c7xx.c driver fails ;-( - KBUILD_CFLAGS += -pipe -fno-strength-reduce -ffixed-a2 - - # enable processor switch if compiled only for a single cpu -+ifndef CONFIG_COLDFIRE - ifndef CONFIG_M68020 - ifndef CONFIG_M68030 - -@@ -49,6 +57,16 @@ endif - - endif - endif -+endif -+ -+ifdef CONFIG_M5445X -+KBUILD_CFLAGS += -march=isac -mcpu=54455 -msoft-float -g -+KBUILD_AFLAGS += -march=isac -mcpu=54455 -msoft-float -+endif -+ifdef CONFIG_M547X_8X -+KBUILD_CFLAGS += -mcfv4e -g -+KBUILD_AFLAGS += -mcfv4e -+endif - - ifdef CONFIG_KGDB - # If configured for kgdb support, include debugging infos and keep the -@@ -57,8 +75,12 @@ KBUILD_CFLAGS := $(subst -fomit-frame-po - endif - - ifndef CONFIG_SUN3 -+ifndef CONFIG_COLDFIRE - head-y := arch/m68k/kernel/head.o - else -+head-y := arch/m68k/coldfire/head.o -+endif -+else - head-y := arch/m68k/kernel/sun3-head.o - endif - -@@ -79,6 +101,7 @@ core-$(CONFIG_SUN3) += arch/m68k/sun3/ - core-$(CONFIG_M68040) += arch/m68k/fpsp040/ - core-$(CONFIG_M68060) += arch/m68k/ifpsp060/ - core-$(CONFIG_M68KFPU_EMU) += arch/m68k/math-emu/ -+core-$(CONFIG_COLDFIRE) += arch/m68k/coldfire/ - - all: zImage - ---- a/arch/m68k/mm/cache.c -+++ b/arch/m68k/mm/cache.c -@@ -10,7 +10,11 @@ - #include <asm/pgalloc.h> - #include <asm/traps.h> - -+#ifdef CONFIG_COLDFIRE -+#include <asm/cfcache.h> -+#endif /* CONFIG_COLDFIRE */ - -+#ifndef CONFIG_COLDFIRE - static unsigned long virt_to_phys_slow(unsigned long vaddr) - { - if (CPU_IS_060) { -@@ -69,11 +73,18 @@ static unsigned long virt_to_phys_slow(u - } - return 0; - } -+#endif /* CONFIG_COLDFIRE */ -+ - - /* Push n pages at kernel virtual address and clear the icache */ - /* RZ: use cpush %bc instead of cpush %dc, cinv %ic */ - void flush_icache_range(unsigned long address, unsigned long endaddr) - { -+#ifdef CONFIG_COLDFIRE -+// JKM -- hack until new cpushl stuff is in -+// cf_icache_flush_range(address, endaddr); -+ flush_icache(); -+#else /* !CONFIG_COLDFIRE */ - - if (CPU_IS_040_OR_060) { - address &= PAGE_MASK; -@@ -94,9 +105,11 @@ void flush_icache_range(unsigned long ad - : "=&d" (tmp) - : "di" (FLUSH_I)); - } -+#endif /* CONFIG_COLDFIRE */ - } - EXPORT_SYMBOL(flush_icache_range); - -+#ifndef CONFIG_COLDFIRE - void flush_icache_user_range(struct vm_area_struct *vma, struct page *page, - unsigned long addr, int len) - { -@@ -115,4 +128,5 @@ void flush_icache_user_range(struct vm_a - : "di" (FLUSH_I)); - } - } -+#endif /* CONFIG_COLDFIRE */ - ---- /dev/null -+++ b/arch/m68k/mm/cf-mmu.c -@@ -0,0 +1,260 @@ -+/* -+ * linux/arch/m68k/mm/cf-mmu.c -+ * -+ * Based upon linux/arch/m68k/mm/sun3mmu.c -+ * Based upon linux/arch/ppc/mm/mmu_context.c -+ * -+ * Implementations of mm routines specific to the Coldfire MMU. -+ * -+ * Copyright (c) 2008 Freescale Semiconductor, Inc. -+ */ -+ -+#include <linux/signal.h> -+#include <linux/sched.h> -+#include <linux/mm.h> -+#include <linux/swap.h> -+#include <linux/kernel.h> -+#include <linux/string.h> -+#include <linux/types.h> -+#include <linux/init.h> -+#ifdef CONFIG_BLK_DEV_RAM -+#include <linux/blkdev.h> -+#endif -+#include <linux/bootmem.h> -+ -+#include <asm/setup.h> -+#include <asm/uaccess.h> -+#include <asm/page.h> -+#include <asm/pgtable.h> -+#include <asm/system.h> -+#include <asm/machdep.h> -+#include <asm/io.h> -+#include <asm/mmu_context.h> -+#include <asm/cf_pgalloc.h> -+ -+#include <asm/coldfire.h> -+#include <asm/tlbflush.h> -+ -+#define KMAPAREA(x) ((x >= VMALLOC_START) && ( x < KMAP_END)) -+ -+#undef DEBUG -+ -+mm_context_t next_mmu_context; -+unsigned long context_map[LAST_CONTEXT / BITS_PER_LONG + 1]; -+ -+atomic_t nr_free_contexts; -+struct mm_struct *context_mm[LAST_CONTEXT+1]; -+void steal_context(void); -+ -+ -+const char bad_pmd_string[] = "Bad pmd in pte_alloc: %08lx\n"; -+ -+extern unsigned long empty_bad_page_table; -+extern unsigned long empty_bad_page; -+extern unsigned long num_pages; -+ -+extern char __init_begin, __init_end; -+ -+void free_initmem(void) -+{ -+#if 0 -+ unsigned long addr; -+ unsigned long start = (unsigned long)&__init_begin; -+ unsigned long end = (unsigned long)&__init_end; -+ -+ printk(KERN_INFO "free_initmem: __init_begin = 0x%lx __init_end = 0x%lx\n", start, end); -+ -+ addr = (unsigned long)&__init_begin; -+ for (; addr < (unsigned long)&__init_end; addr += PAGE_SIZE) { -+ /* not currently used */ -+ virt_to_page(addr)->flags &= ~(1 << PG_reserved); -+ init_page_count(virt_to_page(addr)); -+ free_page(addr); -+ totalram_pages++; -+ } -+#endif -+} -+ -+/* Coldfire paging_init derived from sun3 */ -+void __init paging_init(void) -+{ -+ pgd_t * pg_dir; -+ pte_t * pg_table; -+ int i; -+ unsigned long address; -+ unsigned long next_pgtable; -+ unsigned long bootmem_end; -+ unsigned long zones_size[MAX_NR_ZONES]; -+ unsigned long size; -+ enum zone_type zone; -+ -+ empty_zero_page = (void *)alloc_bootmem_pages(PAGE_SIZE); -+ memset((void *)empty_zero_page, 0, PAGE_SIZE); -+ -+ pg_dir = swapper_pg_dir; -+ memset(swapper_pg_dir, 0, sizeof (swapper_pg_dir)); -+ -+ size = num_pages * sizeof(pte_t); -+ size = (size + PAGE_SIZE) & ~(PAGE_SIZE-1); -+ next_pgtable = (unsigned long)alloc_bootmem_pages(size); -+ -+ bootmem_end = (next_pgtable + size + PAGE_SIZE) & PAGE_MASK; -+ pg_dir += PAGE_OFFSET >> PGDIR_SHIFT; -+ -+ address = PAGE_OFFSET; -+ while (address < (unsigned long)high_memory) -+ { -+ pg_table = (pte_t *)next_pgtable; -+ next_pgtable += PTRS_PER_PTE * sizeof (pte_t); -+ pgd_val(*pg_dir) = (unsigned long) pg_table; -+ pg_dir++; -+ -+ /* now change pg_table to kernel virtual addresses */ -+ for (i=0; i<PTRS_PER_PTE; ++i, ++pg_table) -+ { -+ pte_t pte = pfn_pte(virt_to_pfn(address), PAGE_INIT); -+ if (address >= (unsigned long)high_memory) -+ pte_val (pte) = 0; -+ -+ set_pte (pg_table, pte); -+ address += PAGE_SIZE; -+ } -+ } -+ -+ current->mm = NULL; -+ -+ /* clear zones */ -+ for (zone = 0; zone < MAX_NR_ZONES; zone++) -+ zones_size[zone] = 0x0; -+ -+ /* allocate the bottom 32M (0x40x 0x41x) to DMA - head.S marks them NO CACHE */ -+ /* JKM - this should be changed to allocate from the TOP (0x4f,0x4e) but the -+ * allocator is being a bit challenging */ -+ zones_size[ZONE_DMA] = (32*1024*1024) >> PAGE_SHIFT; -+ -+ /* allocate the rest to NORMAL - head.S marks them CACHE */ -+ zones_size[ZONE_NORMAL] = (((unsigned long)high_memory - PAGE_OFFSET) >> PAGE_SHIFT) - zones_size[0]; -+ -+ free_area_init(zones_size); -+} -+ -+ -+int cf_tlb_miss(struct pt_regs *regs, int write, int dtlb, int extension_word) -+{ -+ struct mm_struct *mm; -+ pgd_t *pgd; -+ pmd_t *pmd; -+ pte_t *pte; -+ unsigned long mmuar; -+ int asid; -+ int flags; -+ -+ local_save_flags(flags); -+ local_irq_disable(); -+ -+ mmuar = ( dtlb ) ? regs->mmuar -+ : regs->pc + (extension_word * sizeof(long)); -+ -+ mm = (!user_mode(regs) && KMAPAREA(mmuar)) ? &init_mm : current->mm; -+ -+ if (!mm) { -+ local_irq_restore(flags); -+ return (-1); -+ } -+ -+ pgd = pgd_offset(mm, mmuar); -+ if (pgd_none(*pgd)) { -+ local_irq_restore(flags); -+ return (-1); -+ } -+ -+ pmd = pmd_offset(pgd, mmuar); -+ if (pmd_none(*pmd)) { -+ local_irq_restore(flags); -+ return (-1); -+ } -+ -+ pte = (KMAPAREA(mmuar)) ? pte_offset_kernel(pmd, mmuar) -+ : pte_offset_map(pmd, mmuar); -+ if (pte_none(*pte) || !pte_present(*pte)) { -+ local_irq_restore(flags); -+ return (-1); -+ } -+ -+ if (write) { -+ if (!pte_write(*pte)) { -+ local_irq_restore(flags); -+ return (-1); -+ } -+ set_pte(pte, pte_mkdirty(*pte)); -+ } -+ -+ set_pte(pte, pte_mkyoung(*pte)); -+ asid = mm->context & 0xff; -+ if (!pte_dirty(*pte) && !KMAPAREA(mmuar)) -+ set_pte(pte, pte_wrprotect(*pte)); -+ -+ *MMUTR = (mmuar & PAGE_MASK) | (asid << CF_ASID_MMU_SHIFT) -+ | (((int)(pte->pte) & (int)CF_PAGE_MMUTR_MASK ) >> CF_PAGE_MMUTR_SHIFT) -+ | MMUTR_V; -+ -+ *MMUDR = (pte_val(*pte) & PAGE_MASK) -+ | ((pte->pte) & CF_PAGE_MMUDR_MASK) -+ | MMUDR_SZ8K | MMUDR_X; -+ -+ if ( dtlb ) -+ *MMUOR = MMUOR_ACC | MMUOR_UAA; -+ else -+ *MMUOR = MMUOR_ITLB | MMUOR_ACC | MMUOR_UAA; -+ -+ asm("nop"); -+ -+#ifdef DEBUG -+ printk("cf_tlb_miss: va=%lx, pa=%lx\n", (mmuar & PAGE_MASK), -+ (pte_val(*pte) & PAGE_MASK)); -+#endif -+ local_irq_restore(flags); -+ return (0); -+} -+ -+ -+/* The following was taken from arch/ppc/mmu_context.c -+ * -+ * Initialize the context management stuff. -+ */ -+void __init mmu_context_init(void) -+{ -+ /* -+ * Some processors have too few contexts to reserve one for -+ * init_mm, and require using context 0 for a normal task. -+ * Other processors reserve the use of context zero for the kernel. -+ * This code assumes FIRST_CONTEXT < 32. -+ */ -+ context_map[0] = (1 << FIRST_CONTEXT) - 1; -+ next_mmu_context = FIRST_CONTEXT; -+ atomic_set(&nr_free_contexts, LAST_CONTEXT - FIRST_CONTEXT + 1); -+} -+ -+/* -+ * Steal a context from a task that has one at the moment. -+ * This is only used on 8xx and 4xx and we presently assume that -+ * they don't do SMP. If they do then thicfpgalloc.hs will have to check -+ * whether the MM we steal is in use. -+ * We also assume that this is only used on systems that don't -+ * use an MMU hash table - this is true for 8xx and 4xx. -+ * This isn't an LRU system, it just frees up each context in -+ * turn (sort-of pseudo-random replacement :). This would be the -+ * place to implement an LRU scheme if anyone was motivated to do it. -+ * -- paulus -+ */ -+void steal_context(void) -+{ -+ struct mm_struct *mm; -+ /* free up context `next_mmu_context' */ -+ /* if we shouldn't free context 0, don't... */ -+ if (next_mmu_context < FIRST_CONTEXT) -+ next_mmu_context = FIRST_CONTEXT; -+ mm = context_mm[next_mmu_context]; -+ flush_tlb_mm(mm); -+ destroy_context(mm); -+} ---- /dev/null -+++ b/arch/m68k/mm/cf-mmu.c.orig -@@ -0,0 +1,265 @@ -+/* -+ * linux/arch/m68k/mm/cf-mmu.c -+ * -+ * Based upon linux/arch/m68k/mm/sun3mmu.c -+ * Based upon linux/arch/ppc/mm/mmu_context.c -+ * -+ * Implementations of mm routines specific to the Coldfire MMU. -+ * -+ * Copyright (c) 2008 Freescale Semiconductor, Inc. -+ */ -+ -+#include <linux/signal.h> -+#include <linux/sched.h> -+#include <linux/mm.h> -+#include <linux/swap.h> -+#include <linux/kernel.h> -+#include <linux/string.h> -+#include <linux/types.h> -+#include <linux/init.h> -+#ifdef CONFIG_BLK_DEV_RAM -+#include <linux/blkdev.h> -+#endif -+#include <linux/bootmem.h> -+ -+#include <asm/setup.h> -+#include <asm/uaccess.h> -+#include <asm/page.h> -+#include <asm/pgtable.h> -+#include <asm/system.h> -+#include <asm/machdep.h> -+#include <asm/io.h> -+#include <asm/mmu_context.h> -+#include <asm/cf_pgalloc.h> -+ -+#include <asm/coldfire.h> -+#include <asm/tlbflush.h> -+ -+#if PAGE_OFFSET == CONFIG_SDRAM_BASE -+#define KERNRAM(x) ((x >= PAGE_OFFSET) && (x < (PAGE_OFFSET + CONFIG_SDRAM_SIZE))) -+#else -+#define KERNRAM(x) (x >= PAGE_OFFSET) -+#endif -+ -+mm_context_t next_mmu_context; -+unsigned long context_map[LAST_CONTEXT / BITS_PER_LONG + 1]; -+ -+atomic_t nr_free_contexts; -+struct mm_struct *context_mm[LAST_CONTEXT+1]; -+void steal_context(void); -+ -+ -+const char bad_pmd_string[] = "Bad pmd in pte_alloc: %08lx\n"; -+ -+extern unsigned long empty_bad_page_table; -+extern unsigned long empty_bad_page; -+extern unsigned long num_pages; -+ -+extern char __init_begin, __init_end; -+ -+void free_initmem(void) -+{ -+#if 0 -+ unsigned long addr; -+ unsigned long start = (unsigned long)&__init_begin; -+ unsigned long end = (unsigned long)&__init_end; -+ -+/* -+ * JKM -- revisit -- the latest round of vmlinux.lds changes has caused -+ * a little grief with how init areas are handled. With the new toolchain -+ * release I'll fix this. -+ */ -+ printk(KERN_INFO "free_initmem: __init_begin = 0x%lx __init_end = 0x%lx\n", start, end); -+ -+ addr = (unsigned long)&__init_begin; -+ for (; addr < (unsigned long)&__init_end; addr += PAGE_SIZE) { -+ /* not currently used */ -+ virt_to_page(addr)->flags &= ~(1 << PG_reserved); -+ init_page_count(virt_to_page(addr)); -+ free_page(addr); -+ totalram_pages++; -+ } -+#endif -+} -+ -+/* Coldfire paging_init derived from sun3 */ -+void __init paging_init(void) -+{ -+ pgd_t * pg_dir; -+ pte_t * pg_table; -+ int i; -+ unsigned long address; -+ unsigned long next_pgtable; -+ unsigned long bootmem_end; -+ unsigned long zones_size[MAX_NR_ZONES]; -+ unsigned long size; -+ enum zone_type zone; -+ -+ empty_zero_page = (void *)alloc_bootmem_pages(PAGE_SIZE); -+ memset((void *)empty_zero_page, 0, PAGE_SIZE); -+ -+ pg_dir = swapper_pg_dir; -+ memset(swapper_pg_dir, 0, sizeof (swapper_pg_dir)); -+ -+ size = num_pages * sizeof(pte_t); -+ size = (size + PAGE_SIZE) & ~(PAGE_SIZE-1); -+ next_pgtable = (unsigned long)alloc_bootmem_pages(size); -+ -+ bootmem_end = (next_pgtable + size + PAGE_SIZE) & PAGE_MASK; -+ pg_dir += PAGE_OFFSET >> PGDIR_SHIFT; -+ -+ address = PAGE_OFFSET; -+ while (address < (unsigned long)high_memory) -+ { -+ pg_table = (pte_t *)next_pgtable; -+ next_pgtable += PTRS_PER_PTE * sizeof (pte_t); -+ pgd_val(*pg_dir) = (unsigned long) pg_table; -+ pg_dir++; -+ -+ /* now change pg_table to kernel virtual addresses */ -+ for (i=0; i<PTRS_PER_PTE; ++i, ++pg_table) -+ { -+ pte_t pte = pfn_pte(virt_to_pfn(address), PAGE_INIT); -+ if (address >= (unsigned long)high_memory) -+ pte_val (pte) = 0; -+ -+ set_pte (pg_table, pte); -+ address += PAGE_SIZE; -+ } -+ } -+ -+ current->mm = NULL; -+ -+ /* clear zones */ -+ for (zone = 0; zone < MAX_NR_ZONES; zone++) -+ zones_size[zone] = 0x0; -+ -+ /* allocate the bottom 32M (0x40x 0x41x) to DMA - head.S marks them NO CACHE */ -+ /* JKM - this should be changed to allocate from the TOP (0x4f,0x4e) but the -+ * allocator is being a bit challenging */ -+ zones_size[ZONE_DMA] = (32*1024*1024) >> PAGE_SHIFT; -+ -+ /* allocate the rest to NORMAL - head.S marks them CACHE */ -+ zones_size[ZONE_NORMAL] = (((unsigned long)high_memory - PAGE_OFFSET) >> PAGE_SHIFT) - zones_size[0]; -+ -+ free_area_init(zones_size); -+} -+ -+ -+int cf_tlb_miss(struct pt_regs *regs, int write, int dtlb, int extension_word) -+{ -+ struct mm_struct *mm; -+ pgd_t *pgd; -+ pmd_t *pmd; -+ pte_t *pte; -+ unsigned long mmuar; -+ int asid; -+ int flags; -+ -+ local_save_flags(flags); -+ local_irq_disable(); -+ -+ mmuar = ( dtlb ) ? regs->mmuar -+ : regs->pc + (extension_word * sizeof(long)); -+ -+ mm = (!user_mode(regs) && KERNRAM(mmuar)) ? &init_mm : current->mm; -+ -+ if (!mm) { -+ local_irq_restore(flags); -+ return (-1); -+ } -+ -+ pgd = pgd_offset(mm, mmuar); -+ if (pgd_none(*pgd)) { -+ local_irq_restore(flags); -+ return (-1); -+ } -+ -+ pmd = pmd_offset(pgd, mmuar); -+ if (pmd_none(*pmd)) { -+ local_irq_restore(flags); -+ return (-1); -+ } -+ -+ pte = (KERNRAM(mmuar)) ? pte_offset_kernel(pmd, mmuar) -+ : pte_offset_map(pmd, mmuar); -+ if (pte_none(*pte) || !pte_present(*pte)) { -+ local_irq_restore(flags); -+ return (-1); -+ } -+ -+ if (write) { -+ if (!pte_write(*pte)) { -+ local_irq_restore(flags); -+ return (-1); -+ } -+ set_pte(pte, pte_mkdirty(*pte)); -+ } -+ -+ set_pte(pte, pte_mkyoung(*pte)); -+ asid = mm->context & 0xff; -+ if (!pte_dirty(*pte) && !KERNRAM(mmuar)) -+ set_pte(pte, pte_wrprotect(*pte)); -+ -+ *MMUTR = (mmuar & PAGE_MASK) | (asid << CF_ASID_MMU_SHIFT) -+ | (((int)(pte->pte) & (int)CF_PAGE_MMUTR_MASK ) >> CF_PAGE_MMUTR_SHIFT) -+ | MMUTR_V; -+ -+ *MMUDR = (pte_val(*pte) & PAGE_MASK) -+ | ((pte->pte) & CF_PAGE_MMUDR_MASK) -+ | MMUDR_SZ8K | MMUDR_X; -+ -+ if ( dtlb ) -+ *MMUOR = MMUOR_ACC | MMUOR_UAA; -+ else -+ *MMUOR = MMUOR_ITLB | MMUOR_ACC | MMUOR_UAA; -+ -+ asm("nop"); -+ -+ /*printk("cf_tlb_miss: va=%lx, pa=%lx\n", (mmuar & PAGE_MASK), -+ (pte_val(*pte) & PAGE_MASK));*/ -+ local_irq_restore(flags); -+ return (0); -+} -+ -+ -+/* The following was taken from arch/ppc/mmu_context.c -+ * -+ * Initialize the context management stuff. -+ */ -+void __init mmu_context_init(void) -+{ -+ /* -+ * Some processors have too few contexts to reserve one for -+ * init_mm, and require using context 0 for a normal task. -+ * Other processors reserve the use of context zero for the kernel. -+ * This code assumes FIRST_CONTEXT < 32. -+ */ -+ context_map[0] = (1 << FIRST_CONTEXT) - 1; -+ next_mmu_context = FIRST_CONTEXT; -+ atomic_set(&nr_free_contexts, LAST_CONTEXT - FIRST_CONTEXT + 1); -+} -+ -+/* -+ * Steal a context from a task that has one at the moment. -+ * This is only used on 8xx and 4xx and we presently assume that -+ * they don't do SMP. If they do then thicfpgalloc.hs will have to check -+ * whether the MM we steal is in use. -+ * We also assume that this is only used on systems that don't -+ * use an MMU hash table - this is true for 8xx and 4xx. -+ * This isn't an LRU system, it just frees up each context in -+ * turn (sort-of pseudo-random replacement :). This would be the -+ * place to implement an LRU scheme if anyone was motivated to do it. -+ * -- paulus -+ */ -+void steal_context(void) -+{ -+ struct mm_struct *mm; -+ /* free up context `next_mmu_context' */ -+ /* if we shouldn't free context 0, don't... */ -+ if (next_mmu_context < FIRST_CONTEXT) -+ next_mmu_context = FIRST_CONTEXT; -+ mm = context_mm[next_mmu_context]; -+ flush_tlb_mm(mm); -+ destroy_context(mm); -+} ---- a/arch/m68k/mm/hwtest.c -+++ b/arch/m68k/mm/hwtest.c -@@ -25,6 +25,7 @@ - - #include <linux/module.h> - -+#ifndef CONFIG_COLDFIRE - int hwreg_present( volatile void *regp ) - { - int ret = 0; -@@ -82,4 +83,5 @@ int hwreg_write( volatile void *regp, un - return( ret ); - } - EXPORT_SYMBOL(hwreg_write); -+#endif - ---- a/arch/m68k/mm/init.c -+++ b/arch/m68k/mm/init.c -@@ -122,7 +122,6 @@ void __init mem_init(void) - if (MACH_IS_ATARI) - atari_stram_mem_init_hook(); - #endif -- - /* this will put all memory onto the freelists */ - totalram_pages = num_physpages = 0; - for_each_online_pgdat(pgdat) { -@@ -146,7 +145,7 @@ void __init mem_init(void) - } - } - --#ifndef CONFIG_SUN3 -+#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE) - /* insert pointer tables allocated so far into the tablelist */ - init_pointer_table((unsigned long)kernel_pg_dir); - for (i = 0; i < PTRS_PER_PGD; i++) { ---- a/arch/m68k/mm/kmap.c -+++ b/arch/m68k/mm/kmap.c -@@ -24,7 +24,11 @@ - - #undef DEBUG - -+#ifndef CONFIG_COLDFIRE - #define PTRTREESIZE (256*1024) -+#else -+#define PTRTREESIZE PAGE_SIZE -+#endif - - /* - * For 040/060 we can use the virtual memory area like other architectures, -@@ -50,7 +54,11 @@ static inline void free_io_area(void *ad - - #else - -+#ifdef CONFIG_COLDFIRE -+#define IO_SIZE PAGE_SIZE -+#else - #define IO_SIZE (256*1024) -+#endif - - static struct vm_struct *iolist; - -@@ -125,8 +133,34 @@ void __iomem *__ioremap(unsigned long ph - } - #endif - -+#ifdef CONFIG_M5445X -+ if (physaddr >= 0xf0000000) { -+ /* -+ * On the M5445x processors an ACR is setup to map -+ * the 0xF0000000 range into kernel memory as -+ * non-cacheable. -+ */ -+ return (void __iomem *)physaddr; -+ } -+#endif -+ -+#ifdef CONFIG_M547X_8X -+ if (physaddr >= 0xf0000000) { -+ /* -+ * On the M547x/M548x processors an ACR is setup to map -+ * the 0xF0000000 range into kernel memory as -+ * non-cacheable. -+ */ -+ return (void __iomem *)physaddr; -+ } -+ if ((physaddr >= 0xd0000000) && (physaddr + size < 0xd800ffff)) { -+ printk("ioremap:PCI 0x%lx,0x%lx(%d) - PCI area hit\n", physaddr, size, cacheflag); -+ return (void *)physaddr; -+ } -+#endif -+ - #ifdef DEBUG -- printk("ioremap: 0x%lx,0x%lx(%d) - ", physaddr, size, cacheflag); -+ printk("ioremap: paddr=0x%lx,size=0x%lx(%d) - ", physaddr, size, cacheflag); - #endif - /* - * Mappings have to be aligned -@@ -145,7 +179,7 @@ void __iomem *__ioremap(unsigned long ph - virtaddr = (unsigned long)area->addr; - retaddr = virtaddr + offset; - #ifdef DEBUG -- printk("0x%lx,0x%lx,0x%lx", physaddr, virtaddr, retaddr); -+ printk(" paddr=0x%lx,vaddr=0x%lx,retaddr=0x%lx", physaddr, virtaddr, retaddr); - #endif - - /* -@@ -170,7 +204,12 @@ void __iomem *__ioremap(unsigned long ph - break; - } - } else { -+#ifndef CONFIG_COLDFIRE - physaddr |= (_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_DIRTY); -+#else -+ physaddr |= (_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_DIRTY | \ -+ _PAGE_READWRITE); -+#endif - switch (cacheflag) { - case IOMAP_NOCACHE_SER: - case IOMAP_NOCACHE_NONSER: -@@ -249,7 +288,12 @@ void __iounmap(void *addr, unsigned long - pgd_t *pgd_dir; - pmd_t *pmd_dir; - pte_t *pte_dir; -- -+#ifdef CONFIG_M547X_8X -+ if ((addr >= (void*)0xd0000000) && (addr + size < (void*)0xd800ffff)) { -+ printk("%s: PCI address\n",__FUNCTION__); -+ return; -+ } -+#endif - while ((long)size > 0) { - pgd_dir = pgd_offset_k(virtaddr); - if (pgd_bad(*pgd_dir)) { ---- a/arch/m68k/mm/Makefile -+++ b/arch/m68k/mm/Makefile -@@ -6,3 +6,4 @@ obj-y := cache.o init.o fault.o hwtest. - - obj-$(CONFIG_MMU_MOTOROLA) += kmap.o memory.o motorola.o - obj-$(CONFIG_MMU_SUN3) += sun3kmap.o sun3mmu.o -+obj-$(CONFIG_MMU_CFV4E) += cf-mmu.o kmap.o memory.o ---- a/arch/m68k/mm/memory.c -+++ b/arch/m68k/mm/memory.c -@@ -127,6 +127,7 @@ int free_pointer_table (pmd_t *ptable) - return 0; - } - -+#ifndef CONFIG_COLDFIRE - /* invalidate page in both caches */ - static inline void clear040(unsigned long paddr) - { -@@ -173,6 +174,7 @@ static inline void pushcl040(unsigned lo - clear040(paddr); - local_irq_restore(flags); - } -+#endif /* CONFIG_COLDFIRE */ - - /* - * 040: Hit every page containing an address in the range paddr..paddr+len-1. -@@ -203,6 +205,11 @@ static inline void pushcl040(unsigned lo - - void cache_clear (unsigned long paddr, int len) - { -+#ifdef CONFIG_COLDFIRE -+// JKM -- revise to use proper caching -+// cf_cache_clear(paddr, len); -+ flush_bcache(); -+#else - if (CPU_IS_040_OR_060) { - int tmp; - -@@ -237,6 +244,7 @@ void cache_clear (unsigned long paddr, i - if(mach_l2_flush) - mach_l2_flush(0); - #endif -+#endif /* CONFIG_COLDFIRE */ - } - EXPORT_SYMBOL(cache_clear); - -@@ -250,6 +258,11 @@ EXPORT_SYMBOL(cache_clear); - - void cache_push (unsigned long paddr, int len) - { -+#ifdef CONFIG_COLDFIRE -+// JKM -- revise to use proper caching -+// cf_cache_push(paddr, len); -+ flush_bcache(); -+#else - if (CPU_IS_040_OR_060) { - int tmp = PAGE_SIZE; - -@@ -290,6 +303,7 @@ void cache_push (unsigned long paddr, in - if(mach_l2_flush) - mach_l2_flush(1); - #endif -+#endif /* CONFIG_COLDFIRE */ - } - EXPORT_SYMBOL(cache_push); - ---- a/drivers/ata/Kconfig -+++ b/drivers/ata/Kconfig -@@ -6,7 +6,7 @@ menuconfig ATA - tristate "Serial ATA (prod) and Parallel ATA (experimental) drivers" - depends on HAS_IOMEM - depends on BLOCK -- depends on !(M32R || M68K) || BROKEN -+ depends on !M32R || BROKEN - depends on !SUN4 || BROKEN - select SCSI - ---help--- -@@ -679,4 +679,13 @@ config PATA_BF54X - - If unsure, say N. - -+config PATA_FSL -+ tristate "Freescale on-chip PATA support" -+ depends on (ARCH_MX3 || ARCH_MX27 || PPC_512x || M54455) -+ help -+ On Freescale processors, say Y here if you wish to use the on-chip -+ ATA interface. -+ -+ If you are unsure, say N to this. -+ - endif # ATA ---- a/drivers/ata/Makefile -+++ b/drivers/ata/Makefile -@@ -1,4 +1,3 @@ -- - obj-$(CONFIG_ATA) += libata.o - - obj-$(CONFIG_SATA_AHCI) += ahci.o -@@ -71,6 +70,7 @@ obj-$(CONFIG_PATA_BF54X) += pata_bf54x.o - obj-$(CONFIG_PATA_PLATFORM) += pata_platform.o - obj-$(CONFIG_PATA_OF_PLATFORM) += pata_of_platform.o - obj-$(CONFIG_PATA_ICSIDE) += pata_icside.o -+obj-$(CONFIG_PATA_FSL) += pata_fsl.o - # Should be last but two libata driver - obj-$(CONFIG_PATA_ACPI) += pata_acpi.o - # Should be last but one libata driver ---- /dev/null -+++ b/drivers/ata/pata_fsl.c -@@ -0,0 +1,814 @@ -+/* -+ * Freescale integrated PATA driver -+ */ -+ -+/* -+ * Copyright 2007 Freescale Semiconductor, Inc. All Rights Reserved. -+ */ -+ -+/* -+ * The code contained herein is licensed under the GNU General Public -+ * License. You may obtain a copy of the GNU General Public License -+ * Version 2 or later at the following locations: -+ * -+ * http://www.opensource.org/licenses/gpl-license.html -+ * http://www.gnu.org/copyleft/gpl.html -+ */ -+ -+#include <linux/kernel.h> -+#include <linux/module.h> -+#include <linux/init.h> -+#include <linux/blkdev.h> -+#include <scsi/scsi_host.h> -+#include <linux/ata.h> -+#include <linux/libata.h> -+#include <linux/platform_device.h> -+#include <linux/fsl_devices.h> -+#ifdef CONFIG_FSL_PATA_USE_DMA -+#include <asm/dma.h> -+#endif -+ -+#define DRV_NAME "pata_fsl" -+#define DRV_VERSION "1.0" -+ -+#ifdef CONFIG_M54455 -+#define WRITE_ATA8(val, reg) \ -+ __raw_writeb(val, (ata_regs + reg)); -+#define WRITE_ATA16(val, reg) \ -+ __raw_writew(val, (ata_regs + reg)); -+#else -+#define WRITE_ATA8(val, reg) \ -+ __raw_writel(val, (ata_regs + reg)); -+#define WRITE_ATA16(val, reg) \ -+ __raw_writel(val, (ata_regs + reg)); -+#endif -+ -+struct pata_fsl_priv { -+#ifdef CONFIG_FSL_PATA_USE_DMA -+ int ultra; -+#endif -+ u8 *fsl_ata_regs; -+#ifdef CONFIG_FSL_PATA_USE_DMA -+ int dma_rchan; -+ int dma_wchan; -+ int dma_done; -+ int dma_dir; -+#endif -+}; -+ -+enum { -+ /* various constants */ -+ -+#ifdef CONFIG_FSL_PATA_USE_DMA -+ FSL_ATA_MAX_SG_LEN = 65534, -+#endif -+ -+ /* offsets to registers */ -+ -+ FSL_ATA_TIMING_REGS = 0x00, -+ FSL_ATA_FIFO_FILL = 0x20, -+ FSL_ATA_CONTROL = 0x24, -+ FSL_ATA_INT_PEND = 0x28, -+ FSL_ATA_INT_EN = 0x2C, -+ FSL_ATA_INT_CLEAR = 0x30, -+ FSL_ATA_FIFO_ALARM = 0x34, -+ FSL_ATA_DRIVE_DATA = 0xA0, -+ FSL_ATA_DRIVE_CONTROL = 0xD8, -+ -+ /* bits within FSL_ATA_CONTROL */ -+ -+ FSL_ATA_CTRL_FIFO_RST_B = 0x80, -+ FSL_ATA_CTRL_ATA_RST_B = 0x40, -+ FSL_ATA_CTRL_FIFO_TX_EN = 0x20, -+ FSL_ATA_CTRL_FIFO_RCV_EN = 0x10, -+ FSL_ATA_CTRL_DMA_PENDING = 0x08, -+ FSL_ATA_CTRL_DMA_ULTRA = 0x04, -+ FSL_ATA_CTRL_DMA_WRITE = 0x02, -+ FSL_ATA_CTRL_IORDY_EN = 0x01, -+ -+ /* bits within the interrupt control registers */ -+ -+ FSL_ATA_INTR_ATA_INTRQ1 = 0x80, -+ FSL_ATA_INTR_FIFO_UNDERFLOW = 0x40, -+ FSL_ATA_INTR_FIFO_OVERFLOW = 0x20, -+ FSL_ATA_INTR_CTRL_IDLE = 0x10, -+ FSL_ATA_INTR_ATA_INTRQ2 = 0x08, -+}; -+ -+/* -+ * This structure contains the timing parameters for -+ * ATA bus timing in the 5 PIO modes. The timings -+ * are in nanoseconds, and are converted to clock -+ * cycles before being stored in the ATA controller -+ * timing registers. -+ */ -+static struct { -+ short t0, t1, t2_8, t2_16, t2i, t4, t9, tA; -+} pio_specs[] = { -+ [0] = { -+ .t0 = 600, .t1 = 70, .t2_8 = 290, .t2_16 = 165, .t2i = 0, -+ .t4 = 30,.t9 = 20,.tA = 50 -+ }, -+ [1] = { -+ .t0 = 383, .t1 = 50, .t2_8 = 290, .t2_16 = 125, .t2i = 0, -+ .t4 = 20, .t9 = 15, .tA = 50 -+ }, -+ [2] = { -+ .t0 = 240, .t1 = 30, .t2_8 = 290, .t2_16 = 100, .t2i = 0, -+ .t4 = 15, .t9 = 10, .tA = 50 -+ }, -+ [3] = { -+ .t0 = 180, .t1 = 30, .t2_8 = 80, .t2_16 = 80, .t2i = 0, -+ .t4 = 10, .t9 = 10, .tA = 50 -+ }, -+ [4] = { -+ .t0 = 120, .t1 = 25, .t2_8 = 70, .t2_16 = 70, .t2i = 0, -+ .t4 = 10, .t9 = 10, .tA = 50 -+ }, -+}; -+ -+#define NR_PIO_SPECS (sizeof pio_specs / sizeof pio_specs[0]) -+ -+/* -+ * This structure contains the timing parameters for -+ * ATA bus timing in the 3 MDMA modes. The timings -+ * are in nanoseconds, and are converted to clock -+ * cycles before being stored in the ATA controller -+ * timing registers. -+ */ -+static struct { -+ short t0M, tD, tH, tJ, tKW, tM, tN, tJNH; -+} mdma_specs[] = { -+ [0] = { -+ .t0M = 480, .tD = 215, .tH = 20, .tJ = 20, .tKW = 215, -+ .tM = 50, .tN = 15, .tJNH = 20 -+ }, -+ [1] = { -+ .t0M = 150, .tD = 80, .tH = 15, .tJ = 5, .tKW = 50, -+ .tM = 30, .tN = 10, .tJNH = 15 -+ }, -+ [2] = { -+ .t0M = 120, .tD = 70, .tH = 10, .tJ = 5, .tKW = 25, -+ .tM = 25, .tN = 10, .tJNH = 10 -+ }, -+}; -+ -+#define NR_MDMA_SPECS (sizeof mdma_specs / sizeof mdma_specs[0]) -+ -+/* -+ * This structure contains the timing parameters for -+ * ATA bus timing in the 6 UDMA modes. The timings -+ * are in nanoseconds, and are converted to clock -+ * cycles before being stored in the ATA controller -+ * timing registers. -+ */ -+static struct { -+ short t2CYC, tCYC, tDS, tDH, tDVS, tDVH, tCVS, tCVH, tFS_min, tLI_max, -+ tMLI, tAZ, tZAH, tENV_min, tSR, tRFS, tRP, tACK, tSS, tDZFS; -+} udma_specs[] = { -+ [0] = { -+ .t2CYC = 235, .tCYC = 114, .tDS = 15, .tDH = 5, .tDVS = 70, -+ .tDVH = 6, .tCVS = 70, .tCVH = 6, .tFS_min = 0, -+ .tLI_max = 100, .tMLI = 20, .tAZ = 10, .tZAH = 20, -+ .tENV_min = 20, .tSR = 50, .tRFS = 75, .tRP = 160, -+ .tACK = 20, .tSS = 50, .tDZFS = 80 -+ }, -+ [1] = { -+ .t2CYC = 156, .tCYC = 75, .tDS = 10, .tDH = 5, .tDVS = 48, -+ .tDVH = 6, .tCVS = 48, .tCVH = 6, .tFS_min = 0, -+ .tLI_max = 100, .tMLI = 20, .tAZ = 10, .tZAH = 20, -+ .tENV_min = 20, .tSR = 30, .tRFS = 70, .tRP = 125, -+ .tACK = 20, .tSS = 50, .tDZFS = 63 -+ }, -+ [2] = { -+ .t2CYC = 117, .tCYC = 55, .tDS = 7, .tDH = 5, .tDVS = 34, -+ .tDVH = 6, .tCVS = 34, .tCVH = 6, .tFS_min = 0, -+ .tLI_max = 100, .tMLI = 20, .tAZ = 10, .tZAH = 20, -+ .tENV_min = 20, .tSR = 20, .tRFS = 60, .tRP = 100, -+ .tACK = 20, .tSS = 50, .tDZFS = 47 -+ }, -+ [3] = { -+ .t2CYC = 86, .tCYC = 39, .tDS = 7, .tDH = 5, .tDVS = 20, -+ .tDVH = 6, .tCVS = 20, .tCVH = 6, .tFS_min = 0, -+ .tLI_max = 100, .tMLI = 20, .tAZ = 10, .tZAH = 20, -+ .tENV_min = 20, .tSR = 20, .tRFS = 60, .tRP = 100, -+ .tACK = 20, .tSS = 50, .tDZFS = 35 -+ }, -+ [4] = { -+ .t2CYC = 57, .tCYC = 25, .tDS = 5, .tDH = 5, .tDVS = 7, -+ .tDVH = 6, .tCVS = 7, .tCVH = 6, .tFS_min = 0, -+ .tLI_max = 100, .tMLI = 20, .tAZ = 10, .tZAH = 20, -+ .tENV_min = 20, .tSR = 50, .tRFS = 60, .tRP = 100, -+ .tACK = 20, .tSS = 50, .tDZFS = 25 -+ }, -+ [5] = { -+ .t2CYC = 38, .tCYC = 17, .tDS = 4, .tDH = 5, .tDVS = 5, -+ .tDVH = 6, .tCVS = 10, .tCVH = 10, .tFS_min = 0, -+ .tLI_max = 75, .tMLI = 20, .tAZ = 10, .tZAH = 20, -+ .tENV_min = 20, .tSR = 20, .tRFS = 50, .tRP = 85, -+ .tACK = 20, .tSS = 50, .tDZFS = 40 -+ }, -+}; -+ -+#define NR_UDMA_SPECS (sizeof udma_specs / sizeof udma_specs[0]) -+ -+struct fsl_ata_time_regs { -+ u8 time_off, time_on, time_1, time_2w; -+ u8 time_2r, time_ax, time_pio_rdx, time_4; -+ u8 time_9, time_m, time_jn, time_d; -+ u8 time_k, time_ack, time_env, time_rpx; -+ u8 time_zah, time_mlix, time_dvh, time_dzfs; -+ u8 time_dvs, time_cvh, time_ss, time_cyc; -+}; -+ -+static void update_timing_config(struct fsl_ata_time_regs *tp, struct ata_host *host) -+{ -+ u32 *lp = (u32 *)tp; -+ struct pata_fsl_priv *priv = host->private_data; -+ u32 *ctlp = (u32 *)priv->fsl_ata_regs; -+ int i; -+ -+ /* -+ * JKM - this could have endianess issues on BE depending -+ * on how the controller is glued to the bus -- probably -+ * should rewrite this to write byte at a time. -+ */ -+ for (i = 0; i < 5; i++) { -+ __raw_writel(*lp, ctlp); -+ lp++; -+ ctlp++; -+ } -+ mb(); -+} -+ -+/*! -+ * Calculate values for the ATA bus timing registers and store -+ * them into the hardware. -+ * -+ * @param xfer_mode specifies XFER xfer_mode -+ * @param pdev specifies platform_device -+ * -+ * @return EINVAL speed out of range, or illegal mode -+ */ -+static int set_ata_bus_timing(u8 xfer_mode, struct platform_device *pdev) -+{ -+ struct fsl_ata_platform_data *plat = (struct fsl_ata_platform_data *) -+ pdev->dev.platform_data; -+ struct ata_host *host = dev_get_drvdata(&pdev->dev); -+ -+ /* get the bus clock cycle time, in ns */ -+ int T = 1 * 1000 * 1000 * 1000 / plat->get_clk_rate(); -+ struct fsl_ata_time_regs tr = {0}; -+ DPRINTK("clk_rate = %d T = %d\n",plat->get_clk_rate(), T); -+ -+ /* -+ * every mode gets the same t_off and t_on -+ */ -+ tr.time_off = 3; -+ tr.time_on = 3; -+ -+ if (xfer_mode >= XFER_UDMA_0) { -+ int speed = xfer_mode - XFER_UDMA_0; -+ if (speed >= NR_UDMA_SPECS) { -+ return -EINVAL; -+ } -+ tr.time_ack = (udma_specs[speed].tACK + T) / T; -+ tr.time_env = (udma_specs[speed].tENV_min + T) / T; -+ tr.time_rpx = (udma_specs[speed].tRP + T) / T + 2; -+ -+ tr.time_zah = (udma_specs[speed].tZAH + T) / T; -+ tr.time_mlix = (udma_specs[speed].tMLI + T) / T; -+ tr.time_dvh = (udma_specs[speed].tDVH + T) / T + 1; -+ tr.time_dzfs = (udma_specs[speed].tDZFS + T) / T; -+ -+ tr.time_dvs = (udma_specs[speed].tDVS + T) / T; -+ tr.time_cvh = (udma_specs[speed].tCVH + T) / T; -+ tr.time_ss = (udma_specs[speed].tSS + T) / T; -+ tr.time_cyc = (udma_specs[speed].tCYC + T) / T; -+ } else if (xfer_mode >= XFER_MW_DMA_0) { -+ int speed = xfer_mode - XFER_MW_DMA_0; -+ if (speed >= NR_MDMA_SPECS) { -+ return -EINVAL; -+ } -+ tr.time_m = (mdma_specs[speed].tM + T) / T; -+ tr.time_jn = (mdma_specs[speed].tJNH + T) / T; -+ tr.time_d = (mdma_specs[speed].tD + T) / T; -+ -+ tr.time_k = (mdma_specs[speed].tKW + T) / T; -+ } else { -+ int speed = xfer_mode - XFER_PIO_0; -+ if (speed >= NR_PIO_SPECS) { -+ return -EINVAL; -+ } -+ tr.time_1 = (pio_specs[speed].t1 + T) / T; -+ tr.time_2w = (pio_specs[speed].t2_8 + T) / T; -+ -+ tr.time_2r = (pio_specs[speed].t2_8 + T) / T; -+ tr.time_ax = (pio_specs[speed].tA + T) / T + 2; -+ tr.time_pio_rdx = 1; -+ tr.time_4 = (pio_specs[speed].t4 + T) / T; -+ -+ tr.time_9 = (pio_specs[speed].t9 + T) / T; -+ } -+ -+ update_timing_config(&tr, host); -+ -+ return 0; -+} -+ -+static void pata_fsl_set_piomode(struct ata_port *ap, struct ata_device *adev) -+{ -+ set_ata_bus_timing(adev->pio_mode, to_platform_device(ap->dev)); -+} -+ -+#ifdef CONFIG_FSL_PATA_USE_DMA -+static void pata_fsl_set_dmamode(struct ata_port *ap, struct ata_device *adev) -+{ -+ struct pata_fsl_priv *priv = ap->host->private_data; -+ -+ priv->ultra = adev->dma_mode >= XFER_UDMA_0; -+ -+ set_ata_bus_timing(adev->dma_mode, to_platform_device(ap->dev)); -+} -+#endif -+ -+static int pata_fsl_port_start(struct ata_port *ap) -+{ -+ return 0; -+} -+ -+#ifdef CONFIG_FSL_PATA_USE_DMA -+static void dma_callback(void *arg, int error_status, unsigned int count) -+{ -+ struct ata_port *ap = arg; -+ struct pata_fsl_priv *priv = ap->host->private_data; -+ u8 *ata_regs = priv->fsl_ata_regs; -+ -+ priv->dma_done = 1; -+ /* -+ * DMA is finished, so unmask INTRQ from the drive to allow the -+ * normal ISR to fire. -+ */ -+#if 0 -+ __raw_writel(FSL_ATA_INTR_ATA_INTRQ2, ata_regs + FSL_ATA_INT_EN); -+#else -+ WRITE_ATA8(FSL_ATA_INTR_ATA_INTRQ2, FSL_ATA_INT_EN); -+#endif -+ mb(); -+} -+ -+static void pata_fsl_bmdma_setup(struct ata_queued_cmd *qc) -+{ -+ int nr_sg = 0; -+ int chan; -+ int dma_mode = 0, dma_ultra; -+ u8 ata_control; -+ struct ata_port *ap = qc->ap; -+ struct pata_fsl_priv *priv = ap->host->private_data; -+ u8 *ata_regs = priv->fsl_ata_regs; -+ struct fsl_ata_platform_data *plat = ap->dev->platform_data; -+ struct scatterlist tmp[plat->max_sg], *tsg, *sg; -+ int err; -+ -+ DPRINTK("ENTER\n"); -+ -+ priv->dma_dir = qc->dma_dir; -+ -+ /* -+ * Configure the on-chip ATA interface hardware. -+ */ -+ dma_ultra = priv->ultra ? -+ FSL_ATA_CTRL_DMA_ULTRA : 0; -+ -+ ata_control = FSL_ATA_CTRL_FIFO_RST_B | -+ FSL_ATA_CTRL_ATA_RST_B | -+ FSL_ATA_CTRL_DMA_PENDING | -+ dma_ultra; -+ -+ if (qc->dma_dir == DMA_TO_DEVICE) { -+ chan = priv->dma_wchan; -+ ata_control |= FSL_ATA_CTRL_FIFO_TX_EN | -+ FSL_ATA_CTRL_DMA_WRITE; -+ dma_mode = DMA_MODE_WRITE; -+ } else { -+ chan = priv->dma_rchan; -+ ata_control |= FSL_ATA_CTRL_FIFO_RCV_EN; -+ dma_mode = DMA_MODE_READ; -+ } -+#if 0 -+ __raw_writel(ata_control, ata_regs + FSL_ATA_CONTROL); -+ __raw_writel(plat->fifo_alarm, ata_regs + FSL_ATA_FIFO_ALARM); -+ __raw_writel(FSL_ATA_INTR_ATA_INTRQ1, ata_regs + FSL_ATA_INT_EN); -+#else -+ WRITE_ATA8(ata_control, FSL_ATA_CONTROL); -+ WRITE_ATA8(plat->fifo_alarm, FSL_ATA_FIFO_ALARM); -+ WRITE_ATA8(FSL_ATA_INTR_ATA_INTRQ1, FSL_ATA_INT_EN); -+#endif -+ mb(); -+ -+ /* -+ * Set up the DMA completion callback. -+ */ -+ mxc_dma_callback_set(chan, dma_callback, (void *)ap); -+ -+ /* -+ * Copy the sg list to an array. -+ */ -+ tsg = tmp; -+ ata_for_each_sg(sg, qc) { -+ memcpy(tsg, sg, sizeof *sg); -+ tsg++; -+ nr_sg++; -+ } -+ -+ err = mxc_dma_sg_config(chan, tmp, nr_sg, 0, dma_mode); -+ if (err) { -+ printk(KERN_ERR "pata_fsl_bmdma_setup: error %d\n", err); -+ } -+ DPRINTK("EXIT\n"); -+} -+ -+static void pata_fsl_bmdma_start(struct ata_queued_cmd *qc) -+{ -+ struct ata_port *ap = qc->ap; -+ struct pata_fsl_priv *priv = ap->host->private_data; -+ int chan; -+ int err; -+ -+ /* -+ * Start the channel. -+ */ -+ chan = qc->dma_dir == DMA_TO_DEVICE ? priv->dma_wchan : priv->dma_rchan; -+ -+ priv->dma_done = 0; -+ -+ err = mxc_dma_enable(chan); -+ if (err) { -+ printk(KERN_ERR "%s: : error %d\n", __func__, err); -+ } -+ -+ ap->ops->exec_command(ap, &qc->tf); -+} -+ -+static void pata_fsl_bmdma_stop(struct ata_queued_cmd *qc) -+{ -+ struct ata_port *ap = qc->ap; -+ -+ /* do a dummy read as in ata_bmdma_stop */ -+ ata_altstatus(ap); -+} -+ -+static u8 pata_fsl_bmdma_status(struct ata_port *ap) -+{ -+ struct pata_fsl_priv *priv = ap->host->private_data; -+ -+ return priv->dma_done ? ATA_DMA_INTR : 0; -+} -+ -+static void pata_fsl_dma_init(struct ata_port *ap) -+{ -+ struct pata_fsl_priv *priv = ap->host->private_data; -+ -+ priv->dma_rchan = -1; -+ priv->dma_wchan = -1; -+ -+ priv->dma_rchan = mxc_dma_request(MXC_DMA_ATA_RX, "MXC ATA RX"); -+ if (priv->dma_rchan < 0) { -+ dev_printk(KERN_ERR, ap->dev, "couldn't get RX DMA channel\n"); -+ goto err_out; -+ } -+ -+ priv->dma_wchan = mxc_dma_request(MXC_DMA_ATA_TX, "MXC ATA TX"); -+ if (priv->dma_wchan < 0) { -+ dev_printk(KERN_ERR, ap->dev, "couldn't get TX DMA channel\n"); -+ goto err_out; -+ } -+ -+ dev_printk(KERN_ERR, ap->dev, "rchan=%d wchan=%d\n", priv->dma_rchan, -+ priv->dma_wchan); -+ return; -+ -+err_out: -+ ap->mwdma_mask = 0; -+ ap->udma_mask = 0; -+ mxc_dma_free(priv->dma_rchan); -+ mxc_dma_free(priv->dma_wchan); -+ kfree(priv); -+} -+#endif /* CONFIG_FSL_PATA_USE_DMA */ -+ -+static void ata_dummy_noret(struct ata_port *ap) { return; } -+ -+static struct scsi_host_template pata_fsl_sht = { -+ .module = THIS_MODULE, -+ .name = DRV_NAME, -+ .ioctl = ata_scsi_ioctl, -+ .queuecommand = ata_scsi_queuecmd, -+ .can_queue = ATA_DEF_QUEUE, -+ .this_id = ATA_SHT_THIS_ID, -+ .sg_tablesize = LIBATA_MAX_PRD, -+ .cmd_per_lun = ATA_SHT_CMD_PER_LUN, -+ .emulated = ATA_SHT_EMULATED, -+ .use_clustering = ATA_SHT_USE_CLUSTERING, -+ .proc_name = DRV_NAME, -+#ifdef CONFIG_FSL_PATA_USE_DMA -+ .dma_boundary = FSL_ATA_MAX_SG_LEN, -+#endif -+ .slave_configure = ata_scsi_slave_config, -+ .slave_destroy = ata_scsi_slave_destroy, -+ .bios_param = ata_std_bios_param, -+}; -+ -+static struct ata_port_operations pata_fsl_port_ops = { -+ .set_piomode = pata_fsl_set_piomode, -+#ifdef CONFIG_FSL_PATA_USE_DMA -+ .set_dmamode = pata_fsl_set_dmamode, -+#endif -+ -+ .tf_load = ata_tf_load, -+ .tf_read = ata_tf_read, -+ .check_status = ata_check_status, -+ .exec_command = ata_exec_command, -+ .dev_select = ata_std_dev_select, -+ -+ .freeze = ata_bmdma_freeze, -+ .thaw = ata_bmdma_thaw, -+ .error_handler = ata_bmdma_error_handler, -+ .post_internal_cmd = ata_bmdma_post_internal_cmd, -+ .cable_detect = ata_cable_unknown, -+ -+#ifdef CONFIG_FSL_PATA_USE_DMA -+ .bmdma_setup = pata_fsl_bmdma_setup, -+ .bmdma_start = pata_fsl_bmdma_start, -+#endif -+ -+ .qc_prep = ata_noop_qc_prep, -+ .qc_issue = ata_qc_issue_prot, -+ -+ .data_xfer = ata_data_xfer_noirq, -+ -+ .irq_clear = ata_dummy_noret, -+ .irq_on = ata_irq_on, -+ -+ .port_start = pata_fsl_port_start, -+ -+#ifdef CONFIG_FSL_PATA_USE_DMA -+ .bmdma_stop = pata_fsl_bmdma_stop, -+ .bmdma_status = pata_fsl_bmdma_status, -+#endif -+}; -+ -+static void fsl_setup_port(struct ata_ioports *ioaddr) -+{ -+ unsigned int shift = 2; -+ -+ ioaddr->data_addr = ioaddr->cmd_addr + (ATA_REG_DATA << shift); -+ ioaddr->error_addr = ioaddr->cmd_addr + (ATA_REG_ERR << shift); -+ ioaddr->feature_addr = ioaddr->cmd_addr + (ATA_REG_FEATURE << shift); -+ ioaddr->nsect_addr = ioaddr->cmd_addr + (ATA_REG_NSECT << shift); -+ ioaddr->lbal_addr = ioaddr->cmd_addr + (ATA_REG_LBAL << shift); -+ ioaddr->lbam_addr = ioaddr->cmd_addr + (ATA_REG_LBAM << shift); -+ ioaddr->lbah_addr = ioaddr->cmd_addr + (ATA_REG_LBAH << shift); -+ ioaddr->device_addr = ioaddr->cmd_addr + (ATA_REG_DEVICE << shift); -+ ioaddr->status_addr = ioaddr->cmd_addr + (ATA_REG_STATUS << shift); -+ ioaddr->command_addr = ioaddr->cmd_addr + (ATA_REG_CMD << shift); -+} -+ -+/** -+ * pata_fsl_probe - attach a platform interface -+ * @pdev: platform device -+ * -+ * Register a platform bus integrated ATA host controller -+ * -+ * The 3 platform device resources are used as follows: -+ * -+ * - I/O Base (IORESOURCE_MEM) virt. addr. of ATA controller regs -+ * - CTL Base (IORESOURCE_MEM) unused -+ * - IRQ (IORESOURCE_IRQ) platform IRQ assigned to ATA -+ * -+ */ -+static int __devinit pata_fsl_probe(struct platform_device *pdev) -+{ -+ struct resource *io_res; -+ struct ata_host *host; -+ struct ata_port *ap; -+ struct fsl_ata_platform_data *plat = (struct fsl_ata_platform_data *) -+ pdev->dev.platform_data; -+ struct pata_fsl_priv *priv; -+ u8 *ata_regs; -+ int ret; -+ -+ DPRINTK("ENTER\n"); -+ /* -+ * Get an ata_host structure for this device -+ */ -+ host = ata_host_alloc(&pdev->dev, 1); -+ if (!host) -+ return -ENOMEM; -+ ap = host->ports[0]; -+ -+ /* -+ * Allocate private data -+ */ -+ priv = kzalloc(sizeof (struct pata_fsl_priv), GFP_KERNEL); -+ if(priv == NULL) { -+ /* free(host); */ -+ return -ENOMEM; -+ } -+ host->private_data = priv; -+ -+ /* -+ * Set up resources -+ */ -+ if (unlikely(pdev->num_resources != 3)) { -+ dev_err(&pdev->dev, "invalid number of resources\n"); -+ return -EINVAL; -+ } -+ -+ io_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); -+ ata_regs = (u8 *)io_res->start; -+ priv->fsl_ata_regs = ata_regs; -+ ap->ioaddr.cmd_addr = (void *)(ata_regs + FSL_ATA_DRIVE_DATA); -+ ap->ioaddr.ctl_addr = (void *)(ata_regs + FSL_ATA_DRIVE_CONTROL); -+ ap->ioaddr.altstatus_addr = ap->ioaddr.ctl_addr; -+ ap->ops = &pata_fsl_port_ops; -+ ap->pio_mask = 0x7F; -+#ifdef CONFIG_FSL_PATA_USE_DMA -+ ap->mwdma_mask = 0x7F; -+ ap->udma_mask = plat->udma_mask; -+ pata_fsl_sht.sg_tablesize = plat->max_sg; -+#else -+ ap->mwdma_mask = 0x00; -+ ap->udma_mask = 0x00; -+#endif -+ fsl_setup_port(&ap->ioaddr); -+ -+ /* -+ * Do platform-specific initialization (e.g. allocate pins, -+ * turn on clock). After this call it is assumed that -+ * plat->get_clk_rate() can be called to calculate -+ * timing. -+ */ -+ if (plat->init && plat->init(pdev)) { -+ /* REVISIT: don't leak what ata_host_alloc() allocated */ -+ return -ENODEV; -+ } -+ -+ /* Deassert the reset bit to enable the interface */ -+ WRITE_ATA8(FSL_ATA_CTRL_ATA_RST_B, FSL_ATA_CONTROL); -+ mb(); -+ -+ /* Set initial timing and mode */ -+ set_ata_bus_timing(XFER_PIO_4, pdev); -+ -+#ifdef CONFIG_FSL_PATA_USE_DMA -+ /* get DMA ready */ -+ pata_fsl_dma_init(ap); -+#endif -+ -+ /* -+ * Enable the ATA INTRQ interrupt from the bus, but -+ * only allow the CPU to see it (INTRQ2) at this point. -+ * INTRQ1, which goes to the DMA, will be enabled later. -+ */ -+#if 0 -+ __raw_writel(FSL_ATA_INTR_ATA_INTRQ2, ata_regs + FSL_ATA_INT_EN); -+#else -+ WRITE_ATA8(FSL_ATA_INTR_ATA_INTRQ2, FSL_ATA_INT_EN); -+#endif -+ mb(); -+ -+ /* activate */ -+ ret = ata_host_activate(host, platform_get_irq(pdev, 0), ata_interrupt, -+ 0, &pata_fsl_sht); -+ DPRINTK("EXIT ret=%d\n", ret); -+ return ret; -+} -+ -+/** -+ * pata_fsl_remove - unplug a platform interface -+ * @pdev: platform device -+ * -+ * A platform bus ATA device has been unplugged. Perform the needed -+ * cleanup. Also called on module unload for any active devices. -+ */ -+static int __devexit pata_fsl_remove(struct platform_device *pdev) -+{ -+ struct device *dev = &pdev->dev; -+ struct ata_host *host = dev_get_drvdata(dev); -+ struct pata_fsl_priv *priv = host->private_data; -+ struct fsl_ata_platform_data *plat = (struct fsl_ata_platform_data *) -+ pdev->dev.platform_data; -+ u8 *ata_regs = priv->fsl_ata_regs; -+ -+#if 0 -+ __raw_writel(0, ata_regs + FSL_ATA_INT_EN); /* Disable interrupts */ -+#else -+ WRITE_ATA8(0, FSL_ATA_INT_EN); /* Disable interrupts */ -+#endif -+ mb(); -+ -+ ata_host_detach(host); -+ -+ if (plat->exit) -+ plat->exit(); -+ -+ kfree(priv); -+ -+ return 0; -+} -+ -+#ifdef CONFIG_PM -+static int pata_fsl_suspend(struct platform_device *pdev, pm_message_t state) -+{ -+ struct ata_host *host = dev_get_drvdata(&pdev->dev); -+ struct pata_fsl_priv *priv = host->private_data; -+ struct fsl_ata_platform_data *plat = (struct fsl_ata_platform_data *) -+ pdev->dev.platform_data; -+ u8 *ata_regs = priv->fsl_ata_regs; -+ -+ /* Disable interrupts. */ -+#if 0 -+ __raw_writel(0, ata_regs + FSL_ATA_INT_EN); -+#else -+ WRITE_ATA8(0, FSL_ATA_INT_EN); -+#endif -+ mb(); -+ -+ if (plat->exit) -+ plat->exit(); -+ -+ return 0; -+} -+ -+static int pata_fsl_resume(struct platform_device *pdev) -+{ -+ struct ata_host *host = dev_get_drvdata(&pdev->dev); -+ struct pata_fsl_priv *priv = host->private_data; -+ struct fsl_ata_platform_data *plat = (struct fsl_ata_platform_data *) -+ pdev->dev.platform_data; -+ u8 *ata_regs = priv->fsl_ata_regs; -+ -+ if (plat->init && plat->init(pdev)) { -+ return -ENODEV; -+ } -+ -+ /* Deassert the reset bit to enable the interface */ -+#if 0 -+ __raw_writel(FSL_ATA_CTRL_ATA_RST_B, ata_regs + FSL_ATA_CONTROL); -+#else -+ WRITE_ATA8(FSL_ATA_CTRL_ATA_RST_B, FSL_ATA_CONTROL); -+#endif -+ mb(); -+ -+ /* Set initial timing and mode */ -+ set_ata_bus_timing(XFER_PIO_4, pdev); -+ -+ /* -+ * Enable hardware interrupts. -+ */ -+#if 0 -+ __raw_writel(FSL_ATA_INTR_ATA_INTRQ2, ata_regs + FSL_ATA_INT_EN); -+#else -+ WRITE_ATA8(FSL_ATA_INTR_ATA_INTRQ2, FSL_ATA_INT_EN); -+#endif -+ mb(); -+ -+ return 0; -+} -+#endif -+ -+static struct platform_driver pata_fsl_driver = { -+ .probe = pata_fsl_probe, -+ .remove = __devexit_p(pata_fsl_remove), -+#ifdef CONFIG_PM -+ .suspend = pata_fsl_suspend, -+ .resume = pata_fsl_resume, -+#endif -+ .driver = { -+ .name = DRV_NAME, -+ .owner = THIS_MODULE, -+ }, -+}; -+ -+static int __init pata_fsl_init(void) -+{ -+ int ret; -+ -+ DPRINTK("ENTER\n"); -+ ret = platform_driver_register(&pata_fsl_driver); -+ DPRINTK("EXIT ret=%d\n", ret); -+ return ret; -+} -+ -+static void __exit pata_fsl_exit(void) -+{ -+ platform_driver_unregister(&pata_fsl_driver); -+} -+module_init(pata_fsl_init); -+module_exit(pata_fsl_exit); -+ -+MODULE_AUTHOR("Freescale Semiconductor, Inc."); -+MODULE_DESCRIPTION("low-level driver for Freescale ATA"); -+MODULE_LICENSE("GPL"); -+MODULE_VERSION(DRV_VERSION); ---- a/drivers/crypto/Kconfig -+++ b/drivers/crypto/Kconfig -@@ -60,6 +60,69 @@ config CRYPTO_DEV_GEODE - To compile this driver as a module, choose M here: the module - will be called geode-aes. - -+config CRYPTO_DEV_MCFCAU -+ bool "Support for Freescale Coldfire Cryptographic Acceleration Unit (CAU)" -+ depends on M5445X -+ select CRYPTO_ALGAPI -+ help -+ The cryptographic acceleration unit (CAU) is a ColdFire coprocessor -+ implementing a set of specialized operations in hardware. For example, you can -+ find it on MCF5445X. -+ -+config CRYPTO_DEV_MCFCAU_DES -+ tristate "DES and Triple DES cipher algorithms (MCF5445X)" -+ depends on CRYPTO_DEV_MCFCAU -+ select CRYPTO_ALGAPI -+ select CRYPTO_BLKCIPHER -+ help -+ DES cipher algorithm (FIPS 46-2), and Triple DES EDE (FIPS 46-3). -+ -+ Say 'Y' here to use the CAU coprocessor for -+ the CryptoAPI DES and 3DES alogrithms. -+ -+ To compile this driver as a module, choose M here: the module -+ will be called mcfcau-des. -+ -+config CRYPTO_DEV_MCFCAU_AES -+ tristate "AES cipher algorithm (MCF5445X)" -+ depends on CRYPTO_DEV_MCFCAU -+ select CRYPTO_ALGAPI -+ select CRYPTO_BLKCIPHER -+ help -+ AES cipher algorithm (FIPS 197). -+ -+ Say 'Y' here to use the CAU coprocessor for -+ the CryptoAPI AES alogrithm. -+ -+ To compile this driver as a module, choose M here: the module -+ will be called mcfcau-aes. -+ -+config CRYPTO_DEV_MCFCAU_MD5 -+ tristate "MD5 digest algorithm (MCF5445X)" -+ depends on CRYPTO_DEV_MCFCAU -+ select CRYPTO_ALGAPI -+ help -+ MD5 message digest algorithm (RFC1321). -+ -+ Say 'Y' here to use the CAU coprocessor for -+ the CryptoAPI MD5 alogrithm. -+ -+ To compile this driver as a module, choose M here: the module -+ will be called mcfcau-md5. -+ -+config CRYPTO_DEV_MCFCAU_SHA1 -+ tristate "SHA1 digest algorithm (MCF5445X)" -+ depends on CRYPTO_DEV_MCFCAU -+ select CRYPTO_ALGAPI -+ help -+ SHA-1 secure hash standard (FIPS 180-1/DFIPS 180-2). -+ -+ Say 'Y' here to use the CAU coprocessor for -+ the CryptoAPI SHA1 alogrithm. -+ -+ To compile this driver as a module, choose M here: the module -+ will be called mcfcau-sha1. -+ - config ZCRYPT - tristate "Support for PCI-attached cryptographic adapters" - depends on S390 ---- a/drivers/crypto/Makefile -+++ b/drivers/crypto/Makefile -@@ -2,3 +2,8 @@ obj-$(CONFIG_CRYPTO_DEV_PADLOCK_AES) += - obj-$(CONFIG_CRYPTO_DEV_PADLOCK_SHA) += padlock-sha.o - obj-$(CONFIG_CRYPTO_DEV_GEODE) += geode-aes.o - obj-$(CONFIG_CRYPTO_DEV_HIFN_795X) += hifn_795x.o -+obj-$(CONFIG_CRYPTO_DEV_MCFCAU) += mcfcau.o -+obj-$(CONFIG_CRYPTO_DEV_MCFCAU_DES) += mcfcau-des.o -+obj-$(CONFIG_CRYPTO_DEV_MCFCAU_AES) += mcfcau-aes.o -+obj-$(CONFIG_CRYPTO_DEV_MCFCAU_MD5) += mcfcau-md5.o -+obj-$(CONFIG_CRYPTO_DEV_MCFCAU_SHA1) += mcfcau-sha1.o ---- /dev/null -+++ b/drivers/crypto/mcfcau-aes.c -@@ -0,0 +1,311 @@ -+ /*************************************************************************** -+ * mcfcau-aes.c - Implementation of AES Cipher Algorithm -+ * for Freescale ColdFire Cryptographic Acceleration Unit (CAU). -+ * -+ * Author: Andrey Butok -+ * Copyright Freescale Semiconductor Inc. 2007 -+ * -+ * NOTE: You can find the ColdFire CAU module on MCF5445X and MCF52235. -+ * -+ * This program is free software; you can redistribute it and/or modify it -+ * under the terms of the GNU General Public License as published by the -+ * Free Software Foundation; either version 2 of the License, or (at your -+ * option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, but -+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -+ * for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software Foundation, -+ * Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -+ * -+ *************************************************************************** -+ * Changes: -+ * v0.01 17 September 2007 Andrey Butok -+ * Initial Release - developed on 2.6.20 Linux kernel. -+ */ -+ -+#include <linux/module.h> -+#include <linux/init.h> -+#include <linux/types.h> -+#include <linux/errno.h> -+#include <linux/crypto.h> -+ -+/* -+#undef DEBUG -+#define DEBUG 1 -+*/ -+ -+#include "mcfcau.h" -+ -+#define MCFCAU_AES_MIN_KEY_SIZE (16) -+#define MCFCAU_AES_MAX_KEY_SIZE (32) -+#define MCFCAU_AES_BLOCK_SIZE (16) -+ -+#define MCFCAU_AES_DRIVER_DESC "AES ColdFire CAU driver" -+#define MCFCAU_AES_DRIVER_VERSION "v0.01" -+ -+struct mcfcau_aes_ctx { -+ int Nr_1; -+ u32 buf[120]; -+ u32 buf_tmp[16]; -+}; -+ -+static u32 mcfcau_rco_tab[10]={ 0x01000000, 0x02000000, 0x04000000, 0x08000000, -+ 0x10000000, 0x20000000, 0x40000000, 0x80000000, -+ 0x1b000000, 0x36000000}; -+ -+int mcfcau_aes_setkey(struct crypto_tfm *tfm, const u8 *in_key, -+ unsigned int key_len) -+{ -+ struct mcfcau_aes_ctx *ctx = crypto_tfm_ctx(tfm); -+ const u32 * key = (const u32 *)in_key; -+ u32 *flags = &tfm->crt_flags; -+ u32 i; -+ u32* key_sch = (&ctx->buf[0]); -+ u32 * temp_p, * rcon_p; -+ u32 Nx; -+ u32 Nk; -+ unsigned long iflags; -+ -+ DBG("\n"); -+ -+ if (key_len % 8) { -+ *flags |= CRYPTO_TFM_RES_BAD_KEY_LEN; -+ return -EINVAL; -+ } -+ -+ Nk = key_len>>2; -+ -+ for(i=0;i<Nk;i++){ -+ key_sch[i] = key[i]; -+ } -+ -+ ctx->Nr_1 = Nk+5; -+ -+ /* Key Expansion */ -+ temp_p=&key_sch[Nk-1]; -+ rcon_p=&mcfcau_rco_tab[0]; -+ -+ spin_lock_irqsave(&mcfcau_lock, iflags); -+ -+ asm volatile ("move.l %0, %%a1"::"m"(temp_p):"a1"); -+ asm volatile ("move.l %0, %%a3"::"m"(rcon_p):"a3"); -+ asm volatile ("move.l %0, %%a4"::"m"(key_sch):"a4"); -+ -+ Nx=(Nk+7)<<2; /* (Nr+1)*Nb */ -+ -+ for(i=Nk; i<Nx; i++) -+ { -+ /* temp = key_sch[Nk-1] */ -+ asm volatile ("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CAA):"a1"); -+ -+ if(i%Nk==0){ -+ asm volatile ("moveq #8, %%d0":::"d0"); -+ /* CAA=RotWord(temp) */ -+ asm volatile ("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA):"d0"); -+ /* SubWord(CAA) */ -+ asm volatile ("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_AESS+MCFCAU_CAA)); -+ /* ACC xor rcon[i/Nk] */ -+ asm volatile ("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_XOR+MCFCAU_CAA):"a3"); -+ -+ }else if((Nk>6) && (i%Nk ==4)){ -+ /* SubWord(ACC) */ -+ asm volatile ("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_AESS+MCFCAU_CAA)); -+ } -+ -+ /* key_sch[i]^=key_sch[i-Nk]; store ACC to key_sch[i] */ -+ asm volatile ("cp0ld.l (%%a4)+,%%d0,#1,%0" ::"n"(MCFCAU_XOR+MCFCAU_CAA):"a4"); -+ asm volatile ("cp0st.l %%d0,(%%a1),#1,%0" ::"n"(MCFCAU_STR+MCFCAU_CAA)); -+ } -+ spin_unlock_irqrestore(&mcfcau_lock, iflags); -+ -+ return 0; -+} -+ -+ -+/* encrypt a block of text */ -+static void mcfcau_aes_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in) -+{ -+ struct mcfcau_aes_ctx *ctx = crypto_tfm_ctx(tfm); -+ const int Nr_1 = ctx->Nr_1; -+ -+ u32* key_sch = &(ctx->buf[0]); -+ u32 i; -+ unsigned long iflags; -+ -+ DBG("\n"); -+ -+ spin_lock_irqsave(&mcfcau_lock, iflags); -+ asm("move.l %0, %%a1"::"m"(in):"a1"); -+ asm("move.l %0, %%a0"::"m"(key_sch):"a0"); -+ /* state=in */ -+ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA0):"a1"); -+ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA1):"a1"); -+ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA2):"a1"); -+ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA3):"a1"); -+ /* AddRoundKey() */ -+ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_XOR+MCFCAU_CA0):"a0"); -+ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_XOR+MCFCAU_CA1):"a0"); -+ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_XOR+MCFCAU_CA2):"a0"); -+ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_XOR+MCFCAU_CA3):"a0"); -+ -+ for(i=Nr_1;i>0;i--){ -+ /* SubBytes(state) */ -+ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESS+MCFCAU_CA0)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESS+MCFCAU_CA1)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESS+MCFCAU_CA2)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESS+MCFCAU_CA3)); -+ /* ShiftRows(state) */ -+ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESR)); -+ /* MixColumns(state); AddRoundKey() */ -+ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_AESC+MCFCAU_CA0):"a0"); -+ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_AESC+MCFCAU_CA1):"a0"); -+ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_AESC+MCFCAU_CA2):"a0"); -+ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_AESC+MCFCAU_CA3):"a0"); -+ } -+ /* SubBytes(state)*/ -+ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESS+MCFCAU_CA0)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESS+MCFCAU_CA1)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESS+MCFCAU_CA2)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESS+MCFCAU_CA3)); -+ /* ShiftRows(state) */ -+ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESR)); -+ /* AddRoundKey() */ -+ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_XOR+MCFCAU_CA0):"a0"); -+ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_XOR+MCFCAU_CA1):"a0"); -+ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_XOR+MCFCAU_CA2):"a0"); -+ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_XOR+MCFCAU_CA3):"a0"); -+ /* out = state */ -+ asm("move.l %0, %%a1" ::"m"(out):"a1"); -+ asm("cp0st.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_STR+MCFCAU_CA0):"d0"); -+ asm("cp0st.l %%d0,%%d1,#1,%0" ::"n"(MCFCAU_STR+MCFCAU_CA1):"d1"); -+ -+ asm("move.l %%d0,(%%a1)+":::"a1"); -+ asm("move.l %%d1,(%%a1)+":::"a1"); -+ -+ asm("cp0st.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_STR+MCFCAU_CA2):"d0"); -+ asm("cp0st.l %%d0,%%d1,#1,%0" ::"n"(MCFCAU_STR+MCFCAU_CA3):"d1"); -+ -+ asm("move.l %%d0,(%%a1)+":::"a1"); -+ asm("move.l %%d1,(%%a1)+":::"a1"); -+ spin_unlock_irqrestore(&mcfcau_lock, iflags); -+} -+ -+ -+/* decrypt a block of text */ -+static void mcfcau_aes_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in) -+{ -+ struct mcfcau_aes_ctx *ctx = crypto_tfm_ctx(tfm); -+ u32* key_sch = &(ctx->buf[0]); -+ u32 i; -+ unsigned long iflags; -+ const int Nr_1 = ctx->Nr_1; -+ key_sch=&key_sch[(Nr_1+2)*4]; -+ -+ DBG("\n"); -+ -+ spin_lock_irqsave(&mcfcau_lock, iflags); -+ -+ asm("move.l %0, %%a1"::"m"(in):"a1"); -+ asm("move.l %0, %%a0"::"m"(key_sch):"a0"); -+ /* state=in */ -+ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA0):"a1"); -+ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA1):"a1"); -+ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA2):"a1"); -+ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA3):"a1"); -+ /* AddRoundKey() */ -+ asm("cp0ld.l -(%%a0),%%d0,#1,%0" ::"n"(MCFCAU_XOR+MCFCAU_CA3):"a0"); -+ asm("cp0ld.l -(%%a0),%%d0,#1,%0" ::"n"(MCFCAU_XOR+MCFCAU_CA2):"a0"); -+ asm("cp0ld.l -(%%a0),%%d0,#1,%0" ::"n"(MCFCAU_XOR+MCFCAU_CA1):"a0"); -+ asm("cp0ld.l -(%%a0),%%d0,#1,%0" ::"n"(MCFCAU_XOR+MCFCAU_CA0):"a0"); -+ -+ for(i=Nr_1;i>0;i--){ -+ /* InvShiftRows(state) */ -+ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESIR)); -+ /* InvSubBytes(state) */ -+ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESIS+MCFCAU_CA3)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESIS+MCFCAU_CA2)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESIS+MCFCAU_CA1)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESIS+MCFCAU_CA0)); -+ /* InvMixColumns(state); AddRoundKey() */ -+ asm("cp0ld.l -(%%a0),%%d0,#1,%0" ::"n"(MCFCAU_AESIC+MCFCAU_CA3):"a0"); -+ asm("cp0ld.l -(%%a0),%%d0,#1,%0" ::"n"(MCFCAU_AESIC+MCFCAU_CA2):"a0"); -+ asm("cp0ld.l -(%%a0),%%d0,#1,%0" ::"n"(MCFCAU_AESIC+MCFCAU_CA1):"a0"); -+ asm("cp0ld.l -(%%a0),%%d0,#1,%0" ::"n"(MCFCAU_AESIC+MCFCAU_CA0):"a0"); -+ } -+ /* InvShiftRows(state) */ -+ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESIR)); -+ /* InvSubBytes(state)*/ -+ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESIS+MCFCAU_CA3)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESIS+MCFCAU_CA2)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESIS+MCFCAU_CA1)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESIS+MCFCAU_CA0)); -+ /* AddRoundKey() */ -+ asm("cp0ld.l -(%%a0),%%d0,#1,%0" ::"n"(MCFCAU_XOR+MCFCAU_CA3):"a0"); -+ asm("cp0ld.l -(%%a0),%%d0,#1,%0" ::"n"(MCFCAU_XOR+MCFCAU_CA2):"a0"); -+ asm("cp0ld.l -(%%a0),%%d0,#1,%0" ::"n"(MCFCAU_XOR+MCFCAU_CA1):"a0"); -+ asm("cp0ld.l -(%%a0),%%d0,#1,%0" ::"n"(MCFCAU_XOR+MCFCAU_CA0):"a0"); -+ /* out = state */ -+ asm("move.l %0, %%a1" ::"m"(out):"a1"); -+ asm("cp0st.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_STR+MCFCAU_CA0):"d0"); -+ asm("cp0st.l %%d0,%%d1,#1,%0" ::"n"(MCFCAU_STR+MCFCAU_CA1):"d1"); -+ -+ asm("move.l %%d0,(%%a1)+":::"a1"); -+ asm("move.l %%d1,(%%a1)+":::"a1"); -+ -+ asm("cp0st.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_STR+MCFCAU_CA2):"d0"); -+ asm("cp0st.l %%d0,%%d1,#1,%0" ::"n"(MCFCAU_STR+MCFCAU_CA3):"d1"); -+ -+ asm("move.l %%d0,(%%a1)+":::"a1"); -+ asm("move.l %%d1,(%%a1)+":::"a1"); -+ spin_unlock_irqrestore(&mcfcau_lock, iflags); -+ -+} -+ -+ -+static struct crypto_alg mcfcau_aes_alg = { -+ .cra_name = "aes", -+ .cra_driver_name = "aes-mcfcau", -+ .cra_priority = MCFCAU_CRA_PRIORITY, -+ .cra_flags = CRYPTO_ALG_TYPE_CIPHER, -+ .cra_blocksize = MCFCAU_AES_BLOCK_SIZE, -+ .cra_ctxsize = sizeof(struct mcfcau_aes_ctx), -+ .cra_alignmask = 3, -+ .cra_module = THIS_MODULE, -+ .cra_list = LIST_HEAD_INIT(mcfcau_aes_alg.cra_list), -+ .cra_u = { -+ .cipher = { -+ .cia_min_keysize = MCFCAU_AES_MIN_KEY_SIZE, -+ .cia_max_keysize = MCFCAU_AES_MAX_KEY_SIZE, -+ .cia_setkey = mcfcau_aes_setkey, -+ .cia_encrypt = mcfcau_aes_encrypt, -+ .cia_decrypt = mcfcau_aes_decrypt -+ } -+ } -+}; -+ -+static int __init mcfcau_aes_init(void) -+{ -+ int ret = crypto_register_alg(&mcfcau_aes_alg); -+ -+ printk(KERN_INFO MCFCAU_AES_DRIVER_DESC " " -+ MCFCAU_AES_DRIVER_VERSION " %s.\n",ret?"failed":"registered"); -+ return ret; -+} -+ -+static void __exit mcfcau_aes_fini(void) -+{ -+ crypto_unregister_alg(&mcfcau_aes_alg); -+ printk(KERN_INFO MCFCAU_AES_DRIVER_DESC " " -+ MCFCAU_AES_DRIVER_VERSION " unregistered.\n"); -+} -+ -+module_init(mcfcau_aes_init); -+module_exit(mcfcau_aes_fini); -+ -+MODULE_DESCRIPTION(MCFCAU_AES_DRIVER_DESC); -+MODULE_LICENSE("Dual BSD/GPL"); -+MODULE_AUTHOR("Andrey Butok"); ---- /dev/null -+++ b/drivers/crypto/mcfcau.c -@@ -0,0 +1,32 @@ -+/*************************************************************************** -+ * mcfcau.c - Implementation of DES & Triple DES EDE Cipher Algorithms -+ * for Freescale ColdFire Cryptographic Acceleration Unit (CAU). -+ * -+ * Author: Andrey Butok -+ * Copyright Freescale Semiconductor Inc. 2007 -+ * -+ * NOTE: You can find the ColdFire CAU module on MCF5445X and MCF52235. -+ * -+ * This program is free software; you can redistribute it and/or modify it -+ * under the terms of the GNU General Public License as published by the -+ * Free Software Foundation; either version 2 of the License, or (at your -+ * option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, but -+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -+ * for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software Foundation, -+ * Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -+ * -+ *************************************************************************** -+ * Changes: -+ * v0.01 28 September 2006 Andrey Butok -+ * Initial Release - developed on 2.6.20 Linux kernel. -+ */ -+#include <linux/module.h> -+ -+DEFINE_SPINLOCK(mcfcau_lock); -+EXPORT_SYMBOL(mcfcau_lock); ---- /dev/null -+++ b/drivers/crypto/mcfcau-des.c -@@ -0,0 +1,437 @@ -+/*************************************************************************** -+ * mcfcau-des.c - Implementation of DES & Triple DES EDE Cipher Algorithms -+ * for Freescale ColdFire Cryptographic Acceleration Unit (CAU). -+ * -+ * Author: Andrey Butok -+ * Copyright Freescale Semiconductor Inc. 2007 -+ * -+ * NOTE: You can find the ColdFire CAU module on MCF5445X and MCF52235. -+ * -+ * This program is free software; you can redistribute it and/or modify it -+ * under the terms of the GNU General Public License as published by the -+ * Free Software Foundation; either version 2 of the License, or (at your -+ * option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, but -+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -+ * for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software Foundation, -+ * Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -+ * -+ *************************************************************************** -+ * Changes: -+ * v0.01 14 August 2007 Andrey Butok -+ * Initial Release - developed on 2.6.20 Linux kernel. -+ */ -+ -+#include <linux/init.h> -+#include <linux/module.h> -+#include <linux/errno.h> -+#include <linux/crypto.h> -+#include <linux/types.h> -+ -+/* -+#undef DEBUG -+#define DEBUG 1 -+*/ -+ -+#include "mcfcau.h" -+ -+#define MCFCAU_DES_KEY_SIZE (8) -+#define MCFCAU_DES_EXPKEY_WORDS (32) -+#define MCFCAU_DES_BLOCK_SIZE (8) -+ -+#define MCFCAU_DES3_EDE_KEY_SIZE (3 * MCFCAU_DES_KEY_SIZE) -+#define MCFCAU_DES3_EDE_EXPKEY_WORDS (3 * MCFCAU_DES_EXPKEY_WORDS) -+#define MCFCAU_DES3_EDE_BLOCK_SIZE (MCFCAU_DES_BLOCK_SIZE) -+ -+#define MCFCAU_DES_DRIVER_DESC "DES & 3DES ColdFire CAU driver" -+#define MCFCAU_DES_DRIVER_VERSION "v0.01" -+ -+struct mcfcau_des_ctx { -+ u32 expkey[MCFCAU_DES_EXPKEY_WORDS]; -+}; -+ -+struct mcfcau_des3_ede_ctx { -+ u32 expkey[MCFCAU_DES3_EDE_EXPKEY_WORDS]; -+}; -+ -+/* DES round operations */ -+static inline void mcfcau_des_encipher(void) -+{ -+ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESK)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_IP+MCFCAU_KSL1)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSL2)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSL2)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSL2)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSL2)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSL2)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSL2)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSL1)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSL2)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSL2)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSL2)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSL2)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSL2)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSL2)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSL1)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_FP+MCFCAU_KSL1)); -+} -+ -+static inline void mcfcau_des_decipher(void) -+{ -+ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESK+MCFCAU_DC)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_IP+MCFCAU_KSR1)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSR2)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSR2)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSR2)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSR2)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSR2)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSR2)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSR1)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSR2)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSR2)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSR2)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSR2)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSR2)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSR2)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSR1)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_FP+MCFCAU_KSL1)); -+} -+ -+ -+static int mcfcau_des_setkey(struct crypto_tfm *tfm, const u8 *key_p, -+ unsigned int keylen) -+{ -+ struct mcfcau_des_ctx *dctx = crypto_tfm_ctx(tfm); -+ u32 *flags = &tfm->crt_flags; -+ u32 * key = (u32 *) key_p; -+ -+ DBG("\n"); -+ -+ /* -+ * RFC2451: Weak key checks SHOULD be performed. -+ * -+ * FIPS 74: -+ * Keys having duals are keys which produce all zeros, all ones, or -+ * alternating zero-one patterns in the C and D registers after Permuted -+ * Choice 1 has operated on the key. -+ * -+ */ -+ if(*flags & CRYPTO_TFM_REQ_WEAK_KEY){ /* FIPS 74 */ -+ if(key[0]<0xE001E00l){ -+ if(key[0]<0x1FE01FE0){ -+ if(key[0]<0x01E001E0){ -+ if(((key[0]==0x01010101)&&(key[1]==0x01010101))|| -+ ((key[0]==0x011F011F)&&(key[1]==0x010E010E)) ) -+ goto WEAK_KEY; -+ } -+ else{ -+ if(((key[0]==0x01E001E0)&&(key[1]==0x01F101F1))|| -+ ((key[0]==0x01FE01FE)&&(key[1]==0x01FE01FE)) ) -+ goto WEAK_KEY; -+ } -+ } -+ else{ -+ if(key[0]<0x1F1F1F1F){ -+ if(((key[0]==0x1FE01FE0)&&(key[1]==0x0EF10EF1))|| -+ ((key[0]==0x1F011F0l)&&(key[1]==0x0E010E01)) ) -+ goto WEAK_KEY; -+ } -+ else{ -+ if(((key[0]==0x1F1F1F1F)&&(key[1]==0x0E0E0E0E))|| -+ ((key[0]==0x1FFE1FFE)&&(key[1]==0x0EFE0EFE)) ) -+ goto WEAK_KEY; -+ } -+ } -+ } else { -+ if(key[0]<0xFE01FE01){ -+ if(key[0]<0xE0E0E0E0){ -+ if(((key[0]==0xE001E00l)&&(key[1]==0xF101F101))|| -+ ((key[0]==0xE01FE01F)&&(key[1]==0xF10EF10E)) ) -+ goto WEAK_KEY; -+ } -+ else{ -+ if(((key[0]==0xE0E0E0E0)&&(key[1]==0xF1F1F1F1))|| -+ ((key[0]==0xE0FEE0FE)&&(key[1]==0xF1FEF1FE)) ) -+ goto WEAK_KEY; -+ } -+ } -+ else{ -+ if(key[0]<0xFEE0FEE0){ -+ if(((key[0]==0xFE01FE01)&&(key[1]==0xFE01FE01))|| -+ ((key[0]==0xFE1FFE1F)&&(key[1]==0xFE0EFE0E)) ) -+ goto WEAK_KEY; -+ } -+ else{ -+ if(((key[0]==0xFEE0FEE0)&&(key[1]==0xFEF1FEF1))|| -+ ((key[0]==0xFEFEFEFE)&&(key[1]==0xFEFEFEFE)) ) -+ goto WEAK_KEY; -+ } -+ } -+ } -+ } -+ memcpy(dctx->expkey, key_p, keylen); -+ return 0; -+WEAK_KEY: -+ *flags |= CRYPTO_TFM_RES_WEAK_KEY; -+ return -EINVAL; -+} -+ -+ -+void mcfcau_des_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src) -+{ -+ struct mcfcau_des_ctx *ctx = crypto_tfm_ctx(tfm); -+ u32 * des_key_tmp = ctx->expkey; -+ unsigned long iflags; -+ -+ DBG("\n"); -+ -+ spin_lock_irqsave(&mcfcau_lock, iflags); -+ -+ asm("move.l %0, %%a0"::"m"(src):"a0"); -+ asm("move.l %0, %%a1"::"m"(des_key_tmp):"a1"); -+ -+ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA2):"a0"); -+ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA3)); -+ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA0):"a1"); -+ asm("cp0ld.l (%%a1),%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA1)); -+ -+ mcfcau_des_encipher(); -+ -+ asm("cp0st.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_STR+MCFCAU_CA2):"d0"); -+ asm("cp0st.l %%d0,%%d1,#1,%0" ::"n"(MCFCAU_STR+MCFCAU_CA3):"d1"); -+ asm("move.l %0, %%a1" ::"m"(dst):"a1"); -+ asm("move.l %d0,(%a1)+"); -+ asm("move.l %d1,(%a1)"); -+ -+ spin_unlock_irqrestore(&mcfcau_lock, iflags); -+} -+ -+ -+void mcfcau_des_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src) -+{ -+ struct mcfcau_des_ctx *ctx = crypto_tfm_ctx(tfm); -+ u32 * des_key_tmp = ctx->expkey; -+ unsigned long iflags; -+ -+ DBG("\n"); -+ -+ spin_lock_irqsave(&mcfcau_lock, iflags); -+ -+ asm("move.l %0, %%a0"::"m"(src):"a0"); -+ asm("move.l %0, %%a1"::"m"(des_key_tmp):"a1"); -+ -+ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA2):"a0"); -+ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA3)); -+ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA0):"a1"); -+ asm("cp0ld.l (%%a1),%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA1)); -+ -+ mcfcau_des_decipher(); -+ -+ asm("move.l %0, %%a1" ::"m"(dst):"a1"); -+ asm("cp0st.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_STR+MCFCAU_CA2):"d0"); -+ asm("cp0st.l %%d0,%%d1,#1,%0" ::"n"(MCFCAU_STR+MCFCAU_CA3):"d1"); -+ asm("move.l %d0,(%a1)+"); -+ asm("move.l %d1,(%a1)"); -+ -+ spin_unlock_irqrestore(&mcfcau_lock, iflags); -+} -+ -+ -+/* -+ * RFC2451: -+ * -+ * For DES-EDE3, there is no known need to reject weak or -+ * complementation keys. Any weakness is obviated by the use of -+ * multiple keys. -+ * -+ * However, if the first two or last two independent 64-bit keys are -+ * equal (k1 == k2 or k2 == k3), then the DES3 operation is simply the -+ * same as DES. Implementers MUST reject keys that exhibit this -+ * property. -+ * -+ */ -+ -+static int mcfcau_des3_ede_setkey(struct crypto_tfm *tfm, const u8 *key_p, unsigned int keylen) -+{ -+ const u32 *key = (const u32 *)key_p; -+ struct mcfcau_des3_ede_ctx *dctx = crypto_tfm_ctx(tfm); -+ u32 *flags = &tfm->crt_flags; -+ -+DBG("\n"); -+ -+ if (unlikely(!((key[0] ^ key[2]) | (key[1] ^ key[3])) || -+ !((key[2] ^ key[4]) | (key[3] ^ key[5])))) -+ { -+ *flags |= CRYPTO_TFM_RES_BAD_KEY_SCHED; -+ return -EINVAL; -+ } -+ -+ memcpy(dctx->expkey,key_p,keylen); -+ -+ return 0; -+} -+ -+static void mcfcau_des3_ede_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src) -+{ -+ struct mcfcau_des3_ede_ctx *dctx = crypto_tfm_ctx(tfm); -+ const u32 * des_key_tmp = dctx->expkey; -+ unsigned long iflags; -+ -+ DBG("\n"); -+ -+ spin_lock_irqsave(&mcfcau_lock, iflags); -+ -+ /*EK1*/ -+ asm("move.l %0, %%a0"::"m"(src):"a0"); -+ asm("move.l %0, %%a1"::"m"(des_key_tmp):"a1"); -+ -+ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA2):"a0"); -+ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA3)); -+ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA0):"a1"); -+ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA1):"a1"); -+ -+ mcfcau_des_encipher(); -+ -+ /*DK2*/ -+ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA0):"a1"); -+ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA1):"a1"); -+ -+ mcfcau_des_decipher(); -+ -+ /*EK3*/ -+ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA0):"a1"); -+ asm("cp0ld.l (%%a1),%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA1)); -+ -+ mcfcau_des_encipher(); -+ -+ asm("move.l %0, %%a1" ::"m"(dst):"a1"); -+ asm("cp0st.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_STR+MCFCAU_CA2):"d0"); -+ asm("cp0st.l %%d0,%%d1,#1,%0" ::"n"(MCFCAU_STR+MCFCAU_CA3):"d1"); -+ asm("move.l %d0,(%a1)+"); -+ asm("move.l %d1,(%a1)"); -+ -+ spin_unlock_irqrestore(&mcfcau_lock, iflags); -+} -+ -+static void mcfcau_des3_ede_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src) -+{ -+ struct mcfcau_des3_ede_ctx *dctx = crypto_tfm_ctx(tfm); -+ const u32 * des_key_tmp = dctx->expkey + 6 - 2; -+ unsigned long iflags; -+ -+ DBG("\n"); -+ -+ spin_lock_irqsave(&mcfcau_lock, iflags); -+ -+ /*DK3*/ -+ asm("move.l %0, %%a0"::"m"(src):"a0"); -+ asm("move.l %0, %%a1"::"m"(des_key_tmp):"a1"); -+ -+ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA2):"a0"); -+ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA3)); -+ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA0):"a1"); -+ asm("cp0ld.l (%%a1),%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA1)); -+ -+ mcfcau_des_decipher(); -+ -+ /*EK2*/ -+ asm("suba.l #12,%a1"); /*dec key pointer*/ -+ -+ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA0):"a1"); -+ asm("cp0ld.l (%%a1),%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA1)); -+ -+ mcfcau_des_encipher(); -+ -+ /*DK1*/ -+ asm("suba.l #12,%a1"); /*dec key pointer*/ -+ -+ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA0):"a1"); -+ asm("cp0ld.l (%%a1),%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA1)); -+ -+ mcfcau_des_decipher(); -+ -+ asm("move.l %0, %%a1" ::"m"(dst):"a1"); -+ asm("cp0st.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_STR+MCFCAU_CA2):"d0"); -+ asm("cp0st.l %%d0,%%d1,#1,%0" ::"n"(MCFCAU_STR+MCFCAU_CA3):"d1"); -+ asm("move.l %d0,(%a1)+"); -+ asm("move.l %d1,(%a1)"); -+ -+ spin_unlock_irqrestore(&mcfcau_lock, iflags); -+} -+ -+ -+static struct crypto_alg mcfcau_des_alg = { -+ .cra_name = "des", -+ .cra_driver_name = "des-mcfcau", -+ .cra_priority = MCFCAU_CRA_PRIORITY, -+ .cra_flags = CRYPTO_ALG_TYPE_CIPHER, -+ .cra_blocksize = MCFCAU_DES_BLOCK_SIZE, -+ .cra_ctxsize = sizeof(struct mcfcau_des_ctx), -+ .cra_module = THIS_MODULE, -+ .cra_alignmask = 3, -+ .cra_list = LIST_HEAD_INIT(mcfcau_des_alg.cra_list), -+ .cra_u = { .cipher = { -+ .cia_min_keysize = MCFCAU_DES_KEY_SIZE, -+ .cia_max_keysize = MCFCAU_DES_KEY_SIZE, -+ .cia_setkey = mcfcau_des_setkey, -+ .cia_encrypt = mcfcau_des_encrypt, -+ .cia_decrypt = mcfcau_des_decrypt } } -+}; -+ -+static struct crypto_alg mcfcau_des3_ede_alg = { -+ .cra_name = "des3_ede", -+ .cra_driver_name = "des3_ede-mcfcau", -+ .cra_priority = MCFCAU_CRA_PRIORITY, -+ .cra_flags = CRYPTO_ALG_TYPE_CIPHER, -+ .cra_blocksize = MCFCAU_DES3_EDE_BLOCK_SIZE, -+ .cra_ctxsize = sizeof(struct mcfcau_des3_ede_ctx), -+ .cra_module = THIS_MODULE, -+ .cra_alignmask = 3, -+ .cra_list = LIST_HEAD_INIT(mcfcau_des3_ede_alg.cra_list), -+ .cra_u = { .cipher = { -+ .cia_min_keysize = MCFCAU_DES3_EDE_KEY_SIZE, -+ .cia_max_keysize = MCFCAU_DES3_EDE_KEY_SIZE, -+ .cia_setkey = mcfcau_des3_ede_setkey, -+ .cia_encrypt = mcfcau_des3_ede_encrypt, -+ .cia_decrypt = mcfcau_des3_ede_decrypt } } -+}; -+ -+MODULE_ALIAS("mcfcau_des3_ede"); -+ -+static int __init mcfcau_des_init(void) -+{ -+ int ret; -+ -+ ret = crypto_register_alg(&mcfcau_des_alg); -+ if (ret < 0) -+ goto out; -+ -+ ret = crypto_register_alg(&mcfcau_des3_ede_alg); -+ if (ret < 0) -+ crypto_unregister_alg(&mcfcau_des_alg); -+out: -+ printk(KERN_INFO MCFCAU_DES_DRIVER_DESC " " -+ MCFCAU_DES_DRIVER_VERSION " %s.\n",ret?"failed":"registered"); -+ return ret; -+} -+ -+static void __exit mcfcau_des_exit(void) -+{ -+ crypto_unregister_alg(&mcfcau_des3_ede_alg); -+ crypto_unregister_alg(&mcfcau_des_alg); -+ -+ printk(KERN_INFO MCFCAU_DES_DRIVER_DESC " " -+ MCFCAU_DES_DRIVER_VERSION " unregistered.\n"); -+} -+ -+module_init(mcfcau_des_init); -+module_exit(mcfcau_des_exit); -+ -+MODULE_LICENSE("GPL"); -+MODULE_DESCRIPTION("DES & Triple DES EDE Cipher Algorithms for ColdFire CAU"); -+MODULE_AUTHOR("Andrey Butok"); ---- /dev/null -+++ b/drivers/crypto/mcfcau.h -@@ -0,0 +1,98 @@ -+/*************************************************************************** -+ * mcfcau.h - Common header file for Freescale ColdFire -+ * Cryptographic Acceleration Unit (CAU) drivers. -+ * -+ * Author: Andrey Butok -+ * Copyright Freescale Semiconductor Inc. 2007 -+ * -+ * NOTE: You can find the ColdFire CAU module on MCF5445X and MCF52235. -+ * -+ * This program is free software; you can redistribute it and/or modify it -+ * under the terms of the GNU General Public License as published by the -+ * Free Software Foundation; either version 2 of the License, or (at your -+ * option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, but -+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -+ * for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software Foundation, -+ * Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -+ * -+ *************************************************************************** -+ * Changes: -+ * v0.01 14 August 2007 Andrey Butok -+ */ -+ -+#ifndef MCFCAU_H -+#define MCFCAU_H -+ -+#include <linux/spinlock.h> -+ -+/* CAU Registers (CAx) */ -+#define MCFCAU_CASR (0x0) -+#define MCFCAU_CAA (0x1) -+#define MCFCAU_CA0 (0x2) -+#define MCFCAU_CA1 (0x3) -+#define MCFCAU_CA2 (0x4) -+#define MCFCAU_CA3 (0x5) -+#define MCFCAU_CA4 (0x6) -+#define MCFCAU_CA5 (0x7) -+ -+ /* CAU Commands */ -+#define MCFCAU_CNOP (0x000) -+#define MCFCAU_LDR (0x010) -+#define MCFCAU_STR (0x020) -+#define MCFCAU_ADR (0x030) -+#define MCFCAU_RADR (0x040) -+#define MCFCAU_ADRA (0x050) -+#define MCFCAU_XOR (0x060) -+#define MCFCAU_ROTL (0x070) -+#define MCFCAU_MVRA (0x080) -+#define MCFCAU_MVAR (0x090) -+#define MCFCAU_AESS (0x0A0) -+#define MCFCAU_AESIS (0x0B0) -+#define MCFCAU_AESC (0x0C0) -+#define MCFCAU_AESIC (0x0D0) -+#define MCFCAU_AESR (0x0E0) -+#define MCFCAU_AESIR (0x0F0) -+#define MCFCAU_DESR (0x100) -+#define MCFCAU_DESK (0x110) -+#define MCFCAU_HASH (0x120) -+#define MCFCAU_SHS (0x130) -+#define MCFCAU_MDS (0x140) -+#define MCFCAU_ILL (0x1F0) -+ -+/* DESR Fields */ -+#define MCFCAU_IP (0x08) /* initial permutation */ -+#define MCFCAU_FP (0x04) /* final permutation */ -+#define MCFCAU_KSL1 (0x00) /* key schedule left 1 bit */ -+#define MCFCAU_KSL2 (0x01) /* key schedule left 2 bits */ -+#define MCFCAU_KSR1 (0x02) /* key schedule right 1 bit */ -+#define MCFCAU_KSR2 (0x03) /* key schedule right 2 bits */ -+ -+/* DESK Field */ -+#define MCFCAU_DC (0x01) /* decrypt key schedule */ -+#define MCFCAU_CP (0x02) /* check parity */ -+ -+/* HASH Functions Codes */ -+#define MCFCAU_HFF (0x0) /* MD5 F() CA1&CA2 | ~CA1&CA3 */ -+#define MCFCAU_HFG (0x1) /* MD5 G() CA1&CA3 | CA2&~CA3 */ -+#define MCFCAU_HFH (0x2) /* MD5 H(), SHA Parity() CA1^CA2^CA3 */ -+#define MCFCAU_HFI (0x3) /* MD5 I() CA2^(CA1|~CA3) */ -+#define MCFCAU_HFC (0x4) /* SHA Ch() CA1&CA2 ^ ~CA1&CA3 */ -+#define MCFCAU_HFM (0x5) /* SHA Maj() CA1&CA2 ^ CA1&CA3 ^ CA2&CA3 */ -+ -+#define MCFCAU_CRA_PRIORITY (300) -+ -+extern spinlock_t mcfcau_lock; -+ -+#ifdef DEBUG -+#define DBG(fmt, args...) printk( "[%s] " fmt , __FUNCTION__, ## args) -+#else -+#define DBG(fmt, args...) do{}while(0) -+#endif -+ -+#endif ---- /dev/null -+++ b/drivers/crypto/mcfcau-md5.c -@@ -0,0 +1,654 @@ -+ /*************************************************************************** -+ * mcfcau-md5.c - Implementation of MD5 Message Digest Algorithm (RFC1321) -+ * for Freescale ColdFire Cryptographic Acceleration Unit (CAU). -+ * -+ * Author: Andrey Butok -+ * Copyright Freescale Semiconductor Inc. 2007 -+ * -+ * NOTE: You can find the ColdFire CAU module on MCF5445X and MCF52235. -+ * -+ * This program is free software; you can redistribute it and/or modify it -+ * under the terms of the GNU General Public License as published by the -+ * Free Software Foundation; either version 2 of the License, or (at your -+ * option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, but -+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -+ * for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software Foundation, -+ * Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -+ * -+ *************************************************************************** -+ * Changes: -+ * v0.01 30 September 2007 Andrey Butok -+ * Initial Release - developed on 2.6.20 Linux kernel. -+ */ -+#include <linux/init.h> -+#include <linux/module.h> -+#include <linux/string.h> -+#include <linux/crypto.h> -+#include <linux/types.h> -+#include <asm/byteorder.h> -+ -+/* -+#undef DEBUG -+#define DEBUG 1 -+*/ -+ -+#include "mcfcau.h" -+ -+ -+#define MCFCAU_MD5_DIGEST_SIZE (16) -+#define MCFCAU_MD5_HMAC_BLOCK_SIZE (64) -+#define MCFCAU_MD5_BLOCK_WORDS (16) -+#define MCFCAU_MD5_HASH_WORDS (4) -+ -+#define MCFCAU_MD5_DRIVER_DESC "MD5 ColdFire CAU driver" -+#define MCFCAU_MD5_DRIVER_VERSION "v0.01" -+ -+ -+struct mcfcau_md5_ctx { -+ u32 hash[MCFCAU_MD5_HASH_WORDS]; -+ u32 block[MCFCAU_MD5_BLOCK_WORDS]; -+ u64 byte_count; -+}; -+ -+u32 mcfcau_md5_t[64]={0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, -+ 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, -+ 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, -+ 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, -+ 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, -+ 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, -+ 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, -+ 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, -+ 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, -+ 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, -+ 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, -+ 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, -+ 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, -+ 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, -+ 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, -+ 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391}; -+ -+ -+ -+static void mcfcau_md5_transform(u32 *hash, u32 const *in) -+{ -+ int i; -+ u32 * md5_t_p=&mcfcau_md5_t[0]; -+ unsigned long iflags; -+ -+ spin_lock_irqsave(&mcfcau_lock, iflags); -+ asm("move.l %0, %%a1"::"m"(hash):"a1"); -+ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CAA):"a1");/*a*/ -+ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA1):"a1");/*b*/ -+ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA2):"a1");/*c*/ -+ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA3):"a1");/*d*/ -+ asm("move.l %0, %%a0"::"m"(in):"a0"); /* X[] */ -+ asm("move.l %0, %%a3"::"m"(md5_t_p):"a3"); /* T[] */ -+ -+ -+ /* Round 1 */ -+ asm("moveq.l #7, %%d4":::"d4"); /* for rotating by 7 */ -+ asm("moveq.l #12, %%d5":::"d5"); /* for rotating by 12 */ -+ asm("moveq.l #17, %%d6":::"d6"); /* for rotating by 17 */ -+ asm("moveq.l #22, %%d7":::"d7"); /* for rotating by 22 */ -+ -+ for(i=0; i<4;i++){ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFF)); /* a+F(b,c,d) */ -+ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); /* add byterev x[i] */ -+ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); /* add t[i] */ -+ asm("cp0ld.l %%d4,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); /* rotate by 7 */ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); /* add b */ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); /* register to register shift */ -+ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFF)); -+ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); -+ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); -+ asm("cp0ld.l %%d5,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); -+ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFF)); -+ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); -+ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); -+ asm("cp0ld.l %%d6,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); -+ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFF)); -+ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); -+ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); -+ asm("cp0ld.l %%d7,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); -+ }; -+ -+ -+ /* Round 2 */ -+ asm("moveq.l #5, %%d4":::"d4"); /* for rotating by 5 */ -+ asm("moveq.l #9, %%d5":::"d5"); /* for rotating by 9 */ -+ asm("moveq.l #14, %%d6":::"d6"); /* for rotating by 14 */ -+ asm("moveq.l #20, %%d7":::"d7"); /* for rotating by 20 */ -+ -+ asm("lea -60(%%a0),%%a0":::"a0"); -+ -+ for(i=0; i<2;i++){ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFG)); -+ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); -+ asm("lea 20(%%a0),%%a0" :::"a0"); -+ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); -+ asm("cp0ld.l %%d4,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); -+ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFG)); -+ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); -+ asm("lea 20(%%a0),%%a0" :::"a0"); -+ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); -+ asm("cp0ld.l %%d5,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); -+ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFG)); -+ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); -+ asm("lea -44(%%a0),%%a0" :::"a0"); -+ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); -+ asm("cp0ld.l %%d6,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); -+ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFG)); -+ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); -+ asm("lea 20(%%a0),%%a0" :::"a0"); -+ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); -+ asm("cp0ld.l %%d7,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); -+ }; -+ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFG)); -+ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); -+ asm("lea 20(%%a0),%%a0" :::"a0"); -+ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); -+ asm("cp0ld.l %%d4,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); -+ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFG)); -+ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); -+ asm("lea -44(%%a0),%%a0" :::"a0"); -+ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); -+ asm("cp0ld.l %%d5,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); -+ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFG)); -+ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); -+ asm("lea 20(%%a0),%%a0" :::"a0"); -+ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); -+ asm("cp0ld.l %%d6,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); -+ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFG)); -+ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); -+ asm("lea 20(%%a0),%%a0" :::"a0"); -+ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); -+ asm("cp0ld.l %%d7,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); -+ -+ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFG)); -+ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); -+ asm("lea -44(%%a0),%%a0" :::"a0"); -+ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); -+ asm("cp0ld.l %%d4,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); -+ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFG)); -+ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); -+ asm("lea 20(%%a0),%%a0" :::"a0"); -+ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); -+ asm("cp0ld.l %%d5,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); -+ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFG)); -+ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); -+ asm("lea 20(%%a0),%%a0" :::"a0"); -+ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); -+ asm("cp0ld.l %%d6,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); -+ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFG)); -+ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); -+ asm("lea -28(%%a0),%%a0" :::"a0"); -+ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); -+ asm("cp0ld.l %%d7,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); -+ -+ -+ /* Round 3 */ -+ asm("moveq.l #4, %%d4":::"d4"); /* for rotating by 5 */ -+ asm("moveq.l #11, %%d5":::"d5"); /* for rotating by 9 */ -+ asm("moveq.l #16, %%d6":::"d6"); /* for rotating by 14 */ -+ asm("moveq.l #23, %%d7":::"d7"); /* for rotating by 20 */ -+ -+ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFH)); -+ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); -+ asm("lea 12(%%a0),%%a0" :::"a0"); -+ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); -+ asm("cp0ld.l %%d4,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); -+ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFH)); -+ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); -+ asm("lea 12(%%a0),%%a0" :::"a0"); -+ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); -+ asm("cp0ld.l %%d5,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); -+ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFH)); -+ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); -+ asm("lea 12(%%a0),%%a0" :::"a0"); -+ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); -+ asm("cp0ld.l %%d6,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); -+ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFH)); -+ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); -+ asm("lea -52(%%a0),%%a0" :::"a0"); -+ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); -+ asm("cp0ld.l %%d7,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); -+ -+ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFH)); -+ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); -+ asm("lea 12(%%a0),%%a0" :::"a0"); -+ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); -+ asm("cp0ld.l %%d4,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); -+ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFH)); -+ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); -+ asm("lea 12(%%a0),%%a0" :::"a0"); -+ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); -+ asm("cp0ld.l %%d5,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); -+ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFH)); -+ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); -+ asm("lea 12(%%a0),%%a0" :::"a0"); -+ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); -+ asm("cp0ld.l %%d6,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); -+ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFH)); -+ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); -+ asm("lea 12(%%a0),%%a0" :::"a0"); -+ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); -+ asm("cp0ld.l %%d7,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); -+ -+ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFH)); -+ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); -+ asm("lea -52(%%a0),%%a0" :::"a0"); -+ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); -+ asm("cp0ld.l %%d4,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); -+ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFH)); -+ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); -+ asm("lea 12(%%a0),%%a0" :::"a0"); -+ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); -+ asm("cp0ld.l %%d5,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); -+ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFH)); -+ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); -+ asm("lea 12(%%a0),%%a0" :::"a0"); -+ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); -+ asm("cp0ld.l %%d6,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); -+ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFH)); -+ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); -+ asm("lea 12(%%a0),%%a0" :::"a0"); -+ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); -+ asm("cp0ld.l %%d7,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); -+ -+ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFH)); -+ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); -+ asm("lea 12(%%a0),%%a0" :::"a0"); -+ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); -+ asm("cp0ld.l %%d4,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); -+ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFH)); -+ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); -+ asm("lea 12(%%a0),%%a0" :::"a0"); -+ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); -+ asm("cp0ld.l %%d5,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); -+ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFH)); -+ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); -+ asm("lea -52(%%a0),%%a0" :::"a0"); -+ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); -+ asm("cp0ld.l %%d6,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); -+ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFH)); -+ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); -+ asm("lea -8(%%a0),%%a0" :::"a0"); -+ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); -+ asm("cp0ld.l %%d7,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); -+ -+ -+ /* Round 4 */ -+ asm("moveq.l #6, %%d4":::"d4"); /* for rotating by 6 */ -+ asm("moveq.l #10, %%d5":::"d5"); /* for rotating by 10 */ -+ asm("moveq.l #15, %%d6":::"d6"); /* for rotating by 15 */ -+ asm("moveq.l #21, %%d7":::"d7"); /* for rotating by 21 */ -+ -+ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFI)); -+ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); -+ asm("lea 28(%%a0),%%a0" :::"a0"); -+ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); -+ asm("cp0ld.l %%d4,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); -+ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFI)); -+ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); -+ asm("lea 28(%%a0),%%a0" :::"a0"); -+ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); -+ asm("cp0ld.l %%d5,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); -+ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFI)); -+ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); -+ asm("lea -36(%%a0),%%a0" :::"a0"); -+ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); -+ asm("cp0ld.l %%d6,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); -+ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFI)); -+ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); -+ asm("lea 28(%%a0),%%a0" :::"a0"); -+ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); -+ asm("cp0ld.l %%d7,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); -+ -+ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFI)); -+ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); -+ asm("lea -36(%%a0),%%a0" :::"a0"); -+ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); -+ asm("cp0ld.l %%d4,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); -+ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFI)); -+ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); -+ asm("lea 28(%%a0),%%a0" :::"a0"); -+ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); -+ asm("cp0ld.l %%d5,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); -+ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFI)); -+ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); -+ asm("lea -36(%%a0),%%a0" :::"a0"); -+ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); -+ asm("cp0ld.l %%d6,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); -+ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFI)); -+ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); -+ asm("lea 28(%%a0),%%a0" :::"a0"); -+ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); -+ asm("cp0ld.l %%d7,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); -+ -+ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFI)); -+ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); -+ asm("lea 28(%%a0),%%a0" :::"a0"); -+ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); -+ asm("cp0ld.l %%d4,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); -+ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFI)); -+ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); -+ asm("lea -36(%%a0),%%a0" :::"a0"); -+ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); -+ asm("cp0ld.l %%d5,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); -+ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFI)); -+ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); -+ asm("lea 28(%%a0),%%a0" :::"a0"); -+ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); -+ asm("cp0ld.l %%d6,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); -+ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFI)); -+ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); -+ asm("lea -36(%%a0),%%a0" :::"a0"); -+ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); -+ asm("cp0ld.l %%d7,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); -+ -+ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFI)); -+ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); -+ asm("lea 28(%%a0),%%a0" :::"a0"); -+ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); -+ asm("cp0ld.l %%d4,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); -+ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFI)); -+ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); -+ asm("lea -36(%%a0),%%a0" :::"a0"); -+ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); -+ asm("cp0ld.l %%d5,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); -+ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFI)); -+ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); -+ asm("lea 28(%%a0),%%a0" :::"a0"); -+ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); -+ asm("cp0ld.l %%d6,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); -+ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFI)); -+ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); -+ asm("lea 28(%%a0),%%a0" :::"a0"); -+ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); -+ asm("cp0ld.l %%d7,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); -+ -+ -+ asm("move.l %0, %%a1"::"m"(hash):"a1"); -+ -+ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a1");/*a*/ -+ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CA1):"a1");/*b*/ -+ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CA2):"a1");/*c*/ -+ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CA3):"a1");/*d*/ -+ -+ asm("cp0st.l %%d0,-(%%a1),#1,%0" ::"n"(MCFCAU_STR+MCFCAU_CA3):"a1");/*d*/ -+ asm("cp0st.l %%d0,-(%%a1),#1,%0" ::"n"(MCFCAU_STR+MCFCAU_CA2):"a1");/*c*/ -+ asm("cp0st.l %%d0,-(%%a1),#1,%0" ::"n"(MCFCAU_STR+MCFCAU_CA1):"a1");/*b*/ -+ asm("cp0st.l %%d0,-(%%a1),#1,%0" ::"n"(MCFCAU_STR+MCFCAU_CAA):"a1");/*a*/ -+ spin_unlock_irqrestore(&mcfcau_lock, iflags); -+} -+ -+static inline void le32_to_cpu_array(u32 *buf, unsigned int words) -+{ -+ while (words--) { -+ __le32_to_cpus(buf); -+ buf++; -+ } -+} -+ -+static inline void cpu_to_le32_array(u32 *buf, unsigned int words) -+{ -+ while (words--) { -+ __cpu_to_le32s(buf); -+ buf++; -+ } -+} -+ -+static void mcfcau_md5_initialization(struct crypto_tfm *tfm) -+{ -+ struct mcfcau_md5_ctx *mctx = crypto_tfm_ctx(tfm); -+ -+ DBG("\n"); -+ mctx->hash[0] = 0x67452301; -+ mctx->hash[1] = 0xefcdab89; -+ mctx->hash[2] = 0x98badcfe; -+ mctx->hash[3] = 0x10325476; -+ mctx->byte_count = 0; -+} -+ -+static void mcfcau_md5_update(struct crypto_tfm *tfm, const u8 *data, unsigned int len) -+{ -+ struct mcfcau_md5_ctx *mctx = crypto_tfm_ctx(tfm); -+ const u32 avail = sizeof(mctx->block) - (mctx->byte_count & 0x3f); -+ -+ DBG("\n"); -+ mctx->byte_count += len; -+ -+ if (avail > len) { -+ memcpy((char *)mctx->block + (sizeof(mctx->block) - avail), -+ data, len); -+ } -+ else { -+ memcpy((char *)mctx->block + (sizeof(mctx->block) - avail), data, avail); -+ -+ mcfcau_md5_transform(mctx->hash, mctx->block); -+ data += avail; -+ len -= avail; -+ -+ while (len >= sizeof(mctx->block)) { -+ memcpy(mctx->block, data, sizeof(mctx->block)); -+ mcfcau_md5_transform(mctx->hash, mctx->block); -+ data += sizeof(mctx->block); -+ len -= sizeof(mctx->block); -+ } -+ -+ memcpy(mctx->block, data, len); -+ } -+} -+ -+static void mcfcau_md5_final(struct crypto_tfm *tfm, u8 *out) -+{ -+ struct mcfcau_md5_ctx *mctx = crypto_tfm_ctx(tfm); -+ const unsigned int offset = mctx->byte_count & 0x3f; -+ char *p = (char *)mctx->block + offset; -+ int padding = 56 - (offset + 1); -+ -+ DBG("\n"); -+ -+ *p++ = 0x80; -+ if (padding < 0) { -+ memset(p, 0x00, padding + sizeof (u64)); -+ mcfcau_md5_transform(mctx->hash, mctx->block); -+ p = (char *)mctx->block; -+ padding = 56; -+ } -+ -+ memset(p, 0, padding); -+ mctx->block[14] = mctx->byte_count << 3; -+ mctx->block[15] = mctx->byte_count >> 29; -+ le32_to_cpu_array(&mctx->block[14], 2); -+ -+ mcfcau_md5_transform(mctx->hash, mctx->block); -+ -+ cpu_to_le32_array(mctx->hash, sizeof(mctx->hash) / sizeof(u32)); -+ memcpy(out, mctx->hash, sizeof(mctx->hash)); -+ memset(mctx, 0, sizeof(*mctx)); -+} -+ -+static struct crypto_alg mcfcau_md5_alg = { -+ .cra_name = "md5", -+ .cra_driver_name = "md5-mcfcau", -+ .cra_priority = MCFCAU_CRA_PRIORITY, -+ .cra_flags = CRYPTO_ALG_TYPE_DIGEST, -+ .cra_blocksize = MCFCAU_MD5_HMAC_BLOCK_SIZE, -+ .cra_ctxsize = sizeof(struct mcfcau_md5_ctx), -+ .cra_module = THIS_MODULE, -+ .cra_list = LIST_HEAD_INIT(mcfcau_md5_alg.cra_list), -+ .cra_u = { .digest = { -+ .dia_digestsize = MCFCAU_MD5_DIGEST_SIZE, -+ .dia_init = mcfcau_md5_initialization, -+ .dia_update = mcfcau_md5_update, -+ .dia_final = mcfcau_md5_final } } -+}; -+ -+static int __init mcfcau_md5_init(void) -+{ -+ int ret = crypto_register_alg(&mcfcau_md5_alg); -+ printk(KERN_INFO MCFCAU_MD5_DRIVER_DESC " " -+ MCFCAU_MD5_DRIVER_VERSION " %s.\n",ret?"failed":"registered"); -+ return ret; -+} -+ -+static void __exit mcfcau_md5_exit(void) -+{ -+ crypto_unregister_alg(&mcfcau_md5_alg); -+ printk(KERN_INFO MCFCAU_MD5_DRIVER_DESC " " -+ MCFCAU_MD5_DRIVER_VERSION " unregistered.\n"); -+} -+ -+module_init(mcfcau_md5_init); -+module_exit(mcfcau_md5_exit); -+ -+MODULE_LICENSE("GPL"); -+MODULE_DESCRIPTION(MCFCAU_MD5_DRIVER_DESC); -+MODULE_AUTHOR("Andrey Butok"); ---- /dev/null -+++ b/drivers/crypto/mcfcau-sha1.c -@@ -0,0 +1,280 @@ -+ /*************************************************************************** -+ * mcfcau-sha1.c - Implementation of SHA1 Secure Hash Algorithm -+ * for Freescale ColdFire Cryptographic Acceleration Unit (CAU). -+ * -+ * Author: Andrey Butok -+ * Copyright Freescale Semiconductor Inc. 2007 -+ * -+ * NOTE: You can find the ColdFire CAU module on MCF5445X and MCF52235. -+ * -+ * This program is free software; you can redistribute it and/or modify it -+ * under the terms of the GNU General Public License as published by the -+ * Free Software Foundation; either version 2 of the License, or (at your -+ * option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, but -+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -+ * for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software Foundation, -+ * Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -+ * -+ *************************************************************************** -+ * Changes: -+ * v0.01 15 October 2007 Andrey Butok -+ * Initial Release - developed on 2.6.20 Linux kernel. -+ */ -+ -+#include <linux/init.h> -+#include <linux/module.h> -+#include <linux/mm.h> -+#include <linux/crypto.h> -+#include <linux/types.h> -+ -+ -+/* -+#undef DEBUG -+#define DEBUG 1 -+*/ -+ -+#include "mcfcau.h" -+ -+#define MCFCAU_SHA1_DIGEST_WORDS (5) -+#define MCFCAU_SHA1_WORKSPACE_WORDS (80) -+ -+#define MCFCAU_SHA1_DIGEST_SIZE (20) -+#define MCFCAU_SHA1_HMAC_BLOCK_SIZE (64) -+ -+#define MCFCAU_SHA1_DRIVER_DESC "SHA1 ColdFire CAU driver" -+#define MCFCAU_SHA1_DRIVER_VERSION "v0.01" -+ -+struct mcfcau_sha1_ctx { -+ u64 count; -+ u32 state[5]; -+ u8 buffer[64]; -+}; -+ -+const static u32 K[4]={0x5A827999L, /* Rounds 0-19: sqrt(2) * 2^30 */ -+ 0x6ED9EBA1L, /* Rounds 20-39: sqrt(3) * 2^30 */ -+ 0x8F1BBCDCL, /* Rounds 40-59: sqrt(5) * 2^30 */ -+ 0xCA62C1D6L}; /* Rounds 60-79: sqrt(10) * 2^30 */ -+ -+static void noinline mcfcau_sha1_transform(__u32 *digest, const char *in, __u32 *W) -+{ -+ int i; -+ u32 * tmp_p; -+ unsigned long iflags; -+ -+ /* (a) Devide M(i) into 16 words W */ -+ for (i = 0; i < 16; i++) -+ W[i] = ((const u32 *)in)[i]; -+ -+ /* (b) W[i+16] = S^1(W[i+13] ^ W[i+8] ^ W[i+2] ^ W[i]) */ -+ tmp_p=&W[16]; -+ -+ spin_lock_irqsave(&mcfcau_lock, iflags); -+ asm("move.l %0, %%a0"::"m"(tmp_p):"a0"); -+ asm("moveq.l #1, %%d3":::"d3"); -+ -+ for (i = 0; i < 64; i++){ -+ asm("cp0ld.l -64(%%a0),%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA0)); -+ asm("cp0ld.l -56(%%a0),%%d0,#1,%0" ::"n"(MCFCAU_XOR+MCFCAU_CA0)); -+ asm("cp0ld.l -32(%%a0),%%d0,#1,%0" ::"n"(MCFCAU_XOR+MCFCAU_CA0)); -+ asm("cp0ld.l -12(%%a0),%%d0,#1,%0" ::"n"(MCFCAU_XOR+MCFCAU_CA0)); -+ asm("cp0ld.l %%d3,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CA0):"d3"); -+ asm("cp0st.l %%d0,(%%a0)+,#1,%0" ::"n"(MCFCAU_STR+MCFCAU_CA0)); -+ } -+ -+ /* (c) */ -+ asm("move.l %0, %%a0"::"m"(digest):"a0"); -+ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA0):"a0"); /* a */ -+ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA1):"a0"); /* b */ -+ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA2):"a0"); /* c */ -+ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA3):"a0"); /* d */ -+ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA4):"a0"); /* e */ -+ -+ /* (d) */ -+ asm("moveq.l #5, %%d0":::"d0"); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MVRA+MCFCAU_CA0)); -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); /*S^5(A)*/ -+ -+ tmp_p=(u32*)K; -+ asm("move.l %0, %%a0"::"m"(tmp_p):"a0"); -+ asm("move.l %0, %%a1"::"m"(W):"a1"); -+ -+ for (i = 0; i < 20; i++) { -+ /* t = f1(b, c, d) + K1 + rol32(a, 5) + e + W[i]; */ -+ /* e = d; d = c; c = rol32(b, 30); b = a; a = t; */ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFC)); /*f(b,c,d)*/ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA4)); /*+e*/ -+ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA)); /*+K*/ -+ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a1"); /*+W*/ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_SHS)); -+ } -+ -+ asm("add.l #4,%%a0" :::"a0"); /* update K */ -+ -+ for (; i < 40; i ++) { -+ /* t = f2(b, c, d) + K2 + rol32(a, 5) + e + W[i]; */ -+ /* e = d; d = c; c = rol32(b, 30); b = a; a = t; */ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFH)); /*f(b,c,d)*/ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA4)); /*+e*/ -+ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA)); /*+K*/ -+ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a1"); /*+W*/ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_SHS)); -+ } -+ -+ asm("add.l #4,%%a0" :::"a0"); /* update K */ -+ -+ for (; i < 60; i ++) { -+ /* t = f3(b, c, d) + K3 + rol32(a, 5) + e + W[i]; */ -+ /* e = d; d = c; c = rol32(b, 30); b = a; a = t; */ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFM)); /*f(b,c,d)*/ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA4)); /*+e*/ -+ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA)); /*+K*/ -+ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a1"); /*+W*/ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_SHS)); -+ } -+ -+ asm("add.l #4,%%a0" :::"a0"); /* update K */ -+ -+ for (; i < 80; i ++) { -+ /* t = f2(b, c, d) + K4 + rol32(a, 5) + e + W[i]; */ -+ /* e = d; d = c; c = rol32(b, 30); b = a; a = t; */ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFH)); /*f(b,c,d)*/ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA4)); /*+e*/ -+ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA)); /*+K*/ -+ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a1"); /*+W*/ -+ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_SHS)); -+ } -+ -+ /* (e) */ -+ asm("move.l %0, %%a0"::"m"(digest):"a0"); -+ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CA0):"a0"); /* +a */ -+ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CA1):"a0"); /* +b */ -+ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CA2):"a0"); /* +c */ -+ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CA3):"a0"); /* +d */ -+ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CA4):"a0"); /* +e */ -+ -+ asm("cp0st.l %%d0,-(%%a0),#1,%0" ::"n"(MCFCAU_STR+MCFCAU_CA4):"a0"); -+ asm("cp0st.l %%d0,-(%%a0),#1,%0" ::"n"(MCFCAU_STR+MCFCAU_CA3):"a0"); -+ asm("cp0st.l %%d0,-(%%a0),#1,%0" ::"n"(MCFCAU_STR+MCFCAU_CA2):"a0"); -+ asm("cp0st.l %%d0,-(%%a0),#1,%0" ::"n"(MCFCAU_STR+MCFCAU_CA1):"a0"); -+ asm("cp0st.l %%d0,-(%%a0),#1,%0" ::"n"(MCFCAU_STR+MCFCAU_CA0):"a0"); -+ spin_unlock_irqrestore(&mcfcau_lock, iflags); -+} -+ -+static void mcfcau_sha1_init(struct crypto_tfm *tfm) -+{ -+ struct mcfcau_sha1_ctx *sctx = crypto_tfm_ctx(tfm); -+ static const struct mcfcau_sha1_ctx initstate = { -+ 0, -+ { 0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0 }, -+ { 0, } -+ }; -+ -+ *sctx = initstate; -+} -+ -+static void mcfcau_sha1_update(struct crypto_tfm *tfm, const u8 *data, -+ unsigned int len) -+{ -+ struct mcfcau_sha1_ctx *sctx = crypto_tfm_ctx(tfm); -+ unsigned int partial, done; -+ const u8 *src; -+ -+ partial = sctx->count & 0x3f; -+ sctx->count += len; -+ done = 0; -+ src = data; -+ -+ if ((partial + len) > 63) { -+ u32 temp[MCFCAU_SHA1_WORKSPACE_WORDS]; -+ -+ if (partial) { -+ done = -partial; -+ memcpy(sctx->buffer + partial, data, done + 64); -+ src = sctx->buffer; -+ } -+ -+ do { -+ mcfcau_sha1_transform(sctx->state, src, temp); -+ done += 64; -+ src = data + done; -+ } while (done + 63 < len); -+ -+ memset(temp, 0, sizeof(temp)); -+ partial = 0; -+ } -+ memcpy(sctx->buffer + partial, src, len - done); -+} -+ -+ -+/* Add padding and return the message digest. */ -+static void mcfcau_sha1_final(struct crypto_tfm *tfm, u8 *out) -+{ -+ struct mcfcau_sha1_ctx *sctx = crypto_tfm_ctx(tfm); -+ u32 *dst = (u32 *)out; -+ u32 i, index, padlen; -+ u64 bits; -+ static const u8 padding[64] = { 0x80, }; -+ -+ bits = sctx->count << 3; -+ -+ /* Pad out to 56 mod 64 */ -+ index = sctx->count & 0x3f; -+ padlen = (index < 56) ? (56 - index) : ((64+56) - index); -+ mcfcau_sha1_update(tfm, padding, padlen); -+ -+ /* Append length */ -+ mcfcau_sha1_update(tfm, (const u8 *)&bits, sizeof(bits)); -+ -+ /* Store state in digest */ -+ for (i = 0; i < 5; i++) -+ dst[i] = sctx->state[i]; -+ -+ -+ /* Wipe context */ -+ memset(sctx, 0, sizeof *sctx); -+} -+ -+static struct crypto_alg mcfcau_sha1_alg = { -+ .cra_name = "sha1", -+ .cra_driver_name= "sha1-mcfcau", -+ .cra_priority = MCFCAU_CRA_PRIORITY, -+ .cra_flags = CRYPTO_ALG_TYPE_DIGEST, -+ .cra_blocksize = MCFCAU_SHA1_HMAC_BLOCK_SIZE, -+ .cra_ctxsize = sizeof(struct mcfcau_sha1_ctx), -+ .cra_module = THIS_MODULE, -+ .cra_alignmask = 3, -+ .cra_list = LIST_HEAD_INIT(mcfcau_sha1_alg.cra_list), -+ .cra_u = { .digest = { -+ .dia_digestsize = MCFCAU_SHA1_DIGEST_SIZE, -+ .dia_init = mcfcau_sha1_init, -+ .dia_update = mcfcau_sha1_update, -+ .dia_final = mcfcau_sha1_final } } -+}; -+ -+static int __init init(void) -+{ -+ int ret = crypto_register_alg(&mcfcau_sha1_alg); -+ printk(KERN_INFO MCFCAU_SHA1_DRIVER_DESC " " -+ MCFCAU_SHA1_DRIVER_VERSION " %s.\n",ret?"failed":"registered"); -+ return ret; -+} -+ -+static void __exit fini(void) -+{ -+ crypto_unregister_alg(&mcfcau_sha1_alg); -+ printk(KERN_INFO MCFCAU_SHA1_DRIVER_DESC " " -+ MCFCAU_SHA1_DRIVER_VERSION " unregistered.\n"); -+} -+ -+module_init(init); -+module_exit(fini); -+ -+MODULE_LICENSE("GPL"); -+MODULE_DESCRIPTION(MCFCAU_SHA1_DRIVER_DESC); -+MODULE_AUTHOR("Andrey Butok"); ---- a/drivers/dma/Makefile -+++ b/drivers/dma/Makefile -@@ -4,3 +4,5 @@ obj-$(CONFIG_INTEL_IOATDMA) += ioatdma.o - ioatdma-objs := ioat.o ioat_dma.o ioat_dca.o - obj-$(CONFIG_INTEL_IOP_ADMA) += iop-adma.o - obj-$(CONFIG_FSL_DMA) += fsldma.o -+obj-$(CONFIG_MCD_DMA) += mcddma.o -+mcddma-objs := MCD_dmaApi.o MCD_tasks.o MCD_tasksInit.o ---- /dev/null -+++ b/drivers/dma/MCD_dmaApi.c -@@ -0,0 +1,965 @@ -+/* -+ * drivers/dma/MCD_dmaApi.c -+ * -+ * Copyright (C) 2004-2008 Freescale Semiconductor, Inc. -+ * Kurt Mahan <kmahan@freescale.com> -+ * -+ * This program is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU General Public License as -+ * published by the Free Software Foundation; either version 2 of -+ * the License, or (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, -+ * MA 02111-1307 USA -+ */ -+ -+#include "MCD_dma.h" -+#include "MCD_tasksInit.h" -+#include "MCD_progCheck.h" -+ -+/********************************************************************/ -+/* -+ * This is an API-internal pointer to the DMA's registers -+ */ -+dmaRegs *MCD_dmaBar; -+ -+/* -+ * These are the real and model task tables as generated by the -+ * build process -+ */ -+extern TaskTableEntry MCD_realTaskTableSrc[NCHANNELS]; -+extern TaskTableEntry MCD_modelTaskTableSrc[NUMOFVARIANTS]; -+ -+/* -+ * However, this (usually) gets relocated to on-chip SRAM, at which -+ * point we access them as these tables -+ */ -+volatile TaskTableEntry *MCD_taskTable; -+TaskTableEntry *MCD_modelTaskTable; -+ -+ -+/* -+ * MCD_chStatus[] is an array of status indicators for remembering -+ * whether a DMA has ever been attempted on each channel, pausing -+ * status, etc. -+ */ -+static int MCD_chStatus[NCHANNELS] = -+{ -+ MCD_NO_DMA, MCD_NO_DMA, MCD_NO_DMA, MCD_NO_DMA, -+ MCD_NO_DMA, MCD_NO_DMA, MCD_NO_DMA, MCD_NO_DMA, -+ MCD_NO_DMA, MCD_NO_DMA, MCD_NO_DMA, MCD_NO_DMA, -+ MCD_NO_DMA, MCD_NO_DMA, MCD_NO_DMA, MCD_NO_DMA -+}; -+ -+/* -+ * Prototypes for local functions -+ */ -+static void MCD_memcpy (int *dest, int *src, u32 size); -+static void MCD_resmActions (int channel); -+ -+/* -+ * Buffer descriptors used for storage of progress info for single Dmas -+ * Also used as storage for the DMA for CRCs for single DMAs -+ * Otherwise, the DMA does not parse these buffer descriptors -+ */ -+#ifdef MCD_INCLUDE_EU -+extern MCD_bufDesc MCD_singleBufDescs[NCHANNELS]; -+#else -+MCD_bufDesc MCD_singleBufDescs[NCHANNELS]; -+#endif -+MCD_bufDesc *MCD_relocBuffDesc; -+ -+ -+/* -+ * Defines for the debug control register's functions -+ */ -+#define DBG_CTL_COMP1_TASK (0x00002000) /* have comparator 1 look for a task # */ -+#define DBG_CTL_ENABLE (DBG_CTL_AUTO_ARM | \ -+ DBG_CTL_BREAK | \ -+ DBG_CTL_INT_BREAK | \ -+ DBG_CTL_COMP1_TASK) -+#define DBG_CTL_DISABLE (DBG_CTL_AUTO_ARM | \ -+ DBG_CTL_INT_BREAK | \ -+ DBG_CTL_COMP1_TASK) -+#define DBG_KILL_ALL_STAT (0xFFFFFFFF) -+ -+/* -+ * Offset to context save area where progress info is stored -+ */ -+#define CSAVE_OFFSET 10 -+ -+/* -+ * Defines for Byte Swapping -+ */ -+#define MCD_BYTE_SWAP_KILLER 0xFFF8888F -+#define MCD_NO_BYTE_SWAP_ATALL 0x00040000 -+ -+/* -+ * Execution Unit Identifiers -+ */ -+#define MAC 0 /* legacy - not used */ -+#define LUAC 1 /* legacy - not used */ -+#define CRC 2 /* legacy - not used */ -+#define LURC 3 /* Logic Unit with CRC */ -+ -+/* -+ * Task Identifiers -+ */ -+#define TASK_CHAINNOEU 0 -+#define TASK_SINGLENOEU 1 -+#ifdef MCD_INCLUDE_EU -+#define TASK_CHAINEU 2 -+#define TASK_SINGLEEU 3 -+#define TASK_FECRX 4 -+#define TASK_FECTX 5 -+#else -+#define TASK_CHAINEU 0 -+#define TASK_SINGLEEU 1 -+#define TASK_FECRX 2 -+#define TASK_FECTX 3 -+#endif -+ -+/* -+ * Structure to remember which variant is on which channel -+ */ -+typedef struct MCD_remVariants_struct MCD_remVariant; -+struct MCD_remVariants_struct -+{ -+ int remDestRsdIncr[NCHANNELS]; /* -1,0,1 */ -+ int remSrcRsdIncr[NCHANNELS]; /* -1,0,1 */ -+ s16 remDestIncr[NCHANNELS]; /* DestIncr */ -+ s16 remSrcIncr[NCHANNELS]; /* srcIncr */ -+ u32 remXferSize[NCHANNELS]; /* xferSize */ -+}; -+ -+/* -+ * Structure to remember the startDma parameters for each channel -+ */ -+MCD_remVariant MCD_remVariants; -+ -+/********************************************************************/ -+/* -+ * Function: MCD_initDma -+ * Purpose: Initializes the DMA API by setting up a pointer to the DMA -+ * registers, relocating and creating the appropriate task -+ * structures, and setting up some global settings -+ * Arguments: -+ * dmaBarAddr - pointer to the multichannel DMA registers -+ * taskTableDest - location to move DMA task code and structs to -+ * flags - operational parameters -+ * Return Value: -+ * MCD_TABLE_UNALIGNED if taskTableDest is not 512-byte aligned -+ * MCD_OK otherwise -+ */ -+extern u32 MCD_funcDescTab0[]; -+ -+int MCD_initDma (dmaRegs *dmaBarAddr, void *taskTableDest, u32 flags) -+{ -+ int i; -+ TaskTableEntry *entryPtr; -+ -+ /* Setup the local pointer to register set */ -+ MCD_dmaBar = dmaBarAddr; -+ -+ /* Do we need to move/create a task table */ -+ if ((flags & MCD_RELOC_TASKS) != 0) -+ { -+ int fixedSize; -+ u32 *fixedPtr; -+ int varTabsOffset, funcDescTabsOffset, contextSavesOffset; -+ int taskDescTabsOffset; -+ int taskTableSize, varTabsSize, funcDescTabsSize, contextSavesSize; -+ int taskDescTabSize; -+ -+ int i; -+ -+ /* Check if physical address is aligned on 512 byte boundary */ -+ if (((u32)taskTableDest & 0x000001ff) != 0) -+ return(MCD_TABLE_UNALIGNED); -+ -+ MCD_taskTable = taskTableDest; /* set up local pointer to task Table */ -+ -+ /* -+ * Create a task table: -+ * - compute aligned base offsets for variable tables and -+ * function descriptor tables, then -+ * - loop through the task table and setup the pointers -+ * - copy over model task table with the the actual task descriptor -+ * tables -+ */ -+ taskTableSize = NCHANNELS * sizeof(TaskTableEntry); -+ /* Align variable tables to size */ -+ varTabsOffset = taskTableSize + (u32)taskTableDest; -+ if ((varTabsOffset & (VAR_TAB_SIZE - 1)) != 0) -+ varTabsOffset = (varTabsOffset + VAR_TAB_SIZE) & (~VAR_TAB_SIZE); -+ /* Align function descriptor tables */ -+ varTabsSize = NCHANNELS * VAR_TAB_SIZE; -+ funcDescTabsOffset = varTabsOffset + varTabsSize; -+ -+ if ((funcDescTabsOffset & (FUNCDESC_TAB_SIZE - 1)) != 0) -+ funcDescTabsOffset = (funcDescTabsOffset + FUNCDESC_TAB_SIZE) & -+ (~FUNCDESC_TAB_SIZE); -+ -+ funcDescTabsSize = FUNCDESC_TAB_NUM * FUNCDESC_TAB_SIZE; -+ contextSavesOffset = funcDescTabsOffset + funcDescTabsSize; -+ contextSavesSize = (NCHANNELS * CONTEXT_SAVE_SIZE); -+ fixedSize = taskTableSize + varTabsSize + funcDescTabsSize + -+ contextSavesSize; -+ -+ /* Zero the thing out */ -+ fixedPtr = (u32 *)taskTableDest; -+ for (i = 0;i<(fixedSize/4);i++) -+ fixedPtr[i] = 0; -+ -+ entryPtr = (TaskTableEntry*)MCD_taskTable; -+ /* Set up fixed pointers */ -+ for (i = 0; i < NCHANNELS; i++) -+ { -+ entryPtr[i].varTab = (u32)varTabsOffset; /* update ptr to local value */ -+ entryPtr[i].FDTandFlags = (u32)funcDescTabsOffset | MCD_TT_FLAGS_DEF; -+ entryPtr[i].contextSaveSpace = (u32)contextSavesOffset; -+ varTabsOffset += VAR_TAB_SIZE; -+#ifdef MCD_INCLUDE_EU /* if not there is only one, just point to the same one */ -+ funcDescTabsOffset += FUNCDESC_TAB_SIZE; -+#endif -+ contextSavesOffset += CONTEXT_SAVE_SIZE; -+ } -+ /* Copy over the function descriptor table */ -+ for ( i = 0; i < FUNCDESC_TAB_NUM; i++) -+ { -+ MCD_memcpy((void*)(entryPtr[i].FDTandFlags & ~MCD_TT_FLAGS_MASK), -+ (void*)MCD_funcDescTab0, FUNCDESC_TAB_SIZE); -+ } -+ -+ /* Copy model task table to where the context save stuff leaves off */ -+ MCD_modelTaskTable = (TaskTableEntry*)contextSavesOffset; -+ -+ MCD_memcpy ((void*)MCD_modelTaskTable, (void*)MCD_modelTaskTableSrc, -+ NUMOFVARIANTS * sizeof(TaskTableEntry)); -+ -+ /* Point to local version of model task table */ -+ entryPtr = MCD_modelTaskTable; -+ taskDescTabsOffset = (u32)MCD_modelTaskTable + -+ (NUMOFVARIANTS * sizeof(TaskTableEntry)); -+ -+ /* Copy actual task code and update TDT ptrs in local model task table */ -+ for (i = 0; i < NUMOFVARIANTS; i++) -+ { -+ taskDescTabSize = entryPtr[i].TDTend - entryPtr[i].TDTstart + 4; -+ MCD_memcpy ((void*)taskDescTabsOffset, (void*)entryPtr[i].TDTstart, taskDescTabSize); -+ entryPtr[i].TDTstart = (u32)taskDescTabsOffset; -+ taskDescTabsOffset += taskDescTabSize; -+ entryPtr[i].TDTend = (u32)taskDescTabsOffset - 4; -+ } -+#ifdef MCD_INCLUDE_EU -+ /* -+ * Tack single DMA BDs onto end of code so API controls where -+ * they are since DMA might write to them -+ */ -+ MCD_relocBuffDesc = (MCD_bufDesc*)(entryPtr[NUMOFVARIANTS - 1].TDTend + 4); -+#else -+ /* -+ * DMA does not touch them so they can be wherever and we don't need to -+ * waste SRAM on them -+ */ -+ MCD_relocBuffDesc = MCD_singleBufDescs; -+#endif -+ } -+ else -+ { -+ /* -+ * Point the would-be relocated task tables and the buffer descriptors -+ * to the ones the linker generated -+ */ -+ if (((u32)MCD_realTaskTableSrc & 0x000001ff) != 0) -+ return(MCD_TABLE_UNALIGNED); -+ -+ entryPtr = MCD_realTaskTableSrc; -+ for (i = 0; i < NCHANNELS; i++) -+ { -+ if (((entryPtr[i].varTab & (VAR_TAB_SIZE - 1)) != 0) || -+ ((entryPtr[i].FDTandFlags & (FUNCDESC_TAB_SIZE - 1)) != 0)) -+ return(MCD_TABLE_UNALIGNED); -+ } -+ -+ MCD_taskTable = MCD_realTaskTableSrc; -+ MCD_modelTaskTable = MCD_modelTaskTableSrc; -+ MCD_relocBuffDesc = MCD_singleBufDescs; -+ } -+ -+ /* Make all channels inactive, and remember them as such: */ -+ MCD_dmaBar->taskbar = (u32) MCD_taskTable; -+ for (i = 0; i < NCHANNELS; i++) -+ { -+ MCD_dmaBar->taskControl[i] = 0x0; -+ MCD_chStatus[i] = MCD_NO_DMA; -+ } -+ -+ /* Set up pausing mechanism to inactive state: */ -+ MCD_dmaBar->debugComp1 = 0; -+ MCD_dmaBar->debugComp2 = 0; -+ MCD_dmaBar->debugControl = DBG_CTL_DISABLE; -+ MCD_dmaBar->debugStatus = DBG_KILL_ALL_STAT; -+ -+ /* Enable or disable commbus prefetch */ -+ if ((flags & MCD_COMM_PREFETCH_EN) != 0) -+ MCD_dmaBar->ptdControl &= ~PTD_CTL_COMM_PREFETCH; -+ else -+ MCD_dmaBar->ptdControl |= PTD_CTL_COMM_PREFETCH; -+ -+ return(MCD_OK); -+} -+/*********************** End of MCD_initDma() ***********************/ -+ -+/********************************************************************/ -+/* Function: MCD_dmaStatus -+ * Purpose: Returns the status of the DMA on the requested channel -+ * Arguments: channel - channel number -+ * Returns: Predefined status indicators -+ */ -+int MCD_dmaStatus (int channel) -+{ -+ u16 tcrValue; -+ -+ if((channel < 0) || (channel >= NCHANNELS)) -+ return(MCD_CHANNEL_INVALID); -+ -+ tcrValue = MCD_dmaBar->taskControl[channel]; -+ if ((tcrValue & TASK_CTL_EN) == 0) -+ { /* Nothing running if last reported with task enabled */ -+ if ( MCD_chStatus[channel] == MCD_RUNNING -+ || MCD_chStatus[channel] == MCD_IDLE) -+ MCD_chStatus[channel] = MCD_DONE; -+ } -+ else /* something is running */ -+ { -+ /* There are three possibilities: paused, running or idle. */ -+ if ( MCD_chStatus[channel] == MCD_RUNNING -+ || MCD_chStatus[channel] == MCD_IDLE) -+ { -+ MCD_dmaBar->ptdDebug = PTD_DBG_TSK_VLD_INIT; -+ /* Determine which initiator is asserted. */ -+ if ((MCD_dmaBar->ptdDebug >> channel ) & 0x1 ) -+ MCD_chStatus[channel] = MCD_RUNNING; -+ else -+ MCD_chStatus[channel] = MCD_IDLE; -+ /* Do not change the status if it is already paused */ -+ } -+ } -+ return MCD_chStatus[channel]; -+} -+/******************** End of MCD_dmaStatus() ************************/ -+ -+/********************************************************************/ -+/* Function: MCD_startDma -+ * Ppurpose: Starts a particular kind of DMA -+ * Arguments: see below -+ * Returns: MCD_CHANNEL_INVALID if channel is invalid, else MCD_OK -+ */ -+ -+int MCD_startDma ( -+ int channel, /* the channel on which to run the DMA */ -+ s8 *srcAddr, /* the address to move data from, or physical buffer-descriptor address */ -+ s16 srcIncr, /* the amount to increment the source address per transfer */ -+ s8 *destAddr, /* the address to move data to */ -+ s16 destIncr, /* the amount to increment the destination address per transfer */ -+ u32 dmaSize, /* the number of bytes to transfer independent of the transfer size */ -+ u32 xferSize, /* the number bytes in of each data movement (1, 2, or 4) */ -+ u32 initiator, /* what device initiates the DMA */ -+ int priority, /* priority of the DMA */ -+ u32 flags, /* flags describing the DMA */ -+ u32 funcDesc /* a description of byte swapping, bit swapping, and CRC actions */ -+#ifdef MCD_NEED_ADDR_TRANS -+ s8 *srcAddrVirt /* virtual buffer descriptor address TBD*/ -+#endif -+) -+{ -+ int srcRsdIncr, destRsdIncr; -+ int *cSave; -+ short xferSizeIncr; -+ int tcrCount = 0; -+#ifdef MCD_INCLUDE_EU -+ u32 *realFuncArray; -+#endif -+ -+ if((channel < 0) || (channel >= NCHANNELS)) -+ return(MCD_CHANNEL_INVALID); -+ -+#ifndef MCD_INCLUDE_EU -+ funcDesc = MCD_FUNC_NOEU1; -+#endif -+ -+#ifdef MCD_DEBUG -+printf("startDma:Setting up params\n"); -+#endif -+ -+ /* Enable task-wise priority */ -+ MCD_dmaBar->ptdControl |= (u16) 0x8000; -+ -+ /* Calculate additional parameters to the regular DMA calls. */ -+ srcRsdIncr = srcIncr < 0 ? -1 : (srcIncr > 0 ? 1 : 0); -+ destRsdIncr = destIncr < 0 ? -1 : (destIncr > 0 ? 1 : 0); -+ xferSizeIncr = (xferSize & 0xffff) | 0x20000000; -+ -+ /* Remember which variant is running for each channel */ -+ MCD_remVariants.remSrcRsdIncr[channel] = srcRsdIncr; -+ MCD_remVariants.remDestRsdIncr[channel] = destRsdIncr; -+ MCD_remVariants.remDestIncr[channel] = destIncr; -+ MCD_remVariants.remSrcIncr[channel] = srcIncr; -+ MCD_remVariants.remXferSize[channel] = xferSize; -+ -+ cSave = (int*)(MCD_taskTable[channel].contextSaveSpace) -+ + CSAVE_OFFSET -+ + CURRBD; -+ -+#ifdef MCD_INCLUDE_EU -+ realFuncArray = (u32 *) (MCD_taskTable[channel].FDTandFlags & 0xffffff00); -+ -+ /* -+ * Modify the LURC's normal and byte-residue-loop functions -+ * according to parameter. -+ */ -+ switch (xferSize) -+ { -+ case 4: -+ realFuncArray[(LURC*16)] = funcDesc; -+ break; -+ case 2: -+ realFuncArray[(LURC*16)] = funcDesc & 0xfffff00f; -+ break; -+ case 1: -+ default: -+ realFuncArray[(LURC*16)] = funcDesc & 0xffff000f; -+ break; -+ } -+ -+ realFuncArray[(LURC*16+1)] = 0 -+ | (funcDesc & MCD_BYTE_SWAP_KILLER) -+ | MCD_NO_BYTE_SWAP_ATALL; -+#endif -+ -+ /* Write the initiator field in the TCR and set the initiator-hold bit*/ -+ MCD_dmaBar->taskControl[channel] = 0 -+ | (initiator << 8) -+ | TASK_CTL_HIPRITSKEN -+ | TASK_CTL_HLDINITNUM; -+ -+ /* -+ * Current versions of the MPC8220 MCD have a hardware quirk that could -+ * cause the write to the TCR to collide with an MDE access to the -+ * initiator-register file, so we have to verify that the write occurred -+ * correctly by reading back the value. On MCF547x/8x devices and any -+ * future revisions of the MPC8220, this loop will not be entered. -+ */ -+ while(((MCD_dmaBar->taskControl[channel] & 0x1fff) != -+ ((initiator << 8) | TASK_CTL_HIPRITSKEN | TASK_CTL_HLDINITNUM)) && -+ (tcrCount < 1000)) -+ { -+ tcrCount++; -+ MCD_dmaBar->taskControl[channel] = 0 -+ | (initiator << 8) -+ | TASK_CTL_HIPRITSKEN -+ | TASK_CTL_HLDINITNUM; -+ } -+ -+ MCD_dmaBar->priority[channel] = (u8)priority & PRIORITY_PRI_MASK; -+ -+ if (channel < 8 && channel >= 0) -+ { -+ MCD_dmaBar->taskSize0 &= ~(0xf << (7-channel)*4); -+ MCD_dmaBar->taskSize0 |= (xferSize & 3) << (((7 - channel)*4) + 2); -+ MCD_dmaBar->taskSize0 |= (xferSize & 3) << ((7 - channel)*4); -+ } -+ else -+ { -+ MCD_dmaBar->taskSize1 &= ~(0xf << (15-channel)*4); -+ MCD_dmaBar->taskSize1 |= (xferSize & 3) << (((15 - channel)*4) + 2); -+ MCD_dmaBar->taskSize1 |= (xferSize & 3) << ((15 - channel)*4); -+ } -+ -+ /* Setup task table flags/options */ -+ MCD_taskTable[channel].FDTandFlags &= ~MCD_TT_FLAGS_MASK; -+ MCD_taskTable[channel].FDTandFlags |= (MCD_TT_FLAGS_MASK & flags); -+ -+ if (flags & MCD_FECTX_DMA) -+ { -+ /* TDTStart and TDTEnd */ -+ MCD_taskTable[channel].TDTstart = MCD_modelTaskTable[TASK_FECTX].TDTstart; -+ MCD_taskTable[channel].TDTend = MCD_modelTaskTable[TASK_FECTX].TDTend; -+ MCD_startDmaENetXmit(srcAddr, srcAddr, destAddr, MCD_taskTable, channel); -+ } -+ else if (flags & MCD_FECRX_DMA) -+ { -+ /* TDTStart and TDTEnd */ -+ MCD_taskTable[channel].TDTstart = MCD_modelTaskTable[TASK_FECRX].TDTstart; -+ MCD_taskTable[channel].TDTend = MCD_modelTaskTable[TASK_FECRX].TDTend; -+ MCD_startDmaENetRcv(srcAddr, srcAddr, destAddr, MCD_taskTable, channel); -+ } -+ else if(flags & MCD_SINGLE_DMA) -+ { -+ /* -+ * This buffer descriptor is used for storing off initial parameters -+ * for later progress query calculation and for the DMA to write the -+ * resulting checksum. The DMA does not use this to determine how to -+ * operate, that info is passed with the init routine -+ */ -+ MCD_relocBuffDesc[channel].srcAddr = srcAddr; -+ MCD_relocBuffDesc[channel].destAddr = destAddr; -+ MCD_relocBuffDesc[channel].lastDestAddr = destAddr; -+ MCD_relocBuffDesc[channel].dmaSize = dmaSize; -+ MCD_relocBuffDesc[channel].flags = 0; /* not used */ -+ MCD_relocBuffDesc[channel].csumResult = 0; /* not used */ -+ MCD_relocBuffDesc[channel].next = 0; /* not used */ -+ -+ /* Initialize the progress-querying stuff to show no progress:*/ -+ ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[SRCPTR + CSAVE_OFFSET] -+ = (int)srcAddr; -+ ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[DESTPTR + CSAVE_OFFSET] -+ = (int)destAddr; -+ ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[DCOUNT + CSAVE_OFFSET] -+ = 0; -+ ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[CURRBD + CSAVE_OFFSET] -+ = (u32) &(MCD_relocBuffDesc[channel]); -+ -+ if( funcDesc == MCD_FUNC_NOEU1 || funcDesc == MCD_FUNC_NOEU2) -+ { -+ /* TDTStart and TDTEnd */ -+ MCD_taskTable[channel].TDTstart = MCD_modelTaskTable[TASK_SINGLENOEU].TDTstart; -+ MCD_taskTable[channel].TDTend = MCD_modelTaskTable[TASK_SINGLENOEU].TDTend; -+ MCD_startDmaSingleNoEu(srcAddr, srcIncr, destAddr, destIncr, dmaSize, -+ xferSizeIncr, flags, (int *)&(MCD_relocBuffDesc[channel]), -+ cSave, MCD_taskTable, channel); -+ } -+ else -+ { -+ /* TDTStart and TDTEnd */ -+ MCD_taskTable[channel].TDTstart = MCD_modelTaskTable[TASK_SINGLEEU].TDTstart; -+ MCD_taskTable[channel].TDTend = MCD_modelTaskTable[TASK_SINGLEEU].TDTend; -+ MCD_startDmaSingleEu(srcAddr, srcIncr, destAddr, destIncr, dmaSize, -+ xferSizeIncr, flags, (int *)&(MCD_relocBuffDesc[channel]), -+ cSave, MCD_taskTable, channel); -+ } -+ } -+ else /* Chained DMA */ -+ { -+ /* Initialize the progress-querying stuff to show no progress:*/ -+#if 1 /* (!defined(MCD_NEED_ADDR_TRANS)) */ -+ ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[SRCPTR + CSAVE_OFFSET] -+ = (int)((MCD_bufDesc*) srcAddr)->srcAddr; -+ ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[DESTPTR + CSAVE_OFFSET] -+ = (int)((MCD_bufDesc*) srcAddr)->destAddr; -+#else /* if using address translation, need the virtual addr of the first buffdesc */ -+ ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[SRCPTR + CSAVE_OFFSET] -+ = (int)((MCD_bufDesc*) srcAddrVirt)->srcAddr; -+ ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[DESTPTR + CSAVE_OFFSET] -+ = (int)((MCD_bufDesc*) srcAddrVirt)->destAddr; -+#endif -+ ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[DCOUNT + CSAVE_OFFSET] -+ = 0; -+ ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[CURRBD + CSAVE_OFFSET] -+ = (u32) srcAddr; -+ -+ if( funcDesc == MCD_FUNC_NOEU1 || funcDesc == MCD_FUNC_NOEU2) -+ { -+ /* TDTStart and TDTEnd */ -+ MCD_taskTable[channel].TDTstart = MCD_modelTaskTable[TASK_CHAINNOEU].TDTstart; -+ MCD_taskTable[channel].TDTend = MCD_modelTaskTable[TASK_CHAINNOEU].TDTend; -+ MCD_startDmaChainNoEu((int *)srcAddr, srcIncr, destIncr, xferSize, -+ xferSizeIncr, cSave, MCD_taskTable, channel); -+ } -+ else -+ { -+ /* TDTStart and TDTEnd */ -+ MCD_taskTable[channel].TDTstart = MCD_modelTaskTable[TASK_CHAINEU].TDTstart; -+ MCD_taskTable[channel].TDTend = MCD_modelTaskTable[TASK_CHAINEU].TDTend; -+ MCD_startDmaChainEu((int *)srcAddr, srcIncr, destIncr, xferSize, -+ xferSizeIncr, cSave, MCD_taskTable, channel); -+ } -+ } -+ -+ MCD_chStatus[channel] = MCD_IDLE; -+ return(MCD_OK); -+} -+ -+/************************ End of MCD_startDma() *********************/ -+ -+/********************************************************************/ -+/* Function: MCD_XferProgrQuery -+ * Purpose: Returns progress of DMA on requested channel -+ * Arguments: channel - channel to retrieve progress for -+ * progRep - pointer to user supplied MCD_XferProg struct -+ * Returns: MCD_CHANNEL_INVALID if channel is invalid, else MCD_OK -+ * -+ * Notes: -+ * MCD_XferProgrQuery() upon completing or after aborting a DMA, or -+ * while the DMA is in progress, this function returns the first -+ * DMA-destination address not (or not yet) used in the DMA. When -+ * encountering a non-ready buffer descriptor, the information for -+ * the last completed descriptor is returned. -+ * -+ * MCD_XferProgQuery() has to avoid the possibility of getting -+ * partially-updated information in the event that we should happen -+ * to query DMA progress just as the DMA is updating it. It does that -+ * by taking advantage of the fact context is not saved frequently for -+ * the most part. We therefore read it at least twice until we get the -+ * same information twice in a row. -+ * -+ * Because a small, but not insignificant, amount of time is required -+ * to write out the progress-query information, especially upon -+ * completion of the DMA, it would be wise to guarantee some time lag -+ * between successive readings of the progress-query information. -+ */ -+ -+/* -+ * How many iterations of the loop below to execute to stabilize values -+ */ -+#define STABTIME 0 -+ -+int MCD_XferProgrQuery (int channel, MCD_XferProg *progRep) -+{ -+ MCD_XferProg prevRep; -+ int again; /* true if we are to try again to get consistent results */ -+ int i; /* used as a time-waste counter */ -+ int destDiffBytes; /* Total number of bytes that we think actually got xfered. */ -+ int numIterations; /* number of iterations */ -+ int bytesNotXfered; /* bytes that did not get xfered. */ -+ s8 *LWAlignedInitDestAddr, *LWAlignedCurrDestAddr; -+ int subModVal, addModVal; /* Mode values to added and subtracted from the -+ final destAddr */ -+ -+ if((channel < 0) || (channel >= NCHANNELS)) -+ return(MCD_CHANNEL_INVALID); -+ -+ /* Read a trial value for the progress-reporting values*/ -+ prevRep.lastSrcAddr = -+ (s8 *) ((volatile int*) MCD_taskTable[channel].contextSaveSpace)[SRCPTR + CSAVE_OFFSET]; -+ prevRep.lastDestAddr = -+ (s8 *) ((volatile int*) MCD_taskTable[channel].contextSaveSpace)[DESTPTR + CSAVE_OFFSET]; -+ prevRep.dmaSize = ((volatile int*) MCD_taskTable[channel].contextSaveSpace)[DCOUNT + CSAVE_OFFSET]; -+ prevRep.currBufDesc = -+ (MCD_bufDesc*) ((volatile int*) MCD_taskTable[channel].contextSaveSpace)[CURRBD + CSAVE_OFFSET]; -+ -+ /* Repeatedly reread those values until they match previous values: */ -+ do { -+ /* Take a little bit of time to ensure stability: */ -+ for (i = 0; i < STABTIME; i++) -+ i += i >> 2; /* make sure this loop does something so that it -+ doesn't get optimized out */ -+ /* Check them again: */ -+ progRep->lastSrcAddr = -+ (s8 *) ((volatile int*) MCD_taskTable[channel].contextSaveSpace)[SRCPTR + CSAVE_OFFSET]; -+ progRep->lastDestAddr = -+ (s8 *) ((volatile int*) MCD_taskTable[channel].contextSaveSpace)[DESTPTR + CSAVE_OFFSET]; -+ progRep->dmaSize = ((volatile int*) MCD_taskTable[channel].contextSaveSpace)[DCOUNT + CSAVE_OFFSET]; -+ progRep->currBufDesc = -+ (MCD_bufDesc*) ((volatile int*) MCD_taskTable[channel].contextSaveSpace)[CURRBD + CSAVE_OFFSET]; -+ -+ /* See if they match: */ -+ if ( prevRep.lastSrcAddr != progRep->lastSrcAddr -+ || prevRep.lastDestAddr != progRep->lastDestAddr -+ || prevRep.dmaSize != progRep->dmaSize -+ || prevRep.currBufDesc != progRep->currBufDesc) -+ { -+ /* If they don't match, remember previous values and try again:*/ -+ prevRep.lastSrcAddr = progRep->lastSrcAddr; -+ prevRep.lastDestAddr = progRep->lastDestAddr; -+ prevRep.dmaSize = progRep->dmaSize; -+ prevRep.currBufDesc = progRep->currBufDesc; -+ again = MCD_TRUE; -+ } -+ else -+ again = MCD_FALSE; -+ } while (again == MCD_TRUE); -+ -+ -+ /* Update dmaSize and lastDestAddr */ -+ switch(MCD_remVariants.remDestRsdIncr[channel]) -+ { -+ case MINUS1: -+ subModVal = ((int)progRep->lastDestAddr) -+ & ((MCD_remVariants.remXferSize[channel]) - 1); -+ addModVal = ((int)progRep->currBufDesc->destAddr) -+ & ((MCD_remVariants.remXferSize[channel]) - 1); -+ LWAlignedInitDestAddr = (progRep->currBufDesc->destAddr) - addModVal; -+ LWAlignedCurrDestAddr = (progRep->lastDestAddr) - subModVal; -+ destDiffBytes = LWAlignedInitDestAddr - LWAlignedCurrDestAddr; -+ bytesNotXfered = (destDiffBytes/MCD_remVariants.remDestIncr[channel]) * -+ ( MCD_remVariants.remDestIncr[channel] -+ + MCD_remVariants.remXferSize[channel]); -+ progRep->dmaSize = destDiffBytes - bytesNotXfered + addModVal - subModVal; -+ break; -+ case ZERO: -+ progRep->lastDestAddr = progRep->currBufDesc->destAddr; -+ break; -+ case PLUS1: -+ /* This value has to be subtracted from the final calculated dmaSize. */ -+ subModVal = ((int)progRep->currBufDesc->destAddr) -+ & ((MCD_remVariants.remXferSize[channel]) - 1); -+ /* These bytes are already in lastDestAddr. */ -+ addModVal = ((int)progRep->lastDestAddr) -+ & ((MCD_remVariants.remXferSize[channel]) - 1); -+ LWAlignedInitDestAddr = (progRep->currBufDesc->destAddr) - subModVal; -+ LWAlignedCurrDestAddr = (progRep->lastDestAddr) - addModVal; -+ destDiffBytes = (progRep->lastDestAddr - LWAlignedInitDestAddr); -+ numIterations = ( LWAlignedCurrDestAddr - LWAlignedInitDestAddr)/MCD_remVariants.remDestIncr[channel]; -+ bytesNotXfered = numIterations * -+ (MCD_remVariants.remDestIncr[channel] -+ - MCD_remVariants.remXferSize[channel]); -+ progRep->dmaSize = destDiffBytes - bytesNotXfered - subModVal; -+ break; -+ default: -+ break; -+ } -+ -+ /* This covers M1,P1,Z for source */ -+ switch(MCD_remVariants.remSrcRsdIncr[channel]) -+ { -+ case MINUS1: -+ progRep->lastSrcAddr = -+ progRep->currBufDesc->srcAddr + -+ ( MCD_remVariants.remSrcIncr[channel] * -+ (progRep->dmaSize/MCD_remVariants.remXferSize[channel])); -+ break; -+ case ZERO: -+ progRep->lastSrcAddr = progRep->currBufDesc->srcAddr; -+ break; -+ case PLUS1: -+ progRep->lastSrcAddr = -+ progRep->currBufDesc->srcAddr + -+ ( MCD_remVariants.remSrcIncr[channel] * -+ (progRep->dmaSize/MCD_remVariants.remXferSize[channel])); -+ break; -+ default: -+ break; -+ } -+ -+ return(MCD_OK); -+} -+/******************* End of MCD_XferProgrQuery() ********************/ -+ -+/********************************************************************/ -+/* MCD_resmActions() does the majority of the actions of a DMA resume. -+ * It is called from MCD_killDma() and MCD_resumeDma(). It has to be -+ * a separate function because the kill function has to negate the task -+ * enable before resuming it, but the resume function has to do nothing -+ * if there is no DMA on that channel (i.e., if the enable bit is 0). -+ */ -+static void MCD_resmActions (int channel) -+{ -+ MCD_dmaBar->debugControl = DBG_CTL_DISABLE; -+ MCD_dmaBar->debugStatus = MCD_dmaBar->debugStatus; -+ -+ /* Determine which initiators are asserted */ -+ MCD_dmaBar->ptdDebug = PTD_DBG_TSK_VLD_INIT; -+ -+ if((MCD_dmaBar->ptdDebug >> channel ) & 0x1) -+ MCD_chStatus[channel] = MCD_RUNNING; -+ else -+ MCD_chStatus[channel] = MCD_IDLE; -+} -+/********************* End of MCD_resmActions() *********************/ -+ -+/********************************************************************/ -+/* Function: MCD_killDma -+ * Purpose: Halt the DMA on the requested channel, without any -+ * intention of resuming the DMA. -+ * Arguments: channel - requested channel -+ * Returns: MCD_CHANNEL_INVALID if channel is invalid, else MCD_OK -+ * -+ * Notes: -+ * A DMA may be killed from any state, including paused state, and it -+ * always goes to the MCD_HALTED state even if it is killed while in -+ * the MCD_NO_DMA or MCD_IDLE states. -+ */ -+int MCD_killDma (int channel) -+{ -+ if((channel < 0) || (channel >= NCHANNELS)) -+ return(MCD_CHANNEL_INVALID); -+ -+ MCD_dmaBar->taskControl[channel] = 0x0; -+ -+ /* Clean up after a paused task */ -+ if (MCD_chStatus[channel] == MCD_PAUSED) -+ { -+ MCD_dmaBar->debugControl = DBG_CTL_DISABLE; -+ MCD_dmaBar->debugStatus = MCD_dmaBar->debugStatus; -+ } -+ -+ MCD_chStatus[channel] = MCD_HALTED; -+ -+ return(MCD_OK); -+} -+/************************ End of MCD_killDma() **********************/ -+ -+/********************************************************************/ -+/* Function: MCD_continDma -+ * Purpose: Continue a DMA which as stopped due to encountering an -+ * unready buffer descriptor. -+ * Arguments: channel - channel to continue the DMA on -+ * Returns: MCD_CHANNEL_INVALID if channel is invalid, else MCD_OK -+ * -+ * Notes: -+ * This routine does not check to see if there is a task which can -+ * be continued. Also this routine should not be used with single DMAs. -+ */ -+int MCD_continDma (int channel) -+{ -+ if((channel < 0) || (channel >= NCHANNELS)) -+ return(MCD_CHANNEL_INVALID); -+ -+ MCD_dmaBar->taskControl[channel] |= TASK_CTL_EN; -+ MCD_chStatus[channel] = MCD_RUNNING; -+ -+ return(MCD_OK); -+} -+/********************** End of MCD_continDma() **********************/ -+ -+/********************************************************************* -+ * MCD_pauseDma() and MCD_resumeDma() below use the DMA's debug unit -+ * to freeze a task and resume it. We freeze a task by breakpointing -+ * on the stated task. That is, not any specific place in the task, -+ * but any time that task executes. In particular, when that task -+ * executes, we want to freeze that task and only that task. -+ * -+ * The bits of the debug control register influence interrupts vs. -+ * breakpoints as follows: -+ * - Bits 14 and 0 enable or disable debug functions. If enabled, you -+ * will get the interrupt but you may or may not get a breakpoint. -+ * - Bits 2 and 1 decide whether you also get a breakpoint in addition -+ * to an interrupt. -+ * -+ * The debug unit can do these actions in response to either internally -+ * detected breakpoint conditions from the comparators, or in response -+ * to the external breakpoint pin, or both. -+ * - Bits 14 and 1 perform the above-described functions for -+ * internally-generated conditions, i.e., the debug comparators. -+ * - Bits 0 and 2 perform the above-described functions for external -+ * conditions, i.e., the breakpoint external pin. -+ * -+ * Note that, although you "always" get the interrupt when you turn -+ * the debug functions, the interrupt can nevertheless, if desired, be -+ * masked by the corresponding bit in the PTD's IMR. Note also that -+ * this means that bits 14 and 0 must enable debug functions before -+ * bits 1 and 2, respectively, have any effect. -+ * -+ * NOTE: It's extremely important to not pause more than one DMA channel -+ * at a time. -+ ********************************************************************/ -+ -+/********************************************************************/ -+/* Function: MCD_pauseDma -+ * Purpose: Pauses the DMA on a given channel (if any DMA is running -+ * on that channel). -+ * Arguments: channel -+ * Returns: MCD_CHANNEL_INVALID if channel is invalid, else MCD_OK -+ */ -+int MCD_pauseDma (int channel) -+{ -+ if((channel < 0) || (channel >= NCHANNELS)) -+ return(MCD_CHANNEL_INVALID); -+ -+ if (MCD_dmaBar->taskControl[channel] & TASK_CTL_EN) -+ { -+ MCD_dmaBar->debugComp1 = channel; -+ MCD_dmaBar->debugControl = DBG_CTL_ENABLE | (1 << (channel + 16)); -+ MCD_chStatus[channel] = MCD_PAUSED; -+ } -+ return(MCD_OK); -+} -+/************************* End of MCD_pauseDma() ********************/ -+ -+/********************************************************************/ -+/* Function: MCD_resumeDma -+ * Purpose: Resumes the DMA on a given channel (if any DMA is -+ * running on that channel). -+ * Arguments: channel - channel on which to resume DMA -+ * Returns: MCD_CHANNEL_INVALID if channel is invalid, else MCD_OK -+ */ -+int MCD_resumeDma (int channel) -+{ -+ if((channel < 0) || (channel >= NCHANNELS)) -+ return(MCD_CHANNEL_INVALID); -+ -+ if (MCD_dmaBar->taskControl[channel] & TASK_CTL_EN) -+ MCD_resmActions (channel); -+ -+ return(MCD_OK); -+} -+/************************ End of MCD_resumeDma() ********************/ -+ -+/********************************************************************/ -+/* Function: MCD_csumQuery -+ * Purpose: Provide the checksum after performing a non-chained DMA -+ * Arguments: channel - channel to report on -+ * csum - pointer to where to write the checksum/CRC -+ * Returns: MCD_ERROR if the channel is invalid, else MCD_OK -+ * -+ * Notes: -+ * -+ */ -+int MCD_csumQuery (int channel, u32 *csum) -+{ -+#ifdef MCD_INCLUDE_EU -+ if((channel < 0) || (channel >= NCHANNELS)) -+ return(MCD_CHANNEL_INVALID); -+ -+ *csum = MCD_relocBuffDesc[channel].csumResult; -+ return(MCD_OK); -+#else -+ return(MCD_ERROR); -+#endif -+} -+/*********************** End of MCD_resumeDma() *********************/ -+ -+/********************************************************************/ -+/* Function: MCD_getCodeSize -+ * Purpose: Provide the size requirements of the microcoded tasks -+ * Returns: Size in bytes -+ */ -+int MCD_getCodeSize(void) -+{ -+#ifdef MCD_INCLUDE_EU -+ return(0x2b64); -+#else -+ return(0x1744); -+#endif -+} -+/********************** End of MCD_getCodeSize() ********************/ -+ -+/********************************************************************/ -+/* Function: MCD_getVersion -+ * Purpose: Provide the version string and number -+ * Arguments: longVersion - user supplied pointer to a pointer to a char -+ * which points to the version string -+ * Returns: Version number and version string (by reference) -+ */ -+char MCD_versionString[] = "Multi-channel DMA API v1.0"; -+#define MCD_REV_MAJOR 0x01 -+#define MCD_REV_MINOR 0x00 -+ -+int MCD_getVersion(char **longVersion) -+{ -+ *longVersion = MCD_versionString; -+ return((MCD_REV_MAJOR << 8) | MCD_REV_MINOR); -+} -+/********************** End of MCD_getVersion() *********************/ -+ -+/********************************************************************/ -+/* Private version of memcpy() -+ * Note that everything this is used for is longword-aligned. -+ */ -+static void MCD_memcpy (int *dest, int *src, u32 size) -+{ -+ u32 i; -+ -+ for (i = 0; i < size; i += sizeof(int), dest++, src++) -+ *dest = *src; -+} -+/********************************************************************/ ---- /dev/null -+++ b/drivers/dma/MCD_dma.h -@@ -0,0 +1,378 @@ -+/* -+ * drivers/dma/MCD_dma.h -+ * -+ * Copyright (C) 2004-2008 Freescale Semiconductor, Inc. -+ * Kurt Mahan <kmahan@freescale.com> -+ * -+ * This program is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU General Public License as -+ * published by the Free Software Foundation; either version 2 of -+ * the License, or (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, -+ * MA 02111-1307 USA -+ */ -+#ifndef _MCD_API_H -+#define _MCD_API_H -+ -+/* -+ * Turn Execution Unit tasks ON (#define) or OFF (#undef) -+ */ -+#undef MCD_INCLUDE_EU -+ -+/* -+ * Number of DMA channels -+ */ -+#define NCHANNELS 16 -+ -+/* -+ * Total number of variants -+ */ -+#ifdef MCD_INCLUDE_EU -+#define NUMOFVARIANTS 6 -+#else -+#define NUMOFVARIANTS 4 -+#endif -+ -+/* -+ * Define sizes of the various tables -+ */ -+#define TASK_TABLE_SIZE (NCHANNELS*32) -+#define VAR_TAB_SIZE (128) -+#define CONTEXT_SAVE_SIZE (128) -+#define FUNCDESC_TAB_SIZE (256) -+ -+#ifdef MCD_INCLUDE_EU -+#define FUNCDESC_TAB_NUM 16 -+#else -+#define FUNCDESC_TAB_NUM 1 -+#endif -+ -+ -+#ifndef DEFINESONLY -+ -+/* -+ * Portability typedefs -+ */ -+typedef int s32; -+typedef unsigned int u32; -+typedef short s16; -+typedef unsigned short u16; -+typedef char s8; -+typedef unsigned char u8; -+ -+/* -+ * These structures represent the internal registers of the -+ * multi-channel DMA -+ */ -+struct dmaRegs_s { -+ u32 taskbar; /* task table base address register */ -+ u32 currPtr; -+ u32 endPtr; -+ u32 varTablePtr; -+ u16 dma_rsvd0; -+ u16 ptdControl; /* ptd control */ -+ u32 intPending; /* interrupt pending register */ -+ u32 intMask; /* interrupt mask register */ -+ u16 taskControl[16]; /* task control registers */ -+ u8 priority[32]; /* priority registers */ -+ u32 initiatorMux; /* initiator mux control */ -+ u32 taskSize0; /* task size control register 0. */ -+ u32 taskSize1; /* task size control register 1. */ -+ u32 dma_rsvd1; /* reserved */ -+ u32 dma_rsvd2; /* reserved */ -+ u32 debugComp1; /* debug comparator 1 */ -+ u32 debugComp2; /* debug comparator 2 */ -+ u32 debugControl; /* debug control */ -+ u32 debugStatus; /* debug status */ -+ u32 ptdDebug; /* priority task decode debug */ -+ u32 dma_rsvd3[31]; /* reserved */ -+}; -+typedef volatile struct dmaRegs_s dmaRegs; -+ -+#endif -+ -+/* -+ * PTD contrl reg bits -+ */ -+#define PTD_CTL_TSK_PRI 0x8000 -+#define PTD_CTL_COMM_PREFETCH 0x0001 -+ -+/* -+ * Task Control reg bits and field masks -+ */ -+#define TASK_CTL_EN 0x8000 -+#define TASK_CTL_VALID 0x4000 -+#define TASK_CTL_ALWAYS 0x2000 -+#define TASK_CTL_INIT_MASK 0x1f00 -+#define TASK_CTL_ASTRT 0x0080 -+#define TASK_CTL_HIPRITSKEN 0x0040 -+#define TASK_CTL_HLDINITNUM 0x0020 -+#define TASK_CTL_ASTSKNUM_MASK 0x000f -+ -+/* -+ * Priority reg bits and field masks -+ */ -+#define PRIORITY_HLD 0x80 -+#define PRIORITY_PRI_MASK 0x07 -+ -+/* -+ * Debug Control reg bits and field masks -+ */ -+#define DBG_CTL_BLOCK_TASKS_MASK 0xffff0000 -+#define DBG_CTL_AUTO_ARM 0x00008000 -+#define DBG_CTL_BREAK 0x00004000 -+#define DBG_CTL_COMP1_TYP_MASK 0x00003800 -+#define DBG_CTL_COMP2_TYP_MASK 0x00000070 -+#define DBG_CTL_EXT_BREAK 0x00000004 -+#define DBG_CTL_INT_BREAK 0x00000002 -+ -+/* -+ * PTD Debug reg selector addresses -+ * This reg must be written with a value to show the contents of -+ * one of the desired internal register. -+ */ -+#define PTD_DBG_REQ 0x00 /* shows the state of 31 initiators */ -+#define PTD_DBG_TSK_VLD_INIT 0x01 /* shows which 16 tasks are valid and -+ have initiators asserted */ -+ -+ -+/* -+ * General return values -+ */ -+#define MCD_OK 0 -+#define MCD_ERROR -1 -+#define MCD_TABLE_UNALIGNED -2 -+#define MCD_CHANNEL_INVALID -3 -+ -+/* -+ * MCD_initDma input flags -+ */ -+#define MCD_RELOC_TASKS 0x00000001 -+#define MCD_NO_RELOC_TASKS 0x00000000 -+#define MCD_COMM_PREFETCH_EN 0x00000002 /* Commbus Prefetching - MCF547x/548x ONLY */ -+ -+/* -+ * MCD_dmaStatus Status Values for each channel -+ */ -+#define MCD_NO_DMA 1 /* No DMA has been requested since reset */ -+#define MCD_IDLE 2 /* DMA active, but the initiator is currently inactive */ -+#define MCD_RUNNING 3 /* DMA active, and the initiator is currently active */ -+#define MCD_PAUSED 4 /* DMA active but it is currently paused */ -+#define MCD_HALTED 5 /* the most recent DMA has been killed with MCD_killTask() */ -+#define MCD_DONE 6 /* the most recent DMA has completed. */ -+ -+ -+/* -+ * MCD_startDma parameter defines -+ */ -+ -+/* -+ * Constants for the funcDesc parameter -+ */ -+/* Byte swapping: */ -+#define MCD_NO_BYTE_SWAP 0x00045670 /* to disable byte swapping. */ -+#define MCD_BYTE_REVERSE 0x00076540 /* to reverse the bytes of each u32 of the DMAed data. */ -+#define MCD_U16_REVERSE 0x00067450 /* to reverse the 16-bit halves of -+ each 32-bit data value being DMAed.*/ -+#define MCD_U16_BYTE_REVERSE 0x00054760 /* to reverse the byte halves of each -+ 16-bit half of each 32-bit data value DMAed */ -+#define MCD_NO_BIT_REV 0x00000000 /* do not reverse the bits of each byte DMAed. */ -+#define MCD_BIT_REV 0x00088880 /* reverse the bits of each byte DMAed */ -+/* CRCing: */ -+#define MCD_CRC16 0xc0100000 /* to perform CRC-16 on DMAed data. */ -+#define MCD_CRCCCITT 0xc0200000 /* to perform CRC-CCITT on DMAed data. */ -+#define MCD_CRC32 0xc0300000 /* to perform CRC-32 on DMAed data. */ -+#define MCD_CSUMINET 0xc0400000 /* to perform internet checksums on DMAed data.*/ -+#define MCD_NO_CSUM 0xa0000000 /* to perform no checksumming. */ -+ -+#define MCD_FUNC_NOEU1 (MCD_NO_BYTE_SWAP | MCD_NO_BIT_REV | MCD_NO_CSUM) -+#define MCD_FUNC_NOEU2 (MCD_NO_BYTE_SWAP | MCD_NO_CSUM) -+ -+/* -+ * Constants for the flags parameter -+ */ -+#define MCD_TT_FLAGS_RL 0x00000001 /* Read line */ -+#define MCD_TT_FLAGS_CW 0x00000002 /* Combine Writes */ -+#define MCD_TT_FLAGS_SP 0x00000004 /* Speculative prefetch(XLB) MCF547x/548x ONLY */ -+#define MCD_TT_FLAGS_PI 0x00000040 /* Precise Increment */ -+#define MCD_TT_FLAGS_MASK 0x000000ff -+#define MCD_TT_FLAGS_DEF (MCD_TT_FLAGS_RL | MCD_TT_FLAGS_CW) -+ -+#define MCD_SINGLE_DMA 0x00000100 /* Unchained DMA */ -+#define MCD_CHAIN_DMA /* TBD */ -+#define MCD_EU_DMA /* TBD */ -+#define MCD_FECTX_DMA 0x00001000 /* FEC TX ring DMA */ -+#define MCD_FECRX_DMA 0x00002000 /* FEC RX ring DMA */ -+ -+ -+/* these flags are valid for MCD_startDma and the chained buffer descriptors */ -+#define MCD_BUF_READY 0x80000000 /* indicates that this buffer is now under the DMA's control */ -+#define MCD_WRAP 0x20000000 /* to tell the FEC Dmas to wrap to the first BD */ -+#define MCD_INTERRUPT 0x10000000 /* to generate an interrupt after completion of the DMA. */ -+#define MCD_END_FRAME 0x08000000 /* tell the DMA to end the frame when transferring -+ last byte of data in buffer */ -+#define MCD_CRC_RESTART 0x40000000 /* to empty out the accumulated checksum -+ prior to performing the DMA. */ -+ -+/* Defines for the FEC buffer descriptor control/status word*/ -+#define MCD_FEC_BUF_READY 0x8000 -+#define MCD_FEC_WRAP 0x2000 -+#define MCD_FEC_INTERRUPT 0x1000 -+#define MCD_FEC_END_FRAME 0x0800 -+ -+ -+/* -+ * Defines for general intuitiveness -+ */ -+ -+#define MCD_TRUE 1 -+#define MCD_FALSE 0 -+ -+/* -+ * Three different cases for destination and source. -+ */ -+#define MINUS1 -1 -+#define ZERO 0 -+#define PLUS1 1 -+ -+#ifndef DEFINESONLY -+ -+/* Task Table Entry struct*/ -+typedef struct { -+ u32 TDTstart; /* task descriptor table start */ -+ u32 TDTend; /* task descriptor table end */ -+ u32 varTab; /* variable table start */ -+ u32 FDTandFlags; /* function descriptor table start and flags */ -+ volatile u32 descAddrAndStatus; -+ volatile u32 modifiedVarTab; -+ u32 contextSaveSpace; /* context save space start */ -+ u32 literalBases; -+} TaskTableEntry; -+ -+ -+/* Chained buffer descriptor */ -+typedef volatile struct MCD_bufDesc_struct MCD_bufDesc; -+struct MCD_bufDesc_struct { -+ u32 flags; /* flags describing the DMA */ -+ u32 csumResult; /* checksum from checksumming performed since last checksum reset */ -+ s8 *srcAddr; /* the address to move data from */ -+ s8 *destAddr; /* the address to move data to */ -+ s8 *lastDestAddr; /* the last address written to */ -+ u32 dmaSize; /* the number of bytes to transfer independent of the transfer size */ -+ MCD_bufDesc *next; /* next buffer descriptor in chain */ -+ u32 info; /* private information about this descriptor; DMA does not affect it */ -+}; -+ -+/* Progress Query struct */ -+typedef volatile struct MCD_XferProg_struct { -+ s8 *lastSrcAddr; /* the most-recent or last, post-increment source address */ -+ s8 *lastDestAddr; /* the most-recent or last, post-increment destination address */ -+ u32 dmaSize; /* the amount of data transferred for the current buffer */ -+ MCD_bufDesc *currBufDesc;/* pointer to the current buffer descriptor being DMAed */ -+} MCD_XferProg; -+ -+ -+/* FEC buffer descriptor */ -+typedef volatile struct MCD_bufDescFec_struct { -+ u16 statCtrl; -+ u16 length; -+ u32 dataPointer; -+} MCD_bufDescFec; -+ -+ -+/*************************************************************************/ -+/* -+ * API function Prototypes - see MCD_dmaApi.c for further notes -+ */ -+ -+/* -+ * MCD_startDma starts a particular kind of DMA . -+ */ -+int MCD_startDma ( -+ int channel, /* the channel on which to run the DMA */ -+ s8 *srcAddr, /* the address to move data from, or buffer-descriptor address */ -+ s16 srcIncr, /* the amount to increment the source address per transfer */ -+ s8 *destAddr, /* the address to move data to */ -+ s16 destIncr, /* the amount to increment the destination address per transfer */ -+ u32 dmaSize, /* the number of bytes to transfer independent of the transfer size */ -+ u32 xferSize, /* the number bytes in of each data movement (1, 2, or 4) */ -+ u32 initiator, /* what device initiates the DMA */ -+ int priority, /* priority of the DMA */ -+ u32 flags, /* flags describing the DMA */ -+ u32 funcDesc /* a description of byte swapping, bit swapping, and CRC actions */ -+); -+ -+/* -+ * MCD_initDma() initializes the DMA API by setting up a pointer to the DMA -+ * registers, relocating and creating the appropriate task structures, and -+ * setting up some global settings -+ */ -+int MCD_initDma (dmaRegs *sDmaBarAddr, void *taskTableDest, u32 flags); -+ -+/* -+ * MCD_dmaStatus() returns the status of the DMA on the requested channel. -+ */ -+int MCD_dmaStatus (int channel); -+ -+/* -+ * MCD_XferProgrQuery() returns progress of DMA on requested channel -+ */ -+int MCD_XferProgrQuery (int channel, MCD_XferProg *progRep); -+ -+/* -+ * MCD_killDma() halts the DMA on the requested channel, without any -+ * intention of resuming the DMA. -+ */ -+int MCD_killDma (int channel); -+ -+/* -+ * MCD_continDma() continues a DMA which as stopped due to encountering an -+ * unready buffer descriptor. -+ */ -+int MCD_continDma (int channel); -+ -+/* -+ * MCD_pauseDma() pauses the DMA on the given channel ( if any DMA is -+ * running on that channel). -+ */ -+int MCD_pauseDma (int channel); -+ -+/* -+ * MCD_resumeDma() resumes the DMA on a given channel (if any DMA is -+ * running on that channel). -+ */ -+int MCD_resumeDma (int channel); -+ -+/* -+ * MCD_csumQuery provides the checksum/CRC after performing a non-chained DMA -+ */ -+int MCD_csumQuery (int channel, u32 *csum); -+ -+/* -+ * MCD_getCodeSize provides the packed size required by the microcoded task -+ * and structures. -+ */ -+int MCD_getCodeSize(void); -+ -+/* -+ * MCD_getVersion provides a pointer to a version string and returns a -+ * version number. -+ */ -+int MCD_getVersion(char **longVersion); -+ -+/* macro for setting a location in the variable table */ -+#define MCD_SET_VAR(taskTab,idx,value) ((u32 *)(taskTab)->varTab)[idx] = value -+ /* Note that MCD_SET_VAR() is invoked many times in firing up a DMA function, -+ so I'm avoiding surrounding it with "do {} while(0)" */ -+ -+#endif /* DEFINESONLY */ -+ -+#endif /* _MCD_API_H */ ---- /dev/null -+++ b/drivers/dma/MCD_progCheck.h -@@ -0,0 +1,28 @@ -+/* -+ * drivers/dma/MCD_progCheck.h -+ * -+ * Copyright (C) 2004-2008 Freescale Semiconductor, Inc. -+ * Kurt Mahan <kmahan@freescale.com> -+ * -+ * This program is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU General Public License as -+ * published by the Free Software Foundation; either version 2 of -+ * the License, or (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, -+ * MA 02111-1307 USA -+ */ -+ -+/* This file is autogenerated. Do not change */ -+ -+#define CURRBD 4 -+#define DCOUNT 6 -+#define DESTPTR 5 -+#define SRCPTR 7 ---- /dev/null -+++ b/drivers/dma/MCD_tasks.c -@@ -0,0 +1,2465 @@ -+/* -+ * drivers/dma/MCD_tasks.c -+ * -+ * Copyright (C) 2004-2008 Freescale Semiconductor, Inc. -+ * Kurt Mahan <kmahan@freescale.com> -+ * -+ * This program is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU General Public License as -+ * published by the Free Software Foundation; either version 2 of -+ * the License, or (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, -+ * MA 02111-1307 USA -+ */ -+ -+#include "MCD_dma.h" -+ -+u32 MCD_varTab0[]; -+u32 MCD_varTab1[]; -+u32 MCD_varTab2[]; -+u32 MCD_varTab3[]; -+u32 MCD_varTab4[]; -+u32 MCD_varTab5[]; -+u32 MCD_varTab6[]; -+u32 MCD_varTab7[]; -+u32 MCD_varTab8[]; -+u32 MCD_varTab9[]; -+u32 MCD_varTab10[]; -+u32 MCD_varTab11[]; -+u32 MCD_varTab12[]; -+u32 MCD_varTab13[]; -+u32 MCD_varTab14[]; -+u32 MCD_varTab15[]; -+ -+u32 MCD_funcDescTab0[]; -+#ifdef MCD_INCLUDE_EU -+u32 MCD_funcDescTab1[]; -+u32 MCD_funcDescTab2[]; -+u32 MCD_funcDescTab3[]; -+u32 MCD_funcDescTab4[]; -+u32 MCD_funcDescTab5[]; -+u32 MCD_funcDescTab6[]; -+u32 MCD_funcDescTab7[]; -+u32 MCD_funcDescTab8[]; -+u32 MCD_funcDescTab9[]; -+u32 MCD_funcDescTab10[]; -+u32 MCD_funcDescTab11[]; -+u32 MCD_funcDescTab12[]; -+u32 MCD_funcDescTab13[]; -+u32 MCD_funcDescTab14[]; -+u32 MCD_funcDescTab15[]; -+#endif -+ -+u32 MCD_contextSave0[]; -+u32 MCD_contextSave1[]; -+u32 MCD_contextSave2[]; -+u32 MCD_contextSave3[]; -+u32 MCD_contextSave4[]; -+u32 MCD_contextSave5[]; -+u32 MCD_contextSave6[]; -+u32 MCD_contextSave7[]; -+u32 MCD_contextSave8[]; -+u32 MCD_contextSave9[]; -+u32 MCD_contextSave10[]; -+u32 MCD_contextSave11[]; -+u32 MCD_contextSave12[]; -+u32 MCD_contextSave13[]; -+u32 MCD_contextSave14[]; -+u32 MCD_contextSave15[]; -+ -+u32 MCD_realTaskTableSrc[] = -+{ -+ 0x00000000, -+ 0x00000000, -+ (u32)MCD_varTab0, /* Task 0 Variable Table */ -+ (u32)MCD_funcDescTab0, /* Task 0 Function Descriptor Table & Flags */ -+ 0x00000000, -+ 0x00000000, -+ (u32)MCD_contextSave0, /* Task 0 context save space */ -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ (u32)MCD_varTab1, /* Task 1 Variable Table */ -+#ifdef MCD_INCLUDE_EU -+ (u32)MCD_funcDescTab1, /* Task 1 Function Descriptor Table & Flags */ -+#else -+ (u32)MCD_funcDescTab0, /* Task 0 Function Descriptor Table & Flags */ -+#endif -+ 0x00000000, -+ 0x00000000, -+ (u32)MCD_contextSave1, /* Task 1 context save space */ -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ (u32)MCD_varTab2, /* Task 2 Variable Table */ -+#ifdef MCD_INCLUDE_EU -+ (u32)MCD_funcDescTab2, /* Task 2 Function Descriptor Table & Flags */ -+#else -+ (u32)MCD_funcDescTab0, /* Task 0 Function Descriptor Table & Flags */ -+#endif -+ 0x00000000, -+ 0x00000000, -+ (u32)MCD_contextSave2, /* Task 2 context save space */ -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ (u32)MCD_varTab3, /* Task 3 Variable Table */ -+#ifdef MCD_INCLUDE_EU -+ (u32)MCD_funcDescTab3, /* Task 3 Function Descriptor Table & Flags */ -+#else -+ (u32)MCD_funcDescTab0, /* Task 0 Function Descriptor Table & Flags */ -+#endif -+ 0x00000000, -+ 0x00000000, -+ (u32)MCD_contextSave3, /* Task 3 context save space */ -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ (u32)MCD_varTab4, /* Task 4 Variable Table */ -+#ifdef MCD_INCLUDE_EU -+ (u32)MCD_funcDescTab4, /* Task 4 Function Descriptor Table & Flags */ -+#else -+ (u32)MCD_funcDescTab0, /* Task 0 Function Descriptor Table & Flags */ -+#endif -+ 0x00000000, -+ 0x00000000, -+ (u32)MCD_contextSave4, /* Task 4 context save space */ -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ (u32)MCD_varTab5, /* Task 5 Variable Table */ -+#ifdef MCD_INCLUDE_EU -+ (u32)MCD_funcDescTab5, /* Task 5 Function Descriptor Table & Flags */ -+#else -+ (u32)MCD_funcDescTab0, /* Task 0 Function Descriptor Table & Flags */ -+#endif -+ 0x00000000, -+ 0x00000000, -+ (u32)MCD_contextSave5, /* Task 5 context save space */ -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ (u32)MCD_varTab6, /* Task 6 Variable Table */ -+#ifdef MCD_INCLUDE_EU -+ (u32)MCD_funcDescTab6, /* Task 6 Function Descriptor Table & Flags */ -+#else -+ (u32)MCD_funcDescTab0, /* Task 0 Function Descriptor Table & Flags */ -+#endif -+ 0x00000000, -+ 0x00000000, -+ (u32)MCD_contextSave6, /* Task 6 context save space */ -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ (u32)MCD_varTab7, /* Task 7 Variable Table */ -+#ifdef MCD_INCLUDE_EU -+ (u32)MCD_funcDescTab7, /* Task 7 Function Descriptor Table & Flags */ -+#else -+ (u32)MCD_funcDescTab0, /* Task 0 Function Descriptor Table & Flags */ -+#endif -+ 0x00000000, -+ 0x00000000, -+ (u32)MCD_contextSave7, /* Task 7 context save space */ -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ (u32)MCD_varTab8, /* Task 8 Variable Table */ -+#ifdef MCD_INCLUDE_EU -+ (u32)MCD_funcDescTab8, /* Task 8 Function Descriptor Table & Flags */ -+#else -+ (u32)MCD_funcDescTab0, /* Task 0 Function Descriptor Table & Flags */ -+#endif -+ 0x00000000, -+ 0x00000000, -+ (u32)MCD_contextSave8, /* Task 8 context save space */ -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ (u32)MCD_varTab9, /* Task 9 Variable Table */ -+#ifdef MCD_INCLUDE_EU -+ (u32)MCD_funcDescTab9, /* Task 9 Function Descriptor Table & Flags */ -+#else -+ (u32)MCD_funcDescTab0, /* Task 0 Function Descriptor Table & Flags */ -+#endif -+ 0x00000000, -+ 0x00000000, -+ (u32)MCD_contextSave9, /* Task 9 context save space */ -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ (u32)MCD_varTab10, /* Task 10 Variable Table */ -+#ifdef MCD_INCLUDE_EU -+ (u32)MCD_funcDescTab10, /* Task 10 Function Descriptor Table & Flags */ -+#else -+ (u32)MCD_funcDescTab0, /* Task 0 Function Descriptor Table & Flags */ -+#endif -+ 0x00000000, -+ 0x00000000, -+ (u32)MCD_contextSave10, /* Task 10 context save space */ -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ (u32)MCD_varTab11, /* Task 11 Variable Table */ -+#ifdef MCD_INCLUDE_EU -+ (u32)MCD_funcDescTab11, /* Task 11 Function Descriptor Table & Flags */ -+#else -+ (u32)MCD_funcDescTab0, /* Task 0 Function Descriptor Table & Flags */ -+#endif -+ 0x00000000, -+ 0x00000000, -+ (u32)MCD_contextSave11, /* Task 11 context save space */ -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ (u32)MCD_varTab12, /* Task 12 Variable Table */ -+#ifdef MCD_INCLUDE_EU -+ (u32)MCD_funcDescTab12, /* Task 12 Function Descriptor Table & Flags */ -+#else -+ (u32)MCD_funcDescTab0, /* Task 0 Function Descriptor Table & Flags */ -+#endif -+ 0x00000000, -+ 0x00000000, -+ (u32)MCD_contextSave12, /* Task 12 context save space */ -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ (u32)MCD_varTab13, /* Task 13 Variable Table */ -+#ifdef MCD_INCLUDE_EU -+ (u32)MCD_funcDescTab13, /* Task 13 Function Descriptor Table & Flags */ -+#else -+ (u32)MCD_funcDescTab0, /* Task 0 Function Descriptor Table & Flags */ -+#endif -+ 0x00000000, -+ 0x00000000, -+ (u32)MCD_contextSave13, /* Task 13 context save space */ -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ (u32)MCD_varTab14, /* Task 14 Variable Table */ -+#ifdef MCD_INCLUDE_EU -+ (u32)MCD_funcDescTab14, /* Task 14 Function Descriptor Table & Flags */ -+#else -+ (u32)MCD_funcDescTab0, /* Task 0 Function Descriptor Table & Flags */ -+#endif -+ 0x00000000, -+ 0x00000000, -+ (u32)MCD_contextSave14, /* Task 14 context save space */ -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ (u32)MCD_varTab15, /* Task 15 Variable Table */ -+#ifdef MCD_INCLUDE_EU -+ (u32)MCD_funcDescTab15, /* Task 15 Function Descriptor Table & Flags */ -+#else -+ (u32)MCD_funcDescTab0, /* Task 0 Function Descriptor Table & Flags */ -+#endif -+ 0x00000000, -+ 0x00000000, -+ (u32)MCD_contextSave15, /* Task 15 context save space */ -+ 0x00000000, -+}; -+ -+ -+u32 MCD_varTab0[] = -+{ /* Task 0 Variable Table */ -+ 0x00000000, /* var[0] */ -+ 0x00000000, /* var[1] */ -+ 0x00000000, /* var[2] */ -+ 0x00000000, /* var[3] */ -+ 0x00000000, /* var[4] */ -+ 0x00000000, /* var[5] */ -+ 0x00000000, /* var[6] */ -+ 0x00000000, /* var[7] */ -+ 0x00000000, /* var[8] */ -+ 0x00000000, /* var[9] */ -+ 0x00000000, /* var[10] */ -+ 0x00000000, /* var[11] */ -+ 0x00000000, /* var[12] */ -+ 0x00000000, /* var[13] */ -+ 0x00000000, /* var[14] */ -+ 0x00000000, /* var[15] */ -+ 0x00000000, /* var[16] */ -+ 0x00000000, /* var[17] */ -+ 0x00000000, /* var[18] */ -+ 0x00000000, /* var[19] */ -+ 0x00000000, /* var[20] */ -+ 0x00000000, /* var[21] */ -+ 0x00000000, /* var[22] */ -+ 0x00000000, /* var[23] */ -+ 0xe0000000, /* inc[0] */ -+ 0x20000000, /* inc[1] */ -+ 0x2000ffff, /* inc[2] */ -+ 0x00000000, /* inc[3] */ -+ 0x00000000, /* inc[4] */ -+ 0x00000000, /* inc[5] */ -+ 0x00000000, /* inc[6] */ -+ 0x00000000, /* inc[7] */ -+}; -+ -+ -+u32 MCD_varTab1[] = -+{ /* Task 1 Variable Table */ -+ 0x00000000, /* var[0] */ -+ 0x00000000, /* var[1] */ -+ 0x00000000, /* var[2] */ -+ 0x00000000, /* var[3] */ -+ 0x00000000, /* var[4] */ -+ 0x00000000, /* var[5] */ -+ 0x00000000, /* var[6] */ -+ 0x00000000, /* var[7] */ -+ 0x00000000, /* var[8] */ -+ 0x00000000, /* var[9] */ -+ 0x00000000, /* var[10] */ -+ 0x00000000, /* var[11] */ -+ 0x00000000, /* var[12] */ -+ 0x00000000, /* var[13] */ -+ 0x00000000, /* var[14] */ -+ 0x00000000, /* var[15] */ -+ 0x00000000, /* var[16] */ -+ 0x00000000, /* var[17] */ -+ 0x00000000, /* var[18] */ -+ 0x00000000, /* var[19] */ -+ 0x00000000, /* var[20] */ -+ 0x00000000, /* var[21] */ -+ 0x00000000, /* var[22] */ -+ 0x00000000, /* var[23] */ -+ 0xe0000000, /* inc[0] */ -+ 0x20000000, /* inc[1] */ -+ 0x2000ffff, /* inc[2] */ -+ 0x00000000, /* inc[3] */ -+ 0x00000000, /* inc[4] */ -+ 0x00000000, /* inc[5] */ -+ 0x00000000, /* inc[6] */ -+ 0x00000000, /* inc[7] */ -+}; -+ -+u32 MCD_varTab2[]= -+{ /* Task 2 Variable Table */ -+ 0x00000000, /* var[0] */ -+ 0x00000000, /* var[1] */ -+ 0x00000000, /* var[2] */ -+ 0x00000000, /* var[3] */ -+ 0x00000000, /* var[4] */ -+ 0x00000000, /* var[5] */ -+ 0x00000000, /* var[6] */ -+ 0x00000000, /* var[7] */ -+ 0x00000000, /* var[8] */ -+ 0x00000000, /* var[9] */ -+ 0x00000000, /* var[10] */ -+ 0x00000000, /* var[11] */ -+ 0x00000000, /* var[12] */ -+ 0x00000000, /* var[13] */ -+ 0x00000000, /* var[14] */ -+ 0x00000000, /* var[15] */ -+ 0x00000000, /* var[16] */ -+ 0x00000000, /* var[17] */ -+ 0x00000000, /* var[18] */ -+ 0x00000000, /* var[19] */ -+ 0x00000000, /* var[20] */ -+ 0x00000000, /* var[21] */ -+ 0x00000000, /* var[22] */ -+ 0x00000000, /* var[23] */ -+ 0xe0000000, /* inc[0] */ -+ 0x20000000, /* inc[1] */ -+ 0x2000ffff, /* inc[2] */ -+ 0x00000000, /* inc[3] */ -+ 0x00000000, /* inc[4] */ -+ 0x00000000, /* inc[5] */ -+ 0x00000000, /* inc[6] */ -+ 0x00000000, /* inc[7] */ -+}; -+ -+u32 MCD_varTab3[]= -+{ /* Task 3 Variable Table */ -+ 0x00000000, /* var[0] */ -+ 0x00000000, /* var[1] */ -+ 0x00000000, /* var[2] */ -+ 0x00000000, /* var[3] */ -+ 0x00000000, /* var[4] */ -+ 0x00000000, /* var[5] */ -+ 0x00000000, /* var[6] */ -+ 0x00000000, /* var[7] */ -+ 0x00000000, /* var[8] */ -+ 0x00000000, /* var[9] */ -+ 0x00000000, /* var[10] */ -+ 0x00000000, /* var[11] */ -+ 0x00000000, /* var[12] */ -+ 0x00000000, /* var[13] */ -+ 0x00000000, /* var[14] */ -+ 0x00000000, /* var[15] */ -+ 0x00000000, /* var[16] */ -+ 0x00000000, /* var[17] */ -+ 0x00000000, /* var[18] */ -+ 0x00000000, /* var[19] */ -+ 0x00000000, /* var[20] */ -+ 0x00000000, /* var[21] */ -+ 0x00000000, /* var[22] */ -+ 0x00000000, /* var[23] */ -+ 0xe0000000, /* inc[0] */ -+ 0x20000000, /* inc[1] */ -+ 0x2000ffff, /* inc[2] */ -+ 0x00000000, /* inc[3] */ -+ 0x00000000, /* inc[4] */ -+ 0x00000000, /* inc[5] */ -+ 0x00000000, /* inc[6] */ -+ 0x00000000, /* inc[7] */ -+}; -+ -+u32 MCD_varTab4[]= -+{ /* Task 4 Variable Table */ -+ 0x00000000, /* var[0] */ -+ 0x00000000, /* var[1] */ -+ 0x00000000, /* var[2] */ -+ 0x00000000, /* var[3] */ -+ 0x00000000, /* var[4] */ -+ 0x00000000, /* var[5] */ -+ 0x00000000, /* var[6] */ -+ 0x00000000, /* var[7] */ -+ 0x00000000, /* var[8] */ -+ 0x00000000, /* var[9] */ -+ 0x00000000, /* var[10] */ -+ 0x00000000, /* var[11] */ -+ 0x00000000, /* var[12] */ -+ 0x00000000, /* var[13] */ -+ 0x00000000, /* var[14] */ -+ 0x00000000, /* var[15] */ -+ 0x00000000, /* var[16] */ -+ 0x00000000, /* var[17] */ -+ 0x00000000, /* var[18] */ -+ 0x00000000, /* var[19] */ -+ 0x00000000, /* var[20] */ -+ 0x00000000, /* var[21] */ -+ 0x00000000, /* var[22] */ -+ 0x00000000, /* var[23] */ -+ 0xe0000000, /* inc[0] */ -+ 0x20000000, /* inc[1] */ -+ 0x2000ffff, /* inc[2] */ -+ 0x00000000, /* inc[3] */ -+ 0x00000000, /* inc[4] */ -+ 0x00000000, /* inc[5] */ -+ 0x00000000, /* inc[6] */ -+ 0x00000000, /* inc[7] */ -+}; -+ -+u32 MCD_varTab5[]= -+{ /* Task 5 Variable Table */ -+ 0x00000000, /* var[0] */ -+ 0x00000000, /* var[1] */ -+ 0x00000000, /* var[2] */ -+ 0x00000000, /* var[3] */ -+ 0x00000000, /* var[4] */ -+ 0x00000000, /* var[5] */ -+ 0x00000000, /* var[6] */ -+ 0x00000000, /* var[7] */ -+ 0x00000000, /* var[8] */ -+ 0x00000000, /* var[9] */ -+ 0x00000000, /* var[10] */ -+ 0x00000000, /* var[11] */ -+ 0x00000000, /* var[12] */ -+ 0x00000000, /* var[13] */ -+ 0x00000000, /* var[14] */ -+ 0x00000000, /* var[15] */ -+ 0x00000000, /* var[16] */ -+ 0x00000000, /* var[17] */ -+ 0x00000000, /* var[18] */ -+ 0x00000000, /* var[19] */ -+ 0x00000000, /* var[20] */ -+ 0x00000000, /* var[21] */ -+ 0x00000000, /* var[22] */ -+ 0x00000000, /* var[23] */ -+ 0xe0000000, /* inc[0] */ -+ 0x20000000, /* inc[1] */ -+ 0x2000ffff, /* inc[2] */ -+ 0x00000000, /* inc[3] */ -+ 0x00000000, /* inc[4] */ -+ 0x00000000, /* inc[5] */ -+ 0x00000000, /* inc[6] */ -+ 0x00000000, /* inc[7] */ -+}; -+ -+u32 MCD_varTab6[]= -+{ /* Task 6 Variable Table */ -+ 0x00000000, /* var[0] */ -+ 0x00000000, /* var[1] */ -+ 0x00000000, /* var[2] */ -+ 0x00000000, /* var[3] */ -+ 0x00000000, /* var[4] */ -+ 0x00000000, /* var[5] */ -+ 0x00000000, /* var[6] */ -+ 0x00000000, /* var[7] */ -+ 0x00000000, /* var[8] */ -+ 0x00000000, /* var[9] */ -+ 0x00000000, /* var[10] */ -+ 0x00000000, /* var[11] */ -+ 0x00000000, /* var[12] */ -+ 0x00000000, /* var[13] */ -+ 0x00000000, /* var[14] */ -+ 0x00000000, /* var[15] */ -+ 0x00000000, /* var[16] */ -+ 0x00000000, /* var[17] */ -+ 0x00000000, /* var[18] */ -+ 0x00000000, /* var[19] */ -+ 0x00000000, /* var[20] */ -+ 0x00000000, /* var[21] */ -+ 0x00000000, /* var[22] */ -+ 0x00000000, /* var[23] */ -+ 0xe0000000, /* inc[0] */ -+ 0x20000000, /* inc[1] */ -+ 0x2000ffff, /* inc[2] */ -+ 0x00000000, /* inc[3] */ -+ 0x00000000, /* inc[4] */ -+ 0x00000000, /* inc[5] */ -+ 0x00000000, /* inc[6] */ -+ 0x00000000, /* inc[7] */ -+}; -+ -+u32 MCD_varTab7[]= -+{ /* Task 7 Variable Table */ -+ 0x00000000, /* var[0] */ -+ 0x00000000, /* var[1] */ -+ 0x00000000, /* var[2] */ -+ 0x00000000, /* var[3] */ -+ 0x00000000, /* var[4] */ -+ 0x00000000, /* var[5] */ -+ 0x00000000, /* var[6] */ -+ 0x00000000, /* var[7] */ -+ 0x00000000, /* var[8] */ -+ 0x00000000, /* var[9] */ -+ 0x00000000, /* var[10] */ -+ 0x00000000, /* var[11] */ -+ 0x00000000, /* var[12] */ -+ 0x00000000, /* var[13] */ -+ 0x00000000, /* var[14] */ -+ 0x00000000, /* var[15] */ -+ 0x00000000, /* var[16] */ -+ 0x00000000, /* var[17] */ -+ 0x00000000, /* var[18] */ -+ 0x00000000, /* var[19] */ -+ 0x00000000, /* var[20] */ -+ 0x00000000, /* var[21] */ -+ 0x00000000, /* var[22] */ -+ 0x00000000, /* var[23] */ -+ 0xe0000000, /* inc[0] */ -+ 0x20000000, /* inc[1] */ -+ 0x2000ffff, /* inc[2] */ -+ 0x00000000, /* inc[3] */ -+ 0x00000000, /* inc[4] */ -+ 0x00000000, /* inc[5] */ -+ 0x00000000, /* inc[6] */ -+ 0x00000000, /* inc[7] */ -+}; -+ -+u32 MCD_varTab8[]= -+{ /* Task 8 Variable Table */ -+ 0x00000000, /* var[0] */ -+ 0x00000000, /* var[1] */ -+ 0x00000000, /* var[2] */ -+ 0x00000000, /* var[3] */ -+ 0x00000000, /* var[4] */ -+ 0x00000000, /* var[5] */ -+ 0x00000000, /* var[6] */ -+ 0x00000000, /* var[7] */ -+ 0x00000000, /* var[8] */ -+ 0x00000000, /* var[9] */ -+ 0x00000000, /* var[10] */ -+ 0x00000000, /* var[11] */ -+ 0x00000000, /* var[12] */ -+ 0x00000000, /* var[13] */ -+ 0x00000000, /* var[14] */ -+ 0x00000000, /* var[15] */ -+ 0x00000000, /* var[16] */ -+ 0x00000000, /* var[17] */ -+ 0x00000000, /* var[18] */ -+ 0x00000000, /* var[19] */ -+ 0x00000000, /* var[20] */ -+ 0x00000000, /* var[21] */ -+ 0x00000000, /* var[22] */ -+ 0x00000000, /* var[23] */ -+ 0xe0000000, /* inc[0] */ -+ 0x20000000, /* inc[1] */ -+ 0x2000ffff, /* inc[2] */ -+ 0x00000000, /* inc[3] */ -+ 0x00000000, /* inc[4] */ -+ 0x00000000, /* inc[5] */ -+ 0x00000000, /* inc[6] */ -+ 0x00000000, /* inc[7] */ -+}; -+ -+u32 MCD_varTab9[]= -+{ /* Task 9 Variable Table */ -+ 0x00000000, /* var[0] */ -+ 0x00000000, /* var[1] */ -+ 0x00000000, /* var[2] */ -+ 0x00000000, /* var[3] */ -+ 0x00000000, /* var[4] */ -+ 0x00000000, /* var[5] */ -+ 0x00000000, /* var[6] */ -+ 0x00000000, /* var[7] */ -+ 0x00000000, /* var[8] */ -+ 0x00000000, /* var[9] */ -+ 0x00000000, /* var[10] */ -+ 0x00000000, /* var[11] */ -+ 0x00000000, /* var[12] */ -+ 0x00000000, /* var[13] */ -+ 0x00000000, /* var[14] */ -+ 0x00000000, /* var[15] */ -+ 0x00000000, /* var[16] */ -+ 0x00000000, /* var[17] */ -+ 0x00000000, /* var[18] */ -+ 0x00000000, /* var[19] */ -+ 0x00000000, /* var[20] */ -+ 0x00000000, /* var[21] */ -+ 0x00000000, /* var[22] */ -+ 0x00000000, /* var[23] */ -+ 0xe0000000, /* inc[0] */ -+ 0x20000000, /* inc[1] */ -+ 0x2000ffff, /* inc[2] */ -+ 0x00000000, /* inc[3] */ -+ 0x00000000, /* inc[4] */ -+ 0x00000000, /* inc[5] */ -+ 0x00000000, /* inc[6] */ -+ 0x00000000, /* inc[7] */ -+}; -+ -+u32 MCD_varTab10[]= -+{ /* Task 10 Variable Table */ -+ 0x00000000, /* var[0] */ -+ 0x00000000, /* var[1] */ -+ 0x00000000, /* var[2] */ -+ 0x00000000, /* var[3] */ -+ 0x00000000, /* var[4] */ -+ 0x00000000, /* var[5] */ -+ 0x00000000, /* var[6] */ -+ 0x00000000, /* var[7] */ -+ 0x00000000, /* var[8] */ -+ 0x00000000, /* var[9] */ -+ 0x00000000, /* var[10] */ -+ 0x00000000, /* var[11] */ -+ 0x00000000, /* var[12] */ -+ 0x00000000, /* var[13] */ -+ 0x00000000, /* var[14] */ -+ 0x00000000, /* var[15] */ -+ 0x00000000, /* var[16] */ -+ 0x00000000, /* var[17] */ -+ 0x00000000, /* var[18] */ -+ 0x00000000, /* var[19] */ -+ 0x00000000, /* var[20] */ -+ 0x00000000, /* var[21] */ -+ 0x00000000, /* var[22] */ -+ 0x00000000, /* var[23] */ -+ 0xe0000000, /* inc[0] */ -+ 0x20000000, /* inc[1] */ -+ 0x2000ffff, /* inc[2] */ -+ 0x00000000, /* inc[3] */ -+ 0x00000000, /* inc[4] */ -+ 0x00000000, /* inc[5] */ -+ 0x00000000, /* inc[6] */ -+ 0x00000000, /* inc[7] */ -+}; -+ -+u32 MCD_varTab11[]= -+{ /* Task 11 Variable Table */ -+ 0x00000000, /* var[0] */ -+ 0x00000000, /* var[1] */ -+ 0x00000000, /* var[2] */ -+ 0x00000000, /* var[3] */ -+ 0x00000000, /* var[4] */ -+ 0x00000000, /* var[5] */ -+ 0x00000000, /* var[6] */ -+ 0x00000000, /* var[7] */ -+ 0x00000000, /* var[8] */ -+ 0x00000000, /* var[9] */ -+ 0x00000000, /* var[10] */ -+ 0x00000000, /* var[11] */ -+ 0x00000000, /* var[12] */ -+ 0x00000000, /* var[13] */ -+ 0x00000000, /* var[14] */ -+ 0x00000000, /* var[15] */ -+ 0x00000000, /* var[16] */ -+ 0x00000000, /* var[17] */ -+ 0x00000000, /* var[18] */ -+ 0x00000000, /* var[19] */ -+ 0x00000000, /* var[20] */ -+ 0x00000000, /* var[21] */ -+ 0x00000000, /* var[22] */ -+ 0x00000000, /* var[23] */ -+ 0xe0000000, /* inc[0] */ -+ 0x20000000, /* inc[1] */ -+ 0x2000ffff, /* inc[2] */ -+ 0x00000000, /* inc[3] */ -+ 0x00000000, /* inc[4] */ -+ 0x00000000, /* inc[5] */ -+ 0x00000000, /* inc[6] */ -+ 0x00000000, /* inc[7] */ -+}; -+ -+u32 MCD_varTab12[]= -+{ /* Task 12 Variable Table */ -+ 0x00000000, /* var[0] */ -+ 0x00000000, /* var[1] */ -+ 0x00000000, /* var[2] */ -+ 0x00000000, /* var[3] */ -+ 0x00000000, /* var[4] */ -+ 0x00000000, /* var[5] */ -+ 0x00000000, /* var[6] */ -+ 0x00000000, /* var[7] */ -+ 0x00000000, /* var[8] */ -+ 0x00000000, /* var[9] */ -+ 0x00000000, /* var[10] */ -+ 0x00000000, /* var[11] */ -+ 0x00000000, /* var[12] */ -+ 0x00000000, /* var[13] */ -+ 0x00000000, /* var[14] */ -+ 0x00000000, /* var[15] */ -+ 0x00000000, /* var[16] */ -+ 0x00000000, /* var[17] */ -+ 0x00000000, /* var[18] */ -+ 0x00000000, /* var[19] */ -+ 0x00000000, /* var[20] */ -+ 0x00000000, /* var[21] */ -+ 0x00000000, /* var[22] */ -+ 0x00000000, /* var[23] */ -+ 0xe0000000, /* inc[0] */ -+ 0x20000000, /* inc[1] */ -+ 0x2000ffff, /* inc[2] */ -+ 0x00000000, /* inc[3] */ -+ 0x00000000, /* inc[4] */ -+ 0x00000000, /* inc[5] */ -+ 0x00000000, /* inc[6] */ -+ 0x00000000, /* inc[7] */ -+}; -+ -+u32 MCD_varTab13[]= -+{ /* Task 13 Variable Table */ -+ 0x00000000, /* var[0] */ -+ 0x00000000, /* var[1] */ -+ 0x00000000, /* var[2] */ -+ 0x00000000, /* var[3] */ -+ 0x00000000, /* var[4] */ -+ 0x00000000, /* var[5] */ -+ 0x00000000, /* var[6] */ -+ 0x00000000, /* var[7] */ -+ 0x00000000, /* var[8] */ -+ 0x00000000, /* var[9] */ -+ 0x00000000, /* var[10] */ -+ 0x00000000, /* var[11] */ -+ 0x00000000, /* var[12] */ -+ 0x00000000, /* var[13] */ -+ 0x00000000, /* var[14] */ -+ 0x00000000, /* var[15] */ -+ 0x00000000, /* var[16] */ -+ 0x00000000, /* var[17] */ -+ 0x00000000, /* var[18] */ -+ 0x00000000, /* var[19] */ -+ 0x00000000, /* var[20] */ -+ 0x00000000, /* var[21] */ -+ 0x00000000, /* var[22] */ -+ 0x00000000, /* var[23] */ -+ 0xe0000000, /* inc[0] */ -+ 0x20000000, /* inc[1] */ -+ 0x2000ffff, /* inc[2] */ -+ 0x00000000, /* inc[3] */ -+ 0x00000000, /* inc[4] */ -+ 0x00000000, /* inc[5] */ -+ 0x00000000, /* inc[6] */ -+ 0x00000000, /* inc[7] */ -+}; -+ -+u32 MCD_varTab14[]= -+{ /* Task 14 Variable Table */ -+ 0x00000000, /* var[0] */ -+ 0x00000000, /* var[1] */ -+ 0x00000000, /* var[2] */ -+ 0x00000000, /* var[3] */ -+ 0x00000000, /* var[4] */ -+ 0x00000000, /* var[5] */ -+ 0x00000000, /* var[6] */ -+ 0x00000000, /* var[7] */ -+ 0x00000000, /* var[8] */ -+ 0x00000000, /* var[9] */ -+ 0x00000000, /* var[10] */ -+ 0x00000000, /* var[11] */ -+ 0x00000000, /* var[12] */ -+ 0x00000000, /* var[13] */ -+ 0x00000000, /* var[14] */ -+ 0x00000000, /* var[15] */ -+ 0x00000000, /* var[16] */ -+ 0x00000000, /* var[17] */ -+ 0x00000000, /* var[18] */ -+ 0x00000000, /* var[19] */ -+ 0x00000000, /* var[20] */ -+ 0x00000000, /* var[21] */ -+ 0x00000000, /* var[22] */ -+ 0x00000000, /* var[23] */ -+ 0xe0000000, /* inc[0] */ -+ 0x20000000, /* inc[1] */ -+ 0x2000ffff, /* inc[2] */ -+ 0x00000000, /* inc[3] */ -+ 0x00000000, /* inc[4] */ -+ 0x00000000, /* inc[5] */ -+ 0x00000000, /* inc[6] */ -+ 0x00000000, /* inc[7] */ -+}; -+ -+u32 MCD_varTab15[]= -+{ /* Task 15 Variable Table */ -+ 0x00000000, /* var[0] */ -+ 0x00000000, /* var[1] */ -+ 0x00000000, /* var[2] */ -+ 0x00000000, /* var[3] */ -+ 0x00000000, /* var[4] */ -+ 0x00000000, /* var[5] */ -+ 0x00000000, /* var[6] */ -+ 0x00000000, /* var[7] */ -+ 0x00000000, /* var[8] */ -+ 0x00000000, /* var[9] */ -+ 0x00000000, /* var[10] */ -+ 0x00000000, /* var[11] */ -+ 0x00000000, /* var[12] */ -+ 0x00000000, /* var[13] */ -+ 0x00000000, /* var[14] */ -+ 0x00000000, /* var[15] */ -+ 0x00000000, /* var[16] */ -+ 0x00000000, /* var[17] */ -+ 0x00000000, /* var[18] */ -+ 0x00000000, /* var[19] */ -+ 0x00000000, /* var[20] */ -+ 0x00000000, /* var[21] */ -+ 0x00000000, /* var[22] */ -+ 0x00000000, /* var[23] */ -+ 0xe0000000, /* inc[0] */ -+ 0x20000000, /* inc[1] */ -+ 0x2000ffff, /* inc[2] */ -+ 0x00000000, /* inc[3] */ -+ 0x00000000, /* inc[4] */ -+ 0x00000000, /* inc[5] */ -+ 0x00000000, /* inc[6] */ -+ 0x00000000, /* inc[7] */ -+}; -+ -+u32 MCD_funcDescTab0[]= -+{ /* Task 0 Function Descriptor Table */ -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0xa0045670, /* mainFunc(), EU# 3 */ -+ 0xa0000000, /* rsduFunc(), EU# 3 */ -+ 0xa0000000, /* crcAccumVal(), EU# 3 */ -+ 0x20000000, /* setCrcAccum(), EU# 3 */ -+ 0x21800000, /* and(), EU# 3 */ -+ 0x21e00000, /* or(), EU# 3 */ -+ 0x20400000, /* add(), EU# 3 */ -+ 0x20500000, /* sub(), EU# 3 */ -+ 0x205a0000, /* andNot(), EU# 3 */ -+ 0x20a00000, /* shiftR(), EU# 3 */ -+ 0x202fa000, /* andReadyBit(), EU# 3 */ -+ 0x202f9000, /* andNotReadyBit(), EU# 3 */ -+ 0x202ea000, /* andWrapBit(), EU# 3 */ -+ 0x202da000, /* andLastBit(), EU# 3 */ -+ 0x202e2000, /* andInterruptBit(), EU# 3 */ -+ 0x202f2000, /* andCrcRestartBit(), EU# 3 */ -+}; -+ -+#ifdef MCD_INCLUDE_EU -+u32 MCD_funcDescTab1[]= -+{ /* Task 1 Function Descriptor Table */ -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0xa0045670, /* mainFunc(), EU# 3 */ -+ 0xa0000000, /* rsduFunc(), EU# 3 */ -+ 0xa0000000, /* crcAccumVal(), EU# 3 */ -+ 0x20000000, /* setCrcAccum(), EU# 3 */ -+ 0x21800000, /* and(), EU# 3 */ -+ 0x21e00000, /* or(), EU# 3 */ -+ 0x20400000, /* add(), EU# 3 */ -+ 0x20500000, /* sub(), EU# 3 */ -+ 0x205a0000, /* andNot(), EU# 3 */ -+ 0x20a00000, /* shiftR(), EU# 3 */ -+ 0x202fa000, /* andReadyBit(), EU# 3 */ -+ 0x202f9000, /* andNotReadyBit(), EU# 3 */ -+ 0x202ea000, /* andWrapBit(), EU# 3 */ -+ 0x202da000, /* andLastBit(), EU# 3 */ -+ 0x202e2000, /* andInterruptBit(), EU# 3 */ -+ 0x202f2000, /* andCrcRestartBit(), EU# 3 */ -+}; -+ -+u32 MCD_funcDescTab2[]= -+{ /* Task 2 Function Descriptor Table */ -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0xa0045670, /* mainFunc(), EU# 3 */ -+ 0xa0000000, /* rsduFunc(), EU# 3 */ -+ 0xa0000000, /* crcAccumVal(), EU# 3 */ -+ 0x20000000, /* setCrcAccum(), EU# 3 */ -+ 0x21800000, /* and(), EU# 3 */ -+ 0x21e00000, /* or(), EU# 3 */ -+ 0x20400000, /* add(), EU# 3 */ -+ 0x20500000, /* sub(), EU# 3 */ -+ 0x205a0000, /* andNot(), EU# 3 */ -+ 0x20a00000, /* shiftR(), EU# 3 */ -+ 0x202fa000, /* andReadyBit(), EU# 3 */ -+ 0x202f9000, /* andNotReadyBit(), EU# 3 */ -+ 0x202ea000, /* andWrapBit(), EU# 3 */ -+ 0x202da000, /* andLastBit(), EU# 3 */ -+ 0x202e2000, /* andInterruptBit(), EU# 3 */ -+ 0x202f2000, /* andCrcRestartBit(), EU# 3 */ -+}; -+ -+u32 MCD_funcDescTab3[]= -+{ /* Task 3 Function Descriptor Table */ -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0xa0045670, /* mainFunc(), EU# 3 */ -+ 0xa0000000, /* rsduFunc(), EU# 3 */ -+ 0xa0000000, /* crcAccumVal(), EU# 3 */ -+ 0x20000000, /* setCrcAccum(), EU# 3 */ -+ 0x21800000, /* and(), EU# 3 */ -+ 0x21e00000, /* or(), EU# 3 */ -+ 0x20400000, /* add(), EU# 3 */ -+ 0x20500000, /* sub(), EU# 3 */ -+ 0x205a0000, /* andNot(), EU# 3 */ -+ 0x20a00000, /* shiftR(), EU# 3 */ -+ 0x202fa000, /* andReadyBit(), EU# 3 */ -+ 0x202f9000, /* andNotReadyBit(), EU# 3 */ -+ 0x202ea000, /* andWrapBit(), EU# 3 */ -+ 0x202da000, /* andLastBit(), EU# 3 */ -+ 0x202e2000, /* andInterruptBit(), EU# 3 */ -+ 0x202f2000, /* andCrcRestartBit(), EU# 3 */ -+}; -+ -+u32 MCD_funcDescTab4[]= -+{ /* Task 4 Function Descriptor Table */ -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0xa0045670, /* mainFunc(), EU# 3 */ -+ 0xa0000000, /* rsduFunc(), EU# 3 */ -+ 0xa0000000, /* crcAccumVal(), EU# 3 */ -+ 0x20000000, /* setCrcAccum(), EU# 3 */ -+ 0x21800000, /* and(), EU# 3 */ -+ 0x21e00000, /* or(), EU# 3 */ -+ 0x20400000, /* add(), EU# 3 */ -+ 0x20500000, /* sub(), EU# 3 */ -+ 0x205a0000, /* andNot(), EU# 3 */ -+ 0x20a00000, /* shiftR(), EU# 3 */ -+ 0x202fa000, /* andReadyBit(), EU# 3 */ -+ 0x202f9000, /* andNotReadyBit(), EU# 3 */ -+ 0x202ea000, /* andWrapBit(), EU# 3 */ -+ 0x202da000, /* andLastBit(), EU# 3 */ -+ 0x202e2000, /* andInterruptBit(), EU# 3 */ -+ 0x202f2000, /* andCrcRestartBit(), EU# 3 */ -+}; -+ -+u32 MCD_funcDescTab5[]= -+{ /* Task 5 Function Descriptor Table */ -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0xa0045670, /* mainFunc(), EU# 3 */ -+ 0xa0000000, /* rsduFunc(), EU# 3 */ -+ 0xa0000000, /* crcAccumVal(), EU# 3 */ -+ 0x20000000, /* setCrcAccum(), EU# 3 */ -+ 0x21800000, /* and(), EU# 3 */ -+ 0x21e00000, /* or(), EU# 3 */ -+ 0x20400000, /* add(), EU# 3 */ -+ 0x20500000, /* sub(), EU# 3 */ -+ 0x205a0000, /* andNot(), EU# 3 */ -+ 0x20a00000, /* shiftR(), EU# 3 */ -+ 0x202fa000, /* andReadyBit(), EU# 3 */ -+ 0x202f9000, /* andNotReadyBit(), EU# 3 */ -+ 0x202ea000, /* andWrapBit(), EU# 3 */ -+ 0x202da000, /* andLastBit(), EU# 3 */ -+ 0x202e2000, /* andInterruptBit(), EU# 3 */ -+ 0x202f2000, /* andCrcRestartBit(), EU# 3 */ -+}; -+ -+u32 MCD_funcDescTab6[]= -+{ /* Task 6 Function Descriptor Table */ -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0xa0045670, /* mainFunc(), EU# 3 */ -+ 0xa0000000, /* rsduFunc(), EU# 3 */ -+ 0xa0000000, /* crcAccumVal(), EU# 3 */ -+ 0x20000000, /* setCrcAccum(), EU# 3 */ -+ 0x21800000, /* and(), EU# 3 */ -+ 0x21e00000, /* or(), EU# 3 */ -+ 0x20400000, /* add(), EU# 3 */ -+ 0x20500000, /* sub(), EU# 3 */ -+ 0x205a0000, /* andNot(), EU# 3 */ -+ 0x20a00000, /* shiftR(), EU# 3 */ -+ 0x202fa000, /* andReadyBit(), EU# 3 */ -+ 0x202f9000, /* andNotReadyBit(), EU# 3 */ -+ 0x202ea000, /* andWrapBit(), EU# 3 */ -+ 0x202da000, /* andLastBit(), EU# 3 */ -+ 0x202e2000, /* andInterruptBit(), EU# 3 */ -+ 0x202f2000, /* andCrcRestartBit(), EU# 3 */ -+}; -+ -+u32 MCD_funcDescTab7[]= -+{ /* Task 7 Function Descriptor Table */ -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0xa0045670, /* mainFunc(), EU# 3 */ -+ 0xa0000000, /* rsduFunc(), EU# 3 */ -+ 0xa0000000, /* crcAccumVal(), EU# 3 */ -+ 0x20000000, /* setCrcAccum(), EU# 3 */ -+ 0x21800000, /* and(), EU# 3 */ -+ 0x21e00000, /* or(), EU# 3 */ -+ 0x20400000, /* add(), EU# 3 */ -+ 0x20500000, /* sub(), EU# 3 */ -+ 0x205a0000, /* andNot(), EU# 3 */ -+ 0x20a00000, /* shiftR(), EU# 3 */ -+ 0x202fa000, /* andReadyBit(), EU# 3 */ -+ 0x202f9000, /* andNotReadyBit(), EU# 3 */ -+ 0x202ea000, /* andWrapBit(), EU# 3 */ -+ 0x202da000, /* andLastBit(), EU# 3 */ -+ 0x202e2000, /* andInterruptBit(), EU# 3 */ -+ 0x202f2000, /* andCrcRestartBit(), EU# 3 */ -+}; -+ -+u32 MCD_funcDescTab8[]= -+{ /* Task 8 Function Descriptor Table */ -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0xa0045670, /* mainFunc(), EU# 3 */ -+ 0xa0000000, /* rsduFunc(), EU# 3 */ -+ 0xa0000000, /* crcAccumVal(), EU# 3 */ -+ 0x20000000, /* setCrcAccum(), EU# 3 */ -+ 0x21800000, /* and(), EU# 3 */ -+ 0x21e00000, /* or(), EU# 3 */ -+ 0x20400000, /* add(), EU# 3 */ -+ 0x20500000, /* sub(), EU# 3 */ -+ 0x205a0000, /* andNot(), EU# 3 */ -+ 0x20a00000, /* shiftR(), EU# 3 */ -+ 0x202fa000, /* andReadyBit(), EU# 3 */ -+ 0x202f9000, /* andNotReadyBit(), EU# 3 */ -+ 0x202ea000, /* andWrapBit(), EU# 3 */ -+ 0x202da000, /* andLastBit(), EU# 3 */ -+ 0x202e2000, /* andInterruptBit(), EU# 3 */ -+ 0x202f2000, /* andCrcRestartBit(), EU# 3 */ -+}; -+ -+u32 MCD_funcDescTab9[]= -+{ /* Task 9 Function Descriptor Table */ -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0xa0045670, /* mainFunc(), EU# 3 */ -+ 0xa0000000, /* rsduFunc(), EU# 3 */ -+ 0xa0000000, /* crcAccumVal(), EU# 3 */ -+ 0x20000000, /* setCrcAccum(), EU# 3 */ -+ 0x21800000, /* and(), EU# 3 */ -+ 0x21e00000, /* or(), EU# 3 */ -+ 0x20400000, /* add(), EU# 3 */ -+ 0x20500000, /* sub(), EU# 3 */ -+ 0x205a0000, /* andNot(), EU# 3 */ -+ 0x20a00000, /* shiftR(), EU# 3 */ -+ 0x202fa000, /* andReadyBit(), EU# 3 */ -+ 0x202f9000, /* andNotReadyBit(), EU# 3 */ -+ 0x202ea000, /* andWrapBit(), EU# 3 */ -+ 0x202da000, /* andLastBit(), EU# 3 */ -+ 0x202e2000, /* andInterruptBit(), EU# 3 */ -+ 0x202f2000, /* andCrcRestartBit(), EU# 3 */ -+}; -+ -+u32 MCD_funcDescTab10[]= -+{ /* Task 10 Function Descriptor Table */ -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0xa0045670, /* mainFunc(), EU# 3 */ -+ 0xa0000000, /* rsduFunc(), EU# 3 */ -+ 0xa0000000, /* crcAccumVal(), EU# 3 */ -+ 0x20000000, /* setCrcAccum(), EU# 3 */ -+ 0x21800000, /* and(), EU# 3 */ -+ 0x21e00000, /* or(), EU# 3 */ -+ 0x20400000, /* add(), EU# 3 */ -+ 0x20500000, /* sub(), EU# 3 */ -+ 0x205a0000, /* andNot(), EU# 3 */ -+ 0x20a00000, /* shiftR(), EU# 3 */ -+ 0x202fa000, /* andReadyBit(), EU# 3 */ -+ 0x202f9000, /* andNotReadyBit(), EU# 3 */ -+ 0x202ea000, /* andWrapBit(), EU# 3 */ -+ 0x202da000, /* andLastBit(), EU# 3 */ -+ 0x202e2000, /* andInterruptBit(), EU# 3 */ -+ 0x202f2000, /* andCrcRestartBit(), EU# 3 */ -+}; -+ -+u32 MCD_funcDescTab11[]= -+{ /* Task 11 Function Descriptor Table */ -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0xa0045670, /* mainFunc(), EU# 3 */ -+ 0xa0000000, /* rsduFunc(), EU# 3 */ -+ 0xa0000000, /* crcAccumVal(), EU# 3 */ -+ 0x20000000, /* setCrcAccum(), EU# 3 */ -+ 0x21800000, /* and(), EU# 3 */ -+ 0x21e00000, /* or(), EU# 3 */ -+ 0x20400000, /* add(), EU# 3 */ -+ 0x20500000, /* sub(), EU# 3 */ -+ 0x205a0000, /* andNot(), EU# 3 */ -+ 0x20a00000, /* shiftR(), EU# 3 */ -+ 0x202fa000, /* andReadyBit(), EU# 3 */ -+ 0x202f9000, /* andNotReadyBit(), EU# 3 */ -+ 0x202ea000, /* andWrapBit(), EU# 3 */ -+ 0x202da000, /* andLastBit(), EU# 3 */ -+ 0x202e2000, /* andInterruptBit(), EU# 3 */ -+ 0x202f2000, /* andCrcRestartBit(), EU# 3 */ -+}; -+ -+u32 MCD_funcDescTab12[]= -+{ /* Task 12 Function Descriptor Table */ -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0xa0045670, /* mainFunc(), EU# 3 */ -+ 0xa0000000, /* rsduFunc(), EU# 3 */ -+ 0xa0000000, /* crcAccumVal(), EU# 3 */ -+ 0x20000000, /* setCrcAccum(), EU# 3 */ -+ 0x21800000, /* and(), EU# 3 */ -+ 0x21e00000, /* or(), EU# 3 */ -+ 0x20400000, /* add(), EU# 3 */ -+ 0x20500000, /* sub(), EU# 3 */ -+ 0x205a0000, /* andNot(), EU# 3 */ -+ 0x20a00000, /* shiftR(), EU# 3 */ -+ 0x202fa000, /* andReadyBit(), EU# 3 */ -+ 0x202f9000, /* andNotReadyBit(), EU# 3 */ -+ 0x202ea000, /* andWrapBit(), EU# 3 */ -+ 0x202da000, /* andLastBit(), EU# 3 */ -+ 0x202e2000, /* andInterruptBit(), EU# 3 */ -+ 0x202f2000, /* andCrcRestartBit(), EU# 3 */ -+}; -+ -+u32 MCD_funcDescTab13[]= -+{ /* Task 13 Function Descriptor Table */ -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0xa0045670, /* mainFunc(), EU# 3 */ -+ 0xa0000000, /* rsduFunc(), EU# 3 */ -+ 0xa0000000, /* crcAccumVal(), EU# 3 */ -+ 0x20000000, /* setCrcAccum(), EU# 3 */ -+ 0x21800000, /* and(), EU# 3 */ -+ 0x21e00000, /* or(), EU# 3 */ -+ 0x20400000, /* add(), EU# 3 */ -+ 0x20500000, /* sub(), EU# 3 */ -+ 0x205a0000, /* andNot(), EU# 3 */ -+ 0x20a00000, /* shiftR(), EU# 3 */ -+ 0x202fa000, /* andReadyBit(), EU# 3 */ -+ 0x202f9000, /* andNotReadyBit(), EU# 3 */ -+ 0x202ea000, /* andWrapBit(), EU# 3 */ -+ 0x202da000, /* andLastBit(), EU# 3 */ -+ 0x202e2000, /* andInterruptBit(), EU# 3 */ -+ 0x202f2000, /* andCrcRestartBit(), EU# 3 */ -+}; -+ -+u32 MCD_funcDescTab14[]= -+{ /* Task 14 Function Descriptor Table */ -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0xa0045670, /* mainFunc(), EU# 3 */ -+ 0xa0000000, /* rsduFunc(), EU# 3 */ -+ 0xa0000000, /* crcAccumVal(), EU# 3 */ -+ 0x20000000, /* setCrcAccum(), EU# 3 */ -+ 0x21800000, /* and(), EU# 3 */ -+ 0x21e00000, /* or(), EU# 3 */ -+ 0x20400000, /* add(), EU# 3 */ -+ 0x20500000, /* sub(), EU# 3 */ -+ 0x205a0000, /* andNot(), EU# 3 */ -+ 0x20a00000, /* shiftR(), EU# 3 */ -+ 0x202fa000, /* andReadyBit(), EU# 3 */ -+ 0x202f9000, /* andNotReadyBit(), EU# 3 */ -+ 0x202ea000, /* andWrapBit(), EU# 3 */ -+ 0x202da000, /* andLastBit(), EU# 3 */ -+ 0x202e2000, /* andInterruptBit(), EU# 3 */ -+ 0x202f2000, /* andCrcRestartBit(), EU# 3 */ -+}; -+ -+u32 MCD_funcDescTab15[]= -+{ /* Task 15 Function Descriptor Table */ -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0xa0045670, /* mainFunc(), EU# 3 */ -+ 0xa0000000, /* rsduFunc(), EU# 3 */ -+ 0xa0000000, /* crcAccumVal(), EU# 3 */ -+ 0x20000000, /* setCrcAccum(), EU# 3 */ -+ 0x21800000, /* and(), EU# 3 */ -+ 0x21e00000, /* or(), EU# 3 */ -+ 0x20400000, /* add(), EU# 3 */ -+ 0x20500000, /* sub(), EU# 3 */ -+ 0x205a0000, /* andNot(), EU# 3 */ -+ 0x20a00000, /* shiftR(), EU# 3 */ -+ 0x202fa000, /* andReadyBit(), EU# 3 */ -+ 0x202f9000, /* andNotReadyBit(), EU# 3 */ -+ 0x202ea000, /* andWrapBit(), EU# 3 */ -+ 0x202da000, /* andLastBit(), EU# 3 */ -+ 0x202e2000, /* andInterruptBit(), EU# 3 */ -+ 0x202f2000, /* andCrcRestartBit(), EU# 3 */ -+}; -+#endif /*MCD_INCLUDE_EU*/ -+ -+u32 MCD_contextSave0[128]; /* Task 0 context save space */ -+u32 MCD_contextSave1[128]; /* Task 1 context save space */ -+u32 MCD_contextSave2[128]; /* Task 2 context save space */ -+u32 MCD_contextSave3[128]; /* Task 3 context save space */ -+u32 MCD_contextSave4[128]; /* Task 4 context save space */ -+u32 MCD_contextSave5[128]; /* Task 5 context save space */ -+u32 MCD_contextSave6[128]; /* Task 6 context save space */ -+u32 MCD_contextSave7[128]; /* Task 7 context save space */ -+u32 MCD_contextSave8[128]; /* Task 8 context save space */ -+u32 MCD_contextSave9[128]; /* Task 9 context save space */ -+u32 MCD_contextSave10[128]; /* Task 10 context save space */ -+u32 MCD_contextSave11[128]; /* Task 11 context save space */ -+u32 MCD_contextSave12[128]; /* Task 12 context save space */ -+u32 MCD_contextSave13[128]; /* Task 13 context save space */ -+u32 MCD_contextSave14[128]; /* Task 14 context save space */ -+u32 MCD_contextSave15[128]; /* Task 15 context save space */ -+ -+u32 MCD_ChainNoEu_TDT[]; -+u32 MCD_SingleNoEu_TDT[]; -+#ifdef MCD_INCLUDE_EU -+u32 MCD_ChainEu_TDT[]; -+u32 MCD_SingleEu_TDT[]; -+#endif -+u32 MCD_ENetRcv_TDT[]; -+u32 MCD_ENetXmit_TDT[]; -+ -+u32 MCD_modelTaskTableSrc[]= -+{ -+ (u32)MCD_ChainNoEu_TDT, -+ (u32)&((u8*)MCD_ChainNoEu_TDT)[0x0000016c], -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ (u32)MCD_SingleNoEu_TDT, -+ (u32)&((u8*)MCD_SingleNoEu_TDT)[0x000000d4], -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+#ifdef MCD_INCLUDE_EU -+ (u32)MCD_ChainEu_TDT, -+ (u32)&((u8*)MCD_ChainEu_TDT)[0x000001b4], -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ (u32)MCD_SingleEu_TDT, -+ (u32)&((u8*)MCD_SingleEu_TDT)[0x00000124], -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+#endif -+ (u32)MCD_ENetRcv_TDT, -+ (u32)&((u8*)MCD_ENetRcv_TDT)[0x000000a4], -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ (u32)MCD_ENetXmit_TDT, -+ (u32)&((u8*)MCD_ENetXmit_TDT)[0x000000d0], -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+ 0x00000000, -+}; -+u32 MCD_ChainNoEu_TDT[]= -+{ -+ 0x80004000, /* 0000(:370): LCDEXT: idx0 = 0x00000000; ; */ -+ 0x8118801b, /* 0004(:370): LCD: idx1 = var2; idx1 once var0; idx1 += inc3 */ -+ 0xb8c60018, /* 0008(:371): LCD: idx2 = *(idx1 + var12); idx2 once var0; idx2 += inc3 */ -+ 0x10002b10, /* 000C(:372): DRD1A: var10 = idx2; FN=0 MORE init=0 WS=0 RS=0 */ -+ 0x7000000d, /* 0010(:373): DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT MORE init=0 WS=0 RS=0 */ -+ 0x018cf89f, /* 0014(:373): DRD2B1: var6 = EU3(); EU3(idx2) */ -+ 0x6000000a, /* 0018(:374): DRD2A: EU0=0 EU1=0 EU2=0 EU3=10 EXT init=0 WS=0 RS=0 */ -+ 0x080cf89f, /* 001C(:374): DRD2B1: idx0 = EU3(); EU3(idx2) */ -+ 0x000001f8, /* 0020(:0): NOP */ -+ 0x98180364, /* 0024(:378): LCD: idx0 = idx0; idx0 == var13; idx0 += inc4 */ -+ 0x8118801b, /* 0028(:380): LCD: idx1 = var2; idx1 once var0; idx1 += inc3 */ -+ 0xf8c6001a, /* 002C(:381): LCDEXT: idx2 = *(idx1 + var12 + 8); idx2 once var0; idx2 += inc3 */ -+ 0xb8c6601b, /* 0030(:382): LCD: idx3 = *(idx1 + var12 + 12); ; idx3 += inc3 */ -+ 0x10002710, /* 0034(:384): DRD1A: var9 = idx2; FN=0 MORE init=0 WS=0 RS=0 */ -+ 0x00000f18, /* 0038(:385): DRD1A: var3 = idx3; FN=0 init=0 WS=0 RS=0 */ -+ 0xb8c6001d, /* 003C(:387): LCD: idx2 = *(idx1 + var12 + 20); idx2 once var0; idx2 += inc3 */ -+ 0x10001310, /* 0040(:388): DRD1A: var4 = idx2; FN=0 MORE init=0 WS=0 RS=0 */ -+ 0x60000007, /* 0044(:389): DRD2A: EU0=0 EU1=0 EU2=0 EU3=7 EXT init=0 WS=0 RS=0 */ -+ 0x014cf88b, /* 0048(:389): DRD2B1: var5 = EU3(); EU3(idx2,var11) */ -+ 0x98c6001c, /* 004C(:391): LCD: idx2 = idx1 + var12 + 4; idx2 once var0; idx2 += inc3 */ -+ 0x00000710, /* 0050(:392): DRD1A: var1 = idx2; FN=0 init=0 WS=0 RS=0 */ -+ 0x98c70018, /* 0054(:393): LCD: idx2 = idx1 + var14; idx2 once var0; idx2 += inc3 */ -+ 0x10001f10, /* 0058(:394): DRD1A: var7 = idx2; FN=0 MORE init=0 WS=0 RS=0 */ -+ 0x0000c818, /* 005C(:395): DRD1A: *idx2 = var3; FN=0 init=0 WS=0 RS=0 */ -+ 0x000001f8, /* 0060(:0): NOP */ -+ 0xc1476018, /* 0064(:399): LCDEXT: idx1 = var2 + var14; ; idx1 += inc3 */ -+ 0xc003231d, /* 0068(:399): LCDEXT: idx2 = var0, idx3 = var6; idx3 == var12; idx2 += inc3, idx3 += inc5 */ -+ 0x811a601b, /* 006C(:400): LCD: idx4 = var2; ; idx4 += inc3 */ -+ 0xc1862102, /* 0070(:403): LCDEXT: idx5 = var3, idx6 = var12; idx6 < var4; idx5 += inc0, idx6 += inc2 */ -+ 0x849be009, /* 0074(:403): LCD: idx7 = var9; ; idx7 += inc1 */ -+ 0x03fed7b8, /* 0078(:406): DRD1A: *idx7; FN=0 init=31 WS=3 RS=3 */ -+ 0xda9b001b, /* 007C(:408): LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */ -+ 0x9b9be01b, /* 0080(:408): LCD: idx7 = idx7; ; idx7 += inc3 */ -+ 0x1000cb20, /* 0084(:409): DRD1A: *idx2 = idx4; FN=0 MORE init=0 WS=0 RS=0 */ -+ 0x70000006, /* 0088(:410): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ -+ 0x088cf88f, /* 008C(:410): DRD2B1: idx2 = EU3(); EU3(idx2,var15) */ -+ 0x1000cb28, /* 0090(:411): DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */ -+ 0x70000006, /* 0094(:412): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ -+ 0x088cf88f, /* 0098(:412): DRD2B1: idx2 = EU3(); EU3(idx2,var15) */ -+ 0x1000cb30, /* 009C(:413): DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */ -+ 0x70000006, /* 00A0(:414): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ -+ 0x088cf88f, /* 00A4(:414): DRD2B1: idx2 = EU3(); EU3(idx2,var15) */ -+ 0x1000cb38, /* 00A8(:415): DRD1A: *idx2 = idx7; FN=0 MORE init=0 WS=0 RS=0 */ -+ 0x0000c728, /* 00AC(:416): DRD1A: *idx1 = idx5; FN=0 init=0 WS=0 RS=0 */ -+ 0x000001f8, /* 00B0(:0): NOP */ -+ 0xc1476018, /* 00B4(:420): LCDEXT: idx1 = var2 + var14; ; idx1 += inc3 */ -+ 0xc003241d, /* 00B8(:420): LCDEXT: idx2 = var0, idx3 = var6; idx3 == var16; idx2 += inc3, idx3 += inc5 */ -+ 0x811a601b, /* 00BC(:421): LCD: idx4 = var2; ; idx4 += inc3 */ -+ 0xda9b001b, /* 00C0(:424): LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */ -+ 0x9b9be01b, /* 00C4(:424): LCD: idx7 = idx7; ; idx7 += inc3 */ -+ 0x0000d3a0, /* 00C8(:425): DRD1A: *idx4; FN=0 init=0 WS=0 RS=0 */ -+ 0xc1862102, /* 00CC(:427): LCDEXT: idx5 = var3, idx6 = var12; idx6 < var4; idx5 += inc0, idx6 += inc2 */ -+ 0x849be009, /* 00D0(:427): LCD: idx7 = var9; ; idx7 += inc1 */ -+ 0x0bfed7b8, /* 00D4(:430): DRD1A: *idx7; FN=0 TFD init=31 WS=3 RS=3 */ -+ 0xda9b001b, /* 00D8(:432): LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */ -+ 0x9b9be01b, /* 00DC(:432): LCD: idx7 = idx7; ; idx7 += inc3 */ -+ 0x1000cb20, /* 00E0(:433): DRD1A: *idx2 = idx4; FN=0 MORE init=0 WS=0 RS=0 */ -+ 0x70000006, /* 00E4(:434): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ -+ 0x088cf88f, /* 00E8(:434): DRD2B1: idx2 = EU3(); EU3(idx2,var15) */ -+ 0x1000cb28, /* 00EC(:435): DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */ -+ 0x70000006, /* 00F0(:436): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ -+ 0x088cf88f, /* 00F4(:436): DRD2B1: idx2 = EU3(); EU3(idx2,var15) */ -+ 0x1000cb30, /* 00F8(:437): DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */ -+ 0x70000006, /* 00FC(:438): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ -+ 0x088cf88f, /* 0100(:438): DRD2B1: idx2 = EU3(); EU3(idx2,var15) */ -+ 0x1000cb38, /* 0104(:439): DRD1A: *idx2 = idx7; FN=0 MORE init=0 WS=0 RS=0 */ -+ 0x0000c728, /* 0108(:440): DRD1A: *idx1 = idx5; FN=0 init=0 WS=0 RS=0 */ -+ 0x000001f8, /* 010C(:0): NOP */ -+ 0x8118801b, /* 0110(:444): LCD: idx1 = var2; idx1 once var0; idx1 += inc3 */ -+ 0xd8c60018, /* 0114(:446): LCDEXT: idx2 = idx1 + var12; idx2 once var0; idx2 += inc3 */ -+ 0x98c6601c, /* 0118(:446): LCD: idx3 = idx1 + var12 + 4; ; idx3 += inc3 */ -+ 0x6000000b, /* 011C(:447): DRD2A: EU0=0 EU1=0 EU2=0 EU3=11 EXT init=0 WS=0 RS=0 */ -+ 0x0c8cfc9f, /* 0120(:447): DRD2B1: *idx2 = EU3(); EU3(*idx2) */ -+ 0x000001f8, /* 0124(:0): NOP */ -+ 0xa146001e, /* 0128(:450): LCD: idx1 = *(var2 + var12 + 24); idx1 once var0; idx1 += inc3 */ -+ 0x10000b08, /* 012C(:451): DRD1A: var2 = idx1; FN=0 MORE init=0 WS=0 RS=0 */ -+ 0x10002050, /* 0130(:452): DRD1A: var8 = var10; FN=0 MORE init=0 WS=0 RS=0 */ -+ 0xb8c60018, /* 0134(:453): LCD: idx2 = *(idx1 + var12); idx2 once var0; idx2 += inc3 */ -+ 0x10002b10, /* 0138(:454): DRD1A: var10 = idx2; FN=0 MORE init=0 WS=0 RS=0 */ -+ 0x7000000a, /* 013C(:455): DRD2A: EU0=0 EU1=0 EU2=0 EU3=10 EXT MORE init=0 WS=0 RS=0 */ -+ 0x080cf89f, /* 0140(:455): DRD2B1: idx0 = EU3(); EU3(idx2) */ -+ 0x6000000d, /* 0144(:456): DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT init=0 WS=0 RS=0 */ -+ 0x018cf89f, /* 0148(:456): DRD2B1: var6 = EU3(); EU3(idx2) */ -+ 0x000001f8, /* 014C(:0): NOP */ -+ 0x8618801b, /* 0150(:462): LCD: idx1 = var12; idx1 once var0; idx1 += inc3 */ -+ 0x7000000e, /* 0154(:463): DRD2A: EU0=0 EU1=0 EU2=0 EU3=14 EXT MORE init=0 WS=0 RS=0 */ -+ 0x084cf21f, /* 0158(:463): DRD2B1: idx1 = EU3(); EU3(var8) */ -+ 0xd8990336, /* 015C(:464): LCDEXT: idx2 = idx1; idx2 > var12; idx2 += inc6 */ -+ 0x8019801b, /* 0160(:464): LCD: idx3 = var0; idx3 once var0; idx3 += inc3 */ -+ 0x040001f8, /* 0164(:465): DRD1A: FN=0 INT init=0 WS=0 RS=0 */ -+ 0x000001f8, /* 0168(:0): NOP */ -+ 0x000001f8, /* 016C(:0): NOP */ -+}; -+u32 MCD_SingleNoEu_TDT[]= -+{ -+ 0x8198001b, /* 0000(:657): LCD: idx0 = var3; idx0 once var0; idx0 += inc3 */ -+ 0x7000000d, /* 0004(:658): DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT MORE init=0 WS=0 RS=0 */ -+ 0x080cf81f, /* 0008(:658): DRD2B1: idx0 = EU3(); EU3(idx0) */ -+ 0x8198801b, /* 000C(:659): LCD: idx1 = var3; idx1 once var0; idx1 += inc3 */ -+ 0x6000000e, /* 0010(:660): DRD2A: EU0=0 EU1=0 EU2=0 EU3=14 EXT init=0 WS=0 RS=0 */ -+ 0x084cf85f, /* 0014(:660): DRD2B1: idx1 = EU3(); EU3(idx1) */ -+ 0x000001f8, /* 0018(:0): NOP */ -+ 0x8298001b, /* 001C(:664): LCD: idx0 = var5; idx0 once var0; idx0 += inc3 */ -+ 0x7000000d, /* 0020(:665): DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT MORE init=0 WS=0 RS=0 */ -+ 0x010cf81f, /* 0024(:665): DRD2B1: var4 = EU3(); EU3(idx0) */ -+ 0x6000000e, /* 0028(:666): DRD2A: EU0=0 EU1=0 EU2=0 EU3=14 EXT init=0 WS=0 RS=0 */ -+ 0x018cf81f, /* 002C(:666): DRD2B1: var6 = EU3(); EU3(idx0) */ -+ 0xc202601b, /* 0030(:669): LCDEXT: idx0 = var4, idx1 = var4; ; idx0 += inc3, idx1 += inc3 */ -+ 0xc002221c, /* 0034(:669): LCDEXT: idx2 = var0, idx3 = var4; idx3 == var8; idx2 += inc3, idx3 += inc4 */ -+ 0x809a601b, /* 0038(:670): LCD: idx4 = var1; ; idx4 += inc3 */ -+ 0xc10420c2, /* 003C(:673): LCDEXT: idx5 = var2, idx6 = var8; idx6 < var3; idx5 += inc0, idx6 += inc2 */ -+ 0x839be009, /* 0040(:673): LCD: idx7 = var7; ; idx7 += inc1 */ -+ 0x03fed7b8, /* 0044(:676): DRD1A: *idx7; FN=0 init=31 WS=3 RS=3 */ -+ 0xda9b001b, /* 0048(:678): LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */ -+ 0x9b9be01b, /* 004C(:678): LCD: idx7 = idx7; ; idx7 += inc3 */ -+ 0x70000006, /* 0050(:680): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ -+ 0x088cf889, /* 0054(:680): DRD2B1: idx2 = EU3(); EU3(idx2,var9) */ -+ 0x1000cb28, /* 0058(:681): DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */ -+ 0x70000006, /* 005C(:682): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ -+ 0x088cf889, /* 0060(:682): DRD2B1: idx2 = EU3(); EU3(idx2,var9) */ -+ 0x1000cb30, /* 0064(:683): DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */ -+ 0x70000006, /* 0068(:684): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ -+ 0x088cf889, /* 006C(:684): DRD2B1: idx2 = EU3(); EU3(idx2,var9) */ -+ 0x0000cb38, /* 0070(:685): DRD1A: *idx2 = idx7; FN=0 init=0 WS=0 RS=0 */ -+ 0x000001f8, /* 0074(:0): NOP */ -+ 0xc202601b, /* 0078(:689): LCDEXT: idx0 = var4, idx1 = var4; ; idx0 += inc3, idx1 += inc3 */ -+ 0xc002229c, /* 007C(:689): LCDEXT: idx2 = var0, idx3 = var4; idx3 == var10; idx2 += inc3, idx3 += inc4 */ -+ 0x809a601b, /* 0080(:690): LCD: idx4 = var1; ; idx4 += inc3 */ -+ 0xda9b001b, /* 0084(:693): LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */ -+ 0x9b9be01b, /* 0088(:693): LCD: idx7 = idx7; ; idx7 += inc3 */ -+ 0x0000d3a0, /* 008C(:694): DRD1A: *idx4; FN=0 init=0 WS=0 RS=0 */ -+ 0xc10420c2, /* 0090(:696): LCDEXT: idx5 = var2, idx6 = var8; idx6 < var3; idx5 += inc0, idx6 += inc2 */ -+ 0x839be009, /* 0094(:696): LCD: idx7 = var7; ; idx7 += inc1 */ -+ 0x0bfed7b8, /* 0098(:699): DRD1A: *idx7; FN=0 TFD init=31 WS=3 RS=3 */ -+ 0xda9b001b, /* 009C(:701): LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */ -+ 0x9b9be01b, /* 00A0(:701): LCD: idx7 = idx7; ; idx7 += inc3 */ -+ 0x70000006, /* 00A4(:703): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ -+ 0x088cf889, /* 00A8(:703): DRD2B1: idx2 = EU3(); EU3(idx2,var9) */ -+ 0x1000cb28, /* 00AC(:704): DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */ -+ 0x70000006, /* 00B0(:705): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ -+ 0x088cf889, /* 00B4(:705): DRD2B1: idx2 = EU3(); EU3(idx2,var9) */ -+ 0x1000cb30, /* 00B8(:706): DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */ -+ 0x70000006, /* 00BC(:707): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ -+ 0x088cf889, /* 00C0(:707): DRD2B1: idx2 = EU3(); EU3(idx2,var9) */ -+ 0x0000cb38, /* 00C4(:708): DRD1A: *idx2 = idx7; FN=0 init=0 WS=0 RS=0 */ -+ 0x000001f8, /* 00C8(:0): NOP */ -+ 0xc318022d, /* 00CC(:712): LCDEXT: idx0 = var6; idx0 > var8; idx0 += inc5 */ -+ 0x8018801b, /* 00D0(:712): LCD: idx1 = var0; idx1 once var0; idx1 += inc3 */ -+ 0x040001f8, /* 00D4(:713): DRD1A: FN=0 INT init=0 WS=0 RS=0 */ -+}; -+#ifdef MCD_INCLUDE_EU -+u32 MCD_ChainEu_TDT[]= -+{ -+ 0x80004000, /* 0000(:947): LCDEXT: idx0 = 0x00000000; ; */ -+ 0x8198801b, /* 0004(:947): LCD: idx1 = var3; idx1 once var0; idx1 += inc3 */ -+ 0xb8c68018, /* 0008(:948): LCD: idx2 = *(idx1 + var13); idx2 once var0; idx2 += inc3 */ -+ 0x10002f10, /* 000C(:949): DRD1A: var11 = idx2; FN=0 MORE init=0 WS=0 RS=0 */ -+ 0x7000000d, /* 0010(:950): DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT MORE init=0 WS=0 RS=0 */ -+ 0x01ccf89f, /* 0014(:950): DRD2B1: var7 = EU3(); EU3(idx2) */ -+ 0x6000000a, /* 0018(:951): DRD2A: EU0=0 EU1=0 EU2=0 EU3=10 EXT init=0 WS=0 RS=0 */ -+ 0x080cf89f, /* 001C(:951): DRD2B1: idx0 = EU3(); EU3(idx2) */ -+ 0x000001f8, /* 0020(:0): NOP */ -+ 0x981803a4, /* 0024(:955): LCD: idx0 = idx0; idx0 == var14; idx0 += inc4 */ -+ 0x8198801b, /* 0028(:957): LCD: idx1 = var3; idx1 once var0; idx1 += inc3 */ -+ 0xf8c6801a, /* 002C(:958): LCDEXT: idx2 = *(idx1 + var13 + 8); idx2 once var0; idx2 += inc3 */ -+ 0xb8c6e01b, /* 0030(:959): LCD: idx3 = *(idx1 + var13 + 12); ; idx3 += inc3 */ -+ 0x10002b10, /* 0034(:961): DRD1A: var10 = idx2; FN=0 MORE init=0 WS=0 RS=0 */ -+ 0x00001318, /* 0038(:962): DRD1A: var4 = idx3; FN=0 init=0 WS=0 RS=0 */ -+ 0xb8c6801d, /* 003C(:964): LCD: idx2 = *(idx1 + var13 + 20); idx2 once var0; idx2 += inc3 */ -+ 0x10001710, /* 0040(:965): DRD1A: var5 = idx2; FN=0 MORE init=0 WS=0 RS=0 */ -+ 0x60000007, /* 0044(:966): DRD2A: EU0=0 EU1=0 EU2=0 EU3=7 EXT init=0 WS=0 RS=0 */ -+ 0x018cf88c, /* 0048(:966): DRD2B1: var6 = EU3(); EU3(idx2,var12) */ -+ 0x98c6801c, /* 004C(:968): LCD: idx2 = idx1 + var13 + 4; idx2 once var0; idx2 += inc3 */ -+ 0x00000b10, /* 0050(:969): DRD1A: var2 = idx2; FN=0 init=0 WS=0 RS=0 */ -+ 0x98c78018, /* 0054(:970): LCD: idx2 = idx1 + var15; idx2 once var0; idx2 += inc3 */ -+ 0x10002310, /* 0058(:971): DRD1A: var8 = idx2; FN=0 MORE init=0 WS=0 RS=0 */ -+ 0x0000c820, /* 005C(:972): DRD1A: *idx2 = var4; FN=0 init=0 WS=0 RS=0 */ -+ 0x000001f8, /* 0060(:0): NOP */ -+ 0x8698801b, /* 0064(:976): LCD: idx1 = var13; idx1 once var0; idx1 += inc3 */ -+ 0x7000000f, /* 0068(:977): DRD2A: EU0=0 EU1=0 EU2=0 EU3=15 EXT MORE init=0 WS=0 RS=0 */ -+ 0x084cf2df, /* 006C(:977): DRD2B1: idx1 = EU3(); EU3(var11) */ -+ 0xd899042d, /* 0070(:978): LCDEXT: idx2 = idx1; idx2 >= var16; idx2 += inc5 */ -+ 0x8019801b, /* 0074(:978): LCD: idx3 = var0; idx3 once var0; idx3 += inc3 */ -+ 0x60000003, /* 0078(:979): DRD2A: EU0=0 EU1=0 EU2=0 EU3=3 EXT init=0 WS=0 RS=0 */ -+ 0x2cd7c7df, /* 007C(:979): DRD2B2: EU3(var13) */ -+ 0xd8990364, /* 0080(:980): LCDEXT: idx2 = idx1; idx2 == var13; idx2 += inc4 */ -+ 0x8019801b, /* 0084(:980): LCD: idx3 = var0; idx3 once var0; idx3 += inc3 */ -+ 0x60000003, /* 0088(:981): DRD2A: EU0=0 EU1=0 EU2=0 EU3=3 EXT init=0 WS=0 RS=0 */ -+ 0x2c17c7df, /* 008C(:981): DRD2B2: EU3(var1) */ -+ 0x000001f8, /* 0090(:0): NOP */ -+ 0xc1c7e018, /* 0094(:984): LCDEXT: idx1 = var3 + var15; ; idx1 += inc3 */ -+ 0xc003a35e, /* 0098(:984): LCDEXT: idx2 = var0, idx3 = var7; idx3 == var13; idx2 += inc3, idx3 += inc6 */ -+ 0x819a601b, /* 009C(:985): LCD: idx4 = var3; ; idx4 += inc3 */ -+ 0xc206a142, /* 00A0(:988): LCDEXT: idx5 = var4, idx6 = var13; idx6 < var5; idx5 += inc0, idx6 += inc2 */ -+ 0x851be009, /* 00A4(:988): LCD: idx7 = var10; ; idx7 += inc1 */ -+ 0x63fe0000, /* 00A8(:991): DRD2A: EU0=0 EU1=0 EU2=0 EU3=0 EXT init=31 WS=3 RS=3 */ -+ 0x0d4cfddf, /* 00AC(:991): DRD2B1: *idx5 = EU3(); EU3(*idx7) */ -+ 0xda9b001b, /* 00B0(:993): LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */ -+ 0x9b9be01b, /* 00B4(:993): LCD: idx7 = idx7; ; idx7 += inc3 */ -+ 0x70000002, /* 00B8(:994): DRD2A: EU0=0 EU1=0 EU2=0 EU3=2 EXT MORE init=0 WS=0 RS=0 */ -+ 0x004cf81f, /* 00BC(:994): DRD2B1: var1 = EU3(); EU3(idx0) */ -+ 0x1000cb20, /* 00C0(:995): DRD1A: *idx2 = idx4; FN=0 MORE init=0 WS=0 RS=0 */ -+ 0x70000006, /* 00C4(:996): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ -+ 0x088cf891, /* 00C8(:996): DRD2B1: idx2 = EU3(); EU3(idx2,var17) */ -+ 0x1000cb28, /* 00CC(:997): DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */ -+ 0x70000006, /* 00D0(:998): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ -+ 0x088cf891, /* 00D4(:998): DRD2B1: idx2 = EU3(); EU3(idx2,var17) */ -+ 0x1000cb30, /* 00D8(:999): DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */ -+ 0x70000006, /* 00DC(:1000): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ -+ 0x088cf891, /* 00E0(:1000): DRD2B1: idx2 = EU3(); EU3(idx2,var17) */ -+ 0x1000cb38, /* 00E4(:1001): DRD1A: *idx2 = idx7; FN=0 MORE init=0 WS=0 RS=0 */ -+ 0x0000c728, /* 00E8(:1002): DRD1A: *idx1 = idx5; FN=0 init=0 WS=0 RS=0 */ -+ 0x000001f8, /* 00EC(:0): NOP */ -+ 0xc1c7e018, /* 00F0(:1006): LCDEXT: idx1 = var3 + var15; ; idx1 += inc3 */ -+ 0xc003a49e, /* 00F4(:1006): LCDEXT: idx2 = var0, idx3 = var7; idx3 == var18; idx2 += inc3, idx3 += inc6 */ -+ 0x819a601b, /* 00F8(:1007): LCD: idx4 = var3; ; idx4 += inc3 */ -+ 0xda9b001b, /* 00FC(:1010): LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */ -+ 0x9b9be01b, /* 0100(:1010): LCD: idx7 = idx7; ; idx7 += inc3 */ -+ 0x0000d3a0, /* 0104(:1011): DRD1A: *idx4; FN=0 init=0 WS=0 RS=0 */ -+ 0xc206a142, /* 0108(:1013): LCDEXT: idx5 = var4, idx6 = var13; idx6 < var5; idx5 += inc0, idx6 += inc2 */ -+ 0x851be009, /* 010C(:1013): LCD: idx7 = var10; ; idx7 += inc1 */ -+ 0x6bfe0000, /* 0110(:1016): DRD2A: EU0=0 EU1=0 EU2=0 EU3=0 TFD EXT init=31 WS=3 RS=3 */ -+ 0x0d4cfddf, /* 0114(:1016): DRD2B1: *idx5 = EU3(); EU3(*idx7) */ -+ 0xda9b001b, /* 0118(:1018): LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */ -+ 0x9b9be01b, /* 011C(:1018): LCD: idx7 = idx7; ; idx7 += inc3 */ -+ 0x70000002, /* 0120(:1019): DRD2A: EU0=0 EU1=0 EU2=0 EU3=2 EXT MORE init=0 WS=0 RS=0 */ -+ 0x004cf81f, /* 0124(:1019): DRD2B1: var1 = EU3(); EU3(idx0) */ -+ 0x1000cb20, /* 0128(:1020): DRD1A: *idx2 = idx4; FN=0 MORE init=0 WS=0 RS=0 */ -+ 0x70000006, /* 012C(:1021): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ -+ 0x088cf891, /* 0130(:1021): DRD2B1: idx2 = EU3(); EU3(idx2,var17) */ -+ 0x1000cb28, /* 0134(:1022): DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */ -+ 0x70000006, /* 0138(:1023): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ -+ 0x088cf891, /* 013C(:1023): DRD2B1: idx2 = EU3(); EU3(idx2,var17) */ -+ 0x1000cb30, /* 0140(:1024): DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */ -+ 0x70000006, /* 0144(:1025): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ -+ 0x088cf891, /* 0148(:1025): DRD2B1: idx2 = EU3(); EU3(idx2,var17) */ -+ 0x1000cb38, /* 014C(:1026): DRD1A: *idx2 = idx7; FN=0 MORE init=0 WS=0 RS=0 */ -+ 0x0000c728, /* 0150(:1027): DRD1A: *idx1 = idx5; FN=0 init=0 WS=0 RS=0 */ -+ 0x000001f8, /* 0154(:0): NOP */ -+ 0x8198801b, /* 0158(:1031): LCD: idx1 = var3; idx1 once var0; idx1 += inc3 */ -+ 0xd8c68018, /* 015C(:1033): LCDEXT: idx2 = idx1 + var13; idx2 once var0; idx2 += inc3 */ -+ 0x98c6e01c, /* 0160(:1033): LCD: idx3 = idx1 + var13 + 4; ; idx3 += inc3 */ -+ 0x6000000b, /* 0164(:1034): DRD2A: EU0=0 EU1=0 EU2=0 EU3=11 EXT init=0 WS=0 RS=0 */ -+ 0x0c8cfc9f, /* 0168(:1034): DRD2B1: *idx2 = EU3(); EU3(*idx2) */ -+ 0x0000cc08, /* 016C(:1035): DRD1A: *idx3 = var1; FN=0 init=0 WS=0 RS=0 */ -+ 0xa1c6801e, /* 0170(:1038): LCD: idx1 = *(var3 + var13 + 24); idx1 once var0; idx1 += inc3 */ -+ 0x10000f08, /* 0174(:1039): DRD1A: var3 = idx1; FN=0 MORE init=0 WS=0 RS=0 */ -+ 0x10002458, /* 0178(:1040): DRD1A: var9 = var11; FN=0 MORE init=0 WS=0 RS=0 */ -+ 0xb8c68018, /* 017C(:1041): LCD: idx2 = *(idx1 + var13); idx2 once var0; idx2 += inc3 */ -+ 0x10002f10, /* 0180(:1042): DRD1A: var11 = idx2; FN=0 MORE init=0 WS=0 RS=0 */ -+ 0x7000000a, /* 0184(:1043): DRD2A: EU0=0 EU1=0 EU2=0 EU3=10 EXT MORE init=0 WS=0 RS=0 */ -+ 0x080cf89f, /* 0188(:1043): DRD2B1: idx0 = EU3(); EU3(idx2) */ -+ 0x6000000d, /* 018C(:1044): DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT init=0 WS=0 RS=0 */ -+ 0x01ccf89f, /* 0190(:1044): DRD2B1: var7 = EU3(); EU3(idx2) */ -+ 0x000001f8, /* 0194(:0): NOP */ -+ 0x8698801b, /* 0198(:1050): LCD: idx1 = var13; idx1 once var0; idx1 += inc3 */ -+ 0x7000000e, /* 019C(:1051): DRD2A: EU0=0 EU1=0 EU2=0 EU3=14 EXT MORE init=0 WS=0 RS=0 */ -+ 0x084cf25f, /* 01A0(:1051): DRD2B1: idx1 = EU3(); EU3(var9) */ -+ 0xd899037f, /* 01A4(:1052): LCDEXT: idx2 = idx1; idx2 > var13; idx2 += inc7 */ -+ 0x8019801b, /* 01A8(:1052): LCD: idx3 = var0; idx3 once var0; idx3 += inc3 */ -+ 0x040001f8, /* 01AC(:1053): DRD1A: FN=0 INT init=0 WS=0 RS=0 */ -+ 0x000001f8, /* 01B0(:0): NOP */ -+ 0x000001f8, /* 01B4(:0): NOP */ -+}; -+u32 MCD_SingleEu_TDT[]= -+{ -+ 0x8218001b, /* 0000(:1248): LCD: idx0 = var4; idx0 once var0; idx0 += inc3 */ -+ 0x7000000d, /* 0004(:1249): DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT MORE init=0 WS=0 RS=0 */ -+ 0x080cf81f, /* 0008(:1249): DRD2B1: idx0 = EU3(); EU3(idx0) */ -+ 0x8218801b, /* 000C(:1250): LCD: idx1 = var4; idx1 once var0; idx1 += inc3 */ -+ 0x6000000e, /* 0010(:1251): DRD2A: EU0=0 EU1=0 EU2=0 EU3=14 EXT init=0 WS=0 RS=0 */ -+ 0x084cf85f, /* 0014(:1251): DRD2B1: idx1 = EU3(); EU3(idx1) */ -+ 0x000001f8, /* 0018(:0): NOP */ -+ 0x8318001b, /* 001C(:1255): LCD: idx0 = var6; idx0 once var0; idx0 += inc3 */ -+ 0x7000000d, /* 0020(:1256): DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT MORE init=0 WS=0 RS=0 */ -+ 0x014cf81f, /* 0024(:1256): DRD2B1: var5 = EU3(); EU3(idx0) */ -+ 0x6000000e, /* 0028(:1257): DRD2A: EU0=0 EU1=0 EU2=0 EU3=14 EXT init=0 WS=0 RS=0 */ -+ 0x01ccf81f, /* 002C(:1257): DRD2B1: var7 = EU3(); EU3(idx0) */ -+ 0x8498001b, /* 0030(:1260): LCD: idx0 = var9; idx0 once var0; idx0 += inc3 */ -+ 0x7000000f, /* 0034(:1261): DRD2A: EU0=0 EU1=0 EU2=0 EU3=15 EXT MORE init=0 WS=0 RS=0 */ -+ 0x080cf19f, /* 0038(:1261): DRD2B1: idx0 = EU3(); EU3(var6) */ -+ 0xd81882a4, /* 003C(:1262): LCDEXT: idx1 = idx0; idx1 >= var10; idx1 += inc4 */ -+ 0x8019001b, /* 0040(:1262): LCD: idx2 = var0; idx2 once var0; idx2 += inc3 */ -+ 0x60000003, /* 0044(:1263): DRD2A: EU0=0 EU1=0 EU2=0 EU3=3 EXT init=0 WS=0 RS=0 */ -+ 0x2c97c7df, /* 0048(:1263): DRD2B2: EU3(var9) */ -+ 0xd818826d, /* 004C(:1264): LCDEXT: idx1 = idx0; idx1 == var9; idx1 += inc5 */ -+ 0x8019001b, /* 0050(:1264): LCD: idx2 = var0; idx2 once var0; idx2 += inc3 */ -+ 0x60000003, /* 0054(:1265): DRD2A: EU0=0 EU1=0 EU2=0 EU3=3 EXT init=0 WS=0 RS=0 */ -+ 0x2c17c7df, /* 0058(:1265): DRD2B2: EU3(var1) */ -+ 0x000001f8, /* 005C(:0): NOP */ -+ 0xc282e01b, /* 0060(:1268): LCDEXT: idx0 = var5, idx1 = var5; ; idx0 += inc3, idx1 += inc3 */ -+ 0xc002a25e, /* 0064(:1268): LCDEXT: idx2 = var0, idx3 = var5; idx3 == var9; idx2 += inc3, idx3 += inc6 */ -+ 0x811a601b, /* 0068(:1269): LCD: idx4 = var2; ; idx4 += inc3 */ -+ 0xc184a102, /* 006C(:1272): LCDEXT: idx5 = var3, idx6 = var9; idx6 < var4; idx5 += inc0, idx6 += inc2 */ -+ 0x841be009, /* 0070(:1272): LCD: idx7 = var8; ; idx7 += inc1 */ -+ 0x63fe0000, /* 0074(:1275): DRD2A: EU0=0 EU1=0 EU2=0 EU3=0 EXT init=31 WS=3 RS=3 */ -+ 0x0d4cfddf, /* 0078(:1275): DRD2B1: *idx5 = EU3(); EU3(*idx7) */ -+ 0xda9b001b, /* 007C(:1277): LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */ -+ 0x9b9be01b, /* 0080(:1277): LCD: idx7 = idx7; ; idx7 += inc3 */ -+ 0x70000002, /* 0084(:1279): DRD2A: EU0=0 EU1=0 EU2=0 EU3=2 EXT MORE init=0 WS=0 RS=0 */ -+ 0x004cf99f, /* 0088(:1279): DRD2B1: var1 = EU3(); EU3(idx6) */ -+ 0x70000006, /* 008C(:1280): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ -+ 0x088cf88b, /* 0090(:1280): DRD2B1: idx2 = EU3(); EU3(idx2,var11) */ -+ 0x1000cb28, /* 0094(:1281): DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */ -+ 0x70000006, /* 0098(:1282): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ -+ 0x088cf88b, /* 009C(:1282): DRD2B1: idx2 = EU3(); EU3(idx2,var11) */ -+ 0x1000cb30, /* 00A0(:1283): DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */ -+ 0x70000006, /* 00A4(:1284): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ -+ 0x088cf88b, /* 00A8(:1284): DRD2B1: idx2 = EU3(); EU3(idx2,var11) */ -+ 0x0000cb38, /* 00AC(:1285): DRD1A: *idx2 = idx7; FN=0 init=0 WS=0 RS=0 */ -+ 0x000001f8, /* 00B0(:0): NOP */ -+ 0xc282e01b, /* 00B4(:1289): LCDEXT: idx0 = var5, idx1 = var5; ; idx0 += inc3, idx1 += inc3 */ -+ 0xc002a31e, /* 00B8(:1289): LCDEXT: idx2 = var0, idx3 = var5; idx3 == var12; idx2 += inc3, idx3 += inc6 */ -+ 0x811a601b, /* 00BC(:1290): LCD: idx4 = var2; ; idx4 += inc3 */ -+ 0xda9b001b, /* 00C0(:1293): LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */ -+ 0x9b9be01b, /* 00C4(:1293): LCD: idx7 = idx7; ; idx7 += inc3 */ -+ 0x0000d3a0, /* 00C8(:1294): DRD1A: *idx4; FN=0 init=0 WS=0 RS=0 */ -+ 0xc184a102, /* 00CC(:1296): LCDEXT: idx5 = var3, idx6 = var9; idx6 < var4; idx5 += inc0, idx6 += inc2 */ -+ 0x841be009, /* 00D0(:1296): LCD: idx7 = var8; ; idx7 += inc1 */ -+ 0x6bfe0000, /* 00D4(:1299): DRD2A: EU0=0 EU1=0 EU2=0 EU3=0 TFD EXT init=31 WS=3 RS=3 */ -+ 0x0d4cfddf, /* 00D8(:1299): DRD2B1: *idx5 = EU3(); EU3(*idx7) */ -+ 0xda9b001b, /* 00DC(:1301): LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */ -+ 0x9b9be01b, /* 00E0(:1301): LCD: idx7 = idx7; ; idx7 += inc3 */ -+ 0x70000002, /* 00E4(:1303): DRD2A: EU0=0 EU1=0 EU2=0 EU3=2 EXT MORE init=0 WS=0 RS=0 */ -+ 0x004cf99f, /* 00E8(:1303): DRD2B1: var1 = EU3(); EU3(idx6) */ -+ 0x70000006, /* 00EC(:1304): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ -+ 0x088cf88b, /* 00F0(:1304): DRD2B1: idx2 = EU3(); EU3(idx2,var11) */ -+ 0x1000cb28, /* 00F4(:1305): DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */ -+ 0x70000006, /* 00F8(:1306): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ -+ 0x088cf88b, /* 00FC(:1306): DRD2B1: idx2 = EU3(); EU3(idx2,var11) */ -+ 0x1000cb30, /* 0100(:1307): DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */ -+ 0x70000006, /* 0104(:1308): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ -+ 0x088cf88b, /* 0108(:1308): DRD2B1: idx2 = EU3(); EU3(idx2,var11) */ -+ 0x0000cb38, /* 010C(:1309): DRD1A: *idx2 = idx7; FN=0 init=0 WS=0 RS=0 */ -+ 0x000001f8, /* 0110(:0): NOP */ -+ 0x8144801c, /* 0114(:1312): LCD: idx0 = var2 + var9 + 4; idx0 once var0; idx0 += inc3 */ -+ 0x0000c008, /* 0118(:1313): DRD1A: *idx0 = var1; FN=0 init=0 WS=0 RS=0 */ -+ 0xc398027f, /* 011C(:1315): LCDEXT: idx0 = var7; idx0 > var9; idx0 += inc7 */ -+ 0x8018801b, /* 0120(:1315): LCD: idx1 = var0; idx1 once var0; idx1 += inc3 */ -+ 0x040001f8, /* 0124(:1316): DRD1A: FN=0 INT init=0 WS=0 RS=0 */ -+}; -+#endif -+u32 MCD_ENetRcv_TDT[]= -+{ -+ 0x80004000, /* 0000(:1389): LCDEXT: idx0 = 0x00000000; ; */ -+ 0x81988000, /* 0004(:1389): LCD: idx1 = var3; idx1 once var0; idx1 += inc0 */ -+ 0x10000788, /* 0008(:1390): DRD1A: var1 = *idx1; FN=0 MORE init=0 WS=0 RS=0 */ -+ 0x6000000a, /* 000C(:1391): DRD2A: EU0=0 EU1=0 EU2=0 EU3=10 EXT init=0 WS=0 RS=0 */ -+ 0x080cf05f, /* 0010(:1391): DRD2B1: idx0 = EU3(); EU3(var1) */ -+ 0x98180209, /* 0014(:1394): LCD: idx0 = idx0; idx0 != var8; idx0 += inc1 */ -+ 0x81c40004, /* 0018(:1396): LCD: idx1 = var3 + var8 + 4; idx1 once var0; idx1 += inc0 */ -+ 0x7000000e, /* 001C(:1397): DRD2A: EU0=0 EU1=0 EU2=0 EU3=14 EXT MORE init=0 WS=0 RS=0 */ -+ 0x010cf05f, /* 0020(:1397): DRD2B1: var4 = EU3(); EU3(var1) */ -+ 0x7000000c, /* 0024(:1398): DRD2A: EU0=0 EU1=0 EU2=0 EU3=12 EXT MORE init=0 WS=0 RS=0 */ -+ 0x01ccf05f, /* 0028(:1398): DRD2B1: var7 = EU3(); EU3(var1) */ -+ 0x70000004, /* 002C(:1399): DRD2A: EU0=0 EU1=0 EU2=0 EU3=4 EXT MORE init=0 WS=0 RS=0 */ -+ 0x014cf049, /* 0030(:1399): DRD2B1: var5 = EU3(); EU3(var1,var9) */ -+ 0x70000004, /* 0034(:1400): DRD2A: EU0=0 EU1=0 EU2=0 EU3=4 EXT MORE init=0 WS=0 RS=0 */ -+ 0x004cf04a, /* 0038(:1400): DRD2B1: var1 = EU3(); EU3(var1,var10) */ -+ 0x00000b88, /* 003C(:1403): DRD1A: var2 = *idx1; FN=0 init=0 WS=0 RS=0 */ -+ 0xc4030150, /* 0040(:1406): LCDEXT: idx1 = var8, idx2 = var6; idx1 < var5; idx1 += inc2, idx2 += inc0 */ -+ 0x8119e012, /* 0044(:1406): LCD: idx3 = var2; ; idx3 += inc2 */ -+ 0x03e0cf90, /* 0048(:1409): DRD1A: *idx3 = *idx2; FN=0 init=31 WS=0 RS=0 */ -+ 0x81188000, /* 004C(:1412): LCD: idx1 = var2; idx1 once var0; idx1 += inc0 */ -+ 0x000ac788, /* 0050(:1413): DRD1A: *idx1 = *idx1; FN=0 init=0 WS=1 RS=1 */ -+ 0xc4030000, /* 0054(:1415): LCDEXT: idx1 = var8, idx2 = var6; idx1 once var0; idx1 += inc0, idx2 += inc0 */ -+ 0x8199e000, /* 0058(:1415): LCD: idx3 = var3; ; idx3 += inc0 */ -+ 0x63e00004, /* 005C(:1418): DRD2A: EU0=0 EU1=0 EU2=0 EU3=4 EXT init=31 WS=0 RS=0 */ -+ 0x084cfc8b, /* 0060(:1418): DRD2B1: idx1 = EU3(); EU3(*idx2,var11) */ -+ 0xd8990000, /* 0064(:1421): LCDEXT: idx1 = idx1, idx2 = idx2; idx1 once var0; idx1 += inc0, idx2 += inc0 */ -+ 0x9999e000, /* 0068(:1421): LCD: idx3 = idx3; ; idx3 += inc0 */ -+ 0x60000005, /* 006C(:1422): DRD2A: EU0=0 EU1=0 EU2=0 EU3=5 EXT init=0 WS=0 RS=0 */ -+ 0x0cccf841, /* 0070(:1422): DRD2B1: *idx3 = EU3(); EU3(idx1,var1) */ -+ 0x81c60000, /* 0074(:1427): LCD: idx1 = var3 + var12; idx1 once var0; idx1 += inc0 */ -+ 0xc399021b, /* 0078(:1429): LCDEXT: idx2 = var7; idx2 > var8; idx2 += inc3 */ -+ 0x80198000, /* 007C(:1429): LCD: idx3 = var0; idx3 once var0; idx3 += inc0 */ -+ 0x00008400, /* 0080(:1430): DRD1A: idx1 = var0; FN=0 init=0 WS=0 RS=0 */ -+ 0x00000f08, /* 0084(:1431): DRD1A: var3 = idx1; FN=0 init=0 WS=0 RS=0 */ -+ 0x81988000, /* 0088(:1434): LCD: idx1 = var3; idx1 once var0; idx1 += inc0 */ -+ 0x10000788, /* 008C(:1435): DRD1A: var1 = *idx1; FN=0 MORE init=0 WS=0 RS=0 */ -+ 0x6000000a, /* 0090(:1436): DRD2A: EU0=0 EU1=0 EU2=0 EU3=10 EXT init=0 WS=0 RS=0 */ -+ 0x080cf05f, /* 0094(:1436): DRD2B1: idx0 = EU3(); EU3(var1) */ -+ 0xc2188209, /* 0098(:1439): LCDEXT: idx1 = var4; idx1 != var8; idx1 += inc1 */ -+ 0x80190000, /* 009C(:1439): LCD: idx2 = var0; idx2 once var0; idx2 += inc0 */ -+ 0x040001f8, /* 00A0(:1440): DRD1A: FN=0 INT init=0 WS=0 RS=0 */ -+ 0x000001f8, /* 00A4(:0): NOP */ -+}; -+u32 MCD_ENetXmit_TDT[]= -+{ -+ 0x80004000, /* 0000(:1515): LCDEXT: idx0 = 0x00000000; ; */ -+ 0x81988000, /* 0004(:1515): LCD: idx1 = var3; idx1 once var0; idx1 += inc0 */ -+ 0x10000788, /* 0008(:1516): DRD1A: var1 = *idx1; FN=0 MORE init=0 WS=0 RS=0 */ -+ 0x6000000a, /* 000C(:1517): DRD2A: EU0=0 EU1=0 EU2=0 EU3=10 EXT init=0 WS=0 RS=0 */ -+ 0x080cf05f, /* 0010(:1517): DRD2B1: idx0 = EU3(); EU3(var1) */ -+ 0x98180309, /* 0014(:1520): LCD: idx0 = idx0; idx0 != var12; idx0 += inc1 */ -+ 0x80004003, /* 0018(:1522): LCDEXT: idx1 = 0x00000003; ; */ -+ 0x81c60004, /* 001C(:1522): LCD: idx2 = var3 + var12 + 4; idx2 once var0; idx2 += inc0 */ -+ 0x7000000e, /* 0020(:1523): DRD2A: EU0=0 EU1=0 EU2=0 EU3=14 EXT MORE init=0 WS=0 RS=0 */ -+ 0x014cf05f, /* 0024(:1523): DRD2B1: var5 = EU3(); EU3(var1) */ -+ 0x7000000c, /* 0028(:1524): DRD2A: EU0=0 EU1=0 EU2=0 EU3=12 EXT MORE init=0 WS=0 RS=0 */ -+ 0x028cf05f, /* 002C(:1524): DRD2B1: var10 = EU3(); EU3(var1) */ -+ 0x7000000d, /* 0030(:1525): DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT MORE init=0 WS=0 RS=0 */ -+ 0x018cf05f, /* 0034(:1525): DRD2B1: var6 = EU3(); EU3(var1) */ -+ 0x70000004, /* 0038(:1526): DRD2A: EU0=0 EU1=0 EU2=0 EU3=4 EXT MORE init=0 WS=0 RS=0 */ -+ 0x01ccf04d, /* 003C(:1526): DRD2B1: var7 = EU3(); EU3(var1,var13) */ -+ 0x10000b90, /* 0040(:1527): DRD1A: var2 = *idx2; FN=0 MORE init=0 WS=0 RS=0 */ -+ 0x60000004, /* 0044(:1528): DRD2A: EU0=0 EU1=0 EU2=0 EU3=4 EXT init=0 WS=0 RS=0 */ -+ 0x020cf0a1, /* 0048(:1528): DRD2B1: var8 = EU3(); EU3(var2,idx1) */ -+ 0xc3188312, /* 004C(:1531): LCDEXT: idx1 = var6; idx1 > var12; idx1 += inc2 */ -+ 0x83c70000, /* 0050(:1531): LCD: idx2 = var7 + var14; idx2 once var0; idx2 += inc0 */ -+ 0x00001f10, /* 0054(:1532): DRD1A: var7 = idx2; FN=0 init=0 WS=0 RS=0 */ -+ 0xc583a3c3, /* 0058(:1534): LCDEXT: idx1 = var11, idx2 = var7; idx2 >= var15; idx1 += inc0, idx2 += inc3 */ -+ 0x81042325, /* 005C(:1534): LCD: idx3 = var2, idx4 = var8; idx4 == var12; idx3 += inc4, idx4 += inc5 */ -+ 0x03e0c798, /* 0060(:1539): DRD1A: *idx1 = *idx3; FN=0 init=31 WS=0 RS=0 */ -+ 0xd8990000, /* 0064(:1542): LCDEXT: idx1 = idx1, idx2 = idx2; idx1 once var0; idx1 += inc0, idx2 += inc0 */ -+ 0x9999e000, /* 0068(:1542): LCD: idx3 = idx3; ; idx3 += inc0 */ -+ 0x000acf98, /* 006C(:1543): DRD1A: *idx3 = *idx3; FN=0 init=0 WS=1 RS=1 */ -+ 0xd8992306, /* 0070(:1545): LCDEXT: idx1 = idx1, idx2 = idx2; idx2 > var12; idx1 += inc0, idx2 += inc6 */ -+ 0x9999e03f, /* 0074(:1545): LCD: idx3 = idx3; ; idx3 += inc7 */ -+ 0x03eac798, /* 0078(:1548): DRD1A: *idx1 = *idx3; FN=0 init=31 WS=1 RS=1 */ -+ 0xd8990000, /* 007C(:1551): LCDEXT: idx1 = idx1, idx2 = idx2; idx1 once var0; idx1 += inc0, idx2 += inc0 */ -+ 0x9999e000, /* 0080(:1551): LCD: idx3 = idx3; ; idx3 += inc0 */ -+ 0x000acf98, /* 0084(:1552): DRD1A: *idx3 = *idx3; FN=0 init=0 WS=1 RS=1 */ -+ 0xd8990000, /* 0088(:1554): LCDEXT: idx1 = idx1, idx2 = idx2; idx1 once var0; idx1 += inc0, idx2 += inc0 */ -+ 0x99832302, /* 008C(:1554): LCD: idx3 = idx3, idx4 = var6; idx4 > var12; idx3 += inc0, idx4 += inc2 */ -+ 0x0beac798, /* 0090(:1557): DRD1A: *idx1 = *idx3; FN=0 TFD init=31 WS=1 RS=1 */ -+ 0x81988000, /* 0094(:1559): LCD: idx1 = var3; idx1 once var0; idx1 += inc0 */ -+ 0x6000000b, /* 0098(:1560): DRD2A: EU0=0 EU1=0 EU2=0 EU3=11 EXT init=0 WS=0 RS=0 */ -+ 0x0c4cfc5f, /* 009C(:1560): DRD2B1: *idx1 = EU3(); EU3(*idx1) */ -+ 0x81c80000, /* 00A0(:1562): LCD: idx1 = var3 + var16; idx1 once var0; idx1 += inc0 */ -+ 0xc5190312, /* 00A4(:1564): LCDEXT: idx2 = var10; idx2 > var12; idx2 += inc2 */ -+ 0x80198000, /* 00A8(:1564): LCD: idx3 = var0; idx3 once var0; idx3 += inc0 */ -+ 0x00008400, /* 00AC(:1565): DRD1A: idx1 = var0; FN=0 init=0 WS=0 RS=0 */ -+ 0x00000f08, /* 00B0(:1566): DRD1A: var3 = idx1; FN=0 init=0 WS=0 RS=0 */ -+ 0x81988000, /* 00B4(:1569): LCD: idx1 = var3; idx1 once var0; idx1 += inc0 */ -+ 0x10000788, /* 00B8(:1570): DRD1A: var1 = *idx1; FN=0 MORE init=0 WS=0 RS=0 */ -+ 0x6000000a, /* 00BC(:1571): DRD2A: EU0=0 EU1=0 EU2=0 EU3=10 EXT init=0 WS=0 RS=0 */ -+ 0x080cf05f, /* 00C0(:1571): DRD2B1: idx0 = EU3(); EU3(var1) */ -+ 0xc2988309, /* 00C4(:1574): LCDEXT: idx1 = var5; idx1 != var12; idx1 += inc1 */ -+ 0x80190000, /* 00C8(:1574): LCD: idx2 = var0; idx2 once var0; idx2 += inc0 */ -+ 0x040001f8, /* 00CC(:1575): DRD1A: FN=0 INT init=0 WS=0 RS=0 */ -+ 0x000001f8, /* 00D0(:0): NOP */ -+}; -+ -+#ifdef MCD_INCLUDE_EU -+MCD_bufDesc MCD_singleBufDescs[NCHANNELS]; -+#endif ---- /dev/null -+++ b/drivers/dma/MCD_tasksInit.c -@@ -0,0 +1,238 @@ -+/* -+ * drivers/dma/MCD_tasksInit.c -+ * -+ * Copyright (C) 2004-2008 Freescale Semiconductor, Inc. -+ * Kurt Mahan <kmahan@freescale.com> -+ * -+ * This program is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU General Public License as -+ * published by the Free Software Foundation; either version 2 of -+ * the License, or (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, -+ * MA 02111-1307 USA -+ */ -+ -+/* -+ * Autogenerated - Do not edit! -+ */ -+ -+#include "MCD_dma.h" -+ -+extern dmaRegs *MCD_dmaBar; -+ -+ -+/* -+ * Task 0 -+ */ -+ -+void MCD_startDmaChainNoEu(int *currBD, short srcIncr, short destIncr, int xferSize, short xferSizeIncr, int *cSave, volatile TaskTableEntry *taskTable, int channel) -+{ -+ -+ MCD_SET_VAR(taskTable+channel, 2, (u32)currBD); /* var[2] */ -+ MCD_SET_VAR(taskTable+channel, 25, (u32)(0xe000 << 16) | (0xffff & srcIncr)); /* inc[1] */ -+ MCD_SET_VAR(taskTable+channel, 24, (u32)(0xe000 << 16) | (0xffff & destIncr)); /* inc[0] */ -+ MCD_SET_VAR(taskTable+channel, 11, (u32)xferSize); /* var[11] */ -+ MCD_SET_VAR(taskTable+channel, 26, (u32)(0x2000 << 16) | (0xffff & xferSizeIncr)); /* inc[2] */ -+ MCD_SET_VAR(taskTable+channel, 0, (u32)cSave); /* var[0] */ -+ MCD_SET_VAR(taskTable+channel, 1, (u32)0x00000000); /* var[1] */ -+ MCD_SET_VAR(taskTable+channel, 3, (u32)0x00000000); /* var[3] */ -+ MCD_SET_VAR(taskTable+channel, 4, (u32)0x00000000); /* var[4] */ -+ MCD_SET_VAR(taskTable+channel, 5, (u32)0x00000000); /* var[5] */ -+ MCD_SET_VAR(taskTable+channel, 6, (u32)0x00000000); /* var[6] */ -+ MCD_SET_VAR(taskTable+channel, 7, (u32)0x00000000); /* var[7] */ -+ MCD_SET_VAR(taskTable+channel, 8, (u32)0x00000000); /* var[8] */ -+ MCD_SET_VAR(taskTable+channel, 9, (u32)0x00000000); /* var[9] */ -+ MCD_SET_VAR(taskTable+channel, 10, (u32)0x00000000); /* var[10] */ -+ MCD_SET_VAR(taskTable+channel, 12, (u32)0x00000000); /* var[12] */ -+ MCD_SET_VAR(taskTable+channel, 13, (u32)0x80000000); /* var[13] */ -+ MCD_SET_VAR(taskTable+channel, 14, (u32)0x00000010); /* var[14] */ -+ MCD_SET_VAR(taskTable+channel, 15, (u32)0x00000004); /* var[15] */ -+ MCD_SET_VAR(taskTable+channel, 16, (u32)0x08000000); /* var[16] */ -+ MCD_SET_VAR(taskTable+channel, 27, (u32)0x00000000); /* inc[3] */ -+ MCD_SET_VAR(taskTable+channel, 28, (u32)0x80000000); /* inc[4] */ -+ MCD_SET_VAR(taskTable+channel, 29, (u32)0x80000001); /* inc[5] */ -+ MCD_SET_VAR(taskTable+channel, 30, (u32)0x40000000); /* inc[6] */ -+ -+ /* Set the task's Enable bit in its Task Control Register */ -+ MCD_dmaBar->taskControl[channel] |= (u16)0x8000; -+} -+ -+ -+/* -+ * Task 1 -+ */ -+ -+void MCD_startDmaSingleNoEu(char *srcAddr, short srcIncr, char *destAddr, short destIncr, int dmaSize, short xferSizeIncr, int flags, int *currBD, int *cSave, volatile TaskTableEntry *taskTable, int channel) -+{ -+ -+ MCD_SET_VAR(taskTable+channel, 7, (u32)srcAddr); /* var[7] */ -+ MCD_SET_VAR(taskTable+channel, 25, (u32)(0xe000 << 16) | (0xffff & srcIncr)); /* inc[1] */ -+ MCD_SET_VAR(taskTable+channel, 2, (u32)destAddr); /* var[2] */ -+ MCD_SET_VAR(taskTable+channel, 24, (u32)(0xe000 << 16) | (0xffff & destIncr)); /* inc[0] */ -+ MCD_SET_VAR(taskTable+channel, 3, (u32)dmaSize); /* var[3] */ -+ MCD_SET_VAR(taskTable+channel, 26, (u32)(0x2000 << 16) | (0xffff & xferSizeIncr)); /* inc[2] */ -+ MCD_SET_VAR(taskTable+channel, 5, (u32)flags); /* var[5] */ -+ MCD_SET_VAR(taskTable+channel, 1, (u32)currBD); /* var[1] */ -+ MCD_SET_VAR(taskTable+channel, 0, (u32)cSave); /* var[0] */ -+ MCD_SET_VAR(taskTable+channel, 4, (u32)0x00000000); /* var[4] */ -+ MCD_SET_VAR(taskTable+channel, 6, (u32)0x00000000); /* var[6] */ -+ MCD_SET_VAR(taskTable+channel, 8, (u32)0x00000000); /* var[8] */ -+ MCD_SET_VAR(taskTable+channel, 9, (u32)0x00000004); /* var[9] */ -+ MCD_SET_VAR(taskTable+channel, 10, (u32)0x08000000); /* var[10] */ -+ MCD_SET_VAR(taskTable+channel, 27, (u32)0x00000000); /* inc[3] */ -+ MCD_SET_VAR(taskTable+channel, 28, (u32)0x80000001); /* inc[4] */ -+ MCD_SET_VAR(taskTable+channel, 29, (u32)0x40000000); /* inc[5] */ -+ -+ /* Set the task's Enable bit in its Task Control Register */ -+ MCD_dmaBar->taskControl[channel] |= (u16)0x8000; -+} -+ -+ -+/* -+ * Task 2 -+ */ -+ -+void MCD_startDmaChainEu(int *currBD, short srcIncr, short destIncr, int xferSize, short xferSizeIncr, int *cSave, volatile TaskTableEntry *taskTable, int channel) -+{ -+ -+ MCD_SET_VAR(taskTable+channel, 3, (u32)currBD); /* var[3] */ -+ MCD_SET_VAR(taskTable+channel, 25, (u32)(0xe000 << 16) | (0xffff & srcIncr)); /* inc[1] */ -+ MCD_SET_VAR(taskTable+channel, 24, (u32)(0xe000 << 16) | (0xffff & destIncr)); /* inc[0] */ -+ MCD_SET_VAR(taskTable+channel, 12, (u32)xferSize); /* var[12] */ -+ MCD_SET_VAR(taskTable+channel, 26, (u32)(0x2000 << 16) | (0xffff & xferSizeIncr)); /* inc[2] */ -+ MCD_SET_VAR(taskTable+channel, 0, (u32)cSave); /* var[0] */ -+ MCD_SET_VAR(taskTable+channel, 1, (u32)0x00000000); /* var[1] */ -+ MCD_SET_VAR(taskTable+channel, 2, (u32)0x00000000); /* var[2] */ -+ MCD_SET_VAR(taskTable+channel, 4, (u32)0x00000000); /* var[4] */ -+ MCD_SET_VAR(taskTable+channel, 5, (u32)0x00000000); /* var[5] */ -+ MCD_SET_VAR(taskTable+channel, 6, (u32)0x00000000); /* var[6] */ -+ MCD_SET_VAR(taskTable+channel, 7, (u32)0x00000000); /* var[7] */ -+ MCD_SET_VAR(taskTable+channel, 8, (u32)0x00000000); /* var[8] */ -+ MCD_SET_VAR(taskTable+channel, 9, (u32)0x00000000); /* var[9] */ -+ MCD_SET_VAR(taskTable+channel, 10, (u32)0x00000000); /* var[10] */ -+ MCD_SET_VAR(taskTable+channel, 11, (u32)0x00000000); /* var[11] */ -+ MCD_SET_VAR(taskTable+channel, 13, (u32)0x00000000); /* var[13] */ -+ MCD_SET_VAR(taskTable+channel, 14, (u32)0x80000000); /* var[14] */ -+ MCD_SET_VAR(taskTable+channel, 15, (u32)0x00000010); /* var[15] */ -+ MCD_SET_VAR(taskTable+channel, 16, (u32)0x00000001); /* var[16] */ -+ MCD_SET_VAR(taskTable+channel, 17, (u32)0x00000004); /* var[17] */ -+ MCD_SET_VAR(taskTable+channel, 18, (u32)0x08000000); /* var[18] */ -+ MCD_SET_VAR(taskTable+channel, 27, (u32)0x00000000); /* inc[3] */ -+ MCD_SET_VAR(taskTable+channel, 28, (u32)0x80000000); /* inc[4] */ -+ MCD_SET_VAR(taskTable+channel, 29, (u32)0xc0000000); /* inc[5] */ -+ MCD_SET_VAR(taskTable+channel, 30, (u32)0x80000001); /* inc[6] */ -+ MCD_SET_VAR(taskTable+channel, 31, (u32)0x40000000); /* inc[7] */ -+ -+ /* Set the task's Enable bit in its Task Control Register */ -+ MCD_dmaBar->taskControl[channel] |= (u16)0x8000; -+} -+ -+ -+/* -+ * Task 3 -+ */ -+ -+void MCD_startDmaSingleEu(char *srcAddr, short srcIncr, char *destAddr, short destIncr, int dmaSize, short xferSizeIncr, int flags, int *currBD, int *cSave, volatile TaskTableEntry *taskTable, int channel) -+{ -+ -+ MCD_SET_VAR(taskTable+channel, 8, (u32)srcAddr); /* var[8] */ -+ MCD_SET_VAR(taskTable+channel, 25, (u32)(0xe000 << 16) | (0xffff & srcIncr)); /* inc[1] */ -+ MCD_SET_VAR(taskTable+channel, 3, (u32)destAddr); /* var[3] */ -+ MCD_SET_VAR(taskTable+channel, 24, (u32)(0xe000 << 16) | (0xffff & destIncr)); /* inc[0] */ -+ MCD_SET_VAR(taskTable+channel, 4, (u32)dmaSize); /* var[4] */ -+ MCD_SET_VAR(taskTable+channel, 26, (u32)(0x2000 << 16) | (0xffff & xferSizeIncr)); /* inc[2] */ -+ MCD_SET_VAR(taskTable+channel, 6, (u32)flags); /* var[6] */ -+ MCD_SET_VAR(taskTable+channel, 2, (u32)currBD); /* var[2] */ -+ MCD_SET_VAR(taskTable+channel, 0, (u32)cSave); /* var[0] */ -+ MCD_SET_VAR(taskTable+channel, 1, (u32)0x00000000); /* var[1] */ -+ MCD_SET_VAR(taskTable+channel, 5, (u32)0x00000000); /* var[5] */ -+ MCD_SET_VAR(taskTable+channel, 7, (u32)0x00000000); /* var[7] */ -+ MCD_SET_VAR(taskTable+channel, 9, (u32)0x00000000); /* var[9] */ -+ MCD_SET_VAR(taskTable+channel, 10, (u32)0x00000001); /* var[10] */ -+ MCD_SET_VAR(taskTable+channel, 11, (u32)0x00000004); /* var[11] */ -+ MCD_SET_VAR(taskTable+channel, 12, (u32)0x08000000); /* var[12] */ -+ MCD_SET_VAR(taskTable+channel, 27, (u32)0x00000000); /* inc[3] */ -+ MCD_SET_VAR(taskTable+channel, 28, (u32)0xc0000000); /* inc[4] */ -+ MCD_SET_VAR(taskTable+channel, 29, (u32)0x80000000); /* inc[5] */ -+ MCD_SET_VAR(taskTable+channel, 30, (u32)0x80000001); /* inc[6] */ -+ MCD_SET_VAR(taskTable+channel, 31, (u32)0x40000000); /* inc[7] */ -+ -+ /* Set the task's Enable bit in its Task Control Register */ -+ MCD_dmaBar->taskControl[channel] |= (u16)0x8000; -+} -+ -+ -+/* -+ * Task 4 -+ */ -+ -+void MCD_startDmaENetRcv(char *bDBase, char *currBD, char *rcvFifoPtr, volatile TaskTableEntry *taskTable, int channel) -+{ -+ -+ MCD_SET_VAR(taskTable+channel, 0, (u32)bDBase); /* var[0] */ -+ MCD_SET_VAR(taskTable+channel, 3, (u32)currBD); /* var[3] */ -+ MCD_SET_VAR(taskTable+channel, 6, (u32)rcvFifoPtr); /* var[6] */ -+ MCD_SET_VAR(taskTable+channel, 1, (u32)0x00000000); /* var[1] */ -+ MCD_SET_VAR(taskTable+channel, 2, (u32)0x00000000); /* var[2] */ -+ MCD_SET_VAR(taskTable+channel, 4, (u32)0x00000000); /* var[4] */ -+ MCD_SET_VAR(taskTable+channel, 5, (u32)0x00000000); /* var[5] */ -+ MCD_SET_VAR(taskTable+channel, 7, (u32)0x00000000); /* var[7] */ -+ MCD_SET_VAR(taskTable+channel, 8, (u32)0x00000000); /* var[8] */ -+ MCD_SET_VAR(taskTable+channel, 9, (u32)0x0000ffff); /* var[9] */ -+ MCD_SET_VAR(taskTable+channel, 10, (u32)0x30000000); /* var[10] */ -+ MCD_SET_VAR(taskTable+channel, 11, (u32)0x0fffffff); /* var[11] */ -+ MCD_SET_VAR(taskTable+channel, 12, (u32)0x00000008); /* var[12] */ -+ MCD_SET_VAR(taskTable+channel, 24, (u32)0x00000000); /* inc[0] */ -+ MCD_SET_VAR(taskTable+channel, 25, (u32)0x60000000); /* inc[1] */ -+ MCD_SET_VAR(taskTable+channel, 26, (u32)0x20000004); /* inc[2] */ -+ MCD_SET_VAR(taskTable+channel, 27, (u32)0x40000000); /* inc[3] */ -+ -+ /* Set the task's Enable bit in its Task Control Register */ -+ MCD_dmaBar->taskControl[channel] |= (u16)0x8000; -+} -+ -+ -+/* -+ * Task 5 -+ */ -+ -+void MCD_startDmaENetXmit(char *bDBase, char *currBD, char *xmitFifoPtr, volatile TaskTableEntry *taskTable, int channel) -+{ -+ -+ MCD_SET_VAR(taskTable+channel, 0, (u32)bDBase); /* var[0] */ -+ MCD_SET_VAR(taskTable+channel, 3, (u32)currBD); /* var[3] */ -+ MCD_SET_VAR(taskTable+channel, 11, (u32)xmitFifoPtr); /* var[11] */ -+ MCD_SET_VAR(taskTable+channel, 1, (u32)0x00000000); /* var[1] */ -+ MCD_SET_VAR(taskTable+channel, 2, (u32)0x00000000); /* var[2] */ -+ MCD_SET_VAR(taskTable+channel, 4, (u32)0x00000000); /* var[4] */ -+ MCD_SET_VAR(taskTable+channel, 5, (u32)0x00000000); /* var[5] */ -+ MCD_SET_VAR(taskTable+channel, 6, (u32)0x00000000); /* var[6] */ -+ MCD_SET_VAR(taskTable+channel, 7, (u32)0x00000000); /* var[7] */ -+ MCD_SET_VAR(taskTable+channel, 8, (u32)0x00000000); /* var[8] */ -+ MCD_SET_VAR(taskTable+channel, 9, (u32)0x00000000); /* var[9] */ -+ MCD_SET_VAR(taskTable+channel, 10, (u32)0x00000000); /* var[10] */ -+ MCD_SET_VAR(taskTable+channel, 12, (u32)0x00000000); /* var[12] */ -+ MCD_SET_VAR(taskTable+channel, 13, (u32)0x0000ffff); /* var[13] */ -+ MCD_SET_VAR(taskTable+channel, 14, (u32)0xffffffff); /* var[14] */ -+ MCD_SET_VAR(taskTable+channel, 15, (u32)0x00000004); /* var[15] */ -+ MCD_SET_VAR(taskTable+channel, 16, (u32)0x00000008); /* var[16] */ -+ MCD_SET_VAR(taskTable+channel, 24, (u32)0x00000000); /* inc[0] */ -+ MCD_SET_VAR(taskTable+channel, 25, (u32)0x60000000); /* inc[1] */ -+ MCD_SET_VAR(taskTable+channel, 26, (u32)0x40000000); /* inc[2] */ -+ MCD_SET_VAR(taskTable+channel, 27, (u32)0xc000fffc); /* inc[3] */ -+ MCD_SET_VAR(taskTable+channel, 28, (u32)0xe0000004); /* inc[4] */ -+ MCD_SET_VAR(taskTable+channel, 29, (u32)0x80000000); /* inc[5] */ -+ MCD_SET_VAR(taskTable+channel, 30, (u32)0x4000ffff); /* inc[6] */ -+ MCD_SET_VAR(taskTable+channel, 31, (u32)0xe0000001); /* inc[7] */ -+ -+ /* Set the task's Enable bit in its Task Control Register */ -+ MCD_dmaBar->taskControl[channel] |= (u16)0x8000; -+} ---- /dev/null -+++ b/drivers/dma/MCD_tasksInit.h -@@ -0,0 +1,64 @@ -+/* -+ * drivers/dma/MCD_tasksInit.h -+ * -+ * Copyright (C) 2004-2008 Freescale Semiconductor, Inc. -+ * Kurt Mahan <kmahan@freescale.com> -+ * -+ * This program is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU General Public License as -+ * published by the Free Software Foundation; either version 2 of -+ * the License, or (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, -+ * MA 02111-1307 USA -+ */ -+#ifndef MCD_TSK_INIT_H -+#define MCD_TSK_INIT_H 1 -+ -+/* -+ * Autogenerated - Do not edit! -+ */ -+ -+/* -+ * Task 0 -+ */ -+void MCD_startDmaChainNoEu(int *currBD, short srcIncr, short destIncr, int xferSize, short xferSizeIncr, int *cSave, volatile TaskTableEntry *taskTable, int channel); -+ -+ -+/* -+ * Task 1 -+ */ -+void MCD_startDmaSingleNoEu(char *srcAddr, short srcIncr, char *destAddr, short destIncr, int dmaSize, short xferSizeIncr, int flags, int *currBD, int *cSave, volatile TaskTableEntry *taskTable, int channel); -+ -+ -+/* -+ * Task 2 -+ */ -+void MCD_startDmaChainEu(int *currBD, short srcIncr, short destIncr, int xferSize, short xferSizeIncr, int *cSave, volatile TaskTableEntry *taskTable, int channel); -+ -+ -+/* -+ * Task 3 -+ */ -+void MCD_startDmaSingleEu(char *srcAddr, short srcIncr, char *destAddr, short destIncr, int dmaSize, short xferSizeIncr, int flags, int *currBD, int *cSave, volatile TaskTableEntry *taskTable, int channel); -+ -+ -+/* -+ * Task 4 -+ */ -+void MCD_startDmaENetRcv(char *bDBase, char *currBD, char *rcvFifoPtr, volatile TaskTableEntry *taskTable, int channel); -+ -+ -+/* -+ * Task 5 -+ */ -+void MCD_startDmaENetXmit(char *bDBase, char *currBD, char *xmitFifoPtr, volatile TaskTableEntry *taskTable, int channel); -+ -+#endif /* MCD_TSK_INIT_H */ ---- /dev/null -+++ b/drivers/i2c/busses/i2c-algo-mcf.h -@@ -0,0 +1,23 @@ -+#ifndef I2C_ALGO_MCF_H -+#define I2C_ALGO_MCF_H 1 -+ -+/* --- Defines for pcf-adapters --------------------------------------- */ -+#include <linux/i2c.h> -+ -+struct i2c_algo_mcf_data { -+ void *data; /* private data for lolevel routines */ -+ void (*setmcf) (void *data, int ctl, int val); -+ int (*getmcf) (void *data, int ctl); -+ int (*getown) (void *data); -+ int (*getclock) (void *data); -+ void (*waitforpin) (void); -+ /* local settings */ -+ int udelay; -+ int mdelay; -+ int timeout; -+}; -+ -+int i2c_mcf_add_bus(struct i2c_adapter *); -+int i2c_mcf_del_bus(struct i2c_adapter *); -+ -+#endif /* I2C_ALGO_MCF_H */ ---- /dev/null -+++ b/drivers/i2c/busses/i2c-mcf548x.c -@@ -0,0 +1,595 @@ -+/* -+ * Performance and stability improvements: (C) Copyright 2008, -+ * Adrian Cox <adrian@humboldt.co.uk> -+ * ColdFire 547x/548x I2C master support -+ * Shrek Wu (b16972@freescale.com )moved the code driver/i2c/alg/mcf.c -+ * into driver/i2c/busses.And changed the driver to a platform driver. -+ */ -+#include <linux/i2c.h> -+#include "i2c-algo-mcf.h" -+ -+#include <linux/init.h> -+#include <linux/kernel.h> -+#include <linux/module.h> -+#include <linux/delay.h> -+#include <linux/platform_device.h> -+#include <linux/sched.h> -+#include <linux/interrupt.h> -+#include <asm/io.h> -+ -+#include <asm/coldfire.h> -+#include <asm/m5485sim.h> -+#include <asm/m5485i2c.h> -+ -+#define get_clock(adap) (clock) -+#define get_own(adap) (own) -+ -+static int clock = 0x3b; /*50000 / 1024 ~ 49 KHz*/ -+module_param(clock, int, 0); -+MODULE_PARM_DESC(clock, -+ "Set I2C clock in kHz: 400=fast mode (default == 49khz)"); -+ -+static int own = 0x78; -+module_param(own, int, 0); -+MODULE_PARM_DESC(clock, "Set I2C Master controller address(0x78)"); -+ -+static struct i2c_algo_mcf_data i2c_mcf_board_data = { -+ .timeout = 10000, -+}; -+ -+static struct i2c_adapter i2c_mcf_board_adapter = { -+ .owner = THIS_MODULE, -+ .name = "MCF5485 adapter", -+ .id = I2C_HW_MPC107, -+ .algo_data = &i2c_mcf_board_data, -+ .class = I2C_CLASS_HWMON, -+ .timeout = 100, -+ .retries = 2 -+}; -+/* -+ * static void i2c_start() -+ * -+ * Generates START signal -+ */ -+static void -+i2c_start( -+ struct i2c_algo_mcf_data *adap -+) { -+ MCF_I2CR |= MCF_I2CR_MSTA; -+} -+ -+ -+/* -+ * static void i2c_stop() -+ * -+ * Generates STOP signal -+ */ -+static void -+i2c_stop( -+ struct i2c_algo_mcf_data *adap -+) { -+ MCF_I2CR &= ~MCF_I2CR_MSTA; -+} -+ -+static int -+i2c_getack( -+ struct i2c_algo_mcf_data *adap -+) { -+ return !(MCF_I2SR & MCF_I2SR_RXAK); -+} -+ -+/* -+ * static void i2c_repstart() -+ * -+ * Generates repeated start signal (without STOP while mastering the bus) -+ */ -+static void -+i2c_repstart( -+ struct i2c_algo_mcf_data *adap -+) { -+ MCF_I2CR |= MCF_I2CR_RSTA; -+ MCF_I2CR |= MCF_I2CR_MTX; -+} -+ -+ -+/* -+ * static void wait_for_bb() -+ * -+ * Wait for bus idle state -+ */ -+static int -+wait_for_bb( -+ struct i2c_algo_mcf_data *adap -+) { -+ int i; -+ for (i = 0; i < adap->timeout; i++) { -+ if (!(MCF_I2SR & MCF_I2SR_IBB)) -+ return 0; -+ udelay(100); -+ } -+ printk(KERN_ERR "%s: timeout", __FUNCTION__); -+ return -ETIMEDOUT; -+} -+ -+/* -+ * static void wait_for_not_bb() -+ * -+ * Wait for bus busy state -+ */ -+static int -+wait_for_not_bb( -+ struct i2c_algo_mcf_data *adap -+) { -+ int i; -+ for (i = 0; i < adap->timeout; i++) { -+ if (MCF_I2SR & MCF_I2SR_IBB) -+ return 0; -+ udelay(100); -+ } -+ printk(KERN_ERR "%s: timeout", __FUNCTION__); -+ return -ETIMEDOUT; -+} -+ -+/* -+ * static void wait_xfer_done() -+ * -+ * Wait for transfer to complete -+ */ -+static int -+wait_xfer_done( -+ struct i2c_algo_mcf_data *adap -+) { -+ int i; -+ -+ for (i = 0; i < adap->timeout; i++) { -+ if (MCF_I2SR & MCF_I2SR_IIF) { -+ MCF_I2SR &= ~MCF_I2SR_IIF; -+ return 0; -+ } -+ udelay(10); -+ } -+ printk(KERN_ERR "%s: timeout", __FUNCTION__); -+ return -ETIMEDOUT; -+} -+ -+ -+/* -+ * static void i2c_set_addr() -+ * -+ * Sets slave address to communicate -+ */ -+static int -+i2c_set_addr( -+ struct i2c_algo_mcf_data *adap, -+ struct i2c_msg *msg, -+ int retries -+) { -+ unsigned short flags = msg->flags; -+ unsigned char addr; -+ MCF_I2CR |= MCF_I2CR_MTX; -+ if ((flags & I2C_M_TEN)) { -+ /* 10 bit address not supported yet */ -+ return -EIO; -+ } else { -+ /* normal 7bit address */ -+ addr = (msg->addr << 1); -+ if (flags & I2C_M_RD) -+ addr |= 1; -+ if (flags & I2C_M_REV_DIR_ADDR) -+ addr ^= 1; -+ -+ MCF_I2DR = addr; -+ } -+ return 0; -+} -+ -+ -+/* -+ * static void mcf_i2c_init() -+ * -+ * Perform ColdFire i2c initialization -+ */ -+static void -+mcf_i2c_init(struct i2c_algo_mcf_data *adap) -+{ -+ u8 dummy; -+ /* Setup GPIO lines */ -+ MCF_PAR_FECI2CIRQ |= MCF_PAR_SDA; -+ MCF_PAR_FECI2CIRQ |= MCF_PAR_SCL; -+ -+ /* Ensure slaves are in idle state */ -+ if (MCF_I2SR & MCF_I2SR_IBB) { -+ MCF_I2ICR = 0x00; -+ MCF_I2CR = 0x00; -+ MCF_I2CR = 0x0A; -+ dummy = MCF_I2DR; -+ MCF_I2SR = 0x00; -+ MCF_I2CR = 0x00; -+ MCF_I2ICR = 0x01; -+ } -+ -+ /* setup SCL clock */ -+ MCF_I2FDR = get_clock(adap); -+ -+ /* set slave address */ -+ MCF_I2AR = get_own(adap); -+ -+ /* enable I2C module */ -+ MCF_I2CR = MCF_I2CR_IEN; -+} -+ -+static int i2c_outb( -+ struct i2c_adapter *i2c_adap, -+ char c -+) { -+ -+ struct i2c_algo_mcf_data *adap = i2c_adap->algo_data; -+ int timeout; -+ /* Put data to be sent */ -+ MCF_I2DR = c; -+ /* Wait for xfer completed*/ -+ timeout = wait_xfer_done(adap); -+ if (timeout) { -+ i2c_stop(adap); -+ wait_for_bb(adap); -+ printk(KERN_ERR "i2c-algo-mcf: %s i2c_write: " -+ "error - timeout.\n", i2c_adap->name); -+ return -EREMOTEIO; /* got a better one ?? */ -+ } -+ -+ return 0; -+} -+ -+ -+/* -+ * static void mcf_sendbytes() -+ * -+ * Perform tx data transfer -+ */ -+static int -+mcf_sendbytes( -+ struct i2c_adapter *i2c_adap, -+ const char *buf, -+ int count, int last -+) { -+ struct i2c_algo_mcf_data *adap = i2c_adap->algo_data; -+ int ret, i; -+ -+ /* Set master TX mode */ -+ MCF_I2CR |= MCF_I2CR_MTX; -+ -+ for (i = 0; i < count; ++i) { -+ printk(KERN_DEBUG "i2c-algo-mcf: %s i2c_write: writing %2.2X\n", -+ i2c_adap->name, buf[i]&0xff); -+ ret = i2c_outb(i2c_adap, buf[i]); -+ if (ret < 0) -+ return ret; -+ } -+ if (last) { -+ i2c_stop(adap); -+ wait_for_bb(adap); -+ } else { -+ /* i2c_repstart(adap);*/ -+ } -+ -+ return (i); -+} -+ -+ -+/* -+ * static void mcf_readbytes() -+ * -+ * Perform rx data transfer -+ */ -+static int -+mcf_readbytes( -+ struct i2c_adapter *i2c_adap, -+ char *buf, -+ int count, int last -+) { -+ int i; -+ struct i2c_algo_mcf_data *adap = i2c_adap->algo_data; -+ u8 dummy; -+ -+ /* Set master RX mode */ -+ MCF_I2CR &= ~MCF_I2CR_MTX; -+ MCF_I2CR &= ~MCF_I2CR_TXAK; -+ dummy = MCF_I2DR; -+ -+ for (i = 0; i < count-1; i++) { -+ if (wait_xfer_done(adap)) { -+ i2c_stop(adap); -+ wait_for_bb(adap); -+ printk(KERN_DEBUG -+ "i2c-algo-mcf: mcf_readbytes timed out.\n"); -+ return (-1); -+ } -+ -+ /* store next data byte */ -+ buf[i] = MCF_I2DR; -+ } -+ -+ if (wait_xfer_done(adap)) { -+ i2c_stop(adap); -+ wait_for_bb(adap); -+ printk(KERN_DEBUG "i2c-algo-mcf: mcf_readbytes timed out.\n"); -+ return (-1); -+ } -+ -+ /* Disable acknowlege (set I2CR.TXAK) */ -+ MCF_I2CR |= MCF_I2CR_TXAK; -+ buf[i] = MCF_I2DR; -+ if (wait_xfer_done(adap)) { -+ i2c_stop(adap); -+ wait_for_bb(adap); -+ printk(KERN_DEBUG "i2c-algo-mcf: mcf_readbytes timed out.\n"); -+ return (-1); -+ } -+ -+ if (last) { -+ i2c_stop(adap); -+ wait_for_bb(adap); -+ } else { -+ /* i2c_repstart(adap);*/ -+ } -+ -+ return (i+1); -+} -+ -+ -+/* -+ * static void mcf_xfer() -+ * -+ * Perform master data I/O transfer -+ */ -+static int -+mcf_xfer( -+ struct i2c_adapter *i2c_adap, -+ struct i2c_msg *msgs, -+ int num -+) { -+ struct i2c_algo_mcf_data *adap = i2c_adap->algo_data; -+ struct i2c_msg *pmsg; -+ int i; -+ int ret = 0, timeout; -+ -+ /* Skip own address */ -+ if (get_own(adap) == (msgs[0].addr << 1)) -+ return -EIO; -+ -+ /* Ensure slaves are in idle state */ -+ if (MCF_I2SR & MCF_I2SR_IBB) { -+ MCF_I2ICR = 0x00; -+ MCF_I2CR = 0x00; -+ MCF_I2CR = 0x0A; -+ timeout = MCF_I2DR; -+ MCF_I2SR = 0x00; -+ MCF_I2CR = 0x00; -+ MCF_I2ICR = 0x01; -+ } -+ /* setup SCL clock */ -+ MCF_I2FDR = get_clock(adap); -+ /* set slave address */ -+ MCF_I2AR = get_own(adap); -+ /* enable I2C module */ -+ MCF_I2CR = MCF_I2CR_IEN; -+ -+ MCF_I2CR |= MCF_I2CR_TXAK; -+ -+ /* Check for bus busy */ -+ wait_for_bb(adap); -+ -+ for (i = 0; ret >= 0 && i < num; i++) { -+ if (MCF_I2SR & MCF_I2SR_IBB) { -+ MCF_I2ICR = 0x00; -+ MCF_I2CR = 0x00; -+ MCF_I2CR = 0x0A; -+ timeout = MCF_I2DR; -+ MCF_I2SR = 0x00; -+ MCF_I2CR = 0x00; -+ MCF_I2ICR = 0x01; -+ } -+ /* setup SCL clock */ -+ MCF_I2FDR = get_clock(adap); -+ /* set slave address */ -+ MCF_I2AR = get_own(adap); -+ /* enable I2C module */ -+ MCF_I2CR = MCF_I2CR_IEN; -+ -+ MCF_I2CR |= MCF_I2CR_TXAK; -+ -+ /* Check for bus busy */ -+ wait_for_bb(adap); -+ -+ pmsg = &msgs[i]; -+ -+ printk(KERN_DEBUG "i2c-algo-mcf: Doing %s %d bytes " -+ "to 0x%02x - %d of %d messages\n", -+ pmsg->flags & I2C_M_RD ? "read" : "write", -+ pmsg->len, pmsg->addr, i + 1, num); -+ -+ /* Send START */ -+ /*if (i == 0)*/ -+ i2c_start(adap); -+ -+ /* Wait for Bus Busy */ -+ wait_for_not_bb(adap); -+ -+ MCF_I2CR |= MCF_I2CR_MTX; -+ -+ ret = i2c_set_addr(adap, pmsg, i2c_adap->retries); -+ if (ret < 0) -+ return ret; -+ -+ /* Wait for address transfer completion */ -+ wait_xfer_done(adap); -+ -+ /* Check for ACK */ -+ if (!i2c_getack(adap)) { -+ i2c_stop(adap); -+ wait_for_bb(adap); -+ printk(KERN_DEBUG "i2c-algo-mcf: No ack after " -+ "send address in mcf_xfer\n"); -+ return (-EREMOTEIO); -+ } -+ -+ printk(KERN_DEBUG "i2c-algo-mcf: Msg %d, " -+ "addr = 0x%x, flags = 0x%x, len = %d\n", -+ i, msgs[i].addr, msgs[i].flags, msgs[i].len); -+ /* Read */ -+ if (pmsg->flags & I2C_M_RD) { -+ /* read bytes into buffer*/ -+ ret = mcf_readbytes(i2c_adap, pmsg->buf, pmsg->len, -+ (i + 1 == num)); -+ -+ if (ret != pmsg->len) { -+ printk(KERN_DEBUG "i2c-algo-mcf: fail: " -+ "only read %d bytes.\n", ret); -+ } else { -+ printk(KERN_DEBUG "i2c-algo-mcf: " -+ "read %d bytes.\n", ret); -+ } -+ } else { -+ /* write bytes into buffer*/ -+ ret = mcf_sendbytes(i2c_adap, pmsg->buf, pmsg->len, -+ (i + 1 == num)); -+ if (ret != pmsg->len) { -+ printk(KERN_DEBUG "i2c-algo-mcf: fail: " -+ "only wrote %d bytes.\n", ret); -+ } else { -+ printk(KERN_DEBUG "i2c-algo-mcf: wrote" -+ "%d bytes.\n", ret); -+ } -+ } -+ MCF_I2CR = 0; -+ } -+ -+ /* Disable I2C module */ -+ MCF_I2CR = 0; -+ return (i); -+} -+ -+ -+/* -+ * static void mcf_func() -+ * -+ * Return algorithm funtionality -+ */ -+static u32 -+mcf_func( -+ struct i2c_adapter *i2c_adap -+) { -+ return I2C_FUNC_SMBUS_EMUL | I2C_FUNC_I2C; -+} -+ -+/* -+ * ColdFire bus algorithm callbacks -+ */ -+static struct i2c_algorithm mcf_algo = { -+ .master_xfer = mcf_xfer, -+ .functionality = mcf_func, -+}; -+ -+/***********************************************************/ -+struct coldfire_i2c { -+ void __iomem *base; -+ struct resource *irqarea; -+ struct resource *ioarea; -+ u32 irq; -+ struct i2c_adapter *adap; -+ u32 flags; -+}; -+ -+/* -+ * registering functions to load algorithms at runtime -+ */ -+int i2c_mcf_add_bus(struct i2c_adapter *adap) -+{ -+ struct i2c_algo_mcf_data *mcf_adap = adap->algo_data; -+ -+ /*adap->id |= mcf_algo.id;*/ -+ adap->algo = &mcf_algo; -+ adap->timeout = 100; -+ -+ mcf_i2c_init(mcf_adap); -+ -+#ifdef MODULE -+ MOD_INC_USE_COUNT; -+#endif -+ -+ i2c_add_adapter(adap); -+ -+ return 0; -+} -+ -+static int mcf548x_i2c_probe(struct platform_device *pdev) -+{ -+ struct coldfire_i2c *i2c; -+ int rc = 0; -+ -+ /************************************************************/ -+ i2c = kzalloc(sizeof(*i2c), GFP_KERNEL); -+ if (!i2c) { -+ printk(KERN_ERR "%s kzalloc coldfire_i2c faile\n", -+ __FUNCTION__); -+ return -ENOMEM; -+ } -+ /****************************************************************/ -+ platform_set_drvdata(pdev, i2c); -+ -+ i2c->adap = &i2c_mcf_board_adapter; -+ i2c->adap->dev.parent = &pdev->dev; -+ rc = i2c_mcf_add_bus(i2c->adap); -+ if (rc < 0) { -+ printk(KERN_ERR "%s - failed to add adapter\n", __FUNCTION__); -+ rc = -ENODEV; -+ goto fail_add; -+ } -+ -+ printk(KERN_INFO "i2c-algo-mcf.o: I2C ColdFire algorithm" -+ " module is loaded.\n"); -+ return rc; -+ -+fail_add: -+ kfree(i2c); -+ return rc; -+}; -+ -+static int mcf548x_i2c_remove(struct platform_device *pdev) -+{ -+ struct coldfire_i2c *i2c = platform_get_drvdata(pdev); -+ -+ i2c_del_adapter(i2c->adap); -+ platform_set_drvdata(pdev, NULL); -+ iounmap(i2c->base); -+ kfree(i2c); -+ return 0; -+}; -+ -+/* Structure for a device driver */ -+static struct platform_driver mcf548x_i2c_driver = { -+ .probe = mcf548x_i2c_probe, -+ .remove = mcf548x_i2c_remove, -+ .driver = { -+ .owner = THIS_MODULE, -+ .name = "MCF548X-i2c", -+ }, -+}; -+ -+static int __init coldfire_i2c_init(void) -+{ -+ return platform_driver_register(&mcf548x_i2c_driver); -+} -+ -+static void __exit coldfire_i2c_exit(void) -+{ -+ platform_driver_unregister(&mcf548x_i2c_driver); -+} -+ -+module_init(coldfire_i2c_init); -+module_exit(coldfire_i2c_exit); -+ -+MODULE_AUTHOR("Adrian Cox <adrian@humboldt.co.uk>"); -+MODULE_DESCRIPTION -+ ("I2C-Bus adapter for MCF547x and MCF548x processors"); -+MODULE_LICENSE("GPL"); ---- /dev/null -+++ b/drivers/i2c/busses/i2c-mcf.c -@@ -0,0 +1,573 @@ -+/* -+ i2c-mcf.c - Part of lm_sensors, Linux kernel modules for hardware monitoring -+ -+ Copyright (c) 2005, Derek CL Cheung <derek.cheung@sympatico.ca> -+ <http://www3.sympatico.ca/derek.cheung> -+ -+ Copyright (c) 2006-2007, emlix -+ Sebastian Hess <sh@emlix.com> -+ -+ Copyright (c) 2006-2007 Freescale Semiconductor, Inc -+ Yaroslav Vinogradov <yaroslav.vinogradov@freescale.com> -+ Matt Waddel <Matt.Waddel@freescale.com> -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 2 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program; if not, write to the Free Software -+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -+ -+ Changes: -+ v0.1 26 March 2005 -+ Initial Release - developed on uClinux with 2.6.9 kernel -+ -+ v0.2 29 May 2006 -+ Modified to be more generic and added support for -+ i2c_master_xfer -+ -+ This I2C adaptor supports the ColdFire CPU I2C module. Since most Coldfire -+ CPUs' I2C module use the same register set (e.g., MCF5249), the code is very -+ portable and re-usable to other Coldfire CPUs. -+ -+ The transmission frequency is set at about 100KHz for the CPU board with -+ 8MHz crystal. If the CPU board uses different system clock frequency, you -+ should change the following line: -+ static int __init i2c_coldfire_init(void) -+ { -+ ......... -+ // Set transmission frequency 0x15 = ~100kHz -+ *MCF_I2C_I2FDR = 0x15; -+ ........ -+ } -+ -+ Remember to perform a dummy read to set the ColdFire CPU's I2C module for -+ read before reading the actual byte from a device -+ -+ The I2C_SM_BUS_BLOCK_DATA function are not yet ready but most lm_senors -+ do not care -+*/ -+ -+#include <linux/init.h> -+#include <linux/module.h> -+#include <linux/kernel.h> -+#include <linux/errno.h> -+#include <linux/i2c.h> -+#include <linux/delay.h> -+#include <linux/string.h> -+#include <asm/coldfire.h> -+#include <asm/mcfsim.h> -+#include <asm/types.h> -+#include <linux/platform_device.h> -+#include "i2c-mcf.h" -+ -+ -+static struct i2c_algorithm coldfire_algorithm = { -+ /*.name = "ColdFire I2C algorithm", -+ .id = I2C_ALGO_SMBUS,*/ -+ .smbus_xfer = coldfire_i2c_access, -+ .master_xfer = coldfire_i2c_master, -+ .functionality = coldfire_func, -+}; -+ -+ -+static struct i2c_adapter coldfire_adapter = { -+ .owner = THIS_MODULE, -+ .class = I2C_CLASS_HWMON, -+ .algo = &coldfire_algorithm, -+ .name = "ColdFire I2C adapter", -+}; -+ -+ -+__u16 lastaddr; -+__u16 lastop; -+ -+static inline int coldfire_do_first_start(__u16 addr,__u16 flags) -+{ -+ int err; -+ /* -+ * Generate a stop and put the I2C module into slave mode -+ */ -+ *MCF_I2C_I2CR &= ~MCF_I2C_I2CR_MSTA; -+ -+ /* -+ * Generate a new Start signal -+ */ -+ err = coldfire_i2c_start(flags & I2C_M_RD ? I2C_SMBUS_READ : I2C_SMBUS_WRITE, -+ addr, FIRST_START); -+ if(err) return err; -+ -+ lastaddr = addr; -+ lastop = flags & I2C_M_RD; /* Ensure everything for new start */ -+ return 0; -+} -+ -+ -+/* -+ * read one byte data from the I2C bus -+ */ -+static int coldfire_read_data(u8 * const rxData, const enum I2C_ACK_TYPE ackType) { -+ -+ int timeout; -+ -+ *MCF_I2C_I2CR &= ~MCF_I2C_I2CR_MTX; /* master receive mode*/ -+ -+ if (ackType == NACK) -+ *MCF_I2C_I2CR |= MCF_I2C_I2CR_TXAK; /* generate NA */ -+ else -+ *MCF_I2C_I2CR &= ~MCF_I2C_I2CR_TXAK; /* generate ACK */ -+ -+ -+ /* read data from the I2C bus */ -+ *rxData = *MCF_I2C_I2DR; -+ -+ /* printk(">>> %s I2DR data is %.2x \n", __FUNCTION__, *rxData); */ -+ -+ /* wait for data transfer to complete */ -+ timeout = 500; -+ while (timeout-- && !(*MCF_I2C_I2SR & MCF_I2C_I2SR_IIF)) -+ udelay(1); -+ if (timeout <= 0) -+ printk("%s - I2C IIF never set. Timeout is %d \n", __FUNCTION__, -+ timeout); -+ -+ -+ /* reset the interrupt bit */ -+ *MCF_I2C_I2SR &= ~MCF_I2C_I2SR_IIF; -+ -+ if (timeout <= 0 ) -+ return -1; -+ else -+ return 0; -+ -+}; -+ -+ -+/* -+ * write one byte data onto the I2C bus -+ */ -+static int coldfire_write_data(const u8 txData) { -+ -+ int timeout; -+ -+ timeout = 500; -+ -+ *MCF_I2C_I2CR |= MCF_I2C_I2CR_MTX; /* I2C module into TX mode */ -+ *MCF_I2C_I2DR = txData; /* send the data */ -+ -+ /* wait for data transfer to complete */ -+ /* rely on the interrupt handling bit */ -+ timeout = 500; -+ while (timeout-- && !(*MCF_I2C_I2SR & MCF_I2C_I2SR_IIF)) -+ udelay(1); -+ if (timeout <=0) -+ printk("%s - I2C IIF never set. Timeout is %d \n", __FUNCTION__, -+ timeout); -+ -+ -+ /* reset the interrupt bit */ -+ *MCF_I2C_I2SR &= ~MCF_I2C_I2SR_IIF; -+ -+ if (timeout <= 0 ) -+ return -1; -+ else -+ return 0; -+ -+}; -+ -+ -+ -+ -+/* -+ * Generate I2C start or repeat start signal -+ * Combine the 7 bit target_address and the R/W bit and put it onto the I2C bus -+ */ -+static int coldfire_i2c_start(const char read_write, const u16 target_address, const enum I2C_START_TYPE start_type) { -+ -+ int timeout; -+ -+ /* printk(">>> %s START TYPE %s \n", __FUNCTION__, -+ start_type == FIRST_START ? "FIRST_START":"REPEAT_START");*/ -+ -+ *MCF_I2C_I2CR |= MCF_I2C_I2CR_IEN; -+ -+ if (start_type == FIRST_START) { -+ /* Make sure the I2C bus is idle */ -+ timeout = 500; /* 500us timeout */ -+ while (timeout-- && (*MCF_I2C_I2SR & MCF_I2C_I2SR_IBB)) -+ udelay(1); -+ if (timeout <= 0) { -+ printk("%s - I2C bus always busy in the past 500us timeout is %d \n", __FUNCTION__, timeout); -+ goto check_rc; -+ } -+ /* generate a START and put the I2C module into MASTER TX mode*/ -+ *MCF_I2C_I2CR |= (MCF_I2C_I2CR_MSTA | MCF_I2C_I2CR_MTX); -+ -+ /* wait for bus busy to be set */ -+ timeout = 500; -+ while (timeout-- && !(*MCF_I2C_I2SR & MCF_I2C_I2SR_IBB)) -+ udelay(1); -+ if (timeout <= 0) { -+ printk("%s - I2C bus is never busy after START. Timeout is %d \n", __FUNCTION__, timeout); -+ goto check_rc; -+ } -+ -+ } else { -+ /* this is repeat START */ -+ udelay(500); /* need some delay before repeat start */ -+ *MCF_I2C_I2CR |= (MCF_I2C_I2CR_MSTA | MCF_I2C_I2CR_RSTA); -+ } -+ -+ -+ /* combine the R/W bit and the 7 bit target address and put it onto -+ the I2C bus */ -+ *MCF_I2C_I2DR = ((target_address & 0x7F) << 1) | (read_write == I2C_SMBUS_WRITE ? 0x00 : 0x01); -+ -+ /* wait for bus transfer to complete */ -+ /* when one byte transfer is completed, IIF set at the faling edge of -+ the 9th clock */ -+ timeout = 500; -+ while (timeout-- && !(*MCF_I2C_I2SR & MCF_I2C_I2SR_IIF)) -+ udelay(1); -+ if (timeout <= 0) -+ printk("%s - I2C IIF never set. Timeout is %d \n", __FUNCTION__, timeout); -+ -+ -+check_rc: -+ /* reset the interrupt bit */ -+ *MCF_I2C_I2SR &= ~MCF_I2C_I2SR_IIF; -+ -+ if (timeout <= 0) -+ return -1; -+ else -+ return 0; -+}; -+ -+ -+/* -+ * 5282 SMBUS supporting functions -+ */ -+ -+static s32 coldfire_i2c_access(struct i2c_adapter *adap, u16 addr, -+ unsigned short flags, char read_write, -+ u8 command, int size, union i2c_smbus_data *data) -+{ -+ int rc = 0; -+ u8 rxData, tempRxData[2]; -+ -+ switch (size) { -+ case I2C_SMBUS_QUICK: -+ rc = coldfire_i2c_start(read_write, addr, FIRST_START); /* generate START */ -+ break; -+ case I2C_SMBUS_BYTE: -+ rc = coldfire_i2c_start(read_write, addr, FIRST_START); -+ *MCF_I2C_I2CR |= MCF_I2C_I2CR_TXAK; /*generate NA */ -+ if (read_write == I2C_SMBUS_WRITE) -+ rc += coldfire_write_data(command); -+ else { -+ coldfire_read_data(&rxData, NACK);/*dummy read*/ -+ rc += coldfire_read_data(&rxData, NACK); -+ data->byte = rxData; -+ } -+ *MCF_I2C_I2CR &= ~MCF_I2C_I2CR_TXAK; /* reset ACK bit */ -+ break; -+ case I2C_SMBUS_BYTE_DATA: -+ rc = coldfire_i2c_start(I2C_SMBUS_WRITE, addr, FIRST_START); -+ rc += coldfire_write_data(command); -+ if (read_write == I2C_SMBUS_WRITE) -+ rc += coldfire_write_data(data->byte); -+ else { -+ /* This is SMBus READ Byte Data Request. -+ Perform REPEAT START */ -+ rc += coldfire_i2c_start(I2C_SMBUS_READ, addr, -+ REPEAT_START); -+ coldfire_read_data(&rxData, ACK);/* dummy read*/ -+ /* Disable Acknowledge, generate STOP after -+ next byte transfer */ -+ rc += coldfire_read_data(&rxData, NACK); -+ data->byte = rxData; -+ } -+ *MCF_I2C_I2CR &= ~MCF_I2C_I2CR_TXAK;/* reset to normal ACk */ -+ break; -+ case I2C_SMBUS_PROC_CALL: -+ case I2C_SMBUS_WORD_DATA: -+ dev_info(&adap->dev, "size = I2C_SMBUS_WORD_DATA \n"); -+ rc = coldfire_i2c_start(I2C_SMBUS_WRITE, addr, -+ FIRST_START); -+ rc += coldfire_write_data(command); -+ if (read_write == I2C_SMBUS_WRITE) { -+ rc += coldfire_write_data(data->word & 0x00FF); -+ rc += coldfire_write_data((data->word & 0x00FF) >> 8); -+ } else { -+ /* This is SMBUS READ WORD request. -+ Peform REPEAT START */ -+ rc += coldfire_i2c_start(I2C_SMBUS_READ, addr, -+ REPEAT_START); -+ coldfire_read_data(&rxData, ACK);/* dummy read*/ -+ /* Disable Acknowledge, generate STOP after -+ next byte transfer */ -+ /* read the MS byte from the device */ -+ rc += coldfire_read_data(&rxData, NACK); -+ tempRxData[1] = rxData; -+ /* read the LS byte from the device */ -+ rc += coldfire_read_data(&rxData, NACK); -+ tempRxData[0] = rxData; -+ /* the host driver expect little endian -+ convention. Swap the byte */ -+ data->word = (tempRxData[0] << 8)|tempRxData[1]; -+ } -+ *MCF_I2C_I2CR &= ~MCF_I2C_I2CR_TXAK; -+ break; -+ case I2C_SMBUS_BLOCK_DATA: -+ /* Not done yet */ -+ break; -+ default: -+ printk("Unsupported I2C size \n"); -+ rc = -1; -+ break; -+ }; -+ -+ /* Generate a STOP and put I2C module into slave mode */ -+ *MCF_I2C_I2CR &= ~MCF_I2C_I2CR_MSTA; -+ -+ /* restore interrupt */ -+ *MCF_I2C_I2CR |= MCF_I2C_I2CR_IIEN; -+ -+ if (rc < 0) -+ return -1; -+ else -+ return 0; -+}; -+ -+ -+/* -+ * List the SMBUS functions supported by this I2C adaptor -+ * Also tell the I2C Subsystem that we are able of master_xfer() -+ */ -+static u32 coldfire_func(struct i2c_adapter *adapter) -+{ -+ return(I2C_FUNC_SMBUS_QUICK | -+ I2C_FUNC_SMBUS_BYTE | -+ I2C_FUNC_SMBUS_PROC_CALL | -+ I2C_FUNC_SMBUS_BYTE_DATA | -+ I2C_FUNC_SMBUS_WORD_DATA | -+ I2C_FUNC_I2C | -+ I2C_FUNC_SMBUS_BLOCK_DATA); -+}; -+ -+static int coldfire_i2c_master(struct i2c_adapter *adap,struct i2c_msg *msgs, -+ int num) -+{ -+ u8 dummyRead; -+ struct i2c_msg *p; -+ int i, err = 0; -+ int ic=0; -+ -+ lastaddr = 0; -+ lastop = 8; -+ -+ /* disable the IRQ, we are doing polling */ -+ *MCF_I2C_I2CR &= ~MCF_I2C_I2CR_IIEN; -+ -+ dev_dbg(&adap->dev,"Num of actions: %d\n", num); -+ -+ for (i = 0; !err && i < num; i++) { -+ p = &msgs[i]; -+ -+ -+ if (!p->len) -+ { -+ dev_dbg(&adap->dev,"p->len == 0!\n"); -+ continue; -+ } -+ /* -+ * Generate a new Start, if the target address differs from -+ * the last target, generate a stop in this case first -+ */ -+ if(p->addr != lastaddr) -+ { -+ err = coldfire_do_first_start(p->addr,p->flags); -+ if(err) -+ { -+ dev_dbg(&adap->dev,"First Init failed!\n"); -+ break; -+ } -+ } -+ -+ else if((p->flags & I2C_M_RD) != lastop) -+ { -+ /* -+ * If the Operational Mode changed, we need to do this -+ * here ... -+ */ -+ dev_dbg(&adap->dev,"%s(): Direction changed, was: %d; is now: %d\n", __FUNCTION__, lastop, p->flags & I2C_M_RD); -+ -+ /* Last op was an read, now it's write: complete stop -+ and reinit */ -+ if (lastop & I2C_M_RD) -+ { -+ dev_dbg(&adap->dev,"%s(): The device is in read state, we must reset!\n", __FUNCTION__); -+ if((err = coldfire_do_first_start(p->addr,p->flags))) -+ break; -+ } -+ else -+ { -+ dev_dbg(&adap->dev,"%s(): We switchted to read mode\n",__FUNCTION__); -+ if((err = coldfire_i2c_start((p->flags & I2C_M_RD) ? I2C_SMBUS_READ : I2C_SMBUS_WRITE, -+ p->addr, REPEAT_START))) -+ break; -+ } -+ -+ lastop = p->flags & I2C_M_RD; /* Save the last op */ -+ } -+ -+ if (p->flags & I2C_M_RD) -+ { -+ /* -+ * When ever we get here, a new session was activated, -+ * so read a dummy byte -+ */ -+ coldfire_read_data(&dummyRead, ACK); -+ /* -+ * read p->len -1 bytes with ACK to the slave, -+ * read the last byte without the ACK, to inform him -+ * about the stop afterwards -+ */ -+ ic = 0; -+ while(!err && (ic < p->len-1 )) -+ { -+ err = coldfire_read_data(p->buf+ic, ACK ); -+ ic++; -+ } -+ if(!err) -+ err = coldfire_read_data(p->buf+ic, NACK); -+ dev_dbg(&coldfire_adapter.dev,"read: %2x\n",p->buf[ic]); -+ } -+ else -+ { -+ if(p->len == 2) -+ dev_dbg(&coldfire_adapter.dev,"writing: 0x %2x %2x\n", p->buf[0], p->buf[1]); -+ -+ /* -+ * Write data to the slave -+ */ -+ for(ic=0; !err && ic < p->len; ic++) -+ { -+ err = coldfire_write_data(p->buf[ic]); -+ if(err) -+ { -+ dev_dbg(&coldfire_adapter.dev, "Failed to write data\n"); -+ } -+ } -+ } -+ } -+ -+ /* -+ * Put the device into slave mode to enable the STOP Generation -+ * (the RTC needs this) -+ */ -+ *MCF_I2C_I2CR &= ~MCF_I2C_I2CR_MSTA; -+ -+ *MCF_I2C_I2CR &= ~MCF_I2C_I2CR_TXAK; /* reset the ACK bit */ -+ -+ /* restore interrupt */ -+ *MCF_I2C_I2CR |= MCF_I2C_I2CR_IIEN; -+ -+ /* Return the number of messages processed, or the error code. */ -+ if (err == 0) -+ err = num; -+ return err; -+} -+ -+ -+/* -+ * Initalize the 5282 I2C module -+ * Disable the 5282 I2C interrupt capability. Just use callback -+ */ -+ -+static int __init i2c_coldfire_init(void) -+{ -+ int retval; -+ u8 dummyRead; -+ -+#if defined(CONFIG_M532x) || defined(CONFIG_M5445X) -+ /* -+ * Initialize the GPIOs for I2C -+ */ -+ MCF_GPIO_PAR_FECI2C |= (0 -+ | MCF_GPIO_PAR_FECI2C_PAR_SDA(3) -+ | MCF_GPIO_PAR_FECI2C_PAR_SCL(3)); -+#elif defined(CONFIG_M5253) -+ { -+ volatile u32 *reg; -+ /* GPIO Bit 41 = SCL0, Bit 42 = SDA0 */ -+ reg = (volatile u32 *)(MCF_MBAR2 + MCFSIM2_GPIO1FUNC); -+ *reg &= 0xFFFFF9FF; -+ } -+#else -+ /* Initialize PASP0 and PASP1 to I2C functions, 5282 user guide 26-19 */ -+ /* Port AS Pin Assignment Register (PASPAR) */ -+ /* PASPA1 = 11 = AS1 pin is I2C SDA */ -+ /* PASPA0 = 11 = AS0 pin is I2C SCL */ -+ *MCF_GPIO_PASPAR |= 0x000F; /* u16 declaration */ -+#endif -+ -+ -+ /* Set transmission frequency 0x15 = ~100kHz */ -+ *MCF_I2C_I2FDR = 0x15; -+ -+ /* set the 5282 I2C slave address though we never use it */ -+ *MCF_I2C_I2ADR = 0x6A; -+ -+ /* Enable I2C module and if IBB is set, do the special initialzation */ -+ /* procedures as are documented at the 5282 User Guide page 24-11 */ -+ *MCF_I2C_I2CR |= MCF_I2C_I2CR_IEN; -+ if ((*MCF_I2C_I2SR & MCF_I2C_I2SR_IBB) == 1) { -+ printk("%s - do special 5282 I2C init procedures \n", -+ __FUNCTION__); -+ *MCF_I2C_I2CR = 0x00; -+ *MCF_I2C_I2CR = 0xA0; -+ dummyRead = *MCF_I2C_I2DR; -+ *MCF_I2C_I2SR = 0x00; -+ *MCF_I2C_I2CR = 0x00; -+ } -+ -+ /* default I2C mode is - slave and receive */ -+ *MCF_I2C_I2CR &= ~(MCF_I2C_I2CR_MSTA | MCF_I2C_I2CR_MTX); -+ -+ coldfire_adapter.dev.parent = &platform_bus; -+ retval = i2c_add_adapter(&coldfire_adapter); -+ -+ if (retval < 0) -+ printk("%s - return code is: %d \n", __FUNCTION__, retval); -+ -+ return retval; -+}; -+ -+ -+/* -+ * I2C module exit function -+ */ -+ -+static void __exit i2c_coldfire_exit(void) -+{ -+ /* disable I2C and Interrupt */ -+ *MCF_I2C_I2CR &= ~(MCF_I2C_I2CR_IEN | MCF_I2C_I2CR_IIEN); -+ i2c_del_adapter(&coldfire_adapter); -+ -+}; -+ -+ -+MODULE_AUTHOR("Derek CL Cheung <derek.cheung@sympatico.ca>"); -+MODULE_DESCRIPTION("MCF5282 I2C adaptor"); -+MODULE_LICENSE("GPL"); -+ -+module_init(i2c_coldfire_init); -+module_exit(i2c_coldfire_exit); ---- /dev/null -+++ b/drivers/i2c/busses/i2c-mcf.h -@@ -0,0 +1,75 @@ -+/* -+ i2c-mcf.h - header file for i2c-mcf.c -+ -+ Copyright (c) 2005, Derek CL Cheung <derek.cheung@sympatico.ca> -+ <http://www3.sympatico.ca/derek.cheung> -+ -+ Copyright (c) 2006-2007, emlix -+ Sebastian Hess <sh@emlix.com> -+ -+ Copyright (c) 2006-2007 Freescale Semiconductor, Inc -+ Yaroslav Vinogradov <yaroslav.vinogradov@freescale.com> -+ Matt Waddel <Matt.Waddel@freescale.com> -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 2 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program; if not, write to the Free Software -+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -+ -+ Changes: -+ v0.1 26 March 2005 -+ Initial Release - developed on uClinux with 2.6.9 kernel -+ v0.2 29 May 2006 -+ Modified to be more generic and added support for -+ i2c_master_xfer -+*/ -+ -+ -+#ifndef __I2C_MCF_H__ -+#define __I2C_MCF_H__ -+ -+enum I2C_START_TYPE { FIRST_START, REPEAT_START }; -+enum I2C_ACK_TYPE { ACK, NACK}; -+ -+/* Function prototypes */ -+static u32 coldfire_func(struct i2c_adapter *adapter); -+static s32 coldfire_i2c_access(struct i2c_adapter *adap, u16 address, -+ unsigned short flags, char read_write, -+ u8 command, int size, union i2c_smbus_data *data); -+static int coldfire_write_data(const u8 data); -+static int coldfire_i2c_start(const char read_write, const u16 target_address, const enum I2C_START_TYPE i2c_start); -+static int coldfire_read_data(u8 * const rxData, const enum I2C_ACK_TYPE ackType); -+static int coldfire_i2c_master(struct i2c_adapter *adap,struct i2c_msg *msgs, int num); -+void dumpReg(char *, u16 addr, u8 data); -+ -+#define MCF_I2C_I2ADR_ADDR(x) (((x)&0x7F)<<0x01) -+#define MCF_I2C_I2FDR_IC(x) (((x)&0x3F)) -+ -+/* I2C Control Register */ -+#define MCF_I2C_I2CR_IEN (0x80) /* I2C enable */ -+#define MCF_I2C_I2CR_IIEN (0x40) /* interrupt enable */ -+#define MCF_I2C_I2CR_MSTA (0x20) /* master/slave mode */ -+#define MCF_I2C_I2CR_MTX (0x10) /* transmit/receive mode */ -+#define MCF_I2C_I2CR_TXAK (0x08) /* transmit acknowledge enable */ -+#define MCF_I2C_I2CR_RSTA (0x04) /* repeat start */ -+ -+/* I2C Status Register */ -+#define MCF_I2C_I2SR_ICF (0x80) /* data transfer bit */ -+#define MCF_I2C_I2SR_IAAS (0x40) /* I2C addressed as a slave */ -+#define MCF_I2C_I2SR_IBB (0x20) /* I2C bus busy */ -+#define MCF_I2C_I2SR_IAL (0x10) /* aribitration lost */ -+#define MCF_I2C_I2SR_SRW (0x04) /* slave read/write */ -+#define MCF_I2C_I2SR_IIF (0x02) /* I2C interrupt */ -+#define MCF_I2C_I2SR_RXAK (0x01) /* received acknowledge */ -+ -+/********************************************************************/ -+#endif /* __I2C_MCF_H__ */ ---- a/drivers/i2c/busses/Kconfig -+++ b/drivers/i2c/busses/Kconfig -@@ -4,6 +4,18 @@ - - menu "I2C Hardware Bus support" - -+config I2C_MCF548x -+ tristate "I2C MCF547x/548x interfaces" -+ depends on I2C -+ help -+ This allows you to use the I2C adapters found on the Freescale -+ MCF547x/548x microcontrollers. -+ Say Y if you own an I2C adapter belonging to this class and then say -+ Y to the specific driver for you adapter below. -+ -+ This support is also available as a module. If so, the module -+ will be called i2c-algo-mcf. -+ - config I2C_ALI1535 - tristate "ALI 1535" - depends on PCI -@@ -290,6 +302,16 @@ config I2C_POWERMAC - This support is also available as a module. If so, the module - will be called i2c-powermac. - -+config I2C_MCF -+ tristate "MCF ColdFire" -+ depends on I2C && EXPERIMENTAL -+ help -+ If you say yes to this option, support will be included for the -+ I2C on most ColdFire CPUs -+ -+ This driver can also be built as a module. If so, the module -+ will be called i2c-mcf. -+ - config I2C_MPC - tristate "MPC107/824x/85xx/52xx/86xx" - depends on PPC32 ---- a/drivers/i2c/busses/Makefile -+++ b/drivers/i2c/busses/Makefile -@@ -52,6 +52,8 @@ obj-$(CONFIG_I2C_VIAPRO) += i2c-viapro.o - obj-$(CONFIG_I2C_VOODOO3) += i2c-voodoo3.o - obj-$(CONFIG_SCx200_ACB) += scx200_acb.o - obj-$(CONFIG_SCx200_I2C) += scx200_i2c.o -+obj-$(CONFIG_I2C_MCF548x) += i2c-mcf548x.o -+obj-$(CONFIG_I2C_MCF) += i2c-mcf.o - - ifeq ($(CONFIG_I2C_DEBUG_BUS),y) - EXTRA_CFLAGS += -DDEBUG ---- a/drivers/macintosh/Kconfig -+++ b/drivers/macintosh/Kconfig -@@ -118,7 +118,6 @@ config PMAC_SMU - - config PMAC_APM_EMU - tristate "APM emulation" -- select APM_EMULATION - depends on ADB_PMU && PM && PPC32 - - config PMAC_MEDIABAY ---- a/drivers/Makefile -+++ b/drivers/Makefile -@@ -93,3 +93,5 @@ obj-$(CONFIG_PPC_PS3) += ps3/ - obj-$(CONFIG_OF) += of/ - obj-$(CONFIG_SSB) += ssb/ - obj-$(CONFIG_VIRTIO) += virtio/ -+ -+obj-$(CONFIG_MCD_DMA) += dma/ ---- /dev/null -+++ b/drivers/net/can/flexcan/flexcan.c -@@ -0,0 +1,378 @@ -+/* -+ * flexcan.c -+ * -+ * DESCRIPTION: -+ * CAN bus driver for the alone generic (as possible as) FLEXCAN controller. -+ * -+ * AUTHOR: -+ * Andrey Volkov <avolkov@varma-el.com> -+ * -+ * COPYRIGHT: -+ * 2005-2006, Varma Electronics Oy -+ * -+ * LICENCE: -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -+ * -+ * HISTORY: -+ * 2008-06-23 Support for MCF548x's FlexCAN -+ * Huan, Wang <b18965@freescale.com> -+ */ -+ -+ -+ -+#include <linux/kernel.h> -+#include <linux/module.h> -+#include <linux/interrupt.h> -+#include <linux/delay.h> -+#include <linux/netdevice.h> -+#include <linux/if_arp.h> -+#include <linux/if_ether.h> -+#include <linux/can.h> -+#include <linux/list.h> -+#include <linux/io.h> -+ -+#include <linux/can/dev.h> -+#include <linux/can/error.h> -+#include "flexcan.h" -+#include <asm/coldfire.h> -+#include <asm/m5485sim.h> -+#include <linux/can/version.h> /* for RCSID. Removed by mkpatch script */ -+RCSID("$Id$"); -+ -+struct flexcan_priv { -+ struct can_priv can; -+ volatile unsigned long flags; -+ u8 shadow_statflg; -+ u8 shadow_canrier; -+ u8 cur_pri; -+ u8 tx_active; -+ -+ struct list_head tx_head; -+ struct napi_struct napi; -+ struct net_device *dev; -+}; -+ -+ -+static int flexcan_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) -+{ -+ struct can_frame *frame = (struct can_frame *)skb->data; -+ struct flexcan_regs *regs = (struct flexcan_regs *)dev->base_addr; -+ int i, len; -+ int txbuf = 0; -+ u32 can_id, can_ext, tmp, tmp1; -+ -+ /* Transmission inactive */ -+ regs->cantxfg[txbuf].can_dlc = MB_CNT_CODE(0x08); -+ -+ can_ext = frame->can_id; -+ if (can_ext & CAN_EFF_FLAG) { -+ /* Frame format is extended */ -+ regs->cantxfg[txbuf].can_dlc |= (1 << 21); -+ regs->cantxfg[txbuf].can_dlc |= (1 << 22); -+ can_id = frame->can_id & MB_ID_EXT; -+ if (frame->can_id & CAN_RTR_FLAG) -+ regs->cantxfg[txbuf].can_dlc |= (1 << 20); -+ -+ tmp = (can_id & CAN_SFF_MASK) << 18; -+ tmp1 = can_id >> 11; -+ can_id = tmp | tmp1; -+ regs->cantxfg[txbuf].can_id = can_id; -+ } else { -+ /* Frame format is standard */ -+ can_id = frame->can_id & MB_ID_EXT; -+ if (frame->can_id & CAN_RTR_FLAG) -+ regs->cantxfg[txbuf].can_dlc |= (1 << 20); -+ -+ regs->cantxfg[txbuf].can_id = can_id << 18; -+ } -+ -+ len = 8; -+ for (i = 0; i < len; i++) -+ regs->cantxfg[txbuf].data[i] = frame->data[i]; -+ -+ regs->cantxfg[txbuf].can_dlc |= len << 16; -+ /* Transmission active */ -+ regs->cantxfg[txbuf].can_dlc |= MB_CNT_CODE(0x0c); -+ kfree_skb(skb); -+ return NETDEV_TX_OK; -+} -+ -+static void flexcan_tx_timeout(struct net_device *dev) -+{ -+ struct sk_buff *skb; -+ struct flexcan_regs *regs = (struct flexcan_regs *)dev->base_addr; -+ struct can_frame *frame; -+ int length = 8; -+ -+ /* Diable the interrupts */ -+ regs->imask = IMASK_BUFF_DISABLE_ALL; -+ -+ skb = dev_alloc_skb(sizeof(struct can_frame)); -+ if (!skb) { -+ if (printk_ratelimit()) -+ dev_notice(ND2D(dev), "TIMEOUT packet dropped.\n"); -+ return; -+ } -+ frame = (struct can_frame *)skb_put(skb, sizeof(struct can_frame)); -+ -+ frame->can_dlc = length; -+ -+ skb->dev = dev; -+ skb->protocol = __constant_htons(ETH_P_CAN); -+ skb->pkt_type = PACKET_BROADCAST; -+ skb->ip_summed = CHECKSUM_UNNECESSARY; -+ -+ netif_rx(skb); -+} -+ -+static irqreturn_t flexcan_isr(int irq, void *dev_id) -+{ -+ struct net_device *dev = (struct net_device *)dev_id; -+ struct flexcan_regs *regs = (struct flexcan_regs *)dev->base_addr; -+ struct net_device_stats *stats = dev->get_stats(dev); -+ struct sk_buff *skb; -+ struct can_frame *frame; -+ u32 iflags, oflags; -+ int i, k; -+ int retval = 1; -+ -+ iflags = regs->iflag; -+ oflags = iflags; -+ for (i = 0; i < 16; i++) { -+ if (iflags & (0x01 << i)) { -+ struct flexcan_mb *mb = ®s->cantxfg[i]; -+ int ctrl = mb->can_dlc; -+ int code = (ctrl >> 24) & 0x0f; -+ int length = (ctrl >> 16) & 0x0f; -+ u32 tmp, tmp1; -+ -+ if (code < 8 && (length > 0)) { -+ /* receive frame */ -+ skb = dev_alloc_skb(sizeof(struct can_frame)); -+ if (!skb) -+ dev_notice(ND2D(dev), -+ "Packets dropped.\n"); -+ skb->dev = dev; -+ frame = (struct can_frame *)skb_put(skb, -+ sizeof(struct can_frame)); -+ -+ frame->can_id &= 0x0; -+ frame->can_dlc = length; -+ tmp1 = mb->can_id & MB_ID_EXT; -+ if (ctrl & MB_CNT_IDE) { -+ tmp = tmp1; -+ tmp = (tmp >> 18) & CAN_SFF_MASK; -+ frame->can_id = (tmp1 << 11) | tmp; -+ frame->can_id &= CAN_EFF_MASK; -+ frame->can_id |= CAN_EFF_FLAG; -+ if (ctrl & MB_CNT_RTR) -+ frame->can_id |= CAN_RTR_FLAG; -+ } else { -+ frame->can_id = tmp1 >> 18; -+ if (ctrl & MB_CNT_RTR) -+ frame->can_id |= CAN_RTR_FLAG; -+ } -+ -+ for (k = 0; k < 8; k++) -+ frame->data[k] = mb->data[k]; -+ -+ mb->can_dlc &= MB_CODE_MASK; -+ mb->can_dlc |= MB_CNT_CODE(0x04); -+ -+ stats->rx_packets++; -+ stats->rx_bytes += frame->can_dlc; -+ skb->dev = dev; -+ skb->protocol = __constant_htons(ETH_P_CAN); -+ skb->ip_summed = CHECKSUM_UNNECESSARY; -+ -+ retval = netif_rx(skb); -+ if (retval == NET_RX_DROP) -+ dev_notice(ND2D(dev), -+ "Packets dropped.\n"); -+ } else { -+ /* transmit frame */ -+ mb->can_dlc = MB_CNT_CODE(0x04); -+ } -+ } -+ } -+ regs->iflag = oflags; -+ -+ return IRQ_HANDLED; -+} -+ -+static int flexcan_do_set_bit_time(struct net_device *dev, -+ struct can_bittime *bt) -+{ -+ struct flexcan_priv *priv = netdev_priv(dev); -+ struct flexcan_regs *regs = (struct flexcan_regs *)dev->base_addr; -+ int ret = 0; -+ u32 reg; -+ -+ if (bt->type != CAN_BITTIME_STD) -+ return -EINVAL; -+ -+ spin_lock_irq(&priv->can.irq_lock); -+ -+ reg = CANCTRL_PRESDIV(bt->std.brp) | CANCTRL_PSEG1(bt->std.phase_seg1 -+ - 1) | CANCTRL_PSEG2(bt->std.phase_seg2 - 1); -+ regs->canctrl &= CANCTRL_BITTIME; -+ regs->canctrl |= (reg | CANCTRL_SAMP(bt->std.sam) | -+ CANCTRL_PROPSEG(bt->std.prop_seg - 1)); -+ -+ spin_unlock_irq(&priv->can.irq_lock); -+ return ret; -+} -+ -+ -+static int flexcan_open(struct net_device *dev) -+{ -+ int ret, i, j; -+ struct flexcan_regs *regs = (struct flexcan_regs *)dev->base_addr; -+ -+#if defined(CONFIG_M547X_8X) -+ MCF_PAR_TIMER = MCF_PAR_TIMER | 0x28; -+ MCF_PAR_TIMER = MCF_PAR_TIMER & 0xf8; -+ MCF_PAR_DSPI = MCF_PAR_DSPI | 0x0a00; -+ MCF_PAR_FECI2CIRQ = MCF_PAR_FECI2CIRQ | 0x0283; -+ MCF_PAR_PSCn(2) = MCF_PAR_PSCn(2) & 0x0f; -+ MCF_PAR_PSCn(2) = MCF_PAR_PSCn(2) | 0x50; -+#endif -+ -+ regs->canmcr |= CANMCR_SOFTRST; -+ regs->canmcr |= CANMCR_MDIS; -+ udelay(10); -+ -+ if ((regs->canmcr & CANMCR_SOFTRST) != 0x0) { -+ dev_err(ND2D(dev), "Failed to softreset can module.\n"); -+ return -1; -+ } -+ -+ /* Enable error and bus off interrupt */ -+ regs->canctrl |= (CANCTRL_RJW(3) | CANCTRL_ERRMSK | -+ CANCTRL_BOFFMSK); -+ -+ /* Set lowest buffer transmitted first */ -+ regs->canctrl |= CANCTRL_LBUF; -+ -+ for (i = 0; i < 16; i++) { -+ regs->cantxfg[i].can_dlc = 0; -+ regs->cantxfg[i].can_id = 0; -+ for (j = 0; j < 8; j++) -+ regs->cantxfg[i].data[j] = 0; -+ -+ /* Put MB into rx queue */ -+ regs->cantxfg[i].can_dlc = MB_CNT_CODE(0x04); -+ } -+ -+ /* acceptance mask/acceptance code (accept everything) */ -+ regs->rxgmask = 0x00000000; -+ regs->rx14mask = 0x00000000; -+ regs->rx15mask = 0x00000000; -+ /* extended frame */ -+ regs->cantxfg[14].can_dlc |= 0x600000; -+ /* Enable flexcan module */ -+ regs->canmcr &= ~CANMCR_MDIS; -+ /* Synchronize with the can bus */ -+ regs->canmcr &= ~CANMCR_HALT; -+ -+#if defined(CONFIG_M547X_8X) -+ for (i = 0; i < 2; i++) { -+ MCF_ICR(ISC_CANn_MBOR(i)) = 0x33; -+ MCF_ICR(ISC_CANn_ERR(i)) = 0x33; -+ MCF_ICR(ISC_CANn_BUSOFF(i)) = 0x33; -+ } -+ -+ ret = request_irq(dev->irq + 64, flexcan_isr, IRQF_DISABLED, -+ dev->name, dev); -+ ret = request_irq(dev->irq + 1 + 64, flexcan_isr, IRQF_DISABLED, -+ dev->name, dev); -+ ret = request_irq(dev->irq + 2 + 64, flexcan_isr, IRQF_DISABLED, -+ dev->name, dev); -+ if (ret < 0) { -+ printk(KERN_ERR "%s - failed to attach interrupt.\n", -+ dev->name); -+ return ret; -+ } -+#endif -+ -+ /* Enable all interrupts */ -+ regs->imask = IMASK_BUFF_ENABLE_ALL; -+ netif_start_queue(dev); -+ return 0; -+} -+ -+static int flexcan_close(struct net_device *dev) -+{ -+ struct flexcan_regs *regs = (struct flexcan_regs *)dev->base_addr; -+ -+ netif_stop_queue(dev); -+ -+ /* Disable all interrupts */ -+ regs->imask = IMASK_BUFF_DISABLE_ALL; -+ free_irq(dev->irq + 64, dev); -+ free_irq(dev->irq + 1 + 64, dev); -+ free_irq(dev->irq + 2 + 64, dev); -+ -+ /* Disable module */ -+ regs->canmcr |= CANMCR_MDIS; -+ return 0; -+} -+ -+int register_flexcandev(struct net_device *dev, int clock_src) -+{ -+ struct flexcan_regs *regs = (struct flexcan_regs *)dev->base_addr; -+ -+ regs->canmcr &= ~CANMCR_MDIS; -+ udelay(100); -+ regs->canmcr |= (CANMCR_FRZ | CANMCR_HALT); -+ return register_netdev(dev); -+} -+EXPORT_SYMBOL(register_flexcandev); -+ -+void unregister_flexcandev(struct net_device *dev) -+{ -+ struct flexcan_regs *regs = (struct flexcan_regs *)dev->base_addr; -+ -+ regs->canmcr |= (CANMCR_FRZ | CANMCR_HALT); -+ regs->canmcr |= CANMCR_MDIS; -+ -+ unregister_netdev(dev); -+} -+EXPORT_SYMBOL(unregister_flexcandev); -+ -+struct net_device *alloc_flexcandev(void) -+{ -+ struct net_device *dev; -+ struct flexcan_priv *priv; -+ -+ dev = alloc_candev(sizeof(struct flexcan_priv)); -+ if (!dev) -+ return NULL; -+ -+ priv = netdev_priv(dev); -+ priv->dev = dev; -+ dev->open = flexcan_open; -+ dev->stop = flexcan_close; -+ dev->hard_start_xmit = flexcan_hard_start_xmit; -+ dev->tx_timeout = flexcan_tx_timeout; -+ dev->flags |= IFF_NOARP; -+ priv->can.do_set_bit_time = flexcan_do_set_bit_time; -+ return dev; -+} -+EXPORT_SYMBOL(alloc_flexcandev); -+ -+MODULE_AUTHOR("Andrey Volkov <avolkov@varma-el.com>"); -+MODULE_LICENSE("GPL v2"); -+MODULE_DESCRIPTION("CAN port driver for flexcan based chip"); ---- /dev/null -+++ b/drivers/net/can/flexcan/flexcan.h -@@ -0,0 +1,148 @@ -+/* -+ * flexcan.h -+ * -+ * DESCRIPTION: -+ * Definitions of consts/structs to drive the Freescale FLEXCAN. -+ * -+ */ -+ -+#ifndef __FLEXCAN_H__ -+#define __FLEXCAN_H__ -+ -+#include <linux/autoconf.h> -+#include <linux/types.h> -+ -+/* FLEXCAN module configuration register (CANMCR) bits */ -+#define CANMCR_MDIS 0x80000000 -+#define CANMCR_FRZ 0x40000000 -+#define CANMCR_HALT 0x10000000 -+#define CANMCR_SOFTRST 0x02000000 -+#define CANMCR_FRZACK 0x01000000 -+#define CANMCR_SUPV 0x00800000 -+#define CANMCR_MAXMB(x) ((x)&0x0f) -+ -+/* FLEXCAN control register (CANCTRL) bits */ -+#define CANCTRL_PRESDIV(x) (((x)&0xff)<<24) -+#define CANCTRL_RJW(x) (((x)&0x03)<<22) -+#define CANCTRL_PSEG1(x) (((x)&0x07)<<19) -+#define CANCTRL_PSEG2(x) (((x)&0x07)<<16) -+#define CANCTRL_BOFFMSK 0x00008000 -+#define CANCTRL_ERRMSK 0x00004000 -+#define CANCTRL_LPB 0x00001000 -+#define CANCTRL_SAMP(x) (((x)&0x1)<<7) -+#define CANCTRL_BOFFREC 0x00000040 -+#define CANCTRL_TSYNC 0x00000020 -+#define CANCTRL_LBUF 0x00000010 -+#define CANCTRL_LOM 0x00000008 -+#define CANCTRL_PROPSEG(x) ((x)&0x07) -+#define CANCTRL_BITTIME 0x00c0d078 -+ -+/* FLEXCAN error counter register (ERRCNT) bits */ -+#define ERRCNT_REXECTR(x) (((x)&0xff)<<8) -+#define ERRCNT_TXECTR(x) ((x)&0xff) -+ -+/* FLEXCAN error and status register (ERRSTAT) bits */ -+#define ERRSTAT_BITERR(x) (((x)&0x03)<<14) -+#define ERRSTAT_ACKERR 0x00002000 -+#define ERRSTAT_CRCERR 0x00001000 -+#define ERRSTAT_FRMERR 0x00000800 -+#define ERRSTAT_STFERR 0x00000400 -+#define ERRSTAT_TXWRN 0x00000200 -+#define ERRSTAT_RXWRN 0x00000100 -+#define ERRSTAT_IDLE 0x00000080 -+#define ERRSTAT_TXRX 0x00000040 -+#define ERRSTAT_FLTCONF(x) (((x)&0x03)<<4) -+#define ERRSTAT_BOFFINT 0x00000004 -+#define ERRSTAT_ERRINT 0x00000002 -+ -+/* FLEXCAN interrupt mask register (IMASK) bits */ -+#define IMASK_BUF15M 0x8000 -+#define IMASK_BUF14M 0x4000 -+#define IMASK_BUF13M 0x2000 -+#define IMASK_BUF12M 0x1000 -+#define IMASK_BUF11M 0x0800 -+#define IMASK_BUF10M 0x0400 -+#define IMASK_BUF9M 0x0200 -+#define IMASK_BUF8M 0x0100 -+#define IMASK_BUF7M 0x0080 -+#define IMASK_BUF6M 0x0040 -+#define IMASK_BUF5M 0x0020 -+#define IMASK_BUF4M 0x0010 -+#define IMASK_BUF3M 0x0008 -+#define IMASK_BUF2M 0x0004 -+#define IMASK_BUF1M 0x0002 -+#define IMASK_BUF0M 0x0001 -+#define IMASK_BUFnM(x) (0x1<<(x)) -+#define IMASK_BUFF_ENABLE_ALL 0xffff -+#define IMASK_BUFF_DISABLE_ALL 0x0000 -+ -+/* FLEXCAN interrupt flag register (IFLAG) bits */ -+#define IFLAG_BUF15M 0x8000 -+#define IFLAG_BUF14M 0x4000 -+#define IFLAG_BUF13M 0x2000 -+#define IFLAG_BUF12M 0x1000 -+#define IFLAG_BUF11M 0x0800 -+#define IFLAG_BUF10M 0x0400 -+#define IFLAG_BUF9M 0x0200 -+#define IFLAG_BUF8M 0x0100 -+#define IFLAG_BUF7M 0x0080 -+#define IFLAG_BUF6M 0x0040 -+#define IFLAG_BUF5M 0x0020 -+#define IFLAG_BUF4M 0x0010 -+#define IFLAG_BUF3M 0x0008 -+#define IFLAG_BUF2M 0x0004 -+#define IFLAG_BUF1M 0x0002 -+#define IFLAG_BUF0M 0x0001 -+#define IFLAG_BUFnM(x) (0x1<<(x)) -+#define IFLAG_BUFF_SET_ALL 0xffff -+#define IFLAG_BUFF_DISABLE_ALL 0x0000 -+ -+/* FLEXCAN message buffers */ -+#define MB_CNT_CODE(x) (((x)&0x0f)<<24) -+#define MB_CNT_SRR 0x00400000 -+#define MB_CNT_IDE 0x00200000 -+#define MB_CNT_RTR 0x00100000 -+#define MB_CNT_LENGTH(x) (((x)&0x0f)<<16) -+#define MB_CNT_TIMESTAMP(x) ((x)&0xffff) -+ -+#define MB_ID_STD ((0x7ff)<<18) -+#define MB_ID_EXT 0x1fffffff -+#define MB_CODE_MASK 0xf0ffffff -+ -+/* Structure of the message buffer */ -+struct flexcan_mb { -+ u32 can_dlc; -+ u32 can_id; -+ u8 data[8]; -+}; -+ -+/* Structure of the hardware registers */ -+struct flexcan_regs { -+ u32 canmcr; -+ u32 canctrl; -+ u32 timer; -+ u32 reserved1; -+ u32 rxgmask; -+ u32 rx14mask; -+ u32 rx15mask; -+ u32 errcnt; -+ u32 errstat; -+ u32 reserved2; -+ u32 imask; -+ u32 reserved3; -+ u32 iflag; -+ u32 reserved4[19]; -+ struct flexcan_mb cantxfg[16]; -+}; -+ -+struct flexcan_platform_data { -+ u8 clock_src; /* FLEXCAN clock source CRIN or SYSCLK */ -+ u32 clock_frq; /* can ref. clock, in Hz */ -+}; -+ -+struct net_device *alloc_flexcandev(void); -+ -+extern int register_flexcandev(struct net_device *dev, int clock_src); -+extern void unregister_flexcandev(struct net_device *dev); -+ -+#endif /* __FLEXCAN_H__ */ ---- /dev/null -+++ b/drivers/net/can/flexcan/Makefile -@@ -0,0 +1,5 @@ -+ -+obj-$(CONFIG_CAN_MCF547X_8X) += flexcan-mcf548x.o -+ -+flexcan-mcf548x-objs := flexcan.o mcf548x_can.o -+ ---- /dev/null -+++ b/drivers/net/can/flexcan/mcf548x_can.c -@@ -0,0 +1,213 @@ -+/* -+ * DESCRIPTION: -+ * CAN bus driver for the Freescale MCF548x embedded CPU. -+ * -+ * AUTHOR: -+ * Andrey Volkov <avolkov@varma-el.com> -+ * -+ * COPYRIGHT: -+ * 2004-2005, Varma Electronics Oy -+ * -+ * LICENCE: -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -+ * -+ * HISTORY: -+ * 2008-06-23 support for MCF548x's FlexCAN -+ * Huan, Wang <b18965@freescale.com> -+ * 2005-02-03 created -+ * -+ */ -+ -+#include <linux/kernel.h> -+#include <linux/module.h> -+#include <linux/interrupt.h> -+#include <linux/platform_device.h> -+#include <linux/netdevice.h> -+#include <linux/can.h> -+#include <linux/can/dev.h> -+#include <linux/io.h> -+ -+#include "flexcan.h" -+#include <asm/coldfire.h> -+#include <asm/m5485sim.h> -+#include <linux/can/version.h> /* for RCSID. Removed by mkpatch script */ -+ -+RCSID("$Id$"); -+ -+#define PDEV_MAX 2 -+ -+struct platform_device *pdev[PDEV_MAX]; -+ -+static int __devinit mcf548x_can_probe(struct platform_device *pdev) -+{ -+ struct resource *mem; -+ struct net_device *dev; -+ struct flexcan_platform_data *pdata = pdev->dev.platform_data; -+ struct can_priv *can; -+ u32 mem_size; -+ int ret = -ENODEV; -+ -+ if (!pdata) -+ return ret; -+ -+ dev = alloc_flexcandev(); -+ if (!dev) -+ return -ENOMEM; -+ can = netdev_priv(dev); -+ -+ mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); -+ -+ dev->irq = platform_get_irq(pdev, 0); -+ if (!mem || !dev->irq) -+ goto req_error; -+ -+ mem_size = mem->end - mem->start + 1; -+ if (!request_mem_region(mem->start, mem_size, pdev->dev.driver->name)) { -+ dev_err(&pdev->dev, "resource unavailable\n"); -+ goto req_error; -+ } -+ SET_NETDEV_DEV(dev, &pdev->dev); -+ -+ dev->base_addr = (unsigned long)ioremap_nocache(mem->start, mem_size); -+ if (!dev->base_addr) { -+ dev_err(&pdev->dev, "failed to map can port\n"); -+ ret = -ENOMEM; -+ goto fail_map; -+ } -+ can->can_sys_clock = pdata->clock_frq; -+ platform_set_drvdata(pdev, dev); -+ ret = register_flexcandev(dev, pdata->clock_src); -+ if (ret >= 0) { -+ dev_info(&pdev->dev, "probe for port 0x%lX done\n", -+ dev->base_addr); -+ return ret; -+ } -+ -+ iounmap((unsigned long *)dev->base_addr); -+fail_map: -+ release_mem_region(mem->start, mem_size); -+req_error: -+ free_candev(dev); -+ dev_err(&pdev->dev, "probe failed\n"); -+ return ret; -+} -+ -+static int __devexit mcf548x_can_remove(struct platform_device *pdev) -+{ -+ struct net_device *dev = platform_get_drvdata(pdev); -+ struct resource *mem; -+ -+ platform_set_drvdata(pdev, NULL); -+ unregister_flexcandev(dev); -+ iounmap((unsigned long *)dev->base_addr); -+ -+ mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); -+ release_mem_region(mem->start, mem->end - mem->start + 1); -+ free_candev(dev); -+ return 0; -+} -+ -+static struct platform_driver mcf548x_can_driver = { -+ .driver = { -+ .name = "mcf548x-flexcan", -+ }, -+ .probe = mcf548x_can_probe, -+ .remove = __devexit_p(mcf548x_can_remove), -+}; -+ -+static struct resource mcf548x_can0_resources[] = { -+ [0] = { -+ .start = MCF_MBAR + 0x0000A000, -+ .end = MCF_MBAR + 0x0000A7FF, -+ .flags = IORESOURCE_MEM, -+ }, -+ [1] = { -+ .start = 49, -+ .end = 49, -+ .flags = IORESOURCE_IRQ, -+ }, -+}; -+ -+static struct resource mcf548x_can1_resources[] = { -+ [0] = { -+ .start = MCF_MBAR + 0x0000A800, -+ .end = MCF_MBAR + 0x0000AFFF, -+ .flags = IORESOURCE_MEM, -+ }, -+ [1] = { -+ .start = 55, -+ .end = 55, -+ .flags = IORESOURCE_IRQ, -+ }, -+}; -+ -+ -+static int __init mcf548x_of_to_pdev(void) -+{ -+ unsigned int i; -+ int err = -ENODEV; -+ struct flexcan_platform_data pdata; -+ -+ pdev[0] = platform_device_register_simple("mcf548x-flexcan", 0, -+ mcf548x_can0_resources, 2); -+ if (IS_ERR(pdev[0])) { -+ err = PTR_ERR(pdev[0]); -+ return err; -+ } -+ pdev[1] = platform_device_register_simple("mcf548x-flexcan", 1, -+ mcf548x_can1_resources, 2); -+ if (IS_ERR(pdev[1])) { -+ err = PTR_ERR(pdev[1]); -+ return err; -+ } -+ -+ /* FlexCAN clock */ -+ pdata.clock_frq = 100000000; -+ -+ for (i = 0; i < PDEV_MAX; i++) { -+ err = platform_device_add_data(pdev[i], &pdata, sizeof(pdata)); -+ if (err) -+ return err; -+ } -+ return err; -+} -+ -+int __init mcf548x_can_init(void) -+{ -+ int err = mcf548x_of_to_pdev(); -+ -+ if (err) { -+ printk(KERN_ERR "%s init failed with err=%d\n", -+ mcf548x_can_driver.driver.name, err); -+ return err; -+ } -+ -+ return platform_driver_register(&mcf548x_can_driver); -+} -+ -+void __exit mcf548x_can_exit(void) -+{ -+ int i; -+ platform_driver_unregister(&mcf548x_can_driver); -+ for (i = 0; i < PDEV_MAX; i++) -+ platform_device_unregister(pdev[i]); -+} -+ -+module_init(mcf548x_can_init); -+module_exit(mcf548x_can_exit); -+ -+MODULE_AUTHOR("Andrey Volkov <avolkov@varma-el.com>"); -+MODULE_DESCRIPTION("Freescale MCF548x CAN driver"); -+MODULE_LICENSE("GPL v2"); ---- a/drivers/net/can/Kconfig -+++ b/drivers/net/can/Kconfig -@@ -12,6 +12,19 @@ config CAN_VCAN - This driver can also be built as a module. If so, the module - will be called vcan. - -+config CAN_FLEXCAN -+ tristate "Support for Freescale FLEXCAN based chips" -+ depends on CAN && (PPC || M68K || M68KNOMMU) -+ ---help--- -+ Say Y here if you want to support for Freescale FlexCAN. -+ -+config CAN_MCF547X_8X -+ tristate "Freescale MCF547X/MCF548X onboard CAN controller" -+ depends on CAN_FLEXCAN && (M547X || M548X) -+ ---help--- -+ Say Y here if you want to support for Freescale MCF547x/MCF548x -+ onboard dualCAN controller. -+ - config CAN_DEBUG_DEVICES - bool "CAN devices debugging messages" - depends on CAN ---- a/drivers/net/can/Makefile -+++ b/drivers/net/can/Makefile -@@ -3,3 +3,4 @@ - # - - obj-$(CONFIG_CAN_VCAN) += vcan.o -+obj-$(CONFIG_CAN_FLEXCAN) += flexcan/ ---- /dev/null -+++ b/drivers/net/fec/fec.c -@@ -0,0 +1,1306 @@ -+/* -+ * Performance and stability improvements: (C) Copyright 2008, -+ * Daniel Krueger, SYSTEC electronic GmbH -+ * -+ * Code crunched to get it to work on 2.6.24 -- FEC cleanup coming -+ * soon -- Kurt Mahan -+ */ -+#include <linux/module.h> -+#include <linux/kernel.h> -+#include <linux/string.h> -+#include <linux/ptrace.h> -+#include <linux/errno.h> -+#include <linux/ioport.h> -+#include <linux/slab.h> -+#include <linux/interrupt.h> -+#include <linux/pci.h> -+#include <linux/init.h> -+#include <linux/delay.h> -+#include <linux/netdevice.h> -+#include <linux/etherdevice.h> -+#include <linux/skbuff.h> -+#include <linux/spinlock.h> -+#include <linux/workqueue.h> -+#include <linux/bitops.h> -+ -+#include <asm/coldfire.h> -+#include <asm/mcfsim.h> -+ -+#include <asm/dma.h> -+#include <asm/MCD_dma.h> -+#include <asm/m5485sram.h> -+#include <asm/virtconvert.h> -+#include <asm/irq.h> -+ -+#include "fec.h" -+#include "ks8721.h" -+ -+#ifdef CONFIG_FEC_548x_ENABLE_FEC2 -+#define FEC_MAX_PORTS 2 -+#define FEC_2 -+#else -+#define FEC_MAX_PORTS 1 -+#undef FEC_2 -+#endif -+ -+#define VERSION "0.20" -+MODULE_DESCRIPTION( "DMA Fast Ethernet Controller driver ver " VERSION); -+ -+/* fec private */ -+struct fec_priv { -+ struct net_device *netdev; /* owning net device */ -+ void* fecpriv_txbuf[FEC_TX_BUF_NUMBER]; /* tx buffer ptrs */ -+ MCD_bufDescFec *fecpriv_txdesc; /* tx descriptor ptrs */ -+ volatile unsigned int fecpriv_current_tx; /* current tx desc index */ -+ volatile unsigned int fecpriv_next_tx; /* next tx desc index */ -+ unsigned int fecpriv_current_rx; /* current rx desc index */ -+ MCD_bufDescFec *fecpriv_rxdesc; /* rx descriptor ptrs */ -+ struct sk_buff *askb_rx[FEC_RX_BUF_NUMBER]; /* rx SKB ptrs */ -+ unsigned int fecpriv_initiator_rx; /* rx dma initiator */ -+ unsigned int fecpriv_initiator_tx; /* tx dma initiator */ -+ int fecpriv_fec_rx_channel; /* rx dma channel */ -+ int fecpriv_fec_tx_channel; /* tx dma channel */ -+ int fecpriv_rx_requestor; /* rx dma requestor */ -+ int fecpriv_tx_requestor; /* tx dma requestor */ -+ void *fecpriv_interrupt_fec_rx_handler; /* dma rx handler */ -+ void *fecpriv_interrupt_fec_tx_handler; /* dma tx handler */ -+ unsigned char *fecpriv_mac_addr; /* private fec mac addr */ -+ struct net_device_stats fecpriv_stat; /* stats ptr */ -+ spinlock_t fecpriv_lock; -+ int fecpriv_rxflag; -+ struct tasklet_struct fecpriv_tasklet_reinit; -+ int index; /* fec hw number */ -+}; -+ -+struct net_device *fec_dev[FEC_MAX_PORTS]; -+ -+/* FEC functions */ -+int __init fec_init(void); -+struct net_device_stats *fec_get_stat(struct net_device *dev); -+int fec_open(struct net_device *dev); -+int fec_close(struct net_device *nd); -+int fec_tx(struct sk_buff *skb, struct net_device *dev); -+void fec_set_multicast_list(struct net_device *nd); -+int fec_set_mac_address(struct net_device *dev, void *p); -+void fec_tx_timeout(struct net_device *dev); -+void fec_interrupt_fec_tx_handler(struct net_device *dev); -+void fec_interrupt_fec_rx_handler(struct net_device *dev); -+irqreturn_t fec_interrupt_handler(int irq, void *dev_id); -+void fec_interrupt_fec_tx_handler_fec0(void); -+void fec_interrupt_fec_rx_handler_fec0(void); -+void fec_interrupt_fec_reinit(unsigned long data); -+ -+/* default fec0 address */ -+unsigned char fec_mac_addr_fec0[6] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x50 }; -+ -+#ifdef FEC_2 -+/* default fec1 address */ -+unsigned char fec_mac_addr_fec1[6] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x51 }; -+#endif -+ -+extern unsigned char uboot_enet0[]; -+extern unsigned char uboot_enet1[]; -+ -+#ifndef MODULE -+int fec_str_to_mac( char *str_mac, unsigned char* addr); -+int __init fec_mac_setup0 (char *s); -+#endif -+ -+ -+#ifdef FEC_2 -+void fec_interrupt_fec_tx_handler_fec1(void); -+void fec_interrupt_fec_rx_handler_fec1(void); -+#endif -+ -+#ifndef MODULE -+int __init fec_mac_setup1 (char *s); -+#endif -+ -+int fec_read_mii(unsigned int base_addr, unsigned int pa, unsigned int ra, unsigned int *data); -+int fec_write_mii(unsigned int base_addr, unsigned int pa, unsigned int ra, unsigned int data); -+ -+module_init(fec_init); -+/* module_exit(fec_cleanup); */ -+ -+__setup("mac0=", fec_mac_setup0); -+ -+#ifdef FEC_2 -+__setup("mac1=", fec_mac_setup1); -+#endif -+ -+/* -+ * Initialize a FEC device -+ */ -+int fec_enet_init(struct net_device *dev) -+{ -+ static int index = 0; -+ struct fec_priv *fp = netdev_priv(dev); -+ int i; -+ -+ fp->index = index; -+ fp->netdev = dev; -+ fec_dev[ index ] = dev; -+ -+ if (index == 0) { -+ /* disable fec0 */ -+ FEC_ECR(FEC_BASE_ADDR_FEC0) = FEC_ECR_DISABLE; -+ -+ /* setup the interrupt handler */ -+ dev->irq = 64 + ISC_FEC0; -+ -+ if (request_irq(dev->irq, fec_interrupt_handler, -+ IRQF_DISABLED, "ColdFire FEC 0", dev)) { -+ dev->irq = 0; -+ printk("Cannot allocate FEC0 IRQ\n"); -+ } else { -+ /* interrupt priority and level */ -+ MCF_ICR(ISC_FEC0) = ILP_FEC0; -+ } -+ -+ /* fec base address */ -+ dev->base_addr = FEC_BASE_ADDR_FEC0; -+ -+ /* requestor numbers */ -+ fp->fecpriv_rx_requestor = DMA_FEC0_RX; -+ fp->fecpriv_tx_requestor = DMA_FEC0_TX; -+ -+ /* fec0 handlers */ -+ fp->fecpriv_interrupt_fec_rx_handler = fec_interrupt_fec_rx_handler_fec0; -+ fp->fecpriv_interrupt_fec_tx_handler = fec_interrupt_fec_tx_handler_fec0; -+ -+ /* tx descriptors */ -+ fp->fecpriv_txdesc = (void*)FEC_TX_DESC_FEC0; -+ -+ /* rx descriptors */ -+ fp->fecpriv_rxdesc = (void*)FEC_RX_DESC_FEC0; -+ -+ /* mac addr */ -+ if (uboot_enet0[0] || uboot_enet0[1] || uboot_enet0[2] || -+ uboot_enet0[3] || uboot_enet0[4] || uboot_enet0[5]) { -+ /* use uboot enet 0 addr */ -+ memcpy(fec_mac_addr_fec0, uboot_enet0, 6); -+ } -+ -+ fp->fecpriv_mac_addr = fec_mac_addr_fec0; -+ } -+ else { -+ /* disable fec1 */ -+ FEC_ECR(FEC_BASE_ADDR_FEC1) = FEC_ECR_DISABLE; -+#ifdef FEC_2 -+ /* setup the interrupt handler */ -+ dev->irq = 64 + ISC_FEC1; -+ -+ if (request_irq(dev->irq, fec_interrupt_handler, -+ IRQF_DISABLED, "ColdFire FEC 1", dev)) { -+ dev->irq = 0; -+ printk("Cannot allocate FEC1 IRQ\n"); -+ } else { -+ /* interrupt priority and level */ -+ MCF_ICR(ISC_FEC1) = ILP_FEC1; -+ } -+ -+ /* fec base address */ -+ dev->base_addr = FEC_BASE_ADDR_FEC1; -+ -+ /* requestor numbers */ -+ fp->fecpriv_rx_requestor = DMA_FEC1_RX; -+ fp->fecpriv_tx_requestor = DMA_FEC1_TX; -+ -+ /* fec1 handlers */ -+ fp->fecpriv_interrupt_fec_rx_handler = fec_interrupt_fec_rx_handler_fec1; -+ fp->fecpriv_interrupt_fec_tx_handler = fec_interrupt_fec_tx_handler_fec1; -+ -+ /* tx descriptors */ -+ fp->fecpriv_txdesc = (void*)FEC_TX_DESC_FEC1; -+ -+ /* rx descriptors */ -+ fp->fecpriv_rxdesc = (void*)FEC_RX_DESC_FEC1; -+ -+ /* mac addr */ -+ if (uboot_enet1[0] || uboot_enet1[1] || uboot_enet1[2] || -+ uboot_enet1[3] || uboot_enet1[4] || uboot_enet1[5]) { -+ /* use uboot enet 1 addr */ -+ memcpy(fec_mac_addr_fec1, uboot_enet1, 6); -+ } -+ fp->fecpriv_mac_addr = fec_mac_addr_fec1; -+#endif -+ } -+ -+ /* clear MIB */ -+ memset((void *) (dev->base_addr + 0x200), 0, FEC_MIB_LEN); -+ -+ /* clear the statistics structure */ -+ memset((void *) &(fp->fecpriv_stat), 0, -+ sizeof(struct net_device_stats)); -+ -+ /* grab the FEC initiators */ -+ dma_set_initiator(fp->fecpriv_tx_requestor); -+ fp->fecpriv_initiator_tx = dma_get_initiator(fp->fecpriv_tx_requestor); -+ dma_set_initiator(fp->fecpriv_rx_requestor); -+ fp->fecpriv_initiator_rx = dma_get_initiator(fp->fecpriv_rx_requestor); -+ -+ /* reset the DMA channels */ -+ fp->fecpriv_fec_rx_channel = -1; -+ fp->fecpriv_fec_tx_channel = -1; -+ -+ for (i = 0; i < FEC_RX_BUF_NUMBER; i++) -+ fp->askb_rx[i] = NULL; -+ -+ /* initialize the pointers to the socket buffers */ -+ for (i = 0; i < FEC_TX_BUF_NUMBER; i++) -+ fp->fecpriv_txbuf[i] = NULL; -+ -+ ether_setup(dev); -+ -+ dev->open = fec_open; -+ dev->stop = fec_close; -+ dev->hard_start_xmit = fec_tx; -+ dev->get_stats = fec_get_stat; -+ dev->set_multicast_list = fec_set_multicast_list; -+ dev->set_mac_address = fec_set_mac_address; -+ dev->tx_timeout = fec_tx_timeout; -+ dev->watchdog_timeo = FEC_TX_TIMEOUT * HZ; -+ -+ memcpy(dev->dev_addr, fp->fecpriv_mac_addr, ETH_ALEN); -+ -+ spin_lock_init(&fp->fecpriv_lock); -+ -+ // Initialize FEC/I2C/IRQ Pin Assignment Register -+ FEC_GPIO_PAR_FECI2CIRQ &= 0xF; -+ FEC_GPIO_PAR_FECI2CIRQ |= FEC_FECI2CIRQ; -+ -+ index++; -+ return 0; -+} -+ -+/* -+ * Module Initialization -+ */ -+int __init fec_init(void) -+{ -+ struct net_device *dev; -+ int i; -+ int err; -+ DECLARE_MAC_BUF(mac); -+ -+ printk(KERN_INFO "FEC ENET (DMA) Version %s\n", VERSION); -+ -+ for (i = 0; i < FEC_MAX_PORTS; i++) { -+ dev = alloc_etherdev(sizeof(struct fec_priv)); -+ if (!dev) -+ return -ENOMEM; -+ err = fec_enet_init(dev); -+ if (err) { -+ free_netdev(dev); -+ continue; -+ } -+ if (register_netdev(dev) != 0) { -+ free_netdev(dev); -+ return -EIO; -+ } -+ -+ printk(KERN_INFO "%s: ethernet %s\n", -+ dev->name, print_mac(mac, dev->dev_addr)); -+ } -+ return 0; -+} -+ -+/* -+ * Stop a device -+ */ -+void fec_stop(struct net_device *dev) -+{ -+ struct fec_priv *fp = netdev_priv(dev); -+ -+ dma_remove_initiator(fp->fecpriv_initiator_tx); -+ dma_remove_initiator(fp->fecpriv_initiator_rx); -+ -+ if (dev->irq) -+ free_irq(dev->irq, dev); -+} -+ -+/************************************************************************ -+* NAME: fec_open -+* -+* DESCRIPTION: This function performs the initialization of -+* of FEC and corresponding KS8721 transiver -+* -+* RETURNS: If no error occurs, this function returns zero. -+*************************************************************************/ -+int fec_open(struct net_device *dev) -+{ -+ struct fec_priv *fp = netdev_priv(dev); -+ unsigned long base_addr = (unsigned long) dev->base_addr; -+ int fduplex; -+ int i; -+ int channel; -+ int error_code = -EBUSY; -+ -+ /* Receive the DMA channels */ -+ channel = dma_set_channel_fec(fp->fecpriv_rx_requestor); -+ -+ if (channel == -1) { -+ printk("Dma channel cannot be reserved\n"); -+ goto ERRORS; -+ } -+ -+ fp->fecpriv_fec_rx_channel = channel; -+ -+ dma_connect(channel, (int) fp->fecpriv_interrupt_fec_rx_handler); -+ -+ channel = dma_set_channel_fec(fp->fecpriv_tx_requestor); -+ -+ if (channel == -1) { -+ printk("Dma channel cannot be reserved\n"); -+ goto ERRORS; -+ } -+ -+ fp->fecpriv_fec_tx_channel = channel; -+ -+ dma_connect(channel, (int) fp->fecpriv_interrupt_fec_tx_handler); -+ -+ /* init tasklet for controller reinitialization */ -+ tasklet_init(&fp->fecpriv_tasklet_reinit, fec_interrupt_fec_reinit, (unsigned long) dev); -+ -+ /* Reset FIFOs */ -+ FEC_FECFRST(base_addr) |= FEC_SW_RST | FEC_RST_CTL; -+ FEC_FECFRST(base_addr) &= ~FEC_SW_RST; -+ -+ /* Reset and disable FEC */ -+ FEC_ECR(base_addr) = FEC_ECR_RESET; -+ -+ udelay(10); -+ -+ /* Clear all events */ -+ FEC_EIR(base_addr) = FEC_EIR_CLEAR; -+ -+ /* Reset FIFO status */ -+ FEC_FECTFSR(base_addr) = FEC_FECTFSR_MSK; -+ FEC_FECRFSR(base_addr) = FEC_FECRFSR_MSK; -+ -+ /* Set the default address */ -+ FEC_PALR(base_addr) = (fp->fecpriv_mac_addr[0] << 24) | -+ (fp->fecpriv_mac_addr[1] << 16) | -+ (fp->fecpriv_mac_addr[2] << 8) | -+ fp->fecpriv_mac_addr[3]; -+ FEC_PAUR(base_addr) = (fp->fecpriv_mac_addr[4] << 24) | -+ (fp->fecpriv_mac_addr[5] << 16) | 0x8808; -+ -+ /* Reset the group address descriptor */ -+ FEC_GALR(base_addr) = 0x00000000; -+ FEC_GAUR(base_addr) = 0x00000000; -+ -+ /* Reset the individual address descriptor */ -+ FEC_IALR(base_addr) = 0x00000000; -+ FEC_IAUR(base_addr) = 0x00000000; -+ -+ /* Set the receive control register */ -+ FEC_RCR(base_addr) = FEC_RCR_MAX_FRM_SIZE | FEC_RCR_MII; -+ -+ /* Set the receive FIFO control register */ -+// FEC_FECRFCR(base_addr) = FEC_FECRFCR_FRM | FEC_FECRFCR_GR | FEC_FECRFCR_MSK; -+ FEC_FECRFCR(base_addr) = FEC_FECRFCR_FRM | FEC_FECRFCR_GR -+ | (FEC_FECRFCR_MSK // disable all but ... -+ & ~FEC_FECRFCR_FAE // enable frame accept error -+ & ~FEC_FECRFCR_RXW // enable receive wait condition -+// & ~FEC_FECRFCR_UF // enable FIFO underflow -+ ); -+ -+ /* Set the receive FIFO alarm register */ -+ FEC_FECRFAR(base_addr) = FEC_FECRFAR_ALARM; -+ -+ /* Set the transmit FIFO control register */ -+// FEC_FECTFCR(base_addr) = FEC_FECTFCR_FRM | FEC_FECTFCR_GR | FEC_FECTFCR_MSK; -+ FEC_FECTFCR(base_addr) = FEC_FECTFCR_FRM | FEC_FECTFCR_GR -+ | (FEC_FECTFCR_MSK // disable all but ... -+ & ~FEC_FECTFCR_FAE // enable frame accept error -+// & ~FEC_FECTFCR_TXW // enable transmit wait condition -+// & ~FEC_FECTFCR_UF // enable FIFO underflow -+ & ~FEC_FECTFCR_OF); // enable FIFO overflow -+ -+ /* Set the transmit FIFO alarm register */ -+ FEC_FECTFAR(base_addr) = FEC_FECTFAR_ALARM; -+ -+ /* Set the Tx FIFO watermark */ -+ FEC_FECTFWR(base_addr) = FEC_FECTFWR_XWMRK; -+ -+ /* Enable the transmitter to append the CRC */ -+ FEC_CTCWR(base_addr) = FEC_CTCWR_TFCW_CRC; -+ -+ /* Enable the ethernet interrupts */ -+// FEC_EIMR(base_addr) = FEC_EIMR_MASK; -+ FEC_EIMR(base_addr) = FEC_EIMR_DISABLE -+ | FEC_EIR_LC -+ | FEC_EIR_RL -+ | FEC_EIR_HBERR -+ | FEC_EIR_XFUN -+ | FEC_EIR_XFERR -+ | FEC_EIR_RFERR -+ ; -+ -+/* -+ * JKM -- -+ * -+ * There's a problem with the PHY initialization code -- -+ * for now assume uboot left it in an initialized state. -+ */ -+// printk(KERN_INFO "FECOPEN: starting auto-negotiation\n"); -+// #ifdef CONFIG_FEC_548x_AUTO_NEGOTIATION -+#if 0 -+ if ((error_code = init_transceiver(base_addr, &fduplex)) != 0) -+ { -+ printk("Initialization of the transceiver is failed\n"); -+ goto ERRORS; -+ } -+#else -+ fduplex = 1; -+#endif -+// printk(KERN_INFO "FECOPEN: done with auto-negotiation\n"); -+ -+ if (fduplex) -+ /* Enable the full duplex mode */ -+ FEC_TCR(base_addr) = FEC_TCR_FDEN | FEC_TCR_HBC; -+ else -+ /* Disable reception of frames while transmitting */ -+ FEC_RCR(base_addr) |= FEC_RCR_DRT; -+ -+ /* Enable MIB */ -+ FEC_MIBC(base_addr) = FEC_MIBC_ENABLE; -+ -+ /* Enable FEC */ -+ FEC_ECR(base_addr) |= FEC_ECR_ETHEREN; -+ -+ /* Initialize tx descriptors and start DMA for the transmission */ -+ for (i = 0; i < FEC_TX_BUF_NUMBER; i++) -+ fp->fecpriv_txdesc[i].statCtrl = MCD_FEC_INTERRUPT; -+ -+ fp->fecpriv_txdesc[i - 1].statCtrl |= MCD_FEC_WRAP; -+ -+ fp->fecpriv_current_tx = fp->fecpriv_next_tx = 0; -+ -+ MCD_startDma(fp->fecpriv_fec_tx_channel, (char *) fp->fecpriv_txdesc, 0, -+ (unsigned char *) &(FEC_FECTFDR(base_addr)), 0, -+ FEC_MAX_FRM_SIZE, 0, fp->fecpriv_initiator_tx, -+ FEC_TX_DMA_PRI, MCD_FECTX_DMA | MCD_INTERRUPT, -+ MCD_NO_CSUM | MCD_NO_BYTE_SWAP); -+ -+ /* Initialize rx descriptors and start DMA for the reception */ -+ for (i = 0; i < FEC_RX_BUF_NUMBER; i++) { -+ fp->askb_rx[i] = alloc_skb(FEC_MAXBUF_SIZE + 16, GFP_DMA); -+ if (!fp->askb_rx[i]) { -+ fp->fecpriv_rxdesc[i].dataPointer = 0; -+ fp->fecpriv_rxdesc[i].statCtrl = 0; -+ fp->fecpriv_rxdesc[i].length = 0; -+ } -+ else { -+ skb_reserve(fp->askb_rx[i], 16); -+ fp->askb_rx[i]->dev = dev; -+ fp->fecpriv_rxdesc[i].dataPointer = (unsigned int) virt_to_phys(fp->askb_rx[i]->tail); -+ fp->fecpriv_rxdesc[i].statCtrl = MCD_FEC_BUF_READY | MCD_FEC_INTERRUPT; -+ fp->fecpriv_rxdesc[i].length = FEC_MAXBUF_SIZE; -+ } -+ } -+ -+ fp->fecpriv_rxdesc[i - 1].statCtrl |= MCD_FEC_WRAP; -+ fp->fecpriv_current_rx = 0; -+ -+ /* flush entire data cache before restarting the DMA */ -+#if 0 -+/* JKM -- currently running with cache turned off */ -+ DcacheFlushInvalidate(); -+#endif -+ -+ MCD_startDma(fp->fecpriv_fec_rx_channel, (char *) fp->fecpriv_rxdesc, 0, -+ (unsigned char *) &(FEC_FECRFDR(base_addr)), 0, -+ FEC_MAX_FRM_SIZE, 0, fp->fecpriv_initiator_rx, -+ FEC_RX_DMA_PRI, MCD_FECRX_DMA | MCD_INTERRUPT, -+ MCD_NO_CSUM | MCD_NO_BYTE_SWAP); -+ -+ netif_start_queue(dev); -+ return 0; -+ -+ERRORS: -+ -+ /* Remove the channels and return with the error code */ -+ if (fp->fecpriv_fec_rx_channel != -1) { -+ dma_disconnect(fp->fecpriv_fec_rx_channel); -+ dma_remove_channel_by_number(fp->fecpriv_fec_rx_channel); -+ fp->fecpriv_fec_rx_channel = -1; -+ } -+ -+ if (fp->fecpriv_fec_tx_channel != -1) { -+ dma_disconnect(fp->fecpriv_fec_tx_channel); -+ dma_remove_channel_by_number(fp->fecpriv_fec_tx_channel); -+ fp->fecpriv_fec_tx_channel = -1; -+ } -+ -+ return error_code; -+} -+ -+/************************************************************************ -+* NAME: fec_close -+* -+* DESCRIPTION: This function performs the graceful stop of the -+* transmission and disables FEC -+* -+* RETURNS: This function always returns zero. -+*************************************************************************/ -+int fec_close(struct net_device *dev) -+{ -+ struct fec_priv *fp = netdev_priv(dev); -+ unsigned long base_addr = (unsigned long) dev->base_addr; -+ unsigned long time; -+ int i; -+ -+ netif_stop_queue(dev); -+ -+ /* Perform the graceful stop */ -+ FEC_TCR(base_addr) |= FEC_TCR_GTS; -+ -+ time = jiffies; -+ -+ /* Wait for the graceful stop */ -+ while (!(FEC_EIR(base_addr) & FEC_EIR_GRA) && jiffies - time < FEC_GR_TIMEOUT * HZ) -+ schedule(); -+ -+ /* Disable FEC */ -+ FEC_ECR(base_addr) = FEC_ECR_DISABLE; -+ -+ /* Reset the DMA channels */ -+ spin_lock_irq(&fp->fecpriv_lock); -+ MCD_killDma(fp->fecpriv_fec_tx_channel); -+ spin_unlock_irq(&fp->fecpriv_lock); -+ dma_remove_channel_by_number(fp->fecpriv_fec_tx_channel); -+ dma_disconnect(fp->fecpriv_fec_tx_channel); -+ fp->fecpriv_fec_tx_channel = -1; -+ -+ for (i = 0; i < FEC_TX_BUF_NUMBER; i++) { -+ if (fp->fecpriv_txbuf[i]) { -+ kfree(fp->fecpriv_txbuf[i]); -+ fp->fecpriv_txbuf[i] = NULL; -+ } -+ } -+ -+ spin_lock_irq(&fp->fecpriv_lock); -+ MCD_killDma(fp->fecpriv_fec_rx_channel); -+ spin_unlock_irq(&fp->fecpriv_lock); -+ -+ dma_remove_channel_by_number(fp->fecpriv_fec_rx_channel); -+ dma_disconnect(fp->fecpriv_fec_rx_channel); -+ fp->fecpriv_fec_rx_channel = -1; -+ -+ for (i = 0; i < FEC_RX_BUF_NUMBER; i++) { -+ if (fp->askb_rx[i]) { -+ kfree_skb(fp->askb_rx[i]); -+ fp->askb_rx[i] = NULL; -+ } -+ } -+ -+ return 0; -+} -+ -+/************************************************************************ -+* +NAME: fec_get_stat -+* -+* RETURNS: This function returns the statistical information. -+*************************************************************************/ -+struct net_device_stats * fec_get_stat(struct net_device *dev) -+{ -+ struct fec_priv *fp = netdev_priv(dev); -+ unsigned long base_addr = dev->base_addr; -+ -+ /* Receive the statistical information */ -+ fp->fecpriv_stat.rx_packets = FECSTAT_RMON_R_PACKETS(base_addr); -+ fp->fecpriv_stat.tx_packets = FECSTAT_RMON_T_PACKETS(base_addr); -+ fp->fecpriv_stat.rx_bytes = FECSTAT_RMON_R_OCTETS(base_addr); -+ fp->fecpriv_stat.tx_bytes = FECSTAT_RMON_T_OCTETS(base_addr); -+ -+ fp->fecpriv_stat.multicast = FECSTAT_RMON_R_MC_PKT(base_addr); -+ fp->fecpriv_stat.collisions = FECSTAT_RMON_T_COL(base_addr); -+ -+ fp->fecpriv_stat.rx_length_errors = FECSTAT_RMON_R_UNDERSIZE(base_addr) + -+ FECSTAT_RMON_R_OVERSIZE(base_addr) + -+ FECSTAT_RMON_R_FRAG(base_addr) + -+ FECSTAT_RMON_R_JAB(base_addr); -+ fp->fecpriv_stat.rx_crc_errors = FECSTAT_IEEE_R_CRC(base_addr); -+ fp->fecpriv_stat.rx_frame_errors = FECSTAT_IEEE_R_ALIGN(base_addr); -+ fp->fecpriv_stat.rx_over_errors = FECSTAT_IEEE_R_MACERR(base_addr); -+ -+ fp->fecpriv_stat.tx_carrier_errors = FECSTAT_IEEE_T_CSERR(base_addr); -+ fp->fecpriv_stat.tx_fifo_errors = FECSTAT_IEEE_T_MACERR(base_addr); -+ fp->fecpriv_stat.tx_window_errors = FECSTAT_IEEE_T_LCOL(base_addr); -+ -+ /* I hope that one frame doesn't have more than one error */ -+ fp->fecpriv_stat.rx_errors = fp->fecpriv_stat.rx_length_errors + -+ fp->fecpriv_stat.rx_crc_errors + -+ fp->fecpriv_stat.rx_frame_errors + -+ fp->fecpriv_stat.rx_over_errors + -+ fp->fecpriv_stat.rx_dropped; -+ fp->fecpriv_stat.tx_errors = fp->fecpriv_stat.tx_carrier_errors + -+ fp->fecpriv_stat.tx_fifo_errors + -+ fp->fecpriv_stat.tx_window_errors + -+ fp->fecpriv_stat.tx_aborted_errors + -+ fp->fecpriv_stat.tx_heartbeat_errors + -+ fp->fecpriv_stat.tx_dropped; -+ -+ return &fp->fecpriv_stat; -+} -+ -+/************************************************************************ -+* NAME: fec_set_multicast_list -+* -+* DESCRIPTION: This function sets the frame filtering parameters -+*************************************************************************/ -+void fec_set_multicast_list(struct net_device *dev) -+{ -+ struct dev_mc_list *dmi; -+ unsigned int crc, data; -+ int i, j, k; -+ unsigned long base_addr = (unsigned long) dev->base_addr; -+ -+ if (dev->flags & IFF_PROMISC || dev->flags & IFF_ALLMULTI) { -+ /* Allow all incoming frames */ -+ FEC_GALR(base_addr) = 0xFFFFFFFF; -+ FEC_GAUR(base_addr) = 0xFFFFFFFF; -+ return; -+ } -+ -+ /* Reset the group address register */ -+ FEC_GALR(base_addr) = 0x00000000; -+ FEC_GAUR(base_addr) = 0x00000000; -+ -+ /* Process all addresses */ -+ for (i = 0, dmi = dev->mc_list; i < dev->mc_count; i++, dmi = dmi->next) { -+ /* Processing must be only for the group addresses */ -+ if (!(dmi->dmi_addr[0] & 1)) -+ continue; -+ -+ /* Calculate crc value for the current address */ -+ crc = 0xFFFFFFFF; -+ for (j = 0; j < dmi->dmi_addrlen; j++) { -+ for (k = 0, data = dmi->dmi_addr[j]; k < 8; k++, data >>= 1) { -+ if ((crc ^ data) & 1) -+ crc = (crc >> 1) ^ FEC_CRCPOL; -+ else -+ crc >>= 1; -+ } -+ } -+ -+ /* Add this value */ -+ crc >>= 26; -+ crc &= 0x3F; -+ if (crc > 31) -+ FEC_GAUR(base_addr) |= 0x1 << (crc - 32); -+ else -+ FEC_GALR(base_addr) |= 0x1 << crc; -+ } -+} -+ -+/************************************************************************ -+* NAME: fec_set_mac_address -+* -+* DESCRIPTION: This function sets the MAC address -+*************************************************************************/ -+int fec_set_mac_address(struct net_device *dev, void *p) -+{ -+ struct fec_priv *fp = netdev_priv(dev); -+ unsigned long base_addr = (unsigned long) dev->base_addr; -+ struct sockaddr *addr = p; -+ -+ if (netif_running(dev)) -+ return -EBUSY; -+ -+ /* Copy a new address to the device structure */ -+ memcpy(dev->dev_addr, addr->sa_data, dev->addr_len); -+ -+ /* Copy a new address to the private structure */ -+ memcpy(fp->fecpriv_mac_addr, addr->sa_data, 6); -+ -+ /* Set the address to the registers */ -+ FEC_PALR(base_addr) = (fp->fecpriv_mac_addr[0] << 24) | -+ (fp->fecpriv_mac_addr[1] << 16) | -+ (fp->fecpriv_mac_addr[2] << 8) | -+ fp->fecpriv_mac_addr[3]; -+ FEC_PAUR(base_addr) = (fp->fecpriv_mac_addr[4] << 24) | -+ (fp->fecpriv_mac_addr[5] << 16) | -+ 0x8808; -+ -+ return 0; -+} -+ -+/************************************************************************ -+* NAME: fec_tx -+* -+* DESCRIPTION: This function starts transmission of the frame using DMA -+* -+* RETURNS: This function always returns zero. -+*************************************************************************/ -+int fec_tx(struct sk_buff *skb, struct net_device *dev) -+{ -+ struct fec_priv *fp = netdev_priv(dev); -+ void *data, *data_aligned; -+ int offset; -+ -+ data = kmalloc(skb->len + 15, GFP_DMA | GFP_ATOMIC); -+ -+ if (!data) { -+ fp->fecpriv_stat.tx_dropped++; -+ dev_kfree_skb(skb); -+ return 0; -+ } -+ -+ offset = (((unsigned long)virt_to_phys(data) + 15) & 0xFFFFFFF0) - -+ (unsigned long)virt_to_phys(data); -+ data_aligned = (void*)((unsigned long)data + offset); -+ memcpy(data_aligned, skb->data, skb->len); -+ -+ /* flush data cache before initializing the descriptor and starting DMA */ -+#if 0 -+/* JKM -- currently running with cache turned off */ -+ DcacheFlushInvalidateCacheBlock((void*)virt_to_phys(data_aligned), skb->len); -+#endif -+ -+ spin_lock_irq(&fp->fecpriv_lock); -+ -+ /* Initialize the descriptor */ -+ fp->fecpriv_txbuf[fp->fecpriv_next_tx] = data; -+ fp->fecpriv_txdesc[fp->fecpriv_next_tx].dataPointer = (unsigned int) virt_to_phys(data_aligned); -+ fp->fecpriv_txdesc[fp->fecpriv_next_tx].length = skb->len; -+ fp->fecpriv_txdesc[fp->fecpriv_next_tx].statCtrl |= (MCD_FEC_END_FRAME | MCD_FEC_BUF_READY); -+ fp->fecpriv_next_tx = (fp->fecpriv_next_tx + 1) & FEC_TX_INDEX_MASK; -+ -+ if (fp->fecpriv_txbuf[fp->fecpriv_current_tx] && fp->fecpriv_current_tx == fp->fecpriv_next_tx) -+ netif_stop_queue(dev); -+ -+ spin_unlock_irq(&fp->fecpriv_lock); -+ -+ /* Tell the DMA to continue the transmission */ -+ MCD_continDma(fp->fecpriv_fec_tx_channel); -+ -+ dev_kfree_skb(skb); -+ -+ dev->trans_start = jiffies; -+ -+ return 0; -+} -+ -+/************************************************************************ -+* NAME: fec_tx_timeout -+* -+* DESCRIPTION: If the interrupt processing of received frames was lost -+* and DMA stopped the reception, this function clears -+* the transmission descriptors and starts DMA -+* -+*************************************************************************/ -+void fec_tx_timeout(struct net_device *dev) -+{ -+ int i; -+ struct fec_priv *fp = netdev_priv(dev); -+ unsigned long base_addr = (unsigned long) dev->base_addr; -+ -+ spin_lock_irq(&fp->fecpriv_lock); -+ MCD_killDma(fp->fecpriv_fec_tx_channel); -+ for (i = 0; i < FEC_TX_BUF_NUMBER; i++) { -+ if (fp->fecpriv_txbuf[i]) { -+ kfree(fp->fecpriv_txbuf[i]); -+ fp->fecpriv_txbuf[i] = NULL; -+ } -+ fp->fecpriv_txdesc[i].statCtrl = MCD_FEC_INTERRUPT; -+ } -+ fp->fecpriv_txdesc[i - 1].statCtrl |= MCD_FEC_WRAP; -+ -+ fp->fecpriv_current_tx = fp->fecpriv_next_tx = 0; -+ -+ /* Reset FIFOs */ -+ FEC_FECFRST(base_addr) |= FEC_SW_RST; -+ FEC_FECFRST(base_addr) &= ~FEC_SW_RST; -+ -+ /* Reset and disable FEC */ -+// FEC_ECR(base_addr) = FEC_ECR_RESET; -+ -+ /* Enable FEC */ -+ FEC_ECR(base_addr) |= FEC_ECR_ETHEREN; -+ -+ MCD_startDma(fp->fecpriv_fec_tx_channel, (char *) fp->fecpriv_txdesc, 0, -+ (unsigned char *) &(FEC_FECTFDR(base_addr)), 0, -+ FEC_MAX_FRM_SIZE, 0, fp->fecpriv_initiator_tx, -+ FEC_TX_DMA_PRI, MCD_FECTX_DMA | MCD_INTERRUPT, -+ MCD_NO_CSUM | MCD_NO_BYTE_SWAP); -+ -+ spin_unlock_irq(&fp->fecpriv_lock); -+ -+ netif_wake_queue(dev); -+ -+} -+ -+/************************************************************************ -+* NAME: fec_read_mii -+* -+* DESCRIPTION: This function reads the value from the MII register -+* -+* RETURNS: If no error occurs, this function returns zero. -+*************************************************************************/ -+int fec_read_mii(unsigned int base_addr, unsigned int pa, unsigned int ra, unsigned int *data) -+{ -+ unsigned long time; -+ -+ /* Clear the MII interrupt bit */ -+ FEC_EIR(base_addr) = FEC_EIR_MII; -+ -+ /* Write to the MII management frame register */ -+ FEC_MMFR(base_addr) = FEC_MMFR_READ | (pa << 23) | (ra << 18); -+ -+ time = jiffies; -+ -+ /* Wait for the reading */ -+ while (!(FEC_EIR(base_addr) & FEC_EIR_MII)) { -+ if (jiffies - time > FEC_MII_TIMEOUT * HZ) -+ return -ETIME; -+ schedule(); -+ } -+ -+ /* Clear the MII interrupt bit */ -+ FEC_EIR(base_addr) = FEC_EIR_MII; -+ -+ *data = FEC_MMFR(base_addr) & 0x0000FFFF; -+ -+ return 0; -+} -+ -+/************************************************************************ -+* NAME: fec_write_mii -+* -+* DESCRIPTION: This function writes the value to the MII register -+* -+* RETURNS: If no error occurs, this function returns zero. -+*************************************************************************/ -+int fec_write_mii(unsigned int base_addr, unsigned int pa, unsigned int ra, unsigned int data) -+{ -+ unsigned long time; -+ -+ /* Clear the MII interrupt bit */ -+ FEC_EIR(base_addr) = FEC_EIR_MII; -+ -+ /* Write to the MII management frame register */ -+ FEC_MMFR(base_addr) = FEC_MMFR_WRITE | (pa << 23) | (ra << 18) | data; -+ -+ time = jiffies; -+ -+ /* Wait for the writing */ -+ while (!(FEC_EIR(base_addr) & FEC_EIR_MII)) { -+ if (jiffies - time > FEC_MII_TIMEOUT * HZ) -+ return -ETIME; -+ schedule(); -+ } -+ -+ /* Clear the MII interrupt bit */ -+ FEC_EIR(base_addr) = FEC_EIR_MII; -+ -+ return 0; -+} -+ -+/************************************************************************ -+* NAME: fec_interrupt_tx_handler -+* -+* DESCRIPTION: This function is called when the data -+* transmission from the buffer to the FEC is completed. -+* -+*************************************************************************/ -+void fec_interrupt_fec_tx_handler(struct net_device *dev) -+{ -+ struct fec_priv *fp = netdev_priv(dev); -+ -+ /* Release the socket buffer */ -+ if(fp->fecpriv_txbuf[fp->fecpriv_current_tx]) { -+ kfree(fp->fecpriv_txbuf[fp->fecpriv_current_tx]); -+ fp->fecpriv_txbuf[fp->fecpriv_current_tx] = NULL; -+ } -+ fp->fecpriv_current_tx = (fp->fecpriv_current_tx + 1) & FEC_TX_INDEX_MASK; -+ -+ if (MCD_dmaStatus(fp->fecpriv_fec_tx_channel) == MCD_DONE) { -+ for (; fp->fecpriv_current_tx != fp->fecpriv_next_tx; fp->fecpriv_current_tx = (fp->fecpriv_current_tx + 1) & FEC_TX_INDEX_MASK) { -+ if(fp->fecpriv_txbuf[fp->fecpriv_current_tx]) { -+ kfree(fp->fecpriv_txbuf[fp->fecpriv_current_tx]); -+ fp->fecpriv_txbuf[fp->fecpriv_current_tx] = NULL; -+ } -+ } -+ } -+ -+ if (netif_queue_stopped(dev)) -+ netif_wake_queue(dev); -+} -+ -+/************************************************************************ -+* NAME: fec_interrupt_rx_handler -+* -+* DESCRIPTION: This function is called when the data -+* reception from the FEC to the reception buffer is completed. -+* -+*************************************************************************/ -+void fec_interrupt_fec_rx_handler(struct net_device *dev) -+{ -+ struct fec_priv *fp = netdev_priv(dev); -+ struct sk_buff *skb; -+ int i; -+ -+ fp->fecpriv_rxflag = 1; -+ // Some buffers can be missed -+ if(!(fp->fecpriv_rxdesc[fp->fecpriv_current_rx].statCtrl & MCD_FEC_END_FRAME)) -+ { -+ // Find a valid index -+ for(i = 0; i < FEC_RX_BUF_NUMBER && !(fp->fecpriv_rxdesc[fp->fecpriv_current_rx].statCtrl & MCD_FEC_END_FRAME); i++, fp->fecpriv_current_rx = (fp->fecpriv_current_rx + 1) & FEC_RX_INDEX_MASK); -+ -+ if(i == FEC_RX_BUF_NUMBER) -+ { -+ // There are no data to process -+ // Tell the DMA to continue the reception -+ MCD_continDma(fp->fecpriv_fec_rx_channel); -+ -+ fp->fecpriv_rxflag = 0; -+ -+ return; -+ } -+ } -+ -+ for (; fp->fecpriv_rxdesc[fp->fecpriv_current_rx].statCtrl & MCD_FEC_END_FRAME; fp->fecpriv_current_rx = (fp->fecpriv_current_rx + 1) & FEC_RX_INDEX_MASK) { -+ if( (fp->fecpriv_rxdesc[fp->fecpriv_current_rx].length <= FEC_MAXBUF_SIZE) && -+ (fp->fecpriv_rxdesc[fp->fecpriv_current_rx].length > 4)) { /* --tym-- */ -+ skb = fp->askb_rx[fp->fecpriv_current_rx]; -+ if (!skb) -+ fp->fecpriv_stat.rx_dropped++; -+ else { -+ /* flush data cache before initializing the descriptor and starting DMA */ -+// DcacheFlushInvalidateCacheBlock((void*)virt_to_phys(fp->askb_rx[fp->fecpriv_current_rx]->tail), fp->askb_rx[fp->fecpriv_current_rx]->len); -+ -+ skb_put(skb, fp->fecpriv_rxdesc[fp->fecpriv_current_rx].length - 4); -+ skb->protocol = eth_type_trans(skb, dev); -+ netif_rx(skb); -+ } -+ fp->fecpriv_rxdesc[fp->fecpriv_current_rx].statCtrl &= ~MCD_FEC_END_FRAME; -+ /* allocate new skbuff */ -+ fp->askb_rx[fp->fecpriv_current_rx] = alloc_skb(FEC_MAXBUF_SIZE + 16, /*GFP_ATOMIC |*/ GFP_DMA); -+ if (!fp->askb_rx[fp->fecpriv_current_rx]) { -+ fp->fecpriv_rxdesc[fp->fecpriv_current_rx].dataPointer = 0; -+ fp->fecpriv_rxdesc[fp->fecpriv_current_rx].length = 0; -+ fp->fecpriv_stat.rx_dropped++; -+ } -+ else { -+ skb_reserve(fp->askb_rx[fp->fecpriv_current_rx], 16); -+ fp->askb_rx[fp->fecpriv_current_rx]->dev = dev; -+ -+ /* flush data cache before initializing the descriptor and starting DMA */ -+#if 0 -+/* JKM -- currently running with cache turned off */ -+ DcacheFlushInvalidateCacheBlock((void*)virt_to_phys(fp->askb_rx[fp->fecpriv_current_rx]->tail), FEC_MAXBUF_SIZE); -+#endif -+ -+ fp->fecpriv_rxdesc[fp->fecpriv_current_rx].dataPointer = (unsigned int) virt_to_phys(fp->askb_rx[fp->fecpriv_current_rx]->tail); -+ fp->fecpriv_rxdesc[fp->fecpriv_current_rx].length = FEC_MAXBUF_SIZE; -+ fp->fecpriv_rxdesc[fp->fecpriv_current_rx].statCtrl |= MCD_FEC_BUF_READY; -+ -+ // flush data cache before initializing the descriptor and starting DMA -+// DcacheFlushInvalidateCacheBlock((void*)virt_to_phys(fp->askb_rx[fp->fecpriv_current_rx]->tail), FEC_MAXBUF_SIZE); -+ } -+ } -+ -+ } -+ -+ /* Tell the DMA to continue the reception */ -+ MCD_continDma(fp->fecpriv_fec_rx_channel); -+ -+ fp->fecpriv_rxflag = 0; -+} -+ -+/************************************************************************ -+* NAME: fec_interrupt_handler -+* -+* DESCRIPTION: This function is called when some special errors occur -+* -+*************************************************************************/ -+irqreturn_t fec_interrupt_handler(int irq, void *dev_id) -+{ -+ -+ struct net_device *dev = (struct net_device *)dev_id; -+ struct fec_priv *fp = netdev_priv(dev); -+ unsigned long base_addr = (unsigned long) dev->base_addr; -+ unsigned long events; -+ -+ /* Read and clear the events */ -+ events = FEC_EIR(base_addr) & FEC_EIMR(base_addr); -+ -+ if (events & FEC_EIR_HBERR) { -+ fp->fecpriv_stat.tx_heartbeat_errors++; -+ FEC_EIR(base_addr) = FEC_EIR_HBERR; -+ } -+ -+ /* receive/transmit FIFO error */ -+ if (((events & FEC_EIR_RFERR) != 0) || ((events & FEC_EIR_XFERR) != 0)) { -+ /* kill DMA receive channel */ -+ MCD_killDma (fp->fecpriv_fec_rx_channel); -+ -+ /* kill running transmission by DMA */ -+ MCD_killDma (fp->fecpriv_fec_tx_channel); -+ -+ /* Reset FIFOs */ -+ FEC_FECFRST(base_addr) |= FEC_SW_RST; -+ FEC_FECFRST(base_addr) &= ~FEC_SW_RST; -+ -+ /* reset receive FIFO status register */ -+ FEC_FECRFSR(base_addr) = FEC_FECRFSR_FAE | -+ FEC_FECRFSR_RXW | -+ FEC_FECRFSR_UF; -+ -+ /* reset transmit FIFO status register */ -+ FEC_FECTFSR(base_addr) = FEC_FECTFSR_FAE | -+ FEC_FECTFSR_TXW | -+ FEC_FECTFSR_UF | -+ FEC_FECTFSR_OF; -+ -+ /* reset RFERR and XFERR event */ -+ FEC_EIR(base_addr) = FEC_EIR_RFERR | FEC_EIR_XFERR; -+ -+ /* stop queue */ -+ netif_stop_queue(dev); -+ -+ /* execute reinitialization as tasklet */ -+ tasklet_schedule(&fp->fecpriv_tasklet_reinit); -+ -+ fp->fecpriv_stat.rx_dropped++; -+ } -+ -+ /* transmit FIFO underrun */ -+ if ((events & FEC_EIR_XFUN) != 0) { -+ /* reset XFUN event */ -+ FEC_EIR(base_addr) = FEC_EIR_XFUN; -+ fp->fecpriv_stat.tx_aborted_errors++; -+ } -+ -+ /* late collision */ -+ if ((events & FEC_EIR_LC) != 0) { -+ /* reset LC event */ -+ FEC_EIR(base_addr) = FEC_EIR_LC; -+ fp->fecpriv_stat.tx_aborted_errors++; -+ } -+ -+ /* collision retry limit */ -+ if ((events & FEC_EIR_RL) != 0) { -+ /* reset RL event */ -+ FEC_EIR(base_addr) = FEC_EIR_RL; -+ fp->fecpriv_stat.tx_aborted_errors++; -+ } -+ return 0; -+} -+ -+/************************************************************************ -+* NAME: fec_interrupt_reinit -+* -+* DESCRIPTION: This function is called from interrupt handler -+* when controller must be reinitialized. -+* -+*************************************************************************/ -+void fec_interrupt_fec_reinit(unsigned long data) -+{ -+ int i; -+ struct net_device *dev = (struct net_device*)data; -+ struct fec_priv *fp = netdev_priv(dev); -+ unsigned long base_addr = (unsigned long) dev->base_addr; -+ -+ /* Initialize reception descriptors and start DMA for the reception */ -+ for (i = 0; i < FEC_RX_BUF_NUMBER; i++) { -+ if (!fp->askb_rx[i]) { -+ fp->askb_rx[i] = alloc_skb(FEC_MAXBUF_SIZE + 16, GFP_ATOMIC | GFP_DMA); -+ if (!fp->askb_rx[i]) { -+ fp->fecpriv_rxdesc[i].dataPointer = 0; -+ fp->fecpriv_rxdesc[i].statCtrl = 0; -+ fp->fecpriv_rxdesc[i].length = 0; -+ continue; -+ } -+ fp->askb_rx[i]->dev = dev; -+ skb_reserve(fp->askb_rx[i], 16); -+ } -+ fp->fecpriv_rxdesc[i].dataPointer = (unsigned int) virt_to_phys(fp->askb_rx[i]->tail); -+ fp->fecpriv_rxdesc[i].statCtrl = MCD_FEC_BUF_READY | MCD_FEC_INTERRUPT; -+ fp->fecpriv_rxdesc[i].length = FEC_MAXBUF_SIZE; -+ } -+ -+ fp->fecpriv_rxdesc[i - 1].statCtrl |= MCD_FEC_WRAP; -+ fp->fecpriv_current_rx = 0; -+ -+ /* restart frame transmission */ -+ for (i = 0; i < FEC_TX_BUF_NUMBER; i++) { -+ if (fp->fecpriv_txbuf[i]) { -+ kfree(fp->fecpriv_txbuf[i]); -+ fp->fecpriv_txbuf[i] = NULL; -+ fp->fecpriv_stat.tx_dropped++; -+ } -+ fp->fecpriv_txdesc[i].statCtrl = MCD_FEC_INTERRUPT; -+ } -+ fp->fecpriv_txdesc[i - 1].statCtrl |= MCD_FEC_WRAP; -+ fp->fecpriv_current_tx = fp->fecpriv_next_tx = 0; -+ -+ /* flush entire data cache before restarting the DMA */ -+#if 0 -+/* JKM -- currently running with cache turned off */ -+ DcacheFlushInvalidate(); -+#endif -+ -+ /* restart DMA from beginning */ -+ MCD_startDma(fp->fecpriv_fec_rx_channel, -+ (char *) fp->fecpriv_rxdesc, 0, -+ (unsigned char *) &(FEC_FECRFDR(base_addr)), 0, -+ FEC_MAX_FRM_SIZE, 0, fp->fecpriv_initiator_rx, -+ FEC_RX_DMA_PRI, MCD_FECRX_DMA | MCD_INTERRUPT, -+ MCD_NO_CSUM | MCD_NO_BYTE_SWAP); -+ -+ MCD_startDma(fp->fecpriv_fec_tx_channel, (char *) fp->fecpriv_txdesc, 0, -+ (unsigned char *) &(FEC_FECTFDR(base_addr)), 0, -+ FEC_MAX_FRM_SIZE, 0, fp->fecpriv_initiator_tx, -+ FEC_TX_DMA_PRI, MCD_FECTX_DMA | MCD_INTERRUPT, -+ MCD_NO_CSUM | MCD_NO_BYTE_SWAP); -+ -+ /* Enable FEC */ -+ FEC_ECR(base_addr) |= FEC_ECR_ETHEREN; -+ -+ netif_wake_queue(dev); -+} -+ -+/************************************************************************ -+* NAME: fec_interrupt_tx_handler_fec0 -+* -+* DESCRIPTION: This is the DMA interrupt handler using for FEC0 -+* transmission. -+* -+*************************************************************************/ -+void fec_interrupt_fec_tx_handler_fec0(void) -+{ -+ fec_interrupt_fec_tx_handler(fec_dev[0]); -+} -+ -+#ifdef FEC_2 -+/************************************************************************ -+* NAME: fec_interrupt_tx_handler_fec1 -+* -+* DESCRIPTION: This is the DMA interrupt handler using for the FEC1 -+* transmission. -+* -+*************************************************************************/ -+void fec_interrupt_fec_tx_handler_fec1(void) -+{ -+ fec_interrupt_fec_tx_handler(fec_dev[1]); -+} -+#endif -+ -+/************************************************************************ -+* NAME: fec_interrupt_rx_handler_fec0 -+* -+* DESCRIPTION: This is the DMA interrupt handler using for the FEC0 -+* reception. -+* -+*************************************************************************/ -+void fec_interrupt_fec_rx_handler_fec0(void) -+{ -+ fec_interrupt_fec_rx_handler(fec_dev[0]); -+} -+ -+#ifdef FEC_2 -+/************************************************************************ -+* NAME: fec_interrupt_rx_handler_fec1 -+* -+* DESCRIPTION: This is the DMA interrupt handler using for the FEC1 -+* reception. -+* -+*************************************************************************/ -+void fec_interrupt_fec_rx_handler_fec1(void) -+{ -+ fec_interrupt_fec_rx_handler(fec_dev[1]); -+} -+ -+#endif -+ -+#ifndef MODULE -+/************************************************************************ -+* NAME: fec_mac_setup0 -+* -+* DESCRIPTION: This function sets the MAC address of FEC0 from command line -+* -+*************************************************************************/ -+int __init fec_mac_setup0(char *s) -+{ -+ if(!s || !*s) -+ return 1; -+ -+ if(fec_str_to_mac(s, fec_mac_addr_fec0)) -+ printk("The MAC address of FEC0 cannot be set from command line"); -+ return 1; -+} -+ -+#ifdef FEC_2 -+ -+/************************************************************************ -+* NAME: fec_mac_setup1 -+* -+* DESCRIPTION: This function sets the MAC address of FEC1 from command line -+* -+*************************************************************************/ -+int __init fec_mac_setup1(char *s) -+{ -+ if(!s || !*s) -+ return 1; -+ -+ if(fec_str_to_mac(s, fec_mac_addr_fec1)) -+ printk("The MAC address of FEC1 cannot be set from command line"); -+ return 1; -+} -+#endif -+ -+/************************************************************************ -+* NAME: fec_str_to_mac -+* -+* DESCRIPTION: This function interprets the character string into MAC addr -+* -+*************************************************************************/ -+int fec_str_to_mac( char *str_mac, unsigned char* addr) -+{ -+ unsigned long val; -+ char c; -+ unsigned long octet[6], *octetptr = octet; -+ int i; -+ -+again: -+ val = 0; -+ while ((c = *str_mac) != '\0') { -+ if ((c>='0')&&(c<='9')) { -+ val = (val * 16) + (c - '0'); -+ str_mac++; -+ continue; -+ } -+ else if (((c>='a')&&(c<='f'))||((c>='A')&&(c<='F'))) { -+ val = (val << 4) + (c + 10 - (((c>='a')&&(c<='f')) ? 'a' : 'A')); -+ str_mac++; -+ continue; -+ } -+ break; -+ } -+ if (*str_mac == ':') { -+ *octetptr++ = val, str_mac++; -+ if (octetptr >= octet + 6) -+ return 1; -+ goto again; -+ } -+ -+ /* Check for trailing characters */ -+ if (*str_mac && !(*str_mac==' ')) -+ return 1; -+ -+ *octetptr++ = val; -+ -+ if ((octetptr - octet)==6) { -+ for(i=0;i<=6;i++) -+ addr[i]=octet[i]; -+ } -+ else -+ return 1; -+ -+ return 0; -+} -+#endif ---- /dev/null -+++ b/drivers/net/fec/fec.h -@@ -0,0 +1,162 @@ -+ -+#define FEC_BASE_ADDR_FEC0 ((unsigned int)MCF_MBAR + 0x9000) -+#define FEC_BASE_ADDR_FEC1 ((unsigned int)MCF_MBAR + 0x9800) -+ -+//#define FEC_INTC_IMRH_INT_MASK38 (0x00000040) -+//#define FEC_INTC_IMRH_INT_MASK39 (0x00000080) -+//#define FEC_INTC_ICR_FEC0 (0x30) -+//#define FEC_INTC_ICR_FEC1 (0x31) -+#define FEC_FECI2CIRQ (0xFFC0) -+#define FEC_GPIO_PAR_FECI2CIRQ *(volatile unsigned short*)((unsigned int)MCF_MBAR + 0xA44) -+//#define FEC_INTC_ICRn(x) (*(volatile unsigned char *)(void*)((unsigned int) MCF_MBAR + 0x000740+((x)*0x001))) -+//#define FEC_INTC_IMRH *(volatile unsigned int*)((unsigned int)MCF_MBAR + 0x000708) -+ -+#define FEC_ECR_DISABLE (0x00000000) -+ -+#define FEC_ECR(x) *(volatile unsigned int *)(x + 0x024) -+#define FEC_EIR(x) *(volatile unsigned int*)(x + 0x004) -+#define FEC_PALR(x) *(volatile unsigned int*)(x + 0x0E4) -+#define FEC_PAUR(x) *(volatile unsigned int*)(x + 0x0E8) -+#define FEC_IALR(x) *(volatile unsigned int*)(x + 0x11C) -+#define FEC_IAUR(x) *(volatile unsigned int*)(x + 0x118) -+#define FEC_GALR(x) *(volatile unsigned int*)(x + 0x124) -+#define FEC_GAUR(x) *(volatile unsigned int*)(x + 0x120) -+#define FEC_RCR(x) *(volatile unsigned int*)(x + 0x084) -+#define FEC_FECRFCR(x) *(volatile unsigned int*)(x + 0x18C) -+#define FEC_FECRFAR(x) *(volatile unsigned int*)(x + 0x198) -+#define FEC_FECTFCR(x) *(volatile unsigned int*)(x + 0x1AC) -+#define FEC_FECTFAR(x) *(volatile unsigned int*)(x + 0x1B8) -+#define FEC_FECTFWR(x) *(volatile unsigned int*)(x + 0x144) -+#define FEC_CTCWR(x) *(volatile unsigned int*)(x + 0x1C8) -+#define FEC_EIMR(x) *(volatile unsigned int*)(x + 0x008) -+#define FEC_TCR(x) *(volatile unsigned int*)(x + 0x0C4) -+#define FEC_MIBC(x) *(volatile unsigned int*)(x + 0x064) -+#define FEC_MSCR(x) *(volatile unsigned int*)(x + 0x044) -+#define FEC_FECTFDR(x) *(volatile unsigned int*)(x + 0x1A4) -+#define FEC_FECRFDR(x) *(volatile unsigned int*)(x + 0x184) -+#define FEC_FECTFSR(x) *(volatile unsigned int*)(x + 0x1A8) -+#define FEC_FECRFSR(x) *(volatile unsigned int*)(x + 0x188) -+#define FECSTAT_RMON_R_PACKETS(x) *(volatile unsigned int*)(x + 0x284) -+#define FECSTAT_RMON_T_PACKETS(x) *(volatile unsigned int*)(x + 0x204) -+#define FECSTAT_RMON_R_OCTETS(x) *(volatile unsigned int*)(x + 0x2C4) -+#define FECSTAT_RMON_T_OCTETS(x) *(volatile unsigned int*)(x + 0x244) -+#define FECSTAT_RMON_R_UNDERSIZE(x) *(volatile unsigned int*)(x + 0x294) -+#define FECSTAT_RMON_R_OVERSIZE(x) *(volatile unsigned int*)(x + 0x298) -+#define FECSTAT_RMON_R_FRAG(x) *(volatile unsigned int*)(x + 0x29C) -+#define FECSTAT_RMON_R_JAB(x) *(volatile unsigned int*)(x + 0x2A0) -+#define FECSTAT_RMON_R_MC_PKT(x) *(volatile unsigned int*)(x + 0x28C) -+#define FECSTAT_RMON_T_COL(x) *(volatile unsigned int*)(x + 0x224) -+#define FECSTAT_IEEE_R_ALIGN(x) *(volatile unsigned int*)(x + 0x2D4) -+#define FECSTAT_IEEE_R_CRC(x) *(volatile unsigned int*)(x + 0x2D0) -+#define FECSTAT_IEEE_R_MACERR(x) *(volatile unsigned int*)(x + 0x2D8) -+#define FECSTAT_IEEE_T_CSERR(x) *(volatile unsigned int*)(x + 0x268) -+#define FECSTAT_IEEE_T_MACERR(x) *(volatile unsigned int*)(x + 0x264) -+#define FECSTAT_IEEE_T_LCOL(x) *(volatile unsigned int*)(x + 0x25C) -+#define FECSTAT_IEEE_R_OCTETS_OK(x) *(volatile unsigned int*)(x + 0x2E0) -+#define FECSTAT_IEEE_T_OCTETS_OK(x) *(volatile unsigned int*)(x + 0x274) -+#define FECSTAT_IEEE_R_DROP(x) *(volatile unsigned int*)(x + 0x2C8) -+#define FECSTAT_IEEE_T_DROP(x) *(volatile unsigned int*)(x + 0x248) -+#define FECSTAT_IEEE_R_FRAME_OK(x) *(volatile unsigned int*)(x + 0x2CC) -+#define FECSTAT_IEEE_T_FRAME_OK(x) *(volatile unsigned int*)(x + 0x24C) -+#define FEC_MMFR(x) *(volatile unsigned int*)(x + 0x040) -+#define FEC_FECFRST(x) *(volatile unsigned int*)(x + 0x1C4) -+ -+#define FEC_MAX_FRM_SIZE (1518) -+#define FEC_MAXBUF_SIZE (1520) -+ -+// Register values -+#define FEC_ECR_RESET (0x00000001) -+#define FEC_EIR_CLEAR (0xFFFFFFFF) -+#define FEC_EIR_RL (0x00100000) -+#define FEC_EIR_HBERR (0x80000000) -+#define FEC_EIR_BABR (0x40000000) // babbling receive error -+#define FEC_EIR_BABT (0x20000000) // babbling transmit error -+#define FEC_EIR_TXF (0x08000000) // transmit frame interrupt -+#define FEC_EIR_MII (0x00800000) // MII interrupt -+#define FEC_EIR_LC (0x00200000) // late collision -+#define FEC_EIR_XFUN (0x00080000) // transmit FIFO underrun -+#define FEC_EIR_XFERR (0x00040000) // transmit FIFO error -+#define FEC_EIR_RFERR (0x00020000) // receive FIFO error -+#define FEC_RCR_MAX_FRM_SIZE (FEC_MAX_FRM_SIZE << 16) -+#define FEC_RCR_MII (0x00000004) -+#define FEC_FECRFCR_FAE (0x00400000) // frame accept error -+#define FEC_FECRFCR_RXW (0x00200000) // receive wait condition -+#define FEC_FECRFCR_UF (0x00100000) // receive FIFO underflow -+#define FEC_FECRFCR_FRM (0x08000000) -+#define FEC_FECRFCR_GR (0x7 << 24) -+ -+#define FEC_EIMR_DISABLE (0x00000000) -+ -+#define FEC_FECRFAR_ALARM (0x300) -+#define FEC_FECTFCR_FRM (0x08000000) -+#define FEC_FECTFCR_GR (0x7 << 24) -+#define FEC_FECTFCR_FAE (0x00400000) // frame accept error -+#define FEC_FECTFCR_TXW (0x00040000) // transmit wait condition -+#define FEC_FECTFCR_UF (0x00100000) // transmit FIFO underflow -+#define FEC_FECTFCR_OF (0x00080000) // transmit FIFO overflow -+ -+#define FEC_FECTFAR_ALARM (0x100) -+#define FEC_FECTFWR_XWMRK (0x00000000) -+ -+#define FEC_FECTFSR_MSK (0xC0B00000) -+#define FEC_FECTFSR_TXW (0x40000000) // transmit wait condition -+#define FEC_FECTFSR_FAE (0x00800000) // frame accept error -+#define FEC_FECTFSR_UF (0x00200000) // transmit FIFO underflow -+#define FEC_FECTFSR_OF (0x00100000) // transmit FIFO overflow -+ -+#define FEC_FECRFSR_MSK (0x80F00000) -+#define FEC_FECRFSR_FAE (0x00800000) // frame accept error -+#define FEC_FECRFSR_RXW (0x00400000) // receive wait condition -+#define FEC_FECRFSR_UF (0x00200000) // receive FIFO underflow -+ -+#define FEC_CTCWR_TFCW_CRC (0x03000000) -+#define FEC_TCR_FDEN (0x00000004) -+#define FEC_TCR_HBC (0x00000002) -+#define FEC_RCR_DRT (0x00000002) -+#define FEC_EIMR_MASK (FEC_EIR_RL | FEC_EIR_HBERR) -+#define FEC_ECR_ETHEREN (0x00000002) -+#define FEC_FECTFCR_MSK (0x00FC0000) -+#define FEC_FECRFCR_MSK (0x00F80000) -+#define FEC_EIR_GRA (0x10000000) -+#define FEC_TCR_GTS (0x00000001) -+#define FEC_MIBC_ENABLE (0x00000000) -+#define FEC_MIB_LEN (228) -+#define FEC_PHY_ADDR (0x01) -+ -+#define FEC_RX_DMA_PRI (6) -+#define FEC_TX_DMA_PRI (6) -+ -+#define FEC_TX_BUF_NUMBER (8) -+#define FEC_RX_BUF_NUMBER (64) -+ -+#define FEC_TX_INDEX_MASK (0x7) -+#define FEC_RX_INDEX_MASK (0x3f) -+ -+#define FEC_RX_DESC_FEC0 SYS_SRAM_FEC_START -+#define FEC_TX_DESC_FEC0 FEC_RX_DESC_FEC0 + FEC_RX_BUF_NUMBER * sizeof(MCD_bufDescFec) -+ -+#define FEC_RX_DESC_FEC1 SYS_SRAM_FEC_START + SYS_SRAM_FEC_SIZE/2 -+#define FEC_TX_DESC_FEC1 FEC_RX_DESC_FEC1 + FEC_RX_BUF_NUMBER * sizeof(MCD_bufDescFec) -+ -+#define FEC_EIR_MII (0x00800000) -+#define FEC_MMFR_READ (0x60020000) -+#define FEC_MMFR_WRITE (0x50020000) -+ -+#define FEC_FLAGS_RX (0x00000001) -+ -+#define FEC_CRCPOL (0xEDB88320) -+ -+#define FEC_MII_TIMEOUT (2) -+#define FEC_GR_TIMEOUT (1) -+#define FEC_TX_TIMEOUT (1) -+#define FEC_RX_TIMEOUT (1) -+ -+#define FEC_SW_RST 0x2000000 -+#define FEC_RST_CTL 0x1000000 -+ -+int fec_read_mii(unsigned int base_addr, unsigned int pa, unsigned int ra, -+ unsigned int *data); -+int fec_write_mii(unsigned int base_addr, unsigned int pa, unsigned int ra, -+ unsigned int data); -+ -+#define init_transceiver ks8721_init_transceiver ---- /dev/null -+++ b/drivers/net/fec/Kconfig -@@ -0,0 +1,25 @@ -+config FEC_548x -+ tristate "MCF547x/MCF548x Fast Ethernet Controller support" -+ depends on M547X_8X -+ help -+ The MCF547x and MCF548x have a built-in Fast Ethernet Controller. -+ Saying Y here will include support for this device in the kernel. -+ -+ To compile this driver as a module, choose M here: the module -+ will be called fecm. -+ -+config FEC_548x_AUTO_NEGOTIATION -+ bool "Enable Auto-Negotiation" -+ depends on FEC_548x -+ help -+ This option enables the FEC to automatically detect the -+ half/full duplex mode and the network speed at initialization -+ If you want this, say Y. -+ -+config FEC_548x_ENABLE_FEC2 -+ bool "Enable the second FEC" -+ depends on FEC_548x -+ help -+ This enables the second FEC on the 547x/548x. If you want to use -+ it, say Y. -+ ---- /dev/null -+++ b/drivers/net/fec/ks8721.c -@@ -0,0 +1,125 @@ -+#include <linux/module.h> -+#include <linux/kernel.h> -+#include <linux/string.h> -+#include <linux/ptrace.h> -+#include <linux/errno.h> -+#include <linux/ioport.h> -+#include <linux/slab.h> -+#include <linux/interrupt.h> -+#include <linux/pci.h> -+#include <linux/init.h> -+#include <linux/delay.h> -+#include <linux/netdevice.h> -+#include <linux/etherdevice.h> -+#include <linux/skbuff.h> -+#include <linux/spinlock.h> -+#include <linux/workqueue.h> -+#include <linux/bitops.h> -+ -+#if 0 -+#include <linux/config.h> -+#include <linux/sched.h> -+#include <linux/errno.h> -+#include <asm/coldfire.h> -+#endif -+#include <asm/coldfire.h> -+#include <asm/mcfsim.h> -+ -+#include "fec.h" -+#include "ks8721.h" -+ -+#ifdef CONFIG_FEC_548x_AUTO_NEGOTIATION -+#define KS8721_AUTO_NEGOTIATION_ENABLE -+#endif -+ -+/************************************************************************ -+* +NAME: ks8721_init_transceiver -+* -+* DESCRIPTION: This function initializes the transceiver -+* -+* RETURNS: If no error occurs, this function returns zero. -+* Otherwise, it returns 1 -+*************************************************************************/ -+ -+int ks8721_init_transceiver(unsigned long base_addr, int *fduplex) -+{ -+ -+ int data; -+ unsigned long time; -+ int flag = 1; -+ -+ int result; -+ -+ // Set the frequency of MII -+ FEC_MSCR(base_addr) = FEC_MII_SPEED; -+ -+ // Reset -+ if ((result = fec_write_mii(base_addr, FEC_PHY_ADDR, KS8721_CTRL, KS8721_CTRL_RESET))) -+ return result; -+ -+ // Read back -+ if ((result = fec_read_mii(base_addr, FEC_PHY_ADDR, KS8721_CTRL, &data)) != 0) -+ return result; -+ -+ // If reset bit is set, return -+ if (data & KS8721_CTRL_RESET) -+ return -ETIME; -+ -+#ifdef KS8721_AUTO_NEGOTIATION_ENABLE -+ -+ // Disable the auto-negotiation -+ if ((result = fec_write_mii(base_addr, FEC_PHY_ADDR, KS8721_CTRL, 0)) != 0) -+ return result; -+ -+ // Set the auto-negotiation advertisement register -+ if ((result = fec_write_mii(base_addr, FEC_PHY_ADDR, KS8721_ANADV, KS8721_ANADV_ADV_ALL)) != 0) -+ return result; -+ -+ // Enable the auto-negotiation -+ if ((result = fec_write_mii(base_addr, FEC_PHY_ADDR, KS8721_CTRL, KS8721_CTRL_AN_ENABLE)) != 0) -+ return result; -+ -+ // Read PHY status register -+ if ((result = fec_read_mii(base_addr, FEC_PHY_ADDR, KS8721_STAT, &data)) != 0) -+ return result; -+ // Set the current time -+ time = jiffies; -+ -+ // Wait for the auto-negotiation completion -+ while (!(data & KS8721_STAT_ANCOMPLETE)) -+ { -+ -+ if (jiffies - time > KS8721_TIMEOUT * HZ) -+ { -+ flag = 0; -+ break; -+ } -+ -+ schedule(); -+ -+ // Read PHY status register -+ if ((result = fec_read_mii(base_addr, FEC_PHY_ADDR, KS8721_STAT, &data)) != 0) -+ return result; -+ } -+ -+ if (flag) -+ { -+ // Set the duplex flag -+ if (data & KS8721_STAT_FDUPLEX) -+ *fduplex = 1; -+ else -+ *fduplex = 0; -+ -+ return 0; -+ } -+ -+#endif -+ -+ // Set the default mode (Full duplex, 100 Mbps) -+ if ((result = fec_write_mii(base_addr, FEC_PHY_ADDR, KS8721_CTRL, KS8721_CTRL_DEFAULT_MODE)) != 0) -+ return result; -+ *fduplex = KS8721_CTRL_DEFAULT_MODE & 0x100; -+ -+ return 0; -+ -+} ---- /dev/null -+++ b/drivers/net/fec/ks8721.h -@@ -0,0 +1,21 @@ -+ -+#define FEC_MII_SPEED (((unsigned int)(MCF_BUSCLK / 5000000)) << 1) -+ -+// Numbers of the transceiver registers -+#define KS8721_CTRL 0x00 -+#define KS8721_ANADV 0x04 -+#define KS8721_STAT 0x01 -+ -+// Register values -+#define KS8721_CTRL_RESET 0x8000 -+#define KS8721_ANADV_ADV_ALL 0x01E1 -+#define KS8721_CTRL_AN_ENABLE 0x1280 -+#define KS8721_CTRL_DEFAULT_MODE 0x2100 -+#define KS8721_STAT_ANCOMPLETE 0x0020 -+#define KS8721_STAT_LINK 0x0004 -+#define KS8721_STAT_FDUPLEX 0x5000 -+ -+// Timeout for the auto-negotiation mode -+#define KS8721_TIMEOUT 5 -+ -+int ks8721_init_transceiver(unsigned long base_addr, int *fduplex); ---- /dev/null -+++ b/drivers/net/fec/Makefile -@@ -0,0 +1,7 @@ -+# -+# Makefile for the FEC ethernet driver -+# -+ -+obj-$(CONFIG_FEC_548x) += fecm.o -+ -+fecm-objs := fec.o ks8721.o ---- a/drivers/net/fec.c -+++ b/drivers/net/fec.c -@@ -23,6 +23,9 @@ - * - * Bug fixes and cleanup by Philippe De Muyter (phdm@macqel.be) - * Copyright (c) 2004-2006 Macq Electronique SA. -+ * -+ * Coldfire bug fixes and cleanup by Kurt Mahan (kmahan@freescale.com) -+ * Copyright 2007-2008 Freescale Semiconductor, Inc. All Rights Reserved. - */ - - #include <linux/module.h> -@@ -51,7 +54,9 @@ - - #if defined(CONFIG_M523x) || defined(CONFIG_M527x) || \ - defined(CONFIG_M5272) || defined(CONFIG_M528x) || \ -- defined(CONFIG_M520x) || defined(CONFIG_M532x) -+ defined(CONFIG_M520x) || defined(CONFIG_M532x) || \ -+ defined(CONFIG_M5445X) -+ - #include <asm/coldfire.h> - #include <asm/mcfsim.h> - #include "fec.h" -@@ -82,6 +87,11 @@ static unsigned int fec_hw[] = { - (MCF_MBAR+0x30000), - #elif defined(CONFIG_M532x) - (MCF_MBAR+0xfc030000), -+#elif defined(CONFIG_M5445X) -+ (MCF_MBAR+0xfc030000), -+#if defined(CONFIG_FEC2) -+ (MCF_MBAR+0xfc034000), -+#endif - #else - &(((immap_t *)IMAP_ADDR)->im_cpm.cp_fec), - #endif -@@ -172,7 +182,7 @@ typedef struct { - * account when setting it. - */ - #if defined(CONFIG_M523x) || defined(CONFIG_M527x) || defined(CONFIG_M528x) || \ -- defined(CONFIG_M520x) || defined(CONFIG_M532x) -+ defined(CONFIG_M520x) || defined(CONFIG_M532x) || defined(CONFIG_M5445X) - #define OPT_FRAME_SIZE (PKT_MAXBUF_SIZE << 16) - #else - #define OPT_FRAME_SIZE 0 -@@ -213,6 +223,7 @@ struct fec_enet_private { - uint phy_speed; - phy_info_t const *phy; - struct work_struct phy_task; -+ volatile fec_t *phy_hwp; - - uint sequence_done; - uint mii_phy_task_queued; -@@ -349,7 +360,8 @@ fec_enet_start_xmit(struct sk_buff *skb, - if (bdp->cbd_bufaddr & 0x3) { - unsigned int index; - index = bdp - fep->tx_bd_base; -- memcpy(fep->tx_bounce[index], (void *) bdp->cbd_bufaddr, bdp->cbd_datlen); -+ memcpy(fep->tx_bounce[index], -+ (void *)skb->data, bdp->cbd_datlen); - bdp->cbd_bufaddr = __pa(fep->tx_bounce[index]); - } - -@@ -702,7 +714,7 @@ fec_enet_mii(struct net_device *dev) - uint mii_reg; - - fep = netdev_priv(dev); -- ep = fep->hwp; -+ ep = fep->phy_hwp; - mii_reg = ep->fec_mii_data; - - spin_lock(&fep->lock); -@@ -753,7 +765,7 @@ mii_queue(struct net_device *dev, int re - mii_tail = mip; - } else { - mii_head = mii_tail = mip; -- fep->hwp->fec_mii_data = regval; -+ fep->phy_hwp->fec_mii_data = regval; - } - } else { - retval = 1; -@@ -1151,8 +1163,7 @@ static phy_info_t const phy_info_ks8721b - }; - - /* ------------------------------------------------------------------------- */ --/* register definitions for the DP83848 */ -- -+/* register definitions for the DP83848 and DP83849 */ - #define MII_DP8384X_PHYSTST 16 /* PHY Status Register */ - - static void mii_parse_dp8384x_sr2(uint mii_reg, struct net_device *dev) -@@ -1186,27 +1197,50 @@ static void mii_parse_dp8384x_sr2(uint m - *s |= PHY_STAT_FAULT; - } - -+static phy_cmd_t const phy_cmd_dp8384x_ack_int[] = { -+ { mk_mii_end, } -+ }; -+ -+static phy_cmd_t const phy_cmd_dp8384x_shutdown[] = { -+ { mk_mii_end, } -+ }; -+ - static phy_info_t phy_info_dp83848= { -- 0x020005c9, -- "DP83848", -+ .id = 0x020005c9, -+ .name = "DP83848", - -- (const phy_cmd_t []) { /* config */ -+ .config = (const phy_cmd_t []) { /* config */ - { mk_mii_read(MII_REG_CR), mii_parse_cr }, - { mk_mii_read(MII_REG_ANAR), mii_parse_anar }, - { mk_mii_read(MII_DP8384X_PHYSTST), mii_parse_dp8384x_sr2 }, - { mk_mii_end, } - }, -- (const phy_cmd_t []) { /* startup - enable interrupts */ -+ .startup = (const phy_cmd_t []) { /* startup - enable interrupts */ - { mk_mii_write(MII_REG_CR, 0x1200), NULL }, /* autonegotiate */ - { mk_mii_read(MII_REG_SR), mii_parse_sr }, - { mk_mii_end, } - }, -- (const phy_cmd_t []) { /* ack_int - never happens, no interrupt */ -+ .ack_int = phy_cmd_dp8384x_ack_int, -+ .shutdown = phy_cmd_dp8384x_shutdown, -+}; -+ -+static phy_info_t phy_info_dp83849 = { -+ .id = 0x020005ca, -+ .name = "DP83849", -+ -+ .config = (const phy_cmd_t []) { /* config */ -+ { mk_mii_read(MII_REG_CR), mii_parse_cr }, -+ { mk_mii_read(MII_REG_ANAR), mii_parse_anar }, -+ { mk_mii_read(MII_DP8384X_PHYSTST), mii_parse_dp8384x_sr2 }, - { mk_mii_end, } - }, -- (const phy_cmd_t []) { /* shutdown */ -+ .startup = (const phy_cmd_t []) { /* startup - enable interrupts */ -+ { mk_mii_write(MII_REG_CR, 0x1200), NULL }, /* autonegotiate */ -+ { mk_mii_read(MII_REG_SR), mii_parse_sr }, - { mk_mii_end, } - }, -+ .ack_int = phy_cmd_dp8384x_ack_int, -+ .shutdown = phy_cmd_dp8384x_shutdown, - }; - - /* ------------------------------------------------------------------------- */ -@@ -1218,6 +1252,7 @@ static phy_info_t const * const phy_info - &phy_info_am79c874, - &phy_info_ks8721bl, - &phy_info_dp83848, -+ &phy_info_dp83849, - NULL - }; - -@@ -1799,6 +1834,138 @@ static void __inline__ fec_uncache(unsig - - /* ------------------------------------------------------------------------- */ - -+#elif defined(CONFIG_M5445X) -+/* -+ * Code specific for M5445X -+ */ -+ -+static void __inline__ fec_request_intrs(struct net_device *dev) -+{ -+ struct fec_enet_private *fep; -+ int b; -+ static const struct idesc { -+ char *name; -+ unsigned short irq; -+ } *idp, id[] = { -+ { "fec(TXF)", 36 }, -+ { "fec(TXB)", 37 }, -+ { "fec(TXFIFO)", 38 }, -+ { "fec(TXCR)", 39 }, -+ { "fec(RXF)", 40 }, -+ { "fec(RXB)", 41 }, -+ { "fec(MII)", 42 }, -+ { "fec(LC)", 43 }, -+ { "fec(HBERR)", 44 }, -+ { "fec(GRA)", 45 }, -+ { "fec(EBERR)", 46 }, -+ { "fec(BABT)", 47 }, -+ { "fec(BABR)", 48 }, -+ { NULL }, -+ }; -+ -+ fep = netdev_priv(dev); -+ b = (fep->index) ? 77 : 64; -+ -+ /* Setup interrupt handlers. */ -+ for (idp = id; idp->name; idp++) { -+ if (request_irq(b+idp->irq, fec_enet_interrupt, IRQF_DISABLED, -+ idp->name, dev) != 0) -+ printk(KERN_ERR "FEC: Could not alloc %s IRQ(%d)!\n", -+ idp->name, b+idp->irq); -+ } -+ -+ if (fep->index) { -+ /* Configure RMII */ -+ MCF_GPIO_PAR_FEC = (MCF_GPIO_PAR_FEC & -+ MCF_GPIO_PAR_FEC_FEC1_MASK) | -+ MCF_GPIO_PAR_FEC_FEC1_RMII_GPIO; -+ } else { -+ /* Configure RMII */ -+ MCF_GPIO_PAR_FEC = (MCF_GPIO_PAR_FEC & -+ MCF_GPIO_PAR_FEC_FEC0_MASK) | -+ MCF_GPIO_PAR_FEC_FEC0_RMII_GPIO; -+ } -+ -+ /* Set up gpio outputs for MII lines on FEC0 */ -+ MCF_GPIO_PAR_FECI2C |= (0 | -+ MCF_GPIO_PAR_FECI2C_MDIO0_MDIO0 | -+ MCF_GPIO_PAR_FECI2C_MDC0_MDC0); -+} -+ -+static void __inline__ fec_set_mii(struct net_device *dev, -+ struct fec_enet_private *fep) -+{ -+ volatile fec_t *fecp; -+ -+ fecp = fep->hwp; -+ fecp->fec_r_cntrl = OPT_FRAME_SIZE | 0x04; -+ fecp->fec_x_cntrl = 0x00; -+ -+ /* -+ * Set MII speed to 2.5 MHz -+ */ -+ fep->phy_speed = ((((MCF_CLK / 2) / (2500000 / 10)) + 5) / 10) * 2; -+ fecp->fec_mii_speed = fep->phy_speed; -+ -+ fec_restart(dev, 0); -+} -+ -+static void __inline__ fec_get_mac(struct net_device *dev) -+{ -+ struct fec_enet_private *fep = netdev_priv(dev); -+ volatile fec_t *fecp; -+ unsigned char *iap, tmpaddr[ETH_ALEN]; -+ -+ fecp = fep->hwp; -+ -+ if (FEC_FLASHMAC) { -+ /* -+ * Get MAC address from FLASH. -+ * If it is all 1's or 0's, use the default. -+ */ -+ iap = FEC_FLASHMAC; -+ if ((iap[0] == 0) && (iap[1] == 0) && (iap[2] == 0) && -+ (iap[3] == 0) && (iap[4] == 0) && (iap[5] == 0)) -+ iap = fec_mac_default; -+ if ((iap[0] == 0xff) && (iap[1] == 0xff) && (iap[2] == 0xff) && -+ (iap[3] == 0xff) && (iap[4] == 0xff) && (iap[5] == 0xff)) -+ iap = fec_mac_default; -+ } else { -+ *((unsigned long *) &tmpaddr[0]) = fecp->fec_addr_low; -+ *((unsigned short *) &tmpaddr[4]) = (fecp->fec_addr_high >> 16); -+ iap = &tmpaddr[0]; -+ } -+ -+ memcpy(dev->dev_addr, iap, ETH_ALEN); -+ -+ /* Adjust MAC if using default MAC address */ -+ if (iap == fec_mac_default) -+ dev->dev_addr[ETH_ALEN-1] = fec_mac_default[ETH_ALEN-1] + -+ fep->index; -+} -+ -+static void __inline__ fec_enable_phy_intr(void) -+{ -+} -+ -+static void __inline__ fec_disable_phy_intr(void) -+{ -+} -+ -+static void __inline__ fec_phy_ack_intr(void) -+{ -+} -+ -+static void __inline__ fec_localhw_setup(void) -+{ -+} -+ -+static void __inline__ fec_uncache(unsigned long addr) -+{ -+} -+ -+/* ------------------------------------------------------------------------- */ -+ - - #else - -@@ -2305,7 +2472,7 @@ fec_set_mac_address(struct net_device *d - - } - --/* Initialize the FEC Ethernet on 860T (or ColdFire 5272). -+/* Initialize the FEC Ethernet. - */ - /* - * XXX: We need to clean up on failure exits here. -@@ -2326,7 +2493,7 @@ int __init fec_enet_init(struct net_devi - - /* Allocate memory for buffer descriptors. - */ -- mem_addr = __get_free_page(GFP_KERNEL); -+ mem_addr = __get_free_page(GFP_DMA); - if (mem_addr == 0) { - printk("FEC: allocate descriptor memory failed?\n"); - return -ENOMEM; -@@ -2339,6 +2506,11 @@ int __init fec_enet_init(struct net_devi - fep->index = index; - fep->hwp = fecp; - fep->netdev = dev; -+#ifdef CONFIG_FEC_SHARED_PHY -+ fep->phy_hwp = (volatile fec_t *) fec_hw[index & ~1]; -+#else -+ fep->phy_hwp = fecp; -+#endif - - /* Whack a reset. We should wait for this. - */ -@@ -2375,7 +2547,7 @@ int __init fec_enet_init(struct net_devi - - /* Allocate a page. - */ -- mem_addr = __get_free_page(GFP_KERNEL); -+ mem_addr = __get_free_page(GFP_DMA); - /* XXX: missing check for allocation failure */ - - fec_uncache(mem_addr); -@@ -2400,7 +2572,7 @@ int __init fec_enet_init(struct net_devi - bdp = fep->tx_bd_base; - for (i=0, j=FEC_ENET_TX_FRPPG; i<TX_RING_SIZE; i++) { - if (j >= FEC_ENET_TX_FRPPG) { -- mem_addr = __get_free_page(GFP_KERNEL); -+ mem_addr = __get_free_page(GFP_DMA); - j = 1; - } else { - mem_addr += FEC_ENET_TX_FRSIZE; -@@ -2462,7 +2634,11 @@ int __init fec_enet_init(struct net_devi - * remainder of the interface. - */ - fep->phy_id_done = 0; -+#ifndef CONFIG_FEC_SHARED_PHY - fep->phy_addr = 0; -+#else -+ fep->phy_addr = fep->index; -+#endif - mii_queue(dev, mk_mii_read(MII_REG_PHYIR1), mii_discover_phy); - - index++; ---- a/drivers/net/fec.h -+++ b/drivers/net/fec.h -@@ -14,7 +14,7 @@ - /****************************************************************************/ - - #if defined(CONFIG_M523x) || defined(CONFIG_M527x) || defined(CONFIG_M528x) || \ -- defined(CONFIG_M520x) || defined(CONFIG_M532x) -+ defined(CONFIG_M520x) || defined(CONFIG_M532x) || defined(CONFIG_M5445X) - /* - * Just figures, Motorola would have to change the offsets for - * registers in the same peripheral device on different models ---- a/drivers/net/Kconfig -+++ b/drivers/net/Kconfig -@@ -351,6 +351,8 @@ config MACB - - source "drivers/net/arm/Kconfig" - -+source "drivers/net/fec/Kconfig" -+ - config AX88796 - tristate "ASIX AX88796 NE2000 clone support" - depends on ARM || MIPS || SUPERH -@@ -1973,7 +1975,7 @@ config 68360_ENET - - config FEC - bool "FEC ethernet controller (of ColdFire CPUs)" -- depends on M523x || M527x || M5272 || M528x || M520x -+ depends on M523x || M527x || M5272 || M528x || M520x || M5445X - help - Say Y here if you want to use the built-in 10/100 Fast ethernet - controller on some Motorola ColdFire processors. -@@ -1985,6 +1987,12 @@ config FEC2 - Say Y here if you want to use the second built-in 10/100 Fast - ethernet controller on some Motorola ColdFire processors. - -+config FEC_SHARED_PHY -+ bool "Shared PHY interface(on some ColdFire designs)" -+ depends on FEC2 -+ help -+ Say Y here if both PHYs are controlled via a single channel. -+ - config FEC_MPC52xx - tristate "MPC52xx FEC driver" - depends on PPC_MERGE && PPC_MPC52xx && PPC_BESTCOMM_FEC ---- a/drivers/net/Makefile -+++ b/drivers/net/Makefile -@@ -226,6 +226,8 @@ obj-$(CONFIG_ENC28J60) += enc28j60.o - - obj-$(CONFIG_MACB) += macb.o - -+obj-$(CONFIG_FEC_548x) += fec/ -+ - obj-$(CONFIG_ARM) += arm/ - obj-$(CONFIG_DEV_APPLETALK) += appletalk/ - obj-$(CONFIG_TR) += tokenring/ ---- a/drivers/pci/access.c -+++ b/drivers/pci/access.c -@@ -23,6 +23,7 @@ static DEFINE_SPINLOCK(pci_lock); - #define PCI_word_BAD (pos & 1) - #define PCI_dword_BAD (pos & 3) - -+#ifdef NL_ORIGINAL - #define PCI_OP_READ(size,type,len) \ - int pci_bus_read_config_##size \ - (struct pci_bus *bus, unsigned int devfn, int pos, type *value) \ -@@ -37,7 +38,20 @@ int pci_bus_read_config_##size \ - spin_unlock_irqrestore(&pci_lock, flags); \ - return res; \ - } -- -+#else /* NL_ORIGINAL */ -+#define PCI_OP_READ(size,type,len) \ -+int pci_bus_read_config_##size \ -+ (struct pci_bus *bus, unsigned int devfn, int pos, type *value) \ -+{ \ -+ int res; \ -+ unsigned long flags; \ -+ if (PCI_##size##_BAD) return PCIBIOS_BAD_REGISTER_NUMBER; \ -+ spin_lock_irqsave(&pci_lock, flags); \ -+ res = bus->ops->read(bus, devfn, pos, len, (u32 *)value); \ -+ spin_unlock_irqrestore(&pci_lock, flags); \ -+ return res; \ -+} -+#endif /* NL_ORIGINAL */ - #define PCI_OP_WRITE(size,type,len) \ - int pci_bus_write_config_##size \ - (struct pci_bus *bus, unsigned int devfn, int pos, type value) \ ---- a/drivers/pci/Makefile -+++ b/drivers/pci/Makefile -@@ -39,6 +39,7 @@ obj-$(CONFIG_PPC) += setup-bus.o - obj-$(CONFIG_MIPS) += setup-bus.o setup-irq.o - obj-$(CONFIG_X86_VISWS) += setup-irq.o - obj-$(CONFIG_MN10300) += setup-bus.o -+obj-$(CONFIG_M54455) += setup-bus.o setup-irq.o - - # - # ACPI Related PCI FW Functions ---- a/drivers/rtc/rtc-rs5c372.c -+++ b/drivers/rtc/rtc-rs5c372.c -@@ -15,7 +15,6 @@ - - #define DRV_VERSION "0.5" - -- - /* - * Ricoh has a family of I2C based RTCs, which differ only slightly from - * each other. Differences center on pinout (e.g. how many interrupts, -@@ -60,6 +59,15 @@ - /* to read (style 1) or write registers starting at R */ - #define RS5C_ADDR(R) (((R) << 4) | 0) - -+#ifdef CONFIG_M547X_8X -+#define DRV_NAME "rv5c387a" -+/* i2c configuration */ -+#define RV5C387_I2C_ADDR 0x32 -+static unsigned short normal_i2c[] = { -+ RV5C387_I2C_ADDR, I2C_CLIENT_END -+}; -+I2C_CLIENT_INSMOD; /* defines addr_data */ -+#endif - - enum rtc_type { - rtc_undef = 0, -@@ -506,14 +514,14 @@ static int rs5c372_probe(struct i2c_clie - err = -ENODEV; - goto exit; - } -- -- if (!(rs5c372 = kzalloc(sizeof(struct rs5c372), GFP_KERNEL))) { -+ rs5c372 = kzalloc(sizeof(struct rs5c372), GFP_KERNEL); -+ if (!rs5c372) { - err = -ENOMEM; - goto exit; - } - - /* we read registers 0x0f then 0x00-0x0f; skip the first one */ -- rs5c372->regs=&rs5c372->buf[1]; -+ rs5c372->regs = &rs5c372->buf[1]; - - rs5c372->client = client; - i2c_set_clientdata(client, rs5c372); -@@ -605,7 +613,7 @@ static int rs5c372_probe(struct i2c_clie - case rtc_rv5c386: s = "rv5c386"; break; - case rtc_rv5c387a: s = "rv5c387a"; break; - default: s = "chip"; break; -- }; s;}), -+ }; s; }), - rs5c372->time24 ? "24hr" : "am/pm" - ); - -@@ -645,12 +653,61 @@ static int rs5c372_remove(struct i2c_cli - return 0; - } - -+#ifdef CONFIG_M547X_8X -+static int rv5c387_probe(struct i2c_adapter *adapter, int addr, int kind) -+{ -+ int rc = 0; -+ struct i2c_client *new_client = NULL; -+ -+ if (!i2c_check_functionality(adapter, I2C_FUNC_I2C)) { -+ rc = -ENODEV; -+ printk(KERN_DEBUG "%s i2c_check_functionality\n", __FUNCTION__); -+ goto failout; -+ } -+ -+ new_client = kzalloc(sizeof(struct i2c_client), GFP_KERNEL); -+ if (new_client == NULL) { -+ rc = -ENOMEM; -+ printk(KERN_DEBUG "%s kzalloc new_client\n", __FUNCTION__); -+ goto failout; -+ } -+ -+ new_client->addr = addr; -+ new_client->adapter = adapter; -+ new_client->driver = &rs5c372_driver; -+ new_client->flags = 0; -+ strcpy(new_client->name, DRV_NAME); -+ -+ rc = i2c_attach_client(new_client); -+ if (rc < 0) { -+ printk(KERN_DEBUG "%s i2c_attach_client\n", __FUNCTION__); -+ goto failout; -+ } -+ -+ rs5c372_probe(new_client); -+ return 0; -+failout: -+ kfree(new_client); -+ return rc; -+} -+ -+static int -+rv5c387_attach_adapter(struct i2c_adapter *adapter) -+{ -+ return i2c_probe(adapter, &addr_data, rv5c387_probe); -+} -+#endif -+ - static struct i2c_driver rs5c372_driver = { - .driver = { - .name = "rtc-rs5c372", - }, -+#ifdef CONFIG_M547X_8X -+ .attach_adapter = &rv5c387_attach_adapter, -+#else - .probe = rs5c372_probe, - .remove = rs5c372_remove, -+#endif - }; - - static __init int rs5c372_init(void) ---- a/drivers/serial/Kconfig -+++ b/drivers/serial/Kconfig -@@ -979,6 +979,12 @@ config SERIAL_COLDFIRE - This driver supports the built-in serial ports of the Motorola ColdFire - family of CPUs. - -+config SERIAL_COLDFIRE_IRDA -+ bool "ColdFire IRDA support" -+ depends on SERIAL_COLDFIRE -+ help -+ This driver supports IRDA on the Motorola ColdFire. -+ - config SERIAL_MCF - bool "Coldfire serial support (new style driver)" - depends on COLDFIRE ---- a/drivers/serial/mcfserial.c -+++ b/drivers/serial/mcfserial.c -@@ -45,7 +45,14 @@ - #include <asm/coldfire.h> - #include <asm/mcfsim.h> - #include <asm/mcfuart.h> -+#if defined(CONFIG_M547X_8X) -+#include <asm/m5485sim.h> -+#include <asm/m5485psc.h> -+#include <asm/m5485gpio.h> -+#endif -+#ifdef CONFIG_NETtel - #include <asm/nettel.h> -+#endif - #include <asm/uaccess.h> - #include "mcfserial.h" - -@@ -61,7 +68,8 @@ struct timer_list mcfrs_timer_struct; - #define CONSOLE_BAUD_RATE 38400 - #define DEFAULT_CBAUD B38400 - #elif defined(CONFIG_MOD5272) || defined(CONFIG_M5208EVB) || \ -- defined(CONFIG_M5329EVB) || defined(CONFIG_GILBARCO) -+ defined(CONFIG_M5329EVB) || defined(CONFIG_GILBARCO) || \ -+ defined(CONFIG_M5445X) || defined(CONFIG_M547X_8X) - #define CONSOLE_BAUD_RATE 115200 - #define DEFAULT_CBAUD B115200 - #elif defined(CONFIG_ARNEWSH) || defined(CONFIG_FREESCALE) || \ -@@ -94,12 +102,17 @@ static struct tty_driver *mcfrs_serial_d - #undef SERIAL_DEBUG_FLOW - - #if defined(CONFIG_M523x) || defined(CONFIG_M527x) || defined(CONFIG_M528x) || \ -- defined(CONFIG_M520x) || defined(CONFIG_M532x) -+ defined(CONFIG_M520x) || defined(CONFIG_M532x) || defined(CONFIG_M5445X) || \ -+ defined(CONFIG_M547X_8X) - #define IRQBASE (MCFINT_VECBASE+MCFINT_UART0) - #else - #define IRQBASE 73 - #endif - -+#ifdef CONFIG_SERIAL_COLDFIRE_IRDA -+#define SERIAL_IRDA_LINE (2) -+#endif -+ - /* - * Configuration table, UARTs to look for at startup. - */ -@@ -114,7 +127,11 @@ static struct mcf_serial mcfrs_table[] = - { /* ttyS1 */ - .magic = 0, - .addr = (volatile unsigned char *) (MCF_MBAR+MCFUART_BASE2), -+#if defined(CONFIG_M547X_8X) -+ .irq = IRQBASE-1, -+#else - .irq = IRQBASE+1, -+#endif - .flags = ASYNC_BOOT_AUTOCONF, - }, - #endif -@@ -122,7 +139,11 @@ static struct mcf_serial mcfrs_table[] = - { /* ttyS2 */ - .magic = 0, - .addr = (volatile unsigned char *) (MCF_MBAR+MCFUART_BASE3), -+#if defined(CONFIG_M547X_8X) -+ .irq = IRQBASE-2, -+#else - .irq = IRQBASE+2, -+#endif - .flags = ASYNC_BOOT_AUTOCONF, - }, - #endif -@@ -130,7 +151,11 @@ static struct mcf_serial mcfrs_table[] = - { /* ttyS3 */ - .magic = 0, - .addr = (volatile unsigned char *) (MCF_MBAR+MCFUART_BASE4), -+#if defined(CONFIG_M547X_8X) -+ .irq = IRQBASE-3, -+#else - .irq = IRQBASE+3, -+#endif - .flags = ASYNC_BOOT_AUTOCONF, - }, - #endif -@@ -372,6 +397,9 @@ static inline void receive_chars(struct - static inline void transmit_chars(struct mcf_serial *info) - { - volatile unsigned char *uartp; -+#ifdef CONFIG_SERIAL_COLDFIRE_IRDA -+ int i; -+#endif - - uartp = info->addr; - -@@ -383,13 +411,36 @@ static inline void transmit_chars(struct - } - - if ((info->xmit_cnt <= 0) || info->tty->stopped) { -+#ifdef CONFIG_SERIAL_COLDFIRE_IRDA -+ if (info->line == SERIAL_IRDA_LINE) { -+ /* Enable receiver for IRDA */ -+ uartp[MCFUART_UCR] = MCFUART_UCR_CMDRESETRX; -+ /* reset RX */ -+ uartp[MCFUART_UCR] = MCFUART_UCR_TXENABLE | MCFUART_UCR_RXENABLE; -+ } -+#endif - info->imr &= ~MCFUART_UIR_TXREADY; - uartp[MCFUART_UIMR] = info->imr; - return; - } - - while (uartp[MCFUART_USR] & MCFUART_USR_TXREADY) { -+#ifdef CONFIG_SERIAL_COLDFIRE_IRDA -+ if (info->line == SERIAL_IRDA_LINE) { -+ while (!(uartp[MCFUART_USR] & MCFUART_USR_TXEMPTY)); -+ i = 0; -+ /* delay for settle */ -+#if defined(CONFIG_M548X) -+ udelay(1); -+#elif defined(CONFIG_M547X) -+ udelay(2); -+#else -+ while (i++ < 25000) udelay(1); -+#endif -+ } -+#endif - uartp[MCFUART_UTB] = info->xmit_buf[info->xmit_tail++]; -+ - info->xmit_tail = info->xmit_tail & (SERIAL_XMIT_SIZE-1); - info->stats.tx++; - if (--info->xmit_cnt <= 0) -@@ -409,7 +460,12 @@ irqreturn_t mcfrs_interrupt(int irq, voi - struct mcf_serial *info; - unsigned char isr; - -+/* JKM -- revisit! IRQ compute */ -+#if defined(CONFIG_M547X_8X) -+ info = &mcfrs_table[(IRQBASE - irq)]; -+#else - info = &mcfrs_table[(irq - IRQBASE)]; -+#endif - isr = info->addr[MCFUART_UISR] & info->imr; - - if (isr & MCFUART_UIR_RXREADY) -@@ -541,6 +597,28 @@ static int startup(struct mcf_serial * i - */ - mcfrs_change_speed(info); - -+#ifdef CONFIG_SERIAL_COLDFIRE_IRDA -+ if (info->line == SERIAL_IRDA_LINE) { -+ /* Put PSC in IrDA mode */ -+ MCF_PSC_SICR(info->line) = MCF_PSC_SICR_SIM_SIR; -+ -+ /* Set pulse width to 1.6 uS */ -+ MCF_PSC_IRSDR(info->line) = (uint8_t) -+ (16 * (CONFIG_MCFCLK / 10000000)); -+ MCF_PSC_IRCR1(info->line) = MCF_PSC_IRCR1_SPUL; -+ MCF_PSC_IRCR2(info->line) = 0; -+ -+ /* Enable RTS to send */ -+ MCF_PSC_OPSET(info->line) = MCF_PSC_OPSET_RTS; -+ -+ /* Setup FIFO Alarms */ -+ MCF_PSC_RFAR(info->line) = MCF_PSC_RFAR_ALARM(248); -+ MCF_PSC_TFAR(info->line) = MCF_PSC_TFAR_ALARM(248); -+ -+ MCF_PSC_RFCR(info->line) = MCF_PSC_RFCR_FRMEN | MCF_PSC_RFCR_GR(4); -+ MCF_PSC_TFCR(info->line) = MCF_PSC_TFCR_FRMEN | MCF_PSC_RFCR_GR(4); -+ } -+#endif - /* - * Lastly enable the UART transmitter and receiver, and - * interrupt enables. -@@ -562,10 +640,20 @@ static void shutdown(struct mcf_serial * - { - volatile unsigned char *uartp; - unsigned long flags; -+#ifdef CONFIG_SERIAL_COLDFIRE_IRDA -+ unsigned long delay_counter = 0; -+#endif - - if (!(info->flags & ASYNC_INITIALIZED)) - return; -- -+#ifdef CONFIG_SERIAL_COLDFIRE_IRDA -+ uartp = (volatile unsigned char *) info->addr; -+ while (!(uartp[MCFUART_USR] & MCFUART_USR_TXEMPTY)) { -+ if(delay_counter++ > 25000) -+ break; -+ udelay(10); -+ } -+#endif - #ifdef SERIAL_DEBUG_OPEN - printk("Shutting down serial port %d (irq %d)....\n", info->line, - info->irq); -@@ -794,10 +882,19 @@ static int mcfrs_write(struct tty_struct - - local_irq_disable(); - uartp = info->addr; -+ -+#ifdef CONFIG_SERIAL_COLDFIRE_IRDA -+ if (info->line == SERIAL_IRDA_LINE) { -+ /* Disable IRDA receiver*/ -+ uartp[MCFUART_UCR] = MCFUART_UCR_CMDRESETRX; /* reset RX */ -+ uartp[MCFUART_UCR] = MCFUART_UCR_CMDRESETTX; /* reset TX */ -+ -+ uartp[MCFUART_UCR] = MCFUART_UCR_TXENABLE; -+ } -+#endif - info->imr |= MCFUART_UIR_TXREADY; - uartp[MCFUART_UIMR] = info->imr; - local_irq_restore(flags); -- - return total; - } - -@@ -858,9 +955,21 @@ static void mcfrs_throttle(struct tty_st - - if (serial_paranoia_check(info, tty->name, "mcfrs_throttle")) - return; -- -+#ifdef CONFIG_SERIAL_COLDFIRE_IRDA -+ if (I_IXOFF(tty)) { -+ /* Force STOP_CHAR (xoff) out */ -+ volatile unsigned char *uartp; -+ unsigned long flags; -+ uartp = (volatile unsigned char *) info->addr; -+ local_irq_save(flags); -+ info->imr |= MCFUART_UIR_TXREADY; -+ uartp[MCFUART_UIMR] = info->imr; -+ local_irq_restore(flags); -+ } -+#else - if (I_IXOFF(tty)) - info->x_char = STOP_CHAR(tty); -+#endif - - /* Turn off RTS line (do this atomic) */ - } -@@ -881,8 +990,22 @@ static void mcfrs_unthrottle(struct tty_ - if (I_IXOFF(tty)) { - if (info->x_char) - info->x_char = 0; -+#ifdef CONFIG_SERIAL_COLDFIRE_IRDA -+ else { -+ /* Force START_CHAR (xon) out */ -+ volatile unsigned char *uartp; -+ unsigned long flags; -+ info->x_char = START_CHAR(tty); -+ uartp = (volatile unsigned char *) info->addr; -+ local_irq_save(flags); -+ info->imr |= MCFUART_UIR_TXREADY; -+ uartp[MCFUART_UIMR] = info->imr; -+ local_irq_restore(flags); -+ } -+#else - else - info->x_char = START_CHAR(tty); -+#endif - } - - /* Assert RTS line (do this atomic) */ -@@ -1130,12 +1253,17 @@ static int mcfrs_ioctl(struct tty_struct - static void mcfrs_set_termios(struct tty_struct *tty, struct ktermios *old_termios) - { - struct mcf_serial *info = (struct mcf_serial *)tty->driver_data; -+#ifdef CONFIG_SERIAL_COLDFIRE_IRDA -+ int i = 0; /* hush GCC */ -+#endif - - if (tty->termios->c_cflag == old_termios->c_cflag) - return; - -+#ifdef CONFIG_SERIAL_COLDFIRE_IRDA -+ while (i++ < 35000) udelay(1); -+#endif - mcfrs_change_speed(info); -- - if ((old_termios->c_cflag & CRTSCTS) && - !(tty->termios->c_cflag & CRTSCTS)) { - tty->hw_stopped = 0; -@@ -1604,6 +1732,36 @@ static void mcfrs_irqinit(struct mcf_ser - /* GPIOs also must be initalized, depends on board */ - break; - } -+#elif defined(CONFIG_M5445X) -+ volatile unsigned char *uartp; -+ uartp = info->addr; -+ switch (info->line) { -+ case 0: -+ MCF_GPIO_PAR_UART |= 0x000F; -+ break; -+ case 1: -+ MCF_GPIO_PAR_UART |= 0x0FF0; -+ break; -+ case 2: -+ /* GPIOs also must be initalized, depends on board */ -+ break; -+ } -+#elif defined(CONFIG_M547X_8X) -+ volatile unsigned char *uartp; -+ uartp = (volatile unsigned char *)info->addr; -+ -+ if (info->line > 3) { -+ printk("SERIAL: don't know how to handle UART %d interrupt?\n", -+ info->line); -+ return; -+ } -+ -+ /* Set GPIO port register to enable PSC(port) signals */ -+ MCF_PAR_PSCn(info->line) = (0 -+ | MCF_PAR_PSC_TXD -+ | MCF_PAR_PSC_RXD); -+ -+ MCF_ICR(info->irq - 64) = ILP_PSCn(info->line); - #else - volatile unsigned char *icrp, *uartp; - -@@ -1966,7 +2124,9 @@ struct console mcfrs_console = { - - static int __init mcfrs_console_init(void) - { -+#if !(defined(CONFIG_M5445X) || defined(CONFIG_M547X_8X)) - register_console(&mcfrs_console); -+#endif - return 0; - } - ---- /dev/null -+++ b/drivers/spi/coldfire_edma.c -@@ -0,0 +1,446 @@ -+/* -+ * -+ * coldfire_edma.c - eDMA driver for Coldfire MCF5445x -+ * -+ * Yaroslav Vinogradov yaroslav.vinogradov@freescale.com -+ * -+ * Copyright Freescale Semiconductor, Inc. 2007 -+ * -+ * This program is free software; you can redistribute it and/or modify it -+ * under the terms of the GNU General Public License as published by the -+ * Free Software Foundation; either version 2 of the License, or (at your -+ * option) any later version. -+ */ -+ -+#include <linux/init.h> -+#include <linux/module.h> -+#include <asm/virtconvert.h> -+#include <asm/coldfire.h> -+#include <linux/fs.h> -+#include <linux/cdev.h> -+#include <linux/seq_file.h> -+#include <linux/proc_fs.h> -+#ifdef CONFIG_M5445X -+#include <asm/mcf5445x_edma.h> -+#include <asm/mcf5445x_intc.h> -+#endif /* CONFIG_M5445X */ -+#include <asm/coldfire_edma.h> -+ -+/* -+ * Callback handler data for each TCD -+ */ -+struct edma_isr_record { -+ edma_irq_handler irq_handler; /* interrupt handler */ -+ edma_error_handler error_handler; /* error interrupt handler */ -+ void *arg; /* argument to pass back */ -+ int allocated; /* busy flag */ -+ spinlock_t *lock; /* spin lock (optional) */ -+ const char *device_id; /* dev id string, used in procfs */ -+}; -+ -+/* -+ * Device structure -+ */ -+struct coldfire_edma_dev { -+ struct cdev cdev; /* character device */ -+ struct edma_isr_record dma_interrupt_handlers[EDMA_CHANNELS]; -+}; -+ -+/* allocated major device number */ -+static int coldfire_dma_major; -+ -+/* device driver structure */ -+static struct coldfire_edma_dev *devp = NULL; -+ -+/* device driver file operations */ -+struct file_operations coldfire_edma_fops = { -+ .owner = THIS_MODULE, -+}; -+ -+/** -+ * dmaisr - eDMA channel interrupt handler -+ * @irq: interrupt number -+ * @dev_id: argument -+ */ -+static int dmaisr(int irq, void *dev_id) -+{ -+ int channel = irq - EDMA_INT_CONTROLLER_BASE - EDMA_INT_CHANNEL_BASE; -+ int result = IRQ_HANDLED; -+ -+ if ((devp != NULL) && -+ (devp->dma_interrupt_handlers[channel].irq_handler)) { -+ /* call user irq handler */ -+ if (devp->dma_interrupt_handlers[channel].lock) -+ spin_lock(devp->dma_interrupt_handlers[channel].lock); -+ -+ result = devp->dma_interrupt_handlers[channel].irq_handler( -+ channel, devp->dma_interrupt_handlers[channel].arg); -+ -+ if (devp->dma_interrupt_handlers[channel].lock) -+ spin_unlock(devp->dma_interrupt_handlers[channel].lock); -+ } else { -+ /* no irq handler so just ack it */ -+ confirm_edma_interrupt_handled(channel); -+ printk(EDMA_DRIVER_NAME ": No handler for DMA channel %d\n", -+ channel); -+ } -+ -+ return result; -+} -+ -+/** -+ * dma_error_isr - eDMA error interrupt handler -+ * @irq: interrupt number -+ * @dev_id: argument -+ */ -+static int dma_error_isr(int irq, void* dev_id) -+{ -+ u16 err; -+ int i; -+ -+ err = MCF_EDMA_ERR; -+ for (i=0; i<EDMA_CHANNELS; i++) { -+ if (err & (1<<i)) { -+ if (devp!=NULL && devp->dma_interrupt_handlers[i].error_handler) -+ devp->dma_interrupt_handlers[i].error_handler(i, devp->dma_interrupt_handlers[i].arg); -+ else -+ printk(KERN_WARNING EDMA_DRIVER_NAME ": DMA error on channel %d\n", i); -+ } -+ } -+ -+ MCF_EDMA_CERR = MCF_EDMA_CERR_CAER; -+ return IRQ_HANDLED; -+} -+ -+/** -+ * set_edma_params - Set transfer control descriptor (TCD) -+ * @channel: channel number -+ * @source: source address -+ * @dest: destination address -+ * @attr: attributes -+ * @soff: source offset -+ * @nbytes: number of bytes to be transfered in minor loop -+ * @slast: last source address adjustment -+ * @citer: major loop count -+ * @biter: beginning minor loop count -+ * @doff: destination offset -+ * @dlast_sga: last destination address adjustment -+ * @major_int: generate interrupt after each major loop -+ * @disable_req: disable DMA request after major loop -+ */ -+void set_edma_params(int channel, u32 source, u32 dest, -+ u32 attr, u32 soff, u32 nbytes, u32 slast, -+ u32 citer, u32 biter, u32 doff, u32 dlast_sga, -+ int major_int, int disable_req) -+{ -+ -+ if (channel<0 || channel>EDMA_CHANNELS) -+ return; -+ -+ MCF_EDMA_TCD_SADDR(channel) = source; -+ MCF_EDMA_TCD_DADDR(channel) = dest; -+ MCF_EDMA_TCD_ATTR(channel) = attr; -+ MCF_EDMA_TCD_SOFF(channel) = MCF_EDMA_TCD_SOFF_SOFF(soff); -+ MCF_EDMA_TCD_NBYTES(channel) = MCF_EDMA_TCD_NBYTES_NBYTES(nbytes); -+ MCF_EDMA_TCD_SLAST(channel) = MCF_EDMA_TCD_SLAST_SLAST(slast); -+ MCF_EDMA_TCD_CITER(channel) = MCF_EDMA_TCD_CITER_CITER(citer); -+ MCF_EDMA_TCD_BITER(channel)=MCF_EDMA_TCD_BITER_BITER(biter); -+ MCF_EDMA_TCD_DOFF(channel) = MCF_EDMA_TCD_DOFF_DOFF(doff); -+ MCF_EDMA_TCD_DLAST_SGA(channel) = MCF_EDMA_TCD_DLAST_SGA_DLAST_SGA(dlast_sga); -+ -+ /* interrupt at the end of major loop */ -+ if (major_int) -+ MCF_EDMA_TCD_CSR(channel) |= MCF_EDMA_TCD_CSR_INT_MAJOR; -+ else -+ MCF_EDMA_TCD_CSR(channel) &= ~MCF_EDMA_TCD_CSR_INT_MAJOR; -+ -+ /* disable request at the end of major loop of transfer or not*/ -+ if (disable_req) -+ MCF_EDMA_TCD_CSR(channel) |= MCF_EDMA_TCD_CSR_D_REQ; -+ else -+ MCF_EDMA_TCD_CSR(channel) &= ~MCF_EDMA_TCD_CSR_D_REQ; -+} -+EXPORT_SYMBOL(set_edma_params); -+ -+/** -+ * init_edma - Initialize the eDMA controller -+ */ -+void init_edma(void) -+{ -+ MCF_EDMA_CR = 0; -+} -+EXPORT_SYMBOL(init_edma); -+ -+/** -+ * request_edma_channel - Request an eDMA channel -+ * @channel: channel number -+ * @handler: dma handler -+ * @error_handler: dma error handler -+ * @arg: argument to pass back -+ * @lock: optional spinlock to hold over interrupt -+ * @device_id: device id -+ * -+ * Returns 0 if success or a negative value if failure -+ */ -+int request_edma_channel(int channel, -+ edma_irq_handler handler, -+ edma_error_handler error_handler, -+ void *arg, -+ spinlock_t *lock, -+ const char *device_id ) -+{ -+ if (devp!=NULL && channel>=0 && channel<=EDMA_CHANNELS) { -+ if (devp->dma_interrupt_handlers[channel].allocated) -+ return -EBUSY; -+ -+ devp->dma_interrupt_handlers[channel].allocated = 1; -+ devp->dma_interrupt_handlers[channel].irq_handler = handler; -+ devp->dma_interrupt_handlers[channel].error_handler = error_handler; -+ devp->dma_interrupt_handlers[channel].arg = arg; -+ devp->dma_interrupt_handlers[channel].lock = lock; -+ devp->dma_interrupt_handlers[channel].device_id = device_id; -+ return 0; -+ } -+ return -EINVAL; -+} -+EXPORT_SYMBOL(request_edma_channel); -+ -+/** -+ * set_edma_callback - Update the channel callback/arg -+ * @channel: channel number -+ * @handler: dma handler -+ * @error_handler: dma error handler -+ * @arg: argument to pass back -+ * -+ * Returns 0 if success or a negative value if failure -+ */ -+int set_edma_callback(int channel, -+ edma_irq_handler handler, -+ edma_error_handler error_handler, -+ void *arg ) -+{ -+ if (devp!=NULL && channel>=0 && channel<=EDMA_CHANNELS && -+ devp->dma_interrupt_handlers[channel].allocated) { -+ devp->dma_interrupt_handlers[channel].irq_handler = handler; -+ devp->dma_interrupt_handlers[channel].error_handler = error_handler; -+ devp->dma_interrupt_handlers[channel].arg = arg; -+ return 0; -+ } -+ return -EINVAL; -+} -+EXPORT_SYMBOL(set_edma_callback); -+ -+/** -+ * free_edma_channel - Free the edma channel -+ * @channel: channel number -+ * @arg: argument created with -+ * -+ * Returns 0 if success or a negative value if failure -+ */ -+int free_edma_channel(int channel, void *arg) -+{ -+ if (devp!=NULL && channel>=0 && channel<=EDMA_CHANNELS) { -+ if (devp->dma_interrupt_handlers[channel].allocated) { -+#if 0 -+ if (devp->dma_interrupt_handlers[channel].arg != arg) -+ return -EBUSY; -+#endif -+ -+ devp->dma_interrupt_handlers[channel].allocated = 0; -+ devp->dma_interrupt_handlers[channel].arg = NULL; -+ devp->dma_interrupt_handlers[channel].irq_handler = NULL; -+ devp->dma_interrupt_handlers[channel].error_handler = NULL; -+ devp->dma_interrupt_handlers[channel].lock = NULL; -+ } -+ return 0; -+ } -+ return -EINVAL; -+} -+EXPORT_SYMBOL(free_edma_channel); -+ -+/** -+ * coldfire_edma_cleanup - cleanup driver allocated resources -+ */ -+static void coldfire_edma_cleanup(void) -+{ -+ dev_t devno; -+ int i; -+ -+ /* free interrupts/memory */ -+ if (devp) { -+ for (i=0; i<EDMA_CHANNELS; i++) -+ free_irq(EDMA_INT_BASE+i, devp); -+ -+ free_irq(EDMA_INT_BASE+EDMA_INT_ERR, devp); -+ cdev_del(&devp->cdev); -+ kfree(devp); -+ } -+ -+ /* unregister character device */ -+ devno = MKDEV(coldfire_dma_major, 0); -+ unregister_chrdev_region(devno, 1); -+} -+ -+#ifdef CONFIG_PROC_FS -+/* -+ * proc file system support -+ */ -+ -+#define FREE_CHANNEL "free" -+#define DEVICE_UNKNOWN "device unknown" -+ -+/** -+ * proc_edma_show - print out proc info -+ * @m: seq_file -+ * @v: -+ */ -+static int proc_edma_show(struct seq_file *m, void *v) -+{ -+ int i; -+ -+ if (devp == NULL) -+ return 0; -+ -+ for (i = 0 ; i < EDMA_CHANNELS ; i++) { -+ if (devp->dma_interrupt_handlers[i].allocated) { -+ if (devp->dma_interrupt_handlers[i].device_id) -+ seq_printf(m, "%2d: %s\n", i, devp->dma_interrupt_handlers[i].device_id); -+ else -+ seq_printf(m, "%2d: %s\n", i, DEVICE_UNKNOWN); -+ } else -+ seq_printf(m, "%2d: %s\n", i, FREE_CHANNEL); -+ } -+ return 0; -+} -+ -+/** -+ * proc_edma_open - open the proc file -+ * @inode: inode ptr -+ * @file: file ptr -+ */ -+static int proc_edma_open(struct inode *inode, struct file *file) -+{ -+ return single_open(file, proc_edma_show, NULL); -+} -+ -+static const struct file_operations proc_edma_operations = { -+ .open = proc_edma_open, -+ .read = seq_read, -+ .llseek = seq_lseek, -+ .release = single_release, -+}; -+ -+/** -+ * proc_edma_init - initialize proc filesystem -+ */ -+static int __init proc_edma_init(void) -+{ -+ struct proc_dir_entry *e; -+ -+ e = create_proc_entry("edma", 0, NULL); -+ if (e) -+ e->proc_fops = &proc_edma_operations; -+ -+ return 0; -+} -+ -+#endif -+ -+/** -+ * coldfire_edma_init - eDMA module init -+ */ -+static int __init coldfire_edma_init(void) -+{ -+ dev_t dev; -+ int result; -+ int i; -+ -+ /* allocate free major number */ -+ result = alloc_chrdev_region(&dev, DMA_DEV_MINOR, 1, EDMA_DRIVER_NAME); -+ if (result < 0) { -+ printk(KERN_WARNING EDMA_DRIVER_NAME": can't get major %d\n", -+ result); -+ return result; -+ } -+ coldfire_dma_major = MAJOR(dev); -+ -+ /* allocate device driver structure */ -+ devp = kmalloc(sizeof(struct coldfire_edma_dev), GFP_KERNEL); -+ if (!devp) { -+ result = -ENOMEM; -+ goto fail; -+ } -+ -+ /* init handlers (no handlers for beginning) */ -+ for (i = 0; i < EDMA_CHANNELS; i++) { -+ devp->dma_interrupt_handlers[i].irq_handler = NULL; -+ devp->dma_interrupt_handlers[i].error_handler = NULL; -+ devp->dma_interrupt_handlers[i].arg = NULL; -+ devp->dma_interrupt_handlers[i].allocated = 0; -+ devp->dma_interrupt_handlers[i].lock = NULL; -+ devp->dma_interrupt_handlers[i].device_id = NULL; -+ } -+ -+ /* register char device */ -+ cdev_init(&devp->cdev, &coldfire_edma_fops); -+ devp->cdev.owner = THIS_MODULE; -+ devp->cdev.ops = &coldfire_edma_fops; -+ result = cdev_add(&devp->cdev, dev, 1); -+ if (result) { -+ printk(KERN_NOTICE EDMA_DRIVER_NAME -+ ": Error %d adding coldfire-dma device\n", result); -+ result = -ENODEV; -+ goto fail; -+ } -+ -+ /* request/enable irq for each eDMA channel */ -+ for (i = 0; i < EDMA_CHANNELS;i++) { -+ result = request_irq(EDMA_INT_BASE + i, -+ dmaisr, IRQF_DISABLED, -+ EDMA_DRIVER_NAME, devp); -+ if (result) { -+ printk(KERN_WARNING EDMA_DRIVER_NAME -+ ": Cannot request irq %d\n", -+ (EDMA_INT_BASE + EDMA_INT_ERR+i)); -+ result = -EBUSY; -+ goto fail; -+ } -+ } -+ -+ /* request error interrupt */ -+ result = request_irq(EDMA_INT_BASE + EDMA_INT_ERR, -+ dma_error_isr, IRQF_DISABLED, -+ EDMA_DRIVER_NAME, devp); -+ if (result) { -+ printk(KERN_WARNING EDMA_DRIVER_NAME -+ ": Cannot request irq %d\n", -+ (EDMA_INT_BASE + EDMA_INT_ERR)); -+ result = -EBUSY; -+ goto fail; -+ } -+ -+#ifdef CONFIG_PROC_FS -+ proc_edma_init(); -+#endif -+ -+ printk(EDMA_DRIVER_NAME ": initialized successfully\n"); -+ return 0; -+fail: -+ coldfire_edma_cleanup(); -+ return result; -+} -+ -+/** -+ * coldfire_edma_exit - eDMA module exit -+ */ -+static void __exit coldfire_edma_exit(void) -+{ -+ coldfire_edma_cleanup(); -+} -+ -+module_init(coldfire_edma_init); -+module_exit(coldfire_edma_exit); -+ -+MODULE_LICENSE("GPL"); -+MODULE_AUTHOR("Freescale Semiconductor, Inc."); -+MODULE_DESCRIPTION("eDMA library for Coldfire M5445x"); ---- /dev/null -+++ b/drivers/spi/dspi_mcf.c -@@ -0,0 +1,1217 @@ -+/* -+ * dspi_mcf.c - DSPI controller for ColdFire processors -+ * -+ * -+ * Matt Waddel Matt.Waddel@freescale.com -+ * Copyright Freescale Semiconductor, Inc. 2008 -+ * -+ * M547x/M548x changes by Kurt Mahan kmahan@freescale.com -+ * Copyright Freescale Semiconductor, Inc. 2008 -+ * -+ * Based on spi_coldfire.c done by: -+ * Andrey Butok -+ * Yaroslav Vinogradov -+ * Copyright Freescale Semiconductor, Inc. 2006-2007 -+ * Mike Lavender (mike@steroidmicros) -+ * (C) Copyright 2005, Intec Automation, -+ * -+ * This program is free software; you can redistribute it and/or modify it -+ * under the terms of the GNU General Public License as published by the -+ * Free Software Foundation; either version 2 of the License, or (at your -+ * option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -+ * -+ *************************************************************************** -+ * Changes: -+ * v0.002 M547x/M548x support. -+ * v0.001 Initial version. Coldfire DSPI master driver. -+ ****************************************************************************/ -+ -+/* -+ * Includes -+ */ -+ -+#include <linux/autoconf.h> -+#include <linux/init.h> -+#include <linux/module.h> -+#include <linux/device.h> -+#include <linux/interrupt.h> -+#include <linux/platform_device.h> -+#include <linux/spi/spi.h> -+#include <linux/workqueue.h> -+#include <linux/delay.h> -+#include <asm/mcfsim.h> -+#include <asm/mcfqspi.h> -+#include <asm/coldfire.h> -+#include <linux/io.h> -+#include <asm/mcfdspi.h> -+#include <linux/dma-mapping.h> -+ -+#undef DSPI_COLDFIRE_DEBUG -+ -+#ifdef DSPI_COLDFIRE_DEBUG -+#define DBG(fmt, args...) \ -+ printk(KERN_INFO "[%s] " fmt , __FUNCTION__, ## args) -+#else -+#define DBG(fmt, args...) do {} while (0) -+#endif -+ -+#if defined(CONFIG_M54455) -+#include <asm/mcf5445x_dspi.h> -+#if defined(CONFIG_SPI_COLDFIRE_DSPI_EDMA) -+ #include <asm/mcf5445x_edma.h> -+#endif -+#endif -+ -+#if defined(CONFIG_M547X_8X) -+#include <asm/virtconvert.h> -+#include <asm/m5485dspi.h> -+#endif -+ -+#if defined(CONFIG_SPI_COLDFIRE_DSPI_EDMA) -+#include <asm/mcf_edma.h> -+#define SPI_DSPI_EDMA -+#define EDMA_BUFSIZE_KMALLOC (DSPI_FIFO_SIZE*4) -+#define DSPI_DMA_RX_TCD MCF_EDMA_CHAN_DSPI_RX -+#define DSPI_DMA_TX_TCD MCF_EDMA_CHAN_DSPI_TX -+#endif -+ -+#define DSPI_BITS MCF_DSPI_DCTAR_FMSZ(0xF) -+#define DSPI_BITS_16 MCF_DSPI_DCTAR_FMSZ(0xF) -+#define DSPI_BITS_8 MCF_DSPI_DCTAR_FMSZ(0x7) -+#define DSPI_FIFO_SIZE 16 -+ -+#define DRIVER_NAME "Coldfire DSPI" -+ -+/****************************************************************************/ -+ -+/* -+ * Local constants and macros -+ */ -+ -+#define START_STATE ((void *)0) -+#define RUNNING_STATE ((void *)1) -+#define DONE_STATE ((void *)2) -+#define ERROR_STATE ((void *)-1) -+ -+#define QUEUE_RUNNING 0 -+#define QUEUE_STOPPED 1 -+ -+/****************************************************************************/ -+ -+/* -+ * Local Data Structures -+ */ -+ -+struct DSPI_MCR { -+ unsigned master:1; -+ unsigned cont_scke:1; -+ unsigned dconf:2; -+ unsigned frz:1; -+ unsigned mtfe:1; -+ unsigned pcsse:1; -+ unsigned rooe:1; -+ unsigned pcsis:8; -+ unsigned reserved15:1; -+ unsigned mdis:1; -+ unsigned dis_tx:1; -+ unsigned dis_rxf:1; -+ unsigned clr_tx:1; -+ unsigned clr_rxf:1; -+ unsigned smpl_pt:2; -+ unsigned reserved71:7; -+ unsigned halt:1; -+}; -+ -+struct DSPI_CTAR { -+ unsigned dbr:1; -+ unsigned fmsz:4; -+ unsigned cpol:1; -+ unsigned cpha:1; -+ unsigned lsbfe:1; -+ unsigned pcssck:2; -+ unsigned pasc:2; -+ unsigned pdt:2; -+ unsigned pbr:2; -+ unsigned cssck:4; -+ unsigned asc:4; -+ unsigned dt:4; -+ unsigned br:4; -+}; -+ -+struct chip_data { -+ /* dspi data */ -+ union { -+ u32 mcr_val; -+ struct DSPI_MCR mcr; -+ }; -+ union { -+ u32 ctar_val; -+ struct DSPI_CTAR ctar; -+ }; -+ u16 void_write_data; -+}; -+ -+ -+struct driver_data { -+ /* Driver model hookup */ -+ struct platform_device *pdev; -+ -+ /* SPI framework hookup */ -+ struct spi_master *master; -+ -+ /* Driver message queue */ -+ struct workqueue_struct *workqueue; -+ struct work_struct pump_messages; -+ spinlock_t lock; /* lock */ -+ struct list_head queue; -+ int busy; -+ int run; -+ -+ /* Message Transfer pump */ -+ struct tasklet_struct pump_transfers; -+ -+ /* Current message transfer state info */ -+ struct spi_message *cur_msg; -+ struct spi_transfer *cur_transfer; -+ struct chip_data *cur_chip; -+ size_t len; -+ void *tx; -+ void *tx_end; -+ void *rx; -+ void *rx_end; -+ char flags; -+#define TRAN_STATE_RX_VOID 0x01 -+#define TRAN_STATE_TX_VOID 0x02 -+#define TRAN_STATE_WORD_ODD_NUM 0x04 -+ u8 cs; -+ u16 void_write_data; -+ unsigned cs_change:1; -+ -+ u32 trans_cnt; -+ u32 wce_cnt; -+ u32 abrt_cnt; -+ u32 *mcr; /* DSPI MCR register */ -+ u32 *ctar; /* DSPI CTAR register */ -+ u32 *dspi_dtfr; /* DSPI DTFR register */ -+ u32 *dspi_drfr; /* DSPI DRFR register */ -+ u32 *dspi_rser; /* DSPI RSER register */ -+ u32 *dspi_sr; /* DSPI status register */ -+ -+#if defined(SPI_DSPI_EDMA) -+ void *edma_tx_buf; -+ void *edma_rx_buf; -+#endif -+ -+#if defined(CONFIG_M532x) || defined(CONFIG_M537x) -+ u16 *par; /* Pin assignment register */ -+#else -+ u8 *par; /* Pin assignment register */ -+#endif -+ u8 *int_icr; /* Interrupt level and priority register */ -+ u32 *int_mr; /* Interrupt mask register */ -+ void (*cs_control)(u8 cs, u8 command); -+}; -+ -+#define DSPI_CS(cs) ((1<<(cs))<<16) -+ -+/****************************************************************************/ -+ -+/* -+ * SPI local functions -+ */ -+ -+static void *next_transfer(struct driver_data *drv_data) -+{ -+ struct spi_message *msg = drv_data->cur_msg; -+ struct spi_transfer *trans = drv_data->cur_transfer; -+ -+ DBG("\n"); -+ /* Move to next transfer */ -+ if (trans->transfer_list.next != &msg->transfers) { -+ drv_data->cur_transfer = list_entry(trans->transfer_list.next, -+ struct spi_transfer, -+ transfer_list); -+ -+ if (drv_data->cur_transfer->transfer_list.next -+ == &msg->transfers) /* last transfer */ -+ drv_data->cur_transfer->cs_change = 1; -+ -+ return RUNNING_STATE; -+ } else -+ return DONE_STATE; -+} -+ -+ -+static inline int is_word_transfer(struct driver_data *drv_data) -+{ -+ return ((*(drv_data->ctar+drv_data->cs) & DSPI_BITS_16) == -+ DSPI_BITS_8) ? 0 : 1; -+} -+ -+static inline void set_8bit_transfer_mode(struct driver_data *drv_data) -+{ -+ DBG("\n"); -+ *(drv_data->ctar+drv_data->cs) = -+ (*(drv_data->ctar + drv_data->cs) & ~DSPI_BITS) | DSPI_BITS_8; -+} -+ -+static inline void set_16bit_transfer_mode(struct driver_data *drv_data) -+{ -+ DBG("\n"); -+ *(drv_data->ctar+drv_data->cs) = -+ (*(drv_data->ctar + drv_data->cs) & ~DSPI_BITS) | DSPI_BITS_16; -+} -+ -+static unsigned char hz_to_spi_baud(int pbr, int dbr, int speed_hz) -+{ -+ int pbr_tbl[4] = {2, 3, 5, 7}; /* Valid baud rate pre-scaler values */ -+ int brs[16] = { 2, 4, 6, 8, -+ 16, 32, 64, 128, -+ 256, 512, 1024, 2048, -+ 4096, 8192, 16384, 32768 }; -+ int temp, index = 0; -+ -+ if ((pbr < 0) || (pbr > 3) || -+ (dbr < 0) || (dbr > 1)) -+ return 15; /* table indexes out of range, go slow */ -+ -+ temp = ((((MCF_CLK / 2) / pbr_tbl[pbr]) * (1 + dbr)) / speed_hz); -+ -+ while (temp >= brs[index]) -+ if (index++ >= 15) -+ break; -+ -+ DBG("baud rate scaler = 0x%x - %d\n", index, brs[index]); -+ return(index); -+} -+ -+static int write(struct driver_data *drv_data) -+{ -+ int tx_count = 0; -+ int tx_word = is_word_transfer(drv_data); -+ u16 d16; -+ u8 d8; -+ u32 dspi_pushr = 0; -+ int first = 1; -+#if defined(SPI_DSPI_EDMA) -+ u32 *edma_wr = (u32 *)(drv_data->edma_tx_buf); -+#endif -+ -+ /* If we are in word mode, but only have a single byte to transfer -+ * then switch to byte mode temporarily. Will switch back at the -+ * end of the transfer. */ -+ if (tx_word && ((drv_data->tx_end - drv_data->tx) == 1)) { -+ drv_data->flags |= TRAN_STATE_WORD_ODD_NUM; -+ set_8bit_transfer_mode(drv_data); -+ tx_word = 0; -+ } -+ -+ while ((drv_data->tx < drv_data->tx_end) && (tx_count < DSPI_FIFO_SIZE)) { -+// DBG("while\n"); -+ if (tx_word) { -+ if ((drv_data->tx_end - drv_data->tx) == 1) -+ break; -+ -+ if (!(drv_data->flags & TRAN_STATE_TX_VOID)) -+ d16 = *(u16 *)drv_data->tx; -+ else -+ d16 = drv_data->void_write_data; -+ -+ dspi_pushr = MCF_DSPI_DTFR_TXDATA(d16) | -+ DSPI_CS(drv_data->cs) | -+ MCF_DSPI_DTFR_CTAS(drv_data->cs) | -+ MCF_DSPI_DTFR_CONT; -+ -+ drv_data->tx += 2; -+ } else { -+ if (!(drv_data->flags & TRAN_STATE_TX_VOID)) -+ d8 = *(u8 *)drv_data->tx; -+ else -+ d8 = *(u8 *)&drv_data->void_write_data; -+ -+ dspi_pushr = MCF_DSPI_DTFR_TXDATA(d8) | -+ DSPI_CS(drv_data->cs) | -+ MCF_DSPI_DTFR_CTAS(drv_data->cs) | -+ MCF_DSPI_DTFR_CONT; -+ -+ drv_data->tx++; -+ } -+ -+ if (drv_data->tx == drv_data->tx_end -+ || tx_count == DSPI_FIFO_SIZE-1) { -+ /* last transfer in the queue */ -+ dspi_pushr |= MCF_DSPI_DTFR_EOQ; -+ if ((drv_data->cs_change) -+ && (drv_data->tx == drv_data->tx_end)) -+ dspi_pushr &= ~MCF_DSPI_DTFR_CONT; -+#ifdef CONFIG_M547X_8X -+ /* EOQ gets missed if we don't delay */ -+ udelay(100); -+#endif -+ } else if (tx_word && ((drv_data->tx_end - drv_data->tx) == 1)) -+ dspi_pushr |= MCF_DSPI_DTFR_EOQ; -+ -+ if (first) { -+ first = 0; -+ dspi_pushr |= MCF_DSPI_DTFR_CTCNT; /* clear counter */ -+ } -+#if defined(SPI_DSPI_EDMA) -+ *edma_wr = dspi_pushr; -+ edma_wr++; -+#else -+ *drv_data->dspi_dtfr = dspi_pushr; -+#endif -+ tx_count++; -+ } -+ -+#if defined(SPI_DSPI_EDMA) -+ if (tx_count > 0) { -+ -+ mcf_edma_set_tcd_params(DSPI_DMA_TX_TCD, -+ virt_to_phys(drv_data->edma_tx_buf), -+ (u32)drv_data->dspi_dtfr, -+ MCF_EDMA_TCD_ATTR_SSIZE_32BIT -+ | MCF_EDMA_TCD_ATTR_DSIZE_32BIT, -+ 4, /* soff */ -+ 4 * tx_count, /* nbytes */ -+ 0, /* slast */ -+ 1, /* citer */ -+ 1, /* biter */ -+ 0, /* doff */ -+ 0, /* dlastsga */ -+ 0, /* major_int */ -+ 1); /* disable_req */ -+ -+ mcf_edma_set_tcd_params(DSPI_DMA_RX_TCD, -+ (u32)drv_data->dspi_drfr, -+ virt_to_phys(drv_data->edma_rx_buf), -+ MCF_EDMA_TCD_ATTR_SSIZE_32BIT -+ | MCF_EDMA_TCD_ATTR_DSIZE_32BIT, -+ 0, /* soff */ -+ 4 * tx_count, /* nbytes */ -+ 0, /* slast */ -+ 1, /* citer */ -+ 1, /* biter */ -+ 4, /* doff */ -+ 0, /* dlastsga */ -+ 0, /* major_int */ -+ 1); /* disable_req */ -+ -+ mcf_edma_start_transfer(DSPI_DMA_TX_TCD); -+ } -+#endif -+ return (tx_count * (tx_word + 1)); -+} -+ -+static int read(struct driver_data *drv_data) -+{ -+ int rx_count = 0; -+ int rx_word = is_word_transfer(drv_data); -+ u16 d; -+#if defined(SPI_DSPI_EDMA) -+ u32 *rx_edma = (u32 *) drv_data->edma_rx_buf; -+ -+ /* receive SPI data */ -+ mcf_edma_start_transfer(DSPI_DMA_RX_TCD); -+#endif -+ while ((drv_data->rx < drv_data->rx_end) -+ && (rx_count < DSPI_FIFO_SIZE)) { -+ -+ if (rx_word) { -+ if ((drv_data->rx_end - drv_data->rx) == 1) -+ break; -+#if defined(SPI_DSPI_EDMA) -+ d = MCF_DSPI_DRFR_RXDATA(*rx_edma); -+ rx_edma++; -+#else -+ d = MCF_DSPI_DRFR_RXDATA(*drv_data->dspi_drfr); -+#endif -+ if (!(drv_data->flags & TRAN_STATE_RX_VOID)) -+ *(u16 *)drv_data->rx = d; -+ drv_data->rx += 2; -+ -+ } else { -+#if defined(SPI_DSPI_EDMA) -+ d = MCF_DSPI_DRFR_RXDATA(*rx_edma); -+ rx_edma++; -+#else -+ d = MCF_DSPI_DRFR_RXDATA(*drv_data->dspi_drfr); -+#endif -+ if (!(drv_data->flags & TRAN_STATE_RX_VOID)) -+ *(u8 *)drv_data->rx = d; -+ drv_data->rx++; -+ } -+ rx_count++; -+ DBG("rxd=0x%x\n", d); -+ } -+ return rx_count; -+} -+ -+ -+static inline void dspi_setup_chip(struct driver_data *drv_data) -+{ -+ struct chip_data *chip = drv_data->cur_chip; -+ -+ DBG("\n"); -+ *drv_data->mcr = chip->mcr_val; -+ *(drv_data->ctar+drv_data->cs) = chip->ctar_val; -+ *drv_data->dspi_rser = MCF_DSPI_DRSER_EOQFE; -+} -+ -+#if defined(SPI_DSPI_EDMA) -+static int edma_tx_handler(int channel, void *dev) -+{ -+ DBG("\n"); -+ if (channel == DSPI_DMA_TX_TCD) -+ mcf_edma_stop_transfer(DSPI_DMA_TX_TCD); -+ return IRQ_HANDLED; -+} -+ -+static int edma_rx_handler(int channel, void *dev) -+{ -+ DBG("\n"); -+ if (channel == DSPI_DMA_RX_TCD) -+ mcf_edma_stop_transfer(DSPI_DMA_RX_TCD); -+ return IRQ_HANDLED; -+} -+#endif -+ -+static irqreturn_t dspi_interrupt(int irq, void *dev_id) -+{ -+ struct driver_data *drv_data = (struct driver_data *)dev_id; -+ struct spi_message *msg = drv_data->cur_msg; -+ -+ /* Clear all flags immediately */ -+ *drv_data->dspi_sr = MCF_DSPI_DSR_EOQF; -+ -+ if (!drv_data->cur_msg || !drv_data->cur_msg->state) { -+#if !defined(SPI_DSPI_EDMA) -+ u32 irq_status = *drv_data->dspi_sr; -+ /* if eDMA is used it happens some time (at least once)*/ -+ printk(KERN_ERR "Bad message or transfer state handler. \ -+ IRQ status = %x\n", irq_status); -+#endif -+ return IRQ_NONE; -+ } -+ -+ DBG("\n"); -+ /* -+ * Read the data into the buffer and reload and start -+ * queue with new data if not finished. If finished -+ * then setup the next transfer -+ */ -+ read(drv_data); -+ -+ if (drv_data->rx == drv_data->rx_end) { -+ /* -+ * Finished now - fall through and schedule next -+ * transfer tasklet -+ */ -+ if (drv_data->flags & TRAN_STATE_WORD_ODD_NUM) -+ set_16bit_transfer_mode(drv_data); -+ -+ msg->state = next_transfer(drv_data); -+ } else { -+ /* not finished yet - keep going */ -+ msg->actual_length += write(drv_data); -+ return IRQ_HANDLED; -+ } -+ -+ tasklet_schedule(&drv_data->pump_transfers); -+ -+ return IRQ_HANDLED; -+} -+ -+/* caller already set message->status; dma and pio irqs are blocked */ -+static void giveback(struct driver_data *drv_data) -+{ -+ struct spi_transfer *last_transfer; -+ unsigned long flags; -+ struct spi_message *msg; -+ DBG("\n"); -+ -+ spin_lock_irqsave(&drv_data->lock, flags); -+ msg = drv_data->cur_msg; -+ drv_data->cur_msg = NULL; -+ drv_data->cur_transfer = NULL; -+ drv_data->cur_chip = NULL; -+ queue_work(drv_data->workqueue, &drv_data->pump_messages); -+ spin_unlock_irqrestore(&drv_data->lock, flags); -+ -+ last_transfer = list_entry(msg->transfers.prev, -+ struct spi_transfer, transfer_list); -+ -+ if (!last_transfer->cs_change) -+ drv_data->cs_control(drv_data->cs, QSPI_CS_DROP); -+ -+ msg->state = NULL; -+ if (msg->complete) -+ msg->complete(msg->context); -+} -+ -+ -+static void pump_transfers(unsigned long data) -+{ -+ struct driver_data *drv_data = (struct driver_data *)data; -+ struct spi_message *message = NULL; -+ struct spi_transfer *transfer = NULL; -+ struct spi_transfer *previous = NULL; -+ struct chip_data *chip = NULL; -+ unsigned long flags; -+ DBG("\n"); -+ /* Get current state information */ -+ message = drv_data->cur_msg; -+ transfer = drv_data->cur_transfer; -+ chip = drv_data->cur_chip; -+ -+ /* Handle for abort */ -+ if (message->state == ERROR_STATE) { -+ message->status = -EIO; -+ giveback(drv_data); -+ return; -+ } -+ -+ /* Handle end of message */ -+ if (message->state == DONE_STATE) { -+ message->status = 0; -+ giveback(drv_data); -+ return; -+ } -+ -+ if (message->state == START_STATE) { -+ dspi_setup_chip(drv_data); -+ -+ if (drv_data->cs_control) -+ drv_data->cs_control(message->spi->chip_select, -+ QSPI_CS_ASSERT); -+ } -+ -+ /* Delay if requested at end of transfer*/ -+ if (message->state == RUNNING_STATE) { -+ previous = list_entry(transfer->transfer_list.prev, -+ struct spi_transfer, -+ transfer_list); -+ -+ if (drv_data->cs_control && transfer->cs_change) -+ drv_data->cs_control(message->spi->chip_select, -+ QSPI_CS_DROP); -+ -+ if (previous->delay_usecs) -+ udelay(previous->delay_usecs); -+ -+ if (drv_data->cs_control && transfer->cs_change) -+ drv_data->cs_control(message->spi->chip_select, -+ QSPI_CS_ASSERT); -+ } -+ -+ drv_data->flags = 0; -+ drv_data->tx = (void *)transfer->tx_buf; -+ drv_data->tx_end = drv_data->tx + transfer->len; -+ drv_data->rx = transfer->rx_buf; -+ drv_data->rx_end = drv_data->rx + transfer->len; -+ -+ if (!drv_data->rx) -+ drv_data->flags |= TRAN_STATE_RX_VOID; -+ if (!drv_data->tx) -+ drv_data->flags |= TRAN_STATE_TX_VOID; -+ drv_data->cs = message->spi->chip_select; -+ drv_data->cs_change = transfer->cs_change; -+ drv_data->void_write_data = chip->void_write_data; -+ if (transfer->speed_hz) { -+ *(drv_data->ctar + drv_data->cs) = \ -+ ((chip->ctar_val & ~0xF) | \ -+ hz_to_spi_baud(chip->ctar.pbr, \ -+ chip->ctar.dbr, \ -+ transfer->speed_hz)); -+ } -+ -+ message->state = RUNNING_STATE; -+ /* Go baby, go */ -+ local_irq_save(flags); -+ message->actual_length += write(drv_data); -+ local_irq_restore(flags); -+} -+ -+ -+static void pump_messages(struct work_struct *work) -+{ -+ struct driver_data *drv_data; -+ unsigned long flags; -+ DBG("\n"); -+ -+ drv_data = container_of(work, struct driver_data, pump_messages); -+ -+ /* Lock queue and check for queue work */ -+ spin_lock_irqsave(&drv_data->lock, flags); -+ if (list_empty(&drv_data->queue) -+ || drv_data->run == QUEUE_STOPPED) { -+ drv_data->busy = 0; -+ spin_unlock_irqrestore(&drv_data->lock, flags); -+ return; -+ } -+ -+ /* Make sure we are not already running a message */ -+ if (drv_data->cur_msg) { -+ spin_unlock_irqrestore(&drv_data->lock, flags); -+ return; -+ } -+ -+ /* Extract head of queue */ -+ drv_data->cur_msg = list_entry(drv_data->queue.next, -+ struct spi_message, queue); -+ list_del_init(&drv_data->cur_msg->queue); -+ -+ /* Initial message state*/ -+ drv_data->cur_msg->state = START_STATE; -+ drv_data->cur_transfer = list_entry(drv_data->cur_msg->transfers.next, -+ struct spi_transfer, -+ transfer_list); -+ -+ if (drv_data->cur_transfer->transfer_list.next -+ == &drv_data->cur_msg->transfers) -+ drv_data->cur_transfer->cs_change = 1; /* last */ -+ -+ -+ /* Setup the SPI Registers using the per chip configuration */ -+ drv_data->cur_chip = spi_get_ctldata(drv_data->cur_msg->spi); -+ -+ /* Mark as busy and launch transfers */ -+ tasklet_schedule(&drv_data->pump_transfers); -+ -+ drv_data->busy = 1; -+ spin_unlock_irqrestore(&drv_data->lock, flags); -+} -+ -+/****************************************************************************/ -+ -+/* -+ * SPI master implementation -+ */ -+ -+static int transfer(struct spi_device *spi, struct spi_message *msg) -+{ -+ struct driver_data *drv_data = spi_master_get_devdata(spi->master); -+ unsigned long flags; -+ -+ DBG("\n"); -+ spin_lock_irqsave(&drv_data->lock, flags); -+ -+ if (drv_data->run == QUEUE_STOPPED) { -+ spin_unlock_irqrestore(&drv_data->lock, flags); -+ return -ESHUTDOWN; -+ } -+ -+ msg->actual_length = 0; -+ msg->status = -EINPROGRESS; -+ msg->state = START_STATE; -+ -+ list_add_tail(&msg->queue, &drv_data->queue); -+ -+ if (drv_data->run == QUEUE_RUNNING && !drv_data->busy) -+ queue_work(drv_data->workqueue, &drv_data->pump_messages); -+ -+ spin_unlock_irqrestore(&drv_data->lock, flags); -+ -+ return 0; -+} -+ -+ -+static int setup(struct spi_device *spi) -+{ -+ -+ struct chip_data *chip; -+ struct coldfire_dspi_chip *chip_info -+ = (struct coldfire_dspi_chip *)spi->controller_data; -+ DBG("\n"); -+ -+ /* Only alloc on first setup */ -+ chip = spi_get_ctldata(spi); -+ if (chip == NULL) { -+ chip = kcalloc(1, sizeof(struct chip_data), GFP_KERNEL); -+ if (!chip) -+ return -ENOMEM; -+ spi->mode = chip_info->mode; -+ spi->bits_per_word = chip_info->bits_per_word; -+ } -+ -+ chip->mcr.master = 1; -+ chip->mcr.cont_scke = 0; -+ chip->mcr.dconf = 0; -+ chip->mcr.frz = 0; -+ chip->mcr.mtfe = 0; -+ chip->mcr.pcsse = 0; -+ chip->mcr.rooe = 0; -+ chip->mcr.pcsis = 0xFF; -+ chip->mcr.reserved15 = 0; -+ chip->mcr.mdis = 0; -+ chip->mcr.dis_tx = 0; -+ chip->mcr.dis_rxf = 0; -+ chip->mcr.clr_tx = 1; -+ chip->mcr.clr_rxf = 1; -+ chip->mcr.smpl_pt = 0; -+ chip->mcr.reserved71 = 0; -+ chip->mcr.halt = 0; -+ -+ if ((spi->bits_per_word >= 4) && (spi->bits_per_word <= 16)) { -+ chip->ctar.fmsz = spi->bits_per_word-1; -+ } else { -+ printk(KERN_ERR "Invalid wordsize\n"); -+ kfree(chip); -+ return -ENODEV; -+ } -+ -+ chip->void_write_data = chip_info->void_write_data; -+ -+ if (spi->max_speed_hz != 0) -+ chip_info->br = hz_to_spi_baud(chip_info->pbr, chip_info->dbr, \ -+ spi->max_speed_hz); -+ -+ chip->ctar.cpha = (spi->mode & SPI_CPHA) ? 1 : 0; -+ chip->ctar.cpol = (spi->mode & SPI_CPOL) ? 1 : 0; -+ chip->ctar.lsbfe = (spi->mode & SPI_LSB_FIRST) ? 1 : 0; -+ chip->ctar.dbr = chip_info->dbr; -+ chip->ctar.pbr = chip_info->pbr; -+ chip->ctar.br = chip_info->br; -+ chip->ctar.pcssck = chip_info->pcssck; -+ chip->ctar.pasc = chip_info->pasc; -+ chip->ctar.pdt = chip_info->pdt; -+ chip->ctar.cssck = chip_info->cssck; -+ chip->ctar.asc = chip_info->asc; -+ chip->ctar.dt = chip_info->dt; -+ -+ spi_set_ctldata(spi, chip); -+ -+ return 0; -+} -+ -+static int init_queue(struct driver_data *drv_data) -+{ -+ INIT_LIST_HEAD(&drv_data->queue); -+ spin_lock_init(&drv_data->lock); -+ -+ drv_data->run = QUEUE_STOPPED; -+ drv_data->busy = 0; -+ -+ tasklet_init(&drv_data->pump_transfers, -+ pump_transfers, (unsigned long)drv_data); -+ -+ INIT_WORK(&drv_data->pump_messages, pump_messages); -+ -+ drv_data->workqueue = create_singlethread_workqueue( -+ drv_data->master->dev.parent->bus_id); -+ if (drv_data->workqueue == NULL) -+ return -EBUSY; -+ -+ return 0; -+} -+ -+static int start_queue(struct driver_data *drv_data) -+{ -+ unsigned long flags; -+ -+ spin_lock_irqsave(&drv_data->lock, flags); -+ -+ if (drv_data->run == QUEUE_RUNNING || drv_data->busy) { -+ spin_unlock_irqrestore(&drv_data->lock, flags); -+ return -EBUSY; -+ } -+ -+ drv_data->run = QUEUE_RUNNING; -+ drv_data->cur_msg = NULL; -+ drv_data->cur_transfer = NULL; -+ drv_data->cur_chip = NULL; -+ spin_unlock_irqrestore(&drv_data->lock, flags); -+ -+ queue_work(drv_data->workqueue, &drv_data->pump_messages); -+ -+ return 0; -+} -+ -+static int stop_queue(struct driver_data *drv_data) -+{ -+ unsigned long flags; -+ unsigned limit = 500; -+ int status = 0; -+ -+ spin_lock_irqsave(&drv_data->lock, flags); -+ -+ /* This is a bit lame, but is optimized for the common execution path. -+ * A wait_queue on the drv_data->busy could be used, but then the common -+ * execution path (pump_messages) would be required to call wake_up or -+ * friends on every SPI message. Do this instead */ -+ drv_data->run = QUEUE_STOPPED; -+ while (!list_empty(&drv_data->queue) && drv_data->busy && limit--) { -+ spin_unlock_irqrestore(&drv_data->lock, flags); -+ msleep(10); -+ spin_lock_irqsave(&drv_data->lock, flags); -+ } -+ -+ if (!list_empty(&drv_data->queue) || drv_data->busy) -+ status = -EBUSY; -+ -+ spin_unlock_irqrestore(&drv_data->lock, flags); -+ -+ return status; -+} -+ -+static int destroy_queue(struct driver_data *drv_data) -+{ -+ int status; -+ -+ status = stop_queue(drv_data); -+ if (status != 0) -+ return status; -+ -+ destroy_workqueue(drv_data->workqueue); -+ -+ return 0; -+} -+ -+ -+static void cleanup(struct spi_device *spi) -+{ -+ struct chip_data *chip = spi_get_ctldata((struct spi_device *)spi); -+ -+ dev_dbg(&spi->dev, "spi_device %u.%u cleanup\n", -+ spi->master->bus_num, spi->chip_select); -+ -+ kfree(chip); -+} -+ -+ -+/****************************************************************************/ -+ -+/* -+ * Generic Device driver routines and interface implementation -+ */ -+ -+static int coldfire_spi_probe(struct platform_device *pdev) -+{ -+ struct device *dev = &pdev->dev; -+ struct coldfire_spi_master *platform_info; -+ struct spi_master *master; -+ struct driver_data *drv_data = 0; -+ struct resource *memory_resource; -+ int irq; -+ int status = 0; -+ int i; -+#if defined(SPI_DSPI_EDMA) -+ dma_addr_t dma_handle; -+#endif -+ -+ platform_info = (struct coldfire_spi_master *)dev->platform_data; -+ -+ master = spi_alloc_master(dev, sizeof(struct driver_data)); -+ if (!master) -+ return -ENOMEM; -+ -+ drv_data = spi_master_get_devdata(master); -+ drv_data->master = master; -+ -+ INIT_LIST_HEAD(&drv_data->queue); -+ spin_lock_init(&drv_data->lock); -+ -+ master->bus_num = platform_info->bus_num; -+ master->num_chipselect = platform_info->num_chipselect; -+ master->cleanup = cleanup; -+ master->setup = setup; -+ master->transfer = transfer; -+ -+ drv_data->cs_control = platform_info->cs_control; -+ if (drv_data->cs_control) -+ for (i = 0; i < master->num_chipselect; i++) -+ drv_data->cs_control(i, QSPI_CS_INIT | QSPI_CS_DROP); -+ -+ /* Setup register addresses */ -+ memory_resource = platform_get_resource_byname(pdev, -+ IORESOURCE_MEM, "spi-module"); -+ if (!memory_resource) { -+ dev_dbg(dev, "can not find platform module memory\n"); -+ goto out_error_master_alloc; -+ } -+ -+#if defined(SPI_DSPI_EDMA) -+ drv_data->edma_tx_buf = dma_alloc_coherent(NULL, EDMA_BUFSIZE_KMALLOC, \ -+ &dma_handle, GFP_DMA); -+ if (!drv_data->edma_tx_buf) { -+ dev_dbg(dev, "cannot allocate eDMA TX memory\n"); -+ goto out_error_master_alloc; -+ } -+ drv_data->edma_rx_buf = dma_alloc_coherent(NULL, EDMA_BUFSIZE_KMALLOC, \ -+ &dma_handle, GFP_DMA); -+ if (!drv_data->edma_rx_buf) { -+ dma_free_coherent(NULL, EDMA_BUFSIZE_KMALLOC, \ -+ drv_data->edma_tx_buf, dma_handle); -+ kfree(drv_data->edma_tx_buf); -+ dev_dbg(dev, "cannot allocate eDMA RX memory\n"); -+ goto out_error_master_alloc; -+ } -+#endif -+ -+ drv_data->mcr = (void *)&MCF_DSPI_DMCR; -+ drv_data->ctar = (void *)&MCF_DSPI_DCTAR0; -+ drv_data->dspi_sr = (void *)&MCF_DSPI_DSR; -+ drv_data->dspi_rser = (void *)&MCF_DSPI_DRSER; -+ drv_data->dspi_dtfr = (void *)&MCF_DSPI_DTFR; -+ drv_data->dspi_drfr = (void *)&MCF_DSPI_DRFR; -+ -+ memory_resource = platform_get_resource_byname(pdev, IORESOURCE_MEM, -+ "spi-par"); -+ if (!memory_resource) { -+ dev_dbg(dev, "No spi-par memory\n"); -+ goto out_error_master_alloc; -+ } -+ drv_data->par = (void *)memory_resource->start; -+ -+ memory_resource = platform_get_resource_byname(pdev, IORESOURCE_MEM, -+ "spi-int-level"); -+ if (!memory_resource) { -+ dev_dbg(dev, "No spi-int-level memory\n"); -+ goto out_error_master_alloc; -+ } -+ drv_data->int_icr = (void *)memory_resource->start; -+ -+ memory_resource = platform_get_resource_byname(pdev, IORESOURCE_MEM, -+ "spi-int-mask"); -+ if (!memory_resource) { -+ dev_dbg(dev, "No spi-int-mask memory\n"); -+ goto out_error_master_alloc; -+ } -+ drv_data->int_mr = (void *)memory_resource->start; -+ -+ if (platform_info->irq_list) { -+ /* multiple IRQs */ -+ int *irqlist = platform_info->irq_list; -+ while ((irq = *irqlist++)) { -+ int off = *irqlist++; -+ int lvl = *irqlist++; -+ int msk = *irqlist++; -+ status = request_irq(irq, dspi_interrupt, IRQF_DISABLED, -+ dev->bus_id, drv_data); -+ if (status < 0) { -+ dev_err(&pdev->dev, -+ "Unable to attach ColdFire DSPI interrupt\n"); -+ goto out_error_master_alloc; -+ } -+ -+ if (lvl) -+ *(drv_data->int_icr + off) = lvl; -+ -+ if (msk) -+ *drv_data->int_mr &= ~msk; -+ } -+ } -+ else { -+ irq = platform_info->irq_vector; -+ -+ status = request_irq(platform_info->irq_vector, dspi_interrupt, -+ IRQF_DISABLED, dev->bus_id, drv_data); -+ if (status < 0) { -+ dev_err(&pdev->dev, "Unable to attach ColdFire DSPI interrupt\n"); -+ goto out_error_master_alloc; -+ } -+ -+ *drv_data->int_icr = platform_info->irq_lp; -+ *drv_data->int_mr &= ~platform_info->irq_mask; -+ } -+ -+ /* Now that we have all the addresses etc. Let's set it up */ -+ if (platform_info->par_val) -+ *drv_data->par = platform_info->par_val; -+ -+ /* Initial and start queue */ -+ status = init_queue(drv_data); -+ if (status != 0) { -+ dev_err(&pdev->dev, "Problem initializing DSPI queue\n"); -+ goto out_error_irq_alloc; -+ } -+ status = start_queue(drv_data); -+ if (status != 0) { -+ dev_err(&pdev->dev, "Problem starting DSPI queue\n"); -+ goto out_error_irq_alloc; -+ } -+ -+ /* Register with the SPI framework */ -+ platform_set_drvdata(pdev, drv_data); -+ status = spi_register_master(master); -+ if (status != 0) { -+ dev_err(&pdev->dev, "Problem registering DSPI master\n"); -+ status = -EINVAL; -+ goto out_error_queue_alloc; -+ } -+ -+#if defined(SPI_DSPI_EDMA) -+ if (mcf_edma_request_channel(DSPI_DMA_TX_TCD, -+ edma_tx_handler, -+ NULL, -+ 0x0, -+ pdev, -+ NULL, /* spinlock */ -+ DRIVER_NAME) < 0){ -+ dev_err(&pdev->dev, "eDMA transmit channel request\n"); -+ status = -EINVAL; -+ goto out_error_queue_alloc; -+ } -+ -+ if (mcf_edma_request_channel(DSPI_DMA_RX_TCD, -+ edma_rx_handler, -+ NULL, -+ 0x0, -+ pdev, -+ NULL, /* spinlock */ -+ DRIVER_NAME) < 0){ -+ dev_err(&pdev->dev, "eDAM receive channel request\n"); -+ status = -EINVAL; -+ mcf_edma_free_channel(DSPI_DMA_TX_TCD, pdev); -+ goto out_error_queue_alloc; -+ } -+#endif -+ -+ printk(KERN_INFO "DSPI: Coldfire master initialized\n"); -+ return status; -+ -+out_error_queue_alloc: -+ destroy_queue(drv_data); -+ -+out_error_irq_alloc: -+ free_irq(platform_info->irq_vector, drv_data); -+ -+out_error_master_alloc: -+ spi_master_put(master); -+ return status; -+ -+} -+ -+static int coldfire_spi_remove(struct platform_device *pdev) -+{ -+ struct driver_data *drv_data = platform_get_drvdata(pdev); -+ int irq; -+ int status = 0; -+ -+ if (!drv_data) -+ return 0; -+ -+#if defined(SPI_DSPI_EDMA) -+ mcf_edma_free_channel(DSPI_DMA_TX_TCD, pdev); -+ mcf_edma_free_channel(DSPI_DMA_RX_TCD, pdev); -+#endif -+ -+ /* Remove the queue */ -+ status = destroy_queue(drv_data); -+ if (status != 0) -+ return status; -+ -+ /* Release IRQ */ -+ irq = platform_get_irq(pdev, 0); -+ if (irq >= 0) -+ free_irq(irq, drv_data); -+ -+ /* Disconnect from the SPI framework */ -+ spi_unregister_master(drv_data->master); -+ -+ /* Prevent double remove */ -+ platform_set_drvdata(pdev, NULL); -+ -+ return 0; -+} -+ -+static void coldfire_spi_shutdown(struct platform_device *pdev) -+{ -+ int status = coldfire_spi_remove(pdev); -+ -+ if (status != 0) -+ dev_err(&pdev->dev, "shutdown failed with %d\n", status); -+} -+ -+ -+#ifdef CONFIG_PM -+static int suspend_devices(struct device *dev, void *pm_message) -+{ -+ pm_message_t *state = pm_message; -+ -+ if (dev->power.power_state.event != state->event) { -+ dev_warn(dev, "pm state does not match request\n"); -+ return -1; -+ } -+ -+ return 0; -+} -+ -+static int coldfire_spi_suspend(struct platform_device *pdev, -+ pm_message_t state) -+{ -+ struct driver_data *drv_data = platform_get_drvdata(pdev); -+ int status = 0; -+ -+ /* Check all childern for current power state */ -+ if (device_for_each_child(&pdev->dev, -+ &state, suspend_devices) != 0) { -+ dev_warn(&pdev->dev, "suspend aborted\n"); -+ return -1; -+ } -+ -+ status = stop_queue(drv_data); -+ if (status != 0) -+ return status; -+ -+ return 0; -+} -+ -+static int coldfire_spi_resume(struct platform_device *pdev) -+{ -+ struct driver_data *drv_data = platform_get_drvdata(pdev); -+ int status = 0; -+ -+ /* Start the queue running */ -+ status = start_queue(drv_data); -+ if (status != 0) { -+ dev_err(&pdev->dev, "problem starting queue (%d)\n", status); -+ return status; -+ } -+ -+ return 0; -+} -+#else -+#define coldfire_spi_suspend NULL -+#define coldfire_spi_resume NULL -+#endif /* CONFIG_PM */ -+ -+static struct platform_driver driver = { -+ .driver = { -+ .name = "spi_coldfire", -+ .bus = &platform_bus_type, -+ .owner = THIS_MODULE, -+ }, -+ .probe = coldfire_spi_probe, -+ .remove = __devexit_p(coldfire_spi_remove), -+ .shutdown = coldfire_spi_shutdown, -+ .suspend = coldfire_spi_suspend, -+ .resume = coldfire_spi_resume, -+}; -+ -+static int __init coldfire_spi_init(void) -+{ -+ platform_driver_register(&driver); -+ -+ return 0; -+} -+module_init(coldfire_spi_init); -+ -+static void __exit coldfire_spi_exit(void) -+{ -+ platform_driver_unregister(&driver); -+} -+module_exit(coldfire_spi_exit); -+ -+MODULE_AUTHOR("Matt Waddel"); -+MODULE_DESCRIPTION("ColdFire DSPI Contoller"); -+MODULE_LICENSE("GPL"); ---- a/drivers/spi/Kconfig -+++ b/drivers/spi/Kconfig -@@ -35,6 +35,15 @@ config SPI_DEBUG - Say "yes" to enable debug messaging (like dev_dbg and pr_debug), - sysfs, and debugfs support in SPI controller and protocol drivers. - -+config COLDFIRE_EDMA -+ tristate "Coldfire eDMA" -+ depends on COLDFIRE && EXPERIMENTAL -+ help -+ Support for Coldfire eDMA controller. Required for example -+ by SSI audio device driver. -+ -+ -+ - # - # MASTER side ... talking to discrete SPI slave chips including microcontrollers - # -@@ -113,6 +122,27 @@ config SPI_GPIO - - If unsure, say N. - -+config SPI_COLDFIRE -+ tristate "Coldfire QSPI/DSPI SPI Master" -+ depends on SPI_MASTER && COLDFIRE && EXPERIMENTAL -+ help -+ SPI driver for Freescale Coldfire QSPI module in master mode. -+ Tested with the 5282 processor, but should also work with other -+ Coldfire variants. -+ -+config SPI_DSPI -+ tristate "Coldfire DSPI" -+ depends on SPI_MASTER && COLDFIRE -+ help -+ SPI driver for Coldfire DSPI driver only. -+ -+config SPI_COLDFIRE_DSPI_EDMA -+ boolean "Coldfire DSPI master driver uses eDMA" -+ depends on SPI_MASTER && COLDFIRE && SPI_COLDFIRE && EXPERIMENTAL && COLDFIRE_EDMA -+ default n -+ help -+ Say "yes" if you want DSPI master driver to use eDMA for transfers. -+ - config SPI_IMX - tristate "Freescale iMX SPI controller" - depends on SPI_MASTER && ARCH_IMX && EXPERIMENTAL -@@ -255,6 +285,18 @@ config SPI_TLE62X0 - # - # Add new SPI protocol masters in alphabetical order above this line - # -+config SPI_COLDFIRE_SSI_AUDIO -+ tristate "Coldfire SSI AUDIO" -+ depends on SPI_MASTER && SPI_COLDFIRE && EXPERIMENTAL -+ help -+ SSI audio device driver -+ -+config SSIAUDIO_USE_EDMA -+ boolean "Coldfire DSPI master driver uses eDMA" -+ default y -+ depends on EXPERIMENTAL && COLDFIRE_EDMA && SPI_COLDFIRE_SSI_AUDIO -+ help -+ Say "yes" if you want SSI audio driver to use eDMA for SSI transfers. - - # (slave support would go here) - ---- a/drivers/spi/Makefile -+++ b/drivers/spi/Makefile -@@ -6,6 +6,8 @@ ifeq ($(CONFIG_SPI_DEBUG),y) - EXTRA_CFLAGS += -DDEBUG - endif - -+obj-$(CONFIG_COLDFIRE_EDMA) += coldfire_edma.o -+ - # small core, mostly translating board-specific - # config declarations into driver model code - obj-$(CONFIG_SPI_MASTER) += spi.o -@@ -16,6 +18,8 @@ obj-$(CONFIG_SPI_BFIN) += spi_bfin5xx. - obj-$(CONFIG_SPI_BITBANG) += spi_bitbang.o - obj-$(CONFIG_SPI_AU1550) += au1550_spi.o - obj-$(CONFIG_SPI_BUTTERFLY) += spi_butterfly.o -+# obj-$(CONFIG_SPI_COLDFIRE) += spi_coldfire.o spi-m5445x.o -+obj-$(CONFIG_SPI_DSPI) += dspi_mcf.o - obj-$(CONFIG_SPI_GPIO) += spi_gpio.o - obj-$(CONFIG_SPI_IMX) += spi_imx.o - obj-$(CONFIG_SPI_LM70_LLP) += spi_lm70llp.o -@@ -35,6 +39,7 @@ obj-$(CONFIG_SPI_SH_SCI) += spi_sh_sci. - obj-$(CONFIG_SPI_AT25) += at25.o - obj-$(CONFIG_SPI_SPIDEV) += spidev.o - obj-$(CONFIG_SPI_TLE62X0) += tle62x0.o -+obj-$(CONFIG_SPI_COLDFIRE_SSI_AUDIO) += ssi_audio.o - # ... add above this line ... - - # SPI slave controller drivers (upstream link) ---- /dev/null -+++ b/drivers/spi/spi_coldfire.c -@@ -0,0 +1,1542 @@ -+/* -+ * spi_coldfire.c - Master QSPI/DSPI controller for the ColdFire processors -+ * -+ * -+ * (C) Copyright 2005, Intec Automation, -+ * Mike Lavender (mike@steroidmicros) -+ * -+ * (C) Copyright 2007-2008, Freescale Inc, -+ * Yaroslav Vinogradov -+ * Andrey Butok -+ * Kurt Mahan -+ * -+ * This program is free software; you can redistribute it and/or modify it -+ * under the terms of the GNU General Public License as published by the -+ * Free Software Foundation; either version 2 of the License, or (at your -+ * option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -+ * -+ *************************************************************************** -+ * Changes: -+ * v0.003 12 February 2008 Andrey Butok, Freescale Semiconductor -+ * Added suport of MCF5227x DSPI module. -+ * v0.002 2007 Yaroslav Vinogradov, Freescale Semiconductor -+ * Added suport of MCF5445x DSPI module. -+ * v0.001 2005 Mike Lavender, Intec Automation, -+ * Intial version. Coldfire QSPI master driver. -+ * -+ */ -+ -+ -+/****************************************************************************/ -+ -+/* -+ * Includes -+ */ -+ -+#include <linux/autoconf.h> -+#include <linux/init.h> -+#include <linux/module.h> -+#include <linux/device.h> -+#include <linux/interrupt.h> -+#include <linux/platform_device.h> -+#include <linux/spi/spi.h> -+#include <linux/workqueue.h> -+#include <linux/delay.h> -+ -+#include <asm/delay.h> -+#include <asm/mcfsim.h> -+#include <asm/mcfqspi.h> -+#include <asm/coldfire.h> -+ -+#if defined(CONFIG_M5445X) -+ #include <asm/virtconvert.h> -+ -+ #define SPI_DSPI -+ #if defined(CONFIG_SPI_COLDFIRE_DSPI_EDMA) -+ #define SPI_DSPI_EDMA -+ #ifdef CONFIG_MMU -+ #define SPI_USE_MMU -+ #endif -+ #include <asm/mcf5445x_edma.h> -+ #endif -+ -+ #include <asm/mcf5445x_dspi.h> -+#endif -+ -+#if defined(CONFIG_M547X_8X) -+ #define SPI_DSPI -+ -+ #include <asm/virtconvert.h> -+ #include <asm/m5485dspi.h> -+#endif -+ -+#ifdef CONFIG_M5227x -+ #define SPI_DSPI -+ -+ #if defined(CONFIG_SPI_COLDFIRE_DSPI_EDMA) -+ #define SPI_DSPI_EDMA -+ #endif -+#endif -+ -+ -+#if defined(SPI_DSPI_EDMA) -+ -+/* edma buffer size in transfer units (32bits) */ -+#define EDMA_BUFFER_SIZE (PAGE_SIZE/4) -+#define EDMA_BUFSIZE_KMALLOC (EDMA_BUFFER_SIZE*4) -+ -+#define DSPI_DMA_RX_TCD MCF_EDMA_CHAN_DSPI_RX -+#define DSPI_DMA_TX_TCD MCF_EDMA_CHAN_DSPI_TX -+ -+#include <asm/mcf_edma.h> -+#endif -+ -+MODULE_AUTHOR("Mike Lavender"); -+MODULE_DESCRIPTION("ColdFire SPI Contoller"); -+MODULE_LICENSE("GPL"); -+ -+#define DRIVER_NAME "Coldfire QSPI/DSPI" -+ -+/****************************************************************************/ -+ -+/* -+ * Local constants and macros -+ */ -+ -+#define QSPI_RAM_SIZE 0x10 /* 16 word table */ -+#define QSPI_TRANSMIT_RAM 0x00 -+#define QSPI_RECEIVE_RAM 0x10 -+#define QSPI_COMMAND_RAM 0x20 -+ -+#define QSPI_COMMAND 0x7000 /* 15: X = Continuous CS -+ * 14: 1 = Get BITSE from QMR[BITS] -+ * 13: 1 = Get DT from QDLYR[DTL] -+ * 12: 1 = Get DSK from QDLYR[QCD] -+ * 8-11: XXXX = next 4 bytes for CS -+ * 0-7: 0000 0000 Reserved -+ */ -+ -+#define QIR_WCEF 0x0008 /* write collison */ -+#define QIR_ABRT 0x0004 /* abort */ -+#define QIR_SPIF 0x0001 /* finished */ -+ -+#define QIR_WCEFE 0x0800 -+#define QIR_ABRTE 0x0400 -+#define QIR_SPIFE 0x0100 -+ -+#define QIR_WCEFB 0x8000 -+#define QIR_ABRTB 0x4000 -+#define QIR_ABRTL 0x1000 -+ -+#define QMR_BITS 0x3C00 -+#define QMR_BITS_8 0x2000 -+ -+#define QCR_CONT 0x8000 -+ -+#define QDLYR_SPE 0x8000 -+ -+#define QWR_ENDQP_MASK 0x0F00 -+#define QWR_CSIV 0x1000 /* 1 = active low chip selects */ -+ -+ -+#define START_STATE ((void*)0) -+#define RUNNING_STATE ((void*)1) -+#define DONE_STATE ((void*)2) -+#define ERROR_STATE ((void*)-1) -+ -+#define QUEUE_RUNNING 0 -+#define QUEUE_STOPPED 1 -+ -+/****************************************************************************/ -+ -+/* -+ * Local Data Structures -+ */ -+ -+struct transfer_state { -+ u32 index; -+ u32 len; -+ void *tx; -+ void *tx_end; -+ void *rx; -+ void *rx_end; -+ char flags; -+#define TRAN_STATE_RX_VOID 0x01 -+#define TRAN_STATE_TX_VOID 0x02 -+#define TRAN_STATE_WORD_ODD_NUM 0x04 -+ u8 cs; -+ u16 void_write_data; -+ unsigned cs_change:1; -+}; -+ -+typedef struct { -+ unsigned master:1; -+ unsigned dohie:1; -+ unsigned bits:4; -+ unsigned cpol:1; -+ unsigned cpha:1; -+ unsigned baud:8; -+} QMR; -+ -+typedef struct { -+ unsigned spe:1; -+ unsigned qcd:7; -+ unsigned dtl:8; -+} QDLYR; -+ -+typedef struct { -+ unsigned halt:1; -+ unsigned wren:1; -+ unsigned wrto:1; -+ unsigned csiv:1; -+ unsigned endqp:4; -+ unsigned cptqp:4; -+ unsigned newqp:4; -+} QWR; -+ -+ -+typedef struct { -+ unsigned master:1; -+ unsigned cont_scke:1; -+ unsigned dconf:2; -+ unsigned frz:1; -+ unsigned mtfe:1; -+ unsigned pcsse:1; -+ unsigned rooe:1; -+ unsigned pcsis:8; -+ unsigned reserved15:1; -+ unsigned mdis:1; -+ unsigned dis_tx:1; -+ unsigned dis_rxf:1; -+ unsigned clr_tx:1; -+ unsigned clr_rxf:1; -+ unsigned smpl_pt:2; -+ unsigned reserved71:7; -+ unsigned halt:1; -+} DSPI_MCR; -+ -+typedef struct { -+ unsigned dbr:1; -+ unsigned fmsz:4; -+ unsigned cpol:1; -+ unsigned cpha:1; -+ unsigned lsbfe:1; -+ unsigned pcssck:2; -+ unsigned pasc:2; -+ unsigned pdt:2; -+ unsigned pbr:2; -+ unsigned cssck:4; -+ unsigned asc:4; -+ unsigned dt:4; -+ unsigned br:4; -+} DSPI_CTAR; -+ -+struct chip_data { -+#if defined(SPI_DSPI) -+ /* dspi data */ -+ union { -+ u32 mcr_val; -+ DSPI_MCR mcr; -+ }; -+ union { -+ u32 ctar_val; -+ DSPI_CTAR ctar; -+ }; -+#else -+ union { -+ u16 qmr_val; -+ QMR qmr; -+ }; -+ union { -+ u16 qdlyr_val; -+ QDLYR qdlyr; -+ }; -+ union { -+ u16 qwr_val; -+ QWR qwr; -+ }; -+#endif -+ -+ u16 void_write_data; -+}; -+ -+ -+struct driver_data { -+ /* Driver model hookup */ -+ struct platform_device *pdev; -+ -+ /* SPI framework hookup */ -+ struct spi_master *master; -+ -+ /* Driver message queue */ -+ struct workqueue_struct *workqueue; -+ struct work_struct pump_messages; -+ spinlock_t lock; -+ struct list_head queue; -+ int busy; -+ int run; -+ -+ /* Message Transfer pump */ -+ struct tasklet_struct pump_transfers; -+ -+ /* Current message transfer state info */ -+ struct spi_message* cur_msg; -+ struct spi_transfer* cur_transfer; -+ struct chip_data *cur_chip; -+ size_t len; -+ void *tx; -+ void *tx_end; -+ void *rx; -+ void *rx_end; -+ char flags; -+#define TRAN_STATE_RX_VOID 0x01 -+#define TRAN_STATE_TX_VOID 0x02 -+#define TRAN_STATE_WORD_ODD_NUM 0x04 -+ u8 cs; -+ u16 void_write_data; -+ unsigned cs_change:1; -+ -+ u32 trans_cnt; -+ u32 wce_cnt; -+ u32 abrt_cnt; -+#if defined(SPI_DSPI) -+ u32 *mcr; /* DSPI MCR register */ -+ u32 *ctar; /* DSPI CTAR register */ -+ u32 *dspi_dtfr; /* DSPI DTFR register */ -+ u32 *dspi_drfr; /* DSPI DRFR register */ -+ u32 *dspi_rser; /* DSPI RSER register */ -+ u32 *dspi_sr; /* DSPI status register */ -+ u8 dspi_ctas; /* DSPI CTAS value*/ -+#if defined(SPI_DSPI_EDMA) -+ void* edma_tx_buf; -+ void* edma_rx_buf; -+#endif -+#else -+ u16 *qmr; /* QSPI mode register */ -+ u16 *qdlyr; /* QSPI delay register */ -+ u16 *qwr; /* QSPI wrap register */ -+ u16 *qir; /* QSPI interrupt register */ -+ u16 *qar; /* QSPI address register */ -+ u16 *qdr; /* QSPI data register */ -+ u16 *qcr; /* QSPI command register */ -+#endif -+#if defined(CONFIG_M532x) || defined(CONFIG_M537x) -+ u16 *par; /* Pin assignment register */ -+#else -+ u8 *par; /* Pin assignment register */ -+#endif -+ u8 *int_icr; /* Interrupt level and priority register */ -+ u32 *int_mr; /* Interrupt mask register */ -+ void (*cs_control)(u8 cs, u8 command); -+}; -+ -+#define DSPI_CS(cs) ((1<<(cs))<<16) -+ -+ -+/****************************************************************************/ -+ -+/* -+ * SPI local functions -+ */ -+ -+static void *next_transfer(struct driver_data *drv_data) -+{ -+ struct spi_message *msg = drv_data->cur_msg; -+ struct spi_transfer *trans = drv_data->cur_transfer; -+ -+ /* Move to next transfer */ -+ if (trans->transfer_list.next != &msg->transfers) { -+ drv_data->cur_transfer = -+ list_entry(trans->transfer_list.next, -+ struct spi_transfer, -+ transfer_list); -+ return RUNNING_STATE; -+ } else -+ return DONE_STATE; -+} -+ -+ -+#define DSPI_BITS MCF_DSPI_DCTAR_FMSZ(15) -+#define DSPI_BITS_16 MCF_DSPI_DCTAR_FMSZ(15) -+#define DSPI_BITS_8 MCF_DSPI_DCTAR_FMSZ(7) -+#define DSPI_FIFO_SIZE 16 -+ -+static inline int is_word_transfer(struct driver_data *drv_data) -+{ -+#if defined(SPI_DSPI) -+ return ((*drv_data->ctar & DSPI_BITS_16) == DSPI_BITS_8) ? 0 : 1; -+#else -+ return ((*drv_data->qmr & QMR_BITS) == QMR_BITS_8) ? 0 : 1; -+#endif -+} -+ -+static void inline set_8bit_transfer_mode(struct driver_data *drv_data) -+{ -+#if defined(SPI_DSPI) -+ *drv_data->ctar |= (*drv_data->ctar & ~DSPI_BITS) | DSPI_BITS_8; -+#else -+ *drv_data->qmr |= (*drv_data->qmr & ~QMR_BITS) | QMR_BITS_8; -+#endif -+} -+ -+static void inline set_16bit_transfer_mode(struct driver_data *drv_data) -+{ -+#if defined(SPI_DSPI) -+ *drv_data->ctar |= (*drv_data->ctar & ~DSPI_BITS) | DSPI_BITS_16; -+#else -+ *drv_data->qmr |= (*drv_data->qmr & ~QMR_BITS); -+#endif -+} -+ -+static int write(struct driver_data *drv_data) -+{ -+ int tx_count = 0; -+#ifndef SPI_DSPI -+ int cmd_count = 0; -+#endif -+ int tx_word; -+ -+#if defined(SPI_DSPI) -+#if defined(SPI_DSPI_EDMA) -+ u32* edma_wr; -+#endif -+ u16 d16; -+ u8 d8; -+ u32 dspi_pushr; -+ int first = 1; -+#endif -+ -+ tx_word = is_word_transfer(drv_data); -+ -+ /* If we are in word mode, but only have a single byte to transfer -+ * then switch to byte mode temporarily. Will switch back at the -+ * end of the transfer. */ -+ if (tx_word && ((drv_data->tx_end - drv_data->tx) == 1)) { -+ drv_data->flags |= TRAN_STATE_WORD_ODD_NUM; -+ set_8bit_transfer_mode(drv_data); -+ tx_word = 0; -+ } -+ -+ -+#if defined(SPI_DSPI) -+#if defined(SPI_DSPI_EDMA) -+ edma_wr = (u32*)(drv_data->edma_tx_buf); -+#endif -+ -+#if defined(SPI_DSPI_EDMA) -+ while ((drv_data->tx < drv_data->tx_end) && (tx_count < EDMA_BUFFER_SIZE)) { -+#else -+ while ((drv_data->tx < drv_data->tx_end) && (tx_count < DSPI_FIFO_SIZE)) { -+#endif -+ if (tx_word) { -+ if ((drv_data->tx_end - drv_data->tx) == 1) -+ break; -+ if (!(drv_data->flags & TRAN_STATE_TX_VOID)) { -+ d16 = *(u16 *)drv_data->tx; -+ } else { -+ d16 = drv_data->void_write_data; -+ } -+ -+ dspi_pushr = MCF_DSPI_DTFR_TXDATA(d16) -+ | DSPI_CS(drv_data->cs) -+ | MCF_DSPI_DTFR_CTAS(drv_data->dspi_ctas); -+ drv_data->tx += 2; -+ -+#if defined(SPI_DSPI_EDMA) -+ if (drv_data->tx == drv_data->tx_end || tx_count==EDMA_BUFFER_SIZE-1) { -+#else -+ if (drv_data->tx == drv_data->tx_end || tx_count==DSPI_FIFO_SIZE-1) { -+#endif -+ /* last transfer in the queue */ -+ dspi_pushr |= MCF_DSPI_DTFR_EOQ; -+ if (drv_data->cs_change) { -+ dspi_pushr &= ~MCF_DSPI_DTFR_CONT; -+ } -+ } -+ -+ if (first) { -+ first = 0; -+ dspi_pushr |= MCF_DSPI_DTFR_CTCNT; /* clear counter */ -+ } -+#if defined(SPI_DSPI_EDMA) -+ *edma_wr = dspi_pushr; -+ edma_wr++; -+#else -+ *drv_data->dspi_dtfr = dspi_pushr; -+#endif -+ -+ -+ } else { -+ if (!(drv_data->flags & TRAN_STATE_TX_VOID)) { -+ d8 = *(u8 *)drv_data->tx; -+ } else { -+ d8 = *(u8 *)&drv_data->void_write_data; -+ } -+ -+ dspi_pushr = MCF_DSPI_DTFR_TXDATA(d8) -+ | DSPI_CS(drv_data->cs) -+ | MCF_DSPI_DTFR_CTAS(drv_data->dspi_ctas) -+ | MCF_DSPI_DTFR_CONT; -+ -+ drv_data->tx++; -+ -+ if (drv_data->tx == drv_data->tx_end || tx_count==DSPI_FIFO_SIZE-1) { -+ /* last transfer in the queue */ -+ dspi_pushr |= MCF_DSPI_DTFR_EOQ; -+ if (drv_data->cs_change) { -+ dspi_pushr &= ~MCF_DSPI_DTFR_CONT; -+ } -+ } -+ -+ if (first) { -+ first = 0; -+ dspi_pushr |= MCF_DSPI_DTFR_CTCNT; /* clear counter */ -+ } -+ -+#if defined(SPI_DSPI_EDMA) -+ *edma_wr = dspi_pushr; -+ edma_wr++; -+#else -+ *drv_data->dspi_dtfr = dspi_pushr; -+#endif -+ -+ } -+ tx_count++; -+ } -+ -+#if defined(SPI_DSPI_EDMA) -+ -+ if (tx_count>0) { -+ -+ /* TBD: initiate eDMA transfer */ -+ mcf_edma_set_tcd_params(DSPI_DMA_TX_TCD, -+#ifdef SPI_USE_MMU -+ virt_to_phys(drv_data->edma_tx_buf), -+#else -+ drv_data->edma_tx_buf, -+#endif -+ (u32)drv_data->dspi_dtfr, -+ MCF_EDMA_TCD_ATTR_SSIZE_32BIT | MCF_EDMA_TCD_ATTR_DSIZE_32BIT, -+ 4, /* soff */ -+ 4, /* nbytes */ -+ 0, /* slast */ -+ tx_count, /* citer */ -+ tx_count, /* biter */ -+ 0, /* doff */ -+ 0, /* dlastsga */ -+ 0, /* major_int */ -+ 1 /* disable_req */ -+ ); -+ -+ mcf_edma_set_tcd_params(DSPI_DMA_RX_TCD, -+ (u32)drv_data->dspi_drfr, -+#ifdef SPI_USE_MMU -+ virt_to_phys(drv_data->edma_rx_buf), -+#else -+ drv_data->edma_rx_buf, -+#endif -+ MCF_EDMA_TCD_ATTR_SSIZE_32BIT | MCF_EDMA_TCD_ATTR_DSIZE_32BIT, -+ 0, /* soff */ -+ 4, /* nbytes */ -+ 0, /* slast */ -+ tx_count, /* citer */ -+ tx_count, /* biter */ -+ 4, /* doff */ -+ 0, /* dlastsga */ -+ 0, /* major_int */ -+ 1 /* disable_req */ -+ ); -+ -+ -+ start_edma_transfer(DSPI_DMA_TX_TCD); /* transmit SPI data */ -+ start_edma_transfer(DSPI_DMA_RX_TCD); /* receive SPI data */ -+ } -+#endif -+ -+#else -+ -+ *drv_data->qar = QSPI_TRANSMIT_RAM; -+ while ((drv_data->tx < drv_data->tx_end) && (tx_count < QSPI_RAM_SIZE)) { -+ if (tx_word) { -+ if ((drv_data->tx_end - drv_data->tx) == 1) -+ break; -+ -+ if (!(drv_data->flags & TRAN_STATE_TX_VOID)) -+ *drv_data->qdr = *(u16 *)drv_data->tx; -+ else -+ *drv_data->qdr = drv_data->void_write_data; -+ drv_data->tx += 2; -+ } else { -+ if (!(drv_data->flags & TRAN_STATE_TX_VOID)) -+ *drv_data->qdr = *(u8 *)drv_data->tx; -+ else -+ *drv_data->qdr = *(u8 *)&drv_data->void_write_data; -+ drv_data->tx++; -+ } -+ tx_count++; -+ } -+ -+ -+ *drv_data->qar = QSPI_COMMAND_RAM; -+ while (cmd_count < tx_count) { -+ u16 qcr = QSPI_COMMAND -+ | QCR_CONT -+ | (~((0x01 << drv_data->cs) << 8) & 0x0F00); -+ -+ if ( (cmd_count == tx_count - 1) -+ && (drv_data->tx == drv_data->tx_end) -+ && (drv_data->cs_change) ) { -+ qcr &= ~QCR_CONT; -+ } -+ *drv_data->qcr = qcr; -+ cmd_count++; -+ } -+ -+ *drv_data->qwr = (*drv_data->qwr & ~QWR_ENDQP_MASK) | ((cmd_count - 1) << 8); -+ -+ /* Fire it up! */ -+ *drv_data->qdlyr |= QDLYR_SPE; -+#endif -+ -+ return tx_count; -+} -+ -+ -+static int read(struct driver_data *drv_data) -+{ -+ int rx_count = 0; -+ int rx_word; -+#if defined(SPI_DSPI_EDMA) -+ u32* rx_edma; -+#endif -+ u16 d; -+ rx_word = is_word_transfer(drv_data); -+ -+#if defined(SPI_DSPI) -+#if defined(SPI_DSPI_EDMA) -+ rx_edma = (u32*) drv_data->edma_tx_buf; -+ while ((drv_data->rx < drv_data->rx_end) && (rx_count < EDMA_BUFFER_SIZE)) { -+#else -+ while ((drv_data->rx < drv_data->rx_end) && (rx_count < DSPI_FIFO_SIZE)) { -+#endif -+ if (rx_word) { -+ if ((drv_data->rx_end - drv_data->rx) == 1) -+ break; -+#if defined(SPI_DSPI_EDMA) -+ d = MCF_DSPI_DRFR_RXDATA(*rx_edma); -+ rx_edma++; -+#else -+ d = MCF_DSPI_DRFR_RXDATA(*drv_data->dspi_drfr); -+#endif -+ -+ if (!(drv_data->flags & TRAN_STATE_RX_VOID)) -+ *(u16 *)drv_data->rx = d; -+ drv_data->rx += 2; -+ } else { -+#if defined(SPI_DSPI_EDMA) -+ d = MCF_DSPI_DRFR_RXDATA(*rx_edma); -+ rx_edma++; -+#else -+ d = MCF_DSPI_DRFR_RXDATA(*drv_data->dspi_drfr); -+#endif -+ if (!(drv_data->flags & TRAN_STATE_RX_VOID)) -+ *(u8 *)drv_data->rx = d; -+ drv_data->rx++; -+ } -+ rx_count++; -+ } -+#else -+ *drv_data->qar = QSPI_RECEIVE_RAM; -+ while ((drv_data->rx < drv_data->rx_end) && (rx_count < QSPI_RAM_SIZE)) { -+ if (rx_word) { -+ if ((drv_data->rx_end - drv_data->rx) == 1) -+ break; -+ -+ if (!(drv_data->flags & TRAN_STATE_RX_VOID)) -+ *(u16 *)drv_data->rx = *drv_data->qdr; -+ drv_data->rx += 2; -+ } else { -+ if (!(drv_data->flags & TRAN_STATE_RX_VOID)) -+ *(u8 *)drv_data->rx = *drv_data->qdr; -+ drv_data->rx++; -+ } -+ rx_count++; -+ } -+#endif -+ -+ return rx_count; -+} -+ -+ -+static inline void qspi_setup_chip(struct driver_data *drv_data) -+{ -+ struct chip_data *chip = drv_data->cur_chip; -+ -+#if defined(SPI_DSPI) -+ -+ *drv_data->mcr = chip->mcr_val; -+ -+ /* TBD: remove later */ -+/* JKM -- validate */ -+ chip->ctar_val = 0x78560118; -+ -+ *drv_data->ctar = chip->ctar_val; -+ *drv_data->dspi_rser = 0 -+ | MCF_DSPI_DRSER_EOQFE -+#if defined(SPI_DSPI_EDMA) -+ | MCF_DSPI_DRSER_TFFFE -+ | MCF_DSPI_DRSER_TFFFS -+#endif -+ ; -+#else -+ *drv_data->qmr = chip->qmr_val; -+ *drv_data->qdlyr = chip->qdlyr_val; -+ *drv_data->qwr = chip->qwr_val; -+ -+ /* -+ * Enable all the interrupts and clear all the flags -+ */ -+ *drv_data->qir = (QIR_SPIFE | QIR_ABRTE | QIR_WCEFE) -+ | (QIR_WCEFB | QIR_ABRTB | QIR_ABRTL) -+ | (QIR_SPIF | QIR_ABRT | QIR_WCEF); -+#endif -+} -+ -+#if defined(SPI_DSPI_EDMA) -+static int edma_tx_handler(int channel, void* dev) -+{ -+ if (channel == DSPI_DMA_TX_TCD) { -+ stop_edma_transfer(DSPI_DMA_TX_TCD); -+ } -+ return IRQ_HANDLED; -+} -+ -+static int edma_rx_handler(int channel, void* dev) -+{ -+ if (channel == DSPI_DMA_RX_TCD) { -+ stop_edma_transfer(DSPI_DMA_RX_TCD); -+ } -+ -+ return IRQ_HANDLED; -+} -+#endif -+ -+static irqreturn_t qspi_interrupt(int irq, void *dev_id) -+{ -+ struct driver_data *drv_data = (struct driver_data *)dev_id; -+ struct spi_message *msg = drv_data->cur_msg; -+#if defined(SPI_DSPI) -+#if !defined(SPI_DSPI_EDMA) -+ u32 irq_status = *drv_data->dspi_sr; -+#endif -+#else -+ u16 irq_status = *drv_data->qir; -+#endif -+ -+ /* Clear all flags immediately */ -+#if defined(SPI_DSPI) -+ *drv_data->dspi_sr = MCF_DSPI_DSR_EOQF; -+#else -+ *drv_data->qir |= (QIR_SPIF | QIR_ABRT | QIR_WCEF); -+#endif -+ -+ if (!drv_data->cur_msg || !drv_data->cur_msg->state) { -+#if !defined(SPI_DSPI_EDMA) -+ /* if eDMA is used it happens some time (at least once)*/ -+ printk(KERN_ERR "coldfire-qspi: bad message or transfer " -+ "state in interrupt handler. IRQ status=%x\n", irq_status); -+#endif -+ return IRQ_NONE; -+ } -+ -+#if !defined(SPI_DSPI) -+ if (irq_status & QIR_SPIF) { -+#endif -+ /* -+ * Read the data into the buffer and reload and start -+ * queue with new data if not finished. If finished -+ * then setup the next transfer -+ */ -+ read(drv_data); -+ -+ if (drv_data->rx == drv_data->rx_end) { -+ /* -+ * Finished now - fall through and schedule next -+ * transfer tasklet -+ */ -+ if (drv_data->flags & TRAN_STATE_WORD_ODD_NUM) { -+ set_16bit_transfer_mode(drv_data); -+ } -+ -+ msg->state = next_transfer(drv_data); -+ msg->actual_length += drv_data->len; -+ } else { -+ /* not finished yet - keep going */ -+ write(drv_data); -+ return IRQ_HANDLED; -+ } -+#if !defined(SPI_DSPI) -+ } else { -+ if (irq_status & QIR_WCEF) -+ drv_data->wce_cnt++; -+ -+ if (irq_status & QIR_ABRT) -+ drv_data->abrt_cnt++; -+ -+ msg->state = ERROR_STATE; -+ } -+#endif -+ -+ tasklet_schedule(&drv_data->pump_transfers); -+ -+ return IRQ_HANDLED; -+} -+ -+/* caller already set message->status; dma and pio irqs are blocked */ -+static void giveback(struct driver_data *drv_data) -+{ -+ struct spi_transfer* last_transfer; -+ unsigned long flags; -+ struct spi_message *msg; -+ -+ spin_lock_irqsave(&drv_data->lock, flags); -+ msg = drv_data->cur_msg; -+ drv_data->cur_msg = NULL; -+ drv_data->cur_transfer = NULL; -+ drv_data->cur_chip = NULL; -+ queue_work(drv_data->workqueue, &drv_data->pump_messages); -+ spin_unlock_irqrestore(&drv_data->lock, flags); -+ -+ last_transfer = list_entry(msg->transfers.prev, -+ struct spi_transfer, -+ transfer_list); -+ -+ if (!last_transfer->cs_change) -+ drv_data->cs_control(drv_data->cs, QSPI_CS_DROP); -+ -+ msg->state = NULL; -+ if (msg->complete) -+ msg->complete(msg->context); -+} -+ -+ -+static void pump_transfers(unsigned long data) -+{ -+ struct driver_data *drv_data = (struct driver_data *)data; -+ struct spi_message *message = NULL; -+ struct spi_transfer *transfer = NULL; -+ struct spi_transfer *previous = NULL; -+ struct chip_data *chip = NULL; -+ unsigned long flags; -+ -+ /* Get current state information */ -+ message = drv_data->cur_msg; -+ transfer = drv_data->cur_transfer; -+ chip = drv_data->cur_chip; -+ -+ /* Handle for abort */ -+ if (message->state == ERROR_STATE) { -+ message->status = -EIO; -+ giveback(drv_data); -+ return; -+ } -+ -+ /* Handle end of message */ -+ if (message->state == DONE_STATE) { -+ message->status = 0; -+ giveback(drv_data); -+ return; -+ } -+ -+ if (message->state == START_STATE) { -+ qspi_setup_chip(drv_data); -+ -+ if (drv_data->cs_control) -+ drv_data->cs_control(message->spi->chip_select, QSPI_CS_ASSERT); -+ } -+ -+ /* Delay if requested at end of transfer*/ -+ if (message->state == RUNNING_STATE) { -+ previous = list_entry(transfer->transfer_list.prev, -+ struct spi_transfer, -+ transfer_list); -+ -+ if (drv_data->cs_control && transfer->cs_change) -+ drv_data->cs_control(message->spi->chip_select, QSPI_CS_DROP); -+ -+ if (previous->delay_usecs) -+ udelay(previous->delay_usecs); -+ -+ if (drv_data->cs_control && transfer->cs_change) -+ drv_data->cs_control(message->spi->chip_select, QSPI_CS_ASSERT); -+ } -+ -+ drv_data->flags = 0; -+ drv_data->tx = (void *)transfer->tx_buf; -+ drv_data->tx_end = drv_data->tx + transfer->len; -+ drv_data->rx = transfer->rx_buf; -+ drv_data->rx_end = drv_data->rx + transfer->len; -+ drv_data->len = transfer->len; -+ if (!drv_data->rx) -+ drv_data->flags |= TRAN_STATE_RX_VOID; -+ if (!drv_data->tx) -+ drv_data->flags |= TRAN_STATE_TX_VOID; -+ drv_data->cs = message->spi->chip_select; -+ drv_data->cs_change = transfer->cs_change; -+ drv_data->void_write_data = chip->void_write_data; -+ -+ message->state = RUNNING_STATE; -+ -+ /* Go baby, go */ -+ local_irq_save(flags); -+ write(drv_data); -+ local_irq_restore(flags); -+} -+ -+ -+static void pump_messages(struct work_struct *work) -+{ -+ struct driver_data *drv_data; -+ unsigned long flags; -+ -+ drv_data = container_of(work, struct driver_data, pump_messages); -+ -+ /* Lock queue and check for queue work */ -+ spin_lock_irqsave(&drv_data->lock, flags); -+ if (list_empty(&drv_data->queue) || drv_data->run == QUEUE_STOPPED) { -+ drv_data->busy = 0; -+ spin_unlock_irqrestore(&drv_data->lock, flags); -+ return; -+ } -+ -+ /* Make sure we are not already running a message */ -+ if (drv_data->cur_msg) { -+ spin_unlock_irqrestore(&drv_data->lock, flags); -+ return; -+ } -+ -+ /* Extract head of queue */ -+ drv_data->cur_msg = list_entry(drv_data->queue.next, -+ struct spi_message, queue); -+ list_del_init(&drv_data->cur_msg->queue); -+ -+ /* Initial message state*/ -+ drv_data->cur_msg->state = START_STATE; -+ drv_data->cur_transfer = list_entry(drv_data->cur_msg->transfers.next, -+ struct spi_transfer, -+ transfer_list); -+ -+ /* Setup the SPI Registers using the per chip configuration */ -+ drv_data->cur_chip = spi_get_ctldata(drv_data->cur_msg->spi); -+ -+ /* Mark as busy and launch transfers */ -+ tasklet_schedule(&drv_data->pump_transfers); -+ -+ drv_data->busy = 1; -+ spin_unlock_irqrestore(&drv_data->lock, flags); -+} -+ -+/****************************************************************************/ -+ -+/* -+ * SPI master implementation -+ */ -+ -+static int transfer(struct spi_device *spi, struct spi_message *msg) -+{ -+ struct driver_data *drv_data = spi_master_get_devdata(spi->master); -+ unsigned long flags; -+ -+ spin_lock_irqsave(&drv_data->lock, flags); -+ -+ if (drv_data->run == QUEUE_STOPPED) { -+ spin_unlock_irqrestore(&drv_data->lock, flags); -+ return -ESHUTDOWN; -+ } -+ -+ msg->actual_length = 0; -+ msg->status = -EINPROGRESS; -+ msg->state = START_STATE; -+ -+ list_add_tail(&msg->queue, &drv_data->queue); -+ -+ if (drv_data->run == QUEUE_RUNNING && !drv_data->busy) -+ queue_work(drv_data->workqueue, &drv_data->pump_messages); -+ -+ spin_unlock_irqrestore(&drv_data->lock, flags); -+ -+ return 0; -+} -+ -+ -+static int setup(struct spi_device *spi) -+{ -+ struct coldfire_spi_chip *chip_info; -+ struct chip_data *chip; -+#ifndef SPI_DSPI -+ u32 baud_divisor = 255; -+#endif -+ -+ chip_info = (struct coldfire_spi_chip *)spi->controller_data; -+ -+ /* Only alloc on first setup */ -+ chip = spi_get_ctldata(spi); -+ if (chip == NULL) { -+ chip = kcalloc(1, sizeof(struct chip_data), GFP_KERNEL); -+ if (!chip) -+ return -ENOMEM; -+ spi->mode = chip_info->mode; -+ spi->bits_per_word = chip_info->bits_per_word; -+ } -+ -+#if defined(SPI_DSPI) -+ chip->mcr.master = 1; -+ chip->mcr.cont_scke = 0; -+ chip->mcr.dconf = 0; -+ chip->mcr.frz = 0; -+ chip->mcr.mtfe = 0; -+ chip->mcr.pcsse = 0; -+ chip->mcr.rooe = 0; -+ chip->mcr.pcsis = 0xFF; -+ chip->mcr.reserved15 = 0; -+ chip->mcr.mdis = 0; -+ chip->mcr.dis_tx = 0; -+ chip->mcr.dis_rxf = 0; -+ chip->mcr.clr_tx = 1; -+ chip->mcr.clr_rxf = 1; -+ chip->mcr.smpl_pt = 0; -+ chip->mcr.reserved71 = 0; -+ chip->mcr.halt = 0; -+ -+ if ((spi->bits_per_word >= 4) && (spi->bits_per_word <= 16)) { -+ chip->ctar.fmsz = spi->bits_per_word-1; -+ } else { -+ printk(KERN_ERR "coldfire-spi: invalid wordsize\n"); -+ kfree(chip); -+ return -ENODEV; -+ } -+ -+ if (spi->mode & SPI_CPHA) -+ chip->ctar.cpha = 1; -+ else -+ chip->ctar.cpha = 0; -+ -+ if (spi->mode & SPI_CPOL) -+ chip->ctar.cpol = 1; -+ else -+ chip->ctar.cpol = 0; -+ -+ if (spi->mode & SPI_LSB_FIRST) -+ chip->ctar.lsbfe = 1; -+ else -+ chip->ctar.lsbfe = 0; -+ -+ /* This values are default for audio device */ -+ chip->ctar.dbr = 0; -+ chip->ctar.pbr = 2; -+ chip->ctar.br = 8; -+ -+ /* This values are default for audio device */ -+ chip->ctar.pcssck = 1; -+ chip->ctar.pasc = 1; -+ chip->ctar.pdt = 1; -+ chip->ctar.cssck = 0; -+ chip->ctar.asc = 1; -+ chip->ctar.dt = 1; -+ -+ chip->void_write_data = chip_info->void_write_data; -+ -+#else -+ -+ chip->qwr.csiv = 1; /* Chip selects are active low */ -+ chip->qmr.master = 1; /* Must set to master mode */ -+ chip->qmr.dohie = 1; /* Data output high impediance enabled */ -+ chip->void_write_data = chip_info->void_write_data; -+ -+ chip->qdlyr.qcd = chip_info->del_cs_to_clk; -+ chip->qdlyr.dtl = chip_info->del_after_trans; -+ -+ if (spi->max_speed_hz != 0) -+ baud_divisor = (MCF_CLK/(2*spi->max_speed_hz)); -+ -+ if (baud_divisor < 2) -+ baud_divisor = 2; -+ -+ if (baud_divisor > 255) -+ baud_divisor = 255; -+ -+ chip->qmr.baud = baud_divisor; -+ -+ /*printk( "SPI: spi->max_speed_hz %d\n", spi->max_speed_hz );*/ -+ /*printk( "SPI: Baud set to %d\n", chip->qmr.baud );*/ -+ -+ if (spi->mode & SPI_CPHA) -+ chip->qmr.cpha = 1; -+ -+ if (spi->mode & SPI_CPOL) -+ chip->qmr.cpol = 1; -+ -+ if (spi->bits_per_word == 16) { -+ chip->qmr.bits = 0; -+ } else if ((spi->bits_per_word >= 8) && (spi->bits_per_word <= 15)) { -+ chip->qmr.bits = spi->bits_per_word; -+ } else { -+ printk(KERN_ERR "coldfire-spi: invalid wordsize\n"); -+ kfree(chip); -+ return -ENODEV; -+ } -+ -+#endif -+ -+ spi_set_ctldata(spi, chip); -+ -+ return 0; -+} -+ -+static int init_queue(struct driver_data *drv_data) -+{ -+ INIT_LIST_HEAD(&drv_data->queue); -+ spin_lock_init(&drv_data->lock); -+ -+ drv_data->run = QUEUE_STOPPED; -+ drv_data->busy = 0; -+ -+ tasklet_init(&drv_data->pump_transfers, -+ pump_transfers, (unsigned long)drv_data); -+ -+ INIT_WORK(&drv_data->pump_messages, pump_messages); -+ -+ drv_data->workqueue = create_singlethread_workqueue( -+ drv_data->master->dev.parent->bus_id); -+ if (drv_data->workqueue == NULL) -+ return -EBUSY; -+ -+ return 0; -+} -+ -+static int start_queue(struct driver_data *drv_data) -+{ -+ unsigned long flags; -+ -+ spin_lock_irqsave(&drv_data->lock, flags); -+ -+ if (drv_data->run == QUEUE_RUNNING || drv_data->busy) { -+ spin_unlock_irqrestore(&drv_data->lock, flags); -+ return -EBUSY; -+ } -+ -+ drv_data->run = QUEUE_RUNNING; -+ drv_data->cur_msg = NULL; -+ drv_data->cur_transfer = NULL; -+ drv_data->cur_chip = NULL; -+ spin_unlock_irqrestore(&drv_data->lock, flags); -+ -+ queue_work(drv_data->workqueue, &drv_data->pump_messages); -+ -+ return 0; -+} -+ -+static int stop_queue(struct driver_data *drv_data) -+{ -+ unsigned long flags; -+ unsigned limit = 500; -+ int status = 0; -+ -+ spin_lock_irqsave(&drv_data->lock, flags); -+ -+ /* This is a bit lame, but is optimized for the common execution path. -+ * A wait_queue on the drv_data->busy could be used, but then the common -+ * execution path (pump_messages) would be required to call wake_up or -+ * friends on every SPI message. Do this instead */ -+ drv_data->run = QUEUE_STOPPED; -+ while (!list_empty(&drv_data->queue) && drv_data->busy && limit--) { -+ spin_unlock_irqrestore(&drv_data->lock, flags); -+ msleep(10); -+ spin_lock_irqsave(&drv_data->lock, flags); -+ } -+ -+ if (!list_empty(&drv_data->queue) || drv_data->busy) -+ status = -EBUSY; -+ -+ spin_unlock_irqrestore(&drv_data->lock, flags); -+ -+ return status; -+} -+ -+static int destroy_queue(struct driver_data *drv_data) -+{ -+ int status; -+ -+ status = stop_queue(drv_data); -+ if (status != 0) -+ return status; -+ -+ destroy_workqueue(drv_data->workqueue); -+ -+ return 0; -+} -+ -+ -+static void cleanup(struct spi_device *spi) -+{ -+ struct chip_data *chip = spi_get_ctldata((struct spi_device *)spi); -+ -+ dev_dbg(&spi->dev, "spi_device %u.%u cleanup\n", -+ spi->master->bus_num, spi->chip_select); -+ -+ kfree(chip); -+} -+ -+ -+/****************************************************************************/ -+ -+/* -+ * Generic Device driver routines and interface implementation -+ */ -+ -+static int coldfire_spi_probe(struct platform_device *pdev) -+{ -+ struct device *dev = &pdev->dev; -+ struct coldfire_spi_master *platform_info; -+ struct spi_master *master; -+ struct driver_data *drv_data = 0; -+ struct resource *memory_resource; -+ int irq; -+ int status = 0; -+ int i; -+ -+ platform_info = (struct coldfire_spi_master *)pdev->dev.platform_data; -+ -+ master = spi_alloc_master(dev, sizeof(struct driver_data)); -+ if (!master) -+ return -ENOMEM; -+ -+ drv_data = spi_master_get_devdata(master); -+ drv_data->master = master; -+ -+ INIT_LIST_HEAD(&drv_data->queue); -+ spin_lock_init(&drv_data->lock); -+ -+ master->bus_num = platform_info->bus_num; -+ master->num_chipselect = platform_info->num_chipselect; -+ master->cleanup = cleanup; -+ master->setup = setup; -+ master->transfer = transfer; -+ -+ drv_data->cs_control = platform_info->cs_control; -+ if (drv_data->cs_control) -+ for(i = 0; i < master->num_chipselect; i++) -+ drv_data->cs_control(i, QSPI_CS_INIT | QSPI_CS_DROP); -+ -+ /* Setup register addresses */ -+ memory_resource = platform_get_resource_byname(pdev, IORESOURCE_MEM, "spi-module"); -+ if (!memory_resource) { -+ dev_dbg(dev, "can not find platform module memory\n"); -+ goto out_error_master_alloc; -+ } -+ -+#if defined(SPI_DSPI_EDMA) -+ drv_data->edma_tx_buf = kmalloc(EDMA_BUFSIZE_KMALLOC, GFP_DMA); -+ if (!drv_data->edma_tx_buf) { -+ dev_dbg(dev, "cannot allocate eDMA TX memory\n"); -+ goto out_error_master_alloc; -+ } -+ drv_data->edma_rx_buf = kmalloc(EDMA_BUFSIZE_KMALLOC, GFP_DMA); -+ if (!drv_data->edma_rx_buf) { -+ kfree(drv_data->edma_tx_buf); -+ dev_dbg(dev, "cannot allocate eDMA RX memory\n"); -+ goto out_error_master_alloc; -+ } -+#endif -+ -+#if defined(SPI_DSPI) -+ -+ drv_data->mcr = (void *)(memory_resource->start + 0x00000000); -+ drv_data->ctar = (void *)(memory_resource->start + 0x0000000C); -+ drv_data->dspi_sr = (void *)(memory_resource->start + 0x0000002C); -+ drv_data->dspi_rser = (void *)(memory_resource->start + 0x00000030); -+ drv_data->dspi_dtfr = (void *)(memory_resource->start + 0x00000034); -+ drv_data->dspi_drfr = (void *)(memory_resource->start + 0x00000038); -+ -+#else -+ -+ drv_data->qmr = (void *)(memory_resource->start + 0x00000000); -+ drv_data->qdlyr = (void *)(memory_resource->start + 0x00000004); -+ drv_data->qwr = (void *)(memory_resource->start + 0x00000008); -+ drv_data->qir = (void *)(memory_resource->start + 0x0000000c); -+ drv_data->qar = (void *)(memory_resource->start + 0x00000010); -+ drv_data->qdr = (void *)(memory_resource->start + 0x00000014); -+ drv_data->qcr = (void *)(memory_resource->start + 0x00000014); -+ -+#endif -+ -+ /* Setup register addresses */ -+ memory_resource = platform_get_resource_byname(pdev, IORESOURCE_MEM, "spi-par"); -+ if (!memory_resource) { -+ dev_dbg(dev, "can not find platform par memory\n"); -+ goto out_error_master_alloc; -+ } -+ -+ drv_data->par = (void *)memory_resource->start; -+ -+ /* Setup register addresses */ -+ memory_resource = platform_get_resource_byname(pdev, IORESOURCE_MEM, "spi-int-level"); -+ if (!memory_resource) { -+ dev_dbg(dev, "can not find platform par memory\n"); -+ goto out_error_master_alloc; -+ } -+ -+ drv_data->int_icr = (void *)memory_resource->start; -+ -+ /* Setup register addresses */ -+ memory_resource = platform_get_resource_byname(pdev, IORESOURCE_MEM, "spi-int-mask"); -+ if (!memory_resource) { -+ dev_dbg(dev, "can not find platform par memory\n"); -+ goto out_error_master_alloc; -+ } -+ -+ drv_data->int_mr = (void *)memory_resource->start; -+ -+ if (platform_info->irq_list) { -+ /* multiple IRQs */ -+ int *irqlist = platform_info->irq_list; -+ while ((irq = *irqlist++)) { -+ int off = *irqlist++; -+ int lvl = *irqlist++; -+ int msk = *irqlist++; -+ status = request_irq(irq, qspi_interrupt, IRQF_DISABLED, -+ dev->bus_id, drv_data); -+ if (status < 0) { -+ dev_err(&pdev->dev, -+ "unable to attach ColdFire DSPI interrupt\n"); -+ goto out_error_master_alloc; -+ } -+ -+ if (lvl) -+ *(drv_data->int_icr + off) = lvl; -+ -+ if (msk) -+ *drv_data->int_mr &= ~msk; -+ } -+ } -+ else { -+ irq = platform_info->irq_vector; -+ -+ status = request_irq(platform_info->irq_vector, qspi_interrupt, -+ IRQF_DISABLED, dev->bus_id, drv_data); -+ if (status < 0) { -+ dev_err(&pdev->dev, "unable to attach ColdFire QSPI interrupt\n"); -+ goto out_error_master_alloc; -+ } -+ -+ *drv_data->int_icr = platform_info->irq_lp; -+ *drv_data->int_mr &= ~platform_info->irq_mask; -+ } -+ -+ /* Now that we have all the addresses etc. Let's set it up */ -+ if (platform_info->par_val) -+ *drv_data->par = platform_info->par_val; -+ -+#ifdef CONFIG_M5227x -+ MCF_GPIO_PAR_IRQ = 0x04; /* Mistake in RM documentation */ -+#endif -+ -+#ifdef SPI_DSPI -+ drv_data->dspi_ctas = 0; /* TBD: change later */ -+#endif -+ -+ /* Initial and start queue */ -+ status = init_queue(drv_data); -+ if (status != 0) { -+ dev_err(&pdev->dev, "problem initializing queue\n"); -+ goto out_error_irq_alloc; -+ } -+ status = start_queue(drv_data); -+ if (status != 0) { -+ dev_err(&pdev->dev, "problem starting queue\n"); -+ goto out_error_irq_alloc; -+ } -+ -+ /* Register with the SPI framework */ -+ platform_set_drvdata(pdev, drv_data); -+ status = spi_register_master(master); -+ if (status != 0) { -+ dev_err(&pdev->dev, "problem registering spi master\n"); -+ status = -EINVAL; -+ goto out_error_queue_alloc; -+ } -+ -+#if defined(SPI_DSPI_EDMA) -+ if (mcf_edma_request_channel(DSPI_DMA_TX_TCD, -+ edma_tx_handler, -+ NULL, -+ pdev, -+ NULL, /* spinlock */ -+ DRIVER_NAME -+ )!=0) { -+ dev_err(&pdev->dev, "problem requesting edma transmit channel\n"); -+ status = -EINVAL; -+ goto out_error_queue_alloc; -+ } -+ -+ if (mcf_edma_request_channel(DSPI_DMA_RX_TCD, -+ edma_rx_handler, -+ NULL, -+ pdev, -+ NULL, /* spinlock */ -+ DRIVER_NAME -+ )!=0) { -+ dev_err(&pdev->dev, "problem requesting edma receive channel\n"); -+ status = -EINVAL; -+ goto out_edma_transmit; -+ } -+#endif -+ -+ printk(KERN_INFO "SPI: Coldfire master initialized\n" ); -+ return status; -+ -+#if defined(SPI_DSPI_EDMA) -+out_edma_transmit: -+ mcf_edma_free_channel(DSPI_DMA_TX_TCD, pdev); -+#endif -+ -+out_error_queue_alloc: -+ destroy_queue(drv_data); -+ -+out_error_irq_alloc: -+ free_irq(irq, drv_data); -+ -+out_error_master_alloc: -+ spi_master_put(master); -+ return status; -+ -+} -+ -+static int coldfire_spi_remove(struct platform_device *pdev) -+{ -+ struct driver_data *drv_data = platform_get_drvdata(pdev); -+ int irq; -+ int status = 0; -+ -+ if (!drv_data) -+ return 0; -+ -+#if defined(SPI_DSPI_EDMA) -+ mcf_edma_free_channel(DSPI_DMA_TX_TCD, pdev); -+ mcf_edma_free_channel(DSPI_DMA_RX_TCD, pdev); -+#endif -+ -+ /* Remove the queue */ -+ status = destroy_queue(drv_data); -+ if (status != 0) -+ return status; -+ -+ /* Release IRQ */ -+/* JKM -- check for list and remove list */ -+ irq = platform_get_irq(pdev, 0); -+ if (irq >= 0) -+ free_irq(irq, drv_data); -+ -+ /* Disconnect from the SPI framework */ -+ spi_unregister_master(drv_data->master); -+ -+ /* Prevent double remove */ -+ platform_set_drvdata(pdev, NULL); -+ -+ return 0; -+} -+ -+static void coldfire_spi_shutdown(struct platform_device *pdev) -+{ -+ int status = 0; -+ -+ if ((status = coldfire_spi_remove(pdev)) != 0) -+ dev_err(&pdev->dev, "shutdown failed with %d\n", status); -+} -+ -+ -+#ifdef CONFIG_PM -+static int suspend_devices(struct device *dev, void *pm_message) -+{ -+ pm_message_t *state = pm_message; -+ -+ if (dev->power.power_state.event != state->event) { -+ dev_warn(dev, "pm state does not match request\n"); -+ return -1; -+ } -+ -+ return 0; -+} -+ -+static int coldfire_spi_suspend(struct platform_device *pdev, pm_message_t state) -+{ -+ struct driver_data *drv_data = platform_get_drvdata(pdev); -+ int status = 0; -+ -+ /* Check all childern for current power state */ -+ if (device_for_each_child(&pdev->dev, &state, suspend_devices) != 0) { -+ dev_warn(&pdev->dev, "suspend aborted\n"); -+ return -1; -+ } -+ -+ status = stop_queue(drv_data); -+ if (status != 0) -+ return status; -+ -+ return 0; -+} -+ -+static int coldfire_spi_resume(struct platform_device *pdev) -+{ -+ struct driver_data *drv_data = platform_get_drvdata(pdev); -+ int status = 0; -+ -+ /* Start the queue running */ -+ status = start_queue(drv_data); -+ if (status != 0) { -+ dev_err(&pdev->dev, "problem starting queue (%d)\n", status); -+ return status; -+ } -+ -+ return 0; -+} -+#else -+#define coldfire_spi_suspend NULL -+#define coldfire_spi_resume NULL -+#endif /* CONFIG_PM */ -+ -+static struct platform_driver driver = { -+ .driver = { -+ .name = "spi_coldfire", -+ .bus = &platform_bus_type, -+ .owner = THIS_MODULE, -+ }, -+ .probe = coldfire_spi_probe, -+ .remove = __devexit_p(coldfire_spi_remove), -+ .shutdown = coldfire_spi_shutdown, -+ .suspend = coldfire_spi_suspend, -+ .resume = coldfire_spi_resume, -+}; -+ -+static int __init coldfire_spi_init(void) -+{ -+ platform_driver_register(&driver); -+ -+ return 0; -+} -+module_init(coldfire_spi_init); -+ -+static void __exit coldfire_spi_exit(void) -+{ -+ platform_driver_unregister(&driver); -+} -+module_exit(coldfire_spi_exit); ---- /dev/null -+++ b/drivers/spi/spi-m5445x.c -@@ -0,0 +1,156 @@ -+/***************************************************************************/ -+/* -+ * linux/arch/m68k/coldfire/spi-m5445x.c -+ * -+ * Sub-architcture dependant initialization code for the Freescale -+ * 5445x SPI module -+ * -+ * Yaroslav Vinogradov yaroslav.vinogradov@freescale.com -+ * Copyright Freescale Semiconductor, Inc 2007 -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ */ -+/***************************************************************************/ -+ -+ -+#include <linux/kernel.h> -+#include <linux/sched.h> -+#include <linux/param.h> -+#include <linux/init.h> -+#include <linux/interrupt.h> -+#include <linux/device.h> -+#include <linux/platform_device.h> -+#include <linux/spi/spi.h> -+ -+#include <asm/dma.h> -+#include <asm/traps.h> -+#include <asm/machdep.h> -+#include <asm/coldfire.h> -+#include <asm/mcfsim.h> -+#include <asm/mcfqspi.h> -+#include <asm/mcf5445x_gpio.h> -+ -+#define SPI_NUM_CHIPSELECTS 0x10 -+#define SPI_PAR_VAL (0 | MCF_GPIO_PAR_DSPI_PCS5_PCS5 | MCF_GPIO_PAR_DSPI_PCS2_PCS2 \ -+ | MCF_GPIO_PAR_DSPI_PCS1_PCS1 | MCF_GPIO_PAR_DSPI_PCS0_PCS0 | MCF_GPIO_PAR_DSPI_SIN_SIN \ -+ | MCF_GPIO_PAR_DSPI_SOUT_SOUT | MCF_GPIO_PAR_DSPI_SCK_SCK) -+ -+#define MCF5445x_DSPI_IRQ_SOURCE (31) -+#define MCF5445x_DSPI_IRQ_VECTOR (64 + MCF5445x_DSPI_IRQ_SOURCE) -+ -+#define MCF5445x_DSPI_PAR (0xFC0A4063) -+#define MCF5445x_DSPI_MCR (0xFC05C000) -+#define MCF5445x_INTC0_ICR (0xFC048040) -+#define MCF5445x_INTC0_IMRL (0xFC04800C) -+ -+ -+#define M5445x_AUDIO_IRQ_SOURCE 49 -+#define M5445x_AUDIO_IRQ_VECTOR (128+M5445x_AUDIO_IRQ_SOURCE) -+#define M5445x_AUDIO_IRQ_LEVEL 4 -+ -+void coldfire_qspi_cs_control(u8 cs, u8 command) -+{ -+} -+ -+#if defined(CONFIG_SPI_COLDFIRE_SSI_AUDIO) -+static struct coldfire_spi_chip ssi_audio_chip_info = { -+ .mode = SPI_MODE_0, -+ .bits_per_word = 16, -+ .del_cs_to_clk = 16, -+ .del_after_trans = 16, -+ .void_write_data = 0 -+}; -+ -+#endif -+ -+static struct spi_board_info spi_board_info[] = { -+ -+#if defined(CONFIG_SPI_COLDFIRE_SSI_AUDIO) -+ { -+ .modalias = "ssi_audio", -+ .max_speed_hz = 300000, -+ .bus_num = 1, -+ .chip_select = 5, -+ .irq = M5445x_AUDIO_IRQ_VECTOR, -+ .platform_data = NULL, -+ .controller_data = &ssi_audio_chip_info -+ } -+#endif -+ -+}; -+ -+static struct coldfire_spi_master coldfire_master_info = { -+ .bus_num = 1, -+ .num_chipselect = SPI_NUM_CHIPSELECTS, -+ .irq_source = MCF5445x_DSPI_IRQ_SOURCE, -+ .irq_vector = MCF5445x_DSPI_IRQ_VECTOR, -+ .irq_mask = (0x01 << MCF5445x_DSPI_IRQ_SOURCE), -+ .irq_lp = 0x2, /* Level */ -+ .par_val = SPI_PAR_VAL, -+// .par_val16 = SPI_PAR_VAL, -+ .cs_control = coldfire_qspi_cs_control, -+}; -+ -+static struct resource coldfire_spi_resources[] = { -+ [0] = { -+ .name = "qspi-par", -+ .start = MCF5445x_DSPI_PAR, -+ .end = MCF5445x_DSPI_PAR, -+ .flags = IORESOURCE_MEM -+ }, -+ -+ [1] = { -+ .name = "qspi-module", -+ .start = MCF5445x_DSPI_MCR, -+ .end = MCF5445x_DSPI_MCR + 0xB8, -+ .flags = IORESOURCE_MEM -+ }, -+ -+ [2] = { -+ .name = "qspi-int-level", -+ .start = MCF5445x_INTC0_ICR + MCF5445x_DSPI_IRQ_SOURCE, -+ .end = MCF5445x_INTC0_ICR + MCF5445x_DSPI_IRQ_SOURCE, -+ .flags = IORESOURCE_MEM -+ }, -+ -+ [3] = { -+ .name = "qspi-int-mask", -+ .start = MCF5445x_INTC0_IMRL, -+ .end = MCF5445x_INTC0_IMRL, -+ .flags = IORESOURCE_MEM -+ } -+}; -+ -+static struct platform_device coldfire_spi = { -+ .name = "spi_coldfire", //"coldfire-qspi", -+ .id = -1, -+ .resource = coldfire_spi_resources, -+ .num_resources = ARRAY_SIZE(coldfire_spi_resources), -+ .dev = { -+ .platform_data = &coldfire_master_info, -+ } -+}; -+ -+static int __init spi_dev_init(void) -+{ -+ int retval = 0; -+ -+ retval = platform_device_register(&coldfire_spi); -+ -+ if (retval < 0) { -+ printk(KERN_ERR "SPI-m5445x: platform_device_register failed with code=%d\n", retval); -+ goto out; -+ } -+ -+ if (ARRAY_SIZE(spi_board_info)) -+ retval = spi_register_board_info(spi_board_info, ARRAY_SIZE(spi_board_info)); -+ -+ -+out: -+ return retval; -+} -+ -+arch_initcall(spi_dev_init); ---- /dev/null -+++ b/drivers/spi/ssi_audio.c -@@ -0,0 +1,921 @@ -+/* -+ * MCF5445x audio driver. -+ * -+ * Yaroslav Vinogradov yaroslav.vinogradov@freescale.com -+ * Copyright Freescale Semiconductor, Inc. 2006, 2007 -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ */ -+ -+#include <linux/device.h> -+#include <linux/init.h> -+#include <linux/delay.h> -+#include <linux/spi/spi.h> -+#include <linux/fs.h> -+#include <linux/kernel.h> -+#include <linux/major.h> -+#include <asm/mcfsim.h> -+#include <linux/interrupt.h> -+#include <linux/soundcard.h> -+#include <asm/uaccess.h> -+#include <asm/virtconvert.h> -+ -+#include <asm/coldfire.h> -+#include <asm/coldfire_edma.h> -+#ifdef CONFIG_M5445X -+#include <asm/mcf5445x_ssi.h> -+#include <asm/mcf5445x_ccm.h> -+#include <asm/mcf5445x_gpio.h> -+#endif -+ -+#define SOUND_DEVICE_NAME "sound" -+#define DRIVER_NAME "ssi_audio" -+ -+/* #define AUDIO_DEBUG */ -+ -+#ifdef CONFIG_MMU -+#define USE_MMU -+#endif -+ -+#define MAX_SPEED_HZ 12000000 -+ -+#define M5445x_AUDIO_IRQ_SOURCE 49 -+#define M5445x_AUDIO_IRQ_VECTOR (128+M5445x_AUDIO_IRQ_SOURCE) -+#define M5445x_AUDIO_IRQ_LEVEL 5 -+ -+/* TLV320DAC23 audio chip registers */ -+ -+#define CODEC_LEFT_IN_REG (0x00) -+#define CODEC_RIGHT_IN_REG (0x01) -+#define CODEC_LEFT_HP_VOL_REG (0x02) -+#define CODEC_RIGHT_HP_VOL_REG (0x03) -+#define CODEC_ANALOG_APATH_REG (0x04) -+#define CODEC_DIGITAL_APATH_REG (0x05) -+#define CODEC_POWER_DOWN_REG (0x06) -+#define CODEC_DIGITAL_IF_FMT_REG (0x07) -+#define CODEC_SAMPLE_RATE_REG (0x08) -+#define CODEC_DIGITAL_IF_ACT_REG (0x09) -+#define CODEC_RESET_REG (0x0f) -+ -+#define CODEC_SAMPLE_8KHZ (0x0C) -+#define CODEC_SAMPLE_16KHZ (0x58) -+#define CODEC_SAMPLE_22KHZ (0x62) -+#define CODEC_SAMPLE_32KHZ (0x18) -+#define CODEC_SAMPLE_44KHZ (0x22) -+#define CODEC_SAMPLE_48KHZ (0x00) -+ -+/* Audio buffer data size */ -+#define BUFSIZE (64*1024) -+/* DMA transfer size */ -+#define DMASIZE (16*1024) -+ -+/* eDMA channel for SSI channel 0 TX */ -+#define DMA_TCD MCF_EDMA_CHAN_TIMER2 -+/* eDMA channel for SSI channel 1 TX */ -+#define DMA_TCD2 MCF_EDMA_CHAN_TIMER3 -+ -+struct ssi_audio { -+ struct spi_device *spi; -+ u32 speed; -+ u32 stereo; -+ u32 bits; -+ u32 format; -+ u8 isopen; -+ u8 dmaing; -+ u8 ssi_enabled; -+ u8 channel; -+ spinlock_t lock; -+ u8* audio_buf; -+}; -+ -+static struct ssi_audio* audio_device = NULL; -+volatile u32 audio_start; -+volatile u32 audio_count; -+volatile u32 audio_append; -+volatile u32 audio_appstart; -+volatile u32 audio_txbusy; -+ -+struct ssi_audio_format { -+ unsigned int format; -+ unsigned int bits; -+} ssi_audio_formattable[] = { -+ { AFMT_MU_LAW, 8 }, -+ { AFMT_A_LAW, 8 }, -+ { AFMT_IMA_ADPCM, 8 }, -+ { AFMT_U8, 8 }, -+ { AFMT_S16_LE, 16 }, -+ { AFMT_S16_BE, 16 }, -+ { AFMT_S8, 8 }, -+ { AFMT_U16_LE, 16 }, -+ { AFMT_U16_BE, 16 }, -+}; -+ -+#define FORMATSIZE (sizeof(ssi_audio_formattable) / sizeof(struct ssi_audio_format)) -+ -+static void ssi_audio_setsamplesize(int val) -+{ -+ int i; -+ -+ if (audio_device == NULL) return; -+ -+ for (i = 0; (i < FORMATSIZE); i++) { -+ if (ssi_audio_formattable[i].format == val) { -+ audio_device->format = ssi_audio_formattable[i].format; -+ audio_device->bits = ssi_audio_formattable[i].bits; -+ break; -+ } -+ } -+ -+#ifdef AUDIO_DEBUG -+ printk(DRIVER_NAME ":ssi_audio_setsamplesize %d %d\n", -+ audio_device->format, audio_device->bits); -+#endif -+} -+ -+static void ssi_audio_txdrain(void) -+{ -+#ifdef AUDIO_DEBUG -+ printk(DRIVER_NAME ":ssi_audio_txdrain()\n"); -+#endif -+ -+ if (audio_device == NULL) return; -+ -+ while (!signal_pending(current)) { -+ if (audio_txbusy == 0) -+ break; -+ current->state = TASK_INTERRUPTIBLE; -+ schedule_timeout(1); -+ } -+} -+ -+#ifdef CONFIG_SSIAUDIO_USE_EDMA -+/* -+ * Configure and start DMA engine. -+ */ -+void __inline__ ssi_audio_dmarun(void) -+{ -+ set_edma_params(DMA_TCD, -+#ifdef USE_MMU -+ virt_to_phys(&(audio_device->audio_buf[audio_start])), -+#else -+ (u32)&(audio_device->audio_buf[audio_start]), -+#endif -+ (u32)&MCF_SSI_TX0, -+ MCF_EDMA_TCD_ATTR_SSIZE_32BIT | MCF_EDMA_TCD_ATTR_DSIZE_32BIT, -+ 8, -+ 4, -+ 0, -+ audio_count/8, -+ audio_count/8, -+ 0, -+ 0, -+ 0, // major_int -+ 0 // disable_req -+ ); -+ -+ set_edma_params(DMA_TCD2, -+#ifdef USE_MMU -+ virt_to_phys(&(audio_device->audio_buf[audio_start+4])), -+#else -+ (u32)&(audio_device->audio_buf[audio_start+4]), -+#endif -+ (u32)&MCF_SSI_TX1, -+ MCF_EDMA_TCD_ATTR_SSIZE_32BIT | MCF_EDMA_TCD_ATTR_DSIZE_32BIT, -+ 8, -+ 4, -+ 0, -+ audio_count/8, -+ audio_count/8, -+ 0, -+ 0, -+ 1, // major_int -+ 0 // disable_req -+ ); -+ -+ audio_device->dmaing = 1; -+ audio_txbusy = 1; -+ -+ start_edma_transfer(DMA_TCD); -+ start_edma_transfer(DMA_TCD2); -+} -+ -+/** -+ * ssi_audio_dmabuf - Start DMA'ing a new buffer of data if any available. -+ */ -+static void ssi_audio_dmabuf(void) -+{ -+#ifdef AUDIO_DEBUG -+ printk(DRIVER_NAME ":ssi_audio_dmabuf(): append=%x start=%x\n", -+ audio_append, audio_appstart); -+#endif -+ -+ /* If already running then nothing to do... */ -+ if (audio_device->dmaing) -+ return; -+ -+ /* Set DMA buffer size */ -+ audio_count = (audio_append >= audio_appstart) ? -+ (audio_append - audio_appstart) : -+ (BUFSIZE - audio_appstart); -+ if (audio_count > DMASIZE) -+ audio_count = DMASIZE; -+ -+ /* Adjust pointers and counters accordingly */ -+ audio_appstart += audio_count; -+ if (audio_appstart >= BUFSIZE) -+ audio_appstart = 0; -+ -+ if (audio_count > 0) -+ ssi_audio_dmarun(); -+ else { -+ audio_txbusy = 0; -+#ifdef AUDIO_DEBUG -+ printk(DRIVER_NAME ":DMA buffer is empty!\n"); -+#endif -+ } -+} -+ -+void __inline__ stop_dma(void) -+{ -+ stop_edma_transfer(DMA_TCD); -+ stop_edma_transfer(DMA_TCD2); -+} -+ -+static int ssi_audio_dma_handler_empty(int channel, void *dev_id) -+{ -+ return IRQ_HANDLED; -+} -+ -+static int ssi_audio_dma_handler(int channel, void *dev_id) -+{ -+#ifdef AUDIO_DEBUG -+ printk(DRIVER_NAME ":ssi_audio_dma_handler(channel=%d)\n", channel); -+#endif -+ -+ /* Clear DMA interrupt */ -+ stop_dma(); -+ -+ audio_device->dmaing = 0; -+ -+ /* Update data pointers and counts */ -+ audio_start += audio_count; -+ if (audio_start >= BUFSIZE) -+ audio_start = 0; -+ audio_count = 0; -+ -+ /* Start new DMA buffer if we can */ -+ ssi_audio_dmabuf(); -+ -+ return IRQ_HANDLED; -+} -+ -+static void init_dma(void) -+{ -+ /* SSI DMA Signals mapped to DMA request */ -+ MCF_CCM_MISCCR &= ~MCF_CCM_MISCCR_TIMDMA; -+ init_edma(); -+} -+ -+#endif /* CONFIG_SSIAUDIO_USE_EDMA */ -+ -+/* Write CODEC register using SPI -+ * address - CODEC register address -+ * data - data to be written into register -+ */ -+static int codec_write(u8 addr, u16 data) -+{ -+ u16 spi_word; -+ -+ if (audio_device==NULL || audio_device->spi==NULL) -+ return -ENODEV; -+ -+ spi_word = ((addr & 0x7F)<<9)|(data & 0x1FF); -+ return spi_write(audio_device->spi, (const u8*)&spi_word, -+ sizeof(spi_word)); -+} -+ -+static inline void enable_ssi(void) -+{ -+ if (audio_device==NULL || audio_device->ssi_enabled) return; -+ audio_device->ssi_enabled = 1; -+ MCF_SSI_CR |= MCF_SSI_CR_SSI_EN; /* enable SSI module */ -+ MCF_SSI_CR |= MCF_SSI_CR_TE; /* enable tranmitter */ -+} -+ -+static inline void disable_ssi(void) -+{ -+ if (audio_device==NULL || audio_device->ssi_enabled==0) return; -+ MCF_SSI_CR &= ~MCF_SSI_CR_TE; /* disable transmitter */ -+ MCF_SSI_CR &= ~MCF_SSI_CR_SSI_EN; /* disable SSI module */ -+ audio_device->ssi_enabled = 0; -+} -+ -+/* Audio CODEC initialization */ -+static void adjust_codec_speed(void) { -+#ifdef AUDIO_DEBUG -+ printk(DRIVER_NAME ":adjust_codec_speed: %d\n", audio_device->speed); -+#endif -+ disable_ssi(); -+ switch (audio_device->speed) { -+ case 8000: -+ MCF_CCM_CDR = MCF_CCM_CDR_SSIDIV(255); -+ codec_write(CODEC_SAMPLE_RATE_REG,CODEC_SAMPLE_8KHZ); -+ break; -+ case 16000: -+ MCF_CCM_CDR = MCF_CCM_CDR_SSIDIV(129); -+ codec_write(CODEC_SAMPLE_RATE_REG,CODEC_SAMPLE_16KHZ); -+ break; -+ case 22000: -+ case 22050: -+ MCF_CCM_CDR = MCF_CCM_CDR_SSIDIV(94); -+ codec_write(CODEC_SAMPLE_RATE_REG,CODEC_SAMPLE_22KHZ); -+ break; -+ case 44000: -+ case 44100: -+ MCF_CCM_CDR = MCF_CCM_CDR_SSIDIV(47); -+ codec_write(CODEC_SAMPLE_RATE_REG,CODEC_SAMPLE_44KHZ); -+ break; -+ case 48000: -+ MCF_CCM_CDR = MCF_CCM_CDR_SSIDIV(42); -+ codec_write(CODEC_SAMPLE_RATE_REG,CODEC_SAMPLE_48KHZ); -+ break; -+ default: -+ MCF_CCM_CDR = MCF_CCM_CDR_SSIDIV(47); -+ codec_write(CODEC_SAMPLE_RATE_REG,CODEC_SAMPLE_44KHZ); -+ } -+} -+ -+static void codec_reset(void) -+{ -+ codec_write(CODEC_RESET_REG, 0); /* reset the audio chip */ -+ udelay(1500); /* wait for reset */ -+} -+ -+static void init_audio_codec(void) -+{ -+#ifdef AUDIO_DEBUG -+ printk(DRIVER_NAME ":init_audio_codec()\n"); -+#endif -+ codec_reset(); -+ -+ codec_write(CODEC_LEFT_IN_REG, 0x017); -+ codec_write(CODEC_RIGHT_IN_REG, 0x017); -+ codec_write(CODEC_POWER_DOWN_REG, 0x000); /* Turn off line input */ -+ codec_write(CODEC_DIGITAL_IF_FMT_REG, 0x00A); /* I2S slave mode */ -+ /* codec_write(CODEC_DIGITAL_IF_FMT_REG, 0x042); // I2S master mode */ -+ codec_write(CODEC_DIGITAL_APATH_REG, 0x007); /* Set A path */ -+ -+ /* set sample rate */ -+ adjust_codec_speed(); -+ -+ codec_write(CODEC_LEFT_HP_VOL_REG, 0x075); /* set volume */ -+ codec_write(CODEC_RIGHT_HP_VOL_REG, 0x075); /* set volume */ -+ codec_write(CODEC_DIGITAL_IF_ACT_REG, 1); /* Activate digital interface */ -+ codec_write(CODEC_ANALOG_APATH_REG, 0x0F2); -+} -+ -+ -+static void chip_init(void) -+{ -+#ifdef CONFIG_SSIAUDIO_USE_EDMA -+ init_dma(); -+#endif -+ -+ /* Enable the SSI pins */ -+ MCF_GPIO_PAR_SSI = (0 -+ | MCF_GPIO_PAR_SSI_MCLK -+ | MCF_GPIO_PAR_SSI_STXD(3) -+ | MCF_GPIO_PAR_SSI_SRXD(3) -+ | MCF_GPIO_PAR_SSI_FS(3) -+ | MCF_GPIO_PAR_SSI_BCLK(3) ); -+} -+ -+static void init_ssi(void) -+{ -+#ifdef AUDIO_DEBUG -+ printk(DRIVER_NAME ":init_ssi()\n"); -+#endif -+ -+ /* Dividers are for MCF54445 on 266Mhz, the output is 44.1Khz*/ -+ /* Enable SSI clock in CCM */ -+ MCF_CCM_CDR = MCF_CCM_CDR_SSIDIV(47); -+ -+ /* Issue a SSI reset */ -+ MCF_SSI_CR &= ~MCF_SSI_CR_SSI_EN; /* disable SSI module */ -+ -+ /* SSI module uses internal CPU clock */ -+ MCF_CCM_MISCCR |= MCF_CCM_MISCCR_SSISRC; -+ -+ MCF_CCM_MISCCR |= MCF_CCM_MISCCR_SSIPUE; -+ MCF_CCM_MISCCR |= MCF_CCM_MISCCR_SSIPUS_UP; -+ -+ MCF_SSI_CR = 0 -+ | MCF_SSI_CR_CIS -+ | MCF_SSI_CR_TCH /* Enable two channel mode */ -+ | MCF_SSI_CR_MCE /* Set clock out on SSI_MCLK pin */ -+ | MCF_SSI_CR_I2S_MASTER /* Set I2S master mode */ -+ | MCF_SSI_CR_SYN /* Enable synchronous mode */ -+ | MCF_SSI_CR_NET -+ ; -+ -+ MCF_SSI_TCR = 0 -+ | MCF_SSI_TCR_TXDIR /* internally generated bit clock */ -+ | MCF_SSI_TCR_TFDIR /* internally generated frame sync */ -+ | MCF_SSI_TCR_TSCKP /* Clock data on falling edge of bit clock */ -+ | MCF_SSI_TCR_TFSI /* Frame sync active low */ -+ | MCF_SSI_TCR_TEFS /* TX frame sync 1 bit before data */ -+ | MCF_SSI_TCR_TFEN0 /* TX FIFO 0 enabled */ -+ | MCF_SSI_TCR_TFEN1 /* TX FIFO 1 enabled */ -+ | MCF_SSI_TCR_TXBIT0 -+ ; -+ -+ MCF_SSI_CCR = MCF_SSI_CCR_WL(7) /* 16 bit word length */ -+ | MCF_SSI_CCR_DC(1) /* Frame rate divider */ -+ | MCF_SSI_CCR_PM(0) -+ | MCF_SSI_CCR_DIV2 -+ ; -+ -+ MCF_SSI_FCSR = 0 -+ | MCF_SSI_FCSR_TFWM0(2) -+ | MCF_SSI_FCSR_TFWM1(2) -+ ; -+ -+ MCF_SSI_IER = 0 // interrupts -+#ifndef CONFIG_SSIAUDIO_USE_EDMA -+ | MCF_SSI_IER_TIE /* transmit interrupts */ -+ | MCF_SSI_IER_TFE0 /* transmit FIFO 0 empty */ -+ | MCF_SSI_IER_TFE1 /* transmit FIFO 1 empty */ -+#else -+ | MCF_SSI_IER_TDMAE /* DMA request enabled */ -+ | MCF_SSI_IER_TFE0 /* transmit FIFO 0 empty */ -+ | MCF_SSI_IER_TFE1 /* transmit FIFO 1 empty */ -+#endif -+ ; -+ -+#ifndef CONFIG_SSIAUDIO_USE_EDMA -+ /* enable IRQ: SSI interrupt */ -+ MCF_INTC1_ICR(M5445x_AUDIO_IRQ_SOURCE) = M5445x_AUDIO_IRQ_LEVEL; -+ MCF_INTC1_CIMR = M5445x_AUDIO_IRQ_SOURCE; -+#endif -+} -+ -+#ifndef CONFIG_SSIAUDIO_USE_EDMA -+/* interrupt for SSI */ -+static int ssi_audio_isr(int irq, void *dev_id) -+{ -+ unsigned long *bp; -+ -+ if (audio_txbusy==0) -+ return IRQ_HANDLED; -+ -+ spin_lock(&(audio_device->lock)); -+ -+ if (audio_start == audio_append) { -+ disable_ssi(); -+ audio_txbusy = 0; -+ } else { -+ if (MCF_SSI_ISR & (MCF_SSI_ISR_TFE0|MCF_SSI_ISR_TFE1)) { -+ bp = (unsigned long *) &audio_device->audio_buf[audio_start]; -+ if (audio_device->channel) { -+ MCF_SSI_TX1 = *bp; -+ audio_device->channel = 0; -+ } else { -+ MCF_SSI_TX0 = *bp; -+ audio_device->channel = 1; -+ } -+ audio_start += 4; -+ if (audio_start >= BUFSIZE) -+ audio_start = 0; -+ } -+ } -+ -+ spin_unlock(&(audio_device->lock)); -+ -+ return IRQ_HANDLED; -+} -+#endif -+ -+/* Set initial driver playback defaults. */ -+static void init_driver_variables(void) -+{ -+ audio_device->speed = 44100; -+ audio_device->format = AFMT_S16_LE; -+ audio_device->bits = 16; -+ audio_device->stereo = 1; -+ audio_device->ssi_enabled = 0; -+ -+ audio_start = 0; -+ audio_count = 0; -+ audio_append = 0; -+ audio_appstart = 0; -+ audio_txbusy = 0; -+ audio_device->dmaing = 0; -+} -+ -+/* open audio device */ -+static int ssi_audio_open(struct inode *inode, struct file *filp) -+{ -+#ifdef AUDIO_DEBUG -+ printk(DRIVER_NAME ":ssi_audio_open()\n"); -+#endif -+ -+ if (audio_device==NULL) return (-ENODEV); -+ -+ if (audio_device->isopen) -+ return(-EBUSY); -+ -+ spin_lock(&(audio_device->lock)); -+ -+ audio_device->isopen = 1; -+ -+ init_driver_variables(); -+ init_ssi(); -+ init_audio_codec(); -+ -+ spin_unlock(&(audio_device->lock)); -+ -+ udelay(100); -+ -+ return 0; -+} -+ -+/* close audio device */ -+static int ssi_audio_close(struct inode *inode, struct file *filp) -+{ -+#ifdef AUDIO_DEBUG -+ printk(DRIVER_NAME ":ssi_audio_close()\n"); -+#endif -+ -+ if (audio_device==NULL) return (-ENODEV); -+ -+ ssi_audio_txdrain(); -+ -+ spin_lock(&(audio_device->lock)); -+ -+#ifdef CONFIG_SSIAUDIO_USE_EDMA -+ stop_dma(); -+#endif -+ disable_ssi(); -+ codec_reset(); -+ init_driver_variables(); -+ audio_device->isopen = 0; -+ -+ spin_unlock(&(audio_device->lock)); -+ return 0; -+} -+ -+/* write to audio device */ -+static ssize_t ssi_audio_write(struct file *filp, const char *buf, -+ size_t count, loff_t *ppos) -+{ -+ unsigned long *dp, *buflp; -+ unsigned short *bufwp; -+ unsigned char *bufbp; -+ unsigned int slen, bufcnt, i, s, e; -+ -+#ifdef AUDIO_DEBUG -+ printk(DRIVER_NAME ":ssi_audio_write(buf=%x,count=%d)\n", -+ (int)buf, count); -+#endif -+ -+ if (audio_device==NULL) -+ return (-ENODEV); -+ -+ if (count <= 0) -+ return 0; -+ -+ spin_lock(&(audio_device->lock)); -+ -+ buflp = (unsigned long *) buf; -+ bufwp = (unsigned short *) buf; -+ bufbp = (unsigned char *) buf; -+ -+ bufcnt = count & ~0x3; -+ -+ bufcnt <<= 1; -+ if (audio_device->stereo == 0) -+ bufcnt <<= 1; -+ if (audio_device->bits == 8) -+ bufcnt <<= 1; -+ -+tryagain: -+ /* -+ * Get a snapshot of buffer, so we can figure out how -+ * much data we can fit in... -+ */ -+ s = audio_start; -+ e = audio_append; -+ dp = (unsigned long *) &(audio_device->audio_buf[e]); -+ -+ slen = ((s > e) ? (s - e) : (BUFSIZE - (e - s))) - 4; -+ if (slen > bufcnt) -+ slen = bufcnt; -+ if ((BUFSIZE - e) < slen) -+ slen = BUFSIZE - e; -+ -+ if (slen == 0) { -+ if (signal_pending(current)) -+ return(-ERESTARTSYS); -+ set_current_state(TASK_INTERRUPTIBLE); -+ schedule_timeout(1); -+ goto tryagain; -+ } -+ -+ /* -+ * For DMA we need to have data as 32 bit -+ * values (since SSI TX register is 32 bit). -+ * So, the incoming 16 bit data must be put to buffer as 32 bit values. -+ * Also, the endianess is converted if needed -+ */ -+ if (audio_device->stereo) { -+ if (audio_device->bits == 16) { -+ if (audio_device->format==AFMT_S16_LE) { -+ /*- convert endianess, probably could be done by SSI also */ -+ for (i = 0; (i < slen); i += 4) { -+ unsigned short val = le16_to_cpu((*bufwp++)); -+ *dp++ = val; -+ } -+ } else { -+ for (i = 0; (i < slen); i += 4) { -+ *dp++ = *bufwp++; -+ } -+ } -+ } else { -+ for (i = 0; (i < slen); i += 4) { -+ *dp = (((unsigned long) *bufbp++) << 24); -+ *dp++ |= (((unsigned long) *bufbp++) << 8); -+ } -+ } -+ } else { -+ if (audio_device->bits == 16) { -+ for (i = 0; (i < slen); i += 4) { -+ *dp++ = (((unsigned long)*bufwp)<<16) | *bufwp; -+ bufwp++; -+ } -+ } else { -+ for (i = 0; (i < slen); i += 4) { -+ *dp++ = (((unsigned long) *bufbp) << 24) | -+ (((unsigned long) *bufbp) << 8); -+ bufbp++; -+ } -+ } -+ } -+ -+ e += slen; -+ if (e >= BUFSIZE) -+ e = 0; -+ audio_append = e; -+ -+ /* If not outputing audio, then start now */ -+ if (audio_txbusy == 0) { -+ audio_txbusy++; -+ audio_device->channel = 0; -+ enable_ssi(); -+#ifdef CONFIG_SSIAUDIO_USE_EDMA -+ ssi_audio_dmabuf(); /* start first DMA transfer */ -+#endif -+ } -+ -+ bufcnt -= slen; -+ -+ if (bufcnt > 0) -+ goto tryagain; -+ -+ spin_unlock(&(audio_device->lock)); -+ -+ return count; -+} -+ -+/* ioctl: control the driver */ -+static int ssi_audio_ioctl(struct inode *inode, struct file *filp, -+ unsigned int cmd, unsigned long arg) -+{ -+ long val; -+ int rc = 0; -+ -+#ifdef AUDIO_DEBUG -+ printk(DRIVER_NAME ":ssi_audio_ioctl(cmd=%x,arg=%x)\n", -+ (int)cmd, (int)arg); -+#endif -+ -+ if (audio_device==NULL) -+ return (-ENODEV); -+ -+ switch (cmd) { -+ -+ case SNDCTL_DSP_SPEED: -+ if (access_ok(VERIFY_READ, (void *) arg, sizeof(val))) { -+ get_user(val, (unsigned long *) arg); -+#ifdef AUDIO_DEBUG -+ printk(DRIVER_NAME ":ssi_audio_ioctl: SNDCTL_DSP_SPEED: %ld\n", val); -+#endif -+ ssi_audio_txdrain(); -+ audio_device->speed = val; -+ init_audio_codec(); -+ } else { -+ rc = -EINVAL; -+ } -+ break; -+ -+ case SNDCTL_DSP_SAMPLESIZE: -+ if (access_ok(VERIFY_READ, (void *) arg, sizeof(val))) { -+ get_user(val, (unsigned long *) arg); -+#ifdef AUDIO_DEBUG -+ printk(DRIVER_NAME ":ssi_audio_ioctl: SNDCTL_DSP_SAMPLESIZE: %d\n", val); -+#endif -+ ssi_audio_txdrain(); -+ ssi_audio_setsamplesize(val); -+ } else { -+ rc = -EINVAL; -+ } -+ break; -+ -+ case SNDCTL_DSP_STEREO: -+ if (access_ok(VERIFY_READ, (void *) arg, sizeof(val))) { -+ get_user(val, (unsigned long *) arg); -+ ssi_audio_txdrain(); -+ audio_device->stereo = val; -+ } else { -+ rc = -EINVAL; -+ } -+ break; -+ -+ case SNDCTL_DSP_GETBLKSIZE: -+ if (access_ok(VERIFY_WRITE, (void *) arg, sizeof(long))) -+ put_user(BUFSIZE, (long *) arg); -+ else -+ rc = -EINVAL; -+ break; -+ -+ case SNDCTL_DSP_SYNC: -+ ssi_audio_txdrain(); -+ break; -+ -+ default: -+ rc = -EINVAL; -+ break; -+ } -+ -+ return rc; -+} -+ -+struct file_operations ssi_audio_fops = { -+ open: ssi_audio_open, /* open */ -+ release: ssi_audio_close, /* close */ -+ write: ssi_audio_write, /* write */ -+ ioctl: ssi_audio_ioctl, /* ioctl */ -+}; -+ -+/* initialize audio driver */ -+static int __devinit ssi_audio_probe(struct spi_device *spi) -+{ -+ struct ssi_audio *audio; -+ int err; -+ -+#ifdef AUDIO_DEBUG -+ printk(DRIVER_NAME": probe\n"); -+#endif -+ -+ if (!spi->irq) { -+ dev_dbg(&spi->dev, "no IRQ?\n"); -+ return -ENODEV; -+ } -+ -+ /* don't exceed max specified sample rate */ -+ if (spi->max_speed_hz > MAX_SPEED_HZ) { -+ dev_dbg(&spi->dev, "f(sample) %d KHz?\n", -+ (spi->max_speed_hz)/1000); -+ return -EINVAL; -+ } -+ -+ /* register charcter device */ -+ if (register_chrdev(SOUND_MAJOR, SOUND_DEVICE_NAME, &ssi_audio_fops) < 0) { -+ printk(KERN_WARNING DRIVER_NAME ": failed to register major %d\n", SOUND_MAJOR); -+ dev_dbg(&spi->dev, DRIVER_NAME ": failed to register major %d\n", SOUND_MAJOR); -+ return -ENODEV; -+ } -+ -+ audio = kzalloc(sizeof(struct ssi_audio), GFP_KERNEL); -+ if (!audio) { -+ err = -ENOMEM; -+ goto err_out; -+ } -+ -+ /* DMA buffer must be from GFP_DMA zone, so it will not be cached */ -+ audio->audio_buf = kmalloc(BUFSIZE, GFP_DMA); -+ if (audio->audio_buf == NULL) { -+ dev_dbg(&spi->dev, DRIVER_NAME ": failed to allocate DMA[%d] buffer\n", BUFSIZE); -+ err = -ENOMEM; -+ goto err_free_mem; -+ } -+ -+ audio_device = audio; -+ -+ dev_set_drvdata(&spi->dev, audio); -+ spi->dev.power.power_state = PMSG_ON; -+ -+ audio->spi = spi; -+ -+#ifndef CONFIG_SSIAUDIO_USE_EDMA -+ if (request_irq(spi->irq, ssi_audio_isr, IRQF_DISABLED, spi->dev.bus_id, audio)) { -+ dev_dbg(&spi->dev, "irq %d busy?\n", spi->irq); -+ err = -EBUSY; -+ goto err_free_mem; -+ } -+ -+#else -+ /* request 2 eDMA channels since two channel output mode is used */ -+ if (request_edma_channel(DMA_TCD, -+ ssi_audio_dma_handler_empty, -+ NULL, -+ audio, -+ &(audio_device->lock), -+ DRIVER_NAME)!=0) { -+ dev_dbg(&spi->dev, "DMA channel %d busy?\n", DMA_TCD); -+ err = -EBUSY; -+ goto err_free_mem; -+ } -+ if (request_edma_channel(DMA_TCD2, -+ ssi_audio_dma_handler, -+ NULL, -+ audio, -+ &(audio_device->lock), -+ DRIVER_NAME)!=0) { -+ dev_dbg(&spi->dev, "DMA channel %d busy?\n", DMA_TCD2); -+ err = -EBUSY; -+ goto err_free_mem; -+ } -+ -+#endif -+ chip_init(); -+ printk(DRIVER_NAME ": Probed successfully\n"); -+ -+ return 0; -+ -+ err_free_mem: -+ kfree(audio); -+ audio_device = NULL; -+ err_out: -+ unregister_chrdev(SOUND_MAJOR, SOUND_DEVICE_NAME); -+ return err; -+} -+ -+static int __devexit ssi_audio_remove(struct spi_device *spi) -+{ -+ struct ssi_audio *audio = dev_get_drvdata(&spi->dev); -+ -+ ssi_audio_txdrain(); -+#ifndef CONFIG_SSIAUDIO_USE_EDMA -+ free_irq(spi->irq, audio); -+#else -+ free_edma_channel(DMA_TCD, audio); -+ free_edma_channel(DMA_TCD2, audio); -+#endif -+ kfree(audio->audio_buf); -+ kfree(audio); -+ audio_device = NULL; -+ unregister_chrdev(SOUND_MAJOR, SOUND_DEVICE_NAME); -+ dev_dbg(&spi->dev, "unregistered audio\n"); -+ return 0; -+} -+ -+static int ssi_audio_suspend(struct spi_device *spi, pm_message_t message) -+{ -+ return 0; -+} -+ -+static int ssi_audio_resume(struct spi_device *spi) -+{ -+ return 0; -+} -+ -+static struct spi_driver ssi_audio_driver = { -+ .driver = { -+ .name = DRIVER_NAME, -+ .bus = &spi_bus_type, -+ .owner = THIS_MODULE, -+ }, -+ .probe = ssi_audio_probe, -+ .remove = __devexit_p(ssi_audio_remove), -+ .suspend = ssi_audio_suspend, -+ .resume = ssi_audio_resume, -+}; -+ -+static int __init ssi_audio_init(void) -+{ -+ return spi_register_driver(&ssi_audio_driver); -+} -+module_init(ssi_audio_init); -+ -+static void __exit ssi_audio_exit(void) -+{ -+ spi_unregister_driver(&ssi_audio_driver); -+} -+module_exit(ssi_audio_exit); -+ -+MODULE_LICENSE("GPL"); -+MODULE_AUTHOR("Freescale Semiconductor, Inc."); -+MODULE_DESCRIPTION("SSI/I2S Audio Driver"); ---- a/drivers/usb/gadget/ether.c -+++ b/drivers/usb/gadget/ether.c -@@ -287,6 +287,9 @@ MODULE_PARM_DESC(host_addr, "Host Ethern - #define DEV_CONFIG_CDC - #endif - -+#ifdef CONFIG_USB_GADGET_MCF5445X -+#define DEV_CONFIG_CDC -+#endif - - /*-------------------------------------------------------------------------*/ - ---- a/drivers/usb/gadget/fsl_usb2_udc.h -+++ b/drivers/usb/gadget/fsl_usb2_udc.h -@@ -83,16 +83,6 @@ struct usb_dr_host { - u32 endptctrl[6]; /* Endpoint Control Registers */ - }; - -- /* non-EHCI USB system interface registers (Big Endian) */ --struct usb_sys_interface { -- u32 snoop1; -- u32 snoop2; -- u32 age_cnt_thresh; /* Age Count Threshold Register */ -- u32 pri_ctrl; /* Priority Control Register */ -- u32 si_ctrl; /* System Interface Control Register */ -- u8 res[236]; -- u32 control; /* General Purpose Control Register */ --}; - - /* ep0 transfer state */ - #define WAIT_FOR_SETUP 0 -@@ -101,10 +91,6 @@ struct usb_sys_interface { - #define WAIT_FOR_OUT_STATUS 3 - #define DATA_STATE_RECV 4 - --/* Device Controller Capability Parameter register */ --#define DCCPARAMS_DC 0x00000080 --#define DCCPARAMS_DEN_MASK 0x0000001f -- - /* Frame Index Register Bit Masks */ - #define USB_FRINDEX_MASKS 0x3fff - /* USB CMD Register Bit Masks */ -@@ -180,172 +166,6 @@ struct usb_sys_interface { - /* endpoint list address bit masks */ - #define USB_EP_LIST_ADDRESS_MASK 0xfffff800 - --/* PORTSCX Register Bit Masks */ --#define PORTSCX_CURRENT_CONNECT_STATUS 0x00000001 --#define PORTSCX_CONNECT_STATUS_CHANGE 0x00000002 --#define PORTSCX_PORT_ENABLE 0x00000004 --#define PORTSCX_PORT_EN_DIS_CHANGE 0x00000008 --#define PORTSCX_OVER_CURRENT_ACT 0x00000010 --#define PORTSCX_OVER_CURRENT_CHG 0x00000020 --#define PORTSCX_PORT_FORCE_RESUME 0x00000040 --#define PORTSCX_PORT_SUSPEND 0x00000080 --#define PORTSCX_PORT_RESET 0x00000100 --#define PORTSCX_LINE_STATUS_BITS 0x00000C00 --#define PORTSCX_PORT_POWER 0x00001000 --#define PORTSCX_PORT_INDICTOR_CTRL 0x0000C000 --#define PORTSCX_PORT_TEST_CTRL 0x000F0000 --#define PORTSCX_WAKE_ON_CONNECT_EN 0x00100000 --#define PORTSCX_WAKE_ON_CONNECT_DIS 0x00200000 --#define PORTSCX_WAKE_ON_OVER_CURRENT 0x00400000 --#define PORTSCX_PHY_LOW_POWER_SPD 0x00800000 --#define PORTSCX_PORT_FORCE_FULL_SPEED 0x01000000 --#define PORTSCX_PORT_SPEED_MASK 0x0C000000 --#define PORTSCX_PORT_WIDTH 0x10000000 --#define PORTSCX_PHY_TYPE_SEL 0xC0000000 -- --/* bit 11-10 are line status */ --#define PORTSCX_LINE_STATUS_SE0 0x00000000 --#define PORTSCX_LINE_STATUS_JSTATE 0x00000400 --#define PORTSCX_LINE_STATUS_KSTATE 0x00000800 --#define PORTSCX_LINE_STATUS_UNDEF 0x00000C00 --#define PORTSCX_LINE_STATUS_BIT_POS 10 -- --/* bit 15-14 are port indicator control */ --#define PORTSCX_PIC_OFF 0x00000000 --#define PORTSCX_PIC_AMBER 0x00004000 --#define PORTSCX_PIC_GREEN 0x00008000 --#define PORTSCX_PIC_UNDEF 0x0000C000 --#define PORTSCX_PIC_BIT_POS 14 -- --/* bit 19-16 are port test control */ --#define PORTSCX_PTC_DISABLE 0x00000000 --#define PORTSCX_PTC_JSTATE 0x00010000 --#define PORTSCX_PTC_KSTATE 0x00020000 --#define PORTSCX_PTC_SEQNAK 0x00030000 --#define PORTSCX_PTC_PACKET 0x00040000 --#define PORTSCX_PTC_FORCE_EN 0x00050000 --#define PORTSCX_PTC_BIT_POS 16 -- --/* bit 27-26 are port speed */ --#define PORTSCX_PORT_SPEED_FULL 0x00000000 --#define PORTSCX_PORT_SPEED_LOW 0x04000000 --#define PORTSCX_PORT_SPEED_HIGH 0x08000000 --#define PORTSCX_PORT_SPEED_UNDEF 0x0C000000 --#define PORTSCX_SPEED_BIT_POS 26 -- --/* bit 28 is parallel transceiver width for UTMI interface */ --#define PORTSCX_PTW 0x10000000 --#define PORTSCX_PTW_8BIT 0x00000000 --#define PORTSCX_PTW_16BIT 0x10000000 -- --/* bit 31-30 are port transceiver select */ --#define PORTSCX_PTS_UTMI 0x00000000 --#define PORTSCX_PTS_ULPI 0x80000000 --#define PORTSCX_PTS_FSLS 0xC0000000 --#define PORTSCX_PTS_BIT_POS 30 -- --/* otgsc Register Bit Masks */ --#define OTGSC_CTRL_VUSB_DISCHARGE 0x00000001 --#define OTGSC_CTRL_VUSB_CHARGE 0x00000002 --#define OTGSC_CTRL_OTG_TERM 0x00000008 --#define OTGSC_CTRL_DATA_PULSING 0x00000010 --#define OTGSC_STS_USB_ID 0x00000100 --#define OTGSC_STS_A_VBUS_VALID 0x00000200 --#define OTGSC_STS_A_SESSION_VALID 0x00000400 --#define OTGSC_STS_B_SESSION_VALID 0x00000800 --#define OTGSC_STS_B_SESSION_END 0x00001000 --#define OTGSC_STS_1MS_TOGGLE 0x00002000 --#define OTGSC_STS_DATA_PULSING 0x00004000 --#define OTGSC_INTSTS_USB_ID 0x00010000 --#define OTGSC_INTSTS_A_VBUS_VALID 0x00020000 --#define OTGSC_INTSTS_A_SESSION_VALID 0x00040000 --#define OTGSC_INTSTS_B_SESSION_VALID 0x00080000 --#define OTGSC_INTSTS_B_SESSION_END 0x00100000 --#define OTGSC_INTSTS_1MS 0x00200000 --#define OTGSC_INTSTS_DATA_PULSING 0x00400000 --#define OTGSC_INTR_USB_ID 0x01000000 --#define OTGSC_INTR_A_VBUS_VALID 0x02000000 --#define OTGSC_INTR_A_SESSION_VALID 0x04000000 --#define OTGSC_INTR_B_SESSION_VALID 0x08000000 --#define OTGSC_INTR_B_SESSION_END 0x10000000 --#define OTGSC_INTR_1MS_TIMER 0x20000000 --#define OTGSC_INTR_DATA_PULSING 0x40000000 -- --/* USB MODE Register Bit Masks */ --#define USB_MODE_CTRL_MODE_IDLE 0x00000000 --#define USB_MODE_CTRL_MODE_DEVICE 0x00000002 --#define USB_MODE_CTRL_MODE_HOST 0x00000003 --#define USB_MODE_CTRL_MODE_RSV 0x00000001 --#define USB_MODE_SETUP_LOCK_OFF 0x00000008 --#define USB_MODE_STREAM_DISABLE 0x00000010 --/* Endpoint Flush Register */ --#define EPFLUSH_TX_OFFSET 0x00010000 --#define EPFLUSH_RX_OFFSET 0x00000000 -- --/* Endpoint Setup Status bit masks */ --#define EP_SETUP_STATUS_MASK 0x0000003F --#define EP_SETUP_STATUS_EP0 0x00000001 -- --/* ENDPOINTCTRLx Register Bit Masks */ --#define EPCTRL_TX_ENABLE 0x00800000 --#define EPCTRL_TX_DATA_TOGGLE_RST 0x00400000 /* Not EP0 */ --#define EPCTRL_TX_DATA_TOGGLE_INH 0x00200000 /* Not EP0 */ --#define EPCTRL_TX_TYPE 0x000C0000 --#define EPCTRL_TX_DATA_SOURCE 0x00020000 /* Not EP0 */ --#define EPCTRL_TX_EP_STALL 0x00010000 --#define EPCTRL_RX_ENABLE 0x00000080 --#define EPCTRL_RX_DATA_TOGGLE_RST 0x00000040 /* Not EP0 */ --#define EPCTRL_RX_DATA_TOGGLE_INH 0x00000020 /* Not EP0 */ --#define EPCTRL_RX_TYPE 0x0000000C --#define EPCTRL_RX_DATA_SINK 0x00000002 /* Not EP0 */ --#define EPCTRL_RX_EP_STALL 0x00000001 -- --/* bit 19-18 and 3-2 are endpoint type */ --#define EPCTRL_EP_TYPE_CONTROL 0 --#define EPCTRL_EP_TYPE_ISO 1 --#define EPCTRL_EP_TYPE_BULK 2 --#define EPCTRL_EP_TYPE_INTERRUPT 3 --#define EPCTRL_TX_EP_TYPE_SHIFT 18 --#define EPCTRL_RX_EP_TYPE_SHIFT 2 -- --/* SNOOPn Register Bit Masks */ --#define SNOOP_ADDRESS_MASK 0xFFFFF000 --#define SNOOP_SIZE_ZERO 0x00 /* snooping disable */ --#define SNOOP_SIZE_4KB 0x0B /* 4KB snoop size */ --#define SNOOP_SIZE_8KB 0x0C --#define SNOOP_SIZE_16KB 0x0D --#define SNOOP_SIZE_32KB 0x0E --#define SNOOP_SIZE_64KB 0x0F --#define SNOOP_SIZE_128KB 0x10 --#define SNOOP_SIZE_256KB 0x11 --#define SNOOP_SIZE_512KB 0x12 --#define SNOOP_SIZE_1MB 0x13 --#define SNOOP_SIZE_2MB 0x14 --#define SNOOP_SIZE_4MB 0x15 --#define SNOOP_SIZE_8MB 0x16 --#define SNOOP_SIZE_16MB 0x17 --#define SNOOP_SIZE_32MB 0x18 --#define SNOOP_SIZE_64MB 0x19 --#define SNOOP_SIZE_128MB 0x1A --#define SNOOP_SIZE_256MB 0x1B --#define SNOOP_SIZE_512MB 0x1C --#define SNOOP_SIZE_1GB 0x1D --#define SNOOP_SIZE_2GB 0x1E /* 2GB snoop size */ -- --/* pri_ctrl Register Bit Masks */ --#define PRI_CTRL_PRI_LVL1 0x0000000C --#define PRI_CTRL_PRI_LVL0 0x00000003 -- --/* si_ctrl Register Bit Masks */ --#define SI_CTRL_ERR_DISABLE 0x00000010 --#define SI_CTRL_IDRC_DISABLE 0x00000008 --#define SI_CTRL_RD_SAFE_EN 0x00000004 --#define SI_CTRL_RD_PREFETCH_DISABLE 0x00000002 --#define SI_CTRL_RD_PREFEFETCH_VAL 0x00000001 -- --/* control Register Bit Masks */ --#define USB_CTRL_IOENB 0x00000004 --#define USB_CTRL_ULPI_INT0EN 0x00000001 - - /* Endpoint Queue Head data struct - * Rem: all the variables of qh are LittleEndian Mode -@@ -477,7 +297,10 @@ struct fsl_udc { - unsigned int irq; - - struct usb_ctrlrequest local_setup_buff; -- spinlock_t lock; -+ spinlock_t lock; /* udc lock */ -+ struct fsl_usb2_platform_data *pdata; -+ u32 xcvr_type; -+ - struct otg_transceiver *transceiver; - unsigned softconnect:1; - unsigned vbus_active:1; -@@ -514,7 +337,7 @@ struct fsl_udc { - #define DBG(fmt, args...) printk(KERN_DEBUG "[%s] " fmt "\n", \ - __FUNCTION__, ## args) - #else --#define DBG(fmt, args...) do{}while(0) -+#define DBG(fmt, args...) do {} while (0) - #endif - - #if 0 -@@ -548,7 +371,7 @@ static void dump_msg(const char *label, - #ifdef VERBOSE - #define VDBG DBG - #else --#define VDBG(stuff...) do{}while(0) -+#define VDBG(stuff...) do {} while (0) - #endif - - #define ERR(stuff...) pr_err("udc: " stuff) -@@ -573,11 +396,14 @@ static void dump_msg(const char *label, - #define ep_maxpacket(EP) ((EP)->ep.maxpacket) - #define ep_is_in(EP) ( (ep_index(EP) == 0) ? (EP->udc->ep0_dir == \ - USB_DIR_IN ):((EP)->desc->bEndpointAddress \ -- & USB_DIR_IN)==USB_DIR_IN) -+ & USB_DIR_IN) == USB_DIR_IN) - #define get_ep_by_pipe(udc, pipe) ((pipe == 1)? &udc->eps[0]: \ - &udc->eps[pipe]) - #define get_pipe_by_windex(windex) ((windex & USB_ENDPOINT_NUMBER_MASK) \ - * 2 + ((windex & USB_DIR_IN) ? 1 : 0)) - #define get_pipe_by_ep(EP) (ep_index(EP) * 2 + ep_is_in(EP)) - -+/* Bulk only class request */ -+#define USB_BULK_RESET_REQUEST 0xff -+ - #endif ---- a/drivers/usb/gadget/gadget_chips.h -+++ b/drivers/usb/gadget/gadget_chips.h -@@ -147,6 +147,11 @@ - #define gadget_is_m66592(g) 0 - #endif - -+#ifdef CONFIG_USB_GADGET_MCF5445X -+#define gadget_is_mcf5445x(g) !strcmp("fsl-usb2-udc", (g)->name) -+#else -+#define gadget_is_mcf5445x(g) 0 -+#endif - - // CONFIG_USB_GADGET_SX2 - // CONFIG_USB_GADGET_AU1X00 -@@ -212,5 +217,7 @@ static inline int usb_gadget_controller_ - return 0x20; - else if (gadget_is_m66592(gadget)) - return 0x21; -+ else if (gadget_is_mcf5445x(gadget)) -+ return 0x22; - return -ENOENT; - } ---- a/drivers/usb/gadget/Kconfig -+++ b/drivers/usb/gadget/Kconfig -@@ -231,6 +231,26 @@ config SUPERH_BUILT_IN_M66592 - However, this problem is improved if change a value of - NET_IP_ALIGN to 4. - -+config USB_GADGET_MCF5445X -+ boolean "MCF5445X USB Device Controller" -+ depends on M54455 && USB_M5445X_ULPI -+ select USB_GADGET_DUALSPEED -+ help -+ Freescale's MCF5445X processors include -+ an integrated device controller (as part of the OTG module). -+ It has four programmable, bidirectional endpoints, -+ including endpoint 0. -+ -+ Say "y" to link the driver statically, or "m" to build a -+ dynamically linked module called "mcf5445_udc" and force all -+ gadget drivers to also be dynamically linked. -+ -+config USB_MCF5445X -+ tristate -+ depends on USB_GADGET_MCF5445X -+ default USB_GADGET -+ select USB_GADGET_SELECTED -+ - config USB_GADGET_GOKU - boolean "Toshiba TC86C001 'Goku-S'" - depends on PCI -@@ -285,17 +305,6 @@ config USB_OMAP - default USB_GADGET - select USB_GADGET_SELECTED - --config USB_OTG -- boolean "OTG Support" -- depends on USB_GADGET_OMAP && ARCH_OMAP_OTG && USB_OHCI_HCD -- help -- The most notable feature of USB OTG is support for a -- "Dual-Role" device, which can act as either a device -- or a host. The initial role choice can be changed -- later, when two dual-role devices talk to each other. -- -- Select this only if your OMAP board has a Mini-AB connector. -- - config USB_GADGET_S3C2410 - boolean "S3C2410 USB Device Controller" - depends on ARCH_S3C2410 -@@ -369,6 +378,18 @@ config USB_DUMMY_HCD - - endchoice - -+config USB_OTG -+ boolean "OTG Support" -+ depends on (USB_GADGET_OMAP && ARCH_OMAP_OTG && USB_OHCI_HCD) || \ -+ (USB_GADGET_MCF5445X && USB_M5445X_ULPI) -+ help -+ The most notable feature of USB OTG is support for a -+ "Dual-Role" device, which can act as either a device -+ or a host. The initial role choice can be changed -+ later, when two dual-role devices talk to each other. -+ -+ Select this only if your OMAP board has a Mini-AB connector. -+ - config USB_GADGET_DUALSPEED - bool - depends on USB_GADGET ---- a/drivers/usb/gadget/Makefile -+++ b/drivers/usb/gadget/Makefile -@@ -17,6 +17,7 @@ obj-$(CONFIG_USB_AT91) += at91_udc.o - obj-$(CONFIG_USB_ATMEL_USBA) += atmel_usba_udc.o - obj-$(CONFIG_USB_FSL_USB2) += fsl_usb2_udc.o - obj-$(CONFIG_USB_M66592) += m66592-udc.o -+obj-$(CONFIG_USB_MCF5445X) += mcf5445x_udc.o - - # - # USB gadget drivers ---- /dev/null -+++ b/drivers/usb/gadget/mcf5445x_udc.c -@@ -0,0 +1,2745 @@ -+/* -+ * Copyright Freescale Semiconductor, Inc. 2006-2007 -+ * -+ * Based on mpc_udc.c code -+ * of Li Yang and Jiang Bo (Freescale Semiconductor, Inc.) -+ * -+ * -+ * This program is free software; you can redistribute it and/or modify it -+ * under the terms of the GNU General Public License as published by the -+ * Free Software Foundation; either version 2 of the License, or (at your -+ * option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -+ * -+ *************************************************************************** -+ * Changes: -+ * v0.004 30 July 2007 Duck -+ * mcf5445x port -+ * v0.003 27 October 2006 Andrey Butok -+ * Added M5329EVB support (without external transceiver). -+ * v0.002 29 September 2006 Andrey Butok -+ * Some little changes. Added OTG support. -+ * v0.001 12 July 2006 Andrey Butok -+ * Initial Release - developed on uClinux with 2.6.17.1 kernel. -+ * Based on mpc_udc.c code -+ * of Li Yang and Jiang Bo (Freescale Semiconductor, Inc.) -+ * -+ */ -+ -+#undef DEBUG -+#undef VERBOSE -+ -+#include <linux/module.h> -+#include <linux/kernel.h> -+#include <linux/ioport.h> -+#include <linux/types.h> -+#include <linux/errno.h> -+#include <linux/delay.h> -+#include <linux/sched.h> -+#include <linux/slab.h> -+#include <linux/init.h> -+#include <linux/io.h> -+#include <linux/irq.h> -+#include <linux/timer.h> -+#include <linux/list.h> -+#include <linux/interrupt.h> -+#include <linux/proc_fs.h> -+#include <linux/mm.h> -+#include <linux/platform_device.h> -+#include <linux/moduleparam.h> -+#include <linux/device.h> -+#include <linux/usb/ch9.h> -+#include <linux/usb/gadget.h> -+#include <linux/usb/otg.h> -+#include <linux/dma-mapping.h> -+#include <linux/dmapool.h> -+#include <linux/fsl_devices.h> -+#include <linux/usb/fsl_xcvr.h> -+#include <linux/usb/fsl_usb2.h> -+#include <linux/pm.h> -+ -+#include <asm/byteorder.h> -+#include <asm/system.h> -+#include <asm/unaligned.h> -+#include <asm/dma.h> -+ -+#include <asm/mcfsim.h> -+#include <asm/cacheflush.h> -+ -+#include "fsl_usb2_udc.h" -+ -+#define DRIVER_DESC "Freescale High-Speed USB SoC Device Controller driver" -+#define DRIVER_AUTHOR "Freescale Semiconductor Inc." -+#define DRIVER_VERSION "30 July 2007" -+ -+#define cpu_to_hc32(x) (x) -+#define hc32_to_cpu(x) (x) -+ -+static int udc_suspend(struct fsl_udc *udc); -+ -+#define DMA_ADDR_INVALID (~(dma_addr_t)0) -+ -+static const char driver_name[] = "fsl-usb2-udc"; -+static const char driver_desc[] = DRIVER_DESC; -+ -+volatile static struct fsl_usb_device_regs *dr_regs; -+volatile static struct usb_sys_interface *usb_sys_regs; -+ -+/* it is initialized in probe() */ -+static struct fsl_udc *udc_controller; -+ -+static const struct usb_endpoint_descriptor -+fsl_ep0_desc = { -+ .bLength = USB_DT_ENDPOINT_SIZE, -+ .bDescriptorType = USB_DT_ENDPOINT, -+ .bEndpointAddress = 0, -+ .bmAttributes = USB_ENDPOINT_XFER_CONTROL, -+ .wMaxPacketSize = USB_MAX_CTRL_PAYLOAD, -+}; -+ -+static int fsl_udc_suspend(struct device *dev, pm_message_t state); -+static int fsl_udc_resume(struct device *dev); -+static void fsl_ep_fifo_flush(struct usb_ep *_ep); -+ -+/******************************************************************** -+ * Internal Used Function -+********************************************************************/ -+/*----------------------------------------------------------------- -+ * done() - retire a request; caller blocked irqs -+ * @status : request status to be set, only works when -+ * request is still in progress. -+ *--------------------------------------------------------------*/ -+static void done(struct fsl_ep *ep, struct fsl_req *req, int status) -+{ -+ struct fsl_udc *udc = NULL; -+ unsigned char stopped = ep->stopped; -+ -+ udc = (struct fsl_udc *)ep->udc; -+ -+ pr_debug("udc: req=0x%p\n", req); -+ if (req->head) { -+ pr_debug("udc: freeing head=0x%p\n", req->head); -+ dma_pool_free(udc->td_pool, req->head, req->head->td_dma); -+ } -+ -+ /* the req->queue pointer is used by ep_queue() func, in which -+ * the request will be added into a udc_ep->queue 'd tail -+ * so here the req will be dropped from the ep->queue -+ */ -+ list_del_init(&req->queue); -+ -+ /* req.status should be set as -EINPROGRESS in ep_queue() */ -+ if (req->req.status == -EINPROGRESS) -+ req->req.status = status; -+ else -+ status = req->req.status; -+ -+ pr_debug("udc: req=0x%p mapped=%x\n", req, req->mapped); -+ -+ if (req->mapped) { -+ pr_debug("udc: calling dma_unmap_single(buf,%s) req=0x%p " -+ "a=0x%x len=%d\n", -+ ep_is_in(ep) ? "to_dvc" : "from_dvc", -+ req, req->req.dma, req->req.length); -+ -+ dma_unmap_single(ep->udc->gadget.dev.parent, -+ req->req.dma, req->req.length, ep_is_in(ep) ? -+ DMA_TO_DEVICE : DMA_FROM_DEVICE); -+ -+ req->req.dma = DMA_ADDR_INVALID; -+ req->mapped = 0; -+ pr_debug("udc: req=0x%p set req.dma=0x%x\n", req, req->req.dma); -+ } else { -+ if ((req->req.length != 0) -+ && (req->req.dma != DMA_ADDR_INVALID)) { -+ pr_debug("udc: calling dma_sync_single_for_cpu(buf,%s) " -+ "req=0x%p dma=0x%x len=%d\n", -+ ep_is_in(ep) ? "to_dvc" : "from_dvc", req, -+ req->req.dma, req->req.length); -+ -+ dma_sync_single_for_cpu(ep->udc->gadget.dev.parent, -+ req->req.dma, req->req.length, -+ ep_is_in(ep) ? DMA_TO_DEVICE : -+ DMA_FROM_DEVICE); -+ } -+ } -+ -+ if (status && (status != -ESHUTDOWN)) { -+ pr_debug("udc: complete %s req 0c%p stat %d len %u/%u\n", -+ ep->ep.name, &req->req, status, -+ req->req.actual, req->req.length); -+ } -+ -+ /* don't modify queue heads during completion callback */ -+ ep->stopped = 1; -+ -+ spin_unlock(&ep->udc->lock); -+ -+ /* this complete() should a func implemented by gadget layer, -+ * eg fsg->bulk_in_complete() */ -+ if (req->req.complete) { -+ pr_debug("udc: calling gadget's complete() req=0x%p\n", req); -+ req->req.complete(&ep->ep, &req->req); -+ pr_debug("udc: back from gadget's complete()\n"); -+ } -+ -+ spin_lock(&ep->udc->lock); -+ ep->stopped = stopped; -+} -+ -+/* -+ * nuke(): delete all requests related to this ep -+ * called with spinlock held -+ *--------------------------------------------------------------*/ -+static void nuke(struct fsl_ep *ep, int status) -+{ -+ ep->stopped = 1; -+ -+ /* Flush fifo */ -+ fsl_ep_fifo_flush(&ep->ep); -+ -+ /* Whether this eq has request linked */ -+ while (!list_empty(&ep->queue)) { -+ struct fsl_req *req = NULL; -+ -+ req = list_entry(ep->queue.next, struct fsl_req, queue); -+ done(ep, req, status); -+ } -+} -+ -+/*------------------------------------------------------------------ -+ Internal Hardware related function -+ ------------------------------------------------------------------*/ -+ -+static int dr_controller_setup(struct fsl_udc *udc) -+{ -+ unsigned int tmp; -+ unsigned int __attribute((unused)) ctrl = 0; -+ unsigned long timeout; -+ struct fsl_usb2_platform_data *pdata; -+ -+#define FSL_UDC_RESET_TIMEOUT 1000 -+ -+ /* before here, make sure dr_regs has been initialized */ -+ if (!udc) -+ return -EINVAL; -+ pdata = udc->pdata; -+ -+ /* Stop and reset the usb controller */ -+ tmp = fsl_readl(&dr_regs->usbcmd); -+ tmp &= ~USB_CMD_RUN_STOP; -+ fsl_writel(tmp, &dr_regs->usbcmd); -+ -+ tmp = fsl_readl(&dr_regs->usbcmd); -+ tmp |= USB_CMD_CTRL_RESET; -+ fsl_writel(tmp, &dr_regs->usbcmd); -+ -+ /* Wait for reset to complete */ -+ timeout = jiffies + FSL_UDC_RESET_TIMEOUT; -+ while (fsl_readl(&dr_regs->usbcmd) & USB_CMD_CTRL_RESET) { -+ if (time_after(jiffies, timeout)) { -+ ERR("udc reset timeout! \n"); -+ return -ETIMEDOUT; -+ } -+ cpu_relax(); -+ } -+ -+ tmp = fsl_readl(&dr_regs->usbmode); -+ tmp &= ~0x3; /* clear mode bits */ -+ tmp |= USB_MODE_CTRL_MODE_DEVICE; -+ /* Disable Setup Lockout */ -+ tmp |= USB_MODE_SETUP_LOCK_OFF; -+ if (pdata->es) -+ tmp |= USBMODE_ES; -+ fsl_writel(tmp, &dr_regs->usbmode); -+ -+ if (pdata->xcvr_ops && pdata->xcvr_ops->set_device) -+ pdata->xcvr_ops->set_device(); -+ -+ /* Clear the setup status */ -+ fsl_writel(0, &dr_regs->usbsts); -+ -+ tmp = udc->ep_qh_dma; -+ tmp &= USB_EP_LIST_ADDRESS_MASK; -+ fsl_writel(tmp, &dr_regs->endpointlistaddr); -+ -+ /* -+ VDBG("vir[qh_base] is %p phy[qh_base] is 0x%8x reg is 0x%8x", -+ (int)udc->ep_qh, (int)tmp, -+ fsl_readl(&dr_regs->endpointlistaddr)); -+ */ -+ -+ -+ if (pdata->have_sysif_regs) { -+ /* Config control enable i/o output, cpu endian register */ -+ ctrl = __raw_readl(&usb_sys_regs->control); -+ ctrl |= USB_CTRL_IOENB; -+ __raw_writel(ctrl, &usb_sys_regs->control); -+ } -+ -+#if defined(CONFIG_PPC32) && !defined(CONFIG_NOT_COHERENT_CACHE) -+ /* Turn on cache snooping hardware, since some PowerPC platforms -+ * wholly rely on hardware to deal with cache coherent. */ -+ -+ if (pdata->have_sysif_regs) { -+ /* Setup Snooping for all the 4GB space */ -+ tmp = SNOOP_SIZE_2GB; /* starts from 0x0, size 2G */ -+ __raw_writel(tmp, &usb_sys_regs->snoop1); -+ tmp |= 0x80000000; /* starts from 0x8000000, size 2G */ -+ __raw_writel(tmp, &usb_sys_regs->snoop2); -+ } -+#endif -+ -+ return 0; -+} -+ -+static void pullup_enable(struct fsl_udc *udc) -+{ -+ u32 temp; -+ -+ unsigned short ccm = fsl_readw(&MCF_CCM_UOCSR); -+ ccm |= MCF_CCM_UOCSR_BVLD; -+ ccm &= ~MCF_CCM_UOCSR_SEND; -+ fsl_writew(ccm, &MCF_CCM_UOCSR); -+ -+ /* Enable DR irq reg */ -+ temp = USB_INTR_INT_EN | USB_INTR_ERR_INT_EN -+ | USB_INTR_PTC_DETECT_EN | USB_INTR_RESET_EN -+ | USB_INTR_DEVICE_SUSPEND | USB_INTR_SYS_ERR_EN; -+ -+ fsl_writel(temp, &dr_regs->usbintr); -+ -+ /* Set controller to Run */ -+ temp = fsl_readl(&dr_regs->usbcmd); -+ temp |= USB_CMD_RUN_STOP; -+ fsl_writel(temp, &dr_regs->usbcmd); -+} -+ -+static void pullup_disable(struct fsl_udc *udc) -+{ -+ unsigned int tmp; -+ unsigned short ccm; -+ -+ VDBG(); -+ /* disable all INTRs */ -+ fsl_writel(0, &dr_regs->usbintr); -+ -+ ccm = fsl_readw(&MCF_CCM_UOCSR); -+ ccm &= ~MCF_CCM_UOCSR_BVLD; -+ fsl_writew(ccm, &MCF_CCM_UOCSR); -+ -+ /* set controller to Stop */ -+ tmp = fsl_readl(&dr_regs->usbcmd); -+ tmp &= ~USB_CMD_RUN_STOP; -+ fsl_writel(tmp, &dr_regs->usbcmd); -+} -+ -+static void dr_controller_run(struct fsl_udc *udc) -+{ -+ VDBG(); -+ pullup_enable(udc); -+ udc->stopped = 0; -+} -+ -+static void dr_controller_stop(struct fsl_udc *udc) -+{ -+ pullup_disable(udc); -+ udc->stopped = 1; -+ udc->gadget.b_hnp_enable = 0; -+ udc->gadget.a_hnp_support = 0; -+ udc->gadget.a_alt_hnp_support = 0; -+} -+ -+void dr_ep_setup(unsigned char ep_num, unsigned char dir, unsigned char ep_type) -+{ -+ unsigned int tmp_epctrl = 0; -+ -+ tmp_epctrl = fsl_readl(&dr_regs->endptctrl[ep_num]); -+ if (dir) { -+ if (ep_num) -+ tmp_epctrl |= EPCTRL_TX_DATA_TOGGLE_RST; -+ tmp_epctrl |= EPCTRL_TX_ENABLE; -+ tmp_epctrl |= ((unsigned int)(ep_type) -+ << EPCTRL_TX_EP_TYPE_SHIFT); -+ } else { -+ if (ep_num) -+ tmp_epctrl |= EPCTRL_RX_DATA_TOGGLE_RST; -+ tmp_epctrl |= EPCTRL_RX_ENABLE; -+ tmp_epctrl |= ((unsigned int)(ep_type) -+ << EPCTRL_RX_EP_TYPE_SHIFT); -+ } -+ -+ fsl_writel(tmp_epctrl, &dr_regs->endptctrl[ep_num]); -+} -+ -+static void dr_ep_change_stall(unsigned char ep_num, unsigned char dir, -+ int value) -+{ -+ u32 tmp_epctrl = 0; -+ -+ tmp_epctrl = fsl_readl(&dr_regs->endptctrl[ep_num]); -+ -+ if (value) { -+ /* set the stall bit */ -+ if (dir) -+ tmp_epctrl |= EPCTRL_TX_EP_STALL; -+ else -+ tmp_epctrl |= EPCTRL_RX_EP_STALL; -+ } else { -+ /* clear the stall bit and reset data toggle */ -+ if (dir) { -+ tmp_epctrl &= ~EPCTRL_TX_EP_STALL; -+ tmp_epctrl |= EPCTRL_TX_DATA_TOGGLE_RST; -+ } else { -+ tmp_epctrl &= ~EPCTRL_RX_EP_STALL; -+ tmp_epctrl |= EPCTRL_RX_DATA_TOGGLE_RST; -+ } -+ } -+ fsl_writel(tmp_epctrl, &dr_regs->endptctrl[ep_num]); -+} -+ -+/* Get stall status of a specific ep -+ Return: 0: not stalled; 1:stalled */ -+static int dr_ep_get_stall(unsigned char ep_num, unsigned char dir) -+{ -+ u32 epctrl; -+ -+ epctrl = fsl_readl(&dr_regs->endptctrl[ep_num]); -+ if (dir) -+ return (epctrl & EPCTRL_TX_EP_STALL) ? 1 : 0; -+ else -+ return (epctrl & EPCTRL_RX_EP_STALL) ? 1 : 0; -+} -+ -+/******************************************************************** -+ Internal Structure Build up functions -+********************************************************************/ -+ -+/*------------------------------------------------------------------ -+* struct_ep_qh_setup(): set the Endpoint Capabilites field of QH -+ * @zlt: Zero Length Termination Select (1: disable; 0: enable) -+ * @mult: Mult field -+ ------------------------------------------------------------------*/ -+static void struct_ep_qh_setup(struct fsl_udc *udc, unsigned char ep_num, -+ unsigned char dir, unsigned char ep_type, -+ unsigned int max_pkt_len, -+ unsigned int zlt, unsigned char mult) -+{ -+ struct ep_queue_head *p_QH = &udc->ep_qh[2 * ep_num + dir]; -+ unsigned int tmp = 0; -+ -+ /* set the Endpoint Capabilites in QH */ -+ switch (ep_type) { -+ case USB_ENDPOINT_XFER_CONTROL: -+ /* Interrupt On Setup (IOS). for control ep */ -+ tmp = (max_pkt_len << EP_QUEUE_HEAD_MAX_PKT_LEN_POS) -+ | EP_QUEUE_HEAD_IOS; -+ break; -+ case USB_ENDPOINT_XFER_ISOC: -+ tmp = (max_pkt_len << EP_QUEUE_HEAD_MAX_PKT_LEN_POS) -+ | (mult << EP_QUEUE_HEAD_MULT_POS); -+ break; -+ case USB_ENDPOINT_XFER_BULK: -+ case USB_ENDPOINT_XFER_INT: -+ tmp = max_pkt_len << EP_QUEUE_HEAD_MAX_PKT_LEN_POS; -+ break; -+ default: -+ VDBG("error ep type is %d", ep_type); -+ return; -+ } -+ if (zlt) -+ tmp |= EP_QUEUE_HEAD_ZLT_SEL; -+ p_QH->max_pkt_length = cpu_to_hc32(tmp); -+ -+ return; -+} -+ -+/* Setup qh structure and ep register for ep0. */ -+static void ep0_setup(struct fsl_udc *udc) -+{ -+ /* the intialization of an ep includes: fields in QH, Regs, -+ * fsl_ep struct */ -+ struct_ep_qh_setup(udc, 0, USB_RECV, USB_ENDPOINT_XFER_CONTROL, -+ USB_MAX_CTRL_PAYLOAD, 0, 0); -+ struct_ep_qh_setup(udc, 0, USB_SEND, USB_ENDPOINT_XFER_CONTROL, -+ USB_MAX_CTRL_PAYLOAD, 0, 0); -+ dr_ep_setup(0, USB_RECV, USB_ENDPOINT_XFER_CONTROL); -+ dr_ep_setup(0, USB_SEND, USB_ENDPOINT_XFER_CONTROL); -+ -+ return; -+ -+} -+ -+/*********************************************************************** -+ Endpoint Management Functions -+***********************************************************************/ -+ -+/*------------------------------------------------------------------------- -+ * when configurations are set, or when interface settings change -+ * for example the do_set_interface() in gadget layer, -+ * the driver will enable or disable the relevant endpoints -+ * ep0 doesn't use this routine. It is always enabled. -+-------------------------------------------------------------------------*/ -+static int fsl_ep_enable(struct usb_ep *_ep, -+ const struct usb_endpoint_descriptor *desc) -+{ -+ struct fsl_udc *udc = NULL; -+ struct fsl_ep *ep = NULL; -+ unsigned short max = 0; -+ unsigned char mult = 0, zlt; -+ int retval = -EINVAL; -+ unsigned long flags = 0; -+ -+ ep = container_of(_ep, struct fsl_ep, ep); -+ -+ /* catch various bogus parameters */ -+ if (!_ep || !desc || ep->desc -+ || (desc->bDescriptorType != USB_DT_ENDPOINT)) -+ return -EINVAL; -+ -+ udc = ep->udc; -+ -+ if (!udc->driver || (udc->gadget.speed == USB_SPEED_UNKNOWN)) -+ return -ESHUTDOWN; -+ -+ max = le16_to_cpu(desc->wMaxPacketSize); -+ -+ /* Disable automatic zlp generation. Driver is reponsible to indicate -+ * explicitly through req->req.zero. This is needed to enable multi-td -+ * request. */ -+ zlt = 1; -+ -+ /* Assume the max packet size from gadget is always correct */ -+ switch (desc->bmAttributes & 0x03) { -+ case USB_ENDPOINT_XFER_CONTROL: -+ case USB_ENDPOINT_XFER_BULK: -+ case USB_ENDPOINT_XFER_INT: -+ /* mult = 0. Execute N Transactions as demonstrated by -+ * the USB variable length packet protocol where N is -+ * computed using the Maximum Packet Length (dQH) and -+ * the Total Bytes field (dTD) */ -+ mult = 0; -+ break; -+ case USB_ENDPOINT_XFER_ISOC: -+ /* Calculate transactions needed for high bandwidth iso */ -+ mult = (unsigned char)(1 + ((max >> 11) & 0x03)); -+ max = max & 0x8ff; /* bit 0~10 */ -+ /* 3 transactions at most */ -+ if (mult > 3) -+ goto en_done; -+ break; -+ default: -+ goto en_done; -+ } -+ -+ spin_lock_irqsave(&udc->lock, flags); -+ ep->ep.maxpacket = max; -+ ep->desc = desc; -+ ep->stopped = 0; -+ -+ /* Controller related setup */ -+ /* Init EPx Queue Head (Ep Capabilites field in QH -+ * according to max, zlt, mult) */ -+ struct_ep_qh_setup(udc, (unsigned char) ep_index(ep), -+ (unsigned char) ((desc->bEndpointAddress & USB_DIR_IN) -+ ? USB_SEND : USB_RECV), -+ (unsigned char) (desc->bmAttributes -+ & USB_ENDPOINT_XFERTYPE_MASK), -+ max, zlt, mult); -+ -+ /* Init endpoint ctrl register */ -+ dr_ep_setup((unsigned char) ep_index(ep), -+ (unsigned char) ((desc->bEndpointAddress & USB_DIR_IN) -+ ? USB_SEND : USB_RECV), -+ (unsigned char) (desc->bmAttributes -+ & USB_ENDPOINT_XFERTYPE_MASK)); -+ -+ spin_unlock_irqrestore(&udc->lock, flags); -+ retval = 0; -+ -+ VDBG("enabled %s (ep%d%s) maxpacket %d", ep->ep.name, -+ ep->desc->bEndpointAddress & 0x0f, -+ (desc->bEndpointAddress & USB_DIR_IN) -+ ? "in" : "out", max); -+en_done: -+ return retval; -+} -+ -+/*--------------------------------------------------------------------- -+ * @ep : the ep being unconfigured. May not be ep0 -+ * Any pending and uncomplete req will complete with status (-ESHUTDOWN) -+*---------------------------------------------------------------------*/ -+static int fsl_ep_disable(struct usb_ep *_ep) -+{ -+ struct fsl_udc *udc = NULL; -+ struct fsl_ep *ep = NULL; -+ unsigned long flags = 0; -+ u32 epctrl; -+ int ep_num; -+ -+ ep = container_of(_ep, struct fsl_ep, ep); -+ if (!_ep || !ep->desc) { -+ pr_debug("udc: %s not enabled\n", _ep ? ep->ep.name : NULL); -+ return -EINVAL; -+ } -+ -+ /* disable ep on controller */ -+ ep_num = ep_index(ep); -+ epctrl = fsl_readl(&dr_regs->endptctrl[ep_num]); -+ if (ep_is_in(ep)) -+ epctrl &= ~EPCTRL_TX_ENABLE; -+ else -+ epctrl &= ~EPCTRL_RX_ENABLE; -+ fsl_writel(epctrl, &dr_regs->endptctrl[ep_num]); -+ -+ udc = (struct fsl_udc *)ep->udc; -+ spin_lock_irqsave(&udc->lock, flags); -+ -+ /* nuke all pending requests (does flush) */ -+ nuke(ep, -ESHUTDOWN); -+ -+ ep->desc = 0; -+ ep->stopped = 1; -+ spin_unlock_irqrestore(&udc->lock, flags); -+ -+ pr_debug("udc: disabled %s OK\n", _ep->name); -+ return 0; -+} -+ -+/*--------------------------------------------------------------------- -+ * allocate a request object used by this endpoint -+ * the main operation is to insert the req->queue to the eq->queue -+ * Returns the request, or null if one could not be allocated -+*---------------------------------------------------------------------*/ -+static struct usb_request * -+fsl_alloc_request(struct usb_ep *_ep, gfp_t gfp_flags) -+{ -+ struct fsl_req *req = NULL; -+ -+ req = kzalloc(sizeof *req, gfp_flags); -+ if (!req) -+ return NULL; -+ -+ req->req.dma = DMA_ADDR_INVALID; -+ pr_debug("udc: req=0x%p set req.dma=0x%x\n", req, req->req.dma); -+ INIT_LIST_HEAD(&req->queue); -+ -+ return &req->req; -+} -+ -+static void fsl_free_request(struct usb_ep *_ep, struct usb_request *_req) -+{ -+ struct fsl_req *req; -+ -+ req = container_of(_req, struct fsl_req, req); -+ pr_debug("udc: req=0x%p\n", req); -+ -+ if (_req) -+ kfree(req); -+} -+ -+/*-------------------------------------------------------------------------*/ -+static int fsl_queue_td(struct fsl_ep *ep, struct fsl_req *req) -+{ -+ int i = ep_index(ep) * 2 + ep_is_in(ep); -+ u32 temp, bitmask, tmp_stat; -+ struct ep_queue_head *dQH = &ep->udc->ep_qh[i]; -+ -+ pr_debug("udc: queue req=0x%p to ep index %d\n", req, i); -+ -+ bitmask = ep_is_in(ep) -+ ? (1 << (ep_index(ep) + 16)) -+ : (1 << (ep_index(ep))); -+ -+ /* check if the pipe is empty */ -+ if (!(list_empty(&ep->queue))) { -+ /* Add td to the end */ -+ struct fsl_req *lastreq; -+ lastreq = list_entry(ep->queue.prev, struct fsl_req, queue); -+ lastreq->tail->next_td_ptr = -+ cpu_to_hc32(req->head->td_dma & DTD_ADDR_MASK); -+ /* Read prime bit, if 1 goto done */ -+ if (fsl_readl(&dr_regs->endpointprime) & bitmask) -+ goto out; -+ -+ do { -+ /* Set ATDTW bit in USBCMD */ -+ temp = fsl_readl(&dr_regs->usbcmd); -+ fsl_writel(temp | USB_CMD_ATDTW, &dr_regs->usbcmd); -+ -+ /* Read correct status bit */ -+ tmp_stat = fsl_readl(&dr_regs->endptstatus) & bitmask; -+ -+ } while (!(fsl_readl(&dr_regs->usbcmd) & USB_CMD_ATDTW)); -+ -+ /* Write ATDTW bit to 0 */ -+ temp = fsl_readl(&dr_regs->usbcmd); -+ fsl_writel(temp & ~USB_CMD_ATDTW, &dr_regs->usbcmd); -+ -+ if (tmp_stat) -+ goto out; -+ } -+ -+ /* Write dQH next pointer and terminate bit to 0 */ -+ temp = req->head->td_dma & EP_QUEUE_HEAD_NEXT_POINTER_MASK; -+ dQH->next_dtd_ptr = cpu_to_hc32(temp); -+ -+ /* Clear active and halt bit */ -+ temp = cpu_to_hc32(~(EP_QUEUE_HEAD_STATUS_ACTIVE -+ | EP_QUEUE_HEAD_STATUS_HALT)); -+ dQH->size_ioc_int_sts &= temp; -+ -+ /* Prime endpoint by writing 1 to ENDPTPRIME */ -+ temp = ep_is_in(ep) -+ ? (1 << (ep_index(ep) + 16)) -+ : (1 << (ep_index(ep))); -+ fsl_writel(temp, &dr_regs->endpointprime); -+out: -+ return 0; -+} -+ -+/* Fill in the dTD structure -+ * @req: request that the transfer belongs to -+ * @length: return actually data length of the dTD -+ * @dma: return dma address of the dTD -+ * @is_last: return flag if it is the last dTD of the request -+ * return: pointer to the built dTD */ -+static struct ep_td_struct *fsl_build_dtd(struct fsl_req *req, unsigned *length, -+ dma_addr_t *dma, int *is_last) -+{ -+ u32 swap_temp; -+ struct ep_td_struct *dtd; -+ -+ /* how big will this transfer be? */ -+ *length = min(req->req.length - req->req.actual, -+ (unsigned)EP_MAX_LENGTH_TRANSFER); -+ -+ dtd = dma_pool_alloc(udc_controller->td_pool, GFP_KERNEL, dma); -+ if (dtd == NULL) -+ return dtd; -+ -+ dtd->td_dma = *dma; -+ /* Clear reserved field */ -+ swap_temp = hc32_to_cpu(dtd->size_ioc_sts); -+ swap_temp &= ~DTD_RESERVED_FIELDS; -+ dtd->size_ioc_sts = cpu_to_hc32(swap_temp); -+ -+ /* Init all of buffer page pointers */ -+ swap_temp = (u32) (req->req.dma + req->req.actual); -+ dtd->buff_ptr0 = cpu_to_hc32(swap_temp); -+ dtd->buff_ptr1 = cpu_to_hc32(swap_temp + 0x1000); -+ dtd->buff_ptr2 = cpu_to_hc32(swap_temp + 0x2000); -+ dtd->buff_ptr3 = cpu_to_hc32(swap_temp + 0x3000); -+ dtd->buff_ptr4 = cpu_to_hc32(swap_temp + 0x4000); -+ -+ req->req.actual += *length; -+ -+ /* zlp is needed if req->req.zero is set */ -+ if (req->req.zero) { -+ if (*length == 0 || (*length % req->ep->ep.maxpacket) != 0) -+ *is_last = 1; -+ else -+ *is_last = 0; -+ } else if (req->req.length == req->req.actual) -+ *is_last = 1; -+ else -+ *is_last = 0; -+ -+ if ((*is_last) == 0) -+ VDBG("multi-dtd request!\n"); -+ /* Fill in the transfer size; set active bit */ -+ swap_temp = ((*length << DTD_LENGTH_BIT_POS) | DTD_STATUS_ACTIVE); -+ -+ /* Enable interrupt for the last dtd of a request */ -+ if (*is_last && !req->req.no_interrupt) -+ swap_temp |= DTD_IOC; -+ -+ dtd->size_ioc_sts = cpu_to_hc32(swap_temp); -+ -+ mb(); -+ -+ VDBG("length = %d address= 0x%x", *length, (int)*dma); -+ -+ return dtd; -+} -+ -+/* Generate dtd chain for a request */ -+static int fsl_req_to_dtd(struct fsl_req *req) -+{ -+ unsigned count; -+ int is_last; -+ int is_first = 1; -+ struct ep_td_struct *last_dtd = NULL, *dtd; -+ dma_addr_t dma; -+ -+ do { -+ dtd = fsl_build_dtd(req, &count, &dma, &is_last); -+ if (dtd == NULL) -+ return -ENOMEM; -+ -+ if (is_first) { -+ is_first = 0; -+ req->head = dtd; -+ } else { -+ last_dtd->next_td_ptr = hc32_to_cpu(dma); -+ last_dtd->next_td_virt = dtd; -+ } -+ last_dtd = dtd; -+ -+ req->dtd_count++; -+ } while (!is_last); -+ -+ dtd->next_td_ptr = cpu_to_hc32(DTD_NEXT_TERMINATE); -+ -+ req->tail = dtd; -+ -+ return 0; -+} -+ -+/* queues (submits) an I/O request to an endpoint */ -+static int -+fsl_ep_queue(struct usb_ep *_ep, struct usb_request *_req, gfp_t gfp_flags) -+{ -+ struct fsl_ep *ep = container_of(_ep, struct fsl_ep, ep); -+ struct fsl_req *req = container_of(_req, struct fsl_req, req); -+ struct fsl_udc *udc; -+ unsigned long flags; -+ int is_iso = 0; -+ -+ /* catch various bogus parameters */ -+ if (!_req || !req->req.complete || !req->req.buf -+ || !list_empty(&req->queue)) { -+ VDBG("%s, bad params\n", __FUNCTION__); -+ return -EINVAL; -+ } -+ if (!_ep || (!ep->desc && ep_index(ep))) { -+ VDBG("%s, bad ep\n", __FUNCTION__); -+ return -EINVAL; -+ } -+ if (ep->desc->bmAttributes == USB_ENDPOINT_XFER_ISOC) { -+ if (req->req.length > ep->ep.maxpacket) -+ return -EMSGSIZE; -+ is_iso = 1; -+ } -+ -+ udc = ep->udc; -+ if (!udc->driver || udc->gadget.speed == USB_SPEED_UNKNOWN) -+ return -ESHUTDOWN; -+ -+ req->ep = ep; -+ -+ /* map virtual address to hardware */ -+ if (req->req.dma == DMA_ADDR_INVALID) { -+ req->req.dma = dma_map_single(ep->udc->gadget.dev.parent, -+ req->req.buf, -+ req->req.length, ep_is_in(ep) -+ ? DMA_TO_DEVICE -+ : DMA_FROM_DEVICE); -+ req->mapped = 1; -+ } else { -+ dma_sync_single_for_device(ep->udc->gadget.dev.parent, -+ req->req.dma, req->req.length, -+ ep_is_in(ep) -+ ? DMA_TO_DEVICE -+ : DMA_FROM_DEVICE); -+ req->mapped = 0; -+ } -+ -+ req->req.status = -EINPROGRESS; -+ req->req.actual = 0; -+ req->dtd_count = 0; -+ -+ spin_lock_irqsave(&udc->lock, flags); -+ -+ /* build dtds and push them to device queue */ -+ if (!fsl_req_to_dtd(req)) { -+ fsl_queue_td(ep, req); -+ } else { -+ spin_unlock_irqrestore(&udc->lock, flags); -+ return -ENOMEM; -+ } -+ -+ /* Update ep0 state */ -+ if ((ep_index(ep) == 0)) -+ udc->ep0_state = DATA_STATE_XMIT; -+ -+ /* irq handler advances the queue */ -+ if (req != NULL) -+ list_add_tail(&req->queue, &ep->queue); -+ spin_unlock_irqrestore(&udc->lock, flags); -+ -+ return 0; -+} -+ -+/* dequeues (cancels, unlinks) an I/O request from an endpoint */ -+static int fsl_ep_dequeue(struct usb_ep *_ep, struct usb_request *_req) -+{ -+ struct fsl_ep *ep = container_of(_ep, struct fsl_ep, ep); -+ struct fsl_req *req; -+ unsigned long flags; -+ int ep_num, stopped, ret = 0; -+ u32 epctrl; -+ -+ if (!_ep || !_req) -+ return -EINVAL; -+ -+ spin_lock_irqsave(&ep->udc->lock, flags); -+ stopped = ep->stopped; -+ -+ /* Stop the ep before we deal with the queue */ -+ ep->stopped = 1; -+ ep_num = ep_index(ep); -+ epctrl = fsl_readl(&dr_regs->endptctrl[ep_num]); -+ if (ep_is_in(ep)) -+ epctrl &= ~EPCTRL_TX_ENABLE; -+ else -+ epctrl &= ~EPCTRL_RX_ENABLE; -+ fsl_writel(epctrl, &dr_regs->endptctrl[ep_num]); -+ -+ /* make sure it's actually queued on this endpoint */ -+ list_for_each_entry(req, &ep->queue, queue) { -+ if (&req->req == _req) -+ break; -+ } -+ if (&req->req != _req) { -+ ret = -EINVAL; -+ goto out; -+ } -+ -+ /* The request is in progress, or completed but not dequeued */ -+ if (ep->queue.next == &req->queue) { -+ _req->status = -ECONNRESET; -+ fsl_ep_fifo_flush(_ep); /* flush current transfer */ -+ -+ /* The request isn't the last request in this ep queue */ -+ if (req->queue.next != &ep->queue) { -+ struct ep_queue_head *qh; -+ struct fsl_req *next_req; -+ -+ qh = ep->qh; -+ next_req = list_entry(req->queue.next, struct fsl_req, -+ queue); -+ -+ /* Point the QH to the first TD of next request */ -+ fsl_writel((u32) next_req->head, &qh->curr_dtd_ptr); -+ } -+ -+ /* The request hasn't been processed, patch up the TD chain */ -+ } else { -+ struct fsl_req *prev_req; -+ -+ prev_req = list_entry(req->queue.prev, struct fsl_req, queue); -+ fsl_writel(fsl_readl(&req->tail->next_td_ptr), -+ &prev_req->tail->next_td_ptr); -+ -+ } -+ -+ done(ep, req, -ECONNRESET); -+ -+ /* Enable EP */ -+out: epctrl = fsl_readl(&dr_regs->endptctrl[ep_num]); -+ if (ep_is_in(ep)) -+ epctrl |= EPCTRL_TX_ENABLE; -+ else -+ epctrl |= EPCTRL_RX_ENABLE; -+ fsl_writel(epctrl, &dr_regs->endptctrl[ep_num]); -+ ep->stopped = stopped; -+ -+ spin_unlock_irqrestore(&ep->udc->lock, flags); -+ return ret; -+} -+ -+/*-------------------------------------------------------------------------*/ -+ -+/*----------------------------------------------------------------- -+ * modify the endpoint halt feature -+ * @ep: the non-isochronous endpoint being stalled -+ * @value: 1--set halt 0--clear halt -+ * Returns zero, or a negative error code. -+*----------------------------------------------------------------*/ -+static int fsl_ep_set_halt(struct usb_ep *_ep, int value) -+{ -+ struct fsl_ep *ep = NULL; -+ unsigned long flags = 0; -+ int status = -EOPNOTSUPP; /* operation not supported */ -+ unsigned char ep_dir = 0, ep_num = 0; -+ struct fsl_udc *udc = NULL; -+ -+ ep = container_of(_ep, struct fsl_ep, ep); -+ udc = ep->udc; -+ if (!_ep || !ep->desc) { -+ status = -EINVAL; -+ goto out; -+ } -+ -+ if (ep->desc->bmAttributes == USB_ENDPOINT_XFER_ISOC) { -+ status = -EOPNOTSUPP; -+ goto out; -+ } -+ -+ /* Attempt to halt IN ep will fail if any transfer requests -+ * are still queue */ -+ if (value && ep_is_in(ep) && !list_empty(&ep->queue)) { -+ status = -EAGAIN; -+ goto out; -+ } -+ -+ status = 0; -+ ep_dir = ep_is_in(ep) ? USB_SEND : USB_RECV; -+ ep_num = (unsigned char)(ep_index(ep)); -+ spin_lock_irqsave(&ep->udc->lock, flags); -+ dr_ep_change_stall(ep_num, ep_dir, value); -+ spin_unlock_irqrestore(&ep->udc->lock, flags); -+ -+ if (ep_index(ep) == 0) { -+ udc->ep0_state = WAIT_FOR_SETUP; -+ udc->ep0_dir = 0; -+ } -+out: -+ VDBG(" %s %s halt stat %d", ep->ep.name, -+ value ? "set" : "clear", status); -+ -+ return status; -+} -+ -+static void fsl_ep_fifo_flush(struct usb_ep *_ep) -+{ -+ struct fsl_ep *ep; -+ int ep_num, ep_dir; -+ u32 bits; -+ unsigned long timeout; -+#define FSL_UDC_FLUSH_TIMEOUT 1000 -+ -+ if (!_ep) { -+ return; -+ } else { -+ ep = container_of(_ep, struct fsl_ep, ep); -+ if (!ep->desc) -+ return; -+ } -+ ep_num = ep_index(ep); -+ ep_dir = ep_is_in(ep) ? USB_SEND : USB_RECV; -+ -+ if (ep_num == 0) -+ bits = (1 << 16) | 1; -+ else if (ep_dir == USB_SEND) -+ bits = 1 << (16 + ep_num); -+ else -+ bits = 1 << ep_num; -+ -+ timeout = jiffies + FSL_UDC_FLUSH_TIMEOUT; -+ do { -+ fsl_writel(bits, &dr_regs->endptflush); -+ -+ /* Wait until flush complete */ -+ while (fsl_readl(&dr_regs->endptflush)) { -+ if (time_after(jiffies, timeout)) { -+ ERR("ep flush timeout\n"); -+ return; -+ } -+ cpu_relax(); -+ } -+ /* See if we need to flush again */ -+ } while (fsl_readl(&dr_regs->endptstatus) & bits); -+} -+ -+static struct usb_ep_ops fsl_ep_ops = { -+ .enable = fsl_ep_enable, -+ .disable = fsl_ep_disable, -+ -+ .alloc_request = fsl_alloc_request, -+ .free_request = fsl_free_request, -+ -+ .queue = fsl_ep_queue, -+ .dequeue = fsl_ep_dequeue, -+ -+ .set_halt = fsl_ep_set_halt, -+ .fifo_flush = fsl_ep_fifo_flush, /* flush fifo */ -+}; -+ -+/*------------------------------------------------------------------------- -+ Gadget Driver Layer Operations -+-------------------------------------------------------------------------*/ -+ -+/*---------------------------------------------------------------------- -+ * Get the current frame number (from DR frame_index Reg ) -+ *----------------------------------------------------------------------*/ -+static int fsl_get_frame(struct usb_gadget *gadget) -+{ -+ return (int)(fsl_readl(&dr_regs->frindex) & USB_FRINDEX_MASKS); -+} -+ -+/*----------------------------------------------------------------------- -+ * Tries to wake up the host connected to this gadget -+ -----------------------------------------------------------------------*/ -+static int fsl_wakeup(struct usb_gadget *gadget) -+{ -+ struct fsl_udc *udc = container_of(gadget, struct fsl_udc, gadget); -+ u32 portsc; -+ -+ /* Remote wakeup feature not enabled by host */ -+ if (!udc->remote_wakeup) -+ return -ENOTSUPP; -+ -+ portsc = fsl_readl(&dr_regs->portsc1); -+ /* not suspended? */ -+ if (!(portsc & PORTSCX_PORT_SUSPEND)) -+ return 0; -+ /* trigger force resume */ -+ portsc |= PORTSCX_PORT_FORCE_RESUME; -+ fsl_writel(portsc, &dr_regs->portsc1); -+ return 0; -+} -+ -+static int can_pullup(struct fsl_udc *udc) -+{ -+ return udc->driver && udc->softconnect && udc->vbus_active; -+} -+ -+/* -+ * Notify controller that VBUS is powered, Called by whatever -+ * detects VBUS sessions -+ * @param gadger gadger pointer -+ * @param is_active is active? -+ * @return Returns zero on success , or a negative error code -+ */ -+static int fsl_vbus_session(struct usb_gadget *gadget, int is_active) -+{ -+ struct fsl_udc *udc; -+ unsigned long flags; -+ -+ udc = container_of(gadget, struct fsl_udc, gadget); -+ spin_lock_irqsave(&udc->lock, flags); -+ -+ pr_debug("udc: VBUS %s\n", is_active ? "on" : "off"); -+ udc->vbus_active = (is_active != 0); -+ -+ if (can_pullup(udc)) { -+ pullup_enable(udc); -+ udc_controller->usb_state = USB_STATE_ATTACHED; -+ } else { -+ pullup_disable(udc); -+ udc_controller->usb_state = USB_STATE_NOTATTACHED; -+ } -+ udc_controller->ep0_state = WAIT_FOR_SETUP; -+ udc_controller->ep0_dir = 0; -+ -+ spin_unlock_irqrestore(&udc->lock, flags); -+ return 0; -+} -+ -+/* constrain controller's VBUS power usage -+ * This call is used by gadget drivers during SET_CONFIGURATION calls, -+ * reporting how much power the device may consume. For example, this -+ * could affect how quickly batteries are recharged. -+ * -+ * Returns zero on success, else negative errno. -+ */ -+static int fsl_vbus_draw(struct usb_gadget *gadget, unsigned mA) -+{ -+#ifdef CONFIG_USB_OTG -+ struct fsl_udc *udc; -+ -+ udc = container_of(gadget, struct fsl_udc, gadget); -+ -+ if (udc->transceiver) -+ return otg_set_power(udc->transceiver, mA); -+#endif -+ return -ENOTSUPP; -+} -+ -+/* -+ * Change Data+ pullup status -+ * this func is used by usb_gadget_connect/disconnet -+ */ -+static int fsl_pullup(struct usb_gadget *gadget, int is_on) -+{ -+ struct fsl_udc *udc; -+ -+ udc = container_of(gadget, struct fsl_udc, gadget); -+ udc->softconnect = (is_on != 0); -+ if (can_pullup(udc)) -+ fsl_writel((fsl_readl(&dr_regs->usbcmd) | USB_CMD_RUN_STOP), -+ &dr_regs->usbcmd); -+ else -+ fsl_writel((fsl_readl(&dr_regs->usbcmd) & ~USB_CMD_RUN_STOP), -+ &dr_regs->usbcmd); -+ -+ return 0; -+} -+ -+/* defined in usb_gadget.h */ -+static struct usb_gadget_ops fsl_gadget_ops = { -+ .get_frame = fsl_get_frame, -+ .wakeup = fsl_wakeup, -+ .vbus_session = fsl_vbus_session, -+ .vbus_draw = fsl_vbus_draw, -+ .pullup = fsl_pullup, -+}; -+ -+/* Set protocol stall on ep0, protocol stall will automatically be cleared -+ on new transaction */ -+static void ep0stall(struct fsl_udc *udc) -+{ -+ u32 tmp; -+ -+ /* must set tx and rx to stall at the same time */ -+ tmp = fsl_readl(&dr_regs->endptctrl[0]); -+ tmp |= EPCTRL_TX_EP_STALL | EPCTRL_RX_EP_STALL; -+ fsl_writel(tmp, &dr_regs->endptctrl[0]); -+ udc->ep0_state = WAIT_FOR_SETUP; -+ udc->ep0_dir = 0; -+} -+ -+/* Prime a status phase for ep0 */ -+static int ep0_prime_status(struct fsl_udc *udc, int direction) -+{ -+ struct fsl_req *req = udc->status_req; -+ struct fsl_ep *ep; -+ int status = 0; -+ -+ if (direction == EP_DIR_IN) -+ udc->ep0_dir = USB_DIR_IN; -+ else -+ udc->ep0_dir = USB_DIR_OUT; -+ -+ ep = &udc->eps[0]; -+ udc->ep0_state = WAIT_FOR_OUT_STATUS; -+ -+ req->ep = ep; -+ req->req.length = 0; -+ req->req.status = -EINPROGRESS; -+ req->req.actual = 0; -+ req->req.complete = NULL; -+ req->dtd_count = 0; -+ -+ if (fsl_req_to_dtd(req) == 0) -+ status = fsl_queue_td(ep, req); -+ else -+ return -ENOMEM; -+ -+ if (status) -+ ERR("Can't queue ep0 status request \n"); -+ list_add_tail(&req->queue, &ep->queue); -+ -+ return status; -+} -+ -+static inline int udc_reset_ep_queue(struct fsl_udc *udc, u8 pipe) -+{ -+ struct fsl_ep *ep = get_ep_by_pipe(udc, pipe); -+ -+ if (!ep->name) -+ return 0; -+ -+ nuke(ep, -ESHUTDOWN); -+ -+ return 0; -+} -+ -+/* -+ * ch9 Set address -+ */ -+static void ch9setaddress(struct fsl_udc *udc, u16 value, u16 index, u16 length) -+{ -+ /* Save the new address to device struct */ -+ udc->device_address = (u8) value; -+ /* Update usb state */ -+ udc->usb_state = USB_STATE_ADDRESS; -+ /* Status phase */ -+ if (ep0_prime_status(udc, EP_DIR_IN)) -+ ep0stall(udc); -+} -+ -+/* -+ * ch9 Get status -+ */ -+static void ch9getstatus(struct fsl_udc *udc, u8 request_type, u16 value, -+ u16 index, u16 length) -+{ -+ u16 tmp = 0; /* Status, cpu endian */ -+ -+ struct fsl_req *req; -+ struct fsl_ep *ep; -+ int status = 0; -+ -+ ep = &udc->eps[0]; -+ -+ if ((request_type & USB_RECIP_MASK) == USB_RECIP_DEVICE) { -+ /* Get device status */ -+ tmp = 1 << USB_DEVICE_SELF_POWERED; -+ tmp |= udc->remote_wakeup << USB_DEVICE_REMOTE_WAKEUP; -+ } else if ((request_type & USB_RECIP_MASK) == USB_RECIP_INTERFACE) { -+ /* Get interface status */ -+ /* We don't have interface information in udc driver */ -+ tmp = 0; -+ } else if ((request_type & USB_RECIP_MASK) == USB_RECIP_ENDPOINT) { -+ /* Get endpoint status */ -+ struct fsl_ep *target_ep; -+ -+ target_ep = get_ep_by_pipe(udc, get_pipe_by_windex(index)); -+ -+ /* stall if endpoint doesn't exist */ -+ if (!target_ep->desc) -+ goto stall; -+ tmp = dr_ep_get_stall(ep_index(target_ep), ep_is_in(target_ep)) -+ << USB_ENDPOINT_HALT; -+ } -+ -+ udc->ep0_dir = USB_DIR_IN; -+ /* Borrow the per device status_req */ -+ req = udc->status_req; -+ /* Fill in the reqest structure */ -+ *((u16 *) req->req.buf) = cpu_to_le16(tmp); -+ req->ep = ep; -+ req->req.length = 2; -+ req->req.status = -EINPROGRESS; -+ req->req.actual = 0; -+ req->req.complete = NULL; -+ req->dtd_count = 0; -+ -+ /* prime the data phase */ -+ if ((fsl_req_to_dtd(req) == 0)) -+ status = fsl_queue_td(ep, req); -+ else /* no mem */ -+ goto stall; -+ -+ if (status) { -+ ERR("Can't respond to getstatus request \n"); -+ goto stall; -+ } -+ list_add_tail(&req->queue, &ep->queue); -+ udc->ep0_state = DATA_STATE_XMIT; -+ return; -+stall: -+ ep0stall(udc); -+} -+ -+static void ch9setconfig(struct fsl_udc *udc, u16 value, u16 index, -+ u16 length) -+{ -+ pr_debug("udc: 1 calling gadget driver->setup\n"); -+ udc->ep0_dir = USB_DIR_IN; -+ if (udc->driver->setup(&udc->gadget, &udc->local_setup_buff) >= 0) { -+ /* gadget layer deal with the status phase */ -+ udc->usb_state = USB_STATE_CONFIGURED; -+ udc->ep0_state = WAIT_FOR_OUT_STATUS; -+ pr_debug("udc: ep0_state now WAIT_FOR_OUT_STATUS\n"); -+ } -+} -+ -+static void setup_received_irq(struct fsl_udc *udc, -+ struct usb_ctrlrequest *setup) -+{ -+ u32 tmp; -+ u16 ptc = 0; /* port test control */ -+ int handled = 1; /* set to zero if we do not handle the message, -+ and should pass it to the gadget driver */ -+ -+ /* -+ * gadget drivers expect the setup pkt to be in wire format, -+ * so leave it alone and make local copies of stuff we need. -+ */ -+ u16 wValue = le16_to_cpu(setup->wValue); -+ u16 wIndex = le16_to_cpu(setup->wIndex); -+ u16 wLength = le16_to_cpu(setup->wLength); -+ -+ -+ pr_debug("udc: request=0x%x\n", setup->bRequest); -+ -+ udc_reset_ep_queue(udc, 0); -+ -+ /* We asume setup only occurs on EP0 */ -+ if (setup->bRequestType & USB_DIR_IN) -+ udc->ep0_dir = USB_DIR_IN; -+ else -+ udc->ep0_dir = USB_DIR_OUT; -+ -+ if ((setup->bRequestType & USB_TYPE_MASK) == USB_TYPE_CLASS) { -+ /* handle class requests */ -+ switch (setup->bRequest) { -+ -+ case USB_BULK_RESET_REQUEST: -+ udc->ep0_dir = USB_DIR_IN; -+ if (udc->driver->setup(&udc->gadget, -+ &udc->local_setup_buff) >= 0) { -+ udc->ep0_state = WAIT_FOR_SETUP; -+ pr_debug("udc: ep0_state now WAIT_FOR_SETUP\n"); -+ } -+ break; -+ -+ default: -+ handled = 0; -+ break; -+ } -+ } else if ((setup->bRequestType & USB_TYPE_MASK) == USB_TYPE_STANDARD) { -+ /* handle standard requests */ -+ switch (setup->bRequest) { -+ -+ case USB_REQ_GET_STATUS: -+ if ((setup-> -+ bRequestType & (USB_DIR_IN | USB_TYPE_STANDARD)) -+ != (USB_DIR_IN | USB_TYPE_STANDARD)) -+ break; -+ ch9getstatus(udc, setup->bRequestType, wValue, wIndex, -+ wLength); -+ break; -+ -+ case USB_REQ_SET_ADDRESS: -+ if (setup->bRequestType != -+ (USB_DIR_OUT | USB_TYPE_STANDARD | -+ USB_RECIP_DEVICE)) -+ break; -+ ch9setaddress(udc, wValue, wIndex, wLength); -+ break; -+ -+ case USB_REQ_SET_CONFIGURATION: -+ if (setup->bRequestType != -+ (USB_DIR_OUT | USB_TYPE_STANDARD | -+ USB_RECIP_DEVICE)) -+ break; -+ /* gadget layer take over the status phase */ -+ ch9setconfig(udc, wValue, wIndex, wLength); -+ break; -+ case USB_REQ_SET_INTERFACE: -+ if (setup->bRequestType != -+ (USB_DIR_OUT | USB_TYPE_STANDARD | -+ USB_RECIP_INTERFACE)) -+ break; -+ udc->ep0_dir = USB_DIR_IN; -+ if (udc->driver->setup(&udc->gadget, -+ &udc->local_setup_buff) >= 0) -+ /* gadget layer take over the status phase */ -+ break; -+ /* Requests with no data phase */ -+ case USB_REQ_CLEAR_FEATURE: -+ case USB_REQ_SET_FEATURE: -+ { /* status transaction */ -+ int rc = -EOPNOTSUPP; -+ -+ if ((setup->bRequestType & USB_TYPE_MASK) != -+ USB_TYPE_STANDARD) -+ break; -+ -+ /* we only support set/clear feature for -+ * endpoint */ -+ if (setup->bRequestType == USB_RECIP_ENDPOINT) { -+ int dir = (wIndex & 0x0080) ? -+ EP_DIR_IN : EP_DIR_OUT; -+ int num = (wIndex & 0x000f); -+ struct fsl_ep *ep; -+ -+ if (wValue != 0 -+ || wLength != 0 -+ || (num * 2 + dir) > udc->max_ep) -+ break; -+ ep = &udc->eps[num * 2 + dir]; -+ -+ if (setup->bRequest == -+ USB_REQ_SET_FEATURE) { -+ pr_debug("udc: udc: SET_FEATURE" -+ " doing set_halt\n"); -+ rc = fsl_ep_set_halt(&ep-> ep, -+ 1); -+ } else { -+ pr_debug("udc: CLEAR_FEATURE" -+ " doing clear_halt\n"); -+ rc = fsl_ep_set_halt(&ep-> ep, -+ 0); -+ } -+ -+ } else if (setup->bRequestType == -+ USB_RECIP_DEVICE) { -+ if (setup->bRequest == -+ USB_REQ_SET_FEATURE) { -+ ptc = wIndex >> 8; -+ rc = 0; -+ } -+ if (!udc->gadget.is_otg) -+ break; -+ else if (setup->bRequest == -+ USB_DEVICE_B_HNP_ENABLE) -+ udc->gadget.b_hnp_enable = 1; -+ else if (setup->bRequest == -+ USB_DEVICE_A_HNP_SUPPORT) -+ udc->gadget.a_hnp_support = 1; -+ else if (setup->bRequest == -+ USB_DEVICE_A_ALT_HNP_SUPPORT) -+ udc->gadget.a_alt_hnp_support = -+ 1; -+ rc = 0; -+ } -+ if (rc == 0) { -+ /* send status only if -+ * fsl_ep_set_halt success */ -+ if (ep0_prime_status(udc, EP_DIR_IN)) -+ ep0stall(udc); -+ } -+ break; -+ } -+ default: -+ handled = 0; -+ break; -+ } -+ } else { -+ /* vendor requests */ -+ handled = 0; -+ } -+ -+ if (!handled) { -+ if (udc->driver->setup(&udc->gadget, &udc->local_setup_buff) -+ != 0) { -+ ep0stall(udc); -+ } else if (setup->bRequestType & USB_DIR_IN) { -+ udc->ep0_state = DATA_STATE_XMIT; -+ pr_debug("udc: ep0_state now DATA_STATE_XMIT\n"); -+ } else { -+ udc->ep0_state = DATA_STATE_RECV; -+ pr_debug("udc: ep0_state now DATA_STATE_RECV\n"); -+ } -+ } -+ -+ if (ptc) { -+ tmp =fsl_readl(&dr_regs->portsc1) | ptc << 16; -+ fsl_writel(tmp, &dr_regs->portsc1); -+ pr_debug("udc: switch to test mode.\n"); -+ } -+} -+ -+/* Process request for Data or Status phase of ep0 -+ * prime status phase if needed */ -+static void ep0_req_complete(struct fsl_udc *udc, struct fsl_ep *ep0, -+ struct fsl_req *req) -+{ -+ if (udc->usb_state == USB_STATE_ADDRESS) { -+ /* Set the new address */ -+ u32 new_address = (u32) udc->device_address; -+ fsl_writel(new_address << USB_DEVICE_ADDRESS_BIT_POS, -+ &dr_regs->deviceaddr); -+ } -+ -+ done(ep0, req, 0); -+ -+ switch (udc->ep0_state) { -+ case DATA_STATE_XMIT: -+ /* receive status phase */ -+ if (ep0_prime_status(udc, EP_DIR_OUT)) -+ ep0stall(udc); -+ break; -+ case DATA_STATE_RECV: -+ /* send status phase */ -+ if (ep0_prime_status(udc, EP_DIR_IN)) -+ ep0stall(udc); -+ break; -+ case WAIT_FOR_OUT_STATUS: -+ udc->ep0_state = WAIT_FOR_SETUP; -+ break; -+ case WAIT_FOR_SETUP: -+ ERR("Unexpect ep0 packets \n"); -+ break; -+ default: -+ ep0stall(udc); -+ break; -+ } -+} -+ -+/* Tripwire mechanism to ensure a setup packet payload is extracted without -+ * being corrupted by another incoming setup packet */ -+static void tripwire_handler(struct fsl_udc *udc, u8 ep_num, u8 *buffer_ptr) -+{ -+ u32 temp; -+ struct ep_queue_head *qh; -+ struct fsl_usb2_platform_data *pdata = udc->pdata; -+ -+ qh = &udc->ep_qh[ep_num * 2 + EP_DIR_OUT]; -+ -+ /* Clear bit in ENDPTSETUPSTAT */ -+ temp = fsl_readl(&dr_regs->endptsetupstat); -+ fsl_writel(temp | (1 << ep_num), &dr_regs->endptsetupstat); -+ -+ /* while a hazard exists when setup package arrives */ -+ do { -+ /* Set Setup Tripwire */ -+ temp = fsl_readl(&dr_regs->usbcmd); -+ fsl_writel(temp | USB_CMD_SUTW, &dr_regs->usbcmd); -+ -+ /* Copy the setup packet to local buffer */ -+ if (pdata->le_setup_buf) { -+ u32 *p = (u32 *)buffer_ptr; -+ u32 *s = (u32 *)qh->setup_buffer; -+ -+ /* Convert little endian setup buffer to CPU endian */ -+ *p++ = le32_to_cpu(*s++); -+ *p = le32_to_cpu(*s); -+ } else { -+ memcpy(buffer_ptr, (u8 *) qh->setup_buffer, 8); -+ } -+ } while (!(fsl_readl(&dr_regs->usbcmd) & USB_CMD_SUTW)); -+ -+ /* Clear Setup Tripwire */ -+ temp = fsl_readl(&dr_regs->usbcmd); -+ fsl_writel(temp & ~USB_CMD_SUTW, &dr_regs->usbcmd); -+} -+ -+/* process-ep_req(): free the completed Tds for this req */ -+static int process_ep_req(struct fsl_udc *udc, int pipe, -+ struct fsl_req *curr_req) -+{ -+ struct ep_td_struct *curr_td; -+ int td_complete, actual, remaining_length, j, tmp; -+ int status = 0; -+ int errors = 0; -+ struct ep_queue_head *curr_qh = &udc->ep_qh[pipe]; -+ int direction = pipe % 2; -+ -+ curr_td = curr_req->head; -+ td_complete = 0; -+ actual = curr_req->req.length; -+ -+ for (j = 0; j < curr_req->dtd_count; j++) { -+ remaining_length = (hc32_to_cpu(curr_td->size_ioc_sts) -+ & DTD_PACKET_SIZE) -+ >> DTD_LENGTH_BIT_POS; -+ actual -= remaining_length; -+ -+ (errors = hc32_to_cpu(curr_td->size_ioc_sts) & DTD_ERROR_MASK); -+ if (errors) { -+ if (errors & DTD_STATUS_HALTED) { -+ ERR("dTD error %08x QH=%d\n", errors, pipe); -+ /* Clear the errors and Halt condition */ -+ tmp = hc32_to_cpu(curr_qh->size_ioc_int_sts); -+ tmp &= ~errors; -+ curr_qh->size_ioc_int_sts = cpu_to_hc32(tmp); -+ status = -EPIPE; -+ /* FIXME: continue with next queued TD? */ -+ -+ break; -+ } -+ if (errors & DTD_STATUS_DATA_BUFF_ERR) { -+ VDBG("Transfer overflow"); -+ status = -EPROTO; -+ break; -+ } else if (errors & DTD_STATUS_TRANSACTION_ERR) { -+ VDBG("ISO error"); -+ status = -EILSEQ; -+ break; -+ } else -+ ERR("Unknown error has occured (0x%x)!\r\n", -+ errors); -+ -+ } else if (hc32_to_cpu(curr_td->size_ioc_sts) & -+ DTD_STATUS_ACTIVE) { -+ VDBG("Request not complete"); -+ status = REQ_UNCOMPLETE; -+ return status; -+ } else if (remaining_length) { -+ if (direction) { -+ VDBG("Transmit dTD remaining length not zero"); -+ status = -EPROTO; -+ break; -+ } else { -+ td_complete++; -+ break; -+ } -+ } else { -+ td_complete++; -+ VDBG("dTD transmitted successful "); -+ } -+ -+ if (j != curr_req->dtd_count - 1) -+ curr_td = curr_td->next_td_virt; -+ } -+ -+ if (status) -+ return status; -+ -+ curr_req->req.actual = actual; -+ -+ return 0; -+} -+ -+/* Process a DTD completion interrupt */ -+static void dtd_complete_irq(struct fsl_udc *udc) -+{ -+ u32 bit_pos; -+ int i, ep_num, direction, bit_mask, status; -+ struct fsl_ep *curr_ep; -+ struct fsl_req *curr_req, *temp_req; -+ -+ /* Clear the bits in the register */ -+ bit_pos = fsl_readl(&dr_regs->endptcomplete); -+ fsl_writel(bit_pos, &dr_regs->endptcomplete); -+ -+ if (!bit_pos) -+ return; -+ -+ for (i = 0; i < udc->max_ep * 2; i++) { -+ ep_num = i >> 1; -+ direction = i % 2; -+ -+ bit_mask = 1 << (ep_num + 16 * direction); -+ -+ if (!(bit_pos & bit_mask)) -+ continue; -+ -+ curr_ep = get_ep_by_pipe(udc, i); -+ -+ /* If the ep is configured */ -+ if (curr_ep->name == NULL) { -+ WARN("Invalid EP?"); -+ continue; -+ } -+ -+ /* process the req queue until an uncomplete request */ -+ list_for_each_entry_safe(curr_req, temp_req, &curr_ep->queue, -+ queue) { -+ status = process_ep_req(udc, i, curr_req); -+ -+ VDBG("status of process_ep_req= %d, ep = %d", -+ status, ep_num); -+ if (status == REQ_UNCOMPLETE) -+ break; -+ /* write back status to req */ -+ curr_req->req.status = status; -+ -+ if (ep_num == 0) { -+ ep0_req_complete(udc, curr_ep, curr_req); -+ break; -+ } else { -+ done(curr_ep, curr_req, status); -+ } -+ } -+ } -+} -+ -+/* Process a port change interrupt */ -+static void port_change_irq(struct fsl_udc *udc) -+{ -+ u32 speed; -+ -+ VDBG("portsc=0x%x", fsl_readl(&dr_regs->portsc1) ); -+ if (udc->bus_reset) -+ udc->bus_reset = 0; -+ -+ /* Bus resetting is finished */ -+ if (!(fsl_readl(&dr_regs->portsc1) & PORTSCX_PORT_RESET)) { -+ /* Get the speed */ -+ speed = fsl_readl(&dr_regs->portsc1) & PORTSCX_PORT_SPEED_MASK; -+ switch (speed) { -+ case PORTSCX_PORT_SPEED_HIGH: -+ udc->gadget.speed = USB_SPEED_HIGH; -+ break; -+ case PORTSCX_PORT_SPEED_FULL: -+ udc->gadget.speed = USB_SPEED_FULL; -+ break; -+ case PORTSCX_PORT_SPEED_LOW: -+ udc->gadget.speed = USB_SPEED_LOW; -+ break; -+ default: -+ udc->gadget.speed = USB_SPEED_UNKNOWN; -+ break; -+ } -+ } -+ -+ /* Update USB state */ -+ if (!udc->resume_state) -+ udc->usb_state = USB_STATE_DEFAULT; -+} -+ -+/* Process suspend interrupt */ -+static void suspend_irq(struct fsl_udc *udc) -+{ -+ udc->resume_state = udc->usb_state; -+ udc->usb_state = USB_STATE_SUSPENDED; -+ -+ /* report suspend to the driver, serial.c does not support this */ -+ if (udc->driver->suspend) -+ udc->driver->suspend(&udc->gadget); -+} -+ -+static void bus_resume(struct fsl_udc *udc) -+{ -+ udc->usb_state = udc->resume_state; -+ udc->resume_state = 0; -+ -+ /* report resume to the driver, serial.c does not support this */ -+ if (udc->driver->resume) -+ udc->driver->resume(&udc->gadget); -+} -+ -+/* Clear up all ep queues */ -+static int reset_queues(struct fsl_udc *udc) -+{ -+ u8 pipe; -+ -+ for (pipe = 0; pipe < udc->max_pipes; pipe++) -+ udc_reset_ep_queue(udc, pipe); -+ -+ /* report disconnect; the driver is already quiesced */ -+ udc->driver->disconnect(&udc->gadget); -+ -+ return 0; -+} -+ -+/* Process reset interrupt */ -+static void reset_irq(struct fsl_udc *udc) -+{ -+ u32 temp; -+ unsigned long timeout; -+ -+ /* Clear the device address */ -+ temp = fsl_readl(&dr_regs->deviceaddr); -+ fsl_writel(temp & ~USB_DEVICE_ADDRESS_MASK, &dr_regs->deviceaddr); -+ -+ udc->device_address = 0; -+ -+ /* Clear usb state */ -+ udc->resume_state = 0; -+ udc->ep0_dir = 0; -+ udc->ep0_state = WAIT_FOR_SETUP; -+ udc->remote_wakeup = 0; /* default to 0 on reset */ -+ udc->gadget.b_hnp_enable = 0; -+ udc->gadget.a_hnp_support = 0; -+ udc->gadget.a_alt_hnp_support = 0; -+ -+ /* Clear all the setup token semaphores */ -+ temp = fsl_readl(&dr_regs->endptsetupstat); -+ fsl_writel(temp, &dr_regs->endptsetupstat); -+ -+ /* Clear all the endpoint complete status bits */ -+ temp = fsl_readl(&dr_regs->endptcomplete); -+ fsl_writel(temp, &dr_regs->endptcomplete); -+ -+ timeout = jiffies + 100; -+ while (fsl_readl(&dr_regs->endpointprime)) { -+ /* Wait until all endptprime bits cleared */ -+ if (time_after(jiffies, timeout)) { -+ ERR("Timeout for reset\n"); -+ break; -+ } -+ cpu_relax(); -+ } -+ -+ /* Write 1s to the flush register */ -+ fsl_writel(0xffffffff, &dr_regs->endptflush); -+ -+ if (fsl_readl(&dr_regs->portsc1) & PORTSCX_PORT_RESET) { -+ VDBG("Bus reset"); -+ /* Bus is reseting */ -+ udc->bus_reset = 1; -+ /* Reset all the queues, include XD, dTD, EP queue -+ * head and TR Queue */ -+ reset_queues(udc); -+ udc->usb_state = USB_STATE_DEFAULT; -+ } else { -+ VDBG("Controller reset"); -+ /* initialize usb hw reg except for regs for EP, not -+ * touch usbintr reg */ -+ dr_controller_setup(udc); -+ -+ /* Reset all internal used Queues */ -+ reset_queues(udc); -+ -+ ep0_setup(udc); -+ -+ /* Enable DR IRQ reg, Set Run bit, change udc state */ -+ dr_controller_run(udc); -+ udc->usb_state = USB_STATE_ATTACHED; -+ } -+} -+ -+/* -+ * USB device controller interrupt handler -+ */ -+static irqreturn_t fsl_udc_irq(int irq, void *_udc) -+{ -+ struct fsl_udc *udc = _udc; -+ u32 irq_src; -+ irqreturn_t status = IRQ_NONE; -+ unsigned long flags; -+ -+ /* Disable ISR for OTG host mode */ -+ if (udc->stopped) -+ return IRQ_NONE; -+ spin_lock_irqsave(&udc->lock, flags); -+ irq_src = fsl_readl(&dr_regs->usbsts) & fsl_readl(&dr_regs->usbintr); -+ /* Clear notification bits */ -+ fsl_writel(irq_src, &dr_regs->usbsts); -+ -+ VDBG("irq_src [0x%8x] portsc=0x%x", irq_src, -+ fsl_readl(&dr_regs->portsc1)); -+ -+ /* Need to resume? */ -+ if (udc->usb_state == USB_STATE_SUSPENDED) -+ if ((fsl_readl(&dr_regs->portsc1) & PORTSCX_PORT_SUSPEND) == 0) -+ bus_resume(udc); -+ -+ /* USB Interrupt */ -+ if (irq_src & USB_STS_INT) { -+ VDBG("Packet int"); -+ /* Setup package, we only support ep0 as control ep */ -+ if (fsl_readl(&dr_regs->endptsetupstat) & EP_SETUP_STATUS_EP0) { -+ tripwire_handler(udc, 0, -+ (u8 *) (&udc->local_setup_buff)); -+ setup_received_irq(udc, &udc->local_setup_buff); -+ status = IRQ_HANDLED; -+ } -+ -+ /* completion of dtd */ -+ if (fsl_readl(&dr_regs->endptcomplete)) { -+ dtd_complete_irq(udc); -+ status = IRQ_HANDLED; -+ } -+ } -+ -+ /* SOF (for ISO transfer) */ -+ if (irq_src & USB_STS_SOF) { -+ status = IRQ_HANDLED; -+ } -+ -+ /* Port Change */ -+ if (irq_src & USB_STS_PORT_CHANGE) { -+ port_change_irq(udc); -+ status = IRQ_HANDLED; -+ } -+ -+ /* Reset Received */ -+ if (irq_src & USB_STS_RESET) { -+ reset_irq(udc); -+ status = IRQ_HANDLED; -+ } -+ -+ /* Sleep Enable (Suspend) */ -+ if (irq_src & USB_STS_SUSPEND) { -+ suspend_irq(udc); -+ status = IRQ_HANDLED; -+ } -+ -+ if (irq_src & (USB_STS_ERR | USB_STS_SYS_ERR)) { -+ VDBG("Error IRQ %x ", irq_src); -+ } -+ -+ spin_unlock_irqrestore(&udc->lock, flags); -+ return status; -+} -+ -+/*----------------------------------------------------------------* -+ * Hook to gadget drivers -+ * Called by initialization code of gadget drivers -+*----------------------------------------------------------------*/ -+int usb_gadget_register_driver(struct usb_gadget_driver *driver) -+{ -+ int retval = -ENODEV; -+ unsigned long flags = 0; -+ struct fsl_udc *udc = udc_controller; -+ -+ pr_debug("udc: udc=0x%p\n", udc); -+ -+ if (!udc) -+ return -ENODEV; -+ -+ if (!driver || (driver->speed != USB_SPEED_FULL -+ && driver->speed != USB_SPEED_HIGH) -+ || !driver->bind || !driver->disconnect -+ || !driver->setup) -+ return -EINVAL; -+ -+ if (udc->driver) -+ return -EBUSY; -+ -+ /* lock is needed but whether should use this lock or another */ -+ spin_lock_irqsave(&udc->lock, flags); -+ -+ driver->driver.bus = 0; -+ udc->softconnect = 1; -+ /* hook up the driver */ -+ udc->driver = driver; -+ udc->gadget.dev.driver = &driver->driver; -+ spin_unlock_irqrestore(&udc->lock, flags); -+ -+ /* bind udc driver to gadget driver */ -+ retval = driver->bind(&udc->gadget); -+ if (retval) { -+ pr_debug("bind to %s --> %d\n", driver->driver.name, retval); -+ udc->gadget.dev.driver = 0; -+ udc->driver = 0; -+ goto out; -+ } -+ -+ /* Enable DR IRQ reg and Set usbcmd reg Run bit */ -+ if (udc->transceiver) { -+ /* Suspend the controller until OTG enables it */ -+ udc_suspend(udc); -+ pr_debug("udc: suspend udc for OTG auto detect \n"); -+ -+ /* Export udc suspend/resume call to OTG */ -+ udc->gadget.dev.parent->driver->suspend = fsl_udc_suspend; -+ udc->gadget.dev.parent->driver->resume = fsl_udc_resume; -+ -+ retval = otg_set_peripheral(udc->transceiver, &udc->gadget); -+ if (retval < 0) { -+ printk(KERN_ERR "can't bind to transceiver\n"); -+ driver->unbind(&udc->gadget); -+ udc->gadget.dev.driver = 0; -+ udc->driver = 0; -+ return retval; -+ } -+ } else { -+ /* Enable DR IRQ reg and Set usbcmd reg Run bit */ -+ dr_controller_run(udc); -+ udc->usb_state = USB_STATE_ATTACHED; -+ udc->ep0_state = WAIT_FOR_SETUP; -+ pr_debug("udc: ep0_state now WAIT_FOR_SETUP\n"); -+ udc->ep0_dir = 0; -+ } -+ -+ printk(KERN_INFO "%s: bind to driver %s \n", udc->gadget.name, -+ driver->driver.name); -+ -+out: -+ return retval; -+} -+EXPORT_SYMBOL(usb_gadget_register_driver); -+ -+/* Disconnect from gadget driver */ -+int usb_gadget_unregister_driver(struct usb_gadget_driver *driver) -+{ -+ struct fsl_ep *loop_ep; -+ unsigned long flags; -+ -+ if (!udc_controller) -+ return -ENODEV; -+ -+ if (!driver || driver != udc_controller->driver || !driver->unbind) -+ return -EINVAL; -+ -+#ifdef CONFIG_USB_OTG -+ if (udc_controller->transceiver) -+ (void)otg_set_peripheral(udc_controller->transceiver, 0); -+#endif -+ -+ /* stop DR, disable intr */ -+ dr_controller_stop(udc_controller); -+ -+ /* in fact, no needed */ -+ udc_controller->usb_state = USB_STATE_ATTACHED; -+ udc_controller->ep0_state = WAIT_FOR_SETUP; -+ udc_controller->ep0_dir = 0; -+ -+ /* stand operation */ -+ spin_lock_irqsave(&udc_controller->lock, flags); -+ udc_controller->gadget.speed = USB_SPEED_UNKNOWN; -+ nuke(&udc_controller->eps[0], -ESHUTDOWN); -+ list_for_each_entry(loop_ep, &udc_controller->gadget.ep_list, -+ ep.ep_list) -+ nuke(loop_ep, -ESHUTDOWN); -+ spin_unlock_irqrestore(&udc_controller->lock, flags); -+ -+ /* unbind gadget and unhook driver. */ -+ driver->unbind(&udc_controller->gadget); -+ udc_controller->gadget.dev.driver = 0; -+ udc_controller->driver = 0; -+ -+ printk(KERN_INFO "unregistered gadget '%s'\n", driver->driver.name); -+ return 0; -+} -+EXPORT_SYMBOL(usb_gadget_unregister_driver); -+ -+/*------------------------------------------------------------------------- -+ PROC File System Support -+-------------------------------------------------------------------------*/ -+#ifdef CONFIG_USB_GADGET_DEBUG_FILES -+ -+#include <linux/seq_file.h> -+ -+static const char proc_filename[] = "driver/fsl_usb2_udc"; -+ -+static int fsl_proc_read(char *page, char **start, off_t off, int count, -+ int *eof, void *_dev) -+{ -+ char *buf = page; -+ char *next = buf; -+ unsigned size = count; -+ unsigned long flags; -+ int t, i; -+ u32 tmp_reg; -+ struct fsl_ep *ep = NULL; -+ struct fsl_req *req; -+ -+ struct fsl_udc *udc = udc_controller; -+ if (off != 0) -+ return 0; -+ -+ spin_lock_irqsave(&udc->lock, flags); -+ -+ /* ------basic driver infomation ---- */ -+ t = scnprintf(next, size, -+ DRIVER_DESC "\n" -+ "%s version: %s\n" -+ "Gadget driver: %s\n\n", -+ driver_name, DRIVER_VERSION, -+ udc->driver ? udc->driver->driver.name : "(none)"); -+ size -= t; -+ next += t; -+ -+ /* ------ DR Registers ----- */ -+ tmp_reg = fsl_readl(&dr_regs->usbcmd); -+ t = scnprintf(next, size, -+ "USBCMD reg: 0x%08x\n" -+ "\tSetupTW: %d\n" -+ "\tRun/Stop: %s\n\n", -+ tmp_reg, -+ (tmp_reg & USB_CMD_SUTW) ? 1 : 0, -+ (tmp_reg & USB_CMD_RUN_STOP) ? "Run" : "Stop"); -+ size -= t; -+ next += t; -+ -+ tmp_reg = fsl_readl(&dr_regs->usbsts); -+ t = scnprintf(next, size, -+ "USB Status Reg: 0x%08x\n" -+ "\tDr Suspend: %d Reset Received: %d " -+ "System Error: %s USB Error Interrupt: %s\n\n", -+ tmp_reg, -+ (tmp_reg & USB_STS_SUSPEND) ? 1 : 0, -+ (tmp_reg & USB_STS_RESET) ? 1 : 0, -+ (tmp_reg & USB_STS_SYS_ERR) ? "Err" : "Normal", -+ (tmp_reg & USB_STS_ERR) ? "Err detected" : "No err"); -+ size -= t; -+ next += t; -+ -+ tmp_reg = fsl_readl(&dr_regs->usbintr); -+ t = scnprintf(next, size, -+ "USB Interrupt Enable Reg: 0x%08x\n" -+ "\tSleep Enable: %d SOF Received Enable: %d " -+ "Reset Enable: %d\n" -+ "\tSystem Error Enable: %d " -+ "Port Change Dectected Enable: %d\n" -+ "\tUSB Error Intr Enable: %d USB Intr Enable: %d\n\n", -+ tmp_reg, -+ (tmp_reg & USB_INTR_DEVICE_SUSPEND) ? 1 : 0, -+ (tmp_reg & USB_INTR_SOF_EN) ? 1 : 0, -+ (tmp_reg & USB_INTR_RESET_EN) ? 1 : 0, -+ (tmp_reg & USB_INTR_SYS_ERR_EN) ? 1 : 0, -+ (tmp_reg & USB_INTR_PTC_DETECT_EN) ? 1 : 0, -+ (tmp_reg & USB_INTR_ERR_INT_EN) ? 1 : 0, -+ (tmp_reg & USB_INTR_INT_EN) ? 1 : 0); -+ size -= t; -+ next += t; -+ -+ tmp_reg = fsl_readl(&dr_regs->frindex); -+ t = scnprintf(next, size, -+ "USB Frame Index Reg: Frame Number is 0x%x\n\n", -+ (tmp_reg & USB_FRINDEX_MASKS)); -+ size -= t; -+ next += t; -+ -+ tmp_reg = fsl_readl(&dr_regs->deviceaddr); -+ t = scnprintf(next, size, -+ "USB Device Address Reg: Device Addr is 0x%x\n\n", -+ (tmp_reg & USB_DEVICE_ADDRESS_MASK)); -+ size -= t; -+ next += t; -+ -+ tmp_reg = fsl_readl(&dr_regs->endpointlistaddr); -+ t = scnprintf(next, size, -+ "USB Endpoint List Address Reg:" -+ "Device Addr is 0x%x\n\n", -+ (tmp_reg & USB_EP_LIST_ADDRESS_MASK)); -+ size -= t; -+ next += t; -+ -+ tmp_reg = fsl_readl(&dr_regs->portsc1); -+ t = scnprintf(next, size, -+ "USB Port Status&Control Reg:\n" -+ "\tPort Transceiver Type : %s" "Port Speed: %s \n" -+ "\tPHY Low Power Suspend: %s" "Port Reset: %s " -+ "Port Suspend Mode: %s \n" "\tOver-current Change: %s " -+ "Port Enable/Disable Change: %s\n" -+ "\tPort Enabled/Disabled: %s" -+ "Current Connect Status: %s\n\n", ( { -+ char *s; -+ switch (tmp_reg & PORTSCX_PTS_FSLS) { -+ case PORTSCX_PTS_UTMI: -+ s = "UTMI"; break; -+ case PORTSCX_PTS_ULPI: -+ s = "ULPI "; break; -+ case PORTSCX_PTS_FSLS: -+ s = "FS/LS Serial"; break; -+ default: -+ s = "None"; break; -+ } -+ s; } ), ( { -+ char *s; -+ switch (tmp_reg & PORTSCX_PORT_SPEED_UNDEF) { -+ case PORTSCX_PORT_SPEED_FULL: -+ s = "Full Speed"; break; -+ case PORTSCX_PORT_SPEED_LOW: -+ s = "Low Speed"; break; -+ case PORTSCX_PORT_SPEED_HIGH: -+ s = "High Speed"; break; -+ default: -+ s = "Undefined"; break; -+ } -+ s; -+ } ), -+ (tmp_reg & PORTSCX_PHY_LOW_POWER_SPD) ? -+ "Normal PHY mode" : "Low power mode", -+ (tmp_reg & PORTSCX_PORT_RESET) ? "In Reset" : -+ "Not in Reset", -+ (tmp_reg & PORTSCX_PORT_SUSPEND) ? "In " : "Not in", -+ (tmp_reg & PORTSCX_OVER_CURRENT_CHG) ? "Dected" : -+ "No", -+ (tmp_reg & PORTSCX_PORT_EN_DIS_CHANGE) ? "Disable" : -+ "Not change", -+ (tmp_reg & PORTSCX_PORT_ENABLE) ? "Enable" : -+ "Not correct", -+ (tmp_reg & PORTSCX_CURRENT_CONNECT_STATUS) ? -+ "Attached" : "Not-Att"); -+ size -= t; -+ next += t; -+ -+ tmp_reg = fsl_readl(&dr_regs->usbmode); -+ t = scnprintf(next, size, -+ "USB Mode Reg:" "Controller Mode is : %s\n\n", ( { -+ char *s; -+ switch (tmp_reg & USB_MODE_CTRL_MODE_HOST) { -+ case USB_MODE_CTRL_MODE_IDLE: -+ s = "Idle"; break; -+ case USB_MODE_CTRL_MODE_DEVICE: -+ s = "Device Controller"; break; -+ case USB_MODE_CTRL_MODE_HOST: -+ s = "Host Controller"; break; -+ default: -+ s = "None"; break; -+ } -+ s; -+ } )); -+ size -= t; -+ next += t; -+ -+ tmp_reg = fsl_readl(&dr_regs->endptsetupstat); -+ t = scnprintf(next, size, -+ "Endpoint Setup Status Reg:" "SETUP on ep 0x%x\n\n", -+ (tmp_reg & EP_SETUP_STATUS_MASK)); -+ size -= t; -+ next += t; -+ -+ for (i = 0; i < udc->max_ep / 2; i++) { -+ tmp_reg = fsl_readl(&dr_regs->endptctrl[i]); -+ t = scnprintf(next, size, "EP Ctrl Reg [0x%x]: = [0x%x]\n", -+ i, tmp_reg); -+ size -= t; -+ next += t; -+ } -+ tmp_reg = fsl_readl(&dr_regs->endpointprime); -+ t = scnprintf(next, size, "EP Prime Reg = [0x%x]\n", tmp_reg); -+ size -= t; -+ next += t; -+ -+#ifdef HAVE_SYS_REGS -+ tmp_reg = usb_sys_regs->snoop1; -+ t = scnprintf(next, size, "\nSnoop1 Reg : = [0x%x]\n\n", tmp_reg); -+ size -= t; -+ next += t; -+ -+ tmp_reg = usb_sys_regs->control; -+ t = scnprintf(next, size, "General Control Reg : = [0x%x]\n\n", -+ tmp_reg); -+ size -= t; -+ next += t; -+#endif -+ -+ /* ------fsl_udc, fsl_ep, fsl_request structure information ----- */ -+ ep = &udc->eps[0]; -+ t = scnprintf(next, size, "For %s Maxpkt is 0x%x index is 0x%x\n", -+ ep->ep.name, ep_maxpacket(ep), ep_index(ep)); -+ size -= t; -+ next += t; -+ -+ if (list_empty(&ep->queue)) { -+ t = scnprintf(next, size, "its req queue is empty\n\n"); -+ size -= t; -+ next += t; -+ } else { -+ list_for_each_entry(req, &ep->queue, queue) { -+ t = scnprintf(next, size, -+ "req %p actual 0x%x length 0x%x buf %p\n", -+ &req->req, req->req.actual, -+ req->req.length, req->req.buf); -+ size -= t; -+ next += t; -+ } -+ } -+ /* other gadget->eplist ep */ -+ list_for_each_entry(ep, &udc->gadget.ep_list, ep.ep_list) { -+ if (ep->desc) { -+ t = scnprintf(next, size, -+ "\nFor %s Maxpkt is 0x%x " -+ "index is 0x%x\n", -+ ep->ep.name, ep_maxpacket(ep), -+ ep_index(ep)); -+ size -= t; -+ next += t; -+ -+ if (list_empty(&ep->queue)) { -+ t = scnprintf(next, size, -+ "its req queue is empty\n\n"); -+ size -= t; -+ next += t; -+ } else { -+ list_for_each_entry(req, &ep->queue, queue) { -+ t = scnprintf(next, size, -+ "req %p actual 0x%x length" -+ "0x%x buf %p\n", -+ &req->req, req->req.actual, -+ req->req.length, req->req.buf); -+ size -= t; -+ next += t; -+ } /* end for each_entry of ep req */ -+ } /* end for else */ -+ } /* end for if(ep->queue) */ -+ } /* end (ep->desc) */ -+ -+ spin_unlock_irqrestore(&udc->lock, flags); -+ -+ *eof = 1; -+ return count - size; -+} -+ -+#define create_proc_file() create_proc_read_entry(proc_filename, \ -+ 0, NULL, fsl_proc_read, NULL) -+ -+#define remove_proc_file() remove_proc_entry(proc_filename, NULL) -+ -+#else /* !CONFIG_USB_GADGET_DEBUG_FILES */ -+ -+#define create_proc_file() do {} while (0) -+#define remove_proc_file() do {} while (0) -+ -+#endif /* CONFIG_USB_GADGET_DEBUG_FILES */ -+ -+/*-------------------------------------------------------------------------*/ -+ -+/* Release udc structures */ -+static void fsl_udc_release(struct device *dev) -+{ -+ complete(udc_controller->done); -+ dma_free_coherent(dev, udc_controller->ep_qh_size, -+ udc_controller->ep_qh, udc_controller->ep_qh_dma); -+ kfree(udc_controller); -+} -+ -+/****************************************************************** -+ Internal structure setup functions -+*******************************************************************/ -+/*------------------------------------------------------------------ -+ * init resource for globle controller -+ * Return the udc handle on success or NULL on failure -+ ------------------------------------------------------------------*/ -+static struct fsl_udc *__init struct_udc_setup(struct platform_device *pdev) -+{ -+ struct fsl_udc *udc; -+ struct fsl_usb2_platform_data *pdata; -+ size_t size; -+ -+ udc = kzalloc(sizeof(struct fsl_udc), GFP_KERNEL); -+ if (udc == NULL) { -+ ERR("malloc udc failed\n"); -+ return NULL; -+ } -+ -+ pdata = pdev->dev.platform_data; -+ udc->phy_mode = pdata->phy_mode; /* DDD FIXME */ -+ -+ /* max_ep_nr is bidirectional ep number, max_ep doubles the number */ -+ udc->max_ep = pdata->max_ep_nr * 2; -+ -+ udc->eps = kzalloc(sizeof(struct fsl_ep) * udc->max_ep, GFP_KERNEL); -+ if (!udc->eps) { -+ ERR("malloc fsl_ep failed\n"); -+ goto cleanup; -+ } -+ -+ /* initialized QHs, take care of alignment */ -+ size = udc->max_ep * sizeof(struct ep_queue_head); -+ if (size < QH_ALIGNMENT) -+ size = QH_ALIGNMENT; -+ else if ((size % QH_ALIGNMENT) != 0) { -+ size += QH_ALIGNMENT + 1; -+ size &= ~(QH_ALIGNMENT - 1); -+ } -+ udc->ep_qh = dma_alloc_coherent(&pdev->dev, size, -+ &udc->ep_qh_dma, GFP_KERNEL); -+ if (!udc->ep_qh) { -+ ERR("malloc QHs for udc failed\n"); -+ kfree(udc->eps); -+ goto cleanup; -+ } -+ -+ udc->ep_qh_size = size; -+ -+ /* Initialize ep0 status request structure */ -+ udc->status_req = container_of(fsl_alloc_request(NULL, GFP_KERNEL), -+ struct fsl_req, req); -+ /* allocate a small amount of memory to get valid address */ -+ udc->status_req->req.buf = kmalloc(8, GFP_KERNEL); -+ udc->status_req->req.dma = virt_to_phys(udc->status_req->req.buf); -+ -+ udc->resume_state = USB_STATE_NOTATTACHED; -+ udc->usb_state = USB_STATE_POWERED; -+ udc->ep0_dir = 0; -+ udc->remote_wakeup = 0; /* default to 0 on reset */ -+ spin_lock_init(&udc->lock); -+ -+ return udc; -+ -+cleanup: -+ kfree(udc); -+ return NULL; -+} -+ -+/*---------------------------------------------------------------- -+ * Setup the fsl_ep struct for eps -+ * Link fsl_ep->ep to gadget->ep_list -+ * ep0out is not used so do nothing here -+ * ep0in should be taken care -+ *--------------------------------------------------------------*/ -+static int __init struct_ep_setup(struct fsl_udc *udc, unsigned char index, -+ char *name, int link) -+{ -+ struct fsl_ep *ep = &udc->eps[index]; -+ -+ ep->udc = udc; -+ strcpy(ep->name, name); -+ ep->ep.name = ep->name; -+ -+ ep->ep.ops = &fsl_ep_ops; -+ ep->stopped = 0; -+ -+ /* for ep0: maxP defined in desc -+ * for other eps, maxP is set by epautoconfig() called by gadget layer -+ */ -+ ep->ep.maxpacket = (unsigned short) ~0; -+ -+ /* the queue lists any req for this ep */ -+ INIT_LIST_HEAD(&ep->queue); -+ -+ /* gagdet.ep_list used for ep_autoconfig so no ep0 */ -+ if (link) -+ list_add_tail(&ep->ep.ep_list, &udc->gadget.ep_list); -+ ep->gadget = &udc->gadget; -+ ep->qh = &udc->ep_qh[index]; -+ -+ return 0; -+} -+ -+static int board_init(struct platform_device *pdev) -+{ -+ struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data; -+ -+ pr_debug("udc: pdev=0x%p pdata=0x%p\n", pdev, pdata); -+ -+ /* -+ * do platform specific init: check the clock, grab/config pins, etc. -+ */ -+ if (pdata->platform_init && pdata->platform_init(pdev) != 0) -+ return -EINVAL; -+ -+ return 0; -+} -+ -+/* Driver probe functions */ -+ -+static int __init fsl_udc_probe(struct platform_device *pdev) -+{ -+ struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data; -+ struct fsl_udc *udc; -+ unsigned int i; -+ struct otg_transceiver *transceiver = NULL; -+ int status = -ENODEV; -+ u32 id; -+ int irq_number; -+ u64 rsrc_start, rsrc_len; -+ int ret = -ENODEV; -+ -+ pr_debug("udc: pdev=0x%p pdata=0x%p\n", pdev, pdata); -+ -+ if (board_init(pdev) != 0) -+ return -EINVAL; -+ -+ /* Initialize the udc structure including QH member and other member */ -+ udc = (struct fsl_udc *) struct_udc_setup(pdev); -+ udc_controller = udc; -+ -+ if (!udc) { -+ ERR("udc is NULL \n"); -+ return -ENOMEM; -+ } -+ dev_set_drvdata(&pdev->dev, udc); -+ pr_debug("udc_controller=0x%p", udc_controller); -+ -+ udc->pdata = pdata; -+ udc->xcvr_type = pdata->xcvr_type; -+ -+#ifdef CONFIG_USB_OTG -+ udc->transceiver = otg_get_transceiver(); -+ pr_debug("udc: otg_get_transceiver returns 0x%p", udc->transceiver); -+#endif -+ -+ if (pdev->resource[1].flags != IORESOURCE_IRQ) -+ return -ENODEV; -+ -+ rsrc_start = pdev->resource[0].start; -+ rsrc_len = pdev->resource[0].end - pdev->resource[0].start + 1; -+ -+ pr_debug(" start=0x%ux end=0x%ux\n", -+ pdev->resource[0].start, pdev->resource[0].end); -+ pr_debug("rsrc_start=0x%llx rsrc_len=0x%llx\n", rsrc_start, rsrc_len); -+ -+ dr_regs = (struct fsl_usb_device_regs *)pdata->regs; -+ -+ pr_debug("udc: pdate=0x%p dr_regs=0x%p\n", pdata, dr_regs); -+ pr_debug("udc: hci_version=0x%x\n", dr_regs->hciversion); -+ pr_debug("udc: otgsc at 0x%p\n", &dr_regs->otgsc); -+ -+ id = fsl_readl(&dr_regs->id); -+ printk(KERN_INFO "FSL2 USBOTG h/w ID=0x%x revision=0x%x\n", -+ id & 0x3f, id >> 16); -+ -+ /* USB OTG module IRQ */ -+ irq_number = platform_get_irq(pdev, 0); -+ if (irq_number > 128) { -+ status = request_irq(irq_number, fsl_udc_irq, IRQF_SHARED, -+ driver_name, udc); -+ if (status) { -+ ERR("can't get irq %d, err=%d\n", irq_number, status); -+ goto err2; -+ } -+ } else { -+ status = -ENODEV; -+ goto err2; -+ } -+ -+ if (!udc->transceiver) { -+ /* initialize usb hw reg except for regs for EP, -+ * leave usbintr reg untouched*/ -+ dr_controller_setup(udc); -+ } -+ -+ /* here comes the stand operations for probe -+ * set the fsl_udc->gadget.xxx -+ */ -+ udc->gadget.ops = &fsl_gadget_ops; -+ udc->gadget.is_dualspeed = 1; -+ -+ /* gadget.ep0 is a pointer */ -+ udc->gadget.ep0 = &udc->eps[0].ep; -+ INIT_LIST_HEAD(&udc->gadget.ep_list); -+ udc->gadget.speed = USB_SPEED_UNKNOWN; -+ udc->gadget.name = driver_name; -+ -+ /* Setup gadget.dev and register with kernel */ -+ strcpy(udc->gadget.dev.bus_id, "gadget"); -+ udc->gadget.dev.release = fsl_udc_release; -+ udc->gadget.dev.parent = &pdev->dev; -+ -+ ret = device_register(&udc->gadget.dev); -+ if (ret < 0) -+ goto err3; -+ -+ if (udc->transceiver) -+ udc->gadget.is_otg = 1; -+ -+ /* setup QH and epctrl for ep0 */ -+ ep0_setup(udc); -+ -+ /* setup udc->eps[] for ep0 */ -+ struct_ep_setup(udc_controller, 0, "ep0", 0); -+ /* for ep0: the desc defined here; -+ * for other eps, gadget layer called ep_enable with defined desc -+ */ -+ udc->eps[0].desc = &fsl_ep0_desc; -+ udc->eps[0].ep.maxpacket = USB_MAX_CTRL_PAYLOAD; -+ -+ /* setup the udc->eps[] for non-control endpoints and link -+ * to gadget.ep_list */ -+ for (i = 1; i < (int)(udc->max_ep / 2); i++) { -+ char name[14]; -+ -+ sprintf(name, "ep%dout", i); -+ struct_ep_setup(udc, i * 2, name, 1); -+ sprintf(name, "ep%din", i); -+ struct_ep_setup(udc, i * 2 + 1, name, 1); -+ } -+ -+ /* use dma_pool for TD management */ -+ udc_controller->td_pool = dma_pool_create("udc_td", &pdev->dev, -+ sizeof(struct ep_td_struct), -+ DTD_ALIGNMENT, UDC_DMA_BOUNDARY); -+ if (udc->td_pool == NULL) { -+ ret = -ENOMEM; -+ goto err4; -+ } -+ -+ create_proc_file(); -+ return 0; -+ -+err4: -+ device_unregister(&udc_controller->gadget.dev); -+err3: -+ free_irq(udc_controller->irq, udc_controller); -+err2: -+ kfree(udc); -+ if (transceiver) -+ put_device(transceiver->dev); -+ release_mem_region(pdev->resource[0].start, -+ pdev->resource[0].end - pdev->resource[0].start + 1); -+ return status; -+ -+} -+ -+/* Driver removal functions -+ * Free resources -+ * Finish pending transaction -+ */ -+static int __exit fsl_udc_remove(struct platform_device *pdev) -+{ -+ struct device *dev = &pdev->dev; -+ struct fsl_udc *udc = (struct fsl_udc *)dev_get_drvdata(dev); -+ struct fsl_usb2_platform_data *pdata; -+ int irq_number; -+ -+ DECLARE_COMPLETION(done); -+ -+ pdata = pdev->dev.platform_data; -+ -+ if (!udc) -+ return -ENODEV; -+ -+ udc->done = &done; -+ -+ /* DR has been stopped in usb_gadget_unregister_driver() */ -+ -+ if (udc->transceiver) { -+ put_device(udc->transceiver->dev); -+ udc->transceiver = NULL; -+ } -+ -+ /* remove proc */ -+ remove_proc_file(); -+ -+ /* free irq */ -+ irq_number = udc->irq; -+ free_irq(pdev->resource[1].start, udc); -+ udc->irq = 0; -+ -+ /* Free allocated memory */ -+ kfree(udc->status_req->req.buf); -+ kfree(udc->status_req); -+ kfree(udc_controller->eps); -+ -+ dma_pool_destroy(udc_controller->td_pool); -+ /* deinitlaize all ep: strcut */ -+ /* deinitialize ep0: reg and QH */ -+ -+ device_unregister(&udc->gadget.dev); -+ /* free udc --wait for the release() finished */ -+ wait_for_completion(&done); -+ -+ /* -+ * do platform specific un-initialization: -+ * release iomux pins, etc. -+ */ -+ if (pdata->platform_uninit) -+ pdata->platform_uninit(pdev); -+ -+ return 0; -+} -+ -+static int udc_suspend(struct fsl_udc *udc) -+{ -+ udc->stopped = 1; -+ return 0; -+} -+ -+/* -+ * Modify Power management attributes -+ * Used by OTG statemachine to disable gadget temporarily -+ * Here we stop the DR controller and disable the irq -+ * @param dev device controller pointer -+ * @param state current state -+ * @return The function returns 0 on success or -1 if failed -+ */ -+static int fsl_udc_suspend(struct device *dev, pm_message_t state) -+{ -+ struct fsl_udc *udc = (struct fsl_udc *)dev_get_drvdata(dev); -+ pr_debug("udc: Suspend. state=%d\n", state.event); -+ return udc_suspend(udc); -+} -+ -+static int udc_resume(struct fsl_udc *udc) -+{ -+ /*Enable DR irq reg and set controller Run */ -+ if (udc->stopped) { -+ dr_controller_setup(udc); -+ dr_controller_run(udc); -+ } -+ udc->usb_state = USB_STATE_ATTACHED; -+ udc->ep0_state = WAIT_FOR_SETUP; -+ udc->ep0_dir = 0; -+ return 0; -+} -+ -+/* -+ * Invoked on USB resume. May be called in_interrupt. -+ * Here we start the DR controller and enable the irq -+ * @param dev device controller pointer -+ * @return The function returns 0 on success or -1 if failed -+ */ -+static int fsl_udc_resume(struct device *dev) -+{ -+ struct fsl_udc *udc = (struct fsl_udc *)dev_get_drvdata(dev); -+ pr_debug("udc: Resume dev=0x%p udc=0x%p\n", dev, udc); -+ -+ return udc_resume(udc); -+} -+ -+/*------------------------------------------------------------------------- -+ Register entry point for the peripheral controller driver -+--------------------------------------------------------------------------*/ -+static struct platform_driver udc_driver = { -+ .probe = fsl_udc_probe, -+ .remove = __exit_p(fsl_udc_remove), -+ .driver = { -+ .name = (char *)driver_name, -+ .owner = THIS_MODULE, -+ }, -+}; -+ -+static int __init udc_init(void) -+{ -+ printk(KERN_INFO "%s version %s init \n", driver_desc, DRIVER_VERSION); -+ return platform_driver_register(&udc_driver); -+} -+ -+module_init(udc_init); -+ -+static void __exit udc_exit(void) -+{ -+ platform_driver_unregister(&udc_driver); -+ printk(KERN_INFO "%s unregistered \n", driver_desc); -+} -+ -+module_exit(udc_exit); -+ -+MODULE_DESCRIPTION(DRIVER_DESC); -+MODULE_AUTHOR(DRIVER_AUTHOR); -+MODULE_LICENSE("GPL"); ---- /dev/null -+++ b/drivers/usb/host/ehci-arc.c -@@ -0,0 +1,436 @@ -+/* -+ * drivers/usb/host/ehci-arc.c -+ * -+ * Copyright 2005-2007 Freescale Semiconductor, Inc. All Rights Reserved. -+ */ -+ -+/* -+ * The code contained herein is licensed under the GNU General Public -+ * License. You may obtain a copy of the GNU General Public License -+ * Version 2 or later at the following locations: -+ * -+ * http://www.opensource.org/licenses/gpl-license.html -+ * http://www.gnu.org/copyleft/gpl.html -+ */ -+ -+/* Note: this file is #included by ehci-hcd.c */ -+ -+#include <linux/platform_device.h> -+#include <linux/usb/fsl_usb2.h> -+#include <linux/fsl_devices.h> -+#include <linux/usb/otg.h> -+ -+#include "ehci-fsl.h" -+ -+ -+/* FIXME: Power Managment is un-ported so temporarily disable it */ -+#undef CONFIG_PM -+ -+/* PCI-based HCs are common, but plenty of non-PCI HCs are used too */ -+ -+/* configure so an HC device and id are always provided */ -+/* always called with process context; sleeping is OK */ -+ -+/** -+ * usb_hcd_fsl_probe - initialize FSL-based HCDs -+ * @drvier: Driver to be used for this HCD -+ * @pdev: USB Host Controller being probed -+ * Context: !in_interrupt() -+ * -+ * Allocates basic resources for this USB host controller. -+ * -+ */ -+static int usb_hcd_fsl_probe(const struct hc_driver *driver, -+ struct platform_device *pdev) -+{ -+ struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data; -+ struct usb_hcd *hcd; -+ struct resource *res; -+ int irq; -+ int retval; -+ -+ pr_debug("initializing FSL-SOC USB Controller\n"); -+ -+ /* Need platform data for setup */ -+ if (!pdata) { -+ dev_err(&pdev->dev, -+ "No platform data for %s.\n", pdev->dev.bus_id); -+ return -ENODEV; -+ } -+ -+ retval = fsl_platform_verify(pdev); -+ if (retval) -+ return retval; -+ -+ /* -+ * do platform specific init: check the clock, grab/config pins, etc. -+ */ -+ if (pdata->platform_init && pdata->platform_init(pdev)) { -+ retval = -ENODEV; -+ goto err1; -+ } -+ -+ res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); -+ if (!res) { -+ dev_err(&pdev->dev, -+ "Found HC with no IRQ. Check %s setup!\n", -+ pdev->dev.bus_id); -+ return -ENODEV; -+ } -+ irq = res->start; -+ -+ fsl_platform_set_vbus_power(pdev, 1); -+ -+ hcd = usb_create_hcd(driver, &pdev->dev, pdev->dev.bus_id); -+ if (!hcd) { -+ retval = -ENOMEM; -+ goto err1; -+ } -+ -+ if (pdata->regs) { -+ pr_debug("REGS: using pdata->regs (0x%p)\n", pdata->regs); -+ hcd->regs = pdata->regs; -+ hcd->rsrc_start = pdata->r_start; -+ hcd->rsrc_len = pdata->r_len; -+ } else { -+ pr_debug("REGS: NO pdata->regs\n"); -+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0); -+ if (!res) { -+ dev_err(&pdev->dev, "Found HC with no register addr. " -+ "Check %s setup!\n", pdev->dev.bus_id); -+ retval = -ENODEV; -+ goto err2; -+ } -+ hcd->rsrc_start = res->start; -+ hcd->rsrc_len = res->end - res->start + 1; -+ -+ /* -+ printk("DDD %s(): rsrc_start=0x%llx rsrc_len=0x%llx " -+ "pdata=0x%p\n", __FUNCTION__, -+ hcd->rsrc_start, hcd->rsrc_len, pdata); -+ */ -+ -+ if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, -+ driver->description)) { -+ dev_dbg(&pdev->dev, "request_mem_region failed\n"); -+ retval = -EBUSY; -+ goto err2; -+ } -+ hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len); -+ -+ if (hcd->regs == NULL) { -+ dev_dbg(&pdev->dev, "error mapping memory\n"); -+ retval = -EFAULT; -+ goto err3; -+ } -+ } -+ hcd->power_budget = pdata->power_budget; -+ -+ /* DDD -+ * the following must be done by this point, otherwise the OTG -+ * host port doesn't make it thru initializtion. -+ * ehci_halt(), called by ehci_fsl_setup() returns -ETIMEDOUT -+ */ -+ fsl_platform_set_host_mode(hcd); -+ -+ retval = usb_add_hcd(hcd, irq, IRQF_SHARED); -+ if (retval != 0) -+ goto err4; -+ -+#if defined(CONFIG_USB_OTG) -+ if (pdata->does_otg) { -+ struct ehci_hcd *ehci = hcd_to_ehci(hcd); -+ -+ ehci->transceiver = otg_get_transceiver(); -+ -+ if (ehci->transceiver) { -+ retval = otg_set_host(ehci->transceiver, -+ &ehci_to_hcd(ehci)->self); -+ if (retval) { -+ if (ehci->transceiver) -+ put_device(ehci->transceiver->dev); -+ goto err3; -+ } -+ } else { -+ printk(KERN_ERR "can't find transceiver\n"); -+ retval = -ENODEV; -+ goto err3; -+ } -+ } -+#endif -+ -+ return retval; -+ -+err4: -+ /* DDD only if we did the iomap() iounmap(hcd->regs); */ -+err3: -+ /* DDD only if we did a request_ -+ * release_mem_region(hcd->rsrc_start, hcd->rsrc_len); -+ */ -+err2: -+ usb_put_hcd(hcd); -+err1: -+ dev_err(&pdev->dev, "init %s fail, %d\n", pdev->dev.bus_id, retval); -+ if (pdata->platform_uninit) -+ pdata->platform_uninit(pdev); -+ return retval; -+} -+ -+/* may be called without controller electrically present */ -+/* may be called with controller, bus, and devices active */ -+ -+/** -+ * usb_hcd_fsl_remove - shutdown processing for FSL-based HCDs -+ * @dev: USB Host Controller being removed -+ * Context: !in_interrupt() -+ * -+ * Reverses the effect of usb_hcd_fsl_probe(). -+ * -+ */ -+static void usb_hcd_fsl_remove(struct usb_hcd *hcd, -+ struct platform_device *pdev) -+{ -+ struct ehci_hcd *ehci = hcd_to_ehci(hcd); -+ struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data; -+ -+ /* DDD shouldn't we turn off the power here? */ -+ fsl_platform_set_vbus_power(pdev, 0); -+ -+ usb_remove_hcd(hcd); -+ -+ if (ehci->transceiver) { -+ (void)otg_set_host(ehci->transceiver, 0); -+ put_device(ehci->transceiver->dev); -+ } -+ usb_put_hcd(hcd); -+ -+ /* -+ * do platform specific un-initialization: -+ * release iomux pins, etc. -+ */ -+ if (pdata->platform_uninit) -+ pdata->platform_uninit(pdev); -+} -+ -+/* called after powerup, by probe or system-pm "wakeup" */ -+static int ehci_fsl_reinit(struct ehci_hcd *ehci) -+{ -+ fsl_platform_usb_setup(ehci_to_hcd(ehci)); -+ ehci_port_power(ehci, 0); -+ -+ return 0; -+} -+ -+/* called during probe() after chip reset completes */ -+static int ehci_fsl_setup(struct usb_hcd *hcd) -+{ -+ struct ehci_hcd *ehci = hcd_to_ehci(hcd); -+ int retval; -+ struct fsl_usb2_platform_data *pdata; -+ pdata = hcd->self.controller-> platform_data; -+ -+ ehci->big_endian_desc = pdata->big_endian_desc; -+ ehci->big_endian_mmio = pdata->big_endian_mmio; -+ -+ /* EHCI registers start at offset 0x100 */ -+ ehci->caps = hcd->regs + 0x100; -+ ehci->regs = hcd->regs + 0x100 + -+ HC_LENGTH(ehci_readl(ehci, &ehci->caps->hc_capbase)); -+ -+ pr_debug("%s(): ehci->caps=0x%p ehci->regs=0x%p\n", __FUNCTION__, -+ ehci->caps, ehci->regs); -+ -+ dbg_hcs_params(ehci, "reset"); -+ dbg_hcc_params(ehci, "reset"); -+ -+ /* cache this readonly data; minimize chip reads */ -+ ehci->hcs_params = ehci_readl(ehci, &ehci->caps->hcs_params); -+ -+ retval = ehci_halt(ehci); -+ if (retval) -+ return retval; -+ -+ /* data structure init */ -+ retval = ehci_init(hcd); -+ if (retval) -+ return retval; -+ -+ ehci->is_tdi_rh_tt = 1; -+ -+ ehci->sbrn = 0x20; -+ -+ ehci_reset(ehci); -+ -+ retval = ehci_fsl_reinit(ehci); -+ return retval; -+} -+ -+static const struct hc_driver ehci_fsl_hc_driver = { -+ .description = hcd_name, -+ .product_desc = "Freescale On-Chip EHCI Host Controller", -+ .hcd_priv_size = sizeof(struct ehci_hcd), -+ -+ /* -+ * generic hardware linkage -+ */ -+ .irq = ehci_irq, -+ .flags = FSL_PLATFORM_HC_FLAGS, -+ -+ /* -+ * basic lifecycle operations -+ */ -+ .reset = ehci_fsl_setup, -+ .start = ehci_run, -+ .stop = ehci_stop, -+ .shutdown = ehci_shutdown, -+ -+ /* -+ * managing i/o requests and associated device resources -+ */ -+ .urb_enqueue = ehci_urb_enqueue, -+ .urb_dequeue = ehci_urb_dequeue, -+ .endpoint_disable = ehci_endpoint_disable, -+ -+ /* -+ * scheduling support -+ */ -+ .get_frame_number = ehci_get_frame, -+ -+ /* -+ * root hub support -+ */ -+ .hub_status_data = ehci_hub_status_data, -+ .hub_control = ehci_hub_control, -+ .bus_suspend = ehci_bus_suspend, -+ .bus_resume = ehci_bus_resume, -+}; -+ -+#ifdef CONFIG_USB_OTG -+/* -+ * Holding pen for all the EHCI registers except port_status, -+ * which is a zero element array and hence takes no space. -+ * The port_status register is saved in usb_ehci_portsc. -+ */ -+volatile static struct ehci_regs usb_ehci_regs; -+static u32 usb_ehci_portsc; -+ -+/* suspend/resume, section 4.3 */ -+ -+/* These routines rely on the bus (pci, platform, etc) -+ * to handle powerdown and wakeup, and currently also on -+ * transceivers that don't need any software attention to set up -+ * the right sort of wakeup. -+ * -+ * They're also used for turning on/off the port when doing OTG. -+ */ -+static int ehci_fsl_drv_suspend(struct platform_device *pdev, -+ pm_message_t message) -+{ -+ struct usb_hcd *hcd = platform_get_drvdata(pdev); -+ struct ehci_hcd *ehci = hcd_to_ehci(hcd); -+ u32 tmp; -+ -+ pr_debug("%s pdev=0x%p ehci=0x%p hcd=0x%p\n", -+ __FUNCTION__, pdev, ehci, hcd); -+ pr_debug("%s ehci->regs=0x%p hcd->regs=0x%p hcd->state=%d\n", -+ __FUNCTION__, ehci->regs, hcd->regs, hcd->state); -+ -+ hcd->state = HC_STATE_SUSPENDED; -+ pdev->dev.power.power_state = PMSG_SUSPEND; -+ -+ if (hcd->driver->suspend) -+ return hcd->driver->suspend(hcd, message); -+ -+ /* ignore non-host interrupts */ -+ clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); -+ -+ tmp = ehci_readl(ehci, &ehci->regs->command); -+ tmp &= ~CMD_RUN; -+ ehci_writel(ehci, tmp, &ehci->regs->command); -+ -+ memcpy((void *)&usb_ehci_regs, ehci->regs, sizeof(struct ehci_regs)); -+ usb_ehci_portsc = ehci_readl(ehci, &ehci->regs->port_status[0]); -+ -+ /* clear the W1C bits */ -+ usb_ehci_portsc &= cpu_to_hc32(ehci, ~PORT_RWC_BITS); -+ -+ fsl_platform_set_vbus_power(pdev, 0); -+ /* clear PP to cut power to the port */ -+ tmp = ehci_readl(ehci, &ehci->regs->port_status[0]); -+ tmp &= ~PORT_POWER; -+ ehci_writel(ehci, tmp, &ehci->regs->port_status[0]); -+ -+ return 0; -+} -+ -+static int ehci_fsl_drv_resume(struct platform_device *pdev) -+{ -+ struct usb_hcd *hcd = platform_get_drvdata(pdev); -+ struct ehci_hcd *ehci = hcd_to_ehci(hcd); -+ u32 tmp; -+ struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data; -+ -+ pr_debug("%s pdev=0x%p pdata=0x%p ehci=0x%p hcd=0x%p\n", -+ __FUNCTION__, pdev, pdata, ehci, hcd); -+ -+ pr_debug("%s ehci->regs=0x%p hcd->regs=0x%p\n", -+ __FUNCTION__, ehci->regs, hcd->regs); -+ -+ memcpy(ehci->regs, (void *)&usb_ehci_regs, sizeof(struct ehci_regs)); -+ -+ tmp = USBMODE_CM_HOST | (pdata->es ? USBMODE_ES : 0); -+ ehci_writel(ehci, tmp, hcd->regs + FSL_SOC_USB_USBMODE); -+ pr_debug("tmp %08x set usbmode %08x\n", tmp, -+ ehci_readl(ehci, hcd->regs + FSL_SOC_USB_USBMODE)); -+ -+ ehci_writel(ehci, usb_ehci_portsc, &ehci->regs->port_status[0]); -+ pr_debug("set portsc %08x %08x\n", usb_ehci_portsc, -+ ehci_readl(ehci, &ehci->regs->port_status[0])); -+ -+ set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); -+ hcd->state = HC_STATE_RUNNING; -+ pdev->dev.power.power_state = PMSG_ON; -+ -+ tmp = ehci_readl(ehci, &ehci->regs->command); -+ tmp |= CMD_RUN; -+ ehci_writel(ehci, tmp, &ehci->regs->command); -+ -+ fsl_platform_set_vbus_power(pdev, 1); -+ -+ usb_hcd_resume_root_hub(hcd); -+ -+ return 0; -+} -+#endif /* CONFIG_USB_OTG */ -+ -+static int ehci_fsl_drv_probe(struct platform_device *pdev) -+{ -+ if (usb_disabled()) -+ return -ENODEV; -+ -+ return usb_hcd_fsl_probe(&ehci_fsl_hc_driver, pdev); -+} -+ -+static int ehci_fsl_drv_remove(struct platform_device *pdev) -+{ -+ struct usb_hcd *hcd = platform_get_drvdata(pdev); -+ -+ usb_hcd_fsl_remove(hcd, pdev); -+ -+ return 0; -+} -+ -+MODULE_ALIAS("fsl-ehci"); -+ -+static struct platform_driver ehci_fsl_driver = { -+ .probe = ehci_fsl_drv_probe, -+ .remove = ehci_fsl_drv_remove, -+ .shutdown = usb_hcd_platform_shutdown, -+#ifdef CONFIG_USB_OTG -+ .suspend = ehci_fsl_drv_suspend, -+ .resume = ehci_fsl_drv_resume, -+#endif -+ .driver = { -+ .name = "fsl-ehci", -+ }, -+}; ---- a/drivers/usb/host/ehci-fsl.h -+++ b/drivers/usb/host/ehci-fsl.h -@@ -18,6 +18,8 @@ - #ifndef _EHCI_FSL_H - #define _EHCI_FSL_H - -+#include <linux/usb/fsl_xcvr.h> -+ - /* offsets for the non-ehci registers in the FSL SOC USB controller */ - #define FSL_SOC_USB_ULPIVP 0x170 - #define FSL_SOC_USB_PORTSC1 0x184 -@@ -34,5 +36,29 @@ - #define FSL_SOC_USB_PRICTRL 0x40c /* NOTE: big-endian */ - #define FSL_SOC_USB_SICTRL 0x410 /* NOTE: big-endian */ - #define FSL_SOC_USB_CTRL 0x500 /* NOTE: big-endian */ --#define SNOOP_SIZE_2GB 0x1e -+ -+#ifdef CONFIG_MPC834x -+#include <sysdev/fsl_usb.h> -+#endif -+ -+#ifdef CONFIG_ARCH_MX3 -+#include <asm/arch/mx31_usb.h> -+#endif -+ -+#ifdef CONFIG_ARCH_MX27 -+#include <asm/arch/mx27_usb.h> -+#endif -+ -+#ifdef CONFIG_M54455 -+#include <asm-m68k/mcf5445x_usb.h> -+#endif -+ -+ -+static void fsl_platform_set_vbus_power(struct platform_device *pdev, int on) -+{ -+ struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data; -+ -+ if (pdata->xcvr_ops && pdata->xcvr_ops->set_vbus_power) -+ pdata->xcvr_ops->set_vbus_power(pdata, on); -+} - #endif /* _EHCI_FSL_H */ ---- a/drivers/usb/host/ehci.h -+++ b/drivers/usb/host/ehci.h -@@ -122,6 +122,12 @@ struct ehci_hcd { /* one per controlle - - u8 sbrn; /* packed release number */ - -+ /* -+ * OTG controllers and transceivers need software interaction; -+ * other external transceivers should be software-transparent -+ */ -+ struct otg_transceiver *transceiver; -+ - /* irq statistics */ - #ifdef EHCI_STATS - struct ehci_stats stats; -@@ -753,6 +759,22 @@ ehci_port_speed(struct ehci_hcd *ehci, u - #define writel_be(val, addr) __raw_writel(val, (__force unsigned *)addr) - #endif - -+#if defined(CONFIG_COLDFIRE) -+/* -+ * Sorry, include/asm-m68k/io.h is messed up. It will give you a -+ * BE readl or a LE readl depending on whether or not CONFIG_PCI is set. -+ * how broken is that? Do the right thing here. -+ */ -+#undef readl -+#undef writel -+ -+#define readl(addr) in_le32((__force unsigned *)(addr)) -+#define writel(val,addr) out_le32((__force unsigned *)(addr),(val)) -+ -+#define readl_be(addr) in_be32((__force unsigned *)(addr)) -+#define writel_be(val, addr) out_be32((__force unsigned *)(addr), (val)) -+#endif -+ - static inline unsigned int ehci_readl(const struct ehci_hcd *ehci, - __u32 __iomem * regs) - { ---- a/drivers/usb/host/ehci-hcd.c -+++ b/drivers/usb/host/ehci-hcd.c -@@ -1043,6 +1043,11 @@ MODULE_LICENSE ("GPL"); - #define PLATFORM_DRIVER ixp4xx_ehci_driver - #endif - -+#ifdef CONFIG_M54455 -+#include "ehci-arc.c" -+#define PLATFORM_DRIVER ehci_fsl_driver -+#endif -+ - #if !defined(PCI_DRIVER) && !defined(PLATFORM_DRIVER) && \ - !defined(PS3_SYSTEM_BUS_DRIVER) && !defined(OF_PLATFORM_DRIVER) - #error "missing bus glue for ehci-hcd" ---- a/drivers/usb/host/ehci-mem.c -+++ b/drivers/usb/host/ehci-mem.c -@@ -40,7 +40,8 @@ static inline void ehci_qtd_init(struct - { - memset (qtd, 0, sizeof *qtd); - qtd->qtd_dma = dma; -- qtd->hw_token = cpu_to_le32 (QTD_STS_HALT); -+ // DDD official code` has: qtd->hw_token = cpu_to_le32 (QTD_STS_HALT); -+ qtd->hw_token = cpu_to_hc32 (ehci, QTD_STS_HALT); - qtd->hw_next = EHCI_LIST_END(ehci); - qtd->hw_alt_next = EHCI_LIST_END(ehci); - INIT_LIST_HEAD (&qtd->qtd_list); -@@ -211,9 +212,11 @@ static int ehci_mem_init (struct ehci_hc - } - - /* Hardware periodic table */ -- ehci->periodic = (__le32 *) -+ // DDD official code has: ehci->periodic = (__le32 *) -+ ehci->periodic = (__hc32 *) - dma_alloc_coherent (ehci_to_hcd(ehci)->self.controller, -- ehci->periodic_size * sizeof(__le32), -+ // DDD official: ehci->periodic_size * sizeof(__le32), -+ ehci->periodic_size * sizeof(__hc32), - &ehci->periodic_dma, 0); - if (ehci->periodic == NULL) { - goto fail; ---- a/drivers/usb/host/Kconfig -+++ b/drivers/usb/host/Kconfig -@@ -32,6 +32,7 @@ config USB_EHCI_HCD - config USB_EHCI_ROOT_HUB_TT - bool "Root Hub Transaction Translators (EXPERIMENTAL)" - depends on USB_EHCI_HCD && EXPERIMENTAL -+ default y if M54455 - ---help--- - Some EHCI chips have vendor-specific extensions to integrate - transaction translators, so that no OHCI or UHCI companion -@@ -60,12 +61,12 @@ config USB_EHCI_TT_NEWSCHED - - config USB_EHCI_BIG_ENDIAN_MMIO - bool -- depends on USB_EHCI_HCD && (PPC_CELLEB || PPC_PS3 || 440EPX || ARCH_IXP4XX) -+ depends on USB_EHCI_HCD && (PPC_CELLEB || PPC_PS3 || 440EPX || ARCH_IXP4XX || M54455) - default y - - config USB_EHCI_BIG_ENDIAN_DESC - bool -- depends on USB_EHCI_HCD && (440EPX || ARCH_IXP4XX) -+ depends on USB_EHCI_HCD && (440EPX || ARCH_IXP4XX || M54455) - default y - - config USB_EHCI_FSL -@@ -260,3 +261,19 @@ config USB_R8A66597_HCD - To compile this driver as a module, choose M here: the - module will be called r8a66597-hcd. - -+choice -+ prompt "Select transceiver" -+ depends on M54455 -+ default USB_M5445X_ULPI -+ -+config USB_M5445X_ULPI -+ bool "External ULPI" -+ ---help--- -+ Enable support for the external HS ULPI transceiver. -+ -+config USB_M5445X_FSLS -+ bool "On-chip (FL/LS only)" -+ ---help--- -+ Enable support for the on-chip FL/LS transceiver. -+endchoice -+ ---- a/drivers/usb/host/Makefile -+++ b/drivers/usb/host/Makefile -@@ -6,7 +6,7 @@ ifeq ($(CONFIG_USB_DEBUG),y) - EXTRA_CFLAGS += -DDEBUG - endif - --obj-$(CONFIG_PCI) += pci-quirks.o -+#obj-$(CONFIG_PCI) += pci-quirks.o - - obj-$(CONFIG_USB_EHCI_HCD) += ehci-hcd.o - obj-$(CONFIG_USB_ISP116X_HCD) += isp116x-hcd.o ---- a/drivers/usb/Kconfig -+++ b/drivers/usb/Kconfig -@@ -55,6 +55,7 @@ config USB_ARCH_HAS_EHCI - default y if PPC_83xx - default y if SOC_AU1200 - default y if ARCH_IXP4XX -+ default y if M54455 - default PCI - - # ARM SA1111 chips have a non-PCI based "OHCI-compatible" USB host interface. ---- a/drivers/usb/Makefile -+++ b/drivers/usb/Makefile -@@ -32,3 +32,5 @@ obj-$(CONFIG_USB) += misc/ - - obj-$(CONFIG_USB_ATM) += atm/ - obj-$(CONFIG_USB_SPEEDTOUCH) += atm/ -+ -+obj-$(CONFIG_USB_OTG) += otg/ ---- /dev/null -+++ b/drivers/usb/otg/fsl_otg.c -@@ -0,0 +1,1306 @@ -+/* -+ * Copyright (c) Freescale Semiconductor, Inc. 2006-2007 -+ * -+ * USB OTG ULPI driver -+ * -+ * Based on code for MPC from: -+ * Leo Li<LeoLi@freescale.com> -+ * Jerry Huang<Chang-Ming.Huang@freescale.com> -+ * -+ * and M5329 code from -+ * Yaroslav Vinogradov yaroslav.vinogradov@freescale.com -+ * Andrey Butok -+ * -+ * Initialization based on code from Shlomi Gridish. -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, but -+ * WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ * General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License along -+ * with this program; if not, write to the Free Software Foundation, Inc., -+ * 675 Mass Ave, Cambridge, MA 02139, USA. -+ *************************************************************************** -+ * Changes: -+ * v0.3 08 August 2007 Duck -+ * v0.2 20 October 2006 Andrey Butok -+ * Issues fixing and some changes. -+ * v0.1 September 2006 Yaroslav Vinogradov -+ * Initial version. -+ * -+ */ -+ -+#include <linux/module.h> -+#include <linux/moduleparam.h> -+#include <linux/kernel.h> -+#include <linux/delay.h> -+#include <linux/ioport.h> -+#include <linux/sched.h> -+#include <linux/slab.h> -+#include <linux/smp_lock.h> -+#include <linux/proc_fs.h> -+#include <linux/errno.h> -+#include <linux/init.h> -+#include <linux/reboot.h> -+#include <linux/timer.h> -+#include <linux/list.h> -+#include <linux/interrupt.h> -+#include <linux/usb.h> -+#include <linux/device.h> -+#include <linux/platform_device.h> -+#include <linux/usb/ch9.h> -+#include <linux/usb_gadget.h> -+#include <linux/workqueue.h> -+#include <linux/time.h> -+#include <linux/fsl_devices.h> -+#include <linux/usb/fsl_usb2.h> -+ -+#include <linux/io.h> -+ -+#if defined CONFIG_M54455 -+#include <asm/mcfsim.h> -+#endif -+ -+#define USE_WORK_QUEUES -+#include "fsl_otg.h" -+ -+#define CONFIG_USB_OTG_DEBUG_FILES -+#define DRIVER_VERSION "Revision: 1.56" -+#define DRIVER_AUTHOR "Freescale Semiconductor Inc." -+#define DRIVER_DESC "Freescale USB OTG ULPI Driver" -+#define DRIVER_INFO DRIVER_VERSION " " DRIVER_DESC -+ -+MODULE_DESCRIPTION("Freescale USB OTG Controller Driver"); -+ -+static const char driver_name[] = "fsl-usb2-otg"; -+ -+static spinlock_t usb_dr_regs_lock; -+ -+/*#define HA_DATA_PULSE 1*/ -+ -+volatile static struct fsl_usb_device_regs *usb_dr_regs; -+static struct fsl_otg *fsl_otg_dev; -+static int srp_wait_done; -+ -+/* Driver specific timers */ -+struct fsl_otg_timer *b_data_pulse_tmr, *b_vbus_pulse_tmr, *b_srp_fail_tmr, -+ *b_srp_wait_tmr, *a_wait_enum_tmr; -+ -+static struct list_head active_timers; -+ -+static struct fsl_otg_config fsl_otg_initdata = { -+ .otg_port = 1, -+}; -+ -+#if 0 -+static void dump_state(const char *string, struct otg_fsm *fsm) -+{ -+ printk(KERN_DEBUG "%s\n\tOTG state: %s\n", string, -+ state_string(fsl_otg_dev->otg.state)); -+ printk(KERN_DEBUG "\tFSM protocol=%s\n", fsm->protocol ? -+ (fsm->protocol == PROTO_HOST ? "Host" : "Gadget") -+ : "None"); -+ -+ /* regs */ -+ printk(KERN_DEBUG "\t OTGSC 0x%08x\n", -+ fsl_readl(&usb_dr_regs->otgsc)); -+ printk(KERN_DEBUG "\tPORTSC1 0x%08x\n", -+ fsl_readl(&usb_dr_regs->portsc1)); -+ printk(KERN_DEBUG "\tUSBMODE 0x%08x\n", -+ fsl_readl(&usb_dr_regs->usbmode)); -+ printk(KERN_DEBUG "\t USBCMD 0x%08x\n", -+ fsl_readl(&usb_dr_regs->usbcmd)); -+ printk(KERN_DEBUG "\t USBSTS 0x%08x\n", -+ fsl_readl(&usb_dr_regs->usbsts)); -+ -+ /* ------ State Machine Variables ----- */ -+ printk(KERN_DEBUG "\ta_bus_req: %d\n", fsm->a_bus_req); -+ printk(KERN_DEBUG "\tb_bus_req: %d\n", fsm->b_bus_req); -+ printk(KERN_DEBUG "\ta_bus_resume: %d\n", fsm->a_bus_resume); -+ printk(KERN_DEBUG "\ta_bus_suspend: %d\n", fsm->a_bus_suspend); -+ printk(KERN_DEBUG "\ta_conn: %d\n", fsm->a_conn); -+ printk(KERN_DEBUG "\ta_sess_vld: %d\n", fsm->a_sess_vld); -+ printk(KERN_DEBUG "\ta_srp_det: %d\n", fsm->a_srp_det); -+ printk(KERN_DEBUG "\ta_vbus_vld: %d\n", fsm->a_vbus_vld); -+ printk(KERN_DEBUG "\tb_bus_resume: %d\n", fsm->b_bus_resume); -+ printk(KERN_DEBUG "\tb_bus_suspend: %d\n", fsm->b_bus_suspend); -+ printk(KERN_DEBUG "\tb_conn: %d\n", fsm->b_conn); -+ printk(KERN_DEBUG "\tb_se0_srp: %d\n", fsm->b_se0_srp); -+ printk(KERN_DEBUG "\tb_sess_end: %d\n", fsm->b_sess_end); -+ printk(KERN_DEBUG "\tb_sess_vld: %d\n", fsm->b_sess_vld); -+ printk(KERN_DEBUG "\tid: %d\n", fsm->id); -+} -+#endif -+ -+ -+/* Routines to access transceiver ULPI registers */ -+u8 view_ulpi(u8 addr) -+{ -+ u32 temp; -+ -+ temp = 0x40000000 | (addr << 16); -+ fsl_writel(temp, &usb_dr_regs->ulpiview); -+ -+ udelay(1000); -+ -+ /* DDD timeout this loop: */ -+ do { -+ temp = fsl_readl(&usb_dr_regs->ulpiview); -+ } while (temp & 0x40000000); -+ -+ return (temp & 0x0000ff00) >> 8; -+} -+ -+int write_ulpi(u8 addr, u8 data) -+{ -+ u32 temp; -+ -+ temp = 0x60000000 | (addr << 16) | data; -+ fsl_writel(temp, &usb_dr_regs->ulpiview); -+ return 0; -+} -+ -+/* prototype declaration */ -+void fsl_otg_add_timer(void *timer); -+void fsl_otg_del_timer(void *timer); -+ -+/* -------------------------------------------------------------*/ -+/* Operations that will be called from OTG Finite State Machine */ -+ -+/* Charge vbus for vbus pulsing in SRP */ -+void fsl_otg_chrg_vbus(int on) -+{ -+ u32 tmp; -+ -+ VDBG(" %d\n", on); -+ -+ tmp = fsl_readl(&usb_dr_regs->otgsc) & ~OTGSC_INTSTS_MASK; -+ -+ if (on) { -+ tmp &= ~OTGSC_CTRL_VBUS_DISCHARGE; -+ tmp |= OTGSC_CTRL_VBUS_CHARGE; -+ } else { -+ tmp &= ~OTGSC_CTRL_VBUS_CHARGE; -+ } -+ fsl_writel(tmp, &usb_dr_regs->otgsc); -+} -+ -+/* Discharge vbus through a resistor to ground */ -+void fsl_otg_dischrg_vbus(int on) -+{ -+ u32 tmp; -+ -+ VDBG(" %d\n", on); -+ -+ tmp = fsl_readl(&usb_dr_regs->otgsc) & ~OTGSC_INTSTS_MASK; -+ -+ if (on) -+ tmp |= OTGSC_CTRL_VBUS_DISCHARGE; -+ else -+ tmp &= ~OTGSC_CTRL_VBUS_DISCHARGE; -+ -+ fsl_writel(tmp, &usb_dr_regs->otgsc); -+} -+ -+/* A-device driver vbus, controlled through PP bit in PORTSC */ -+void fsl_otg_drv_vbus(int on) -+{ -+ u32 tmp; -+ -+ VDBG(" %d\n", on); -+ -+ tmp = fsl_readl(&usb_dr_regs->portsc1) & ~PORTSCX_W1C_BITS; -+ -+ if (on) -+ tmp |= PORTSCX_PORT_POWER; -+ else -+ tmp &= ~PORTSCX_PORT_POWER; -+ -+ fsl_writel(tmp, &usb_dr_regs->portsc1); -+} -+ -+/* Pull-up D+, signalling connect by periperal. Also used in -+ * data-line pulsing in SRP */ -+void fsl_otg_loc_conn(int on) -+{ -+ u32 tmp; -+ -+ VDBG(" %d\n", on); -+ -+ tmp = fsl_readl(&usb_dr_regs->otgsc) & ~OTGSC_INTSTS_MASK; -+ -+ if (on) -+ tmp |= OTGSC_CTRL_DATA_PULSING; -+ else -+ tmp &= ~OTGSC_CTRL_DATA_PULSING; -+ -+ fsl_writel(tmp, &usb_dr_regs->otgsc); -+} -+ -+/* Generate SOF by host. This is controlled through suspend/resume the -+ * port. In host mode, controller will automatically send SOF. -+ * Suspend will block the data on the port. -+ */ -+void fsl_otg_loc_sof(int on) -+{ -+ u32 tmp; -+ -+ VDBG(" %d\n", on); -+ -+ tmp = fsl_readl(&usb_dr_regs->portsc1) & ~PORTSCX_W1C_BITS; -+ -+ if (on) -+ tmp |= PORTSCX_PORT_FORCE_RESUME; -+ else -+ tmp |= PORTSCX_PORT_SUSPEND; -+ -+ fsl_writel(tmp, &usb_dr_regs->portsc1); -+} -+ -+/* Start SRP pulsing by data-line pulsing, followed with v-bus pulsing. */ -+void fsl_otg_start_pulse(void) -+{ -+ u32 __attribute__ ((unused)) tmp; -+ -+ VDBG("\n"); -+ srp_wait_done = 0; -+ -+#ifdef HA_DATA_PULSE -+ tmp = fsl_readl(&usb_dr_regs->otgsc) &= ~OTGSC_INTSTS_MASK; -+ tmp |= OTGSC_HA_DATA_PULSE; -+ fsl_writel(tmp, &usb_dr_regs->otgsc); -+#else -+ fsl_otg_loc_conn(1); -+#endif -+ -+ fsl_otg_add_timer(b_data_pulse_tmr); -+} -+ -+void fsl_otg_pulse_vbus(void); -+ -+void b_data_pulse_end(unsigned long foo) -+{ -+#ifdef HA_DATA_PULSE -+#else -+ fsl_otg_loc_conn(0); -+#endif -+ -+ /* Do VBUS pulse after data pulse */ -+ fsl_otg_pulse_vbus(); -+} -+ -+void fsl_otg_pulse_vbus(void) -+{ -+ srp_wait_done = 0; -+ fsl_otg_chrg_vbus(1); -+ /* start the timer to end vbus charge */ -+ fsl_otg_add_timer(b_vbus_pulse_tmr); -+} -+ -+void b_vbus_pulse_end(unsigned long foo) -+{ -+ fsl_otg_chrg_vbus(0); -+ -+ /* As USB3300 using the same a_sess_vld and b_sess_vld voltage -+ * we need to discharge the bus for a while to distinguish -+ * residual voltage of vbus pulsing and A device pull up */ -+ fsl_otg_dischrg_vbus(1); -+ fsl_otg_add_timer(b_srp_wait_tmr); -+} -+ -+void b_srp_end(unsigned long foo) -+{ -+ fsl_otg_dischrg_vbus(0); -+ srp_wait_done = 1; -+ -+ if ((fsl_otg_dev->otg.state == OTG_STATE_B_SRP_INIT) && -+ fsl_otg_dev->fsm.b_sess_vld) -+ fsl_otg_dev->fsm.b_srp_done = 1; -+} -+ -+/* Workaround for a_host suspending too fast. When a_bus_req=0, -+ * a_host will start by SRP. It needs to set b_hnp_enable before -+ * actually suspending to start HNP -+ */ -+void a_wait_enum(unsigned long foo) -+{ -+ VDBG("a_wait_enum timeout\n"); -+ if (!fsl_otg_dev->otg.host->b_hnp_enable) -+ fsl_otg_add_timer(a_wait_enum_tmr); -+ else -+ otg_statemachine(&fsl_otg_dev->fsm); -+} -+ -+/* ------------------------------------------------------*/ -+ -+/* The timeout callback function to set time out bit */ -+void set_tmout(unsigned long indicator) -+{ -+ *(int *)indicator = 1; -+} -+ -+/* Initialize timers */ -+void fsl_otg_init_timers(struct otg_fsm *fsm) -+{ -+ /* FSM used timers */ -+ fsm->a_wait_vrise_tmr = otg_timer_initializer(&set_tmout, TA_WAIT_VRISE, -+ (unsigned long)&fsm->a_wait_vrise_tmout); -+ fsm->a_wait_bcon_tmr = otg_timer_initializer(&set_tmout, TA_WAIT_BCON, -+ (unsigned long)&fsm->a_wait_bcon_tmout); -+ fsm->a_aidl_bdis_tmr = otg_timer_initializer(&set_tmout, TA_AIDL_BDIS, -+ (unsigned long)&fsm->a_aidl_bdis_tmout); -+ fsm->b_ase0_brst_tmr = otg_timer_initializer(&set_tmout, TB_ASE0_BRST, -+ (unsigned long)&fsm->b_ase0_brst_tmout); -+ fsm->b_se0_srp_tmr = otg_timer_initializer(&set_tmout, TB_SE0_SRP, -+ (unsigned long)&fsm->b_se0_srp); -+ fsm->b_srp_fail_tmr = otg_timer_initializer(&set_tmout, TB_SRP_FAIL, -+ (unsigned long)&fsm->b_srp_done); -+ fsm->a_wait_enum_tmr = otg_timer_initializer(&a_wait_enum, 10, -+ (unsigned long)&fsm); -+ -+ /* device driver used timers */ -+ b_srp_wait_tmr = otg_timer_initializer(&b_srp_end, TB_SRP_WAIT, 0); -+ b_data_pulse_tmr = otg_timer_initializer(&b_data_pulse_end, -+ TB_DATA_PLS, 0); -+ b_vbus_pulse_tmr = otg_timer_initializer(&b_vbus_pulse_end, -+ TB_VBUS_PLS, 0); -+ -+} -+ -+/* Add timer to timer list */ -+void fsl_otg_add_timer(void *gtimer) -+{ -+ struct fsl_otg_timer *timer = (struct fsl_otg_timer *)gtimer; -+ struct fsl_otg_timer *tmp_timer; -+ -+ /* Check if the timer is already in the active list, -+ * if so update timer count -+ */ -+ list_for_each_entry(tmp_timer, &active_timers, list) -+ if (tmp_timer == timer) { -+ timer->count = timer->expires; -+ return; -+ } -+ timer->count = timer->expires; -+ list_add_tail(&timer->list, &active_timers); -+} -+ -+/* Remove timer from the timer list; clear timeout status */ -+void fsl_otg_del_timer(void *gtimer) -+{ -+ struct fsl_otg_timer *timer = (struct fsl_otg_timer *)gtimer; -+ struct fsl_otg_timer *tmp_timer, *del_tmp; -+ -+ list_for_each_entry_safe(tmp_timer, del_tmp, &active_timers, list) -+ if (tmp_timer == timer) -+ list_del(&timer->list); -+} -+ -+/* -+ * Reduce timer count by 1, and find timeout conditions. -+ * Called by fsl_otg 1ms timer interrupt -+ */ -+int fsl_otg_tick_timer(void) -+{ -+ struct fsl_otg_timer *tmp_timer, *del_tmp; -+ int expired = 0; -+ -+ list_for_each_entry_safe(tmp_timer, del_tmp, &active_timers, list) { -+ tmp_timer->count--; -+ /* check if timer expires */ -+ if (!tmp_timer->count) { -+ list_del(&tmp_timer->list); -+ tmp_timer->function(tmp_timer->data); -+ expired = 1; -+ } -+ } -+ -+ return expired; -+} -+ -+/* Reset controller, not reset the bus */ -+void otg_reset_controller(void) -+{ -+ u32 command; -+ unsigned long flags; -+ int timeout; -+ -+ VDBG("\n"); -+ -+ spin_lock_irqsave(&usb_dr_regs_lock, flags); -+ -+ command = fsl_readl(&usb_dr_regs->usbcmd); -+ command |= USB_CMD_CTRL_RESET; -+ fsl_writel(command, &usb_dr_regs->usbcmd); -+ spin_unlock_irqrestore(&usb_dr_regs_lock, flags); -+ -+ /* Wait reset completed */ -+ timeout = 500; -+ while (fsl_readl(&usb_dr_regs->usbcmd) & USB_CMD_CTRL_RESET) -+ udelay(1); -+ if (timeout <= 0) -+ ERR("%s - USBCMD_RST never clear. Timeout is %d \n", -+ __FUNCTION__, timeout); -+} -+ -+/* Call suspend/resume routines in host driver */ -+int fsl_otg_start_host(struct otg_fsm *fsm, int on) -+{ -+ struct otg_transceiver *xceiv = fsm->transceiver; -+ struct device *dev; -+ struct fsl_otg *otg_dev = container_of(xceiv, struct fsl_otg, otg); -+ u32 retval = 0; -+ -+ if (!xceiv->host) -+ return -ENODEV; -+ -+ dev = xceiv->host->controller; -+ -+ /* -+ * Update a_vbus_vld state as a_vbus_vld int is disabled -+ * in device mode -+ */ -+ fsm->a_vbus_vld = -+ !!(fsl_readl(&usb_dr_regs->otgsc) & OTGSC_STS_A_VBUS_VALID); -+ if (on) { -+ /* start fsl usb host controller */ -+ if (otg_dev->host_working) -+ goto end; -+ else { -+ otg_reset_controller(); -+ VDBG("host on......\n"); -+ if (dev->driver->resume) { -+ retval = dev->driver->resume(dev); -+ if (fsm->id) { -+ /* default-b */ -+ fsl_otg_drv_vbus(1); -+ /* Workaround: b_host can't driver -+ * vbus, but PP in PORTSC needs to -+ * be 1 for host to work. -+ * So we set drv_vbus bit in -+ * transceiver to 0 thru ULPI. */ -+ write_ulpi(0x0c, 0x20); -+ } -+ } -+ -+ otg_dev->host_working = 1; -+ } -+ } else { -+ /* stop fsl usb host controller */ -+ if (!otg_dev->host_working) -+ goto end; -+ else { -+ VDBG("host off......\n"); -+ if (dev && dev->driver) { -+ retval = dev->driver->suspend(dev, PMSG_SUSPEND); -+ if (fsm->id) -+ /* default-b */ -+ fsl_otg_drv_vbus(0); -+ } -+ otg_dev->host_working = 0; -+ } -+ } -+end: -+ return retval; -+} -+ -+/* -+ * Call suspend and resume function in udc driver -+ * to stop and start udc driver. -+ */ -+int fsl_otg_start_gadget(struct otg_fsm *fsm, int on) -+{ -+ struct otg_transceiver *xceiv = fsm->transceiver; -+ struct device *dev; -+ -+ VDBG("DDD fsm=%p xceiv=%p\n", fsm, xceiv); -+ if (!xceiv->gadget || !xceiv->gadget->dev.parent) -+ return -ENODEV; -+ -+ VDBG("DDD xceiv=%p xceiv->gadget=%p parent=%p\n", xceiv, xceiv->gadget, -+ xceiv->gadget->dev.parent); -+ -+ VDBG("gadget %s\n", on ? "on" : "off"); -+ /* DDD dump_state("starting gadget", fsm); */ -+ -+ dev = xceiv->gadget->dev.parent; -+ -+ if (on) -+ dev->driver->resume(dev); -+ else -+ dev->driver->suspend(dev, PMSG_SUSPEND); -+ -+ return 0; -+} -+ -+#if 0 -+static void fsl_otg_enable(struct otg_transceiver *otg_p) -+{ -+ struct fsl_otg *otg_dev = container_of(otg_p, struct fsl_otg, otg); -+ struct otg_fsm *fsm = &(otg_dev)->fsm; -+ u32 otg_sc; -+ -+ /* DDD VDBG(""); */ -+ /* enable OTG interrupt */ -+ otg_sc = fsl_readl(&usb_dr_regs->otgsc); -+ otg_sc |= OTGSC_INTERRUPT_ENABLE_BITS_MASK; -+ otg_sc &= ~OTGSC_IE_1ms_TIMER; -+ otg_sc &= ~OTGSC_CTRL_VBUS_DISCHARGE; -+ otg_sc |= OTGSC_IE_USB_ID; -+ fsl_writel(otg_sc, &usb_dr_regs->otgsc); -+ -+ fsm->id = (otg_sc & OTGSC_STS_USB_ID) ? 1 : 0; -+ -+ if (fsm->id) { -+ otg_p->state = OTG_STATE_UNDEFINED; -+ } else { -+ otg_p->state = OTG_STATE_A_IDLE; -+ } -+ -+ otg_p->default_a = (fsm->id == 0); -+ otg_p->host->is_b_host = fsm->id; -+ otg_p->gadget->is_a_peripheral = !fsm->id; -+ -+ fsm->a_vbus_vld = 1; -+ -+ fsm->b_sess_vld = (otg_sc & OTGSC_STS_B_SESSION_VALID) ? 1 : 0; -+ fsm->a_sess_vld = (otg_sc & OTGSC_STS_A_SESSION_VALID) ? 1 : 0; -+ fsm->b_sess_end = (otg_sc & OTGSC_STS_B_SESSION_END) ? 1 : 0; -+} -+#endif -+ -+/* -+ * Called by initialization code of host driver. Register host controller -+ * to the OTG. Suspend host for OTG role detection. -+ */ -+static int fsl_otg_set_host(struct otg_transceiver *otg_p, struct usb_bus *host) -+{ -+ struct fsl_otg *otg_dev = container_of(otg_p, struct fsl_otg, otg); -+ -+ if (!otg_p || otg_dev != fsl_otg_dev) -+ return -ENODEV; -+ -+ otg_p->host = host; -+ -+ otg_dev->fsm.a_bus_drop = 0; -+ otg_dev->fsm.a_bus_req = 1; -+ -+ if (host) { -+ VDBG("host off......\n"); -+ -+ otg_p->host->otg_port = fsl_otg_initdata.otg_port; -+ otg_p->host->is_b_host = otg_dev->fsm.id; -+ /* must leave time for khubd to finish its thing -+ * before yanking the host driver out from under it, -+ * so suspend the host after a short delay. -+ */ -+ otg_dev->host_working = 1; -+ schedule_delayed_work(&otg_dev->otg_event, 100); -+ return 0; -+ } else { /* host driver going away */ -+ -+ if (!(le32_to_cpu(otg_dev->dr_mem_map->otgsc) & -+ OTGSC_STS_USB_ID)) { -+ /* Mini-A cable connected */ -+ struct otg_fsm *fsm = &otg_dev->fsm; -+ -+ otg_p->state = OTG_STATE_UNDEFINED; -+ fsm->protocol = PROTO_UNDEF; -+ } -+ } -+ -+ otg_dev->host_working = 0; -+ -+ otg_statemachine(&otg_dev->fsm); -+ -+ return 0; -+} -+ -+/* Called by initialization code of udc. Register udc to OTG.*/ -+static int fsl_otg_set_peripheral(struct otg_transceiver *otg_p, -+ struct usb_gadget *gadget) -+{ -+ struct fsl_otg *otg_dev = container_of(otg_p, struct fsl_otg, otg); -+ -+ VDBG("\n"); -+ -+ if (!otg_p || otg_dev != fsl_otg_dev) -+ return -ENODEV; -+ -+ if (!gadget) { -+ if (!otg_dev->otg.default_a) -+ otg_p->gadget->ops->vbus_draw(otg_p->gadget, 0); -+ usb_gadget_vbus_disconnect(otg_dev->otg.gadget); -+ otg_dev->otg.gadget = 0; -+ otg_dev->fsm.b_bus_req = 0; -+ otg_statemachine(&otg_dev->fsm); -+ return 0; -+ } -+ -+ otg_p->gadget = gadget; -+ otg_p->gadget->is_a_peripheral = !otg_dev->fsm.id; -+ -+ otg_dev->fsm.b_bus_req = 1; -+ -+ /* start the gadget right away if the ID pin says Mini-B */ -+ DBG("ID pin=%d\n", otg_dev->fsm.id); -+ if (otg_dev->fsm.id == 1) { -+ fsl_otg_start_host(&otg_dev->fsm, 0); -+ fsl_otg_drv_vbus(0); -+ fsl_otg_start_gadget(&otg_dev->fsm, 1); -+ } -+ -+ return 0; -+} -+ -+/* Set OTG port power, only for B-device */ -+static int fsl_otg_set_power(struct otg_transceiver *otg_p, unsigned mA) -+{ -+ if (!fsl_otg_dev) -+ return -ENODEV; -+ if (otg_p->state == OTG_STATE_B_PERIPHERAL) -+ printk(KERN_DEBUG "FSL OTG:Draw %d mA\n", mA); -+ -+ return 0; -+} -+ -+/* Delayed pin detect interrupt processing. -+ * -+ * When the Mini-A cable is disconnected from the board, -+ * the pin-detect interrupt happens before the disconnnect -+ * interrupts for the connected device(s). In order to -+ * process the disconnect interrupt(s) prior to switching -+ * roles, the pin-detect interrupts are delayed, and handled -+ * by this routine. -+ */ -+static void fsl_otg_event(struct work_struct *work) -+{ -+ struct fsl_otg *og = container_of(work, struct fsl_otg, otg_event.work); -+ struct otg_fsm *fsm = &og->fsm; -+ -+ VDBG("DDD fsm->id=%d\n", fsm->id); -+ if (fsm->id) { /* switch to gadget */ -+ fsl_otg_start_host(fsm, 0); -+ fsl_otg_drv_vbus(0); -+ fsl_otg_start_gadget(fsm, 1); -+ } -+} -+ -+/* B-device start SRP */ -+static int fsl_otg_start_srp(struct otg_transceiver *otg_p) -+{ -+ struct fsl_otg *otg_dev = container_of(otg_p, struct fsl_otg, otg); -+ -+ if (!otg_p || otg_dev != fsl_otg_dev -+ || otg_p->state != OTG_STATE_B_IDLE) -+ return -ENODEV; -+ -+ otg_dev->fsm.b_bus_req = 1; -+ otg_statemachine(&otg_dev->fsm); -+ -+ return 0; -+} -+ -+/* A_host suspend will call this function to start hnp */ -+static int fsl_otg_start_hnp(struct otg_transceiver *otg_p) -+{ -+ struct fsl_otg *otg_dev = container_of(otg_p, struct fsl_otg, otg); -+ -+ if (!otg_p || otg_dev != fsl_otg_dev) -+ return -ENODEV; -+ -+ VDBG("start_hnp.............\n"); -+ /* clear a_bus_req to enter a_suspend state */ -+ otg_dev->fsm.a_bus_req = 0; -+ otg_statemachine(&otg_dev->fsm); -+ -+ return 0; -+} -+ -+/* -+ * Interrupt handler. OTG/host/peripheral share the same int line. -+ * OTG driver clears OTGSC interrupts and leaves USB interrupts -+ * intact. It needs to have knowledge of some USB interrupts -+ * such as port change. -+ */ -+irqreturn_t fsl_otg_isr(int irq, void *dev_id) -+{ -+ struct otg_fsm *fsm = &((struct fsl_otg *)dev_id)->fsm; -+ struct otg_transceiver *otg = &((struct fsl_otg *)dev_id)->otg; -+ u32 otg_int_src, otg_sc; -+ -+ otg_sc = fsl_readl(&usb_dr_regs->otgsc); -+ otg_int_src = otg_sc & OTGSC_INTSTS_MASK & (otg_sc >> 8); -+ -+ /* Only clear otg interrupts */ -+ fsl_writel(otg_sc, &usb_dr_regs->otgsc); -+ -+ /*FIXME: ID change not generate when init to 0 */ -+ fsm->id = (otg_sc & OTGSC_STS_USB_ID) ? 1 : 0; -+ otg->default_a = (fsm->id == 0); -+ -+ /* process OTG interrupts */ -+ if (otg_int_src) { -+ VDBG("\nOTG irq 0x%08x\n", otg_int_src); -+ -+ if (otg_int_src & OTGSC_INTSTS_USB_ID) { -+ fsm->id = (otg_sc & OTGSC_STS_USB_ID) ? 1 : 0; -+ otg->default_a = (fsm->id == 0); -+ /* clear conn information */ -+ if (fsm->id) -+ fsm->b_conn = 0; -+ else -+ fsm->a_conn = 0; -+ -+ if (otg->host) -+ otg->host->is_b_host = fsm->id; -+ if (otg->gadget) -+ otg->gadget->is_a_peripheral = !fsm->id; -+ VDBG("ID int (ID is %d)\n", fsm->id); -+ -+ if (fsm->id) { /* switch to gadget */ -+ schedule_delayed_work(&((struct fsl_otg *) -+ dev_id)->otg_event, 25); -+ } else { /* switch to host */ -+ cancel_delayed_work(& -+ ((struct fsl_otg *)dev_id)-> -+ otg_event); -+ fsl_otg_start_gadget(fsm, 0); -+ fsl_otg_drv_vbus(1); -+ fsl_otg_start_host(fsm, 1); -+ } -+ -+ return IRQ_HANDLED; -+ } -+ } -+ -+ return IRQ_NONE; -+} -+ -+ -+static struct otg_fsm_ops fsl_otg_ops = { -+ .chrg_vbus = fsl_otg_chrg_vbus, -+ .drv_vbus = fsl_otg_drv_vbus, -+ .loc_conn = fsl_otg_loc_conn, -+ .loc_sof = fsl_otg_loc_sof, -+ .start_pulse = fsl_otg_start_pulse, -+ -+ .add_timer = fsl_otg_add_timer, -+ .del_timer = fsl_otg_del_timer, -+ -+ .start_host = fsl_otg_start_host, -+ .start_gadget = fsl_otg_start_gadget, -+}; -+ -+/* Initialize the global variable fsl_otg_dev and request IRQ for OTG */ -+int fsl_otg_cfg(struct platform_device *pdev) -+{ -+ int status; -+ struct fsl_otg *fsl_otg_tc; -+ struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data; -+ struct resource *res; -+ -+ DBG("\n"); -+ -+ if (fsl_otg_dev) -+ return 0; -+ -+ /* allocate space to fsl otg device */ -+ fsl_otg_tc = kzalloc(sizeof(struct fsl_otg), GFP_KERNEL); -+ if (!fsl_otg_tc) -+ return -ENODEV; -+ -+ if (pdata->regs) { -+ fsl_otg_tc->dr_mem_map = pdata->regs; -+ } else { -+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0); -+ if (!res) { -+ dev_err(&pdev->dev, "no register addr.\n"); -+ return -ENODEV; -+ } -+ -+ /* -+ printk("DDD %s(): rsrc_start=0x%x rsrc_len=0x%x\n", -+ __FUNCTION__, res->start, res->end - res->start + 1); -+ */ -+ -+ if (!request_mem_region(res->start, res->end - res->start + 1, -+ "OTG")) { -+ dev_dbg(&pdev->dev, "request_mem_region failed\n"); -+ return -EBUSY; -+ } -+ fsl_otg_tc->dr_mem_map = ioremap(res->start, -+ res->end - res->start + 1); -+ } -+ DBG("set dr_mem_map to 0x%p\n", fsl_otg_tc->dr_mem_map); -+ -+ INIT_DELAYED_WORK(&fsl_otg_tc->otg_event, fsl_otg_event); -+ -+ INIT_LIST_HEAD(&active_timers); -+ fsl_otg_init_timers(&fsl_otg_tc->fsm); -+ -+ /* Set OTG state machine operations */ -+ fsl_otg_tc->fsm.ops = &fsl_otg_ops; -+ -+ /* record initial state of ID pin */ -+ fsl_otg_tc->fsm.id = (fsl_otg_tc->dr_mem_map->otgsc & OTGSC_STS_USB_ID) -+ ? 1 : 0; -+ DBG("initial ID pin=%d\n", fsl_otg_tc->fsm.id); -+ -+ /* initialize the otg structure */ -+ fsl_otg_tc->otg.label = DRIVER_DESC; -+ fsl_otg_tc->otg.set_host = fsl_otg_set_host; -+ fsl_otg_tc->otg.set_peripheral = fsl_otg_set_peripheral; -+ fsl_otg_tc->otg.set_power = fsl_otg_set_power; -+ fsl_otg_tc->otg.start_hnp = fsl_otg_start_hnp; -+ fsl_otg_tc->otg.start_srp = fsl_otg_start_srp; -+ -+ fsl_otg_dev = fsl_otg_tc; -+ -+ /* Store the otg transceiver */ -+ status = otg_set_transceiver(&fsl_otg_tc->otg); -+ if (status) { -+ printk(KERN_WARNING ": unable to register OTG transceiver.\n"); -+ return status; -+ } -+ -+ return 0; -+} -+ -+/* OTG Initialization*/ -+int usb_otg_start(struct platform_device *pdev) -+{ -+ struct fsl_otg *p_otg; -+ struct otg_transceiver *otg_trans = otg_get_transceiver(); -+ struct otg_fsm *fsm; -+ int status; -+ u32 temp; -+ struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data; -+ int timeout; -+ -+ DBG("\n"); -+ -+ p_otg = container_of(otg_trans, struct fsl_otg, otg); -+ fsm = &p_otg->fsm; -+ -+ /* Initialize the state machine structure with default values */ -+ SET_OTG_STATE(otg_trans, OTG_STATE_UNDEFINED); -+ fsm->transceiver = &p_otg->otg; -+ -+ usb_dr_regs = p_otg->dr_mem_map; -+ DBG("set usb_dr_regs to 0x%p\n", usb_dr_regs); -+ -+ /* request irq */ -+ p_otg->irq = platform_get_irq(pdev, 0); -+ status = request_irq(p_otg->irq, fsl_otg_isr, -+ IRQF_SHARED, driver_name, p_otg); -+ if (status) { -+ dev_dbg(p_otg->otg.dev, "can't get IRQ %d, error %d\n", -+ p_otg->irq, status); -+ kfree(p_otg); -+ return status; -+ } -+ -+ -+ /* stop the controller */ -+ temp = fsl_readl(&usb_dr_regs->usbcmd) & ~USB_CMD_RUN_STOP; -+ fsl_writel(temp, &usb_dr_regs->usbcmd); -+ -+ /* reset the controller */ -+ temp = fsl_readl(&usb_dr_regs->usbcmd); -+ temp |= USB_CMD_CTRL_RESET; -+ fsl_writel(temp, &usb_dr_regs->usbcmd); -+ -+ /* wait reset completed */ -+ timeout = 500; -+ while (timeout-- && -+ fsl_readl(&usb_dr_regs->usbcmd) & USB_CMD_CTRL_RESET) -+ udelay(1); -+ if (timeout <= 0) -+ ERR("%s - USBCMD_RST never clear. Timeout is %d \n", -+ __FUNCTION__, timeout); -+ -+ /* configure the VBUSHS as IDLE(both host and device) */ -+ temp = USB_MODE_STREAM_DISABLE | (pdata->es ? USBMODE_ES : 0); -+ fsl_writel(temp, &usb_dr_regs->usbmode); -+ -+ /* configure PHY interface */ -+ temp = fsl_readl(&usb_dr_regs->portsc1); -+ temp &= ~(PORTSCX_PHY_TYPE_SEL | PORTSCX_PTW_8BIT); -+ -+ /* DDD wrong xcvr setting stuff follows */ -+ temp |= PORTSCX_PTS_ULPI; -+ fsl_writel(temp, &usb_dr_regs->portsc1); -+ -+ -+ /* disable all interrupt and clear all OTGSC status */ -+ temp = fsl_readl(&usb_dr_regs->otgsc); -+ temp &= ~OTGSC_INTERRUPT_ENABLE_BITS_MASK; -+ temp |= OTGSC_INTERRUPT_STATUS_BITS_MASK | OTGSC_CTRL_VBUS_DISCHARGE; -+ fsl_writel(temp, &usb_dr_regs->otgsc); -+ -+ fsl_otg_drv_vbus(0); -+ -+ /* -+ * The identification (id) input is FALSE when a Mini-A plug is inserted -+ * in the devices Mini-AB receptacle. Otherwise, this input is TRUE. -+ * Also: record initial state of ID pin -+ */ -+ if (fsl_readl(&usb_dr_regs->otgsc) & OTGSC_STS_USB_ID) { -+ p_otg->otg.state = OTG_STATE_UNDEFINED; -+ p_otg->fsm.id = 1; -+ } else { -+ p_otg->otg.state = OTG_STATE_A_IDLE; -+ p_otg->fsm.id = 0; -+ } -+ -+ DBG("initial ID pin=%d\n", p_otg->fsm.id); -+ -+ /* enable OTG ID pin interrupt */ -+ temp = fsl_readl(&usb_dr_regs->otgsc); -+ temp |= OTGSC_IE_USB_ID; -+ temp &= ~(OTGSC_CTRL_VBUS_DISCHARGE | OTGSC_IE_1ms_TIMER); -+ fsl_writel(temp, &usb_dr_regs->otgsc); -+ -+ return 0; -+} -+ -+/* Initialize board specific registers,PIB board,clock and pin multiplexing */ -+static int board_init(struct platform_device *pdev) -+{ -+ struct fsl_usb2_platform_data *pdata; -+ pdata = (struct fsl_usb2_platform_data *)pdev->dev.platform_data; -+ -+ /* -+ * do platform specific init: check the clock, grab/config pins, etc. -+ */ -+ if (pdata->platform_init(pdev) != 0) -+ return -EINVAL; -+ -+ return 0; -+} -+ -+/*------------------------------------------------------------------------- -+ PROC File System Support -+-------------------------------------------------------------------------*/ -+#ifdef CONFIG_USB_OTG_DEBUG_FILES -+ -+#include <linux/seq_file.h> -+ -+static const char proc_filename[] = "driver/fsl_usb2_otg"; -+ -+static int otg_proc_read(char *page, char **start, off_t off, int count, -+ int *eof, void *_dev) -+{ -+ struct otg_fsm *fsm = &fsl_otg_dev->fsm; -+ char *buf = page; -+ char *next = buf; -+ unsigned size = count; -+ unsigned long flags; -+ int t; -+ u32 tmp_reg; -+ -+ if (off != 0) -+ return 0; -+ -+ spin_lock_irqsave(&fsm->lock, flags); -+ -+ /* ------basic driver infomation ---- */ -+ t = scnprintf(next, size, -+ DRIVER_DESC "\n" "fsl_usb2_otg version: %s\n\n", -+ DRIVER_VERSION); -+ size -= t; -+ next += t; -+ -+ /* ------ Registers ----- */ -+ /* tmp_reg = le32_to_cpu(usb_dr_regs->otgsc); */ -+ tmp_reg = fsl_readl(&usb_dr_regs->otgsc); -+ t = scnprintf(next, size, "OTGSC reg: 0x%08x\n", tmp_reg); -+ size -= t; -+ next += t; -+ -+ /* tmp_reg = le32_to_cpu(usb_dr_regs->portsc); */ -+ tmp_reg = fsl_readl(&usb_dr_regs->portsc1); -+ t = scnprintf(next, size, "PORTSC reg: 0x%08x\n", tmp_reg); -+ size -= t; -+ next += t; -+ -+ /* tmp_reg = le32_to_cpu(usb_dr_regs->usbmode); */ -+ tmp_reg = fsl_readl(&usb_dr_regs->usbmode); -+ t = scnprintf(next, size, "USBMODE reg: 0x%08x\n", tmp_reg); -+ size -= t; -+ next += t; -+ -+ /* tmp_reg = le32_to_cpu(usb_dr_regs->usbcmd); */ -+ tmp_reg = fsl_readl(&usb_dr_regs->usbcmd); -+ t = scnprintf(next, size, "USBCMD reg: 0x%08x\n", tmp_reg); -+ size -= t; -+ next += t; -+ -+ /* tmp_reg = le32_to_cpu(usb_dr_regs->usbsts); */ -+ tmp_reg = fsl_readl(&usb_dr_regs->usbsts); -+ t = scnprintf(next, size, "USBSTS reg: 0x%08x\n", tmp_reg); -+ size -= t; -+ next += t; -+ -+ /* ------ State ----- */ -+ t = scnprintf(next, size, "FSM protocol=%d %s\n", fsm->protocol, -+ fsm->protocol ? -+ (fsm->protocol == PROTO_HOST ? "Host" : "Gadget") -+ : "None"); -+ size -= t; -+ next += t; -+ -+ t = scnprintf(next, size, -+ "OTG state: %s\n\n", -+ state_string(fsl_otg_dev->otg.state)); -+ size -= t; -+ next += t; -+ -+ /* ------ State Machine Variables ----- */ -+ t = scnprintf(next, size, "a_bus_req: %d\n", fsm->a_bus_req); -+ size -= t; -+ next += t; -+ -+ t = scnprintf(next, size, "b_bus_req: %d\n", fsm->b_bus_req); -+ size -= t; -+ next += t; -+ -+ t = scnprintf(next, size, "a_bus_resume: %d\n", fsm->a_bus_resume); -+ size -= t; -+ next += t; -+ -+ t = scnprintf(next, size, "a_bus_suspend: %d\n", fsm->a_bus_suspend); -+ size -= t; -+ next += t; -+ -+ t = scnprintf(next, size, "a_conn: %d\n", fsm->a_conn); -+ size -= t; -+ next += t; -+ -+ t = scnprintf(next, size, "a_sess_vld: %d\n", fsm->a_sess_vld); -+ size -= t; -+ next += t; -+ -+ t = scnprintf(next, size, "a_srp_det: %d\n", fsm->a_srp_det); -+ size -= t; -+ next += t; -+ -+ t = scnprintf(next, size, "a_vbus_vld: %d\n", fsm->a_vbus_vld); -+ size -= t; -+ next += t; -+ -+ t = scnprintf(next, size, "b_bus_resume: %d\n", fsm->b_bus_resume); -+ size -= t; -+ next += t; -+ -+ t = scnprintf(next, size, "b_bus_suspend: %d\n", fsm->b_bus_suspend); -+ size -= t; -+ next += t; -+ -+ t = scnprintf(next, size, "b_conn: %d\n", fsm->b_conn); -+ size -= t; -+ next += t; -+ -+ t = scnprintf(next, size, "b_se0_srp: %d\n", fsm->b_se0_srp); -+ size -= t; -+ next += t; -+ -+ t = scnprintf(next, size, "b_sess_end: %d\n", fsm->b_sess_end); -+ size -= t; -+ next += t; -+ -+ t = scnprintf(next, size, "b_sess_vld: %d\n", fsm->b_sess_vld); -+ size -= t; -+ next += t; -+ -+ t = scnprintf(next, size, "id: %d\n", fsm->id); -+ size -= t; -+ next += t; -+ -+ spin_unlock_irqrestore(&fsm->lock, flags); -+ -+ *eof = 1; -+ return count - size; -+} -+ -+#define create_proc_file() create_proc_read_entry(proc_filename, \ -+ 0, NULL, otg_proc_read, NULL) -+ -+#define remove_proc_file() remove_proc_entry(proc_filename, NULL) -+ -+#else /* !CONFIG_USB_OTG_DEBUG_FILES */ -+ -+#define create_proc_file() do {} while (0) -+#define remove_proc_file() do {} while (0) -+ -+#endif /*CONFIG_USB_OTG_DEBUG_FILES */ -+ -+/*----------------------------------------------------------*/ -+/* Char driver interface to control some OTG input */ -+ -+/* -+ * This function handle some ioctl command,such as get otg -+ * status and set host suspend -+ */ -+static int fsl_otg_ioctl(struct inode *inode, struct file *file, -+ unsigned int cmd, unsigned long arg) -+{ -+ u32 retval = 0; -+ -+ switch (cmd) { -+ case GET_OTG_STATUS: -+ retval = fsl_otg_dev->host_working; -+ break; -+ -+ case SET_A_SUSPEND_REQ: -+ fsl_otg_dev->fsm.a_suspend_req = arg; -+ break; -+ -+ case SET_A_BUS_DROP: -+ fsl_otg_dev->fsm.a_bus_drop = arg; -+ break; -+ -+ case SET_A_BUS_REQ: -+ fsl_otg_dev->fsm.a_bus_req = arg; -+ break; -+ -+ case SET_B_BUS_REQ: -+ fsl_otg_dev->fsm.b_bus_req = arg; -+ break; -+ -+ default: -+ break; -+ } -+ -+ otg_statemachine(&fsl_otg_dev->fsm); -+ -+ return retval; -+} -+ -+static int fsl_otg_open(struct inode *inode, struct file *file) -+{ -+ -+ return 0; -+} -+ -+static int fsl_otg_release(struct inode *inode, struct file *file) -+{ -+ -+ return 0; -+} -+ -+static struct file_operations otg_fops = { -+ .owner = THIS_MODULE, -+ .llseek = NULL, -+ .read = NULL, -+ .write = NULL, -+ .ioctl = fsl_otg_ioctl, -+ .open = fsl_otg_open, -+ .release = fsl_otg_release, -+}; -+ -+static int __init fsl_otg_probe(struct platform_device *pdev) -+{ -+ int status; -+ struct fsl_usb2_platform_data *pdata; -+ -+ DBG("pdev=0x%p\n", pdev); -+ -+ if (!pdev) -+ return -ENODEV; -+ -+ if (!pdev->dev.platform_data) -+ return -ENOMEM; -+ -+ pdata = pdev->dev.platform_data; -+ /* Initialize the clock, multiplexing pin and PHY interface */ -+ board_init(pdev); -+ -+ /* configure the OTG */ -+ status = fsl_otg_cfg(pdev); -+ if (status) { -+ printk(KERN_INFO "Couldn't init OTG module\n"); -+ return -status; -+ } -+ -+ /* start OTG */ -+ status = usb_otg_start(pdev); -+ -+ if (register_chrdev(FSL_OTG_MAJOR, FSL_OTG_NAME, &otg_fops)) { -+ printk(KERN_WARNING FSL_OTG_NAME -+ ": unable to register FSL OTG device\n"); -+ return -EIO; -+ } -+ -+ create_proc_file(); -+ return status; -+} -+ -+static int fsl_otg_remove(struct platform_device *pdev) -+{ -+ u32 ie; -+ struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data; -+ unsigned long flags; -+ -+ DBG("pdev=0x%p pdata=0x%p\n", pdev, pdata); -+ -+ otg_set_transceiver(NULL); -+ -+ /* disable and clear OTGSC interrupts */ -+ spin_lock_irqsave(&usb_dr_regs_lock, flags); -+ ie = fsl_readl(&usb_dr_regs->otgsc); -+ ie &= ~OTGSC_INTERRUPT_ENABLE_BITS_MASK; -+ ie |= OTGSC_INTERRUPT_STATUS_BITS_MASK; -+ fsl_writel(ie, &usb_dr_regs->otgsc); -+ spin_unlock_irqrestore(&usb_dr_regs_lock, flags); -+ -+ free_irq(fsl_otg_dev->irq, fsl_otg_dev); -+ -+ kfree(fsl_otg_dev); -+ -+ remove_proc_file(); -+ -+ unregister_chrdev(FSL_OTG_MAJOR, FSL_OTG_NAME); -+ -+ if (pdata->platform_uninit) -+ pdata->platform_uninit(pdev); -+ -+ fsl_otg_dev = NULL; -+ return 0; -+} -+ -+struct platform_driver fsl_otg_driver = { -+ .probe = fsl_otg_probe, -+ .remove = fsl_otg_remove, -+ .driver = { -+ .name = driver_name, -+ .owner = THIS_MODULE, -+ }, -+}; -+ -+/*-------------------------------------------------------------------------*/ -+ -+static int __init fsl_usb_otg_init(void) -+{ -+ printk(KERN_INFO DRIVER_DESC " loaded, %s\n", DRIVER_VERSION); -+ return platform_driver_register(&fsl_otg_driver); -+} -+ -+static void __exit fsl_usb_otg_exit(void) -+{ -+ platform_driver_unregister(&fsl_otg_driver); -+} -+ -+module_init(fsl_usb_otg_init); -+module_exit(fsl_usb_otg_exit); -+ -+MODULE_DESCRIPTION(DRIVER_INFO); -+MODULE_AUTHOR(DRIVER_AUTHOR); -+MODULE_LICENSE("GPL"); ---- /dev/null -+++ b/drivers/usb/otg/fsl_otg.h -@@ -0,0 +1,139 @@ -+/* -+ * Copyright 2005-2007 Freescale Semiconductor, Inc. All Rights Reserved. -+ */ -+ -+/* -+ * The code contained herein is licensed under the GNU General Public -+ * License. You may obtain a copy of the GNU General Public License -+ * Version 2 or later at the following locations: -+ * -+ * http://www.opensource.org/licenses/gpl-license.html -+ * http://www.gnu.org/copyleft/gpl.html -+ */ -+ -+#ifndef FSL_OTG_H -+#define FSL_OTG_H -+#include <linux/usb/otg.h> -+#include "otg_fsm.h" -+#include <linux/ioctl.h> -+ -+#define ERR(format, arg...) \ -+printk(KERN_ERR "%s:%s: " format "\n" , __FILE__, __FUNCTION__ , ## arg) -+ -+/* -+ * A-DEVICE timing constants -+ */ -+ -+/* Wait for VBUS Rise */ -+#define TA_WAIT_VRISE (100) /* a_wait_vrise 100 ms, section: 6.6.5.1 */ -+ -+/* Wait for B-Connect */ -+#define TA_WAIT_BCON (10000) /* a_wait_bcon > 1 sec, section: 6.6.5.2 -+ * This is only used to get out of -+ * OTG_STATE_A_WAIT_BCON state if there was -+ * no connection for these many milliseconds -+ */ -+ -+/* A-Idle to B-Disconnect */ -+/* It is necessary for this timer to be more than 750 ms because of a bug in OPT -+ * test 5.4 in which B OPT disconnects after 750 ms instead of 75ms as stated -+ * in the test description -+ */ -+#define TA_AIDL_BDIS (5000) /* a_suspend minimum 200 ms, section: 6.6.5.3 */ -+ -+/* B-Idle to A-Disconnect */ -+#define TA_BIDL_ADIS (12) /* 3 to 200 ms */ -+ -+/* B-device timing constants */ -+ -+/* Data-Line Pulse Time*/ -+#define TB_DATA_PLS (10) /* b_srp_init,continue 5~10ms, section:5.3.3 */ -+#define TB_DATA_PLS_MIN (5) /* minimum 5 ms */ -+#define TB_DATA_PLS_MAX (10) /* maximum 10 ms */ -+ -+/* SRP Initiate Time */ -+#define TB_SRP_INIT (100) /* b_srp_init,maximum 100 ms, section:5.3.8 */ -+ -+/* SRP Fail Time */ -+#define TB_SRP_FAIL (7000) /* b_srp_init,Fail time 5~30s, section:6.8.2.2 */ -+ -+/* SRP result wait time */ -+#define TB_SRP_WAIT (60) -+ -+/* VBus time */ -+#define TB_VBUS_PLS (30) /* time to keep vbus pulsing asserted */ -+ -+/* Discharge time */ -+/* This time should be less than 10ms. It varies from system to system. */ -+#define TB_VBUS_DSCHRG (8) -+ -+/* A-SE0 to B-Reset */ -+#define TB_ASE0_BRST (20) /* b_wait_acon, mini 3.125 ms,section:6.8.2.4 */ -+ -+/* A bus suspend timer before we can switch to b_wait_aconn */ -+#define TB_A_SUSPEND (7) -+#define TB_BUS_RESUME (12) -+ -+/* SE0 Time Before SRP */ -+#define TB_SE0_SRP (2) /* b_idle,minimum 2 ms, section:5.3.2 */ -+ -+#define SET_OTG_STATE(otg_ptr, newstate) ((otg_ptr)->state = newstate) -+ -+ -+struct fsl_otg_timer { -+ unsigned long expires; /* Number of count increase to timeout */ -+ unsigned long count; /* Tick counter */ -+ void (*function) (unsigned long); /* Timeout function */ -+ unsigned long data; /* Data passed to function */ -+ struct list_head list; -+}; -+ -+struct fsl_otg_timer inline *otg_timer_initializer -+ (void (*function) (unsigned long), unsigned long expires, -+ unsigned long data) { -+ struct fsl_otg_timer *timer; -+ timer = kmalloc(sizeof(struct fsl_otg_timer), GFP_KERNEL); -+ if (timer == NULL) -+ return NULL; -+ timer->function = function; -+ timer->expires = expires; -+ timer->data = data; -+ return timer; -+} -+ -+struct fsl_otg { -+ struct otg_transceiver otg; -+ struct otg_fsm fsm; -+ struct fsl_usb_device_regs *dr_mem_map; -+ struct delayed_work otg_event; -+ -+ /*used for usb host */ -+ u8 host_working; -+ u8 on_off; -+ -+ int irq; -+}; -+ -+struct fsl_otg_config { -+ u8 otg_port; -+}; -+ -+/*For SRP and HNP handle*/ -+#define FSL_OTG_MAJOR 66 -+#define FSL_OTG_NAME "fsl-otg" -+/*Command to OTG driver(ioctl)*/ -+#define OTG_IOCTL_MAGIC FSL_OTG_MAJOR -+/*if otg work as host,it should return 1,otherwise it return 0*/ -+#define GET_OTG_STATUS _IOR(OTG_IOCTL_MAGIC, 1, int) -+#define SET_A_SUSPEND_REQ _IOW(OTG_IOCTL_MAGIC, 2, int) -+#define SET_A_BUS_DROP _IOW(OTG_IOCTL_MAGIC, 3, int) -+#define SET_A_BUS_REQ _IOW(OTG_IOCTL_MAGIC, 4, int) -+#define SET_B_BUS_REQ _IOW(OTG_IOCTL_MAGIC, 5, int) -+#define GET_A_SUSPEND_REQ _IOR(OTG_IOCTL_MAGIC, 6, int) -+#define GET_A_BUS_DROP _IOR(OTG_IOCTL_MAGIC, 7, int) -+#define GET_A_BUS_REQ _IOR(OTG_IOCTL_MAGIC, 8, int) -+#define GET_B_BUS_REQ _IOR(OTG_IOCTL_MAGIC, 9, int) -+ -+ -+/********************************************************************/ -+#endif ---- /dev/null -+++ b/drivers/usb/otg/Makefile -@@ -0,0 +1,5 @@ -+# -+# Makefile for USB OTG controller driver -+# -+fsl_usb2_otg-objs := fsl_otg.o otg_fsm.o -+obj-y += fsl_usb2_otg.o ---- /dev/null -+++ b/drivers/usb/otg/otg_fsm.c -@@ -0,0 +1,381 @@ -+/* OTG Finite State Machine from OTG spec -+ * -+ * Copyright (C) 2007 Freescale Semiconductor, Inc. -+ * -+ * Author: Li Yang <LeoLi@freescale.com> -+ * Jerry Huang <Chang-Ming.Huang@freescale.com> -+ * -+ * This program is free software; you can redistribute it and/or modify it -+ * under the terms of the GNU General Public License as published by the -+ * Free Software Foundation; either version 2 of the License, or (at your -+ * option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, but -+ * WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ * General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License along -+ * with this program; if not, write to the Free Software Foundation, Inc., -+ * 675 Mass Ave, Cambridge, MA 02139, USA. -+ */ -+ -+#include <linux/kernel.h> -+#include <linux/types.h> -+#include <linux/usb/otg.h> -+#include <linux/spinlock.h> -+#include <linux/delay.h> -+#include <linux/usb.h> -+#include <linux/usb_gadget.h> -+ -+#include "otg_fsm.h" -+ -+ -+/* Defined by device specific driver, for different timer implementation */ -+extern void *a_wait_vrise_tmr, *a_wait_bcon_tmr, *a_aidl_bdis_tmr, -+ *b_ase0_brst_tmr, *b_se0_srp_tmr, *b_srp_fail_tmr, *a_wait_enum_tmr; -+ -+const char *state_string(enum usb_otg_state state) -+{ -+ switch (state) { -+ case OTG_STATE_A_IDLE: return "a_idle"; -+ case OTG_STATE_A_WAIT_VRISE: return "a_wait_vrise"; -+ case OTG_STATE_A_WAIT_BCON: return "a_wait_bcon"; -+ case OTG_STATE_A_HOST: return "a_host"; -+ case OTG_STATE_A_SUSPEND: return "a_suspend"; -+ case OTG_STATE_A_PERIPHERAL: return "a_peripheral"; -+ case OTG_STATE_A_WAIT_VFALL: return "a_wait_vfall"; -+ case OTG_STATE_A_VBUS_ERR: return "a_vbus_err"; -+ case OTG_STATE_B_IDLE: return "b_idle"; -+ case OTG_STATE_B_SRP_INIT: return "b_srp_init"; -+ case OTG_STATE_B_PERIPHERAL: return "b_peripheral"; -+ case OTG_STATE_B_WAIT_ACON: return "b_wait_acon"; -+ case OTG_STATE_B_HOST: return "b_host"; -+ default: return "UNDEFINED"; -+ } -+} -+EXPORT_SYMBOL(state_string); -+ -+/* Change USB protocol when there is a protocol change */ -+static int otg_set_protocol(struct otg_fsm *fsm, int protocol) -+{ -+ int ret = 0; -+ -+ VDBG("DDD old fsm->protocol= %d; new protocol= %d\n", -+ fsm->protocol, protocol); -+ if (fsm->protocol != protocol) { -+ VDBG("Changing role fsm->protocol= %d; new protocol= %d\n", -+ fsm->protocol, protocol); -+ /* stop old protocol */ -+ if (fsm->protocol == PROTO_HOST) -+ ret = fsm->ops->start_host(fsm, 0); -+ else if (fsm->protocol == PROTO_GADGET) -+ ret = fsm->ops->start_gadget(fsm, 0); -+ if (ret) -+ return ret; -+ -+ /* start new protocol */ -+ if (protocol == PROTO_HOST) -+ ret = fsm->ops->start_host(fsm, 1); -+ else if (protocol == PROTO_GADGET) -+ ret = fsm->ops->start_gadget(fsm, 1); -+ if (ret) -+ return ret; -+ -+ fsm->protocol = protocol; -+ return 0; -+ } -+ -+ return 0; -+} -+ -+static int state_changed; -+ -+/* Called when leaving a state. Do state clean up jobs here */ -+static void otg_leave_state(struct otg_fsm *fsm, enum usb_otg_state old_state) -+{ -+ switch (old_state) { -+ case OTG_STATE_B_IDLE: -+ otg_del_timer(fsm, fsm->b_se0_srp_tmr); -+ fsm->b_se0_srp = 0; -+ break; -+ case OTG_STATE_B_SRP_INIT: -+ fsm->b_srp_done = 0; -+ break; -+ case OTG_STATE_B_PERIPHERAL: -+ break; -+ case OTG_STATE_B_WAIT_ACON: -+ otg_del_timer(fsm, fsm->b_ase0_brst_tmr); -+ fsm->b_ase0_brst_tmout = 0; -+ break; -+ case OTG_STATE_B_HOST: -+ break; -+ case OTG_STATE_A_IDLE: -+ break; -+ case OTG_STATE_A_WAIT_VRISE: -+ otg_del_timer(fsm, fsm->a_wait_vrise_tmr); -+ fsm->a_wait_vrise_tmout = 0; -+ break; -+ case OTG_STATE_A_WAIT_BCON: -+ otg_del_timer(fsm, fsm->a_wait_bcon_tmr); -+ fsm->a_wait_bcon_tmout = 0; -+ break; -+ case OTG_STATE_A_HOST: -+ otg_del_timer(fsm, fsm->a_wait_enum_tmr); -+ break; -+ case OTG_STATE_A_SUSPEND: -+ otg_del_timer(fsm, fsm->a_aidl_bdis_tmr); -+ fsm->a_aidl_bdis_tmout = 0; -+ fsm->a_suspend_req = 0; -+ fsm->a_bus_req = 1; /* FIXME */ -+ break; -+ case OTG_STATE_A_PERIPHERAL: -+ break; -+ case OTG_STATE_A_WAIT_VFALL: -+ otg_del_timer(fsm, fsm->a_wait_vrise_tmr); -+ break; -+ case OTG_STATE_A_VBUS_ERR: -+ break; -+ default: -+ break; -+ } -+} -+ -+/* Called when entering a state */ -+static int otg_set_state(struct otg_fsm *fsm, enum usb_otg_state new_state) -+{ -+ state_changed = 1; -+ VDBG("State: old=%s new=%s \n", -+ state_string(fsm->transceiver->state), state_string(new_state)); -+ -+ if (fsm->transceiver->state == new_state) -+ return 0; -+ -+ otg_leave_state(fsm, fsm->transceiver->state); -+ switch (new_state) { -+ case OTG_STATE_B_IDLE: -+ otg_drv_vbus(fsm, 0); -+ otg_chrg_vbus(fsm, 0); -+ otg_loc_conn(fsm, 0); -+ otg_loc_sof(fsm, 0); -+ otg_set_protocol(fsm, PROTO_UNDEF); -+ otg_add_timer(fsm, fsm->b_se0_srp_tmr); -+ break; -+ case OTG_STATE_B_SRP_INIT: -+ otg_start_pulse(fsm); -+ otg_loc_sof(fsm, 0); -+ otg_set_protocol(fsm, PROTO_UNDEF); -+ otg_add_timer(fsm, fsm->b_srp_fail_tmr); -+ break; -+ case OTG_STATE_B_PERIPHERAL: -+ otg_chrg_vbus(fsm, 0); -+ otg_loc_conn(fsm, 1); -+ otg_loc_sof(fsm, 0); -+ otg_set_protocol(fsm, PROTO_GADGET); -+ break; -+ case OTG_STATE_B_WAIT_ACON: -+ otg_chrg_vbus(fsm, 0); -+ otg_loc_conn(fsm, 0); -+ otg_loc_sof(fsm, 0); -+ otg_set_protocol(fsm, PROTO_HOST); -+ otg_add_timer(fsm, fsm->b_ase0_brst_tmr); -+ fsm->a_bus_suspend = 0; -+ break; -+ case OTG_STATE_B_HOST: -+ otg_chrg_vbus(fsm, 0); -+ otg_loc_conn(fsm, 0); -+ otg_loc_sof(fsm, 1); -+ otg_set_protocol(fsm, PROTO_HOST); -+ usb_bus_start_enum(fsm->transceiver->host, -+ fsm->transceiver->host->otg_port); -+ break; -+ case OTG_STATE_A_IDLE: -+ otg_drv_vbus(fsm, 0); -+ otg_chrg_vbus(fsm, 0); -+ otg_loc_conn(fsm, 0); -+ otg_loc_sof(fsm, 0); -+ otg_set_protocol(fsm, PROTO_HOST); -+ break; -+ case OTG_STATE_A_WAIT_VRISE: -+ otg_drv_vbus(fsm, 1); -+ otg_loc_conn(fsm, 0); -+ otg_loc_sof(fsm, 0); -+ otg_set_protocol(fsm, PROTO_HOST); -+ otg_add_timer(fsm, fsm->a_wait_vrise_tmr); -+ break; -+ case OTG_STATE_A_WAIT_BCON: -+ otg_drv_vbus(fsm, 1); -+ otg_loc_conn(fsm, 0); -+ otg_loc_sof(fsm, 0); -+ otg_set_protocol(fsm, PROTO_HOST); -+ otg_add_timer(fsm, fsm->a_wait_bcon_tmr); -+ break; -+ case OTG_STATE_A_HOST: -+ otg_drv_vbus(fsm, 1); -+ otg_loc_conn(fsm, 0); -+ otg_loc_sof(fsm, 1); -+ otg_set_protocol(fsm, PROTO_HOST); -+ /* -+ * When HNP is triggered while a_bus_req = 0, a_host will -+ * suspend too fast to complete a_set_b_hnp_en -+ */ -+ if (!fsm->a_bus_req || fsm->a_suspend_req) -+ otg_add_timer(fsm, fsm->a_wait_enum_tmr); -+ break; -+ case OTG_STATE_A_SUSPEND: -+ otg_drv_vbus(fsm, 1); -+ otg_loc_conn(fsm, 0); -+ otg_loc_sof(fsm, 0); -+ otg_set_protocol(fsm, PROTO_HOST); -+ otg_add_timer(fsm, fsm->a_aidl_bdis_tmr); -+ -+ break; -+ case OTG_STATE_A_PERIPHERAL: -+ otg_loc_conn(fsm, 1); -+ otg_loc_sof(fsm, 0); -+ otg_set_protocol(fsm, PROTO_GADGET); -+ otg_drv_vbus(fsm, 1); -+ break; -+ case OTG_STATE_A_WAIT_VFALL: -+ otg_drv_vbus(fsm, 0); -+ otg_loc_conn(fsm, 0); -+ otg_loc_sof(fsm, 0); -+ otg_set_protocol(fsm, PROTO_HOST); -+ break; -+ case OTG_STATE_A_VBUS_ERR: -+ otg_drv_vbus(fsm, 0); -+ otg_loc_conn(fsm, 0); -+ otg_loc_sof(fsm, 0); -+ otg_set_protocol(fsm, PROTO_UNDEF); -+ break; -+ default: -+ break; -+ } -+ -+ fsm->transceiver->state = new_state; -+ return 0; -+} -+ -+/* State change judgement */ -+int otg_statemachine(struct otg_fsm *fsm) -+{ -+ enum usb_otg_state state; -+ unsigned long flags; -+ -+ spin_lock_irqsave(&fsm->lock, flags); -+ -+ state = fsm->transceiver->state; -+ state_changed = 0; -+ /* State machine state change judgement */ -+ -+ VDBG(" State: %s \n", state_string(state)); -+ -+ switch (state) { -+ case OTG_STATE_UNDEFINED: -+ if (fsm->id) -+ otg_set_state(fsm, OTG_STATE_B_IDLE); -+ else -+ otg_set_state(fsm, OTG_STATE_A_IDLE); -+ break; -+ case OTG_STATE_B_IDLE: -+ if (!fsm->id) -+ otg_set_state(fsm, OTG_STATE_A_IDLE); -+ else if (fsm->b_sess_vld && fsm->transceiver->gadget) -+ otg_set_state(fsm, OTG_STATE_B_PERIPHERAL); -+ else if (fsm->b_bus_req && fsm->b_sess_end && fsm->b_se0_srp) -+ otg_set_state(fsm, OTG_STATE_B_SRP_INIT); -+ break; -+ case OTG_STATE_B_SRP_INIT: -+ if (!fsm->id || fsm->b_srp_done) -+ otg_set_state(fsm, OTG_STATE_B_IDLE); -+ break; -+ case OTG_STATE_B_PERIPHERAL: -+ if (!fsm->id || !fsm->b_sess_vld) -+ otg_set_state(fsm, OTG_STATE_B_IDLE); -+ else if (fsm->b_bus_req && -+ fsm->transceiver-> -+ gadget->b_hnp_enable && fsm->a_bus_suspend) -+ otg_set_state(fsm, OTG_STATE_B_WAIT_ACON); -+ break; -+ case OTG_STATE_B_WAIT_ACON: -+ if (fsm->a_conn) -+ otg_set_state(fsm, OTG_STATE_B_HOST); -+ else if (!fsm->id || !fsm->b_sess_vld) -+ otg_set_state(fsm, OTG_STATE_B_IDLE); -+ else if (fsm->a_bus_resume || fsm->b_ase0_brst_tmout) { -+ fsm->b_ase0_brst_tmout = 0; -+ otg_set_state(fsm, OTG_STATE_B_PERIPHERAL); -+ } -+ break; -+ case OTG_STATE_B_HOST: -+ if (!fsm->id || !fsm->b_sess_vld) -+ otg_set_state(fsm, OTG_STATE_B_IDLE); -+ else if (!fsm->b_bus_req || !fsm->a_conn) -+ otg_set_state(fsm, OTG_STATE_B_PERIPHERAL); -+ break; -+ case OTG_STATE_A_IDLE: -+ if (fsm->id) -+ otg_set_state(fsm, OTG_STATE_B_IDLE); -+ else if (!fsm->a_bus_drop && (fsm->a_bus_req || fsm->a_srp_det)) -+ otg_set_state(fsm, OTG_STATE_A_WAIT_VRISE); -+ break; -+ case OTG_STATE_A_WAIT_VRISE: -+ if (fsm->id || fsm->a_bus_drop || fsm->a_vbus_vld || -+ fsm->a_wait_vrise_tmout) { -+ otg_set_state(fsm, OTG_STATE_A_WAIT_BCON); -+ } -+ break; -+ case OTG_STATE_A_WAIT_BCON: -+ if (!fsm->a_vbus_vld) -+ otg_set_state(fsm, OTG_STATE_A_VBUS_ERR); -+ else if (fsm->id | fsm->a_bus_drop | fsm->a_wait_bcon_tmout) -+ otg_set_state(fsm, OTG_STATE_A_WAIT_VFALL); -+ else if (fsm->b_conn) -+ otg_set_state(fsm, OTG_STATE_A_HOST); -+ break; -+ case OTG_STATE_A_HOST: -+ if ((!fsm->a_bus_req || fsm->a_suspend_req) && -+ fsm->transceiver->host->b_hnp_enable) -+ otg_set_state(fsm, OTG_STATE_A_SUSPEND); -+ else if (fsm->id || !fsm->b_conn || fsm->a_bus_drop) -+ otg_set_state(fsm, OTG_STATE_A_WAIT_BCON); -+ else if (!fsm->a_vbus_vld) -+ otg_set_state(fsm, OTG_STATE_A_VBUS_ERR); -+ break; -+ case OTG_STATE_A_SUSPEND: -+ if (!fsm->b_conn && fsm->transceiver->host->b_hnp_enable) -+ otg_set_state(fsm, OTG_STATE_A_PERIPHERAL); -+ else if (!fsm->b_conn && !fsm->transceiver->host->b_hnp_enable) -+ otg_set_state(fsm, OTG_STATE_A_WAIT_BCON); -+ else if (fsm->a_bus_req || fsm->b_bus_resume) -+ otg_set_state(fsm, OTG_STATE_A_HOST); -+ else if (fsm->id || fsm->a_bus_drop || fsm->a_aidl_bdis_tmout) -+ otg_set_state(fsm, OTG_STATE_A_WAIT_VFALL); -+ else if (!fsm->a_vbus_vld) -+ otg_set_state(fsm, OTG_STATE_A_VBUS_ERR); -+ break; -+ case OTG_STATE_A_PERIPHERAL: -+ if (fsm->id || fsm->a_bus_drop) -+ otg_set_state(fsm, OTG_STATE_A_WAIT_VFALL); -+ else if (fsm->b_bus_suspend) -+ otg_set_state(fsm, OTG_STATE_A_WAIT_BCON); -+ else if (!fsm->a_vbus_vld) -+ otg_set_state(fsm, OTG_STATE_A_VBUS_ERR); -+ break; -+ case OTG_STATE_A_WAIT_VFALL: -+ if (fsm->id || fsm->a_bus_req || (!fsm->a_sess_vld && -+ !fsm->b_conn)) -+ otg_set_state(fsm, OTG_STATE_A_IDLE); -+ break; -+ case OTG_STATE_A_VBUS_ERR: -+ if (fsm->id || fsm->a_bus_drop || fsm->a_clr_err) -+ otg_set_state(fsm, OTG_STATE_A_WAIT_VFALL); -+ break; -+ default: -+ break; -+ } -+ spin_unlock_irqrestore(&fsm->lock, flags); -+ -+ return state_changed; -+} -+EXPORT_SYMBOL(otg_statemachine); ---- /dev/null -+++ b/drivers/usb/otg/otg_fsm.h -@@ -0,0 +1,170 @@ -+/* Copyright (C) 2006-2007 Freescale Semiconductor, Inc. -+ * -+ * This program is free software; you can redistribute it and/or modify it -+ * under the terms of the GNU General Public License as published by the -+ * Free Software Foundation; either version 2 of the License, or (at your -+ * option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, but -+ * WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ * General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License along -+ * with this program; if not, write to the Free Software Foundation, Inc., -+ * 675 Mass Ave, Cambridge, MA 02139, USA. -+ */ -+ -+#ifndef OTG_FSM_H -+#define OTG_FSM_H -+ -+#if 0 -+#define DEBUG 1 -+#define VERBOSE 1 -+#endif -+ -+#ifdef DEBUG -+#define DBG(fmt, args...) printk(KERN_DEBUG "[%s] " fmt , \ -+ __FUNCTION__, ## args) -+#else -+#define DBG(fmt, args...) do {} while (0) -+#endif -+ -+#ifdef VERBOSE -+#define VDBG DBG -+#else -+#define VDBG(stuff...) do {} while (0) -+#endif -+ -+#ifdef VERBOSE -+#define MPC_LOC printk("Current Location [%s]:[%d]\n", __FILE__, __LINE__) -+#else -+#define MPC_LOC do {} while (0) -+#endif -+ -+#define PROTO_UNDEF 0 -+#define PROTO_HOST 1 -+#define PROTO_GADGET 2 -+ -+ -+ -+ -+ -+/* OTG state machine according to the OTG spec */ -+struct otg_fsm { -+ /* Input */ -+ int a_bus_resume; -+ int a_bus_suspend; -+ int a_conn; -+ int a_sess_vld; -+ int a_srp_det; -+ int a_vbus_vld; -+ int b_bus_resume; -+ int b_bus_suspend; -+ int b_conn; -+ int b_se0_srp; -+ int b_sess_end; -+ int b_sess_vld; -+ int id; -+ -+ /* Internal variables */ -+ int a_set_b_hnp_en; -+ int b_srp_done; -+ int b_hnp_enable; -+ -+ /* Timeout indicator for timers */ -+ int a_wait_vrise_tmout; -+ int a_wait_bcon_tmout; -+ int a_aidl_bdis_tmout; -+ int b_ase0_brst_tmout; -+ -+ /* Informative variables */ -+ int a_bus_drop; -+ int a_bus_req; -+ int a_clr_err; -+ int a_suspend_req; -+ int b_bus_req; -+ -+ /* Output */ -+ int drv_vbus; -+ int loc_conn; -+ int loc_sof; -+ -+ struct otg_fsm_ops *ops; -+ struct otg_transceiver *transceiver; -+ -+ void *a_wait_vrise_tmr; -+ void *a_wait_bcon_tmr; -+ void *a_aidl_bdis_tmr; -+ void *b_ase0_brst_tmr; -+ void *b_se0_srp_tmr; -+ void *b_srp_fail_tmr; -+ void *a_wait_enum_tmr; -+ -+ /* Current usb protocol used: 0:undefine; 1:host; 2:client */ -+ int protocol; -+ spinlock_t lock; /* fsm lock */ -+}; -+ -+struct otg_fsm_ops { -+ void (*chrg_vbus)(int on); -+ void (*drv_vbus)(int on); -+ void (*loc_conn)(int on); -+ void (*loc_sof)(int on); -+ void (*start_pulse)(void); -+ void (*add_timer)(void *timer); -+ void (*del_timer)(void *timer); -+ int (*start_host)(struct otg_fsm *fsm, int on); -+ int (*start_gadget)(struct otg_fsm *fsm, int on); -+}; -+ -+ -+static inline void otg_chrg_vbus(struct otg_fsm *fsm, int on) -+{ -+ fsm->ops->chrg_vbus(on); -+} -+ -+static inline void otg_drv_vbus(struct otg_fsm *fsm, int on) -+{ -+ if (fsm->drv_vbus != on) { -+ fsm->drv_vbus = on; -+ fsm->ops->drv_vbus(on); -+ } -+} -+ -+static inline void otg_loc_conn(struct otg_fsm *fsm, int on) -+{ -+ if (fsm->loc_conn != on) { -+ fsm->loc_conn = on; -+ fsm->ops->loc_conn(on); -+ } -+} -+ -+static inline void otg_loc_sof(struct otg_fsm *fsm, int on) -+{ -+ if (fsm->loc_sof != on) { -+ fsm->loc_sof = on; -+ fsm->ops->loc_sof(on); -+ } -+} -+ -+static inline void otg_start_pulse(struct otg_fsm *fsm) -+{ -+ fsm->ops->start_pulse(); -+} -+ -+static inline void otg_add_timer(struct otg_fsm *fsm, void *timer) -+{ -+ fsm->ops->add_timer(timer); -+} -+ -+static inline void otg_del_timer(struct otg_fsm *fsm, void *timer) -+{ -+ fsm->ops->del_timer(timer); -+} -+ -+extern int otg_statemachine(struct otg_fsm *fsm); -+ -+extern const char *state_string(enum usb_otg_state state); -+ -+#endif ---- a/drivers/video/cfbimgblt.c -+++ b/drivers/video/cfbimgblt.c -@@ -44,12 +44,12 @@ - #endif - - static const u32 cfb_tab8[] = { --#if defined(__BIG_ENDIAN) -+#if defined(__BIG_ENDIAN) && !defined(CONFIG_COLDFIRE) - 0x00000000,0x000000ff,0x0000ff00,0x0000ffff, - 0x00ff0000,0x00ff00ff,0x00ffff00,0x00ffffff, - 0xff000000,0xff0000ff,0xff00ff00,0xff00ffff, - 0xffff0000,0xffff00ff,0xffffff00,0xffffffff --#elif defined(__LITTLE_ENDIAN) -+#elif defined(__LITTLE_ENDIAN) || defined(CONFIG_COLDFIRE) - 0x00000000,0xff000000,0x00ff0000,0xffff0000, - 0x0000ff00,0xff00ff00,0x00ffff00,0xffffff00, - 0x000000ff,0xff0000ff,0x00ff00ff,0xffff00ff, -@@ -60,9 +60,9 @@ static const u32 cfb_tab8[] = { - }; - - static const u32 cfb_tab16[] = { --#if defined(__BIG_ENDIAN) -+#if defined(__BIG_ENDIAN) && !defined(CONFIG_COLDFIRE) - 0x00000000, 0x0000ffff, 0xffff0000, 0xffffffff --#elif defined(__LITTLE_ENDIAN) -+#elif defined(__LITTLE_ENDIAN) || defined(CONFIG_COLDFIRE) - 0x00000000, 0xffff0000, 0x0000ffff, 0xffffffff - #else - #error FIXME: No endianness?? ---- a/drivers/video/console/bitblit.c -+++ b/drivers/video/console/bitblit.c -@@ -78,7 +78,11 @@ static inline void bit_putcs_aligned(str - u32 d_pitch, u32 s_pitch, u32 cellsize, - struct fb_image *image, u8 *buf, u8 *dst) - { -+#ifndef CONFIG_COLDFIRE - u16 charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff; -+#else -+ u32 charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff; -+#endif - u32 idx = vc->vc_font.width >> 3; - u8 *src; - -@@ -111,7 +115,11 @@ static inline void bit_putcs_unaligned(s - struct fb_image *image, u8 *buf, - u8 *dst) - { -+#ifndef CONFIG_COLDFIRE - u16 charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff; -+#else -+ u32 charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff; -+#endif - u32 shift_low = 0, mod = vc->vc_font.width % 8; - u32 shift_high = 8; - u32 idx = vc->vc_font.width >> 3; -@@ -238,7 +246,11 @@ static void bit_cursor(struct vc_data *v - { - struct fb_cursor cursor; - struct fbcon_ops *ops = info->fbcon_par; -+#ifndef CONFIG_COLDFIRE - unsigned short charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff; -+#else -+ unsigned long charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff; -+#endif - int w = (vc->vc_font.width + 7) >> 3, c; - int y = real_y(ops->p, vc->vc_y); - int attribute, use_sw = (vc->vc_cursor_type & 0x10); ---- a/drivers/video/console/fbcon.c -+++ b/drivers/video/console/fbcon.c -@@ -2679,8 +2679,11 @@ static int fbcon_set_palette(struct vc_d - { - struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]]; - int i, j, k, depth; -- u8 val; -- -+#ifndef CONFIG_COLDFIRE -+ u8 val; -+#else -+ u32 val; -+#endif - if (fbcon_is_inactive(vc, info)) - return -EINVAL; - ---- a/drivers/video/Kconfig -+++ b/drivers/video/Kconfig -@@ -201,6 +201,16 @@ config FB_TILEBLITTING - comment "Frame buffer hardware drivers" - depends on FB - -+config FB_SMI -+ tristate "SiliconMotion Lynx support" -+ depends on FB && PCI -+ select FB_CFB_FILLRECT -+ select FB_CFB_COPYAREA -+ select FB_CFB_IMAGEBLIT -+ ---help--- -+ This enables support for the Silicon Motion Lynx family of graphic -+ chips. It has been tested on ColdFire. -+ - config FB_CIRRUS - tristate "Cirrus Logic support" - depends on FB && (ZORRO || PCI) ---- a/drivers/video/Makefile -+++ b/drivers/video/Makefile -@@ -28,6 +28,7 @@ obj-$(CONFIG_FB_DDC) += fb_ddc - obj-$(CONFIG_FB_DEFERRED_IO) += fb_defio.o - - # Hardware specific drivers go first -+obj-$(CONFIG_FB_SMI) += smifb.o - obj-$(CONFIG_FB_AMIGA) += amifb.o c2p.o - obj-$(CONFIG_FB_ARC) += arcfb.o - obj-$(CONFIG_FB_CLPS711X) += clps711xfb.o ---- /dev/null -+++ b/drivers/video/smifb.c -@@ -0,0 +1,949 @@ -+/*************************************************************************** -+ smifb.c - Silicon Motion, Inc. LynxEM+ frame buffer device -+ ------------------- -+ begin : Thu Aug 9 2001 -+ copyright : (C) 2001 by Szu-Tao Huang -+ email : johuang@siliconmotion.com -+ ***************************************************************************/ -+ -+/*************************************************************************** -+ * * -+ * This program is free software; you can redistribute it and/or modify * -+ * it under the terms of the GNU General Public License as published by * -+ * the Free Software Foundation; either version 2 of the License, or * -+ * (at your option) any later version. * -+ * * -+ ***************************************************************************/ -+ -+#include <linux/module.h> -+#include <linux/kernel.h> -+#include <linux/errno.h> -+#include <linux/string.h> -+#include <linux/mm.h> -+#include <linux/tty.h> -+#include <linux/slab.h> -+#include <linux/delay.h> -+#include <linux/fb.h> -+#include <linux/pci.h> -+#include <linux/init.h> -+ -+#include <asm/io.h> -+#include <asm/irq.h> -+#include <asm/pgtable.h> -+#include <asm/system.h> -+#include <asm/uaccess.h> -+ -+#include "console/fbcon.h" -+ -+/* -+#include <video/fbcon.h> -+#include <video/fbcon-cfb8.h> -+#include <video/fbcon-cfb16.h> -+#include <video/fbcon-cfb24.h> -+*/ -+ -+#include <linux/fb.h> -+ -+static char *SMIRegs; // point to virtual Memory Map IO starting address -+static char *SMILFB; // point to virtual video memory starting address -+static struct par_info hw; // used to record hardware information -+ -+#include "smifb.h" -+ -+struct ModeInit VGAMode[numVGAModes] = -+{ -+ { -+ /* mode#0: 640 x 480 8Bpp 60Hz */ -+ 640, 480, 8, 60, -+ /* Init_MISC */ -+ 0xE3, -+ { /* Init_SR0_SR4 */ -+ 0x03, 0x01, 0x0F, 0x00, 0x0E, -+ }, -+ { /* Init_SR10_SR24 */ -+ 0xFF, 0xBE, 0xEF, 0xFF, 0x00, 0x0E, 0x17, 0x2C, -+ 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -+ 0xC4, 0x30, 0x02, 0x01, 0x01, -+ }, -+ { /* Init_SR30_SR75 */ -+ 0x32, 0x03, 0xA0, 0x09, 0xC0, 0x32, 0x32, 0x32, -+ 0x32, 0x32, 0x32, 0x32, 0x00, 0x00, 0x03, 0xFF, -+ 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC, -+ 0x20, 0x0C, 0x44, 0x20, 0x00, 0x32, 0x32, 0x32, -+ 0x04, 0x24, 0x63, 0x4F, 0x52, 0x0B, 0xDF, 0xEA, -+ 0x04, 0x50, 0x19, 0x32, 0x32, 0x00, 0x00, 0x32, -+ 0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00, -+ 0x50, 0x03, 0x74, 0x14, 0x07, 0x82, 0x07, 0x04, -+ 0x00, 0x45, 0x30, 0x30, 0x40, 0x30, -+ }, -+ { /* Init_SR80_SR93 */ -+ 0xFF, 0x07, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x32, -+ 0xF7, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0x32, 0x32, -+ 0x00, 0x00, 0x00, 0x00, -+ }, -+ { /* Init_SRA0_SRAF */ -+ 0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED, -+ 0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xFF, 0xDF, -+ }, -+ { /* Init_GR00_GR08 */ -+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, -+ 0xFF, -+ }, -+ { /* Init_AR00_AR14 */ -+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, -+ 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, -+ 0x41, 0x00, 0x0F, 0x00, 0x00, -+ }, -+ { /* Init_CR00_CR18 */ -+ 0x5F, 0x4F, 0x4F, 0x00, 0x53, 0x1F, 0x0B, 0x3E, -+ 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -+ 0xEA, 0x0C, 0xDF, 0x50, 0x40, 0xDF, 0x00, 0xE3, -+ 0xFF, -+ }, -+ { /* Init_CR30_CR4D */ -+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x03, 0x20, -+ 0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xFF, 0xFD, -+ 0x5F, 0x4F, 0x00, 0x54, 0x00, 0x0B, 0xDF, 0x00, -+ 0xEA, 0x0C, 0x2E, 0x00, 0x4F, 0xDF, -+ }, -+ { /* Init_CR90_CRA7 */ -+ 0x56, 0xDD, 0x5E, 0xEA, 0x87, 0x44, 0x8F, 0x55, -+ 0x0A, 0x8F, 0x55, 0x0A, 0x00, 0x00, 0x18, 0x00, -+ 0x11, 0x10, 0x0B, 0x0A, 0x0A, 0x0A, 0x0A, 0x00, -+ }, -+ }, -+ { -+ /* mode#1: 640 x 480 16Bpp 60Hz */ -+ 640, 480, 16, 60, -+ /* Init_MISC */ -+ 0xE3, -+ { /* Init_SR0_SR4 */ -+ 0x03, 0x01, 0x0F, 0x00, 0x0E, -+ }, -+ { /* Init_SR10_SR24 */ -+ 0xFF, 0xBE, 0xEF, 0xFF, 0x00, 0x0E, 0x17, 0x2C, -+ 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -+ 0xC4, 0x30, 0x02, 0x01, 0x01, -+ }, -+ { /* Init_SR30_SR75 */ -+ 0x32, 0x03, 0xA0, 0x09, 0xC0, 0x32, 0x32, 0x32, -+ 0x32, 0x32, 0x32, 0x32, 0x00, 0x00, 0x03, 0xFF, -+ 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC, -+ 0x20, 0x0C, 0x44, 0x20, 0x00, 0x32, 0x32, 0x32, -+ 0x04, 0x24, 0x63, 0x4F, 0x52, 0x0B, 0xDF, 0xEA, -+ 0x04, 0x50, 0x19, 0x32, 0x32, 0x00, 0x00, 0x32, -+ 0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00, -+ 0x50, 0x03, 0x74, 0x14, 0x07, 0x82, 0x07, 0x04, -+ 0x00, 0x45, 0x30, 0x30, 0x40, 0x30, -+ }, -+ { /* Init_SR80_SR93 */ -+ 0xFF, 0x07, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x32, -+ 0xF7, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0x32, 0x32, -+ 0x00, 0x00, 0x00, 0x00, -+ }, -+ { /* Init_SRA0_SRAF */ -+ 0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED, -+ 0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xFF, 0xDF, -+ }, -+ { /* Init_GR00_GR08 */ -+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, -+ 0xFF, -+ }, -+ { /* Init_AR00_AR14 */ -+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, -+ 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, -+ 0x41, 0x00, 0x0F, 0x00, 0x00, -+ }, -+ { /* Init_CR00_CR18 */ -+ 0x5F, 0x4F, 0x4F, 0x00, 0x53, 0x1F, 0x0B, 0x3E, -+ 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -+ 0xEA, 0x0C, 0xDF, 0x50, 0x40, 0xDF, 0x00, 0xE3, -+ 0xFF, -+ }, -+ { /* Init_CR30_CR4D */ -+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x03, 0x20, -+ 0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xFF, 0xFD, -+ 0x5F, 0x4F, 0x00, 0x54, 0x00, 0x0B, 0xDF, 0x00, -+ 0xEA, 0x0C, 0x2E, 0x00, 0x4F, 0xDF, -+ }, -+ { /* Init_CR90_CRA7 */ -+ 0x56, 0xDD, 0x5E, 0xEA, 0x87, 0x44, 0x8F, 0x55, -+ 0x0A, 0x8F, 0x55, 0x0A, 0x00, 0x00, 0x18, 0x00, -+ 0x11, 0x10, 0x0B, 0x0A, 0x0A, 0x0A, 0x0A, 0x00, -+ }, -+ }, -+ { -+ /* mode#2: 640 x 480 24Bpp 60Hz */ -+ 640, 480, 24, 60, -+ /* Init_MISC */ -+ 0xE3, -+ { /* Init_SR0_SR4 */ -+ 0x03, 0x01, 0x0F, 0x00, 0x0E, -+ }, -+ { /* Init_SR10_SR24 */ -+ 0xFF, 0xBE, 0xEF, 0xFF, 0x00, 0x0E, 0x17, 0x2C, -+ 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -+ 0xC4, 0x30, 0x02, 0x01, 0x01, -+ }, -+ { /* Init_SR30_SR75 */ -+ 0x32, 0x03, 0xA0, 0x09, 0xC0, 0x32, 0x32, 0x32, -+ 0x32, 0x32, 0x32, 0x32, 0x00, 0x00, 0x03, 0xFF, -+ 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC, -+ 0x20, 0x0C, 0x44, 0x20, 0x00, 0x32, 0x32, 0x32, -+ 0x04, 0x24, 0x63, 0x4F, 0x52, 0x0B, 0xDF, 0xEA, -+ 0x04, 0x50, 0x19, 0x32, 0x32, 0x00, 0x00, 0x32, -+ 0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00, -+ 0x50, 0x03, 0x74, 0x14, 0x07, 0x82, 0x07, 0x04, -+ 0x00, 0x45, 0x30, 0x30, 0x40, 0x30, -+ }, -+ { /* Init_SR80_SR93 */ -+ 0xFF, 0x07, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x32, -+ 0xF7, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0x32, 0x32, -+ 0x00, 0x00, 0x00, 0x00, -+ }, -+ { /* Init_SRA0_SRAF */ -+ 0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED, -+ 0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xFF, 0xDF, -+ }, -+ { /* Init_GR00_GR08 */ -+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, -+ 0xFF, -+ }, -+ { /* Init_AR00_AR14 */ -+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, -+ 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, -+ 0x41, 0x00, 0x0F, 0x00, 0x00, -+ }, -+ { /* Init_CR00_CR18 */ -+ 0x5F, 0x4F, 0x4F, 0x00, 0x53, 0x1F, 0x0B, 0x3E, -+ 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -+ 0xEA, 0x0C, 0xDF, 0x50, 0x40, 0xDF, 0x00, 0xE3, -+ 0xFF, -+ }, -+ { /* Init_CR30_CR4D */ -+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x03, 0x20, -+ 0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xFF, 0xFD, -+ 0x5F, 0x4F, 0x00, 0x54, 0x00, 0x0B, 0xDF, 0x00, -+ 0xEA, 0x0C, 0x2E, 0x00, 0x4F, 0xDF, -+ }, -+ { /* Init_CR90_CRA7 */ -+ 0x56, 0xDD, 0x5E, 0xEA, 0x87, 0x44, 0x8F, 0x55, -+ 0x0A, 0x8F, 0x55, 0x0A, 0x00, 0x00, 0x18, 0x00, -+ 0x11, 0x10, 0x0B, 0x0A, 0x0A, 0x0A, 0x0A, 0x00, -+ }, -+ }, -+ {/* mode#3: 800 x 600 8Bpp 60Hz */ -+ 800,600,8,60, -+ 0x2B, /* Init_MISC */ -+ { /* Init_SR0_SR4 */ -+ 0x03, 0x01, 0x0F, 0x03, 0x0E, -+ }, -+ { /* Init_SR10_SR24 */ -+ 0xFF, 0xBE, 0xEE, 0xFF, 0x00, 0x0E, 0x17, 0x2C, -+ 0x99, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, -+ 0xC4, 0x30, 0x02, 0x01, 0x01, -+ }, -+ { /* Init_SR30_SR75 */ -+ 0x24, 0x03, 0x20, 0x09, 0xC0, 0x24, 0x24, 0x24, -+ 0x24, 0x24, 0x24, 0x24, 0x00, 0x00, 0x03, 0xFF, -+ 0x00, 0xFC, 0x00, 0x00, 0x20, 0x38, 0x00, 0xFC, -+ 0x20, 0x0C, 0x44, 0x20, 0x00, 0x24, 0x24, 0x24, -+ 0x04, 0x48, 0x83, 0x63, 0x68, 0x72, 0x57, 0x58, -+ 0x04, 0x55, 0x59, 0x24, 0x24, 0x00, 0x00, 0x24, -+ 0x01, 0x80, 0x7A, 0x1A, 0x1A, 0x00, 0x00, 0x00, -+ 0x50, 0x03, 0x74, 0x14, 0x1C, 0x85, 0x35, 0x13, -+ 0x02, 0x45, 0x30, 0x35, 0x40, 0x20, -+ }, -+ { /* Init_SR80_SR93 */ -+ 0xFF, 0x87, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x24, -+ 0x90, 0x01, 0x2C, 0x01, 0xFF, 0x00, 0x24, 0x24, -+ 0x00, 0x00, 0x00, 0x00, -+ }, -+ { /* Init_SRA0_SRAF */ -+ 0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED, -+ 0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xBF, 0xDF, -+ }, -+ { /* Init_GR00_GR08 */ -+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, -+ 0xFF, -+ }, -+ { /* Init_AR00_AR14 */ -+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, -+ 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, -+ 0x41, 0x00, 0x0F, 0x00, 0x00, -+ }, -+ { /* Init_CR00_CR18 */ -+ 0x7F, 0x63, 0x63, 0x00, 0x68, 0x18, 0x72, 0xF0, -+ 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -+ 0x58, 0x0C, 0x57, 0x64, 0x40, 0x57, 0x00, 0xE3, -+ 0xFF, -+ }, -+ { /* Init_CR30_CR4D */ -+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x03, 0x20, -+ 0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xBF, 0xFD, -+ 0x7F, 0x63, 0x00, 0x69, 0x18, 0x72, 0x57, 0x00, -+ 0x58, 0x0C, 0xE0, 0x20, 0x63, 0x57, -+ }, -+ { /* Init_CR90_CRA7 */ -+ 0x56, 0x4B, 0x5E, 0x55, 0x86, 0x9D, 0x8E, 0xAA, -+ 0xDB, 0x2A, 0xDF, 0x33, 0x00, 0x00, 0x18, 0x00, -+ 0x20, 0x1F, 0x1A, 0x19, 0x0F, 0x0F, 0x0F, 0x00, -+ }, -+ }, -+ {/* mode#4: 800 x 600 16Bpp 60Hz */ -+ 800, 600, 16, 60, -+ /* Init_MISC */ -+ 0x2B, -+ { /* Init_SR0_SR4 */ -+ 0x03, 0x01, 0x0F, 0x03, 0x0E, -+ }, -+ { /* Init_SR10_SR24 */ -+ 0xFF, 0xBE, 0xEE, 0xFF, 0x00, 0x0E, 0x17, 0x2C, -+ 0x99, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, -+ 0xC4, 0x30, 0x02, 0x01, 0x01, -+ }, -+ { /* Init_SR30_SR75 */ -+ 0x24, 0x03, 0x20, 0x09, 0xC0, 0x24, 0x24, 0x24, -+ 0x24, 0x24, 0x24, 0x24, 0x00, 0x00, 0x03, 0xFF, -+ 0x00, 0xFC, 0x00, 0x00, 0x20, 0x38, 0x00, 0xFC, -+ 0x20, 0x0C, 0x44, 0x20, 0x00, 0x24, 0x24, 0x24, -+ 0x04, 0x48, 0x83, 0x63, 0x68, 0x72, 0x57, 0x58, -+ 0x04, 0x55, 0x59, 0x24, 0x24, 0x00, 0x00, 0x24, -+ 0x01, 0x80, 0x7A, 0x1A, 0x1A, 0x00, 0x00, 0x00, -+ 0x50, 0x03, 0x74, 0x14, 0x1C, 0x85, 0x35, 0x13, -+ 0x02, 0x45, 0x30, 0x35, 0x40, 0x20, -+ }, -+ { /* Init_SR80_SR93 */ -+ 0x00, 0x00, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x24, -+ 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x24, 0x24, -+ 0x00, 0x00, 0x00, 0x00, -+ }, -+ { /* Init_SRA0_SRAF */ -+ 0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED, -+ 0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xBF, 0xDF, -+ }, -+ { /* Init_GR00_GR08 */ -+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, -+ 0xFF, -+ }, -+ { /* Init_AR00_AR14 */ -+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, -+ 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, -+ 0x41, 0x00, 0x0F, 0x00, 0x00, -+ }, -+ { /* Init_CR00_CR18 */ -+ 0x7F, 0x63, 0x63, 0x00, 0x68, 0x18, 0x72, 0xF0, -+ 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -+ 0x58, 0x0C, 0x57, 0x64, 0x40, 0x57, 0x00, 0xE3, -+ 0xFF, -+ }, -+ { /* Init_CR30_CR4D */ -+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x03, 0x20, -+ 0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xBF, 0xFD, -+ 0x7F, 0x63, 0x00, 0x69, 0x18, 0x72, 0x57, 0x00, -+ 0x58, 0x0C, 0xE0, 0x20, 0x63, 0x57, -+ }, -+ { /* Init_CR90_CRA7 */ -+ 0x56, 0x4B, 0x5E, 0x55, 0x86, 0x9D, 0x8E, 0xAA, -+ 0xDB, 0x2A, 0xDF, 0x33, 0x00, 0x00, 0x18, 0x00, -+ 0x20, 0x1F, 0x1A, 0x19, 0x0F, 0x0F, 0x0F, 0x00, -+ }, -+ }, -+ {/* mode#5: 800 x 600 24Bpp 60Hz */ -+ 800,600,24,60, -+ 0x2B, -+ { /* Init_SR0_SR4 */ -+ 0x03, 0x01, 0x0F, 0x03, 0x0E, -+ }, -+ { /* Init_SR10_SR24 */ -+ 0xFF, 0xBE, 0xEE, 0xFF, 0x00, 0x0E, 0x17, 0x2C, -+ 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -+ 0xC4, 0x30, 0x02, 0x01, 0x01, -+ }, -+ { /* Init_SR30_SR75 */ -+ 0x36, 0x03, 0x20, 0x09, 0xC0, 0x36, 0x36, 0x36, -+ 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x03, 0xFF, -+ 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC, -+ 0x20, 0x0C, 0x44, 0x20, 0x00, 0x36, 0x36, 0x36, -+ 0x04, 0x48, 0x83, 0x63, 0x68, 0x72, 0x57, 0x58, -+ 0x04, 0x55, 0x59, 0x36, 0x36, 0x00, 0x00, 0x36, -+ 0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00, -+ 0x50, 0x03, 0x74, 0x14, 0x1C, 0x85, 0x35, 0x13, -+ 0x02, 0x45, 0x30, 0x30, 0x40, 0x20, -+ }, -+ { /* Init_SR80_SR93 */ -+ 0xFF, 0x07, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x36, -+ 0xF7, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0x36, 0x36, -+ 0x00, 0x00, 0x00, 0x00, -+ }, -+ { /* Init_SRA0_SRAF */ -+ 0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED, -+ 0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xBF, 0xDF, -+ }, -+ { /* Init_GR00_GR08 */ -+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, -+ 0xFF, -+ }, -+ { /* Init_AR00_AR14 */ -+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, -+ 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, -+ 0x41, 0x00, 0x0F, 0x00, 0x00, -+ }, -+ { /* Init_CR00_CR18 */ -+ 0x7F, 0x63, 0x63, 0x00, 0x68, 0x18, 0x72, 0xF0, -+ 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -+ 0x58, 0x0C, 0x57, 0x64, 0x40, 0x57, 0x00, 0xE3, -+ 0xFF, -+ }, -+ { /* Init_CR30_CR4D */ -+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x03, 0x20, -+ 0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xBF, 0xFD, -+ 0x7F, 0x63, 0x00, 0x69, 0x18, 0x72, 0x57, 0x00, -+ 0x58, 0x0C, 0xE0, 0x20, 0x63, 0x57, -+ }, -+ { /* Init_CR90_CRA7 */ -+ 0x56, 0x4B, 0x5E, 0x55, 0x86, 0x9D, 0x8E, 0xAA, -+ 0xDB, 0x2A, 0xDF, 0x33, 0x00, 0x00, 0x18, 0x00, -+ 0x20, 0x1F, 0x1A, 0x19, 0x0F, 0x0F, 0x0F, 0x00, -+ }, -+ }, -+}; -+ -+static void smi_set_timing(struct smifb_info *sfb,struct par_info *hw) -+{ -+ int i=0,j=0; -+ u32 m_nScreenStride; -+ -+ -+ for (j=0;j < numVGAModes;j++) { -+ if (VGAMode[j].mmSizeX == hw->width && -+ VGAMode[j].mmSizeY == hw->height && -+ VGAMode[j].bpp == sfb->fb.var.bits_per_pixel && -+ VGAMode[j].hz == hw->hz) -+ { -+ -+ smi_mmiowb(0x0,0x3c6); -+ -+ smi_seqw(0,0x1); -+ -+ smi_mmiowb(VGAMode[j].Init_MISC,0x3c2); -+ -+ for (i=0;i<SIZE_SR00_SR04;i++) // init SEQ register SR00 - SR04 -+ { -+ smi_seqw(i,VGAMode[j].Init_SR00_SR04[i]); -+ } -+ -+ for (i=0;i<SIZE_SR10_SR24;i++) // init SEQ register SR10 - SR24 -+ { -+ smi_seqw(i+0x10,VGAMode[j].Init_SR10_SR24[i]); -+ } -+ -+ for (i=0;i<SIZE_SR30_SR75;i++) // init SEQ register SR30 - SR75 -+ { -+ if (((i+0x30) != 0x62) && ((i+0x30) != 0x6a) && ((i+0x30) != 0x6b)) -+ smi_seqw(i+0x30,VGAMode[j].Init_SR30_SR75[i]); -+ } -+ for (i=0;i<SIZE_SR80_SR93;i++) // init SEQ register SR80 - SR93 -+ { -+ smi_seqw(i+0x80,VGAMode[j].Init_SR80_SR93[i]); -+ } -+ for (i=0;i<SIZE_SRA0_SRAF;i++) // init SEQ register SRA0 - SRAF -+ { -+ smi_seqw(i+0xa0,VGAMode[j].Init_SRA0_SRAF[i]); -+ } -+ -+ for (i=0;i<SIZE_GR00_GR08;i++) // init Graphic register GR00 - GR08 -+ { -+ smi_grphw(i,VGAMode[j].Init_GR00_GR08[i]); -+ } -+ -+ for (i=0;i<SIZE_AR00_AR14;i++) // init Attribute register AR00 - AR14 -+ { -+ -+ smi_attrw(i,VGAMode[j].Init_AR00_AR14[i]); -+ } -+ -+ for (i=0;i<SIZE_CR00_CR18;i++) // init CRTC register CR00 - CR18 -+ { -+ smi_crtcw(i,VGAMode[j].Init_CR00_CR18[i]); -+ } -+ -+ for (i=0;i<SIZE_CR30_CR4D;i++) // init CRTC register CR30 - CR4D -+ { -+ smi_crtcw(i+0x30,VGAMode[j].Init_CR30_CR4D[i]); -+ } -+ -+ for (i=0;i<SIZE_CR90_CRA7;i++) // init CRTC register CR90 - CRA7 -+ { -+ smi_crtcw(i+0x90,VGAMode[j].Init_CR90_CRA7[i]); -+ } -+ } -+ } -+ smi_mmiowb(0x67,0x3c2); -+ // set VPR registers -+ writel(0x0,hw->m_pVPR+0x0C); -+ writel(0x0,hw->m_pVPR+0x40); -+ // set data width -+ m_nScreenStride = (hw->width * sfb->fb.var.bits_per_pixel) / 64; -+ switch (sfb->fb.var.bits_per_pixel) -+ { -+ case 8: -+ writel(0x0,hw->m_pVPR+0x0); -+ break; -+ case 16: -+ writel(0x00020000,hw->m_pVPR+0x0); -+ break; -+ case 24: -+ writel(0x00040000,hw->m_pVPR+0x0); -+ break; -+ } -+ writel((u32)(((m_nScreenStride + 2) << 16) | m_nScreenStride),hw->m_pVPR+0x10); -+} -+ -+/* -+ * Set the color palette -+ */ -+static int -+smifb_setcolreg(u_int regno, u_int red, u_int green, u_int blue, -+ u_int trans, struct fb_info *info) -+{ -+ -+ struct smifb_info *sfb = (struct smifbinfo *)info; -+ u32 *pal; -+ -+ switch (sfb->fb.fix.visual) { -+ case FB_VISUAL_TRUECOLOR: /* RGB 5:6:5 True Colour */ -+ pal = sfb->fb.pseudo_palette; // System has 16 default color -+ if (regno >= 16) -+ return 1; -+ -+ pal[regno] = (red & 0xf800) | -+ ((green & 0xfc00) >> 5) | ((blue & 0xf800) >> 11); -+ break; -+ } -+ -+ return 0; -+} -+ -+/* -+ * smifb_decode_var(): -+ * Get the video params out of 'var'. If a value doesn't fit, round it up, -+ * if it's too big, return -EINVAL. -+ * -+ * Suggestion: Round up in the following order: bits_per_pixel, xres, -+ * yres, xres_virtual, yres_virtual, xoffset, yoffset, grayscale, -+ * bitfields, horizontal timing, vertical timing. -+ */ -+static int smifb_decode_var(struct fb_var_screeninfo *var, struct smifb_info *sfb, struct par_info *hw) -+{ -+ hw->width = var->xres; -+ hw->height = var->yres; -+ hw->hz = 60; -+ -+ return 0; -+} -+ -+static int smifb_set_par (struct fb_info *info) -+{ -+ struct smifb_info *sfb = (struct smifb_info *)info; -+ int err, chgvar = 0; -+ struct fb_var_screeninfo *var = &info->var; -+ struct fb_cmap *cmap; -+ -+ -+ /* -+ * Decode var contents into a par structure, adjusting any -+ * out of range values. -+ */ -+ err = smifb_decode_var(var, sfb, &hw); -+ if (err) { -+ return err; -+ } -+ -+ if (hw.width != var->xres) -+ chgvar = 1; -+ if (hw.height != var->yres) -+ chgvar = 1; -+ -+ var->activate &= ~FB_ACTIVATE_ALL; -+ -+ smi_set_timing(sfb, &hw); -+ -+ sfb->palette_size = var->bits_per_pixel == 8 ? 256 : 16; -+ cmap = fb_default_cmap(sfb->palette_size); -+ fb_set_cmap(cmap, &sfb->fb); -+ -+ return 0; -+} -+ -+static int smifb_check_var (struct fb_var_screeninfo *var, struct fb_info *info) -+{ -+ var->bits_per_pixel += 7; -+ var->bits_per_pixel &= ~7; -+ -+ var->xres_virtual = -+ var->xres_virtual < var->xres ? var->xres : var->xres_virtual; -+ var->yres_virtual = -+ var->yres_virtual < var->yres ? var->yres : var->yres_virtual; -+ -+ switch (var->bits_per_pixel) { -+ case 8: -+ case 16: /* RGB 565 */ -+ case 24: -+ break; -+ default: -+ return -EINVAL; -+ } -+ -+ switch (var->bits_per_pixel) { -+ case 16: -+ var->red.offset = 11; -+ var->red.length = 5; -+ var->green.offset = 5; -+ var->green.length = 6; -+ var->blue.offset = 0; -+ var->blue.length = 5; -+ -+ info->fix.visual = FB_VISUAL_TRUECOLOR; -+ info->fix.line_length= var->xres * 2; -+ -+ break; -+ default: -+ return -EINVAL; /* We don't support anything other than 16bpp for now. --NL */ -+ break; -+ } -+ return 0; -+ -+// smifb_set_color_bitfields(var); -+ -+ return 0; -+} -+ -+/* -+ * Formal definition of the VESA spec: -+ * On -+ * This refers to the state of the display when it is in full operation -+ * Stand-By -+ * This defines an optional operating state of minimal power reduction with -+ * the shortest recovery time -+ * Suspend -+ * This refers to a level of power management in which substantial power -+ * reduction is achieved by the display. The display can have a longer -+ * recovery time from this state than from the Stand-by state -+ * Off -+ * This indicates that the display is consuming the lowest level of power -+ * and is non-operational. Recovery from this state may optionally require -+ * the user to manually power on the monitor -+ * -+ * Now, the fbdev driver adds an additional state, (blank), where they -+ * turn off the video (maybe by colormap tricks), but don't mess with the -+ * video itself: think of it semantically between on and Stand-By. -+ * -+ * So here's what we should do in our fbdev blank routine: -+ * -+ * VESA_NO_BLANKING (mode 0) Video on, front/back light on -+ * VESA_VSYNC_SUSPEND (mode 1) Video on, front/back light off -+ * VESA_HSYNC_SUSPEND (mode 2) Video on, front/back light off -+ * VESA_POWERDOWN (mode 3) Video off, front/back light off -+ * -+ * This will match the matrox implementation. -+ */ -+/* -+ * smifb_blank(): -+ * Blank the display by setting all palette values to zero. Note, the -+ * 12 and 16 bpp modes don't really use the palette, so this will not -+ * blank the display in all modes. -+ */ -+static int smifb_blank(int blank, struct fb_info *info) -+{ -+// struct smifb_info *sfb = (struct smifb_info *)info; -+#if 0 -+ switch (blank) { -+ case VESA_POWERDOWN: -+ case VESA_VSYNC_SUSPEND: -+ case VESA_HSYNC_SUSPEND: -+ case VESA_NO_BLANKING: -+ } -+#endif -+ return 1; -+} -+ -+static struct fb_ops smifb_ops = { -+ .owner = THIS_MODULE, -+ .fb_check_var = smifb_check_var, -+ .fb_set_par = smifb_set_par, -+ .fb_setcolreg = smifb_setcolreg, -+ .fb_blank = smifb_blank, -+ -+ /* Accelerated functions, using softversions, per se */ -+ .fb_fillrect = cfb_fillrect, -+ .fb_copyarea = cfb_copyarea, -+ .fb_imageblit = cfb_imageblit, -+ .fb_cursor = soft_cursor, -+}; -+ -+/* -+ * Alloc struct smifb_info and assign the default value -+ */ -+static struct smifb_info * __devinit -+smi_alloc_fb_info(struct pci_dev *dev, char *name) -+{ -+ struct smifb_info *sfb; -+ -+ sfb = kmalloc(sizeof(struct smifb_info) + sizeof(u32) * 16, GFP_KERNEL); -+ -+ if (!sfb) -+ return NULL; -+ -+ memset(sfb, 0, sizeof(struct smifb_info)); -+ -+ sfb->currcon = -1; -+ sfb->dev = dev; -+ -+ strcpy(sfb->fb.fix.id, name); -+ -+ sfb->fb.fix.type = FB_TYPE_PACKED_PIXELS; -+ sfb->fb.fix.type_aux = 0; -+ sfb->fb.fix.xpanstep = 0; -+ sfb->fb.fix.ypanstep = 0; -+ sfb->fb.fix.ywrapstep = 0; -+ sfb->fb.fix.accel = FB_ACCEL_NONE; -+ -+ sfb->fb.var.nonstd = 0; -+ sfb->fb.var.activate = FB_ACTIVATE_NOW; -+ sfb->fb.var.height = -1; -+ sfb->fb.var.width = -1; -+ sfb->fb.var.accel_flags = 0; -+ sfb->fb.var.vmode = FB_VMODE_NONINTERLACED; -+ -+ sfb->fb.fbops = &smifb_ops; -+ sfb->fb.flags = FBINFO_FLAG_DEFAULT; -+ sfb->fb.node = -1; -+ sfb->fb.pseudo_palette = (void *)(&sfb->palette_size + 1); -+ -+ return sfb; -+} -+ -+/* -+ * Unmap in the memory mapped IO registers -+ * -+ */ -+ -+static void __devinit -+smi_unmap_mmio(struct smifb_info *sfb) -+{ -+ if (sfb && SMILFB) -+ { -+ iounmap(SMILFB); -+ SMIRegs = NULL; -+ } -+} -+ -+/* -+ * Map in the screen memory -+ * -+ */ -+static int __devinit -+smi_map_smem(struct smifb_info *sfb, struct pci_dev *dev, u_long smem_len) -+{ -+ -+ sfb->fb.fix.smem_start = pci_resource_start(dev, 0); -+ sfb->fb.fix.smem_len = smem_len; -+ printk("%s:smem %x,len %x\n",sfb->fb.fix.smem_start,sfb->fb.fix.smem_len); -+ sfb->fb.screen_base = SMILFB; -+ -+ if (!sfb->fb.screen_base) -+ { -+ printk("%s: unable to map screen memory\n",sfb->fb.fix.id); -+ return -ENOMEM; -+ } -+ -+ return 0; -+} -+ -+ -+/* -+ * Unmap in the screen memory -+ * -+ */ -+static void __devinit -+smi_unmap_smem(struct smifb_info *sfb) -+{ -+ if (sfb && sfb->fb.screen_base) -+ { -+ iounmap(sfb->fb.screen_base); -+ sfb->fb.screen_base = NULL; -+ } -+} -+ -+/* -+ * We need to wake up the LynxEM+, and make sure its in linear memory mode. -+ */ -+static inline void __devinit -+smi_init_hw(void) -+{ -+ /* The delays prevent the ColdFire PCI host from locking up. :/ --NL */ -+ udelay(1000); -+ outb(0x18, 0x3c4); -+ udelay(1000); -+ outb(0x11, 0x3c5); -+ udelay(1000); -+ printk("%s: 0x3c4 =%x 0x3c5 %x\n",__FUNCTION__,inw(0x3c4),inw(0x3c5)); -+} -+ -+static void __devinit -+smi_free_fb_info(struct smifb_info *sfb) -+{ -+ if (sfb) { -+ fb_alloc_cmap(&sfb->fb.cmap, 0, 0); -+ kfree(sfb); -+ } -+} -+ -+ -+u16 SMI_ChipIDs[numChipIDs] = {0x710, 0x712, 0x720}; -+ -+int __init smifb_init(struct pci_dev *pdev, const struct pci_device_id *ent) -+{ -+ struct smifb_info *sfb; -+ u_long smem_size; -+ char name[16]; -+ int err; -+ char *m_pLAW; -+ ulong m_pLAWPhysical; -+ -+ printk("%s start\n",__FUNCTION__); -+ sprintf(name, "smifb"); -+ -+ hw.chipID = pdev->device; -+ -+ err = -ENOMEM; -+ sfb = smi_alloc_fb_info(pdev, name); -+ if (!sfb) { -+ goto failed; -+ } -+ -+ smi_init_hw(); -+ -+ // Map address and memory detection -+ m_pLAWPhysical = pci_resource_start(pdev,0); -+ printk("%s:m_pLAWPhysical %x,hw.chipID %x\n",__FUNCTION__,m_pLAWPhysical,hw.chipID); -+ switch (hw.chipID) { -+ case 0x710: -+ case 0x712: -+ sfb->fb.fix.mmio_start = m_pLAWPhysical + 0x00700000; -+ sfb->fb.fix.mmio_len = 0x00100000; -+ -+ hw.m_pLFB = SMILFB = ioremap(m_pLAWPhysical, 0x00800000); -+ printk("%s:SMILFB%x\n",__FUNCTION__,SMILFB); -+ hw.m_pMMIO = SMIRegs = SMILFB + 0x00700000; -+ hw.m_pDPR = hw.m_pLFB + 0x00408000; -+ hw.m_pVPR = hw.m_pLFB + 0x0040c000; -+ -+ if (!SMIRegs) -+ { -+ printk("%s: unable to map memory mapped IO\n",sfb->fb.fix.id); -+ return -ENOMEM; -+ } -+ -+ smi_seqw(0x62,0x7A); -+ smi_seqw(0x6a,0x0c); -+ smi_seqw(0x6b,0x02); -+ smem_size = 0x00400000; -+ -+ //LynxEM+ memory dection -+ *(u32 *)(SMILFB + 4) = 0xAA551133; -+ if (*(u32 *)(SMILFB + 4) != 0xAA551133) -+ { -+ smem_size = 0x00200000; -+ // Program the MCLK to 130 MHz -+ smi_seqw(0x6a,0x12); -+ smi_seqw(0x6b,0x02); -+ smi_seqw(0x62,0x3e); -+ } -+ break; -+ case 0x720: -+ sfb->fb.fix.mmio_start = m_pLAWPhysical + 0x000c0000; -+ sfb->fb.fix.mmio_len = 0x00040000; -+ -+ m_pLAW = ioremap(m_pLAWPhysical, 0x00a00000); -+ hw.m_pLFB = SMILFB = m_pLAW + 0x00200000; -+ hw.m_pMMIO = SMIRegs = m_pLAW + 0x000c0000; -+ hw.m_pDPR = m_pLAW; -+ hw.m_pVPR = m_pLAW + 0x800; -+ -+ smi_seqw(0x62,0xff); -+ smi_seqw(0x6a,0x0d); -+ smi_seqw(0x6b,0x02); -+ smem_size = 0x00400000; -+ -+ break; -+ } -+ -+ sfb->fb.var.xres = 640; -+ sfb->fb.var.yres = 480; -+ sfb->fb.var.bits_per_pixel = 16; -+ -+ sfb->fb.var.xres_virtual = sfb->fb.var.xres; -+ -+ sfb->fb.var.yres_virtual = sfb->fb.var.yres; -+ -+ sfb->fb.flags = FBINFO_FLAG_DEFAULT; -+ -+ printk("%s:smem_size %x\n",__FUNCTION__,smem_size); -+ err = smi_map_smem(sfb, pdev, smem_size); -+ printk("%s:smi_map_smem error %x\n",__FUNCTION__,err); -+ if (err) { -+ goto failed; -+ } -+ -+ -+ -+ fb_set_var(&sfb->fb, &sfb->fb.var); -+ smifb_check_var(&sfb->fb.var, &sfb->fb); -+ smifb_set_par(sfb); -+ printk("%s:register_framebuffer \n",__FUNCTION__); -+ err = register_framebuffer(&sfb->fb); -+ if (err < 0) { -+ goto failed; -+ } -+ -+ printk("Silicon Motion, Inc. LynxEM+ Init complete.\n"); -+ -+ return 0; -+ -+failed: -+ smi_unmap_smem(sfb); -+ smi_unmap_mmio(sfb); -+ smi_free_fb_info(sfb); -+ printk("Silicon Motion, Inc. LynxEM+ Init FAILED.n"); -+ -+ return err; -+} -+ -+struct pci_device_id smifb_pci_tbl[] = { -+ { 0x126f, 0x710, PCI_ANY_ID, PCI_ANY_ID }, -+ { 0x126f, 0x712, PCI_ANY_ID, PCI_ANY_ID }, -+ { 0x126f, 0x720, PCI_ANY_ID, PCI_ANY_ID }, -+ { 0 } -+}; -+ -+MODULE_DEVICE_TABLE(pci, smifb_pci_tbl); -+ -+struct pci_driver smifb_driver = { -+ .name = "smifb", -+ .id_table = smifb_pci_tbl, -+ .probe = smifb_init, -+}; -+ -+int __init smi_init(void) -+{ -+ /*return pci_module_init(&smifb_driver);*/ -+ return pci_register_driver(&smifb_driver); -+} -+ -+module_init(smi_init); -+MODULE_LICENSE("GPL"); -+ -+ -+ ---- /dev/null -+++ b/drivers/video/smifb.h -@@ -0,0 +1,149 @@ -+/*************************************************************************** -+ smifb.h - SiliconMotion LynxEM+ frame buffer device -+ ------------------- -+ begin : Thu Aug 9 2001 -+ copyright : (C) 2001 by Szu-Tao Huang -+ email : johuang@siliconmotion.com -+ ***************************************************************************/ -+ -+/*************************************************************************** -+ * * -+ * This program is free software; you can redistribute it and/or modify * -+ * it under the terms of the GNU General Public License as published by * -+ * the Free Software Foundation; either version 2 of the License, or * -+ * (at your option) any later version. * -+ * * -+ ***************************************************************************/ -+ -+#define smi_mmiowb(dat,reg) writeb(dat, SMIRegs + reg) -+#define smi_mmioww(dat,reg) writew(dat, SMIRegs + reg) -+#define smi_mmiowl(dat,reg) writel(dat, SMIRegs + reg) -+ -+#define smi_mmiorb(reg) readb(SMIRegs + reg) -+#define smi_mmiorw(reg) readw(SMIRegs + reg) -+#define smi_mmiorl(reg) readl(SMIRegs + reg) -+ -+#define SIZE_SR00_SR04 (0x04 - 0x00 + 1) -+#define SIZE_SR10_SR24 (0x24 - 0x10 + 1) -+#define SIZE_SR30_SR75 (0x75 - 0x30 + 1) -+#define SIZE_SR80_SR93 (0x93 - 0x80 + 1) -+#define SIZE_SRA0_SRAF (0xAF - 0xA0 + 1) -+#define SIZE_GR00_GR08 (0x08 - 0x00 + 1) -+#define SIZE_AR00_AR14 (0x14 - 0x00 + 1) -+#define SIZE_CR00_CR18 (0x18 - 0x00 + 1) -+#define SIZE_CR30_CR4D (0x4D - 0x30 + 1) -+#define SIZE_CR90_CRA7 (0xA7 - 0x90 + 1) -+#define SIZE_VPR (0x6C + 1) -+#define SIZE_DPR (0x44 + 1) -+ -+#define numVGAModes 6 -+#define numChipIDs 3 -+ -+#define NR_PALETTE 256 -+#define NR_RGB 2 -+ -+/* -+ * Minimum X and Y resolutions -+ */ -+#define MIN_XRES 640 -+#define MIN_YRES 480 -+ -+static inline void smi_crtcw(int reg, int val) -+{ -+ smi_mmiowb(reg, 0x3d4); -+ smi_mmiowb(val, 0x3d5); -+} -+ -+static inline unsigned int smi_crtcr(int reg) -+{ -+ smi_mmiowb(reg, 0x3d4); -+ return smi_mmiorb(0x3d5); -+} -+ -+static inline void smi_grphw(int reg, int val) -+{ -+ smi_mmiowb(reg, 0x3ce); -+ smi_mmiowb(val, 0x3cf); -+} -+ -+static inline unsigned int smi_grphr(int reg) -+{ -+ smi_mmiowb(reg, 0x3ce); -+ return smi_mmiorb(0x3cf); -+} -+ -+static inline void smi_attrw(int reg, int val) -+{ -+ smi_mmiorb(0x3da); -+ smi_mmiowb(reg, 0x3c0); -+ smi_mmiorb(0x3c1); -+ smi_mmiowb(val, 0x3c0); -+} -+ -+static inline void smi_seqw(int reg, int val) -+{ -+ smi_mmiowb(reg, 0x3c4); -+ smi_mmiowb(val, 0x3c5); -+} -+ -+static inline unsigned int smi_seqr(int reg) -+{ -+ smi_mmiowb(reg, 0x3c4); -+ return smi_mmiorb(0x3c5); -+} -+/* -+* Private structure -+*/ -+struct smifb_info { -+ /* -+ * The following is a pointer to be passed into the -+ * functions below. The modules outside the main -+ * smifb.c driver have no knowledge as to what -+ * is within this structure. -+ */ -+ struct fb_info fb; -+ struct display_switch *dispsw; -+ struct pci_dev *dev; -+ signed int currcon; -+ -+ struct { -+ u8 red, green, blue; -+ } palette[NR_RGB]; -+ -+ u_int palette_size; -+}; -+ -+struct par_info { -+ /* -+ * Hardware -+ */ -+ u16 chipID; -+ char *m_pLFB; -+ char *m_pMMIO; -+ char *m_pDPR; -+ char *m_pVPR; -+ -+ u_int width; -+ u_int height; -+ u_int hz; -+}; -+ -+// The next structure holds all information relevant for a specific video mode. -+struct ModeInit -+{ -+ int mmSizeX; -+ int mmSizeY; -+ int bpp; -+ int hz; -+ unsigned char Init_MISC; -+ unsigned char Init_SR00_SR04[SIZE_SR00_SR04]; -+ unsigned char Init_SR10_SR24[SIZE_SR10_SR24]; -+ unsigned char Init_SR30_SR75[SIZE_SR30_SR75]; -+ unsigned char Init_SR80_SR93[SIZE_SR80_SR93]; -+ unsigned char Init_SRA0_SRAF[SIZE_SRA0_SRAF]; -+ unsigned char Init_GR00_GR08[SIZE_GR00_GR08]; -+ unsigned char Init_AR00_AR14[SIZE_AR00_AR14]; -+ unsigned char Init_CR00_CR18[SIZE_CR00_CR18]; -+ unsigned char Init_CR30_CR4D[SIZE_CR30_CR4D]; -+ unsigned char Init_CR90_CRA7[SIZE_CR90_CRA7]; -+}; ---- a/drivers/watchdog/Kconfig -+++ b/drivers/watchdog/Kconfig -@@ -672,6 +672,15 @@ config TXX9_WDT - - # PARISC Architecture - -+# ColdFire Architecture -+ -+config COLDFIRE_WATCHDOG -+ tristate "ColdFire watchdog support" -+ depends on WATCHDOG -+ help -+ To compile this driver as a module, choose M here: the -+ module will be called softdog. -+ - # POWERPC Architecture - - config MPC5200_WDT ---- a/drivers/watchdog/Makefile -+++ b/drivers/watchdog/Makefile -@@ -86,6 +86,7 @@ obj-$(CONFIG_SBC_EPX_C3_WATCHDOG) += sbc - # M32R Architecture - - # M68K Architecture -+obj-$(CONFIG_COLDFIRE_WATCHDOG) += mcf_wdt.o - - # M68KNOMMU Architecture - ---- /dev/null -+++ b/drivers/watchdog/mcf_wdt.c -@@ -0,0 +1,220 @@ -+/* -+ * drivers/watchdog/mcf_wdt.c -+ * -+ * Watchdog driver for ColdFire processors -+ * -+ * Adapted from the IXP4xx watchdog driver. -+ * The original version carries these notices: -+ * -+ * Author: Deepak Saxena <dsaxena@plexity.net> -+ * -+ * Copyright 2004 (c) MontaVista, Software, Inc. -+ * Based on sa1100 driver, Copyright (C) 2000 Oleg Drokin <green@crimea.edu> -+ * -+ * This file is licensed under the terms of the GNU General Public -+ * License version 2. This program is licensed "as is" without any -+ * warranty of any kind, whether express or implied. -+ */ -+ -+#include <linux/module.h> -+#include <linux/moduleparam.h> -+#include <linux/types.h> -+#include <linux/kernel.h> -+#include <linux/fs.h> -+#include <linux/miscdevice.h> -+#include <linux/watchdog.h> -+#include <linux/init.h> -+#include <linux/bitops.h> -+ -+#include <asm-m68k/uaccess.h> -+#include <asm-m68k/coldfire.h> -+#include <asm-m68k/m5485gpt.h> -+ -+static int nowayout; -+static unsigned int heartbeat = 30; /* (secs) Default is 0.5 minute */ -+static unsigned long wdt_status; -+ -+#define WDT_IN_USE 0 -+#define WDT_OK_TO_CLOSE 1 -+ -+static unsigned long wdt_tick_rate; -+ -+static void -+wdt_enable(void) -+{ -+ MCF_GPT_GMS0 = 0; -+ MCF_GPT_GCIR0 = MCF_GPT_GCIR_PRE(heartbeat*wdt_tick_rate) | -+ MCF_GPT_GCIR_CNT(0xffff); -+ MCF_GPT_GMS0 = MCF_GPT_GMS_OCPW(0xA5) | MCF_GPT_GMS_WDEN | -+ MCF_GPT_GMS_CE | MCF_GPT_GMS_TMS_GPIO; -+} -+ -+static void -+wdt_disable(void) -+{ -+ MCF_GPT_GMS0 = 0; -+} -+ -+static void -+wdt_keepalive(void) -+{ -+ MCF_GPT_GMS0 = MCF_GPT_GMS_OCPW(0xA5) | MCF_GPT_GMS0; -+} -+ -+static int -+mcf_wdt_open(struct inode *inode, struct file *file) -+{ -+ if (test_and_set_bit(WDT_IN_USE, &wdt_status)) -+ return -EBUSY; -+ -+ clear_bit(WDT_OK_TO_CLOSE, &wdt_status); -+ -+ wdt_enable(); -+ -+ return nonseekable_open(inode, file); -+} -+ -+static ssize_t -+mcf_wdt_write(struct file *file, const char *data, size_t len, loff_t *ppos) -+{ -+ if (len) { -+ if (!nowayout) { -+ size_t i; -+ -+ clear_bit(WDT_OK_TO_CLOSE, &wdt_status); -+ -+ for (i = 0; i != len; i++) { -+ char c; -+ -+ if (get_user(c, data + i)) -+ return -EFAULT; -+ if (c == 'V') -+ set_bit(WDT_OK_TO_CLOSE, &wdt_status); -+ } -+ } -+ wdt_keepalive(); -+ } -+ -+ return len; -+} -+ -+ -+static struct watchdog_info ident = { -+ .options = WDIOF_MAGICCLOSE | WDIOF_SETTIMEOUT | -+ WDIOF_KEEPALIVEPING, -+ .identity = "Coldfire Watchdog", -+}; -+ -+static int -+mcf_wdt_ioctl(struct inode *inode, struct file *file, unsigned int cmd, -+ unsigned long arg) -+{ -+ int ret = -ENOIOCTLCMD; -+ int time; -+ -+ switch (cmd) { -+ case WDIOC_GETSUPPORT: -+ ret = copy_to_user((struct watchdog_info *)arg, &ident, -+ sizeof(ident)) ? -EFAULT : 0; -+ break; -+ -+ case WDIOC_GETSTATUS: -+ ret = put_user(0, (int *)arg); -+ break; -+ -+ case WDIOC_GETBOOTSTATUS: -+ ret = put_user(0, (int *)arg); -+ break; -+ -+ case WDIOC_SETTIMEOUT: -+ ret = get_user(time, (int *)arg); -+ if (ret) -+ break; -+ -+ if (time <= 0 || time > 30) { -+ ret = -EINVAL; -+ break; -+ } -+ -+ heartbeat = time; -+ wdt_enable(); -+ /* Fall through */ -+ -+ case WDIOC_GETTIMEOUT: -+ ret = put_user(heartbeat, (int *)arg); -+ break; -+ -+ case WDIOC_KEEPALIVE: -+ wdt_keepalive(); -+ ret = 0; -+ break; -+ } -+ -+ return ret; -+} -+ -+static int -+mcf_wdt_release(struct inode *inode, struct file *file) -+{ -+ if (test_bit(WDT_OK_TO_CLOSE, &wdt_status)) { -+ wdt_disable(); -+ } else { -+ printk(KERN_CRIT "WATCHDOG: Device closed unexpectdly - " -+ "timer will not stop\n"); -+ } -+ -+ clear_bit(WDT_IN_USE, &wdt_status); -+ clear_bit(WDT_OK_TO_CLOSE, &wdt_status); -+ -+ return 0; -+} -+ -+ -+static struct file_operations mcf_wdt_fops = { -+ .owner = THIS_MODULE, -+ .llseek = no_llseek, -+ .write = mcf_wdt_write, -+ .ioctl = mcf_wdt_ioctl, -+ .open = mcf_wdt_open, -+ .release = mcf_wdt_release, -+}; -+ -+static struct miscdevice mcf_wdt_miscdev = { -+ .minor = WATCHDOG_MINOR, -+ .name = "watchdog", -+ .fops = &mcf_wdt_fops, -+}; -+ -+static int __init mcf_wdt_init(void) -+{ -+ wdt_tick_rate = MCF_BUSCLK/0xffff; -+#ifdef CONFIG_WATCHDOG_NOWAYOUT -+ nowayout = 1; -+#else -+ nowayout = 0; -+#endif -+ printk("ColdFire watchdog driver is loaded.\n"); -+ -+ return misc_register(&mcf_wdt_miscdev); -+} -+ -+static void __exit mcf_wdt_exit(void) -+{ -+ misc_deregister(&mcf_wdt_miscdev); -+} -+ -+module_init(mcf_wdt_init); -+module_exit(mcf_wdt_exit); -+ -+MODULE_AUTHOR("Deepak Saxena"); -+MODULE_DESCRIPTION("ColdFire Watchdog"); -+ -+module_param(heartbeat, int, 0); -+MODULE_PARM_DESC(heartbeat, "Watchdog heartbeat in seconds (default 60s)"); -+ -+module_param(nowayout, int, 0); -+MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started"); -+ -+MODULE_LICENSE("GPL"); -+MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR); -+ ---- a/fs/namespace.c -+++ b/fs/namespace.c -@@ -1364,7 +1364,11 @@ int copy_mount_options(const void __user - /* copy_from_user cannot cross TASK_SIZE ! */ - size = TASK_SIZE - (unsigned long)data; - if (size > PAGE_SIZE) -+#ifndef CONFIG_COLDFIRE - size = PAGE_SIZE; -+#else -+ size = PAGE_SIZE - ((unsigned long)data & ~PAGE_MASK); -+#endif - - i = size - exact_copy_from_user((void *)page, data, size); - if (!i) { ---- /dev/null -+++ b/include/asm-m68k/5445x_pci.h -@@ -0,0 +1,94 @@ -+/* -+ * asm-m68k/pci.h - m68k specific PCI declarations. -+ * -+ * Coldfire Implementation Copyright (c) 2007 Freescale Semiconductor, Inc. -+ * Kurt Mahan <kmahan@freescale.com> -+ */ -+#ifndef _ASM_M68K_5445X_PCI_H -+#define _ASM_M68K_5445x_PCI_H -+ -+#ifndef CONFIG_PCI -+/* -+ * The PCI address space does equal the physical memory -+ * address space. The networking and block device layers use -+ * this boolean for bounce buffer decisions. -+ */ -+#define PCI_DMA_BUS_IS_PHYS (1) -+#else -+#include <asm-generic/pci-dma-compat.h> -+ -+/* -+ * The PCI address space does equal the physical memory -+ * address space. The networking and block device layers use -+ * this boolean for bounce buffer decisions. -+ */ -+#define PCI_DMA_BUS_IS_PHYS (1) -+ -+#define PCIBIOS_MIN_IO 0x00004000 -+#define PCIBIOS_MIN_MEM 0x02000000 -+ -+#define pcibios_assign_all_busses() 0 -+#define pcibios_scan_all_fns(a, b) 0 -+ -+static inline void -+pcibios_set_master(struct pci_dev *dev) -+{ -+ /* no special bus mastering setup handling */ -+} -+ -+static inline void -+pcibios_penalize_isa_irq(int irq, int active) -+{ -+ /* no dynamic PCI IRQ allocation */ -+} -+ -+#if 0 -+static inline void -+pcibios_add_platform_entries(struct pci_dev *dev) -+{ -+ /* no special handling */ -+} -+#endif -+ -+static inline void -+pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region, -+ struct resource *res) -+{ -+#ifdef CONFIG_M54455 -+ if ((res->start == 0xa0000000) || (res->start == 0xa8000000)) { -+ /* HACK! FIX! kludge to fix bridge mapping */ -+ region->start = res->start & 0x0fffffff; -+ region->end = res->end & 0x0fffffff; -+ } else { -+ region->start = res->start; -+ region->end = res->end; -+ } -+#else -+ region->start = res->start; -+ region->end = res->end; -+#endif -+} -+ -+static inline void -+pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, -+ struct pci_bus_region *region) -+{ -+ res->start = region->start; -+ res->end = region->end; -+} -+ -+static inline struct resource * -+pcibios_select_root(struct pci_dev *pdev, struct resource *res) -+{ -+ struct resource *root = NULL; -+ -+ if (res->flags & IORESOURCE_IO) -+ root = &ioport_resource; -+ if (res->flags & IORESOURCE_MEM) -+ root = &iomem_resource; -+ -+ return root; -+} -+ -+#endif /* CONFIG_PCI */ -+#endif /* _ASM_M68K_5445X_PCI_H */ ---- /dev/null -+++ b/include/asm-m68k/548x_pci.h -@@ -0,0 +1,99 @@ -+#ifndef _ASM_M68K_548X_PCI_H -+#define _ASM_M68K_548X_PCI_H -+ -+/* -+ * asm-m68k/pci_m68k.h - m68k specific PCI declarations. -+ * -+ * Written by Wout Klaren. -+ */ -+#include <linux/mm.h> -+#include <asm/scatterlist.h> -+ -+#include <asm-generic/pci.h> -+ -+struct pci_ops; -+ -+/* -+ * Structure with hardware dependent information and functions of the -+ * PCI bus. -+ */ -+ -+struct pci_bus_info -+{ -+ /* -+ * Resources of the PCI bus. -+ */ -+ -+ struct resource mem_space; -+ struct resource io_space; -+ -+ /* -+ * System dependent functions. -+ */ -+ -+ struct pci_ops *m68k_pci_ops; -+ -+ void (*fixup)(int pci_modify); -+ void (*conf_device)(struct pci_dev *dev); -+}; -+ -+#define pcibios_assign_all_busses() 0 -+#define pcibios_scan_all_fns(a, b) 0 -+ -+static inline void pcibios_set_master(struct pci_dev *dev) -+{ -+ /* No special bus mastering setup handling */ -+} -+ -+static inline void pcibios_penalize_isa_irq(int irq) -+{ -+ /* We don't do dynamic PCI IRQ allocation */ -+} -+ -+#ifndef CONFIG_COLDFIRE -+/* The PCI address space does equal the physical memory -+ * address space. The networking and block device layers use -+ * this boolean for bounce buffer decisions. -+ */ -+#define PCI_DMA_BUS_IS_PHYS (1) -+ -+#define PCIBIOS_MIN_IO 0x00004000 -+#define PCIBIOS_MIN_MEM 0x04000000 -+ -+#else /* !CONFIG_COLDFIRE */ -+#include <asm-generic/pci-dma-compat.h> -+#define PCI_DMA_BASE /*0x40000000*/0 /* PCI-DMA window base */ -+ -+extern struct pci_bus_info *__init init_coldfire_pci(void); -+extern void * pci_alloc_son(struct pci_dev *, size_t, -+ dma_addr_t *, int); -+/* -+ * The PCI address space equal the virtual memory -+ * address space on m547X/m548X. -+ */ -+#define PCI_DMA_BUS_IS_PHYS (1) -+ -+#define PCIBIOS_MIN_IO 0x00000100 -+#define PCIBIOS_MIN_MEM 0x02000000 -+ -+struct scatterlist; -+ -+ -+/* This is always fine. */ -+#define pci_dac_dma_supported(pci_dev, mask) (1) -+ -+ -+/* These macros should be used after a pci_map_sg call has been done -+ * to get bus addresses of each of the SG entries and their lengths. -+ * You should only work with the number of sg entries pci_map_sg -+ * returns. -+ */ -+#define sg_dma_address(sg) ((sg)->dma_address) -+#define sg_dma_len(sg) ((sg)->length) -+ -+static inline void pcibios_align_resource(void *data, struct resource *res, unsigned long size, unsigned long align) -+{ -+} -+ -+#endif /* !CONFIG_COLDFIRE*/ -+#endif /* _ASM_M68K_548X_PCI_H */ ---- a/include/asm-m68k/atomic.h -+++ b/include/asm-m68k/atomic.h -@@ -2,7 +2,7 @@ - #define __ARCH_M68K_ATOMIC__ - - --#include <asm/system.h> -+#include <asm/system.h> /* local_irq_XXX() */ - - /* - * Atomic operations that C can't guarantee us. Useful for -@@ -21,12 +21,20 @@ typedef struct { int counter; } atomic_t - - static inline void atomic_add(int i, atomic_t *v) - { -+#ifndef CONFIG_COLDFIRE - __asm__ __volatile__("addl %1,%0" : "+m" (*v) : "id" (i)); -+#else -+ __asm__ __volatile__("addl %1,%0" : "=m" (*v) : "d" (i), "m" (*v)); -+#endif - } - - static inline void atomic_sub(int i, atomic_t *v) - { -+#ifndef CONFIG_COLDFIRE - __asm__ __volatile__("subl %1,%0" : "+m" (*v) : "id" (i)); -+#else -+ __asm__ __volatile__("subl %1,%0" : "=m" (*v) : "d" (i), "m" (*v)); -+#endif - } - - static inline void atomic_inc(atomic_t *v) -@@ -46,6 +54,14 @@ static inline int atomic_dec_and_test(at - return c != 0; - } - -+static __inline__ int atomic_dec_and_test_lt(volatile atomic_t *v) -+{ -+ char c; -+ __asm__ __volatile__("subql #1,%1; slt %0" : "=d" (c), "=m" (*v) -+ : "m" (*v)); -+ return c != 0 ; -+} -+ - static inline int atomic_inc_and_test(atomic_t *v) - { - char c; -@@ -156,7 +172,12 @@ static inline int atomic_sub_and_test(in - static inline int atomic_add_negative(int i, atomic_t *v) - { - char c; -+#ifndef CONFIG_COLDFIRE - __asm__ __volatile__("addl %2,%1; smi %0" : "=d" (c), "+m" (*v): "g" (i)); -+#else -+ __asm__ __volatile__("addl %2,%1; smi %0" : "=d" (c), "=m" (*v) -+ : "d" (i) , "m" (*v)); -+#endif - return c != 0; - } - ---- a/include/asm-m68k/auxvec.h -+++ b/include/asm-m68k/auxvec.h -@@ -1,4 +1,13 @@ - #ifndef __ASMm68k_AUXVEC_H - #define __ASMm68k_AUXVEC_H -+/* -+ * Architecture-neutral AT_ values in 0-17, leave some room -+ * for more of them. -+ */ -+ -+#ifdef CONFIG_VSYSCALL -+/* Entry point to the vsyscall page */ -+#define AT_SYSINFO_EHDR 33 -+#endif - - #endif ---- a/include/asm-m68k/bitops.h -+++ b/include/asm-m68k/bitops.h -@@ -19,6 +19,7 @@ - * - * They use the standard big-endian m680x0 bit ordering. - */ -+#ifndef CONFIG_COLDFIRE - - #define test_and_set_bit(nr,vaddr) \ - (__builtin_constant_p(nr) ? \ -@@ -457,4 +458,503 @@ static inline int ext2_find_next_bit(con - - #endif /* __KERNEL__ */ - -+#else /* CONFIG_COLDFIRE */ -+ -+#define test_and_set_bit(nr,vaddr) \ -+ (__builtin_constant_p(nr) ? \ -+ __constant_coldfire_test_and_set_bit(nr, vaddr) : \ -+ __generic_coldfire_test_and_set_bit(nr, vaddr)) -+ -+#if 0 -+static __inline__ int __constant_coldfire_test_and_set_bit(int nr, -+ volatile void *vaddr) -+{ -+ char retval; -+ volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3]; -+ -+ __asm__ __volatile__ ("bset %2,%1; sne %0" -+ : "=d" (retval), "+QUd" (*p) -+ : "di" (nr & 7)); -+ return retval; -+} -+#else -+static __inline__ int __constant_coldfire_test_and_set_bit(int nr, -+ volatile void *vaddr) -+{ -+ char retval; -+ volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3]; -+ __asm__ __volatile__ ("bset %2,(%4); sne %0" -+ : "=d" (retval), "=m" (*p) -+ : "di" (nr & 7), "m" (*p), "a" (p)); -+ return retval; -+} -+#endif -+ -+static __inline__ int __generic_coldfire_test_and_set_bit(int nr, -+ volatile void *vaddr) -+{ -+ char retval; -+ -+ __asm__ __volatile__ ("bset %2,%1; sne %0" -+ : "=d" (retval), "=m" (((volatile char *)vaddr)[(nr^31) >> 3]) -+ : "d" (nr) -+ : "memory"); -+ return retval; -+} -+#define __test_and_set_bit(nr, vaddr) test_and_set_bit(nr, vaddr) -+ -+#define set_bit(nr,vaddr) \ -+ (__builtin_constant_p(nr) ? \ -+ __constant_coldfire_set_bit(nr, vaddr) : \ -+ __generic_coldfire_set_bit(nr, vaddr)) -+ -+#if 0 -+static __inline__ void __constant_coldfire_set_bit(int nr, -+ volatile void *vaddr) -+{ -+ volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3]; -+ __asm__ __volatile__ ("bset %1,%0" -+ : "+QUd" (*p) : "di" (nr & 7)); -+} -+#else -+static __inline__ void __constant_coldfire_set_bit(int nr, -+ volatile void *vaddr) -+{ -+ volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3]; -+ __asm__ __volatile__ ("bset %1,(%3)" -+ : "=m" (*p) : "di" (nr & 7), "m" (*p), "a" (p)); -+} -+#endif -+ -+static __inline__ void __generic_coldfire_set_bit(int nr, -+ volatile void *vaddr) -+{ -+ __asm__ __volatile__ ("bset %1,%0" -+ : "=m" (((volatile char *)vaddr)[(nr^31) >> 3]) -+ : "d" (nr) -+ : "memory"); -+} -+#define __set_bit(nr, vaddr) set_bit(nr, vaddr) -+ -+#define test_and_clear_bit(nr, vaddr) \ -+ (__builtin_constant_p(nr) ? \ -+ __constant_coldfire_test_and_clear_bit(nr, vaddr) : \ -+ __generic_coldfire_test_and_clear_bit(nr, vaddr)) -+ -+#if 0 -+static __inline__ int __constant_coldfire_test_and_clear_bit(int nr, -+ volatile void *vaddr) -+{ -+ char retval; -+ volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3]; -+ -+ __asm__ __volatile__ ("bclr %2,%1; sne %0" -+ : "=d" (retval), "+QUd" (*p) -+ : "id" (nr & 7)); -+ -+ return retval; -+} -+#else -+static __inline__ int __constant_coldfire_test_and_clear_bit(int nr, -+ volatile void *vaddr) -+{ -+ char retval; -+ volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3]; -+ -+ __asm__ __volatile__ ("bclr %2,(%4); sne %0" -+ : "=d" (retval), "=m" (*p) -+ : "id" (nr & 7), "m" (*p), "a" (p)); -+ -+ return retval; -+} -+#endif -+ -+static __inline__ int __generic_coldfire_test_and_clear_bit(int nr, -+ volatile void *vaddr) -+{ -+ char retval; -+ -+ __asm__ __volatile__ ("bclr %2,%1; sne %0" -+ : "=d" (retval), "=m" (((volatile char *)vaddr)[(nr^31) >> 3]) -+ : "d" (nr & 7) -+ : "memory"); -+ -+ return retval; -+} -+#define __test_and_clear_bit(nr, vaddr) test_and_clear_bit(nr, vaddr) -+ -+/* -+ * clear_bit() doesn't provide any barrier for the compiler. -+ */ -+#define smp_mb__before_clear_bit() barrier() -+#define smp_mb__after_clear_bit() barrier() -+ -+#define clear_bit(nr,vaddr) \ -+ (__builtin_constant_p(nr) ? \ -+ __constant_coldfire_clear_bit(nr, vaddr) : \ -+ __generic_coldfire_clear_bit(nr, vaddr)) -+ -+#if 0 -+static __inline__ void __constant_coldfire_clear_bit(int nr, -+ volatile void *vaddr) -+{ -+ volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3]; -+ __asm__ __volatile__ ("bclr %1,%0" -+ : "+QUd" (*p) : "id" (nr & 7)); -+} -+#else -+static __inline__ void __constant_coldfire_clear_bit(int nr, -+ volatile void *vaddr) -+{ -+ volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3]; -+ __asm__ __volatile__ ("bclr %1,(%3)" -+ : "=m" (*p) : "id" (nr & 7), "m" (*p), "a" (p)); -+} -+#endif -+ -+static __inline__ void __generic_coldfire_clear_bit(int nr, -+ volatile void *vaddr) -+{ -+ __asm__ __volatile__ ("bclr %1,%0" -+ : "=m" (((volatile char *)vaddr)[(nr^31) >> 3]) -+ : "d" (nr) -+ : "memory"); -+} -+#define __clear_bit(nr, vaddr) clear_bit(nr, vaddr) -+ -+#define test_and_change_bit(nr, vaddr) \ -+ (__builtin_constant_p(nr) ? \ -+ __constant_coldfire_test_and_change_bit(nr, vaddr) : \ -+ __generic_coldfire_test_and_change_bit(nr, vaddr)) -+ -+#if 0 -+static __inline__ int __constant_coldfire_test_and_change_bit(int nr, -+ volatile void *vaddr) -+{ -+ char retval; -+ volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3]; -+ -+ __asm__ __volatile__ ("bchg %2,%1; sne %0" -+ : "=d" (retval), "+QUd" (*p) -+ : "id" (nr & 7)); -+ -+ return retval; -+} -+#else -+static __inline__ int __constant_coldfire_test_and_change_bit(int nr, -+ volatile void *vaddr) -+{ -+ char retval; -+ volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3]; -+ -+ __asm__ __volatile__ ("bchg %2,(%4); sne %0" -+ : "=d" (retval), "=m" (*p) -+ : "id" (nr & 7), "m" (*p), "a" (p)); -+ -+ return retval; -+} -+#endif -+ -+static __inline__ int __generic_coldfire_test_and_change_bit(int nr, -+ volatile void *vaddr) -+{ -+ char retval; -+ -+ __asm__ __volatile__ ("bchg %2,%1; sne %0" -+ : "=d" (retval), "=m" (((volatile char *)vaddr)[(nr^31) >> 3]) -+ : "id" (nr) -+ : "memory"); -+ -+ return retval; -+} -+#define __test_and_change_bit(nr, vaddr) test_and_change_bit(nr, vaddr) -+#define __change_bit(nr, vaddr) change_bit(nr, vaddr) -+ -+#define change_bit(nr,vaddr) \ -+ (__builtin_constant_p(nr) ? \ -+ __constant_coldfire_change_bit(nr, vaddr) : \ -+ __generic_coldfire_change_bit(nr, vaddr)) -+ -+#if 0 -+static __inline__ void __constant_coldfire_change_bit(int nr, -+ volatile void *vaddr) -+{ -+ volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3]; -+ __asm__ __volatile__ ("bchg %1,%0" -+ : "+QUd" (*p) : "id" (nr & 7)); -+} -+#else -+static __inline__ void __constant_coldfire_change_bit(int nr, -+ volatile void *vaddr) -+{ -+ volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3]; -+ __asm__ __volatile__ ("bchg %1,(%3)" -+ : "=m" (*p) : "id" (nr & 7), "m" (*p), "a" (p)); -+} -+#endif -+ -+static __inline__ void __generic_coldfire_change_bit(int nr, -+ volatile void *vaddr) -+{ -+ __asm__ __volatile__ ("bchg %1,%0" -+ : "=m" (((volatile char *)vaddr)[(nr^31) >> 3]) -+ : "d" (nr) -+ : "memory"); -+} -+ -+static inline int test_bit(int nr, const unsigned long *vaddr) -+{ -+ return (vaddr[nr >> 5] & (1UL << (nr & 31))) != 0; -+} -+ -+static __inline__ unsigned long ffz(unsigned long word) -+{ -+ unsigned long result = 0; -+ -+ while (word & 1) { -+ result++; -+ word >>= 1; -+ } -+ return result; -+} -+ -+/* find_next_zero_bit() finds the first zero bit in a bit string of length -+ * 'size' bits, starting the search at bit 'offset'. This is largely based -+ * on Linus's ALPHA routines. -+ */ -+static __inline__ unsigned long find_next_zero_bit(void *addr, -+ unsigned long size, unsigned long offset) -+{ -+ unsigned long *p = ((unsigned long *) addr) + (offset >> 5); -+ unsigned long result = offset & ~31UL; -+ unsigned long tmp; -+ -+ if (offset >= size) -+ return size; -+ size -= result; -+ offset &= 31UL; -+ if (offset) { -+ tmp = *(p++); -+ tmp |= ~0UL >> (32-offset); -+ if (size < 32) -+ goto found_first; -+ if (~tmp) -+ goto found_middle; -+ size -= 32; -+ result += 32; -+ } -+ while (size & ~31UL) { -+ tmp = *(p++); -+ if (~tmp) -+ goto found_middle; -+ result += 32; -+ size -= 32; -+ } -+ if (!size) -+ return result; -+ tmp = *p; -+ -+found_first: -+ tmp |= ~0UL >> size; -+found_middle: -+ return result + ffz(tmp); -+} -+ -+#define find_first_zero_bit(addr, size) find_next_zero_bit(((void *)addr), \ -+ (size), 0) -+ -+/* Ported from included/linux/bitops.h */ -+static __inline__ int ffs(int x) -+{ -+ int r = 1; -+ -+ if (!x) -+ return 0; -+ if (!(x & 0xffff)) { -+ x >>= 16; -+ r += 16; -+ } -+ if (!(x & 0xff)) { -+ x >>= 8; -+ r += 8; -+ } -+ if (!(x & 0xf)) { -+ x >>= 4; -+ r += 4; -+ } -+ if (!(x & 3)) { -+ x >>= 2; -+ r += 2; -+ } -+ if (!(x & 1)) { -+ x >>= 1; -+ r += 1; -+ } -+ return r; -+} -+#define __ffs(x) (ffs(x) - 1) -+ -+/* find_next_bit - find the next set bit in a memory region -+ * (from asm-ppc/bitops.h) -+ */ -+static __inline__ unsigned long find_next_bit(const unsigned long *addr, -+ unsigned long size, unsigned long offset) -+{ -+ unsigned int *p = ((unsigned int *) addr) + (offset >> 5); -+ unsigned int result = offset & ~31UL; -+ unsigned int tmp; -+ -+ if (offset >= size) -+ return size; -+ size -= result; -+ offset &= 31UL; -+ if (offset) { -+ tmp = *p++; -+ tmp &= ~0UL << offset; -+ if (size < 32) -+ goto found_first; -+ if (tmp) -+ goto found_middle; -+ size -= 32; -+ result += 32; -+ } -+ while (size >= 32) { -+ tmp = *p++; -+ if (tmp != 0) -+ goto found_middle; -+ result += 32; -+ size -= 32; -+ } -+ if (!size) -+ return result; -+ tmp = *p; -+ -+found_first: -+ tmp &= ~0UL >> (32 - size); -+ if (tmp == 0UL) /* Are any bits set? */ -+ return result + size; /* Nope. */ -+found_middle: -+ return result + __ffs(tmp); -+} -+ -+#define find_first_bit(addr, size) find_next_bit((addr), (size), 0) -+ -+#ifdef __KERNEL__ -+ -+/* Ported from include/linux/bitops.h */ -+static __inline__ int fls(int x) -+{ -+ int r = 32; -+ -+ if (!x) -+ return 0; -+ if (!(x & 0xffff0000u)) { -+ x <<= 16; -+ r -= 16; -+ } -+ if (!(x & 0xff000000u)) { -+ x <<= 8; -+ r -= 8; -+ } -+ if (!(x & 0xf0000000u)) { -+ x <<= 4; -+ r -= 4; -+ } -+ if (!(x & 0xc0000000u)) { -+ x <<= 2; -+ r -= 2; -+ } -+ if (!(x & 0x80000000u)) { -+ x <<= 1; -+ r -= 1; -+ } -+ return r; -+} -+ -+#include <asm-generic/bitops/fls64.h> -+#include <asm-generic/bitops/sched.h> -+#include <asm-generic/bitops/hweight.h> -+#include <asm-generic/bitops/lock.h> -+ -+#define minix_find_first_zero_bit(addr, size) find_next_zero_bit((addr), \ -+ (size), 0) -+#define minix_test_and_set_bit(nr, addr) test_and_set_bit((nr), \ -+ (unsigned long *)(addr)) -+#define minix_set_bit(nr, addr) set_bit((nr), \ -+ (unsigned long *)(addr)) -+#define minix_test_and_clear_bit(nr, addr) test_and_clear_bit((nr), \ -+ (unsigned long *)(addr)) -+ -+static inline int minix_test_bit(int nr, const volatile unsigned long *vaddr) -+{ -+ int *a = (int *)vaddr; -+ int mask; -+ -+ a += nr >> 5; -+ mask = 1 << (nr & 0x1f); -+ return ((mask & *a) != 0); -+} -+ -+#define ext2_set_bit(nr, addr) test_and_set_bit((nr) ^ 24, \ -+ (unsigned long *)(addr)) -+#define ext2_set_bit_atomic(lock, nr, addr) test_and_set_bit((nr) ^ 24, \ -+ (unsigned long *)(addr)) -+#define ext2_clear_bit(nr, addr) test_and_clear_bit((nr) ^ 24, \ -+ (unsigned long *)(addr)) -+#define ext2_clear_bit_atomic(lock, nr, addr) test_and_clear_bit((nr) ^ 24, \ -+ (unsigned long *)(addr)) -+ -+static inline int ext2_test_bit(int nr, const void *vaddr) -+{ -+ const unsigned char *p = vaddr; -+ return (p[nr >> 3] & (1U << (nr & 7))) != 0; -+} -+ -+static inline int ext2_find_first_zero_bit(const void *vaddr, unsigned size) -+{ -+ const unsigned long *p = vaddr, *addr = vaddr; -+ int res; -+ -+ if (!size) -+ return 0; -+ -+ size = (size >> 5) + ((size & 31) > 0); -+ while (*p++ == ~0UL) { -+ if (--size == 0) -+ return (p - addr) << 5; -+ } -+ -+ --p; -+ for (res = 0; res < 32; res++) -+ if (!ext2_test_bit (res, p)) -+ break; -+ return (p - addr) * 32 + res; -+} -+ -+static inline int ext2_find_next_zero_bit(const void *vaddr, unsigned size, -+ unsigned offset) -+{ -+ const unsigned long *addr = vaddr; -+ const unsigned long *p = addr + (offset >> 5); -+ int bit = offset & 31UL, res; -+ -+ if (offset >= size) -+ return size; -+ -+ if (bit) { -+ /* Look for zero in first longword */ -+ for (res = bit; res < 32; res++) -+ if (!ext2_test_bit (res, p)) -+ return (p - addr) * 32 + res; -+ p++; -+ } -+ /* No zero yet, search remaining full bytes for a zero */ -+ res = ext2_find_first_zero_bit(p, size - 32 * (p - addr)); -+ return (p - addr) * 32 + res; -+} -+ -+#endif /* KERNEL */ -+ -+#endif /* CONFIG_COLDFIRE */ -+ - #endif /* _M68K_BITOPS_H */ ---- a/include/asm-m68k/bootinfo.h -+++ b/include/asm-m68k/bootinfo.h -@@ -19,11 +19,59 @@ - ** Redesign of the boot information structure; renamed to bootinfo.h again - ** 27/11/96 Geert Uytterhoeven: - ** Backwards compatibility with bootinfo interface version 1.0 -+** 12/03/08 Kurt Mahan -+** Copy the bd_info structure from uboot1.3.2/include/asm-m68k/u-boot.h -+** into this file. The original author is Wolfgang Denk, -+** DENX Software Engineering, wd@denx.de. - */ - - #ifndef _M68K_BOOTINFO_H - #define _M68K_BOOTINFO_H - -+#ifndef __ASSEMBLY__ -+/* -+ * UBoot Support -+ * -+ * bd_info structure from uboot1.3.2/include/asm-m68k/u-boot.h -+ */ -+struct bd_info { -+ unsigned long bi_memstart; /* start of DRAM memory */ -+ unsigned long bi_memsize; /* size of DRAM memory in bytes */ -+ unsigned long bi_flashstart; /* start of FLASH memory */ -+ unsigned long bi_flashsize; /* size of FLASH memory */ -+ unsigned long bi_flashoffset; /* reserved area for startup monitor */ -+ unsigned long bi_sramstart; /* start of SRAM memory */ -+ unsigned long bi_sramsize; /* size of SRAM memory */ -+ unsigned long bi_mbar_base; /* base of internal registers */ -+ unsigned long bi_bootflags; /* boot / reboot flag (for LynxOS) */ -+ unsigned long bi_boot_params; /* where this board expects params */ -+ unsigned long bi_ip_addr; /* IP Address */ -+ unsigned char bi_enet0addr[6]; /* Ethernet 0 mac address */ -+ unsigned short bi_ethspeed; /* Ethernet speed in Mbps */ -+ unsigned long bi_intfreq; /* Internal Freq, in MHz */ -+ unsigned long bi_busfreq; /* Bus Freq, in MHz */ -+#ifdef UBOOT_PCI -+ unsigned long bi_pcifreq; /* pci Freq in MHz */ -+#endif -+#ifdef UBOOT_EXTRA_CLOCK -+ unsigned long bi_inpfreq; /* input Freq in MHz */ -+ unsigned long bi_vcofreq; /* vco Freq in MHz */ -+ unsigned long bi_flbfreq; /* Flexbus Freq in MHz */ -+#endif -+ unsigned long bi_baudrate; /* Console Baudrate */ -+ unsigned char bi_enet1addr[6]; /* eth1 mac address */ -+ unsigned char bi_enet2addr[6]; /* eth2 mac address */ -+ unsigned char bi_enet3addr[6]; /* eth3 mac address */ -+}; -+ -+struct uboot_record { -+ struct bd_info *bdi; -+ unsigned long initrd_start; -+ unsigned long initrd_end; -+ unsigned long cmd_line_start; -+ unsigned long cmd_line_stop; -+}; -+#endif /* __ASSEMBLY__ */ - - /* - * Bootinfo definitions -@@ -49,6 +97,8 @@ struct bi_record { - #endif /* __ASSEMBLY__ */ - - -+ -+ - /* - * Tag Definitions - * ---- a/include/asm-m68k/byteorder.h -+++ b/include/asm-m68k/byteorder.h -@@ -4,8 +4,15 @@ - #include <asm/types.h> - #include <linux/compiler.h> - --#ifdef __GNUC__ -- -+#if defined(__GNUC__) -+#if defined(__mcfisaaplus__) || defined(__mcfisac__) -+static __inline__ __attribute_const__ __u32 ___arch__swab32(__u32 val) -+{ -+ __asm__ ("byterev %0" : "=d" (val) : "0" (val)); -+ return val; -+} -+#define __arch__swab32(x) ___arch__swab32(x) -+#elif !defined(__mcoldfire__) - static __inline__ __attribute_const__ __u32 ___arch__swab32(__u32 val) - { - __asm__("rolw #8,%0; swap %0; rolw #8,%0" : "=d" (val) : "0" (val)); -@@ -14,6 +21,7 @@ static __inline__ __attribute_const__ __ - #define __arch__swab32(x) ___arch__swab32(x) - - #endif -+#endif - - #if defined(__GNUC__) && !defined(__STRICT_ANSI__) || defined(__KERNEL__) - # define __BYTEORDER_HAS_U64__ ---- a/include/asm-m68k/cacheflush.h -+++ b/include/asm-m68k/cacheflush.h -@@ -6,6 +6,9 @@ - /* cache code */ - #define FLUSH_I_AND_D (0x00000808) - #define FLUSH_I (0x00000008) -+#ifdef CONFIG_COLDFIRE -+#include <asm/cf_cacheflush.h> -+#else /* !CONFIG_COLDFIRE */ - - /* - * Cache handling functions -@@ -153,4 +156,5 @@ static inline void copy_from_user_page(s - memcpy(dst, src, len); - } - -+#endif /* !CONFIG_COLDFIRE */ - #endif /* _M68K_CACHEFLUSH_H */ ---- /dev/null -+++ b/include/asm-m68k/cf_5445x_cacheflush.h -@@ -0,0 +1,447 @@ -+/* -+ * include/asm-m68k/cf_5445x_cacheflush.h - Coldfire 5445x Cache -+ * -+ * Based on include/asm-m68k/cacheflush.h -+ * -+ * Coldfire pieces by: -+ * Kurt Mahan kmahan@freescale.com -+ * -+ * Copyright Freescale Semiconductor, Inc. 2007, 2008 -+ * -+ * This program is free software; you can redistribute it and/or modify it -+ * under the terms of the GNU General Public License as published by the -+ * Free Software Foundation; either version 2 of the License, or (at your -+ * option) any later version. -+ */ -+#ifndef M68K_CF_5445x_CACHEFLUSH_H -+#define M68K_CF_5445x_CACHEFLUSH_H -+ -+#include <asm/cfcache.h> -+ -+/* -+ * Coldfire Cache Model -+ * -+ * The Coldfire processors use a Harvard architecture cache configured -+ * as four-way set associative. The cache does not implement bus snooping -+ * so cache coherency with other masters must be maintained in software. -+ * -+ * The cache is managed via the CPUSHL instruction in conjunction with -+ * bits set in the CACR (cache control register). Currently the code -+ * uses the CPUSHL enhancement which adds the ability to -+ * invalidate/clear/push a cacheline by physical address. This feature -+ * is designated in the Hardware Configuration Register [D1-CPES]. -+ * -+ * CACR Bits: -+ * DPI[28] cpushl invalidate disable for d-cache -+ * IDPI[12] cpushl invalidate disable for i-cache -+ * SPA[14] cpushl search by physical address -+ * IVO[20] cpushl invalidate only -+ * -+ * Random Terminology: -+ * * invalidate = reset the cache line's valid bit -+ * * push = generate a line-sized store of the data if its contents are marked -+ * as modifed (the modified flag is cleared after the store) -+ * * clear = push + invalidate -+ */ -+ -+/** -+ * flush_icache - Flush all of the instruction cache -+ */ -+static inline void flush_icache(void) -+{ -+ asm volatile("nop\n" -+ "moveq%.l #0,%%d0\n" -+ "moveq%.l #0,%%d1\n" -+ "move%.l %%d0,%%a0\n" -+ "1:\n" -+ "cpushl %%ic,(%%a0)\n" -+ "add%.l #0x0010,%%a0\n" -+ "addq%.l #1,%%d1\n" -+ "cmpi%.l %0,%%d1\n" -+ "bne 1b\n" -+ "moveq%.l #0,%%d1\n" -+ "addq%.l #1,%%d0\n" -+ "move%.l %%d0,%%a0\n" -+ "cmpi%.l #4,%%d0\n" -+ "bne 1b\n" -+ : : "i" (CACHE_SETS) -+ : "a0", "d0", "d1"); -+} -+ -+/** -+ * flush_dcache - Flush all of the data cache -+ */ -+static inline void flush_dcache(void) -+{ -+ asm volatile("nop\n" -+ "moveq%.l #0,%%d0\n" -+ "moveq%.l #0,%%d1\n" -+ "move%.l %%d0,%%a0\n" -+ "1:\n" -+ "cpushl %%dc,(%%a0)\n" -+ "add%.l #0x0010,%%a0\n" -+ "addq%.l #1,%%d1\n" -+ "cmpi%.l %0,%%d1\n" -+ "bne 1b\n" -+ "moveq%.l #0,%%d1\n" -+ "addq%.l #1,%%d0\n" -+ "move%.l %%d0,%%a0\n" -+ "cmpi%.l #4,%%d0\n" -+ "bne 1b\n" -+ : : "i" (CACHE_SETS) -+ : "a0", "d0", "d1"); -+} -+ -+/** -+ * flush_bcache - Flush all of both caches -+ */ -+static inline void flush_bcache(void) -+{ -+ asm volatile("nop\n" -+ "moveq%.l #0,%%d0\n" -+ "moveq%.l #0,%%d1\n" -+ "move%.l %%d0,%%a0\n" -+ "1:\n" -+ "cpushl %%bc,(%%a0)\n" -+ "add%.l #0x0010,%%a0\n" -+ "addq%.l #1,%%d1\n" -+ "cmpi%.l %0,%%d1\n" -+ "bne 1b\n" -+ "moveq%.l #0,%%d1\n" -+ "addq%.l #1,%%d0\n" -+ "move%.l %%d0,%%a0\n" -+ "cmpi%.l #4,%%d0\n" -+ "bne 1b\n" -+ : : "i" (CACHE_SETS) -+ : "a0", "d0", "d1"); -+} -+ -+/** -+ * cf_cache_clear - invalidate cache -+ * @paddr: starting physical address -+ * @len: number of bytes -+ * -+ * Invalidate cache lines starting at paddr for len bytes. -+ * Those lines are not pushed. -+ */ -+static inline void cf_cache_clear(unsigned long paddr, int len) -+{ -+ /* number of lines */ -+ len = (len + (CACHE_LINE_SIZE-1)) / CACHE_LINE_SIZE; -+ if (len == 0) -+ return; -+ -+ /* align on set boundary */ -+ paddr &= 0xfffffff0; -+ -+ asm volatile("nop\n" -+ "move%.l %2,%%d0\n" -+ "or%.l %3,%%d0\n" -+ "movec %%d0,%%cacr\n" -+ "move%.l %0,%%a0\n" -+ "move%.l %1,%%d0\n" -+ "1:\n" -+ "cpushl %%bc,(%%a0)\n" -+ "lea 0x10(%%a0),%%a0\n" -+ "subq%.l #1,%%d0\n" -+ "bne%.b 1b\n" -+ "movec %2,%%cacr\n" -+ : : "a" (paddr), "r" (len), -+ "r" (shadow_cacr), -+ "i" (CF_CACR_SPA+CF_CACR_IVO) -+ : "a0", "d0"); -+} -+ -+/** -+ * cf_cache_push - Push dirty cache out with no invalidate -+ * @paddr: starting physical address -+ * @len: number of bytes -+ * -+ * Push the any dirty lines starting at paddr for len bytes. -+ * Those lines are not invalidated. -+ */ -+static inline void cf_cache_push(unsigned long paddr, int len) -+{ -+ /* number of lines */ -+ len = (len + (CACHE_LINE_SIZE-1)) / CACHE_LINE_SIZE; -+ if (len == 0) -+ return; -+ -+ /* align on set boundary */ -+ paddr &= 0xfffffff0; -+ -+ asm volatile("nop\n" -+ "move%.l %2,%%d0\n" -+ "or%.l %3,%%d0\n" -+ "movec %%d0,%%cacr\n" -+ "move%.l %0,%%a0\n" -+ "move%.l %1,%%d0\n" -+ "1:\n" -+ "cpushl %%bc,(%%a0)\n" -+ "lea 0x10(%%a0),%%a0\n" -+ "subq%.l #1,%%d0\n" -+ "bne.b 1b\n" -+ "movec %2,%%cacr\n" -+ : : "a" (paddr), "r" (len), -+ "r" (shadow_cacr), -+ "i" (CF_CACR_SPA+CF_CACR_DPI+CF_CACR_IDPI) -+ : "a0", "d0"); -+} -+ -+/** -+ * cf_cache_flush - Push dirty cache out and invalidate -+ * @paddr: starting physical address -+ * @len: number of bytes -+ * -+ * Push the any dirty lines starting at paddr for len bytes and -+ * invalidate those lines. -+ */ -+static inline void cf_cache_flush(unsigned long paddr, int len) -+{ -+ /* number of lines */ -+ len = (len + (CACHE_LINE_SIZE-1)) / CACHE_LINE_SIZE; -+ if (len == 0) -+ return; -+ -+ /* align on set boundary */ -+ paddr &= 0xfffffff0; -+ -+ asm volatile("nop\n" -+ "move%.l %2,%%d0\n" -+ "or%.l %3,%%d0\n" -+ "movec %%d0,%%cacr\n" -+ "move%.l %0,%%a0\n" -+ "move%.l %1,%%d0\n" -+ "1:\n" -+ "cpushl %%bc,(%%a0)\n" -+ "lea 0x10(%%a0),%%a0\n" -+ "subq%.l #1,%%d0\n" -+ "bne.b 1b\n" -+ "movec %2,%%cacr\n" -+ : : "a" (paddr), "r" (len), -+ "r" (shadow_cacr), -+ "i" (CF_CACR_SPA) -+ : "a0", "d0"); -+} -+ -+/** -+ * cf_cache_flush_range - Push dirty data/inst cache in range out and invalidate -+ * @vstart - starting virtual address -+ * @vend: ending virtual address -+ * -+ * Push the any dirty data/instr lines starting at paddr for len bytes and -+ * invalidate those lines. -+ */ -+static inline void cf_cache_flush_range(unsigned long vstart, unsigned long vend) -+{ -+ int len; -+ -+ /* align on set boundary */ -+ vstart &= 0xfffffff0; -+ vend = PAGE_ALIGN((vend + (CACHE_LINE_SIZE-1))) & 0xfffffff0; -+ len = vend - vstart; -+ if (len == 0) -+ return; -+ vstart = __pa(vstart); -+ vend = vstart + len; -+ -+ asm volatile("nop\n" -+ "move%.l %2,%%d0\n" -+ "or%.l %3,%%d0\n" -+ "movec %%d0,%%cacr\n" -+ "move%.l %0,%%a0\n" -+ "move%.l %1,%%a1\n" -+ "1:\n" -+ "cpushl %%bc,(%%a0)\n" -+ "lea 0x10(%%a0),%%a0\n" -+ "cmpa%.l %%a0,%%a1\n" -+ "bne.b 1b\n" -+ "movec %2,%%cacr\n" -+ : /* no return */ -+ : "a" (vstart), "a" (vend), -+ "r" (shadow_cacr), -+ "i" (CF_CACR_SPA) -+ : "a0", "a1", "d0"); -+} -+ -+/** -+ * cf_dcache_flush_range - Push dirty data cache in range out and invalidate -+ * @vstart - starting virtual address -+ * @vend: ending virtual address -+ * -+ * Push the any dirty data lines starting at paddr for len bytes and -+ * invalidate those lines. -+ */ -+static inline void cf_dcache_flush_range(unsigned long vstart, unsigned long vend) -+{ -+ /* align on set boundary */ -+ vstart &= 0xfffffff0; -+ vend = (vend + (CACHE_LINE_SIZE-1)) & 0xfffffff0; -+ -+ asm volatile("nop\n" -+ "move%.l %2,%%d0\n" -+ "or%.l %3,%%d0\n" -+ "movec %%d0,%%cacr\n" -+ "move%.l %0,%%a0\n" -+ "move%.l %1,%%a1\n" -+ "1:\n" -+ "cpushl %%dc,(%%a0)\n" -+ "lea 0x10(%%a0),%%a0\n" -+ "cmpa%.l %%a0,%%a1\n" -+ "bne.b 1b\n" -+ "movec %2,%%cacr\n" -+ : /* no return */ -+ : "a" (__pa(vstart)), "a" (__pa(vend)), -+ "r" (shadow_cacr), -+ "i" (CF_CACR_SPA) -+ : "a0", "a1", "d0"); -+} -+ -+/** -+ * cf_icache_flush_range - Push dirty inst cache in range out and invalidate -+ * @vstart - starting virtual address -+ * @vend: ending virtual address -+ * -+ * Push the any dirty instr lines starting at paddr for len bytes and -+ * invalidate those lines. This should just be an invalidate since you -+ * shouldn't be able to have dirty instruction cache. -+ */ -+static inline void cf_icache_flush_range(unsigned long vstart, unsigned long vend) -+{ -+ /* align on set boundary */ -+ vstart &= 0xfffffff0; -+ vend = (vend + (CACHE_LINE_SIZE-1)) & 0xfffffff0; -+ -+ asm volatile("nop\n" -+ "move%.l %2,%%d0\n" -+ "or%.l %3,%%d0\n" -+ "movec %%d0,%%cacr\n" -+ "move%.l %0,%%a0\n" -+ "move%.l %1,%%a1\n" -+ "1:\n" -+ "cpushl %%ic,(%%a0)\n" -+ "lea 0x10(%%a0),%%a0\n" -+ "cmpa%.l %%a0,%%a1\n" -+ "bne.b 1b\n" -+ "movec %2,%%cacr\n" -+ : /* no return */ -+ : "a" (__pa(vstart)), "a" (__pa(vend)), -+ "r" (shadow_cacr), -+ "i" (CF_CACR_SPA) -+ : "a0", "a1", "d0"); -+} -+ -+/** -+ * flush_cache_mm - Flush an mm_struct -+ * @mm: mm_struct to flush -+ */ -+static inline void flush_cache_mm(struct mm_struct *mm) -+{ -+ if (mm == current->mm) -+ flush_bcache(); -+} -+ -+#define flush_cache_dup_mm(mm) flush_cache_mm(mm) -+ -+/** -+ * flush_cache_range - Flush a cache range -+ * @vma: vma struct -+ * @start: Starting address -+ * @end: Ending address -+ * -+ * flush_cache_range must be a macro to avoid a dependency on -+ * linux/mm.h which includes this file. -+ */ -+static inline void flush_cache_range(struct vm_area_struct *vma, -+ unsigned long start, unsigned long end) -+{ -+ if (vma->vm_mm == current->mm) -+ cf_cache_flush_range(start, end); -+} -+ -+/** -+ * flush_cache_page - Flush a page of the cache -+ * @vma: vma struct -+ * @vmaddr: -+ * @pfn: page numer -+ * -+ * flush_cache_page must be a macro to avoid a dependency on -+ * linux/mm.h which includes this file. -+ */ -+static inline void flush_cache_page(struct vm_area_struct *vma, -+ unsigned long vmaddr, unsigned long pfn) -+{ -+ if (vma->vm_mm == current->mm) -+ cf_cache_flush_range(vmaddr, vmaddr+PAGE_SIZE); -+} -+ -+/** -+ * __flush_page_to_ram - Push a page out of the cache -+ * @vaddr: Virtual address at start of page -+ * -+ * Push the page at kernel virtual address *vaddr* and clear -+ * the icache. -+ */ -+static inline void __flush_page_to_ram(void *vaddr) -+{ -+ asm volatile("nop\n" -+ "move%.l %2,%%d0\n" -+ "or%.l %3,%%d0\n" -+ "movec %%d0,%%cacr\n" -+ "move%.l %0,%%d0\n" -+ "and%.l #0xfffffff0,%%d0\n" -+ "move%.l %%d0,%%a0\n" -+ "move%.l %1,%%d0\n" -+ "1:\n" -+ "cpushl %%bc,(%%a0)\n" -+ "lea 0x10(%%a0),%%a0\n" -+ "subq%.l #1,%%d0\n" -+ "bne.b 1b\n" -+ "movec %2,%%cacr\n" -+ : : "a" (__pa(vaddr)), "i" (PAGE_SIZE / CACHE_LINE_SIZE), -+ "r" (shadow_cacr), "i" (CF_CACR_SPA) -+ : "a0", "d0"); -+} -+ -+/* -+ * Various defines for the kernel. -+ */ -+ -+extern void cache_clear(unsigned long paddr, int len); -+extern void cache_push(unsigned long paddr, int len); -+extern void flush_icache_range(unsigned long address, unsigned long endaddr); -+ -+#define flush_cache_all() flush_bcache() -+#define flush_cache_vmap(start, end) flush_bcache() -+#define flush_cache_vunmap(start, end) flush_bcache() -+ -+#define flush_dcache_range(vstart, vend) cf_dcache_flush_range(vstart, vend) -+#define flush_dcache_page(page) __flush_page_to_ram(page_address(page)) -+#define flush_dcache_mmap_lock(mapping) do { } while (0) -+#define flush_dcache_mmap_unlock(mapping) do { } while (0) -+ -+#define flush_icache_page(vma, page) __flush_page_to_ram(page_address(page)) -+ -+/** -+ * copy_to_user_page - Copy memory to user page -+ */ -+static inline void copy_to_user_page(struct vm_area_struct *vma, -+ struct page *page, unsigned long vaddr, -+ void *dst, void *src, int len) -+{ -+ memcpy(dst, src, len); -+ cf_cache_flush(page_to_phys(page), PAGE_SIZE); -+} -+ -+/** -+ * copy_from_user_page - Copy memory from user page -+ */ -+static inline void copy_from_user_page(struct vm_area_struct *vma, -+ struct page *page, unsigned long vaddr, -+ void *dst, void *src, int len) -+{ -+ cf_cache_flush(page_to_phys(page), PAGE_SIZE); -+ memcpy(dst, src, len); -+} -+ -+#endif /* M68K_CF_5445x_CACHEFLUSH_H */ ---- /dev/null -+++ b/include/asm-m68k/cf_548x_cacheflush.h -@@ -0,0 +1,259 @@ -+/* -+ * include/asm-m68k/cf_548x_cacheflush.h - Coldfire 547x/548x Cache -+ * -+ * Based on include/asm-m68k/cacheflush.h -+ * -+ * Coldfire pieces by: -+ * Kurt Mahan kmahan@freescale.com -+ * -+ * Copyright Freescale Semiconductor, Inc. 2007, 2008 -+ * -+ * This program is free software; you can redistribute it and/or modify it -+ * under the terms of the GNU General Public License as published by the -+ * Free Software Foundation; either version 2 of the License, or (at your -+ * option) any later version. -+ */ -+#ifndef M68K_CF_548x_CACHEFLUSH_H -+#define M68K_CF_548x_CACHEFLUSH_H -+ -+#include <asm/cfcache.h> -+/* -+ * Cache handling functions -+ */ -+ -+#define flush_icache() \ -+({ \ -+ unsigned long set; \ -+ unsigned long start_set; \ -+ unsigned long end_set; \ -+ \ -+ start_set = 0; \ -+ end_set = (unsigned long)LAST_DCACHE_ADDR; \ -+ \ -+ for (set = start_set; set <= end_set; set += (0x10 - 3)) { \ -+ asm volatile("cpushl %%ic,(%0)\n" \ -+ "\taddq%.l #1,%0\n" \ -+ "\tcpushl %%ic,(%0)\n" \ -+ "\taddq%.l #1,%0\n" \ -+ "\tcpushl %%ic,(%0)\n" \ -+ "\taddq%.l #1,%0\n" \ -+ "\tcpushl %%ic,(%0)" : "=a" (set) : "a" (set)); \ -+ } \ -+}) -+ -+#define flush_dcache() \ -+({ \ -+ unsigned long set; \ -+ unsigned long start_set; \ -+ unsigned long end_set; \ -+ \ -+ start_set = 0; \ -+ end_set = (unsigned long)LAST_DCACHE_ADDR; \ -+ \ -+ for (set = start_set; set <= end_set; set += (0x10 - 3)) { \ -+ asm volatile("cpushl %%dc,(%0)\n" \ -+ "\taddq%.l #1,%0\n" \ -+ "\tcpushl %%dc,(%0)\n" \ -+ "\taddq%.l #1,%0\n" \ -+ "\tcpushl %%dc,(%0)\n" \ -+ "\taddq%.l #1,%0\n" \ -+ "\tcpushl %%dc,(%0)" : "=a" (set) : "a" (set)); \ -+ } \ -+}) -+ -+#define flush_bcache() \ -+({ \ -+ unsigned long set; \ -+ unsigned long start_set; \ -+ unsigned long end_set; \ -+ \ -+ start_set = 0; \ -+ end_set = (unsigned long)LAST_DCACHE_ADDR; \ -+ \ -+ for (set = start_set; set <= end_set; set += (0x10 - 3)) { \ -+ asm volatile("cpushl %%bc,(%0)\n" \ -+ "\taddq%.l #1,%0\n" \ -+ "\tcpushl %%bc,(%0)\n" \ -+ "\taddq%.l #1,%0\n" \ -+ "\tcpushl %%bc,(%0)\n" \ -+ "\taddq%.l #1,%0\n" \ -+ "\tcpushl %%bc,(%0)" : "=a" (set) : "a" (set)); \ -+ } \ -+}) -+ -+/* -+ * invalidate the cache for the specified memory range. -+ * It starts at the physical address specified for -+ * the given number of bytes. -+ */ -+extern void cache_clear(unsigned long paddr, int len); -+/* -+ * push any dirty cache in the specified memory range. -+ * It starts at the physical address specified for -+ * the given number of bytes. -+ */ -+extern void cache_push(unsigned long paddr, int len); -+ -+/* -+ * push and invalidate pages in the specified user virtual -+ * memory range. -+ */ -+extern void cache_push_v(unsigned long vaddr, int len); -+ -+/* This is needed whenever the virtual mapping of the current -+ process changes. */ -+ -+/** -+ * flush_cache_mm - Flush an mm_struct -+ * @mm: mm_struct to flush -+ */ -+static inline void flush_cache_mm(struct mm_struct *mm) -+{ -+ if (mm == current->mm) -+ flush_bcache(); -+} -+ -+#define flush_cache_dup_mm(mm) flush_cache_mm(mm) -+ -+#define flush_cache_all() flush_bcache() -+ -+/** -+ * flush_cache_range - Flush a cache range -+ * @vma: vma struct -+ * @start: Starting address -+ * @end: Ending address -+ * -+ * flush_cache_range must be a macro to avoid a dependency on -+ * linux/mm.h which includes this file. -+ */ -+static inline void flush_cache_range(struct vm_area_struct *vma, -+ unsigned long start, unsigned long end) -+{ -+ if (vma->vm_mm == current->mm) -+ flush_bcache(); -+// cf_cache_flush_range(start, end); -+} -+ -+/** -+ * flush_cache_page - Flush a page of the cache -+ * @vma: vma struct -+ * @vmaddr: -+ * @pfn: page numer -+ * -+ * flush_cache_page must be a macro to avoid a dependency on -+ * linux/mm.h which includes this file. -+ */ -+static inline void flush_cache_page(struct vm_area_struct *vma, -+ unsigned long vmaddr, unsigned long pfn) -+{ -+ if (vma->vm_mm == current->mm) -+ flush_bcache(); -+// cf_cache_flush_range(vmaddr, vmaddr+PAGE_SIZE); -+} -+ -+/* Push the page at kernel virtual address and clear the icache */ -+/* RZ: use cpush %bc instead of cpush %dc, cinv %ic */ -+#define flush_page_to_ram(page) __flush_page_to_ram((void *) page_address(page)) -+extern inline void __flush_page_to_ram(void *address) -+{ -+ unsigned long set; -+ unsigned long start_set; -+ unsigned long end_set; -+ unsigned long addr = (unsigned long) address; -+ -+ addr &= ~(PAGE_SIZE - 1); /* round down to page start address */ -+ -+ start_set = addr & _ICACHE_SET_MASK; -+ end_set = (addr + PAGE_SIZE-1) & _ICACHE_SET_MASK; -+ -+ if (start_set > end_set) { -+ /* from the begining to the lowest address */ -+ for (set = 0; set <= end_set; set += (0x10 - 3)) { -+ asm volatile("cpushl %%bc,(%0)\n" -+ "\taddq%.l #1,%0\n" -+ "\tcpushl %%bc,(%0)\n" -+ "\taddq%.l #1,%0\n" -+ "\tcpushl %%bc,(%0)\n" -+ "\taddq%.l #1,%0\n" -+ "\tcpushl %%bc,(%0)" : "=a" (set) : "a" (set)); -+ } -+ /* next loop will finish the cache ie pass the hole */ -+ end_set = LAST_ICACHE_ADDR; -+ } -+ for (set = start_set; set <= end_set; set += (0x10 - 3)) { -+ asm volatile("cpushl %%bc,(%0)\n" -+ "\taddq%.l #1,%0\n" -+ "\tcpushl %%bc,(%0)\n" -+ "\taddq%.l #1,%0\n" -+ "\tcpushl %%bc,(%0)\n" -+ "\taddq%.l #1,%0\n" -+ "\tcpushl %%bc,(%0)" : "=a" (set) : "a" (set)); -+ } -+} -+ -+/* Use __flush_page_to_ram() for flush_dcache_page all values are same - MW */ -+#define flush_dcache_page(page) \ -+ __flush_page_to_ram((void *) page_address(page)) -+#define flush_icache_page(vma,pg) \ -+ __flush_page_to_ram((void *) page_address(pg)) -+#define flush_icache_user_range(adr,len) do { } while (0) -+/* NL */ -+#define flush_icache_user_page(vma,page,addr,len) do { } while (0) -+ -+/* Push n pages at kernel virtual address and clear the icache */ -+/* RZ: use cpush %bc instead of cpush %dc, cinv %ic */ -+extern inline void flush_icache_range (unsigned long address, -+ unsigned long endaddr) -+{ -+ unsigned long set; -+ unsigned long start_set; -+ unsigned long end_set; -+ -+ start_set = address & _ICACHE_SET_MASK; -+ end_set = endaddr & _ICACHE_SET_MASK; -+ -+ if (start_set > end_set) { -+ /* from the begining to the lowest address */ -+ for (set = 0; set <= end_set; set += (0x10 - 3)) { -+ asm volatile("cpushl %%ic,(%0)\n" -+ "\taddq%.l #1,%0\n" -+ "\tcpushl %%ic,(%0)\n" -+ "\taddq%.l #1,%0\n" -+ "\tcpushl %%ic,(%0)\n" -+ "\taddq%.l #1,%0\n" -+ "\tcpushl %%ic,(%0)" : "=a" (set) : "a" (set)); -+ } -+ /* next loop will finish the cache ie pass the hole */ -+ end_set = LAST_ICACHE_ADDR; -+ } -+ for (set = start_set; set <= end_set; set += (0x10 - 3)) { -+ asm volatile("cpushl %%ic,(%0)\n" -+ "\taddq%.l #1,%0\n" -+ "\tcpushl %%ic,(%0)\n" -+ "\taddq%.l #1,%0\n" -+ "\tcpushl %%ic,(%0)\n" -+ "\taddq%.l #1,%0\n" -+ "\tcpushl %%ic,(%0)" : "=a" (set) : "a" (set)); -+ } -+} -+ -+static inline void copy_to_user_page(struct vm_area_struct *vma, -+ struct page *page, unsigned long vaddr, -+ void *dst, void *src, int len) -+{ -+ memcpy(dst, src, len); -+ flush_icache_user_page(vma, page, vaddr, len); -+} -+static inline void copy_from_user_page(struct vm_area_struct *vma, -+ struct page *page, unsigned long vaddr, -+ void *dst, void *src, int len) -+{ -+ memcpy(dst, src, len); -+} -+ -+#define flush_cache_vmap(start, end) flush_cache_all() -+#define flush_cache_vunmap(start, end) flush_cache_all() -+#define flush_dcache_mmap_lock(mapping) do { } while (0) -+#define flush_dcache_mmap_unlock(mapping) do { } while (0) -+ -+#endif /* M68K_CF_548x_CACHEFLUSH_H */ ---- /dev/null -+++ b/include/asm-m68k/cf_cacheflush.h -@@ -0,0 +1,10 @@ -+#ifndef M68K_CF_CACHEFLUSH_H -+#define M68K_CF_CACHEFLUSH_H -+ -+#ifdef CONFIG_M5445X -+#include "cf_5445x_cacheflush.h" -+#else -+#include "cf_548x_cacheflush.h" -+#endif -+ -+#endif /* M68K_CF_CACHEFLUSH_H */ ---- /dev/null -+++ b/include/asm-m68k/cfcache.h -@@ -0,0 +1,114 @@ -+/* -+ * include/asm-m68k/cfcache.h - Coldfire Cache Controller -+ * -+ * Kurt Mahan kmahan@freescale.com -+ * -+ * Copyright Freescale Semiconductor, Inc. 2007 -+ * -+ * This program is free software; you can redistribute it and/or modify it -+ * under the terms of the GNU General Public License as published by the -+ * Free Software Foundation; either version 2 of the License, or (at your -+ * option) any later version. -+ */ -+#ifndef CF_CFCACHE_H -+#define CF_CFCACHE_H -+ -+/* -+ * CACR Cache Control Register -+ */ -+#define CF_CACR_DEC (0x80000000) /* Data Cache Enable */ -+#define CF_CACR_DW (0x40000000) /* Data default Write-protect */ -+#define CF_CACR_DESB (0x20000000) /* Data Enable Store Buffer */ -+#define CF_CACR_DPI (0x10000000) /* Data Disable CPUSHL Invalidate */ -+#define CF_CACR_DHLCK (0x08000000) /* 1/2 Data Cache Lock Mode */ -+#define CF_CACR_DDCM_00 (0x00000000) /* Cacheable writethrough imprecise */ -+#define CF_CACR_DDCM_01 (0x02000000) /* Cacheable copyback */ -+#define CF_CACR_DDCM_10 (0x04000000) /* Noncacheable precise */ -+#define CF_CACR_DDCM_11 (0x06000000) /* Noncacheable imprecise */ -+#define CF_CACR_DCINVA (0x01000000) /* Data Cache Invalidate All */ -+#define CF_CACR_DDSP (0x00800000) /* Data default supervisor-protect */ -+#define CF_CACR_IVO (0x00100000) /* Invalidate only */ -+#define CF_CACR_BEC (0x00080000) /* Branch Cache Enable */ -+#define CF_CACR_BCINVA (0x00040000) /* Branch Cache Invalidate All */ -+#define CF_CACR_IEC (0x00008000) /* Instruction Cache Enable */ -+#define CF_CACR_SPA (0x00004000) /* Search by Physical Address */ -+#define CF_CACR_DNFB (0x00002000) /* Default cache-inhibited fill buf */ -+#define CF_CACR_IDPI (0x00001000) /* Instr Disable CPUSHL Invalidate */ -+#define CF_CACR_IHLCK (0x00000800) /* 1/2 Instruction Cache Lock Mode */ -+#define CF_CACR_IDCM (0x00000400) /* Noncacheable Instr default mode */ -+#define CF_CACR_ICINVA (0x00000100) /* Instr Cache Invalidate All */ -+#define CF_CACR_IDSP (0x00000080) /* Ins default supervisor-protect */ -+#define CF_CACR_EUSP (0x00000020) /* Switch stacks in user mode */ -+ -+#ifdef CONFIG_M5445X -+/* -+ * M5445x Cache Configuration -+ * - cache line size is 16 bytes -+ * - cache is 4-way set associative -+ * - each cache has 256 sets (64k / 16bytes / 4way) -+ * - I-Cache size is 16KB -+ * - D-Cache size is 16KB -+ */ -+#define ICACHE_SIZE 0x4000 /* instruction - 16k */ -+#define DCACHE_SIZE 0x4000 /* data - 16k */ -+ -+#define CACHE_LINE_SIZE 0x0010 /* 16 bytes */ -+#define CACHE_SETS 0x0100 /* 256 sets */ -+#define CACHE_WAYS 0x0004 /* 4 way */ -+ -+#define CACHE_DISABLE_MODE (CF_CACR_DCINVA+ \ -+ CF_CACR_BCINVA+ \ -+ CF_CACR_ICINVA) -+ -+#ifndef CONFIG_M5445X_DISABLE_CACHE -+#define CACHE_INITIAL_MODE (CF_CACR_DEC+ \ -+ CF_CACR_BEC+ \ -+ CF_CACR_IEC+ \ -+ CF_CACR_DESB+ \ -+ CF_CACR_EUSP) -+#else -+/* cache disabled for testing */ -+#define CACHE_INITIAL_MODE (CF_CACR_EUSP) -+#endif /* CONFIG_M5445X_DISABLE_CACHE */ -+ -+#elif defined(CONFIG_M547X_8X) -+/* -+ * M547x/M548x Cache Configuration -+ * - cache line size is 16 bytes -+ * - cache is 4-way set associative -+ * - each cache has 512 sets (128k / 16bytes / 4way) -+ * - I-Cache size is 32KB -+ * - D-Cache size is 32KB -+ */ -+#define ICACHE_SIZE 0x8000 /* instruction - 32k */ -+#define DCACHE_SIZE 0x8000 /* data - 32k */ -+ -+#define CACHE_LINE_SIZE 0x0010 /* 16 bytes */ -+#define CACHE_SETS 0x0200 /* 512 sets */ -+#define CACHE_WAYS 0x0004 /* 4 way */ -+ -+/* in for the old cpushl caching code */ -+#define _DCACHE_SET_MASK ((DCACHE_SIZE/64-1)<<CACHE_WAYS) -+#define _ICACHE_SET_MASK ((ICACHE_SIZE/64-1)<<CACHE_WAYS) -+#define LAST_DCACHE_ADDR _DCACHE_SET_MASK -+#define LAST_ICACHE_ADDR _ICACHE_SET_MASK -+ -+#define CACHE_DISABLE_MODE (CF_CACR_DCINVA+ \ -+ CF_CACR_BCINVA+ \ -+ CF_CACR_ICINVA) -+ -+#define CACHE_INITIAL_MODE (CF_CACR_DEC+ \ -+ CF_CACR_BEC+ \ -+ CF_CACR_IEC+ \ -+ CF_CACR_DESB+ \ -+ CF_CACR_EUSP) -+#endif /* CONFIG_M547X_8X */ -+ -+#ifndef __ASSEMBLY__ -+ -+extern unsigned long shadow_cacr; -+extern void cacr_set(unsigned long x); -+ -+#endif /* !__ASSEMBLY__ */ -+ -+#endif /* CF_CACHE_H */ ---- /dev/null -+++ b/include/asm-m68k/cf_entry.h -@@ -0,0 +1,146 @@ -+#ifndef __CF_M68K_ENTRY_H -+#define __CF_M68K_ENTRY_H -+ -+#include <asm/setup.h> -+#include <asm/page.h> -+#include <asm/coldfire.h> -+#include <asm/cfmmu.h> -+#include <asm/asm-offsets.h> -+ -+/* -+ * Stack layout in 'ret_from_exception': -+ * -+ * This allows access to the syscall arguments in registers d1-d5 -+ * -+ * 0(sp) - d1 -+ * 4(sp) - d2 -+ * 8(sp) - d3 -+ * C(sp) - d4 -+ * 10(sp) - d5 -+ * 14(sp) - a0 -+ * 18(sp) - a1 -+ * 1C(sp) - a2 -+ * 20(sp) - d0 -+ * 24(sp) - orig_d0 -+ * 28(sp) - stack adjustment -+ * 2C(sp) - sr -+ * 2E(sp) - pc -+ * 32(sp) - format & vector -+ * 36(sp) - MMUSR -+ * 3A(sp) - MMUAR -+ */ -+ -+/* -+ * 97/05/14 Andreas: Register %a2 is now set to the current task throughout -+ * the whole kernel. -+ */ -+ -+/* the following macro is used when enabling interrupts */ -+/* portable version */ -+#define ALLOWINT (~0x700) -+#define MAX_NOINT_IPL 0 -+ -+#ifdef __ASSEMBLY__ -+ -+#define curptr a2 -+ -+LFLUSH_I_AND_D = 0x00000808 -+LSIGTRAP = 5 -+ -+/* process bits for task_struct.ptrace */ -+PT_TRACESYS_OFF = 3 -+PT_TRACESYS_BIT = 1 -+PT_PTRACED_OFF = 3 -+PT_PTRACED_BIT = 0 -+PT_DTRACE_OFF = 3 -+PT_DTRACE_BIT = 2 -+ -+#define SAVE_ALL_INT save_all_int -+#define SAVE_ALL_SYS save_all_sys -+#define RESTORE_ALL restore_all -+/* -+ * This defines the normal kernel pt-regs layout. -+ * -+ * regs a3-a6 and d6-d7 are preserved by C code -+ * the kernel doesn't mess with usp unless it needs to -+ */ -+ -+/* -+ * a -1 in the orig_d0 field signifies -+ * that the stack frame is NOT for syscall -+ */ -+.macro save_all_int -+ movel MMUSR,%sp@- -+ movel MMUAR,%sp@- -+ clrl %sp@- | stk_adj -+ pea -1:w | orig d0 -+ movel %d0,%sp@- | d0 -+ subal #(8*4), %sp -+ moveml %d1-%d5/%a0-%a1/%curptr,%sp@ -+.endm -+ -+.macro save_all_sys -+ movel MMUSR,%sp@- -+ movel MMUAR,%sp@- -+ clrl %sp@- | stk_adj -+ movel %d0,%sp@- | orig d0 -+ movel %d0,%sp@- | d0 -+ subal #(8*4), %sp -+ moveml %d1-%d5/%a0-%a1/%curptr,%sp@ -+.endm -+ -+.macro restore_all -+ moveml %sp@,%a0-%a1/%curptr/%d1-%d5 -+ addal #(8*4), %sp -+ movel %sp@+,%d0 | d0 -+ addql #4,%sp | orig d0 -+ addl %sp@+,%sp | stk_adj -+ addql #8,%sp | MMUAR & MMUSR -+ rte -+.endm -+ -+#define SWITCH_STACK_SIZE (6*4+4) /* includes return address */ -+ -+#define SAVE_SWITCH_STACK save_switch_stack -+#define RESTORE_SWITCH_STACK restore_switch_stack -+#define GET_CURRENT(tmp) get_current tmp -+ -+.macro save_switch_stack -+ subal #(6*4), %sp -+ moveml %a3-%a6/%d6-%d7,%sp@ -+.endm -+ -+.macro restore_switch_stack -+ moveml %sp@,%a3-%a6/%d6-%d7 -+ addal #(6*4), %sp -+.endm -+ -+.macro get_current reg=%d0 -+ movel %sp,\reg -+ andl #-THREAD_SIZE,\reg -+ movel \reg,%curptr -+ movel %curptr@,%curptr -+.endm -+ -+#else /* C source */ -+ -+#define STR(X) STR1(X) -+#define STR1(X) #X -+ -+#define PT_OFF_ORIG_D0 0x24 -+#define PT_OFF_FORMATVEC 0x32 -+#define PT_OFF_SR 0x2C -+#define SAVE_ALL_INT \ -+ "clrl %%sp@-;" /* stk_adj */ \ -+ "pea -1:w;" /* orig d0 = -1 */ \ -+ "movel %%d0,%%sp@-;" /* d0 */ \ -+ "subal #(8*4),%sp" \ -+ "moveml %%d1-%%d5/%%a0-%%a2,%%sp@" -+#define GET_CURRENT(tmp) \ -+ "movel %%sp,"#tmp"\n\t" \ -+ "andw #-"STR(THREAD_SIZE)","#tmp"\n\t" \ -+ "movel "#tmp",%%a2\n\t" -+ -+#endif -+ -+#endif /* __CF_M68K_ENTRY_H */ ---- /dev/null -+++ b/include/asm-m68k/cfmmu.h -@@ -0,0 +1,104 @@ -+/* -+ * Definitions for Coldfire V4e MMU -+ */ -+#include <asm/movs.h> -+ -+#ifndef __CF_MMU_H__ -+#define __CF_MMU_H__ -+ -+ -+#define MMU_BASE 0xE1000000 -+ -+ -+#define MMUCR (MMU_BASE+0x00) -+#define MMUCR_ASMN 1 -+#define MMUCR_ASM (1<<MMUCR_ASMN) -+#define MMUCR_ENN 0 -+#define MMUCR_EN (1<<MMUCR_ENN) -+ -+#define MMUOR REG16(MMU_BASE+0x04+0x02) -+#define MMUOR_AAN 16 -+#define MMUOR_AA (0xffff<<MMUOR_AAN) -+#define MMUOR_STLBN 8 -+#define MMUOR_STLB (1<<MMUOR_STLBN) -+#define MMUOR_CAN 7 -+#define MMUOR_CA (1<<MMUOR_CAN) -+#define MMUOR_CNLN 6 -+#define MMUOR_CNL (1<<MMUOR_CNLN) -+#define MMUOR_CASN 5 -+#define MMUOR_CAS (1<<MMUOR_CASN) -+#define MMUOR_ITLBN 4 -+#define MMUOR_ITLB (1<<MMUOR_ITLBN) -+#define MMUOR_ADRN 3 -+#define MMUOR_ADR (1<<MMUOR_ADRN) -+#define MMUOR_RWN 2 -+#define MMUOR_RW (1<<MMUOR_RWN) -+#define MMUOR_ACCN 1 -+#define MMUOR_ACC (1<<MMUOR_ACCN) -+#define MMUOR_UAAN 0 -+#define MMUOR_UAA (1<<MMUOR_UAAN) -+ -+#define MMUSR REG32(MMU_BASE+0x08) -+#define MMUSR_SPFN 5 -+#define MMUSR_SPF (1<<MMUSR_SPFN) -+#define MMUSR_RFN 4 -+#define MMUSR_RF (1<<MMUSR_RFN) -+#define MMUSR_WFN 3 -+#define MMUSR_WF (1<<MMUSR_WFN) -+#define MMUSR_HITN 1 -+#define MMUSR_HIT (1<<MMUSR_HITN) -+ -+#define MMUAR REG32(MMU_BASE+0x10) -+#define MMUAR_VPN 1 -+#define MMUAR_VP (0xfffffffe) -+#define MMUAR_SN 0 -+#define MMUAR_S (1<<MMUAR_SN) -+ -+#define MMUTR REG32(MMU_BASE+0x14) -+#define MMUTR_VAN 10 -+#define MMUTR_VA (0xfffffc00) -+#define MMUTR_IDN 2 -+#define MMUTR_ID (0xff<<MMUTR_IDN) -+#define MMUTR_SGN 1 -+#define MMUTR_SG (1<<MMUTR_SGN) -+#define MMUTR_VN 0 -+#define MMUTR_V (1<<MMUTR_VN) -+ -+#define MMUDR REG32(MMU_BASE+0x18) -+#define MMUDR_PAN 10 -+#define MMUDR_PA (0xfffffc00) -+#define MMUDR_SZN 8 -+#define MMUDR_SZ_MASK (0x2<<MMUDR_SZN) -+#define MMUDR_SZ1M (0<<MMUDR_SZN) -+#define MMUDR_SZ4K (1<<MMUDR_SZN) -+#define MMUDR_SZ8K (2<<MMUDR_SZN) -+#define MMUDR_SZ16M (3<<MMUDR_SZN) -+#define MMUDR_CMN 6 -+#define MMUDR_INC (2<<MMUDR_CMN) -+#define MMUDR_IC (0<<MMUDR_CMN) -+#define MMUDR_DWT (0<<MMUDR_CMN) -+#define MMUDR_DCB (1<<MMUDR_CMN) -+#define MMUDR_DNCP (2<<MMUDR_CMN) -+#define MMUDR_DNCIP (3<<MMUDR_CMN) -+#define MMUDR_SPN 5 -+#define MMUDR_SP (1<<MMUDR_SPN) -+#define MMUDR_RN 4 -+#define MMUDR_R (1<<MMUDR_RN) -+#define MMUDR_WN 3 -+#define MMUDR_W (1<<MMUDR_WN) -+#define MMUDR_XN 2 -+#define MMUDR_X (1<<MMUDR_XN) -+#define MMUDR_LKN 1 -+#define MMUDR_LK (1<<MMUDR_LKN) -+ -+ -+#ifndef __ASSEMBLY__ -+#define CF_PMEGS_NUM 256 -+#define CF_INVALID_CONTEXT 255 -+#define CF_PAGE_PGNUM_MASK (PAGE_MASK) -+ -+extern int cf_tlb_miss(struct pt_regs *regs, int write, int dtlb, -+ int extension_word); -+#endif /* __ASSEMBLY__*/ -+ -+#endif /* !__CF_MMU_H__ */ ---- /dev/null -+++ b/include/asm-m68k/cf_pgalloc.h -@@ -0,0 +1,103 @@ -+#ifndef M68K_CF_PGALLOC_H -+#define M68K_CF_PGALLOC_H -+ -+#include <asm/coldfire.h> -+#include <asm/page.h> -+#include <asm/cf_tlbflush.h> -+#include <asm/cf_cacheflush.h> -+ -+extern inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte) -+{ -+ free_page((unsigned long) pte); -+} -+ -+extern const char bad_pmd_string[]; -+ -+extern inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm, -+ unsigned long address) -+{ -+ unsigned long page = __get_free_page(GFP_DMA|__GFP_REPEAT); -+ -+ if (!page) -+ return NULL; -+ -+ memset((void *)page, 0, PAGE_SIZE); -+ return (pte_t *) (page); -+} -+ -+extern inline pmd_t *pmd_alloc_kernel(pgd_t *pgd, unsigned long address) -+{ -+ return (pmd_t *) pgd; -+} -+ -+#define pmd_alloc_one_fast(mm, address) ({ BUG(); ((pmd_t *)1); }) -+#define pmd_alloc_one(mm, address) ({ BUG(); ((pmd_t *)2); }) -+ -+#define pte_alloc_one_fast(mm, addr) pte_alloc_one(mm, addr) -+ -+#define pmd_populate(mm, pmd, page) (pmd_val(*pmd) = \ -+ (unsigned long)(page_address(page))) -+ -+#define pmd_populate_kernel(mm, pmd, pte) (pmd_val(*pmd) = (unsigned long)(pte)) -+ -+#define pmd_pgtable(pmd) pmd_page(pmd) -+ -+static inline void __pte_free_tlb(struct mmu_gather *tlb, struct page *page) -+{ -+ __free_page(page); -+} -+ -+#define __pmd_free_tlb(tlb, pmd) do { } while (0) -+ -+static inline struct page *pte_alloc_one(struct mm_struct *mm, -+ unsigned long address) -+{ -+ struct page *page = alloc_pages(GFP_DMA|__GFP_REPEAT, 0); -+ pte_t *pte; -+ -+ if (!page) -+ return NULL; -+ -+ pte = kmap(page); -+ if (pte) { -+ clear_page(pte); -+ __flush_page_to_ram(pte); -+ flush_tlb_kernel_page(pte); -+ nocache_page(pte); -+ } -+ kunmap(pte); -+ -+ return page; -+} -+ -+extern inline void pte_free(struct mm_struct *mm, struct page *page) -+{ -+ __free_page(page); -+} -+ -+/* -+ * In our implementation, each pgd entry contains 1 pmd that is never allocated -+ * or freed. pgd_present is always 1, so this should never be called. -NL -+ */ -+#define pmd_free(mm, pmd) BUG() -+ -+extern inline void pgd_free(struct mm_struct *mm, pgd_t *pgd) -+{ -+ free_page((unsigned long) pgd); -+} -+ -+extern inline pgd_t *pgd_alloc(struct mm_struct *mm) -+{ -+ pgd_t *new_pgd; -+ -+ new_pgd = (pgd_t *)__get_free_page(GFP_DMA | __GFP_NOWARN); -+ if (!new_pgd) -+ return NULL; -+ memcpy(new_pgd, swapper_pg_dir, PAGE_SIZE); -+ memset(new_pgd, 0, PAGE_OFFSET >> PGDIR_SHIFT); -+ return new_pgd; -+} -+ -+#define pgd_populate(mm, pmd, pte) BUG() -+ -+#endif /* M68K_CF_PGALLOC_H */ ---- /dev/null -+++ b/include/asm-m68k/cf_pgtable.h -@@ -0,0 +1,357 @@ -+#ifndef _CF_PGTABLE_H -+#define _CF_PGTABLE_H -+ -+#include <asm/cfmmu.h> -+#include <asm/page.h> -+ -+#ifndef __ASSEMBLY__ -+#include <asm/virtconvert.h> -+#include <linux/linkage.h> -+ -+/* For virtual address to physical address conversion */ -+#define VTOP(addr) __pa(addr) -+#define PTOV(addr) __va(addr) -+ -+ -+#endif /* !__ASSEMBLY__ */ -+ -+/* Page protection values within PTE. */ -+ -+/* MMUDR bits, in proper place. */ -+#define CF_PAGE_LOCKED (0x00000002) -+#define CF_PAGE_EXEC (0x00000004) -+#define CF_PAGE_WRITABLE (0x00000008) -+#define CF_PAGE_READABLE (0x00000010) -+#define CF_PAGE_SYSTEM (0x00000020) -+#define CF_PAGE_COPYBACK (0x00000040) -+#define CF_PAGE_NOCACHE (0x00000080) -+ -+#define CF_CACHEMASK (~0x00000040) -+#define CF_PAGE_MMUDR_MASK (0x000000fe) -+ -+#define _PAGE_NOCACHE030 (CF_PAGE_NOCACHE) -+ -+/* MMUTR bits, need shifting down. */ -+#define CF_PAGE_VALID (0x00000400) -+#define CF_PAGE_SHARED (0x00000800) -+ -+#define CF_PAGE_MMUTR_MASK (0x00000c00) -+#define CF_PAGE_MMUTR_SHIFT (10) -+#define CF_ASID_MMU_SHIFT (2) -+ -+/* Fake bits, not implemented in CF, will get masked out before -+ hitting hardware, and might go away altogether once this port is -+ complete. */ -+#if PAGE_SHIFT < 13 -+#error COLDFIRE Error: Pages must be at least 8k in size -+#endif -+#define CF_PAGE_ACCESSED (0x00001000) -+#define CF_PAGE_FILE (0x00000200) -+#define CF_PAGE_DIRTY (0x00000001) -+ -+#define _PAGE_CACHE040 0x020 /* 68040 cache mode, cachable, copyback */ -+#define _PAGE_NOCACHE_S 0x040 /* 68040 no-cache mode, serialized */ -+#define _PAGE_NOCACHE 0x060 /* 68040 cache mode, non-serialized */ -+#define _PAGE_CACHE040W 0x000 /* 68040 cache mode, cachable, write-through */ -+#define _DESCTYPE_MASK 0x003 -+#define _CACHEMASK040 (~0x060) -+#define _PAGE_GLOBAL040 0x400 /* 68040 global bit, used for kva descs */ -+ -+ -+/* Externally used page protection values. */ -+#define _PAGE_PRESENT (CF_PAGE_VALID) -+#define _PAGE_ACCESSED (CF_PAGE_ACCESSED) -+#define _PAGE_DIRTY (CF_PAGE_DIRTY) -+#define _PAGE_READWRITE (CF_PAGE_WRITABLE \ -+ | CF_PAGE_READABLE \ -+ | CF_PAGE_SYSTEM \ -+ | CF_PAGE_SHARED) -+ -+/* Compound page protection values. */ -+#define PAGE_NONE __pgprot(CF_PAGE_VALID \ -+ | CF_PAGE_ACCESSED) -+ -+#define PAGE_SHARED __pgprot(CF_PAGE_VALID \ -+ | CF_PAGE_ACCESSED \ -+ | CF_PAGE_SHARED) -+ -+#define PAGE_INIT __pgprot(CF_PAGE_VALID \ -+ | CF_PAGE_WRITABLE \ -+ | CF_PAGE_READABLE \ -+ | CF_PAGE_EXEC \ -+ | CF_PAGE_SYSTEM \ -+ | CF_PAGE_SHARED) -+ -+#define PAGE_KERNEL __pgprot(CF_PAGE_VALID \ -+ | CF_PAGE_WRITABLE \ -+ | CF_PAGE_READABLE \ -+ | CF_PAGE_EXEC \ -+ | CF_PAGE_SYSTEM \ -+ | CF_PAGE_SHARED \ -+ | CF_PAGE_ACCESSED) -+ -+#define PAGE_COPY __pgprot(CF_PAGE_VALID \ -+ | CF_PAGE_ACCESSED \ -+ | CF_PAGE_READABLE \ -+ | CF_PAGE_DIRTY) -+/* -+ * Page protections for initialising protection_map. See mm/mmap.c -+ * for use. In general, the bit positions are xwr, and P-items are -+ * private, the S-items are shared. -+ */ -+ -+#define __P000 PAGE_NONE -+#define __P100 __pgprot(CF_PAGE_VALID \ -+ | CF_PAGE_ACCESSED \ -+ | CF_PAGE_EXEC) -+#define __P010 __pgprot(CF_PAGE_VALID \ -+ | CF_PAGE_WRITABLE \ -+ | CF_PAGE_ACCESSED) -+#define __P110 __pgprot(CF_PAGE_VALID \ -+ | CF_PAGE_ACCESSED \ -+ | CF_PAGE_WRITABLE \ -+ | CF_PAGE_EXEC) -+#define __P001 __pgprot(CF_PAGE_VALID \ -+ | CF_PAGE_ACCESSED \ -+ | CF_PAGE_READABLE) -+#define __P101 __pgprot(CF_PAGE_VALID \ -+ | CF_PAGE_ACCESSED \ -+ | CF_PAGE_READABLE \ -+ | CF_PAGE_EXEC) -+#define __P011 __pgprot(CF_PAGE_VALID \ -+ | CF_PAGE_READABLE \ -+ | CF_PAGE_WRITABLE \ -+ | CF_PAGE_ACCESSED) -+#define __P111 __pgprot(CF_PAGE_VALID \ -+ | CF_PAGE_ACCESSED \ -+ | CF_PAGE_WRITABLE \ -+ | CF_PAGE_READABLE \ -+ | CF_PAGE_EXEC) -+ -+#define __S000 PAGE_NONE -+#define __S100 __pgprot(CF_PAGE_VALID \ -+ | CF_PAGE_ACCESSED \ -+ | CF_PAGE_SHARED \ -+ | CF_PAGE_EXEC) -+#define __S010 PAGE_SHARED -+#define __S110 __pgprot(CF_PAGE_VALID \ -+ | CF_PAGE_ACCESSED \ -+ | CF_PAGE_SHARED \ -+ | CF_PAGE_EXEC) -+#define __S001 __pgprot(CF_PAGE_VALID \ -+ | CF_PAGE_ACCESSED \ -+ | CF_PAGE_SHARED \ -+ | CF_PAGE_READABLE) -+#define __S101 __pgprot(CF_PAGE_VALID \ -+ | CF_PAGE_ACCESSED \ -+ | CF_PAGE_SHARED \ -+ | CF_PAGE_READABLE \ -+ | CF_PAGE_EXEC) -+#define __S011 __pgprot(CF_PAGE_VALID \ -+ | CF_PAGE_ACCESSED \ -+ | CF_PAGE_SHARED \ -+ | CF_PAGE_READABLE) -+#define __S111 __pgprot(CF_PAGE_VALID \ -+ | CF_PAGE_ACCESSED \ -+ | CF_PAGE_SHARED \ -+ | CF_PAGE_READABLE \ -+ | CF_PAGE_EXEC) -+ -+#define PTE_MASK PAGE_MASK -+#define CF_PAGE_CHG_MASK (PTE_MASK | CF_PAGE_ACCESSED | CF_PAGE_DIRTY) -+ -+#ifndef __ASSEMBLY__ -+ -+/* -+ * Conversion functions: convert a page and protection to a page entry, -+ * and a page entry and page directory to the page they refer to. -+ */ -+#define mk_pte(page, pgprot) pfn_pte(page_to_pfn(page), (pgprot)) -+ -+extern inline pte_t pte_modify(pte_t pte, pgprot_t newprot) -+{ -+ pte_val(pte) = (pte_val(pte) & CF_PAGE_CHG_MASK) | pgprot_val(newprot); -+ return pte; -+} -+ -+#define pmd_set(pmdp, ptep) do {} while (0) -+ -+extern inline void pgd_set(pgd_t *pgdp, pmd_t *pmdp) -+{ -+ pgd_val(*pgdp) = virt_to_phys(pmdp); -+} -+ -+#define __pte_page(pte) \ -+ ((unsigned long) ((pte_val(pte) & CF_PAGE_PGNUM_MASK) + PAGE_OFFSET)) -+#define __pmd_page(pmd) ((unsigned long) (pmd_val(pmd))) -+ -+extern inline int pte_none(pte_t pte) -+{ -+ return !pte_val(pte); -+} -+extern inline int pte_present(pte_t pte) -+{ -+ return pte_val(pte) & CF_PAGE_VALID; -+} -+extern inline void pte_clear(struct mm_struct *mm, unsigned long addr, -+ pte_t *ptep) -+{ -+ pte_val(*ptep) = 0; -+} -+ -+#define pte_pagenr(pte) ((__pte_page(pte) - PAGE_OFFSET) >> PAGE_SHIFT) -+#define pte_page(pte) virt_to_page(__pte_page(pte)) -+ -+extern inline int pmd_none2(pmd_t *pmd) { return !pmd_val(*pmd); } -+#define pmd_none(pmd) pmd_none2(&(pmd)) -+extern inline int pmd_bad2(pmd_t *pmd) { return 0; } -+#define pmd_bad(pmd) pmd_bad2(&(pmd)) -+#define pmd_present(pmd) (!pmd_none2(&(pmd))) -+extern inline void pmd_clear(pmd_t *pmdp) { pmd_val(*pmdp) = 0; } -+ -+extern inline int pgd_none(pgd_t pgd) { return 0; } -+extern inline int pgd_bad(pgd_t pgd) { return 0; } -+extern inline int pgd_present(pgd_t pgd) { return 1; } -+extern inline void pgd_clear(pgd_t *pgdp) {} -+ -+ -+#define pte_ERROR(e) \ -+ printk(KERN_ERR "%s:%d: bad pte %08lx.\n", \ -+ __FILE__, __LINE__, pte_val(e)) -+#define pmd_ERROR(e) \ -+ printk(KERN_ERR "%s:%d: bad pmd %08lx.\n", \ -+ __FILE__, __LINE__, pmd_val(e)) -+#define pgd_ERROR(e) \ -+ printk(KERN_ERR "%s:%d: bad pgd %08lx.\n", \ -+ __FILE__, __LINE__, pgd_val(e)) -+ -+ -+/* -+ * The following only work if pte_present() is true. -+ * Undefined behaviour if not... -+ * [we have the full set here even if they don't change from m68k] -+ */ -+extern inline int pte_read(pte_t pte) \ -+ { return pte_val(pte) & CF_PAGE_READABLE; } -+extern inline int pte_write(pte_t pte) \ -+ { return pte_val(pte) & CF_PAGE_WRITABLE; } -+extern inline int pte_exec(pte_t pte) \ -+ { return pte_val(pte) & CF_PAGE_EXEC; } -+extern inline int pte_dirty(pte_t pte) \ -+ { return pte_val(pte) & CF_PAGE_DIRTY; } -+extern inline int pte_young(pte_t pte) \ -+ { return pte_val(pte) & CF_PAGE_ACCESSED; } -+extern inline int pte_file(pte_t pte) \ -+ { return pte_val(pte) & CF_PAGE_FILE; } -+ -+extern inline pte_t pte_wrprotect(pte_t pte) \ -+ { pte_val(pte) &= ~CF_PAGE_WRITABLE; return pte; } -+extern inline pte_t pte_rdprotect(pte_t pte) \ -+ { pte_val(pte) &= ~CF_PAGE_READABLE; return pte; } -+extern inline pte_t pte_exprotect(pte_t pte) \ -+ { pte_val(pte) &= ~CF_PAGE_EXEC; return pte; } -+extern inline pte_t pte_mkclean(pte_t pte) \ -+ { pte_val(pte) &= ~CF_PAGE_DIRTY; return pte; } -+extern inline pte_t pte_mkold(pte_t pte) \ -+ { pte_val(pte) &= ~CF_PAGE_ACCESSED; return pte; } -+extern inline pte_t pte_mkwrite(pte_t pte) \ -+ { pte_val(pte) |= CF_PAGE_WRITABLE; return pte; } -+extern inline pte_t pte_mkread(pte_t pte) \ -+ { pte_val(pte) |= CF_PAGE_READABLE; return pte; } -+extern inline pte_t pte_mkexec(pte_t pte) \ -+ { pte_val(pte) |= CF_PAGE_EXEC; return pte; } -+extern inline pte_t pte_mkdirty(pte_t pte) \ -+ { pte_val(pte) |= CF_PAGE_DIRTY; return pte; } -+extern inline pte_t pte_mkyoung(pte_t pte) \ -+ { pte_val(pte) |= CF_PAGE_ACCESSED; return pte; } -+extern inline pte_t pte_mknocache(pte_t pte) \ -+ { pte_val(pte) |= 0x80 | (pte_val(pte) & ~0x40); return pte; } -+extern inline pte_t pte_mkcache(pte_t pte) \ -+ { pte_val(pte) &= ~CF_PAGE_NOCACHE; return pte; } -+ -+#define swapper_pg_dir kernel_pg_dir -+extern pgd_t kernel_pg_dir[PTRS_PER_PGD]; -+ -+/* Find an entry in a pagetable directory. */ -+#define pgd_index(address) ((address) >> PGDIR_SHIFT) -+ -+#define pgd_offset(mm, address) ((mm)->pgd + pgd_index(address)) -+ -+/* Find an entry in a kernel pagetable directory. */ -+#define pgd_offset_k(address) pgd_offset(&init_mm, address) -+ -+/* Find an entry in the second-level pagetable. */ -+extern inline pmd_t *pmd_offset(pgd_t *pgd, unsigned long address) -+{ -+ return (pmd_t *) pgd; -+} -+ -+/* Find an entry in the third-level pagetable. */ -+#define __pte_offset(address) ((address >> PAGE_SHIFT) & (PTRS_PER_PTE - 1)) -+#define pte_offset_kernel(dir, address) ((pte_t *) __pmd_page(*(dir)) + \ -+ __pte_offset(address)) -+ -+/* Disable caching for page at given kernel virtual address. */ -+static inline void nocache_page(void *vaddr) -+{ -+ pgd_t *dir; -+ pmd_t *pmdp; -+ pte_t *ptep; -+ unsigned long addr = (unsigned long)vaddr; -+ -+ dir = pgd_offset_k(addr); -+ pmdp = pmd_offset(dir, addr); -+ ptep = pte_offset_kernel(pmdp, addr); -+ *ptep = pte_mknocache(*ptep); -+} -+ -+/* Enable caching for page at given kernel virtual address. */ -+static inline void cache_page(void *vaddr) -+{ -+ pgd_t *dir; -+ pmd_t *pmdp; -+ pte_t *ptep; -+ unsigned long addr = (unsigned long)vaddr; -+ -+ dir = pgd_offset_k(addr); -+ pmdp = pmd_offset(dir, addr); -+ ptep = pte_offset_kernel(pmdp, addr); -+ *ptep = pte_mkcache(*ptep); -+} -+ -+#define PTE_FILE_MAX_BITS 21 -+#define PTE_FILE_SHIFT 11 -+ -+static inline unsigned long pte_to_pgoff(pte_t pte) -+{ -+ return pte_val(pte) >> PTE_FILE_SHIFT; -+} -+ -+static inline pte_t pgoff_to_pte(unsigned pgoff) -+{ -+ pte_t pte = __pte((pgoff << PTE_FILE_SHIFT) + CF_PAGE_FILE); -+ return pte; -+} -+ -+/* Encode and de-code a swap entry (must be !pte_none(e) && !pte_present(e)) */ -+#define __swp_entry(type, offset) ((swp_entry_t) { (type) | \ -+ (offset << PTE_FILE_SHIFT) }) -+#define __swp_type(x) ((x).val & 0xFF) -+#define __swp_offset(x) ((x).val >> PTE_FILE_SHIFT) -+#define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) }) -+#define __swp_entry_to_pte(x) (__pte((x).val)) -+ -+#define pmd_page(pmd) (pfn_to_page(pmd_val(pmd) >> PAGE_SHIFT)) -+ -+#define pte_offset_map(pmdp, address) ((pte_t *)__pmd_page(*pmdp) + \ -+ __pte_offset(address)) -+#define pte_offset_map_nested(pmdp, address) pte_offset_map(pmdp, address) -+#define pte_unmap(pte) kunmap(pte) -+#define pte_unmap_nested(pte) kunmap(pte) -+ -+#define pfn_pte(pfn, prot) __pte(((pfn) << PAGE_SHIFT) | pgprot_val(prot)) -+#define pte_pfn(pte) (pte_val(pte) >> PAGE_SHIFT) -+ -+ -+#endif /* !__ASSEMBLY__ */ -+#endif /* !_CF_PGTABLE_H */ ---- /dev/null -+++ b/include/asm-m68k/cf_tlbflush.h -@@ -0,0 +1,59 @@ -+#ifndef M68K_CF_TLBFLUSH_H -+#define M68K_CF_TLBFLUSH_H -+ -+#include <asm/coldfire.h> -+ -+/* Flush all userspace mappings. */ -+static inline void flush_tlb_all(void) -+{ -+ preempt_disable(); -+ *MMUOR = MMUOR_CNL; -+ preempt_enable(); -+} -+ -+/* Clear user TLB entries within the context named in mm */ -+static inline void flush_tlb_mm(struct mm_struct *mm) -+{ -+ preempt_disable(); -+ *MMUOR = MMUOR_CNL; -+ preempt_enable(); -+} -+ -+/* Flush a single TLB page. */ -+static inline void flush_tlb_page(struct vm_area_struct *vma, -+ unsigned long addr) -+{ -+ preempt_disable(); -+ *MMUOR = MMUOR_CNL; -+ preempt_enable(); -+} -+/* Flush a range of pages from TLB. */ -+ -+static inline void flush_tlb_range(struct mm_struct *mm, -+ unsigned long start, unsigned long end) -+{ -+ preempt_disable(); -+ *MMUOR = MMUOR_CNL; -+ preempt_enable(); -+} -+ -+/* Flush kernel page from TLB. */ -+static inline void flush_tlb_kernel_page(void *addr) -+{ -+ preempt_disable(); -+ *MMUOR = MMUOR_CNL; -+ preempt_enable(); -+} -+ -+static inline void flush_tlb_kernel_range(unsigned long start, -+ unsigned long end) -+{ -+ flush_tlb_all(); -+} -+ -+extern inline void flush_tlb_pgtables(struct mm_struct *mm, -+ unsigned long start, unsigned long end) -+{ -+} -+ -+#endif /* M68K_CF_TLBFLUSH_H */ ---- /dev/null -+++ b/include/asm-m68k/cf_uaccess.h -@@ -0,0 +1,376 @@ -+#ifndef __M68K_CF_UACCESS_H -+#define __M68K_CF_UACCESS_H -+ -+/* -+ * User space memory access functions -+ */ -+ -+/* The "moves" command is not available in the CF instruction set. */ -+#include <linux/compiler.h> -+#include <linux/errno.h> -+#include <linux/types.h> -+#include <linux/sched.h> -+#include <asm/segment.h> -+ -+#define VERIFY_READ 0 -+#define VERIFY_WRITE 1 -+ -+/* We let the MMU do all checking */ -+#define access_ok(type, addr, size) 1 -+ -+/* -+ * The exception table consists of pairs of addresses: the first is the -+ * address of an instruction that is allowed to fault, and the second is -+ * the address at which the program should continue. No registers are -+ * modified, so it is entirely up to the continuation code to figure out -+ * what to do. -+ * -+ * All the routines below use bits of fixup code that are out of line -+ * with the main instruction path. This means when everything is well, -+ * we don't even have to jump over them. Further, they do not intrude -+ * on our cache or tlb entries. -+ */ -+ -+struct exception_table_entry -+{ -+ unsigned long insn, fixup; -+}; -+ -+extern int __put_user_bad(void); -+extern int __get_user_bad(void); -+ -+#define __put_user_asm(res, x, ptr, bwl, reg, err) \ -+asm volatile ("\n" \ -+ "1: move."#bwl" %2,%1\n" \ -+ "2:\n" \ -+ " .section .fixup,\"ax\"\n" \ -+ " .even\n" \ -+ "10: moveq.l %3,%0\n" \ -+ " jra 2b\n" \ -+ " .previous\n" \ -+ "\n" \ -+ " .section __ex_table,\"a\"\n" \ -+ " .align 4\n" \ -+ " .long 1b,10b\n" \ -+ " .long 2b,10b\n" \ -+ " .previous" \ -+ : "+d" (res), "=m" (*(ptr)) \ -+ : #reg (x), "i" (err)) -+ -+/* -+ * These are the main single-value transfer routines. They automatically -+ * use the right size if we just have the right pointer type. -+ */ -+ -+#define __put_user(x, ptr) \ -+({ \ -+ typeof(*(ptr)) __pu_val = (x); \ -+ int __pu_err = 0; \ -+ __chk_user_ptr(ptr); \ -+ switch (sizeof (*(ptr))) { \ -+ case 1: \ -+ __put_user_asm(__pu_err, __pu_val, ptr, b, d, -EFAULT); \ -+ break; \ -+ case 2: \ -+ __put_user_asm(__pu_err, __pu_val, ptr, w, d, -EFAULT); \ -+ break; \ -+ case 4: \ -+ __put_user_asm(__pu_err, __pu_val, ptr, l, r, -EFAULT); \ -+ break; \ -+ case 8: \ -+ { \ -+ const void __user *__pu_ptr = (ptr); \ -+ asm volatile ("\n" \ -+ "1: move.l %2,(%1)+\n" \ -+ "2: move.l %R2,(%1)\n" \ -+ "3:\n" \ -+ " .section .fixup,\"ax\"\n" \ -+ " .even\n" \ -+ "10: movel %3,%0\n" \ -+ " jra 3b\n" \ -+ " .previous\n" \ -+ "\n" \ -+ " .section __ex_table,\"a\"\n" \ -+ " .align 4\n" \ -+ " .long 1b,10b\n" \ -+ " .long 2b,10b\n" \ -+ " .long 3b,10b\n" \ -+ " .previous" \ -+ : "+d" (__pu_err), "+a" (__pu_ptr) \ -+ : "r" (__pu_val), "i" (-EFAULT) \ -+ : "memory"); \ -+ break; \ -+ } \ -+ default: \ -+ __pu_err = __put_user_bad(); \ -+ break; \ -+ } \ -+ __pu_err; \ -+}) -+#define put_user(x, ptr) __put_user(x, ptr) -+ -+ -+#define __get_user_asm(res, x, ptr, type, bwl, reg, err) ({ \ -+ type __gu_val; \ -+ asm volatile ("\n" \ -+ "1: move."#bwl" %2,%1\n" \ -+ "2:\n" \ -+ " .section .fixup,\"ax\"\n" \ -+ " .even\n" \ -+ "10: move.l %3,%0\n" \ -+ " subl %1,%1\n" \ -+ " jra 2b\n" \ -+ " .previous\n" \ -+ "\n" \ -+ " .section __ex_table,\"a\"\n" \ -+ " .align 4\n" \ -+ " .long 1b,10b\n" \ -+ " .previous" \ -+ : "+d" (res), "=&" #reg (__gu_val) \ -+ : "m" (*(ptr)), "i" (err)); \ -+ (x) = (typeof(*(ptr)))(unsigned long)__gu_val; \ -+}) -+ -+#define __get_user(x, ptr) \ -+({ \ -+ int __gu_err = 0; \ -+ __chk_user_ptr(ptr); \ -+ switch (sizeof(*(ptr))) { \ -+ case 1: \ -+ __get_user_asm(__gu_err, x, ptr, u8, b, d, -EFAULT); \ -+ break; \ -+ case 2: \ -+ __get_user_asm(__gu_err, x, ptr, u16, w, d, -EFAULT); \ -+ break; \ -+ case 4: \ -+ __get_user_asm(__gu_err, x, ptr, u32, l, r, -EFAULT); \ -+ break; \ -+/* case 8: disabled because gcc-4.1 has a broken typeof \ -+ { \ -+ const void *__gu_ptr = (ptr); \ -+ u64 __gu_val; \ -+ asm volatile ("\n" \ -+ "1: move.l (%2)+,%1\n" \ -+ "2: move.l (%2),%R1\n" \ -+ "3:\n" \ -+ " .section .fixup,\"ax\"\n" \ -+ " .even\n" \ -+ "10: move.l %3,%0\n" \ -+ " subl %1,%1\n" \ -+ " subl %R1,%R1\n" \ -+ " jra 3b\n" \ -+ " .previous\n" \ -+ "\n" \ -+ " .section __ex_table,\"a\"\n" \ -+ " .align 4\n" \ -+ " .long 1b,10b\n" \ -+ " .long 2b,10b\n" \ -+ " .previous" \ -+ : "+d" (__gu_err), "=&r" (__gu_val), \ -+ "+a" (__gu_ptr) \ -+ : "i" (-EFAULT) \ -+ : "memory"); \ -+ (x) = (typeof(*(ptr)))__gu_val; \ -+ break; \ -+ } */ \ -+ default: \ -+ __gu_err = __get_user_bad(); \ -+ break; \ -+ } \ -+ __gu_err; \ -+}) -+#define get_user(x, ptr) __get_user(x, ptr) -+ -+unsigned long __generic_copy_from_user(void *to, const void __user *from, -+ unsigned long n); -+unsigned long __generic_copy_to_user(void __user *to, const void *from, -+ unsigned long n); -+ -+#define __constant_copy_from_user_asm(res, to, from, tmp, n, s1, s2, s3)\ -+ asm volatile ("\n" \ -+ "1: move."#s1" (%2)+,%3\n" \ -+ " move."#s1" %3,(%1)+\n" \ -+ "2: move."#s2" (%2)+,%3\n" \ -+ " move."#s2" %3,(%1)+\n" \ -+ " .ifnc \""#s3"\",\"\"\n" \ -+ "3: move."#s3" (%2)+,%3\n" \ -+ " move."#s3" %3,(%1)+\n" \ -+ " .endif\n" \ -+ "4:\n" \ -+ " .section __ex_table,\"a\"\n" \ -+ " .align 4\n" \ -+ " .long 1b,10f\n" \ -+ " .long 2b,20f\n" \ -+ " .ifnc \""#s3"\",\"\"\n" \ -+ " .long 3b,30f\n" \ -+ " .endif\n" \ -+ " .previous\n" \ -+ "\n" \ -+ " .section .fixup,\"ax\"\n" \ -+ " .even\n" \ -+ "10: clr."#s1" (%1)+\n" \ -+ "20: clr."#s2" (%1)+\n" \ -+ " .ifnc \""#s3"\",\"\"\n" \ -+ "30: clr."#s3" (%1)+\n" \ -+ " .endif\n" \ -+ " moveq.l #"#n",%0\n" \ -+ " jra 4b\n" \ -+ " .previous\n" \ -+ : "+d" (res), "+&a" (to), "+a" (from), "=&d" (tmp) \ -+ : : "memory") -+ -+static __always_inline unsigned long -+__constant_copy_from_user(void *to, const void __user *from, unsigned long n) -+{ -+ unsigned long res = 0, tmp; -+ -+ switch (n) { -+ case 1: -+ __get_user_asm(res, *(u8 *)to, (u8 __user *)from, u8, b, d, 1); -+ break; -+ case 2: -+ __get_user_asm(res, *(u16 *)to, (u16 __user *)from, u16, w, -+ d, 2); -+ break; -+ case 3: -+ __constant_copy_from_user_asm(res, to, from, tmp, 3, w, b,); -+ break; -+ case 4: -+ __get_user_asm(res, *(u32 *)to, (u32 __user *)from, u32, l, -+ r, 4); -+ break; -+ case 5: -+ __constant_copy_from_user_asm(res, to, from, tmp, 5, l, b,); -+ break; -+ case 6: -+ __constant_copy_from_user_asm(res, to, from, tmp, 6, l, w,); -+ break; -+ case 7: -+ __constant_copy_from_user_asm(res, to, from, tmp, 7, l, w, b); -+ break; -+ case 8: -+ __constant_copy_from_user_asm(res, to, from, tmp, 8, l, l,); -+ break; -+ case 9: -+ __constant_copy_from_user_asm(res, to, from, tmp, 9, l, l, b); -+ break; -+ case 10: -+ __constant_copy_from_user_asm(res, to, from, tmp, 10, l, l, w); -+ break; -+ case 12: -+ __constant_copy_from_user_asm(res, to, from, tmp, 12, l, l, l); -+ break; -+ default: -+ /* we limit the inlined version to 3 moves */ -+ return __generic_copy_from_user(to, from, n); -+ } -+ -+ return res; -+} -+ -+#define __constant_copy_to_user_asm(res, to, from, tmp, n, s1, s2, s3) \ -+ asm volatile ("\n" \ -+ " move."#s1" (%2)+,%3\n" \ -+ "11: move."#s1" %3,(%1)+\n" \ -+ "12: move."#s2" (%2)+,%3\n" \ -+ "21: move."#s2" %3,(%1)+\n" \ -+ "22:\n" \ -+ " .ifnc \""#s3"\",\"\"\n" \ -+ " move."#s3" (%2)+,%3\n" \ -+ "31: move."#s3" %3,(%1)+\n" \ -+ "32:\n" \ -+ " .endif\n" \ -+ "4:\n" \ -+ "\n" \ -+ " .section __ex_table,\"a\"\n" \ -+ " .align 4\n" \ -+ " .long 11b,5f\n" \ -+ " .long 12b,5f\n" \ -+ " .long 21b,5f\n" \ -+ " .long 22b,5f\n" \ -+ " .ifnc \""#s3"\",\"\"\n" \ -+ " .long 31b,5f\n" \ -+ " .long 32b,5f\n" \ -+ " .endif\n" \ -+ " .previous\n" \ -+ "\n" \ -+ " .section .fixup,\"ax\"\n" \ -+ " .even\n" \ -+ "5: moveq.l #"#n",%0\n" \ -+ " jra 4b\n" \ -+ " .previous\n" \ -+ : "+d" (res), "+a" (to), "+a" (from), "=&d" (tmp) \ -+ : : "memory") -+ -+static __always_inline unsigned long -+__constant_copy_to_user(void __user *to, const void *from, unsigned long n) -+{ -+ unsigned long res = 0, tmp; -+ -+ switch (n) { -+ case 1: -+ __put_user_asm(res, *(u8 *)from, (u8 __user *)to, b, d, 1); -+ break; -+ case 2: -+ __put_user_asm(res, *(u16 *)from, (u16 __user *)to, w, d, 2); -+ break; -+ case 3: -+ __constant_copy_to_user_asm(res, to, from, tmp, 3, w, b,); -+ break; -+ case 4: -+ __put_user_asm(res, *(u32 *)from, (u32 __user *)to, l, r, 4); -+ break; -+ case 5: -+ __constant_copy_to_user_asm(res, to, from, tmp, 5, l, b,); -+ break; -+ case 6: -+ __constant_copy_to_user_asm(res, to, from, tmp, 6, l, w,); -+ break; -+ case 7: -+ __constant_copy_to_user_asm(res, to, from, tmp, 7, l, w, b); -+ break; -+ case 8: -+ __constant_copy_to_user_asm(res, to, from, tmp, 8, l, l,); -+ break; -+ case 9: -+ __constant_copy_to_user_asm(res, to, from, tmp, 9, l, l, b); -+ break; -+ case 10: -+ __constant_copy_to_user_asm(res, to, from, tmp, 10, l, l, w); -+ break; -+ case 12: -+ __constant_copy_to_user_asm(res, to, from, tmp, 12, l, l, l); -+ break; -+ default: -+ /* limit the inlined version to 3 moves */ -+ return __generic_copy_to_user(to, from, n); -+ } -+ -+ return res; -+} -+ -+#define __copy_from_user(to, from, n) \ -+(__builtin_constant_p(n) ? \ -+ __constant_copy_from_user(to, from, n) : \ -+ __generic_copy_from_user(to, from, n)) -+ -+#define __copy_to_user(to, from, n) \ -+(__builtin_constant_p(n) ? \ -+ __constant_copy_to_user(to, from, n) : \ -+ __generic_copy_to_user(to, from, n)) -+ -+#define __copy_to_user_inatomic __copy_to_user -+#define __copy_from_user_inatomic __copy_from_user -+ -+#define copy_from_user(to, from, n) __copy_from_user(to, from, n) -+#define copy_to_user(to, from, n) __copy_to_user(to, from, n) -+ -+long strncpy_from_user(char *dst, const char __user *src, long count); -+long strnlen_user(const char __user *src, long n); -+unsigned long __clear_user(void __user *to, unsigned long n); -+ -+#define clear_user __clear_user -+ -+#define strlen_user(str) strnlen_user(str, 32767) -+ -+#endif /* _M68K_CF_UACCESS_H */ ---- a/include/asm-m68k/checksum.h -+++ b/include/asm-m68k/checksum.h -@@ -34,6 +34,7 @@ extern __wsum csum_partial_copy_nocheck( - void *dst, int len, - __wsum sum); - -+#ifndef CONFIG_COLDFIRE /* CF has own copy in arch/m68k/lib/checksum.c */ - /* - * This is a version of ip_compute_csum() optimized for IP headers, - * which always checksum on 4 octet boundaries. -@@ -59,6 +60,9 @@ static inline __sum16 ip_fast_csum(const - : "memory"); - return (__force __sum16)~sum; - } -+#else -+extern __sum16 ip_fast_csum(const void *iph, unsigned int ihl); -+#endif - - /* - * Fold a partial checksum -@@ -67,6 +71,11 @@ static inline __sum16 ip_fast_csum(const - static inline __sum16 csum_fold(__wsum sum) - { - unsigned int tmp = (__force u32)sum; -+#ifdef CONFIG_COLDFIRE -+ tmp = (tmp & 0xffff) + (tmp >> 16); -+ tmp = (tmp & 0xffff) + (tmp >> 16); -+ return (__force __sum16) ~tmp; -+#else - __asm__("swap %1\n\t" - "addw %1, %0\n\t" - "clrw %1\n\t" -@@ -74,6 +83,7 @@ static inline __sum16 csum_fold(__wsum s - : "=&d" (sum), "=&d" (tmp) - : "0" (sum), "1" (tmp)); - return (__force __sum16)~sum; -+#endif - } - - ---- /dev/null -+++ b/include/asm-m68k/coldfire_edma.h -@@ -0,0 +1,125 @@ -+/* -+ * coldfire_edma.h - eDMA driver for Coldfire MCF5445x -+ * -+ * Yaroslav Vinogradov yaroslav.vinogradov@freescale.com -+ * -+ * Copyright Freescale Semiconductor, Inc. 2007 -+ * -+ * This program is free software; you can redistribute it and/or modify it -+ * under the terms of the GNU General Public License as published by the -+ * Free Software Foundation; either version 2 of the License, or (at your -+ * option) any later version. -+ */ -+ -+#ifndef _LINUX_COLDFIRE_DMA_H -+#define _LINUX_COLDFIRE_DMA_H -+ -+#include <linux/interrupt.h> -+#include <asm/mcf5445x_edma.h> -+ -+#define EDMA_DRIVER_NAME "ColdFire-eDMA" -+#define DMA_DEV_MINOR 1 -+ -+#ifdef CONFIG_M5445X -+#define EDMA_INT_CHANNEL_BASE 8 -+#define EDMA_INT_CONTROLLER_BASE 64 -+#define EDMA_INT_BASE (EDMA_INT_CHANNEL_BASE + \ -+ EDMA_INT_CONTROLLER_BASE) -+#define EDMA_CHANNELS 16 -+#define EDMA_INT_ERR 16 /* edma error interrupt */ -+#endif /* CONFIG_M5445X */ -+ -+typedef irqreturn_t (*edma_irq_handler)(int, void *); -+typedef void (*edma_error_handler)(int, void *); -+ -+/* Setup transfer control descriptor (TCD) -+ * channel - descriptor number -+ * source - source address -+ * dest - destination address -+ * attr - attributes -+ * soff - source offset -+ * nbytes - number of bytes to be transfered in minor loop -+ * slast - last source address adjustment -+ * citer - major loop count -+ * biter - begining minor loop count -+ * doff - destination offset -+ * dlast_sga - last destination address adjustment -+ * major_int - generate interrupt after each major loop -+ * disable_req - disable DMA request after major loop -+ */ -+void set_edma_params(int channel, u32 source, u32 dest, -+ u32 attr, u32 soff, u32 nbytes, u32 slast, -+ u32 citer, u32 biter, u32 doff, u32 dlast_sga, -+ int major_int, int disable_req); -+ -+/* Starts eDMA transfer on specified channel -+ * channel - eDMA TCD number -+ */ -+static inline void start_edma_transfer(int channel) -+{ -+ MCF_EDMA_SERQ = channel; -+ MCF_EDMA_SSRT = channel; -+} -+ -+/* Stops eDMA transfer -+ * channel - eDMA TCD number -+ */ -+static inline void stop_edma_transfer(int channel) -+{ -+ MCF_EDMA_CINT = channel; -+ MCF_EDMA_CERQ = channel; -+} -+ -+ -+/* Confirm that interrupt has been handled -+ * channel - eDMA TCD number -+ */ -+static inline void confirm_edma_interrupt_handled(int channel) -+{ -+ MCF_EDMA_CINT = channel; -+} -+ -+/* Initialize eDMA controller */ -+void init_edma(void); -+ -+/* Request eDMA channel: -+ * channel - eDMA TCD number -+ * handler - channel IRQ callback -+ * error_handler - error interrupt handler callback for channel -+ * dev - device -+ * lock - spinlock to be locked (can be NULL) -+ * device_id - device driver name for proc file system output -+ */ -+int request_edma_channel(int channel, -+ edma_irq_handler handler, -+ edma_error_handler error_handler, -+ void *dev, -+ spinlock_t *lock, -+ const char *device_id); -+ -+/** -+ * set_edma_callback - Update the channel callback/arg -+ * @channel: channel number -+ * @handler: dma handler -+ * @error_handler: dma error handler -+ * @arg: argument to pass back -+ * -+ * Returns 0 if success or a negative value if failure -+ */ -+int set_edma_callback(int channel, -+ edma_irq_handler handler, -+ edma_error_handler error_handler, -+ void *arg); -+ -+/* Free eDMA channel -+ * channel - eDMA TCD number -+ * dev - device -+ */ -+int free_edma_channel(int channel, void *dev); -+ -+/* -+ * DMA Modes -+ */ -+#define DMA_MODE_READ 0 -+#define DMA_MODE_WRITE 1 -+#endif ---- /dev/null -+++ b/include/asm-m68k/coldfire.h -@@ -0,0 +1,51 @@ -+#ifndef _COLDFIRE_H_ -+#define _COLDFIRE_H_ -+ -+#if defined(CONFIG_M5445X) -+#define MCF_MBAR 0x0 -+/* -+ * Even though RAMBAR1 should be in the 0x8xxxxxxx range there -+ * is a problem that needs to be resolved. Currently head.S -+ * disables SRAM/RAMBAR1. -+ */ -+#define MCF_RAMBAR1 0x40000000 -+#define MCF_SRAM 0x40000000 -+#elif defined(CONFIG_M547X_8X) -+#define MCF_MBAR 0xF0000000 -+#define MCF_MMUBAR 0xF1000000 -+#define MCF_RAMBAR0 0xF3000000 -+#define MCF_RAMBAR1 0xF3001000 -+#endif -+ -+#define MCF_CLK CONFIG_MCFCLK -+#define MCF_BUSCLK (CONFIG_MCFCLK/2) -+ -+#ifdef __ASSEMBLY__ -+#define REG32 -+#define REG16 -+#define REG08 -+#else /* __ASSEMBLY__ */ -+#define REG32(x) ((volatile unsigned long *)(x)) -+#define REG16(x) ((volatile unsigned short *)(x)) -+#define REG08(x) ((volatile unsigned char *)(x)) -+ -+#define MCF_REG32(x) *(volatile unsigned long *)(MCF_MBAR+(x)) -+#define MCF_REG16(x) *(volatile unsigned short *)(MCF_MBAR+(x)) -+#define MCF_REG08(x) *(volatile unsigned char *)(MCF_MBAR+(x)) -+ -+void cacr_set(unsigned long); -+unsigned long cacr_get(void); -+ -+#define coldfire_enable_irq0(irq) MCF_INTC0_CIMR = (irq); -+ -+#define coldfire_enable_irq1(irq) MCF_INTC1_CIMR = (irq); -+ -+#define coldfire_disable_irq0(irq) MCF_INTC0_SIMR = (irq); -+ -+#define coldfire_disable_irq1(irq) MCF_INTC1_SIMR = (irq); -+ -+#define getiprh() MCF_INTC0_IPRH -+ -+#endif /* __ASSEMBLY__ */ -+ -+#endif /* _COLDFIRE_H_ */ ---- a/include/asm-m68k/delay.h -+++ b/include/asm-m68k/delay.h -@@ -11,8 +11,25 @@ - - static inline void __delay(unsigned long loops) - { -+#if defined(CONFIG_COLDFIRE) -+ /* The coldfire runs this loop at significantly different speeds -+ * depending upon long word alignment or not. We'll pad it to -+ * long word alignment which is the faster version. -+ * The 0x4a8e is of course a 'tstl %fp' instruction. This is better -+ * than using a NOP (0x4e71) instruction because it executes in one -+ * cycle not three and doesn't allow for an arbitary delay waiting -+ * for bus cycles to finish. Also fp/a6 isn't likely to cause a -+ * stall waiting for the register to become valid if such is added -+ * to the coldfire at some stage. -+ */ -+ __asm__ __volatile__ (".balignw 4, 0x4a8e\n\t" -+ "1: subql #1, %0\n\t" -+ "jcc 1b" -+ : "=d" (loops) : "0" (loops)); -+#else - __asm__ __volatile__ ("1: subql #1,%0; jcc 1b" - : "=d" (loops) : "0" (loops)); -+#endif - } - - extern void __bad_udelay(void); -@@ -26,12 +43,17 @@ extern void __bad_udelay(void); - */ - static inline void __const_udelay(unsigned long xloops) - { -+#if defined(CONFIG_COLDFIRE) -+ -+ __delay(((((unsigned long long) xloops * loops_per_jiffy))>>32)*HZ); -+#else - unsigned long tmp; - - __asm__ ("mulul %2,%0:%1" - : "=d" (xloops), "=d" (tmp) - : "d" (xloops), "1" (loops_per_jiffy)); - __delay(xloops * HZ); -+#endif - } - - static inline void __udelay(unsigned long usecs) -@@ -46,12 +68,16 @@ static inline void __udelay(unsigned lon - static inline unsigned long muldiv(unsigned long a, unsigned long b, - unsigned long c) - { -+#if defined(CONFIG_COLDFIRE) -+ return (long)(((unsigned long long)a * b)/c); -+#else - unsigned long tmp; - - __asm__ ("mulul %2,%0:%1; divul %3,%0:%1" - : "=d" (tmp), "=d" (a) - : "d" (b), "d" (c), "1" (a)); - return a; -+#endif - } - - #endif /* defined(_M68K_DELAY_H) */ ---- a/include/asm-m68k/div64.h -+++ b/include/asm-m68k/div64.h -@@ -5,6 +5,7 @@ - - /* n = n / base; return rem; */ - -+#ifndef CONFIG_COLDFIRE - #define do_div(n, base) ({ \ - union { \ - unsigned long n32[2]; \ -@@ -24,6 +25,9 @@ - (n) = __n.n64; \ - __rem; \ - }) -+#else -+# include <asm-generic/div64.h> -+#endif - - extern uint64_t div64_64(uint64_t dividend, uint64_t divisor); - #endif /* _M68K_DIV64_H */ ---- a/include/asm-m68k/dma.h -+++ b/include/asm-m68k/dma.h -@@ -1,16 +1,120 @@ - #ifndef _M68K_DMA_H - #define _M68K_DMA_H 1 - -- - /* it's useless on the m68k, but unfortunately needed by the new - bootmem allocator (but this should do it for this) */ - #define MAX_DMA_ADDRESS PAGE_OFFSET - -+#ifndef CONFIG_COLDFIRE - #define MAX_DMA_CHANNELS 8 - - extern int request_dma(unsigned int dmanr, const char * device_id); /* reserve a DMA channel */ - extern void free_dma(unsigned int dmanr); /* release it again */ - -+#else /* not (defined(CONFIG_MCF5474) || defined(CONFIG_MCF5484) || defined(CONFIG_MCF5475) || defined(CONFIG_MCF5485)) */ -+ -+/************************************************ -+ * Multichannel DMA definitions * -+ ************************************************/ -+#ifdef CONFIG_MCD_DMA -+#include <asm/MCD_dma.h> -+#include <asm/m5485dma.h> -+ -+struct scatterlist; -+ -+#define MAX_DMA_CHANNELS NCHANNELS -+/* -+ * identifiers for each initiator/requestor -+ */ -+#define DMA_ALWAYS (0) -+#define DMA_DSPI_RX (1) -+#define DMA_DSPI_TX (2) -+#define DMA_DREQ0 (3) -+#define DMA_PSC0_RX (4) -+#define DMA_PSC0_TX (5) -+#define DMA_USBEP0 (6) -+#define DMA_USBEP1 (7) -+#define DMA_USBEP2 (8) -+#define DMA_USBEP3 (9) -+#define DMA_PCI_TX (10) -+#define DMA_PCI_RX (11) -+#define DMA_PSC1_RX (12) -+#define DMA_PSC1_TX (13) -+#define DMA_I2C_RX (14) -+#define DMA_I2C_TX (15) -+#define DMA_FEC0_RX (16) -+#define DMA_FEC0_TX (17) -+#define DMA_FEC1_RX (18) -+#define DMA_FEC1_TX (19) -+#define DMA_DREQ1 (20) -+#define DMA_CTM0 (21) -+#define DMA_CTM1 (22) -+#define DMA_CTM2 (23) -+#define DMA_CTM3 (24) -+#define DMA_CTM4 (25) -+#define DMA_CTM5 (26) -+#define DMA_CTM6 (27) -+#define DMA_CTM7 (28) -+#define DMA_USBEP4 (29) -+#define DMA_USBEP5 (30) -+#define DMA_USBEP6 (31) -+#define DMA_PSC2_RX (32) -+#define DMA_PSC2_TX (33) -+#define DMA_PSC3_RX (34) -+#define DMA_PSC3_TX (35) -+#define DMA_FEC_RX(x) ((x == 0) ? DMA_FEC0_RX : DMA_FEC1_RX) -+#define DMA_FEC_TX(x) ((x == 0) ? DMA_FEC0_TX : DMA_FEC1_TX) -+ -+int dma_set_initiator(int); -+unsigned int dma_get_initiator(int); -+void dma_remove_initiator(int); -+int dma_set_channel(int); -+int dma_get_channel(int); -+void dma_remove_channel(int); -+int dma_set_channel_fec(int requestor); -+int dma_connect(int channel, int address); -+int dma_disconnect(int channel); -+void dma_remove_channel_by_number(int channel); -+int dma_init(void); -+ -+#endif /* CONFIG_MCD_DMA */ -+ -+extern spinlock_t dma_spin_lock; -+ -+static __inline__ unsigned long claim_dma_lock(void) -+{ -+ unsigned long flags; -+ spin_lock_irqsave(&dma_spin_lock, flags); -+ return flags; -+} -+ -+static __inline__ void release_dma_lock(unsigned long flags) -+{ -+ spin_unlock_irqrestore(&dma_spin_lock, flags); -+} -+ -+ -+/* -+ * Linux standard DMA stuff -+ */ -+#if 0 -+int request_dma(unsigned int channel, const char * device_id); -+void free_dma(unsigned int channel); -+void enable_dma(unsigned int channel); -+void disable_dma(unsigned int channel); -+int dma_channel_active(unsigned int channel); -+void set_dma_sg(unsigned int channel, struct scatterlist *sg, int nr_sg); -+void set_dma_page(unsigned int channel, char pagenr); -+void set_dma_addr(unsigned int channel, unsigned long physaddr); -+void set_dma_count(unsigned int channel, unsigned long count); -+void set_dma_mode(unsigned int channel, unsigned int mode); -+void set_dma_speed(unsigned int channel, int cycle_ns); -+int get_dma_residue(unsigned int channel); -+#endif -+#define clear_dma_ff(channel) -+ -+#endif /* not (defined(CONFIG_MCF5474) || defined(CONFIG_MCF5484) || defined(CONFIG_MCF5475) || defined(CONFIG_MCF5485)) */ -+ - #ifdef CONFIG_PCI - extern int isa_dma_bridge_buggy; - #else ---- a/include/asm-m68k/elf.h -+++ b/include/asm-m68k/elf.h -@@ -34,6 +34,26 @@ - #define R_68K_GLOB_DAT 20 - #define R_68K_JMP_SLOT 21 - #define R_68K_RELATIVE 22 -+/* TLS static relocations */ -+#define R_68K_TLS_GD32 25 -+#define R_68K_TLS_GD16 26 -+#define R_68K_TLS_GD8 27 -+#define R_68K_TLS_LDM32 28 -+#define R_68K_TLS_LDM16 29 -+#define R_68K_TLS_LDM8 30 -+#define R_68K_TLS_LDO32 31 -+#define R_68K_TLS_LDO16 32 -+#define R_68K_TLS_LDO8 33 -+#define R_68K_TLS_IE32 34 -+#define R_68K_TLS_IE16 35 -+#define R_68K_TLS_IE8 36 -+#define R_68K_TLS_LE32 37 -+#define R_68K_TLS_LE16 38 -+#define R_68K_TLS_LE8 39 -+/* TLS dynamic relocations */ -+#define R_68K_TLS_DTPMOD32 40 -+#define R_68K_TLS_DTPREL32 41 -+#define R_68K_TLS_TPREL32 42 - - typedef unsigned long elf_greg_t; - -@@ -60,7 +80,7 @@ typedef struct user_m68kfp_struct elf_fp - #define ELF_PLAT_INIT(_r, load_addr) _r->a1 = 0 - - #define USE_ELF_CORE_DUMP --#ifndef CONFIG_SUN3 -+#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE) - #define ELF_EXEC_PAGESIZE 4096 - #else - #define ELF_EXEC_PAGESIZE 8192 -@@ -116,4 +136,35 @@ typedef struct user_m68kfp_struct elf_fp - - #define SET_PERSONALITY(ex, ibcs2) set_personality((ibcs2)?PER_SVR4:PER_LINUX) - -+/* -+ * VDSO -+ */ -+#ifdef CONFIG_VSYSCALL -+extern unsigned int vdso_enabled; -+ -+#define VDSO_BASE ((unsigned long)current->mm->context.vdso) -+#define VDSO_SYM(x) (VDSO_BASE + (unsigned long)(x)) -+ -+#define VSYSCALL_AUX_ENT \ -+ if (vdso_enabled) \ -+ NEW_AUX_ENT(AT_SYSINFO_EHDR, VDSO_BASE); -+ -+/* additional pages */ -+#define ARCH_HAS_SETUP_ADDITIONAL_PAGES 1 -+ -+struct linux_binprm; -+extern int arch_setup_additional_pages(struct linux_binprm *bprm, -+ int executable_stack); -+ -+#else -+/* no VSYSCALL_AUX_ENT */ -+#define VSYSCALL_AUX_ENT -+#endif -+ -+#define ARCH_DLINFO \ -+do { \ -+ /* vsyscall entry */ \ -+ VSYSCALL_AUX_ENT; \ -+} while (0); -+ - #endif ---- a/include/asm-m68k/fpu.h -+++ b/include/asm-m68k/fpu.h -@@ -12,6 +12,8 @@ - #define FPSTATESIZE (96/sizeof(unsigned char)) - #elif defined(CONFIG_M68KFPU_EMU) - #define FPSTATESIZE (28/sizeof(unsigned char)) -+#elif defined(CONFIG_CFV4E) -+#define FPSTATESIZE (16/sizeof(unsigned char)) - #elif defined(CONFIG_M68060) - #define FPSTATESIZE (12/sizeof(unsigned char)) - #else ---- a/include/asm-m68k/io.h -+++ b/include/asm-m68k/io.h -@@ -204,6 +204,12 @@ static inline u16 __iomem *isa_mtw(unsig - #define isa_outw(val,port) (ISA_SEX ? out_be16(isa_itw(port),(val)) : out_le16(isa_itw(port),(val))) - #define isa_outl(val,port) (ISA_SEX ? out_be32(isa_itl(port),(val)) : out_le32(isa_itl(port),(val))) - -+#ifndef CONFIG_COLDFIRE -+#define isa_readb(p) in_8(isa_mtb(p)) -+#define isa_readw(p) (ISA_SEX ? in_be16(isa_mtw(p)) : in_le16(isa_mtw(p))) -+#define isa_writeb(val,p) out_8(isa_mtb(p),(val)) -+#define isa_writew(val,p) (ISA_SEX ? out_be16(isa_mtw(p),(val)) : out_le16(isa_mtw(p),(val))) -+#else - #define isa_readb(p) in_8(isa_mtb((unsigned long)(p))) - #define isa_readw(p) \ - (ISA_SEX ? in_be16(isa_mtw((unsigned long)(p))) \ -@@ -212,7 +218,7 @@ static inline u16 __iomem *isa_mtw(unsig - #define isa_writew(val,p) \ - (ISA_SEX ? out_be16(isa_mtw((unsigned long)(p)),(val)) \ - : out_le16(isa_mtw((unsigned long)(p)),(val))) -- -+#endif - static inline void isa_delay(void) - { - switch(ISA_TYPE) -@@ -285,6 +291,29 @@ static inline void isa_delay(void) - #endif /* CONFIG_ISA */ - - #if defined(CONFIG_PCI) -+#ifdef CONFIG_COLDFIRE -+#define inb_p inb -+#define inw_p inw -+#define inl_p inl -+#define outb_p outb -+#define outw_p outw -+#define outl_p outl -+ -+unsigned char pci_inb(long addr); -+unsigned short pci_inw(long addr); -+unsigned long pci_inl(long addr); -+void pci_outb(unsigned char val, long addr); -+void pci_outw(unsigned short val, long addr); -+void pci_outl(unsigned long val, long addr); -+ -+void pci_insb(volatile unsigned char* addr, unsigned char* buf, int len); -+void pci_insw(volatile unsigned short* addr, unsigned short* buf, int len); -+void pci_insl(volatile unsigned long* addr, unsigned long* buf, int len); -+ -+void pci_outsb(volatile unsigned char* addr, const unsigned char* buf, int len); -+void pci_outsw(volatile unsigned short* addr, const unsigned short* buf, int len); -+void pci_outsl(volatile unsigned long* addr, const unsigned long* buf, int len); -+#endif - - #define readl(addr) in_le32(addr) - #define writel(val,addr) out_le32((addr),(val)) -@@ -300,12 +329,48 @@ static inline void isa_delay(void) - #define readl_relaxed(addr) readl(addr) - - #ifndef CONFIG_ISA -+#ifndef CONFIG_COLDFIRE - #define inb(port) in_8(port) - #define outb(val,port) out_8((port),(val)) - #define inw(port) in_le16(port) - #define outw(val,port) out_le16((port),(val)) - #define inl(port) in_le32(port) - #define outl(val,port) out_le32((port),(val)) -+#define insb(port, buf, nr) \ -+ raw_insb((u8 *)(port), (u8 *)(buf), (nr)) -+#define outsb(port, buf, nr) \ -+ raw_outsb((u8 *)(port), (u8 *)(buf), (nr)) -+#define insw(port, buf, nr) \ -+ raw_insw_swapw((u16 *)(port), (u16 *)(buf), (nr)) -+#define outsw(port, buf, nr) \ -+ raw_outsw_swapw((u16 *)(port), (u16 *)(buf), (nr)) -+#define insl(port, buf, nr) \ -+ raw_insw_swapw((u16 *)(port), (u16 *)(buf), (nr)<<1) -+#define outsl(port, buf, nr) \ -+ raw_outsw_swapw((u16 *)(port), (u16 *)(buf), (nr)<<1) -+#else -+#define inb(port) pci_inb(port) -+#define outb(val,port) pci_outb((val),(port)) -+#define inw(port) pci_inw(port) -+#define outw(val,port) pci_outw((val),(port)) -+#define insb(a,b,c) pci_insb((volatile unsigned char*)a,(unsigned char*)b,c) -+#define insw(a,b,c) pci_insw((volatile unsigned short*)a,(const unsigned short*)b,c) -+#define insl(a,b,c) pci_insl((volatile unsigned long*)a,(const unsigned long*)b,c) -+#define outsb(a,b,c) pci_outsb((volatile unsigned char*)a,(const unsigned char*)b,c) -+#define outsw(a,b,c) pci_outsw((volatile unsigned short*)a,(const unsigned short*)b,c) -+#define outsl(a,b,c) pci_outsl((volatile unsigned long*)a,(const unsigned long*)b,c) -+#define inl(port) pci_inl(port) -+#define outl(val,port) pci_outl((val),(port)) -+#endif -+ -+#ifndef CONFIG_COLDFIRE -+#define __raw_readb readb -+#define __raw_readw readw -+#define __raw_readl readl -+#define __raw_writeb writeb -+#define __raw_writew writew -+#define __raw_writel writel -+#endif - - #else - /* -@@ -397,10 +462,12 @@ static inline void memcpy_toio(volatile - __builtin_memcpy((void __force *) dst, src, count); - } - --#ifndef CONFIG_SUN3 --#define IO_SPACE_LIMIT 0xffff --#else -+#if defined(CONFIG_SUN3) - #define IO_SPACE_LIMIT 0x0fffffff -+#elif defined(CONFIG_COLDFIRE) -+#define IO_SPACE_LIMIT 0xffffffff -+#else -+#define IO_SPACE_LIMIT 0xffff - #endif - - #endif /* __KERNEL__ */ -@@ -418,4 +485,31 @@ static inline void memcpy_toio(volatile - */ - #define xlate_dev_kmem_ptr(p) p - -+#ifdef CONFIG_COLDFIRE -+#define __raw_readb(addr) \ -+ ({ unsigned char __v = (*(volatile unsigned char *) (addr)); __v; }) -+#define __raw_readw(addr) \ -+ ({ unsigned short __v = (*(volatile unsigned short *) (addr)); __v; }) -+#define __raw_readl(addr) \ -+ ({ unsigned long __v = (*(volatile unsigned long *) (addr)); __v; }) -+#define __raw_writeb(b,addr) (void)((*(volatile unsigned char *) (addr)) = (b)) -+#define __raw_writew(b,addr) (void)((*(volatile unsigned short *) (addr)) = (b)) -+#define __raw_writel(b,addr) (void)((*(volatile unsigned int *) (addr)) = (b)) -+ -+#define memset_io(a, b, c) memset((void *)(a), (b), (c)) -+#define memcpy_fromio(a, b, c) memcpy((a), (void *)(b), (c)) -+#define memcpy_toio(a, b, c) memcpy((void *)(a), (b), (c)) -+#if !defined(readb) -+#define readb(addr) \ -+ ({ unsigned char __v = (*(volatile unsigned char *) (addr)); __v; }) -+#define readw(addr) \ -+ ({ unsigned short __v = (*(volatile unsigned short *) (addr)); __v; }) -+#define readl(addr) \ -+ ({ unsigned int __v = (*(volatile unsigned int *) (addr)); __v; }) -+#define writeb(b, addr) (void)((*(volatile unsigned char *) (addr)) = (b)) -+#define writew(b, addr) (void)((*(volatile unsigned short *) (addr)) = (b)) -+#define writel(b, addr) (void)((*(volatile unsigned int *) (addr)) = (b)) -+#endif /* readb */ -+#endif /* CONFIG_COLDFIRE */ -+ - #endif /* _IO_H */ ---- a/include/asm-m68k/irq.h -+++ b/include/asm-m68k/irq.h -@@ -11,7 +11,10 @@ - * Currently the Atari has 72 and the Amiga 24, but if both are - * supported in the kernel it is better to make room for 72. - */ --#if defined(CONFIG_VME) || defined(CONFIG_SUN3) || defined(CONFIG_SUN3X) -+#if defined(CONFIG_COLDFIRE) -+#define SYS_IRQS 256 -+#define NR_IRQS SYS_IRQS -+#elif defined(CONFIG_VME) || defined(CONFIG_SUN3) || defined(CONFIG_SUN3X) - #define NR_IRQS 200 - #elif defined(CONFIG_ATARI) || defined(CONFIG_MAC) - #define NR_IRQS 72 ---- /dev/null -+++ b/include/asm-m68k/m5485dma.h -@@ -0,0 +1,97 @@ -+/* -+ * m5485dma.h -- ColdFire 547x/548x DMA controller support. -+ */ -+#ifndef __MCF548X_DMA_H__ -+#define __MCF548X_DMA_H__ -+ -+ -+/* Register read/write macros */ -+#define MCF_DMA_DIPR (*(volatile u32*)(void*)(MCF_MBAR+0x008014)) -+#define MCF_DMA_DIMR (*(volatile u32*)(void*)(MCF_MBAR+0x008018)) -+#define MCF_DMA_IMCR (*(volatile u32*)(void*)(MCF_MBAR+0x00805C)) -+ -+/* Bit definitions and macros for MCF_DMA_DIPR */ -+#define MCF_DMA_DIPR_TASK0 (0x00000001) -+#define MCF_DMA_DIPR_TASK1 (0x00000002) -+#define MCF_DMA_DIPR_TASK2 (0x00000004) -+#define MCF_DMA_DIPR_TASK3 (0x00000008) -+#define MCF_DMA_DIPR_TASK4 (0x00000010) -+#define MCF_DMA_DIPR_TASK5 (0x00000020) -+#define MCF_DMA_DIPR_TASK6 (0x00000040) -+#define MCF_DMA_DIPR_TASK7 (0x00000080) -+#define MCF_DMA_DIPR_TASK8 (0x00000100) -+#define MCF_DMA_DIPR_TASK9 (0x00000200) -+#define MCF_DMA_DIPR_TASK10 (0x00000400) -+#define MCF_DMA_DIPR_TASK11 (0x00000800) -+#define MCF_DMA_DIPR_TASK12 (0x00001000) -+#define MCF_DMA_DIPR_TASK13 (0x00002000) -+#define MCF_DMA_DIPR_TASK14 (0x00004000) -+#define MCF_DMA_DIPR_TASK15 (0x00008000) -+ -+/* Bit definitions and macros for MCF_DMA_DIMR */ -+#define MCF_DMA_DIMR_TASK0 (0x00000001) -+#define MCF_DMA_DIMR_TASK1 (0x00000002) -+#define MCF_DMA_DIMR_TASK2 (0x00000004) -+#define MCF_DMA_DIMR_TASK3 (0x00000008) -+#define MCF_DMA_DIMR_TASK4 (0x00000010) -+#define MCF_DMA_DIMR_TASK5 (0x00000020) -+#define MCF_DMA_DIMR_TASK6 (0x00000040) -+#define MCF_DMA_DIMR_TASK7 (0x00000080) -+#define MCF_DMA_DIMR_TASK8 (0x00000100) -+#define MCF_DMA_DIMR_TASK9 (0x00000200) -+#define MCF_DMA_DIMR_TASK10 (0x00000400) -+#define MCF_DMA_DIMR_TASK11 (0x00000800) -+#define MCF_DMA_DIMR_TASK12 (0x00001000) -+#define MCF_DMA_DIMR_TASK13 (0x00002000) -+#define MCF_DMA_DIMR_TASK14 (0x00004000) -+#define MCF_DMA_DIMR_TASK15 (0x00008000) -+ -+/* Bit definitions and macros for MCF_DMA_IMCR */ -+#define MCF_DMA_IMCR_SRC16(x) (((x)&0x00000003)<<0) -+#define MCF_DMA_IMCR_SRC17(x) (((x)&0x00000003)<<2) -+#define MCF_DMA_IMCR_SRC18(x) (((x)&0x00000003)<<4) -+#define MCF_DMA_IMCR_SRC19(x) (((x)&0x00000003)<<6) -+#define MCF_DMA_IMCR_SRC20(x) (((x)&0x00000003)<<8) -+#define MCF_DMA_IMCR_SRC21(x) (((x)&0x00000003)<<10) -+#define MCF_DMA_IMCR_SRC22(x) (((x)&0x00000003)<<12) -+#define MCF_DMA_IMCR_SRC23(x) (((x)&0x00000003)<<14) -+#define MCF_DMA_IMCR_SRC24(x) (((x)&0x00000003)<<16) -+#define MCF_DMA_IMCR_SRC25(x) (((x)&0x00000003)<<18) -+#define MCF_DMA_IMCR_SRC26(x) (((x)&0x00000003)<<20) -+#define MCF_DMA_IMCR_SRC27(x) (((x)&0x00000003)<<22) -+#define MCF_DMA_IMCR_SRC28(x) (((x)&0x00000003)<<24) -+#define MCF_DMA_IMCR_SRC29(x) (((x)&0x00000003)<<26) -+#define MCF_DMA_IMCR_SRC30(x) (((x)&0x00000003)<<28) -+#define MCF_DMA_IMCR_SRC31(x) (((x)&0x00000003)<<30) -+#define MCF_DMA_IMCR_SRC16_FEC0RX (0x00000000) -+#define MCF_DMA_IMCR_SRC17_FEC0TX (0x00000000) -+#define MCF_DMA_IMCR_SRC18_FEC0RX (0x00000020) -+#define MCF_DMA_IMCR_SRC19_FEC0TX (0x00000080) -+#define MCF_DMA_IMCR_SRC20_FEC1RX (0x00000100) -+#define MCF_DMA_IMCR_SRC21_DREQ1 (0x00000000) -+#define MCF_DMA_IMCR_SRC21_FEC1TX (0x00000400) -+#define MCF_DMA_IMCR_SRC22_FEC0RX (0x00001000) -+#define MCF_DMA_IMCR_SRC23_FEC0TX (0x00004000) -+#define MCF_DMA_IMCR_SRC24_CTM0 (0x00010000) -+#define MCF_DMA_IMCR_SRC24_FEC1RX (0x00020000) -+#define MCF_DMA_IMCR_SRC25_CTM1 (0x00040000) -+#define MCF_DMA_IMCR_SRC25_FEC1TX (0x00080000) -+#define MCF_DMA_IMCR_SRC26_USBEP4 (0x00000000) -+#define MCF_DMA_IMCR_SRC26_CTM2 (0x00200000) -+#define MCF_DMA_IMCR_SRC27_USBEP5 (0x00000000) -+#define MCF_DMA_IMCR_SRC27_CTM3 (0x00800000) -+#define MCF_DMA_IMCR_SRC28_USBEP6 (0x00000000) -+#define MCF_DMA_IMCR_SRC28_CTM4 (0x01000000) -+#define MCF_DMA_IMCR_SRC28_DREQ1 (0x02000000) -+#define MCF_DMA_IMCR_SRC28_PSC2RX (0x03000000) -+#define MCF_DMA_IMCR_SRC29_DREQ1 (0x04000000) -+#define MCF_DMA_IMCR_SRC29_CTM5 (0x08000000) -+#define MCF_DMA_IMCR_SRC29_PSC2TX (0x0C000000) -+#define MCF_DMA_IMCR_SRC30_FEC1RX (0x00000000) -+#define MCF_DMA_IMCR_SRC30_CTM6 (0x10000000) -+#define MCF_DMA_IMCR_SRC30_PSC3RX (0x30000000) -+#define MCF_DMA_IMCR_SRC31_FEC1TX (0x00000000) -+#define MCF_DMA_IMCR_SRC31_CTM7 (0x80000000) -+#define MCF_DMA_IMCR_SRC31_PSC3TX (0xC0000000) -+ -+#endif /* __MCF548X_DMA_H__ */ ---- /dev/null -+++ b/include/asm-m68k/m5485dspi.h -@@ -0,0 +1,144 @@ -+/* -+ * File: mcf548x_dspi.h -+ * Purpose: Register and bit definitions for the MCF548X -+ * -+ * Notes: -+ * -+ */ -+ -+#ifndef _M5485DSPI_H_ -+#define _M5485DSPI_H_ -+ -+/* -+ * -+ * DMA Serial Peripheral Interface (DSPI) -+ * -+ */ -+ -+/* Register read/write macros */ -+#define MCF_DSPI_DMCR MCF_REG32(0x008A00) -+#define MCF_DSPI_DTCR MCF_REG32(0x008A08) -+#define MCF_DSPI_DCTAR0 MCF_REG32(0x008A0C) -+#define MCF_DSPI_DCTAR1 MCF_REG32(0x008A10) -+#define MCF_DSPI_DCTAR2 MCF_REG32(0x008A14) -+#define MCF_DSPI_DCTAR3 MCF_REG32(0x008A18) -+#define MCF_DSPI_DCTAR4 MCF_REG32(0x008A1C) -+#define MCF_DSPI_DCTAR5 MCF_REG32(0x008A20) -+#define MCF_DSPI_DCTAR6 MCF_REG32(0x008A24) -+#define MCF_DSPI_DCTAR7 MCF_REG32(0x008A28) -+#define MCF_DSPI_DCTARn(x) MCF_REG32(0x008A0C+(x*4)) -+#define MCF_DSPI_DSR MCF_REG32(0x008A2C) -+#define MCF_DSPI_DRSER MCF_REG32(0x008A30) -+#define MCF_DSPI_DTFR MCF_REG32(0x008A34) -+#define MCF_DSPI_DRFR MCF_REG32(0x008A38) -+#define MCF_DSPI_DTFDR0 MCF_REG32(0x008A3C) -+#define MCF_DSPI_DTFDR1 MCF_REG32(0x008A40) -+#define MCF_DSPI_DTFDR2 MCF_REG32(0x008A44) -+#define MCF_DSPI_DTFDR3 MCF_REG32(0x008A48) -+#define MCF_DSPI_DTFDRn(x) MCF_REG32(0x008A3C+(x*4)) -+#define MCF_DSPI_DRFDR0 MCF_REG32(0x008A7C) -+#define MCF_DSPI_DRFDR1 MCF_REG32(0x008A80) -+#define MCF_DSPI_DRFDR2 MCF_REG32(0x008A84) -+#define MCF_DSPI_DRFDR3 MCF_REG32(0x008A88) -+#define MCF_DSPI_DRFDRn(x) MCF_REG32(0x008A7C+(x*4)) -+ -+/* Bit definitions and macros for MCF_DSPI_DMCR */ -+#define MCF_DSPI_DMCR_HALT (0x00000001) -+#define MCF_DSPI_DMCR_SMPL_PT(x) (((x)&0x00000003)<<8) -+#define MCF_DSPI_DMCR_CRXF (0x00000400) -+#define MCF_DSPI_DMCR_CTXF (0x00000800) -+#define MCF_DSPI_DMCR_DRXF (0x00001000) -+#define MCF_DSPI_DMCR_DTXF (0x00002000) -+#define MCF_DSPI_DMCR_CSIS0 (0x00010000) -+#define MCF_DSPI_DMCR_CSIS2 (0x00040000) -+#define MCF_DSPI_DMCR_CSIS3 (0x00080000) -+#define MCF_DSPI_DMCR_CSIS5 (0x00200000) -+#define MCF_DSPI_DMCR_ROOE (0x01000000) -+#define MCF_DSPI_DMCR_PCSSE (0x02000000) -+#define MCF_DSPI_DMCR_MTFE (0x04000000) -+#define MCF_DSPI_DMCR_FRZ (0x08000000) -+#define MCF_DSPI_DMCR_DCONF(x) (((x)&0x00000003)<<28) -+#define MCF_DSPI_DMCR_CSCK (0x40000000) -+#define MCF_DSPI_DMCR_MSTR (0x80000000) -+ -+/* Bit definitions and macros for MCF_DSPI_DTCR */ -+#define MCF_DSPI_DTCR_SPI_TCNT(x) (((x)&0x0000FFFF)<<16) -+ -+/* Bit definitions and macros for MCF_DSPI_DCTARn */ -+#define MCF_DSPI_DCTAR_BR(x) (((x)&0x0000000F)<<0) -+#define MCF_DSPI_DCTAR_DT(x) (((x)&0x0000000F)<<4) -+#define MCF_DSPI_DCTAR_ASC(x) (((x)&0x0000000F)<<8) -+#define MCF_DSPI_DCTAR_CSSCK(x) (((x)&0x0000000F)<<12) -+#define MCF_DSPI_DCTAR_PBR(x) (((x)&0x00000003)<<16) -+#define MCF_DSPI_DCTAR_PDT(x) (((x)&0x00000003)<<18) -+#define MCF_DSPI_DCTAR_PASC(x) (((x)&0x00000003)<<20) -+#define MCF_DSPI_DCTAR_PCSSCK(x) (((x)&0x00000003)<<22) -+#define MCF_DSPI_DCTAR_LSBFE (0x01000000) -+#define MCF_DSPI_DCTAR_CPHA (0x02000000) -+#define MCF_DSPI_DCTAR_CPOL (0x04000000) -+/* #define MCF_DSPI_DCTAR_TRSZ(x) (((x)&0x0000000F)<<27) */ -+#define MCF_DSPI_DCTAR_FMSZ(x) (((x)&0x0000000F)<<27) -+#define MCF_DSPI_DCTAR_PCSSCK_1CLK (0x00000000) -+#define MCF_DSPI_DCTAR_PCSSCK_3CLK (0x00400000) -+#define MCF_DSPI_DCTAR_PCSSCK_5CLK (0x00800000) -+#define MCF_DSPI_DCTAR_PCSSCK_7CLK (0x00A00000) -+#define MCF_DSPI_DCTAR_PASC_1CLK (0x00000000) -+#define MCF_DSPI_DCTAR_PASC_3CLK (0x00100000) -+#define MCF_DSPI_DCTAR_PASC_5CLK (0x00200000) -+#define MCF_DSPI_DCTAR_PASC_7CLK (0x00300000) -+#define MCF_DSPI_DCTAR_PDT_1CLK (0x00000000) -+#define MCF_DSPI_DCTAR_PDT_3CLK (0x00040000) -+#define MCF_DSPI_DCTAR_PDT_5CLK (0x00080000) -+#define MCF_DSPI_DCTAR_PDT_7CLK (0x000A0000) -+#define MCF_DSPI_DCTAR_PBR_1CLK (0x00000000) -+#define MCF_DSPI_DCTAR_PBR_3CLK (0x00010000) -+#define MCF_DSPI_DCTAR_PBR_5CLK (0x00020000) -+#define MCF_DSPI_DCTAR_PBR_7CLK (0x00030000) -+ -+/* Bit definitions and macros for MCF_DSPI_DSR */ -+#define MCF_DSPI_DSR_RXPTR(x) (((x)&0x0000000F)<<0) -+#define MCF_DSPI_DSR_RXCTR(x) (((x)&0x0000000F)<<4) -+#define MCF_DSPI_DSR_TXPTR(x) (((x)&0x0000000F)<<8) -+#define MCF_DSPI_DSR_TXCTR(x) (((x)&0x0000000F)<<12) -+#define MCF_DSPI_DSR_RFDF (0x00020000) -+#define MCF_DSPI_DSR_RFOF (0x00080000) -+#define MCF_DSPI_DSR_TFFF (0x02000000) -+#define MCF_DSPI_DSR_TFUF (0x08000000) -+#define MCF_DSPI_DSR_EOQF (0x10000000) -+#define MCF_DSPI_DSR_TXRXS (0x40000000) -+#define MCF_DSPI_DSR_TCF (0x80000000) -+ -+/* Bit definitions and macros for MCF_DSPI_DRSER */ -+#define MCF_DSPI_DRSER_RFDFS (0x00010000) -+#define MCF_DSPI_DRSER_RFDFE (0x00020000) -+#define MCF_DSPI_DRSER_RFOFE (0x00080000) -+#define MCF_DSPI_DRSER_TFFFS (0x01000000) -+#define MCF_DSPI_DRSER_TFFFE (0x02000000) -+#define MCF_DSPI_DRSER_TFUFE (0x08000000) -+#define MCF_DSPI_DRSER_EOQFE (0x10000000) -+#define MCF_DSPI_DRSER_TCFE (0x80000000) -+ -+/* Bit definitions and macros for MCF_DSPI_DTFR */ -+#define MCF_DSPI_DTFR_TXDATA(x) (((x)&0x0000FFFF)<<0) -+#define MCF_DSPI_DTFR_CS0 (0x00010000) -+#define MCF_DSPI_DTFR_CS2 (0x00040000) -+#define MCF_DSPI_DTFR_CS3 (0x00080000) -+#define MCF_DSPI_DTFR_CS5 (0x00200000) -+#define MCF_DSPI_DTFR_CTCNT (0x04000000) -+#define MCF_DSPI_DTFR_EOQ (0x08000000) -+#define MCF_DSPI_DTFR_CTAS(x) (((x)&0x00000007)<<28) -+#define MCF_DSPI_DTFR_CONT (0x80000000) -+ -+/* Bit definitions and macros for MCF_DSPI_DRFR */ -+#define MCF_DSPI_DRFR_RXDATA(x) (((x)&0x0000FFFF)<<0) -+ -+/* Bit definitions and macros for MCF_DSPI_DTFDRn */ -+#define MCF_DSPI_DTFDRn_TXDATA(x) (((x)&0x0000FFFF)<<0) -+#define MCF_DSPI_DTFDRn_TXCMD(x) (((x)&0x0000FFFF)<<16) -+ -+/* Bit definitions and macros for MCF_DSPI_DRFDRn */ -+#define MCF_DSPI_DRFDRn_RXDATA(x) (((x)&0x0000FFFF)<<0) -+ -+/********************************************************************/ -+ -+#endif /* _M5485DSPI_H_ */ ---- /dev/null -+++ b/include/asm-m68k/m5485gpio.h -@@ -0,0 +1,694 @@ -+/* -+ * File: mcf548x_gpio.h -+ * Purpose: Register and bit definitions for the MCF548X -+ * -+ * Notes: -+ * -+ */ -+ -+#ifndef _M5485GPIO_H_ -+#define _M5485GPIO_H_ -+ -+/********************************************************************* -+* -+* General Purpose I/O (GPIO) -+* -+*********************************************************************/ -+ -+/* Register read/write macros */ -+#define MCF_GPIO_PODR_FBCTL MCF_REG08(0x000A00) -+#define MCF_GPIO_PODR_FBCS MCF_REG08(0x000A01) -+#define MCF_GPIO_PODR_DMA MCF_REG08(0x000A02) -+#define MCF_GPIO_PODR_FEC0H MCF_REG08(0x000A04) -+#define MCF_GPIO_PODR_FEC0L MCF_REG08(0x000A05) -+#define MCF_GPIO_PODR_FEC1H MCF_REG08(0x000A06) -+#define MCF_GPIO_PODR_FEC1L MCF_REG08(0x000A07) -+#define MCF_GPIO_PODR_FECI2C MCF_REG08(0x000A08) -+#define MCF_GPIO_PODR_PCIBG MCF_REG08(0x000A09) -+#define MCF_GPIO_PODR_PCIBR MCF_REG08(0x000A0A) -+#define MCF_GPIO_PODR_PSC3PSC2 MCF_REG08(0x000A0C) -+#define MCF_GPIO_PODR_PSC1PSC0 MCF_REG08(0x000A0D) -+#define MCF_GPIO_PODR_DSPI MCF_REG08(0x000A0E) -+#define MCF_GPIO_PDDR_FBCTL MCF_REG08(0x000A10) -+#define MCF_GPIO_PDDR_FBCS MCF_REG08(0x000A11) -+#define MCF_GPIO_PDDR_DMA MCF_REG08(0x000A12) -+#define MCF_GPIO_PDDR_FEC0H MCF_REG08(0x000A14) -+#define MCF_GPIO_PDDR_FEC0L MCF_REG08(0x000A15) -+#define MCF_GPIO_PDDR_FEC1H MCF_REG08(0x000A16) -+#define MCF_GPIO_PDDR_FEC1L MCF_REG08(0x000A17) -+#define MCF_GPIO_PDDR_FECI2C MCF_REG08(0x000A18) -+#define MCF_GPIO_PDDR_PCIBG MCF_REG08(0x000A19) -+#define MCF_GPIO_PDDR_PCIBR MCF_REG08(0x000A1A) -+#define MCF_GPIO_PDDR_PSC3PSC2 MCF_REG08(0x000A1C) -+#define MCF_GPIO_PDDR_PSC1PSC0 MCF_REG08(0x000A1D) -+#define MCF_GPIO_PDDR_DSPI MCF_REG08(0x000A1E) -+#define MCF_GPIO_PPDSDR_FBCTL MCF_REG08(0x000A20) -+#define MCF_GPIO_PPDSDR_FBCS MCF_REG08(0x000A21) -+#define MCF_GPIO_PPDSDR_DMA MCF_REG08(0x000A22) -+#define MCF_GPIO_PPDSDR_FEC0H MCF_REG08(0x000A24) -+#define MCF_GPIO_PPDSDR_FEC0L MCF_REG08(0x000A25) -+#define MCF_GPIO_PPDSDR_FEC1H MCF_REG08(0x000A26) -+#define MCF_GPIO_PPDSDR_FEC1L MCF_REG08(0x000A27) -+#define MCF_GPIO_PPDSDR_FECI2C MCF_REG08(0x000A28) -+#define MCF_GPIO_PPDSDR_PCIBG MCF_REG08(0x000A29) -+#define MCF_GPIO_PPDSDR_PCIBR MCF_REG08(0x000A2A) -+#define MCF_GPIO_PPDSDR_PSC3PSC2 MCF_REG08(0x000A2C) -+#define MCF_GPIO_PPDSDR_PSC1PSC0 MCF_REG08(0x000A2D) -+#define MCF_GPIO_PPDSDR_DSPI MCF_REG08(0x000A2E) -+#define MCF_GPIO_PCLRR_FBCTL MCF_REG08(0x000A30) -+#define MCF_GPIO_PCLRR_FBCS MCF_REG08(0x000A31) -+#define MCF_GPIO_PCLRR_DMA MCF_REG08(0x000A32) -+#define MCF_GPIO_PCLRR_FEC0H MCF_REG08(0x000A34) -+#define MCF_GPIO_PCLRR_FEC0L MCF_REG08(0x000A35) -+#define MCF_GPIO_PCLRR_FEC1H MCF_REG08(0x000A36) -+#define MCF_GPIO_PCLRR_FEC1L MCF_REG08(0x000A37) -+#define MCF_GPIO_PCLRR_FECI2C MCF_REG08(0x000A38) -+#define MCF_GPIO_PCLRR_PCIBG MCF_REG08(0x000A39) -+#define MCF_GPIO_PCLRR_PCIBR MCF_REG08(0x000A3A) -+#define MCF_GPIO_PCLRR_PSC3PSC2 MCF_REG08(0x000A3C) -+#define MCF_GPIO_PCLRR_PSC1PSC0 MCF_REG08(0x000A3D) -+#define MCF_GPIO_PCLRR_DSPI MCF_REG08(0x000A3E) -+#define MCF_GPIO_PAR_FBCTL MCF_REG16(0x000A40) -+#define MCF_GPIO_PAR_FBCS MCF_REG08(0x000A42) -+#define MCF_GPIO_PAR_DMA MCF_REG08(0x000A43) -+#define MCF_GPIO_PAR_FECI2CIRQ MCF_REG16(0x000A44) -+#define MCF_GPIO_PAR_PCIBG MCF_REG16(0x000A48) -+#define MCF_GPIO_PAR_PCIBR MCF_REG16(0x000A4A) -+#define MCF_GPIO_PAR_PSC3 MCF_REG08(0x000A4C) -+#define MCF_GPIO_PAR_PSC2 MCF_REG08(0x000A4D) -+#define MCF_GPIO_PAR_PSC1 MCF_REG08(0x000A4E) -+#define MCF_GPIO_PAR_PSC0 MCF_REG08(0x000A4F) -+#define MCF_GPIO_PAR_DSPI MCF_REG16(0x000A50) -+#define MCF_GPIO_PAR_TIMER MCF_REG08(0x000A52) -+ -+/* Bit definitions and macros for MCF_GPIO_PODR_FBCTL */ -+#define MCF_GPIO_PODR_FBCTL_PODRFBCTL0 (0x01) -+#define MCF_GPIO_PODR_FBCTL_PODRFBCTL1 (0x02) -+#define MCF_GPIO_PODR_FBCTL_PODRFBCTL2 (0x04) -+#define MCF_GPIO_PODR_FBCTL_PODRFBCTL3 (0x08) -+#define MCF_GPIO_PODR_FBCTL_PODRFBCTL4 (0x10) -+#define MCF_GPIO_PODR_FBCTL_PODRFBCTL5 (0x20) -+#define MCF_GPIO_PODR_FBCTL_PODRFBCTL6 (0x40) -+#define MCF_GPIO_PODR_FBCTL_PODRFBCTL7 (0x80) -+ -+/* Bit definitions and macros for MCF_GPIO_PODR_FBCS */ -+#define MCF_GPIO_PODR_FBCS_PODRFBCS1 (0x02) -+#define MCF_GPIO_PODR_FBCS_PODRFBCS2 (0x04) -+#define MCF_GPIO_PODR_FBCS_PODRFBCS3 (0x08) -+#define MCF_GPIO_PODR_FBCS_PODRFBCS4 (0x10) -+#define MCF_GPIO_PODR_FBCS_PODRFBCS5 (0x20) -+ -+/* Bit definitions and macros for MCF_GPIO_PODR_DMA */ -+#define MCF_GPIO_PODR_DMA_PODRDMA0 (0x01) -+#define MCF_GPIO_PODR_DMA_PODRDMA1 (0x02) -+#define MCF_GPIO_PODR_DMA_PODRDMA2 (0x04) -+#define MCF_GPIO_PODR_DMA_PODRDMA3 (0x08) -+ -+/* Bit definitions and macros for MCF_GPIO_PODR_FEC0H */ -+#define MCF_GPIO_PODR_FEC0H_PODRFEC0H0 (0x01) -+#define MCF_GPIO_PODR_FEC0H_PODRFEC0H1 (0x02) -+#define MCF_GPIO_PODR_FEC0H_PODRFEC0H2 (0x04) -+#define MCF_GPIO_PODR_FEC0H_PODRFEC0H3 (0x08) -+#define MCF_GPIO_PODR_FEC0H_PODRFEC0H4 (0x10) -+#define MCF_GPIO_PODR_FEC0H_PODRFEC0H5 (0x20) -+#define MCF_GPIO_PODR_FEC0H_PODRFEC0H6 (0x40) -+#define MCF_GPIO_PODR_FEC0H_PODRFEC0H7 (0x80) -+ -+/* Bit definitions and macros for MCF_GPIO_PODR_FEC0L */ -+#define MCF_GPIO_PODR_FEC0L_PODRFEC0L0 (0x01) -+#define MCF_GPIO_PODR_FEC0L_PODRFEC0L1 (0x02) -+#define MCF_GPIO_PODR_FEC0L_PODRFEC0L2 (0x04) -+#define MCF_GPIO_PODR_FEC0L_PODRFEC0L3 (0x08) -+#define MCF_GPIO_PODR_FEC0L_PODRFEC0L4 (0x10) -+#define MCF_GPIO_PODR_FEC0L_PODRFEC0L5 (0x20) -+#define MCF_GPIO_PODR_FEC0L_PODRFEC0L6 (0x40) -+#define MCF_GPIO_PODR_FEC0L_PODRFEC0L7 (0x80) -+ -+/* Bit definitions and macros for MCF_GPIO_PODR_FEC1H */ -+#define MCF_GPIO_PODR_FEC1H_PODRFEC1H0 (0x01) -+#define MCF_GPIO_PODR_FEC1H_PODRFEC1H1 (0x02) -+#define MCF_GPIO_PODR_FEC1H_PODRFEC1H2 (0x04) -+#define MCF_GPIO_PODR_FEC1H_PODRFEC1H3 (0x08) -+#define MCF_GPIO_PODR_FEC1H_PODRFEC1H4 (0x10) -+#define MCF_GPIO_PODR_FEC1H_PODRFEC1H5 (0x20) -+#define MCF_GPIO_PODR_FEC1H_PODRFEC1H6 (0x40) -+#define MCF_GPIO_PODR_FEC1H_PODRFEC1H7 (0x80) -+ -+/* Bit definitions and macros for MCF_GPIO_PODR_FEC1L */ -+#define MCF_GPIO_PODR_FEC1L_PODRFEC1L0 (0x01) -+#define MCF_GPIO_PODR_FEC1L_PODRFEC1L1 (0x02) -+#define MCF_GPIO_PODR_FEC1L_PODRFEC1L2 (0x04) -+#define MCF_GPIO_PODR_FEC1L_PODRFEC1L3 (0x08) -+#define MCF_GPIO_PODR_FEC1L_PODRFEC1L4 (0x10) -+#define MCF_GPIO_PODR_FEC1L_PODRFEC1L5 (0x20) -+#define MCF_GPIO_PODR_FEC1L_PODRFEC1L6 (0x40) -+#define MCF_GPIO_PODR_FEC1L_PODRFEC1L7 (0x80) -+ -+/* Bit definitions and macros for MCF_GPIO_PODR_FECI2C */ -+#define MCF_GPIO_PODR_FECI2C_PODRFECI2C0 (0x01) -+#define MCF_GPIO_PODR_FECI2C_PODRFECI2C1 (0x02) -+#define MCF_GPIO_PODR_FECI2C_PODRFECI2C2 (0x04) -+#define MCF_GPIO_PODR_FECI2C_PODRFECI2C3 (0x08) -+ -+/* Bit definitions and macros for MCF_GPIO_PODR_PCIBG */ -+#define MCF_GPIO_PODR_PCIBG_PODRPCIBG0 (0x01) -+#define MCF_GPIO_PODR_PCIBG_PODRPCIBG1 (0x02) -+#define MCF_GPIO_PODR_PCIBG_PODRPCIBG2 (0x04) -+#define MCF_GPIO_PODR_PCIBG_PODRPCIBG3 (0x08) -+#define MCF_GPIO_PODR_PCIBG_PODRPCIBG4 (0x10) -+ -+/* Bit definitions and macros for MCF_GPIO_PODR_PCIBR */ -+#define MCF_GPIO_PODR_PCIBR_PODRPCIBR0 (0x01) -+#define MCF_GPIO_PODR_PCIBR_PODRPCIBR1 (0x02) -+#define MCF_GPIO_PODR_PCIBR_PODRPCIBR2 (0x04) -+#define MCF_GPIO_PODR_PCIBR_PODRPCIBR3 (0x08) -+#define MCF_GPIO_PODR_PCIBR_PODRPCIBR4 (0x10) -+ -+/* Bit definitions and macros for MCF_GPIO_PODR_PSC3PSC2 */ -+#define MCF_GPIO_PODR_PSC3PSC2_PODRPSC3PSC20 (0x01) -+#define MCF_GPIO_PODR_PSC3PSC2_PODRPSC3PSC21 (0x02) -+#define MCF_GPIO_PODR_PSC3PSC2_PODRPSC3PSC22 (0x04) -+#define MCF_GPIO_PODR_PSC3PSC2_PODRPSC3PSC23 (0x08) -+#define MCF_GPIO_PODR_PSC3PSC2_PODRPSC3PSC24 (0x10) -+#define MCF_GPIO_PODR_PSC3PSC2_PODRPSC3PSC25 (0x20) -+#define MCF_GPIO_PODR_PSC3PSC2_PODRPSC3PSC26 (0x40) -+#define MCF_GPIO_PODR_PSC3PSC2_PODRPSC3PSC27 (0x80) -+ -+/* Bit definitions and macros for MCF_GPIO_PODR_PSC1PSC0 */ -+#define MCF_GPIO_PODR_PSC1PSC0_PODRPSC1PSC00 (0x01) -+#define MCF_GPIO_PODR_PSC1PSC0_PODRPSC1PSC01 (0x02) -+#define MCF_GPIO_PODR_PSC1PSC0_PODRPSC1PSC02 (0x04) -+#define MCF_GPIO_PODR_PSC1PSC0_PODRPSC1PSC03 (0x08) -+#define MCF_GPIO_PODR_PSC1PSC0_PODRPSC1PSC04 (0x10) -+#define MCF_GPIO_PODR_PSC1PSC0_PODRPSC1PSC05 (0x20) -+#define MCF_GPIO_PODR_PSC1PSC0_PODRPSC1PSC06 (0x40) -+#define MCF_GPIO_PODR_PSC1PSC0_PODRPSC1PSC07 (0x80) -+ -+/* Bit definitions and macros for MCF_GPIO_PODR_DSPI */ -+#define MCF_GPIO_PODR_DSPI_PODRDSPI0 (0x01) -+#define MCF_GPIO_PODR_DSPI_PODRDSPI1 (0x02) -+#define MCF_GPIO_PODR_DSPI_PODRDSPI2 (0x04) -+#define MCF_GPIO_PODR_DSPI_PODRDSPI3 (0x08) -+#define MCF_GPIO_PODR_DSPI_PODRDSPI4 (0x10) -+#define MCF_GPIO_PODR_DSPI_PODRDSPI5 (0x20) -+#define MCF_GPIO_PODR_DSPI_PODRDSPI6 (0x40) -+ -+/* Bit definitions and macros for MCF_GPIO_PDDR_FBCTL */ -+#define MCF_GPIO_PDDR_FBCTL_PDDRFBCTL0 (0x01) -+#define MCF_GPIO_PDDR_FBCTL_PDDRFBCTL1 (0x02) -+#define MCF_GPIO_PDDR_FBCTL_PDDRFBCTL2 (0x04) -+#define MCF_GPIO_PDDR_FBCTL_PDDRFBCTL3 (0x08) -+#define MCF_GPIO_PDDR_FBCTL_PDDRFBCTL4 (0x10) -+#define MCF_GPIO_PDDR_FBCTL_PDDRFBCTL5 (0x20) -+#define MCF_GPIO_PDDR_FBCTL_PDDRFBCTL6 (0x40) -+#define MCF_GPIO_PDDR_FBCTL_PDDRFBCTL7 (0x80) -+ -+/* Bit definitions and macros for MCF_GPIO_PDDR_FBCS */ -+#define MCF_GPIO_PDDR_FBCS_PDDRFBCS1 (0x02) -+#define MCF_GPIO_PDDR_FBCS_PDDRFBCS2 (0x04) -+#define MCF_GPIO_PDDR_FBCS_PDDRFBCS3 (0x08) -+#define MCF_GPIO_PDDR_FBCS_PDDRFBCS4 (0x10) -+#define MCF_GPIO_PDDR_FBCS_PDDRFBCS5 (0x20) -+ -+/* Bit definitions and macros for MCF_GPIO_PDDR_DMA */ -+#define MCF_GPIO_PDDR_DMA_PDDRDMA0 (0x01) -+#define MCF_GPIO_PDDR_DMA_PDDRDMA1 (0x02) -+#define MCF_GPIO_PDDR_DMA_PDDRDMA2 (0x04) -+#define MCF_GPIO_PDDR_DMA_PDDRDMA3 (0x08) -+ -+/* Bit definitions and macros for MCF_GPIO_PDDR_FEC0H */ -+#define MCF_GPIO_PDDR_FEC0H_PDDRFEC0H0 (0x01) -+#define MCF_GPIO_PDDR_FEC0H_PDDRFEC0H1 (0x02) -+#define MCF_GPIO_PDDR_FEC0H_PDDRFEC0H2 (0x04) -+#define MCF_GPIO_PDDR_FEC0H_PDDRFEC0H3 (0x08) -+#define MCF_GPIO_PDDR_FEC0H_PDDRFEC0H4 (0x10) -+#define MCF_GPIO_PDDR_FEC0H_PDDRFEC0H5 (0x20) -+#define MCF_GPIO_PDDR_FEC0H_PDDRFEC0H6 (0x40) -+#define MCF_GPIO_PDDR_FEC0H_PDDRFEC0H7 (0x80) -+ -+/* Bit definitions and macros for MCF_GPIO_PDDR_FEC0L */ -+#define MCF_GPIO_PDDR_FEC0L_PDDRFEC0L0 (0x01) -+#define MCF_GPIO_PDDR_FEC0L_PDDRFEC0L1 (0x02) -+#define MCF_GPIO_PDDR_FEC0L_PDDRFEC0L2 (0x04) -+#define MCF_GPIO_PDDR_FEC0L_PDDRFEC0L3 (0x08) -+#define MCF_GPIO_PDDR_FEC0L_PDDRFEC0L4 (0x10) -+#define MCF_GPIO_PDDR_FEC0L_PDDRFEC0L5 (0x20) -+#define MCF_GPIO_PDDR_FEC0L_PDDRFEC0L6 (0x40) -+#define MCF_GPIO_PDDR_FEC0L_PDDRFEC0L7 (0x80) -+ -+/* Bit definitions and macros for MCF_GPIO_PDDR_FEC1H */ -+#define MCF_GPIO_PDDR_FEC1H_PDDRFEC1H0 (0x01) -+#define MCF_GPIO_PDDR_FEC1H_PDDRFEC1H1 (0x02) -+#define MCF_GPIO_PDDR_FEC1H_PDDRFEC1H2 (0x04) -+#define MCF_GPIO_PDDR_FEC1H_PDDRFEC1H3 (0x08) -+#define MCF_GPIO_PDDR_FEC1H_PDDRFEC1H4 (0x10) -+#define MCF_GPIO_PDDR_FEC1H_PDDRFEC1H5 (0x20) -+#define MCF_GPIO_PDDR_FEC1H_PDDRFEC1H6 (0x40) -+#define MCF_GPIO_PDDR_FEC1H_PDDRFEC1H7 (0x80) -+ -+/* Bit definitions and macros for MCF_GPIO_PDDR_FEC1L */ -+#define MCF_GPIO_PDDR_FEC1L_PDDRFEC1L0 (0x01) -+#define MCF_GPIO_PDDR_FEC1L_PDDRFEC1L1 (0x02) -+#define MCF_GPIO_PDDR_FEC1L_PDDRFEC1L2 (0x04) -+#define MCF_GPIO_PDDR_FEC1L_PDDRFEC1L3 (0x08) -+#define MCF_GPIO_PDDR_FEC1L_PDDRFEC1L4 (0x10) -+#define MCF_GPIO_PDDR_FEC1L_PDDRFEC1L5 (0x20) -+#define MCF_GPIO_PDDR_FEC1L_PDDRFEC1L6 (0x40) -+#define MCF_GPIO_PDDR_FEC1L_PDDRFEC1L7 (0x80) -+ -+/* Bit definitions and macros for MCF_GPIO_PDDR_FECI2C */ -+#define MCF_GPIO_PDDR_FECI2C_PDDRFECI2C0 (0x01) -+#define MCF_GPIO_PDDR_FECI2C_PDDRFECI2C1 (0x02) -+#define MCF_GPIO_PDDR_FECI2C_PDDRFECI2C2 (0x04) -+#define MCF_GPIO_PDDR_FECI2C_PDDRFECI2C3 (0x08) -+ -+/* Bit definitions and macros for MCF_GPIO_PDDR_PCIBG */ -+#define MCF_GPIO_PDDR_PCIBG_PDDRPCIBG0 (0x01) -+#define MCF_GPIO_PDDR_PCIBG_PDDRPCIBG1 (0x02) -+#define MCF_GPIO_PDDR_PCIBG_PDDRPCIBG2 (0x04) -+#define MCF_GPIO_PDDR_PCIBG_PDDRPCIBG3 (0x08) -+#define MCF_GPIO_PDDR_PCIBG_PDDRPCIBG4 (0x10) -+ -+/* Bit definitions and macros for MCF_GPIO_PDDR_PCIBR */ -+#define MCF_GPIO_PDDR_PCIBR_PDDRPCIBR0 (0x01) -+#define MCF_GPIO_PDDR_PCIBR_PDDRPCIBR1 (0x02) -+#define MCF_GPIO_PDDR_PCIBR_PDDRPCIBR2 (0x04) -+#define MCF_GPIO_PDDR_PCIBR_PDDRPCIBR3 (0x08) -+#define MCF_GPIO_PDDR_PCIBR_PDDRPCIBR4 (0x10) -+ -+/* Bit definitions and macros for MCF_GPIO_PDDR_PSC3PSC2 */ -+#define MCF_GPIO_PDDR_PSC3PSC2_PDDRPSC3PSC20 (0x01) -+#define MCF_GPIO_PDDR_PSC3PSC2_PDDRPSC3PSC21 (0x02) -+#define MCF_GPIO_PDDR_PSC3PSC2_PDDRPSC3PSC22 (0x04) -+#define MCF_GPIO_PDDR_PSC3PSC2_PDDRPSC3PSC23 (0x08) -+#define MCF_GPIO_PDDR_PSC3PSC2_PDDRPSC3PSC24 (0x10) -+#define MCF_GPIO_PDDR_PSC3PSC2_PDDRPSC3PSC25 (0x20) -+#define MCF_GPIO_PDDR_PSC3PSC2_PDDRPSC3PSC26 (0x40) -+#define MCF_GPIO_PDDR_PSC3PSC2_PDDRPSC3PSC27 (0x80) -+ -+/* Bit definitions and macros for MCF_GPIO_PDDR_PSC1PSC0 */ -+#define MCF_GPIO_PDDR_PSC1PSC0_PDDRPSC1PSC00 (0x01) -+#define MCF_GPIO_PDDR_PSC1PSC0_PDDRPSC1PSC01 (0x02) -+#define MCF_GPIO_PDDR_PSC1PSC0_PDDRPSC1PSC02 (0x04) -+#define MCF_GPIO_PDDR_PSC1PSC0_PDDRPSC1PSC03 (0x08) -+#define MCF_GPIO_PDDR_PSC1PSC0_PDDRPSC1PSC04 (0x10) -+#define MCF_GPIO_PDDR_PSC1PSC0_PDDRPSC1PSC05 (0x20) -+#define MCF_GPIO_PDDR_PSC1PSC0_PDDRPSC1PSC06 (0x40) -+#define MCF_GPIO_PDDR_PSC1PSC0_PDDRPSC1PSC07 (0x80) -+ -+/* Bit definitions and macros for MCF_GPIO_PDDR_DSPI */ -+#define MCF_GPIO_PDDR_DSPI_PDDRDSPI0 (0x01) -+#define MCF_GPIO_PDDR_DSPI_PDDRDSPI1 (0x02) -+#define MCF_GPIO_PDDR_DSPI_PDDRDSPI2 (0x04) -+#define MCF_GPIO_PDDR_DSPI_PDDRDSPI3 (0x08) -+#define MCF_GPIO_PDDR_DSPI_PDDRDSPI4 (0x10) -+#define MCF_GPIO_PDDR_DSPI_PDDRDSPI5 (0x20) -+#define MCF_GPIO_PDDR_DSPI_PDDRDSPI6 (0x40) -+ -+/* Bit definitions and macros for MCF_GPIO_PPDSDR_FBCTL */ -+#define MCF_GPIO_PPDSDR_FBCTL_PPDSDRFBCTL0 (0x01) -+#define MCF_GPIO_PPDSDR_FBCTL_PPDSDRFBCTL1 (0x02) -+#define MCF_GPIO_PPDSDR_FBCTL_PPDSDRFBCTL2 (0x04) -+#define MCF_GPIO_PPDSDR_FBCTL_PPDSDRFBCTL3 (0x08) -+#define MCF_GPIO_PPDSDR_FBCTL_PPDSDRFBCTL4 (0x10) -+#define MCF_GPIO_PPDSDR_FBCTL_PPDSDRFBCTL5 (0x20) -+#define MCF_GPIO_PPDSDR_FBCTL_PPDSDRFBCTL6 (0x40) -+#define MCF_GPIO_PPDSDR_FBCTL_PPDSDRFBCTL7 (0x80) -+ -+/* Bit definitions and macros for MCF_GPIO_PPDSDR_FBCS */ -+#define MCF_GPIO_PPDSDR_FBCS_PPDSDRFBCS1 (0x02) -+#define MCF_GPIO_PPDSDR_FBCS_PPDSDRFBCS2 (0x04) -+#define MCF_GPIO_PPDSDR_FBCS_PPDSDRFBCS3 (0x08) -+#define MCF_GPIO_PPDSDR_FBCS_PPDSDRFBCS4 (0x10) -+#define MCF_GPIO_PPDSDR_FBCS_PPDSDRFBCS5 (0x20) -+ -+/* Bit definitions and macros for MCF_GPIO_PPDSDR_DMA */ -+#define MCF_GPIO_PPDSDR_DMA_PPDSDRDMA0 (0x01) -+#define MCF_GPIO_PPDSDR_DMA_PPDSDRDMA1 (0x02) -+#define MCF_GPIO_PPDSDR_DMA_PPDSDRDMA2 (0x04) -+#define MCF_GPIO_PPDSDR_DMA_PPDSDRDMA3 (0x08) -+ -+/* Bit definitions and macros for MCF_GPIO_PPDSDR_FEC0H */ -+#define MCF_GPIO_PPDSDR_FEC0H_PPDSDRFEC0H0 (0x01) -+#define MCF_GPIO_PPDSDR_FEC0H_PPDSDRFEC0H1 (0x02) -+#define MCF_GPIO_PPDSDR_FEC0H_PPDSDRFEC0H2 (0x04) -+#define MCF_GPIO_PPDSDR_FEC0H_PPDSDRFEC0H3 (0x08) -+#define MCF_GPIO_PPDSDR_FEC0H_PPDSDRFEC0H4 (0x10) -+#define MCF_GPIO_PPDSDR_FEC0H_PPDSDRFEC0H5 (0x20) -+#define MCF_GPIO_PPDSDR_FEC0H_PPDSDRFEC0H6 (0x40) -+#define MCF_GPIO_PPDSDR_FEC0H_PPDSDRFEC0H7 (0x80) -+ -+/* Bit definitions and macros for MCF_GPIO_PPDSDR_FEC0L */ -+#define MCF_GPIO_PPDSDR_FEC0L_PPDSDRFEC0L0 (0x01) -+#define MCF_GPIO_PPDSDR_FEC0L_PPDSDRFEC0L1 (0x02) -+#define MCF_GPIO_PPDSDR_FEC0L_PPDSDRFEC0L2 (0x04) -+#define MCF_GPIO_PPDSDR_FEC0L_PPDSDRFEC0L3 (0x08) -+#define MCF_GPIO_PPDSDR_FEC0L_PPDSDRFEC0L4 (0x10) -+#define MCF_GPIO_PPDSDR_FEC0L_PPDSDRFEC0L5 (0x20) -+#define MCF_GPIO_PPDSDR_FEC0L_PPDSDRFEC0L6 (0x40) -+#define MCF_GPIO_PPDSDR_FEC0L_PPDSDRFEC0L7 (0x80) -+ -+/* Bit definitions and macros for MCF_GPIO_PPDSDR_FEC1H */ -+#define MCF_GPIO_PPDSDR_FEC1H_PPDSDRFEC1H0 (0x01) -+#define MCF_GPIO_PPDSDR_FEC1H_PPDSDRFEC1H1 (0x02) -+#define MCF_GPIO_PPDSDR_FEC1H_PPDSDRFEC1H2 (0x04) -+#define MCF_GPIO_PPDSDR_FEC1H_PPDSDRFEC1H3 (0x08) -+#define MCF_GPIO_PPDSDR_FEC1H_PPDSDRFEC1H4 (0x10) -+#define MCF_GPIO_PPDSDR_FEC1H_PPDSDRFEC1H5 (0x20) -+#define MCF_GPIO_PPDSDR_FEC1H_PPDSDRFEC1H6 (0x40) -+#define MCF_GPIO_PPDSDR_FEC1H_PPDSDRFEC1H7 (0x80) -+ -+/* Bit definitions and macros for MCF_GPIO_PPDSDR_FEC1L */ -+#define MCF_GPIO_PPDSDR_FEC1L_PPDSDRFEC1L0 (0x01) -+#define MCF_GPIO_PPDSDR_FEC1L_PPDSDRFEC1L1 (0x02) -+#define MCF_GPIO_PPDSDR_FEC1L_PPDSDRFEC1L2 (0x04) -+#define MCF_GPIO_PPDSDR_FEC1L_PPDSDRFEC1L3 (0x08) -+#define MCF_GPIO_PPDSDR_FEC1L_PPDSDRFEC1L4 (0x10) -+#define MCF_GPIO_PPDSDR_FEC1L_PPDSDRFEC1L5 (0x20) -+#define MCF_GPIO_PPDSDR_FEC1L_PPDSDRFEC1L6 (0x40) -+#define MCF_GPIO_PPDSDR_FEC1L_PPDSDRFEC1L7 (0x80) -+ -+/* Bit definitions and macros for MCF_GPIO_PPDSDR_FECI2C */ -+#define MCF_GPIO_PPDSDR_FECI2C_PPDSDRFECI2C0 (0x01) -+#define MCF_GPIO_PPDSDR_FECI2C_PPDSDRFECI2C1 (0x02) -+#define MCF_GPIO_PPDSDR_FECI2C_PPDSDRFECI2C2 (0x04) -+#define MCF_GPIO_PPDSDR_FECI2C_PPDSDRFECI2C3 (0x08) -+ -+/* Bit definitions and macros for MCF_GPIO_PPDSDR_PCIBG */ -+#define MCF_GPIO_PPDSDR_PCIBG_PPDSDRPCIBG0 (0x01) -+#define MCF_GPIO_PPDSDR_PCIBG_PPDSDRPCIBG1 (0x02) -+#define MCF_GPIO_PPDSDR_PCIBG_PPDSDRPCIBG2 (0x04) -+#define MCF_GPIO_PPDSDR_PCIBG_PPDSDRPCIBG3 (0x08) -+#define MCF_GPIO_PPDSDR_PCIBG_PPDSDRPCIBG4 (0x10) -+ -+/* Bit definitions and macros for MCF_GPIO_PPDSDR_PCIBR */ -+#define MCF_GPIO_PPDSDR_PCIBR_PPDSDRPCIBR0 (0x01) -+#define MCF_GPIO_PPDSDR_PCIBR_PPDSDRPCIBR1 (0x02) -+#define MCF_GPIO_PPDSDR_PCIBR_PPDSDRPCIBR2 (0x04) -+#define MCF_GPIO_PPDSDR_PCIBR_PPDSDRPCIBR3 (0x08) -+#define MCF_GPIO_PPDSDR_PCIBR_PPDSDRPCIBR4 (0x10) -+ -+/* Bit definitions and macros for MCF_GPIO_PPDSDR_PSC3PSC2 */ -+#define MCF_GPIO_PPDSDR_PSC3PSC2_PPDSDRPSC3PSC20 (0x01) -+#define MCF_GPIO_PPDSDR_PSC3PSC2_PPDSDRPSC3PSC21 (0x02) -+#define MCF_GPIO_PPDSDR_PSC3PSC2_PPDSDRPSC3PSC22 (0x04) -+#define MCF_GPIO_PPDSDR_PSC3PSC2_PPDSDRPSC3PSC23 (0x08) -+#define MCF_GPIO_PPDSDR_PSC3PSC2_PDDRPSC3PSC24 (0x10) -+#define MCF_GPIO_PPDSDR_PSC3PSC2_PDDRPSC3PSC25 (0x20) -+#define MCF_GPIO_PPDSDR_PSC3PSC2_PPDSDRPSC3PSC26 (0x40) -+#define MCF_GPIO_PPDSDR_PSC3PSC2_PPDSDRPSC3PSC27 (0x80) -+ -+/* Bit definitions and macros for MCF_GPIO_PPDSDR_PSC1PSC0 */ -+#define MCF_GPIO_PPDSDR_PSC1PSC0_PPDSDRPSC1PSC00 (0x01) -+#define MCF_GPIO_PPDSDR_PSC1PSC0_PDDRPSC1PSC01 (0x02) -+#define MCF_GPIO_PPDSDR_PSC1PSC0_PPDSDRPSC1PSC02 (0x04) -+#define MCF_GPIO_PPDSDR_PSC1PSC0_PDDRPSC1PSC03 (0x08) -+#define MCF_GPIO_PPDSDR_PSC1PSC0_PPDSDRPSC1PSC04 (0x10) -+#define MCF_GPIO_PPDSDR_PSC1PSC0_PPDSDRPSC1PSC05 (0x20) -+#define MCF_GPIO_PPDSDR_PSC1PSC0_PPDSDRPSC1PSC06 (0x40) -+#define MCF_GPIO_PPDSDR_PSC1PSC0_PPDSDRPSC1PSC07 (0x80) -+ -+/* Bit definitions and macros for MCF_GPIO_PPDSDR_DSPI */ -+#define MCF_GPIO_PPDSDR_DSPI_PPDSDRDSPI0 (0x01) -+#define MCF_GPIO_PPDSDR_DSPI_PPDSDRDSPI1 (0x02) -+#define MCF_GPIO_PPDSDR_DSPI_PPDSDRDSPI2 (0x04) -+#define MCF_GPIO_PPDSDR_DSPI_PPDSDRDSPI3 (0x08) -+#define MCF_GPIO_PPDSDR_DSPI_PDDRDSPI4 (0x10) -+#define MCF_GPIO_PPDSDR_DSPI_PPDSDRDSPI5 (0x20) -+#define MCF_GPIO_PPDSDR_DSPI_PPDSDRDSPI6 (0x40) -+ -+/* Bit definitions and macros for MCF_GPIO_PCLRR_FBCTL */ -+#define MCF_GPIO_PCLRR_FBCTL_PCLRRFBCTL0 (0x01) -+#define MCF_GPIO_PCLRR_FBCTL_PCLRRFBCTL1 (0x02) -+#define MCF_GPIO_PCLRR_FBCTL_PCLRRFBCTL2 (0x04) -+#define MCF_GPIO_PCLRR_FBCTL_PCLRRFBCTL3 (0x08) -+#define MCF_GPIO_PCLRR_FBCTL_PCLRRFBCTL4 (0x10) -+#define MCF_GPIO_PCLRR_FBCTL_PCLRRFBCTL5 (0x20) -+#define MCF_GPIO_PCLRR_FBCTL_PCLRRFBCTL6 (0x40) -+#define MCF_GPIO_PCLRR_FBCTL_PCLRRFBCTL7 (0x80) -+ -+/* Bit definitions and macros for MCF_GPIO_PCLRR_FBCS */ -+#define MCF_GPIO_PCLRR_FBCS_PCLRRFBCS1 (0x02) -+#define MCF_GPIO_PCLRR_FBCS_PCLRRFBCS2 (0x04) -+#define MCF_GPIO_PCLRR_FBCS_PCLRRFBCS3 (0x08) -+#define MCF_GPIO_PCLRR_FBCS_PCLRRFBCS4 (0x10) -+#define MCF_GPIO_PCLRR_FBCS_PCLRRFBCS5 (0x20) -+ -+/* Bit definitions and macros for MCF_GPIO_PCLRR_DMA */ -+#define MCF_GPIO_PCLRR_DMA_PCLRRDMA0 (0x01) -+#define MCF_GPIO_PCLRR_DMA_PCLRRDMA1 (0x02) -+#define MCF_GPIO_PCLRR_DMA_PCLRRDMA2 (0x04) -+#define MCF_GPIO_PCLRR_DMA_PCLRRDMA3 (0x08) -+ -+/* Bit definitions and macros for MCF_GPIO_PCLRR_FEC0H */ -+#define MCF_GPIO_PCLRR_FEC0H_PCLRRFEC0H0 (0x01) -+#define MCF_GPIO_PCLRR_FEC0H_PCLRRFEC0H1 (0x02) -+#define MCF_GPIO_PCLRR_FEC0H_PCLRRFEC0H2 (0x04) -+#define MCF_GPIO_PCLRR_FEC0H_PCLRRFEC0H3 (0x08) -+#define MCF_GPIO_PCLRR_FEC0H_PCLRRFEC0H4 (0x10) -+#define MCF_GPIO_PCLRR_FEC0H_PCLRRFEC0H5 (0x20) -+#define MCF_GPIO_PCLRR_FEC0H_PCLRRFEC0H6 (0x40) -+#define MCF_GPIO_PCLRR_FEC0H_PCLRRFEC0H7 (0x80) -+ -+/* Bit definitions and macros for MCF_GPIO_PCLRR_FEC0L */ -+#define MCF_GPIO_PCLRR_FEC0L_PCLRRFEC0L0 (0x01) -+#define MCF_GPIO_PCLRR_FEC0L_PODRFEC0L1 (0x02) -+#define MCF_GPIO_PCLRR_FEC0L_PCLRRFEC0L2 (0x04) -+#define MCF_GPIO_PCLRR_FEC0L_PCLRRFEC0L3 (0x08) -+#define MCF_GPIO_PCLRR_FEC0L_PODRFEC0L4 (0x10) -+#define MCF_GPIO_PCLRR_FEC0L_PODRFEC0L5 (0x20) -+#define MCF_GPIO_PCLRR_FEC0L_PODRFEC0L6 (0x40) -+#define MCF_GPIO_PCLRR_FEC0L_PCLRRFEC0L7 (0x80) -+ -+/* Bit definitions and macros for MCF_GPIO_PCLRR_FEC1H */ -+#define MCF_GPIO_PCLRR_FEC1H_PCLRRFEC1H0 (0x01) -+#define MCF_GPIO_PCLRR_FEC1H_PCLRRFEC1H1 (0x02) -+#define MCF_GPIO_PCLRR_FEC1H_PCLRRFEC1H2 (0x04) -+#define MCF_GPIO_PCLRR_FEC1H_PODRFEC1H3 (0x08) -+#define MCF_GPIO_PCLRR_FEC1H_PODRFEC1H4 (0x10) -+#define MCF_GPIO_PCLRR_FEC1H_PCLRRFEC1H5 (0x20) -+#define MCF_GPIO_PCLRR_FEC1H_PCLRRFEC1H6 (0x40) -+#define MCF_GPIO_PCLRR_FEC1H_PCLRRFEC1H7 (0x80) -+ -+/* Bit definitions and macros for MCF_GPIO_PCLRR_FEC1L */ -+#define MCF_GPIO_PCLRR_FEC1L_PCLRRFEC1L0 (0x01) -+#define MCF_GPIO_PCLRR_FEC1L_PCLRRFEC1L1 (0x02) -+#define MCF_GPIO_PCLRR_FEC1L_PCLRRFEC1L2 (0x04) -+#define MCF_GPIO_PCLRR_FEC1L_PCLRRFEC1L3 (0x08) -+#define MCF_GPIO_PCLRR_FEC1L_PODRFEC1L4 (0x10) -+#define MCF_GPIO_PCLRR_FEC1L_PCLRRFEC1L5 (0x20) -+#define MCF_GPIO_PCLRR_FEC1L_PCLRRFEC1L6 (0x40) -+#define MCF_GPIO_PCLRR_FEC1L_PCLRRFEC1L7 (0x80) -+ -+/* Bit definitions and macros for MCF_GPIO_PCLRR_FECI2C */ -+#define MCF_GPIO_PCLRR_FECI2C_PCLRRFECI2C0 (0x01) -+#define MCF_GPIO_PCLRR_FECI2C_PCLRRFECI2C1 (0x02) -+#define MCF_GPIO_PCLRR_FECI2C_PODRFECI2C2 (0x04) -+#define MCF_GPIO_PCLRR_FECI2C_PCLRRFECI2C3 (0x08) -+ -+/* Bit definitions and macros for MCF_GPIO_PCLRR_PCIBG */ -+#define MCF_GPIO_PCLRR_PCIBG_PODRPCIBG0 (0x01) -+#define MCF_GPIO_PCLRR_PCIBG_PODRPCIBG1 (0x02) -+#define MCF_GPIO_PCLRR_PCIBG_PODRPCIBG2 (0x04) -+#define MCF_GPIO_PCLRR_PCIBG_PCLRRPCIBG3 (0x08) -+#define MCF_GPIO_PCLRR_PCIBG_PCLRRPCIBG4 (0x10) -+ -+/* Bit definitions and macros for MCF_GPIO_PCLRR_PCIBR */ -+#define MCF_GPIO_PCLRR_PCIBR_PCLRRPCIBR0 (0x01) -+#define MCF_GPIO_PCLRR_PCIBR_PCLRRPCIBR1 (0x02) -+#define MCF_GPIO_PCLRR_PCIBR_PCLRRPCIBR2 (0x04) -+#define MCF_GPIO_PCLRR_PCIBR_PODRPCIBR3 (0x08) -+#define MCF_GPIO_PCLRR_PCIBR_PODRPCIBR4 (0x10) -+ -+/* Bit definitions and macros for MCF_GPIO_PCLRR_PSC3PSC2 */ -+#define MCF_GPIO_PCLRR_PSC3PSC2_PODRPSC3PSC20 (0x01) -+#define MCF_GPIO_PCLRR_PSC3PSC2_PODRPSC3PSC21 (0x02) -+#define MCF_GPIO_PCLRR_PSC3PSC2_PCLRRPSC3PSC22 (0x04) -+#define MCF_GPIO_PCLRR_PSC3PSC2_PCLRRPSC3PSC23 (0x08) -+#define MCF_GPIO_PCLRR_PSC3PSC2_PCLRRPSC3PSC24 (0x10) -+#define MCF_GPIO_PCLRR_PSC3PSC2_PODRPSC3PSC25 (0x20) -+#define MCF_GPIO_PCLRR_PSC3PSC2_PODRPSC3PSC26 (0x40) -+#define MCF_GPIO_PCLRR_PSC3PSC2_PCLRRPSC3PSC27 (0x80) -+ -+/* Bit definitions and macros for MCF_GPIO_PCLRR_PSC1PSC0 */ -+#define MCF_GPIO_PCLRR_PSC1PSC0_PCLRRPSC1PSC00 (0x01) -+#define MCF_GPIO_PCLRR_PSC1PSC0_PCLRRPSC1PSC01 (0x02) -+#define MCF_GPIO_PCLRR_PSC1PSC0_PCLRRPSC1PSC02 (0x04) -+#define MCF_GPIO_PCLRR_PSC1PSC0_PCLRRPSC1PSC03 (0x08) -+#define MCF_GPIO_PCLRR_PSC1PSC0_PCLRRPSC1PSC04 (0x10) -+#define MCF_GPIO_PCLRR_PSC1PSC0_PCLRRPSC1PSC05 (0x20) -+#define MCF_GPIO_PCLRR_PSC1PSC0_PODRPSC1PSC06 (0x40) -+#define MCF_GPIO_PCLRR_PSC1PSC0_PCLRRPSC1PSC07 (0x80) -+ -+/* Bit definitions and macros for MCF_GPIO_PCLRR_DSPI */ -+#define MCF_GPIO_PCLRR_DSPI_PCLRRDSPI0 (0x01) -+#define MCF_GPIO_PCLRR_DSPI_PCLRRDSPI1 (0x02) -+#define MCF_GPIO_PCLRR_DSPI_PCLRRDSPI2 (0x04) -+#define MCF_GPIO_PCLRR_DSPI_PCLRRDSPI3 (0x08) -+#define MCF_GPIO_PCLRR_DSPI_PCLRRDSPI4 (0x10) -+#define MCF_GPIO_PCLRR_DSPI_PCLRRDSPI5 (0x20) -+#define MCF_GPIO_PCLRR_DSPI_PCLRRDSPI6 (0x40) -+ -+/* Bit definitions and macros for MCF_GPIO_PAR_FBCTL */ -+#define MCF_GPIO_PAR_FBCTL_PAR_TS(x) (((x)&0x0003)<<0) -+#define MCF_GPIO_PAR_FBCTL_PAR_TA (0x0004) -+#define MCF_GPIO_PAR_FBCTL_PAR_RWB (0x0010) -+#define MCF_GPIO_PAR_FBCTL_PAR_OE (0x0040) -+#define MCF_GPIO_PAR_FBCTL_PAR_BWE0 (0x0100) -+#define MCF_GPIO_PAR_FBCTL_PAR_BWE1 (0x0400) -+#define MCF_GPIO_PAR_FBCTL_PAR_BWE2 (0x1000) -+#define MCF_GPIO_PAR_FBCTL_PAR_BWE3 (0x4000) -+#define MCF_GPIO_PAR_FBCTL_PAR_TS_GPIO (0) -+#define MCF_GPIO_PAR_FBCTL_PAR_TS_TBST (2) -+#define MCF_GPIO_PAR_FBCTL_PAR_TS_TS (3) -+ -+/* Bit definitions and macros for MCF_GPIO_PAR_FBCS */ -+#define MCF_GPIO_PAR_FBCS_PAR_CS1 (0x02) -+#define MCF_GPIO_PAR_FBCS_PAR_CS2 (0x04) -+#define MCF_GPIO_PAR_FBCS_PAR_CS3 (0x08) -+#define MCF_GPIO_PAR_FBCS_PAR_CS4 (0x10) -+#define MCF_GPIO_PAR_FBCS_PAR_CS5 (0x20) -+ -+/* Bit definitions and macros for MCF_GPIO_PAR_DMA */ -+#define MCF_GPIO_PAR_DMA_PAR_DREQ0(x) (((x)&0x03)<<0) -+#define MCF_GPIO_PAR_DMA_PAR_DREQ1(x) (((x)&0x03)<<2) -+#define MCF_GPIO_PAR_DMA_PAR_DACK0(x) (((x)&0x03)<<4) -+#define MCF_GPIO_PAR_DMA_PAR_DACK1(x) (((x)&0x03)<<6) -+#define MCF_GPIO_PAR_DMA_PAR_DACKx_GPIO (0) -+#define MCF_GPIO_PAR_DMA_PAR_DACKx_TOUT (2) -+#define MCF_GPIO_PAR_DMA_PAR_DACKx_DACK (3) -+#define MCF_GPIO_PAR_DMA_PAR_DREQx_GPIO (0) -+#define MCF_GPIO_PAR_DMA_PAR_DREQx_TIN (2) -+#define MCF_GPIO_PAR_DMA_PAR_DREQx_DREQ (3) -+ -+/* Bit definitions and macros for MCF_GPIO_PAR_FECI2CIRQ */ -+#define MCF_GPIO_PAR_FECI2CIRQ_PAR_IRQ5 (0x0001) -+#define MCF_GPIO_PAR_FECI2CIRQ_PAR_IRQ6 (0x0002) -+#define MCF_GPIO_PAR_FECI2CIRQ_PAR_SCL (0x0004) -+#define MCF_GPIO_PAR_FECI2CIRQ_PAR_SDA (0x0008) -+#define MCF_GPIO_PAR_FECI2CIRQ_PAR_E1MDC(x) (((x)&0x0003)<<6) -+#define MCF_GPIO_PAR_FECI2CIRQ_PAR_E1MDIO(x) (((x)&0x0003)<<8) -+#define MCF_GPIO_PAR_FECI2CIRQ_PAR_E1MII (0x0400) -+#define MCF_GPIO_PAR_FECI2CIRQ_PAR_E17 (0x0800) -+#define MCF_GPIO_PAR_FECI2CIRQ_PAR_E0MDC (0x1000) -+#define MCF_GPIO_PAR_FECI2CIRQ_PAR_E0MDIO (0x2000) -+#define MCF_GPIO_PAR_FECI2CIRQ_PAR_E0MII (0x4000) -+#define MCF_GPIO_PAR_FECI2CIRQ_PAR_E07 (0x8000) -+#define MCF_GPIO_PAR_FECI2CIRQ_PAR_E1MDIO_CANRX (0x0000) -+#define MCF_GPIO_PAR_FECI2CIRQ_PAR_E1MDIO_SDA (0x0200) -+#define MCF_GPIO_PAR_FECI2CIRQ_PAR_E1MDIO_EMDIO (0x0300) -+#define MCF_GPIO_PAR_FECI2CIRQ_PAR_E1MDC_CANTX (0x0000) -+#define MCF_GPIO_PAR_FECI2CIRQ_PAR_E1MDC_SCL (0x0080) -+#define MCF_GPIO_PAR_FECI2CIRQ_PAR_E1MDC_EMDC (0x00C0) -+ -+/* Bit definitions and macros for MCF_GPIO_PAR_PCIBG */ -+#define MCF_GPIO_PAR_PCIBG_PAR_PCIBG0(x) (((x)&0x0003)<<0) -+#define MCF_GPIO_PAR_PCIBG_PAR_PCIBG1(x) (((x)&0x0003)<<2) -+#define MCF_GPIO_PAR_PCIBG_PAR_PCIBG2(x) (((x)&0x0003)<<4) -+#define MCF_GPIO_PAR_PCIBG_PAR_PCIBG3(x) (((x)&0x0003)<<6) -+#define MCF_GPIO_PAR_PCIBG_PAR_PCIBG4(x) (((x)&0x0003)<<8) -+ -+/* Bit definitions and macros for MCF_GPIO_PAR_PCIBR */ -+#define MCF_GPIO_PAR_PCIBR_PAR_PCIBG0(x) (((x)&0x0003)<<0) -+#define MCF_GPIO_PAR_PCIBR_PAR_PCIBG1(x) (((x)&0x0003)<<2) -+#define MCF_GPIO_PAR_PCIBR_PAR_PCIBG2(x) (((x)&0x0003)<<4) -+#define MCF_GPIO_PAR_PCIBR_PAR_PCIBG3(x) (((x)&0x0003)<<6) -+#define MCF_GPIO_PAR_PCIBR_PAR_PCIBR4(x) (((x)&0x0003)<<8) -+ -+/* Bit definitions and macros for MCF_GPIO_PAR_PSC3 */ -+#define MCF_GPIO_PAR_PSC3_PAR_TXD3 (0x04) -+#define MCF_GPIO_PAR_PSC3_PAR_RXD3 (0x08) -+#define MCF_GPIO_PAR_PSC3_PAR_RTS3(x) (((x)&0x03)<<4) -+#define MCF_GPIO_PAR_PSC3_PAR_CTS3(x) (((x)&0x03)<<6) -+#define MCF_GPIO_PAR_PSC3_PAR_CTS3_GPIO (0x00) -+#define MCF_GPIO_PAR_PSC3_PAR_CTS3_BCLK (0x80) -+#define MCF_GPIO_PAR_PSC3_PAR_CTS3_CTS (0xC0) -+#define MCF_GPIO_PAR_PSC3_PAR_RTS3_GPIO (0x00) -+#define MCF_GPIO_PAR_PSC3_PAR_RTS3_FSYNC (0x20) -+#define MCF_GPIO_PAR_PSC3_PAR_RTS3_RTS (0x30) -+#define MCF_GPIO_PAR_PSC3_PAR_CTS2_CANRX (0x40) -+ -+/* Bit definitions and macros for MCF_GPIO_PAR_PSC2 */ -+#define MCF_GPIO_PAR_PSC2_PAR_TXD2 (0x04) -+#define MCF_GPIO_PAR_PSC2_PAR_RXD2 (0x08) -+#define MCF_GPIO_PAR_PSC2_PAR_RTS2(x) (((x)&0x03)<<4) -+#define MCF_GPIO_PAR_PSC2_PAR_CTS2(x) (((x)&0x03)<<6) -+#define MCF_GPIO_PAR_PSC2_PAR_CTS2_GPIO (0x00) -+#define MCF_GPIO_PAR_PSC2_PAR_CTS2_BCLK (0x80) -+#define MCF_GPIO_PAR_PSC2_PAR_CTS2_CTS (0xC0) -+#define MCF_GPIO_PAR_PSC2_PAR_RTS2_GPIO (0x00) -+#define MCF_GPIO_PAR_PSC2_PAR_RTS2_CANTX (0x10) -+#define MCF_GPIO_PAR_PSC2_PAR_RTS2_FSYNC (0x20) -+#define MCF_GPIO_PAR_PSC2_PAR_RTS2_RTS (0x30) -+#define MCF_GPIO_PAR_PSC2_PAR_RTS2_CANRX (0x40) -+ -+/* Bit definitions and macros for MCF_GPIO_PAR_PSC1 */ -+#define MCF_GPIO_PAR_PSC1_PAR_TXD1 (0x04) -+#define MCF_GPIO_PAR_PSC1_PAR_RXD1 (0x08) -+#define MCF_GPIO_PAR_PSC1_PAR_RTS1(x) (((x)&0x03)<<4) -+#define MCF_GPIO_PAR_PSC1_PAR_CTS1(x) (((x)&0x03)<<6) -+#define MCF_GPIO_PAR_PSC1_PAR_CTS1_GPIO (0x00) -+#define MCF_GPIO_PAR_PSC1_PAR_CTS1_BCLK (0x80) -+#define MCF_GPIO_PAR_PSC1_PAR_CTS1_CTS (0xC0) -+#define MCF_GPIO_PAR_PSC1_PAR_RTS1_GPIO (0x00) -+#define MCF_GPIO_PAR_PSC1_PAR_RTS1_FSYNC (0x20) -+#define MCF_GPIO_PAR_PSC1_PAR_RTS1_RTS (0x30) -+ -+/* Bit definitions and macros for MCF_GPIO_PAR_PSC0 */ -+#define MCF_GPIO_PAR_PSC0_PAR_TXD0 (0x04) -+#define MCF_GPIO_PAR_PSC0_PAR_RXD0 (0x08) -+#define MCF_GPIO_PAR_PSC0_PAR_RTS0(x) (((x)&0x03)<<4) -+#define MCF_GPIO_PAR_PSC0_PAR_CTS0(x) (((x)&0x03)<<6) -+#define MCF_GPIO_PAR_PSC0_PAR_CTS0_GPIO (0x00) -+#define MCF_GPIO_PAR_PSC0_PAR_CTS0_BCLK (0x80) -+#define MCF_GPIO_PAR_PSC0_PAR_CTS0_CTS (0xC0) -+#define MCF_GPIO_PAR_PSC0_PAR_RTS0_GPIO (0x00) -+#define MCF_GPIO_PAR_PSC0_PAR_RTS0_FSYNC (0x20) -+#define MCF_GPIO_PAR_PSC0_PAR_RTS0_RTS (0x30) -+ -+/* Bit definitions and macros for MCF_GPIO_PAR_DSPI */ -+#define MCF_GPIO_PAR_DSPI_PAR_SOUT(x) (((x)&0x0003)<<0) -+#define MCF_GPIO_PAR_DSPI_PAR_SIN(x) (((x)&0x0003)<<2) -+#define MCF_GPIO_PAR_DSPI_PAR_SCK(x) (((x)&0x0003)<<4) -+#define MCF_GPIO_PAR_DSPI_PAR_CS0(x) (((x)&0x0003)<<6) -+#define MCF_GPIO_PAR_DSPI_PAR_CS2(x) (((x)&0x0003)<<8) -+#define MCF_GPIO_PAR_DSPI_PAR_CS3(x) (((x)&0x0003)<<10) -+#define MCF_GPIO_PAR_DSPI_PAR_CS5 (0x1000) -+#define MCF_GPIO_PAR_DSPI_PAR_CS3_GPIO (0x0000) -+#define MCF_GPIO_PAR_DSPI_PAR_CS3_CANTX (0x0400) -+#define MCF_GPIO_PAR_DSPI_PAR_CS3_TOUT (0x0800) -+#define MCF_GPIO_PAR_DSPI_PAR_CS3_DSPICS (0x0C00) -+#define MCF_GPIO_PAR_DSPI_PAR_CS2_GPIO (0x0000) -+#define MCF_GPIO_PAR_DSPI_PAR_CS2_CANTX (0x0100) -+#define MCF_GPIO_PAR_DSPI_PAR_CS2_TOUT (0x0200) -+#define MCF_GPIO_PAR_DSPI_PAR_CS2_DSPICS (0x0300) -+#define MCF_GPIO_PAR_DSPI_PAR_CS0_GPIO (0x0000) -+#define MCF_GPIO_PAR_DSPI_PAR_CS0_FSYNC (0x0040) -+#define MCF_GPIO_PAR_DSPI_PAR_CS0_RTS (0x0080) -+#define MCF_GPIO_PAR_DSPI_PAR_CS0_DSPICS (0x00C0) -+#define MCF_GPIO_PAR_DSPI_PAR_SCK_GPIO (0x0000) -+#define MCF_GPIO_PAR_DSPI_PAR_SCK_BCLK (0x0010) -+#define MCF_GPIO_PAR_DSPI_PAR_SCK_CTS (0x0020) -+#define MCF_GPIO_PAR_DSPI_PAR_SCK_SCK (0x0030) -+#define MCF_GPIO_PAR_DSPI_PAR_SIN_GPIO (0x0000) -+#define MCF_GPIO_PAR_DSPI_PAR_SIN_RXD (0x0008) -+#define MCF_GPIO_PAR_DSPI_PAR_SIN_SIN (0x000C) -+#define MCF_GPIO_PAR_DSPI_PAR_SOUT_GPIO (0x0000) -+#define MCF_GPIO_PAR_DSPI_PAR_SOUT_TXD (0x0002) -+#define MCF_GPIO_PAR_DSPI_PAR_SOUT_SOUT (0x0003) -+ -+/* Bit definitions and macros for MCF_GPIO_PAR_TIMER */ -+#define MCF_GPIO_PAR_TIMER_PAR_TOUT2 (0x01) -+#define MCF_GPIO_PAR_TIMER_PAR_TIN2(x) (((x)&0x03)<<1) -+#define MCF_GPIO_PAR_TIMER_PAR_TOUT3 (0x08) -+#define MCF_GPIO_PAR_TIMER_PAR_TIN3(x) (((x)&0x03)<<4) -+#define MCF_GPIO_PAR_TIMER_PAR_TIN3_CANRX (0x00) -+#define MCF_GPIO_PAR_TIMER_PAR_TIN3_IRQ (0x20) -+#define MCF_GPIO_PAR_TIMER_PAR_TIN3_TIN (0x30) -+#define MCF_GPIO_PAR_TIMER_PAR_TIN2_CANRX (0x00) -+#define MCF_GPIO_PAR_TIMER_PAR_TIN2_IRQ (0x04) -+#define MCF_GPIO_PAR_TIMER_PAR_TIN2_TIN (0x06) -+ -+/********************************************************************/ -+ -+#endif /* _M5485GPIO_H_ */ ---- /dev/null -+++ b/include/asm-m68k/m5485gpt.h -@@ -0,0 +1,88 @@ -+/* -+ * File: mcf548x_gpt.h -+ * Purpose: Register and bit definitions for the MCF548X -+ * -+ * Notes: -+ * -+ */ -+ -+#ifndef __MCF548X_GPT_H__ -+#define __MCF548X_GPT_H__ -+ -+/********************************************************************* -+* -+* General Purpose Timers (GPT) -+* -+*********************************************************************/ -+ -+/* Register read/write macros */ -+#define MCF_GPT_GMS0 MCF_REG32(0x000800) -+#define MCF_GPT_GCIR0 MCF_REG32(0x000804) -+#define MCF_GPT_GPWM0 MCF_REG32(0x000808) -+#define MCF_GPT_GSR0 MCF_REG32(0x00080C) -+#define MCF_GPT_GMS1 MCF_REG32(0x000810) -+#define MCF_GPT_GCIR1 MCF_REG32(0x000814) -+#define MCF_GPT_GPWM1 MCF_REG32(0x000818) -+#define MCF_GPT_GSR1 MCF_REG32(0x00081C) -+#define MCF_GPT_GMS2 MCF_REG32(0x000820) -+#define MCF_GPT_GCIR2 MCF_REG32(0x000824) -+#define MCF_GPT_GPWM2 MCF_REG32(0x000828) -+#define MCF_GPT_GSR2 MCF_REG32(0x00082C) -+#define MCF_GPT_GMS3 MCF_REG32(0x000830) -+#define MCF_GPT_GCIR3 MCF_REG32(0x000834) -+#define MCF_GPT_GPWM3 MCF_REG32(0x000838) -+#define MCF_GPT_GSR3 MCF_REG32(0x00083C) -+#define MCF_GPT_GMS(x) MCF_REG32(0x000800+((x)*0x010)) -+#define MCF_GPT_GCIR(x) MCF_REG32(0x000804+((x)*0x010)) -+#define MCF_GPT_GPWM(x) MCF_REG32(0x000808+((x)*0x010)) -+#define MCF_GPT_GSR(x) MCF_REG32(0x00080C+((x)*0x010)) -+ -+/* Bit definitions and macros for MCF_GPT_GMS */ -+#define MCF_GPT_GMS_TMS(x) (((x)&0x00000007)<<0) -+#define MCF_GPT_GMS_GPIO(x) (((x)&0x00000003)<<4) -+#define MCF_GPT_GMS_IEN (0x00000100) -+#define MCF_GPT_GMS_OD (0x00000200) -+#define MCF_GPT_GMS_SC (0x00000400) -+#define MCF_GPT_GMS_CE (0x00001000) -+#define MCF_GPT_GMS_WDEN (0x00008000) -+#define MCF_GPT_GMS_ICT(x) (((x)&0x00000003)<<16) -+#define MCF_GPT_GMS_OCT(x) (((x)&0x00000003)<<20) -+#define MCF_GPT_GMS_OCPW(x) (((x)&0x000000FF)<<24) -+#define MCF_GPT_GMS_OCT_FRCLOW (0x00000000) -+#define MCF_GPT_GMS_OCT_PULSEHI (0x00100000) -+#define MCF_GPT_GMS_OCT_PULSELO (0x00200000) -+#define MCF_GPT_GMS_OCT_TOGGLE (0x00300000) -+#define MCF_GPT_GMS_ICT_ANY (0x00000000) -+#define MCF_GPT_GMS_ICT_RISE (0x00010000) -+#define MCF_GPT_GMS_ICT_FALL (0x00020000) -+#define MCF_GPT_GMS_ICT_PULSE (0x00030000) -+#define MCF_GPT_GMS_GPIO_INPUT (0x00000000) -+#define MCF_GPT_GMS_GPIO_OUTLO (0x00000020) -+#define MCF_GPT_GMS_GPIO_OUTHI (0x00000030) -+#define MCF_GPT_GMS_TMS_DISABLE (0x00000000) -+#define MCF_GPT_GMS_TMS_INCAPT (0x00000001) -+#define MCF_GPT_GMS_TMS_OUTCAPT (0x00000002) -+#define MCF_GPT_GMS_TMS_PWM (0x00000003) -+#define MCF_GPT_GMS_TMS_GPIO (0x00000004) -+ -+/* Bit definitions and macros for MCF_GPT_GCIR */ -+#define MCF_GPT_GCIR_CNT(x) (((x)&0x0000FFFF)<<0) -+#define MCF_GPT_GCIR_PRE(x) (((x)&0x0000FFFF)<<16) -+ -+/* Bit definitions and macros for MCF_GPT_GPWM */ -+#define MCF_GPT_GPWM_LOAD (0x00000001) -+#define MCF_GPT_GPWM_PWMOP (0x00000100) -+#define MCF_GPT_GPWM_WIDTH(x) (((x)&0x0000FFFF)<<16) -+ -+/* Bit definitions and macros for MCF_GPT_GSR */ -+#define MCF_GPT_GSR_CAPT (0x00000001) -+#define MCF_GPT_GSR_COMP (0x00000002) -+#define MCF_GPT_GSR_PWMP (0x00000004) -+#define MCF_GPT_GSR_TEXP (0x00000008) -+#define MCF_GPT_GSR_PIN (0x00000100) -+#define MCF_GPT_GSR_OVF(x) (((x)&0x00000007)<<12) -+#define MCF_GPT_GSR_CAPTURE(x) (((x)&0x0000FFFF)<<16) -+ -+/********************************************************************/ -+ -+#endif /* __MCF548X_GPT_H__ */ ---- /dev/null -+++ b/include/asm-m68k/m5485i2c.h -@@ -0,0 +1,45 @@ -+/* -+ * m5485i2c.h -- ColdFire 547x/548x i2c controller support. -+ */ -+#ifndef M548X_I2C_H -+#define M548X_I2C_H -+ -+/* Register read/write macros */ -+#define MCF_I2AR MCF_REG08(0x008F00) /* I2C Address */ -+#define MCF_I2FDR MCF_REG08(0x008F04) /* I2C Frequency Divider */ -+#define MCF_I2CR MCF_REG08(0x008F08) /* I2C Control */ -+#define MCF_I2SR MCF_REG08(0x008F0C) /* I2C Status */ -+#define MCF_I2DR MCF_REG08(0x008F10) /* I2C Data I/O */ -+#define MCF_I2ICR MCF_REG08(0x008F20) /* I2C Interrupt Control */ -+ -+/* Bit definitions and macros for MCF_I2C_I2AR */ -+#define MCF_I2AR_ADR(x) (((x)&0x7F)<<1) -+ -+/* Bit definitions and macros for MCF_I2C_I2FDR */ -+#define MCF_I2FDR_IC(x) (((x)&0x3F)<<0) -+ -+/* Bit definitions and macros for MCF_I2C_I2CR */ -+#define MCF_I2CR_RSTA (0x04) -+#define MCF_I2CR_TXAK (0x08) -+#define MCF_I2CR_MTX (0x10) -+#define MCF_I2CR_MSTA (0x20) -+#define MCF_I2CR_IIEN (0x40) -+#define MCF_I2CR_IEN (0x80) -+ -+/* Bit definitions and macros for MCF_I2C_I2SR */ -+#define MCF_I2SR_RXAK (0x01) -+#define MCF_I2SR_IIF (0x02) -+#define MCF_I2SR_SRW (0x04) -+#define MCF_I2SR_IAL (0x10) -+#define MCF_I2SR_IBB (0x20) -+#define MCF_I2SR_IAAS (0x40) -+#define MCF_I2SR_ICF (0x80) -+ -+/* Bit definitions and macros for MCF_I2C_I2ICR */ -+#define MCF_I2ICR_IE (0x01) -+#define MCF_I2ICR_RE (0x02) -+#define MCF_I2ICR_TE (0x04) -+#define MCF_I2ICR_BNBE (0x08) -+ -+/********************************************************************/ -+#endif ---- /dev/null -+++ b/include/asm-m68k/m5485pci.h -@@ -0,0 +1,330 @@ -+/* -+ * m5485pci.h -- ColdFire 547x/548x PCI controller support. -+ */ -+#ifndef __MCF548X_PCI_H__ -+#define __MCF548X_PCI_H__ -+ -+ -+/* PCI Type 0 Configuration Registers */ -+#define MCF_PCIIDR MCF_REG32(0x000B00) /* PCI Device ID/Vendor ID */ -+#define MCF_PCISCR MCF_REG32(0x000B04) /* PCI Status/Command */ -+#define MCF_PCICCRIR MCF_REG32(0x000B08) /* PCI Class Code / Revision ID */ -+#define MCF_PCICR1 MCF_REG32(0x000B0C) /* PCI Configuration 1 Register */ -+#define MCF_PCIBAR0 MCF_REG32(0x000B10) /* PCI Base Address Register 0 */ -+#define MCF_PCIBAR1 MCF_REG32(0x000B14) /* PCI Base Address Register 1 */ -+#define MCF_PCICCPR MCF_REG32(0x000B28) /* PCI Cardbus CIS Pointer */ -+#define MCF_PCISID MCF_REG32(0x000B2C) /* Subsystem ID/Subsystem Vendor ID*/ -+#define MCF_PCIERBAR MCF_REG32(0x000B30) /* PCI Expansion ROM */ -+#define MCF_PCICPR MCF_REG32(0x000B30) /* PCI Capabilities Pointer */ -+#define MCF_PCICR2 MCF_REG32(0x000B3C) /* PCI Configuration Register 2 */ -+ -+/* General Control/Status Registers */ -+#define MCF_PCIGSCR MCF_REG32(0x000B60) /* Global Status/Control Register */ -+#define MCF_PCITBATR0 MCF_REG32(0x000B64) /* Target Base Address Translation 0*/ -+#define MCF_PCITBATR1 MCF_REG32(0x000B68) /* Target Base Address Translation 1*/ -+#define MCF_PCITCR MCF_REG32(0x000B6C) /* Target Control Register */ -+#define MCF_PCIIW0BTAR MCF_REG32(0x000B70) /* Initiator Window 0 Base Address */ -+#define MCF_PCIIW1BTAR MCF_REG32(0x000B74) /* Initiator Window 1 Base Address */ -+#define MCF_PCIIW2BTAR MCF_REG32(0x000B78) /* Initiator Window 2 Base Address */ -+#define MCF_PCIIWCR MCF_REG32(0x000B80) /* Initiator Window Configuration */ -+#define MCF_PCIICR MCF_REG32(0x000B84) /* Initiator Control Register */ -+#define MCF_PCIISR MCF_REG32(0x000B88) /* Initiator Status Register */ -+#define MCF_PCICAR MCF_REG32(0x000BF8) /* Configuration Address Register */ -+ -+/* CommBus FIFO Transmit Interface Registers */ -+#define MCF_PCITPSR MCF_REG32(0x008400) /* Tx Packet Size Register */ -+#define MCF_PCITSAR MCF_REG32(0x008404) /* Tx Start Address Register */ -+#define MCF_PCITTCR MCF_REG32(0x008408) /* Tx Transaction Control Register */ -+#define MCF_PCITER MCF_REG32(0x00840C) /* Tx Enables Register */ -+#define MCF_PCITNAR MCF_REG32(0x008410) /* Tx Next Address Register */ -+#define MCF_PCITLWR MCF_REG32(0x008414) /* Tx Last Word Register */ -+#define MCF_PCITDCR MCF_REG32(0x008418) /* Tx Done Counts Register */ -+#define MCF_PCITSR MCF_REG32(0x00841C) /* Tx Status Register */ -+#define MCF_PCITFDR MCF_REG32(0x008440) /* Tx FIFO Data Register */ -+#define MCF_PCITFSR MCF_REG32(0x008444) /* Tx FIFO Status Register */ -+#define MCF_PCITFCR MCF_REG32(0x008448) /* Tx FIFO Control Register */ -+#define MCF_PCITFAR MCF_REG32(0x00844C) /* Tx FIFO Alarm Register */ -+#define MCF_PCITFRPR MCF_REG32(0x008450) /* Tx FIFO Read Pointer Register */ -+#define MCF_PCITFWPR MCF_REG32(0x008454) /* Tx FIFO Write Pointer Register */ -+ -+/* CommBus FIFO Receive Interface Registers */ -+#define MCF_PCIRPSR MCF_REG32(0x008480) /* Tx Packet Size Register */ -+#define MCF_PCIRSAR MCF_REG32(0x008484) /* Tx Start Address Register */ -+#define MCF_PCIRTCR MCF_REG32(0x008488) /* Tx Transaction Control Register */ -+#define MCF_PCIRER MCF_REG32(0x00848C) /* Tx Enables Register */ -+#define MCF_PCIRNAR MCF_REG32(0x008490) /* Tx Next Address Register */ -+#define MCF_PCIRDCR MCF_REG32(0x008498) /* Tx Done Counts Register */ -+#define MCF_PCIRSR MCF_REG32(0x00849C) /* Tx Status Register */ -+#define MCF_PCIRFDR MCF_REG32(0x0084C0) /* Tx FIFO Data Register */ -+#define MCF_PCIRFSR MCF_REG32(0x0084C4) /* Tx FIFO Status Register */ -+#define MCF_PCIRFCR MCF_REG32(0x0084C8) /* Tx FIFO Control Register */ -+#define MCF_PCIRFAR MCF_REG32(0x0084CC) /* Tx FIFO Alarm Register */ -+#define MCF_PCIRFRPR MCF_REG32(0x0084D0) /* Tx FIFO Read Pointer Register */ -+#define MCF_PCIRFWPR MCF_REG32(0x0084D4) /* Tx FIFO Write Pointer Register */ -+ -+/* PCI Arbiter Registers */ -+#define MCF_PCIARB_PACR MCF_REG32(0x000C00) -+#define MCF_PCIARB_PASR MCF_REG32(0x000C04) -+ -+ -+/* Bit definitions and macros for MCF_PCIIDR */ -+#define MCF_PCIIDR_VENDORID(x) (((x)&0x0000FFFF)<<0) -+#define MCF_PCIIDR_DEVICEID(x) (((x)&0x0000FFFF)<<16) -+ -+/* Bit definitions and macros for MCF_PCISCR */ -+#define MCF_PCISCR_M (0x00000002) -+#define MCF_PCISCR_B (0x00000004) -+#define MCF_PCISCR_SP (0x00000008) -+#define MCF_PCISCR_MW (0x00000010) -+#define MCF_PCISCR_PER (0x00000040) -+#define MCF_PCISCR_S (0x00000100) -+#define MCF_PCISCR_F (0x00000200) -+#define MCF_PCISCR_C (0x00100000) -+#define MCF_PCISCR_66M (0x00200000) -+#define MCF_PCISCR_R (0x00400000) -+#define MCF_PCISCR_FC (0x00800000) -+#define MCF_PCISCR_DP (0x01000000) -+#define MCF_PCISCR_DT(x) (((x)&0x00000003)<<25) -+#define MCF_PCISCR_TS (0x08000000) -+#define MCF_PCISCR_TR (0x10000000) -+#define MCF_PCISCR_MA (0x20000000) -+#define MCF_PCISCR_SE (0x40000000) -+#define MCF_PCISCR_PE (0x80000000) -+ -+/* Bit definitions and macros for MCF_PCICCRIR */ -+#define MCF_PCICCRIR_REVID(x) (((x)&0x000000FF)<<0) -+#define MCF_PCICCRIR_CLASSCODE(x) (((x)&0x00FFFFFF)<<8) -+ -+/* Bit definitions and macros for MCF_PCICR1 */ -+#define MCF_PCICR1_CACHELINESIZE(x) (((x)&0x0000000F)<<0) -+#define MCF_PCICR1_LATTIMER(x) (((x)&0x000000FF)<<8) -+#define MCF_PCICR1_HEADERTYPE(x) (((x)&0x000000FF)<<16) -+#define MCF_PCICR1_BIST(x) (((x)&0x000000FF)<<24) -+ -+/* Bit definitions and macros for MCF_PCIBAR# */ -+#define MCF_PCIBAR0_ADDR(x) (((x)&0x00003FFF)<<18) -+#define MCF_PCIBAR1_ADDR(x) (((x)&0x00000003)<<30) -+ -+/* Bit definitions and macros for MCF_PCICR2 */ -+#define MCF_PCICR2_INTLINE(x) (((x)&0x000000FF)<<0) -+#define MCF_PCICR2_INTPIN(x) (((x)&0x000000FF)<<8) -+#define MCF_PCICR2_MINGNT(x) (((x)&0x000000FF)<<16) -+#define MCF_PCICR2_MAXLAT(x) (((x)&0x000000FF)<<24) -+ -+/* Bit definitions and macros for MCF_PCIGSCR */ -+#define MCF_PCIGSCR_PR (0x00000001) -+#define MCF_PCIGSCR_SEE (0x00001000) -+#define MCF_PCIGSCR_PEE (0x00002000) -+#define MCF_PCIGSCR_SE (0x10000000) -+#define MCF_PCIGSCR_PE (0x20000000) -+ -+/* Bit definitions and macros for MCF_PCITBATR0 */ -+#define MCF_PCITBATR0_EN (0x00000001) -+#define MCF_PCITBATR0_BAT0(x) (((x)&0x00003FFF)<<18) -+ -+/* Bit definitions and macros for MCF_PCITBATR1 */ -+#define MCF_PCITBATR1_EN (0x00000001) -+#define MCF_PCITBATR1_BAT1(x) (((x)&0x00000003)<<30) -+ -+/* Bit definitions and macros for MCF_PCITCR */ -+#define MCF_PCITCR_P (0x00010000) -+#define MCF_PCITCR_LD (0x01000000) -+ -+/* Bit definitions and macros for MCF_PCIIW0BTAR */ -+#define MCF_PCIIW0BTAR_WTA0(x) (((x)&0x000000FF)<<8) -+#define MCF_PCIIW0BTAR_WAM0(x) (((x)&0x000000FF)<<16) -+#define MCF_PCIIW0BTAR_WBA0(x) (((x)&0x000000FF)<<24) -+ -+/* Bit definitions and macros for MCF_PCIIW1BTAR */ -+#define MCF_PCIIW1BTAR_WTA1(x) (((x)&0x000000FF)<<8) -+#define MCF_PCIIW1BTAR_WAM1(x) (((x)&0x000000FF)<<16) -+#define MCF_PCIIW1BTAR_WBA1(x) (((x)&0x000000FF)<<24) -+ -+/* Bit definitions and macros for MCF_PCIIW2BTAR */ -+#define MCF_PCIIW2BTAR_WTA2(x) (((x)&0x000000FF)<<8) -+#define MCF_PCIIW2BTAR_WAM2(x) (((x)&0x000000FF)<<16) -+#define MCF_PCIIW2BTAR_WBA2(x) (((x)&0x000000FF)<<24) -+ -+/* Bit definitions and macros for MCF_PCIIWCR */ -+#define MCF_PCIIWCR_WINCTRL2(x) (((x)&0x0000000F)<<8) -+#define MCF_PCIIWCR_WINCTRL1(x) (((x)&0x0000000F)<<16) -+#define MCF_PCIIWCR_WINCTRL0(x) (((x)&0x0000000F)<<24) -+#define MCF_PCIIWCR_WINCTRL0_MEMREAD (0x01000000) -+#define MCF_PCIIWCR_WINCTRL0_MEMRDLINE (0x03000000) -+#define MCF_PCIIWCR_WINCTRL0_MEMRDMUL (0x05000000) -+#define MCF_PCIIWCR_WINCTRL0_IO (0x09000000) -+#define MCF_PCIIWCR_WINCTRL0_E (0x01000000) -+#define MCF_PCIIWCR_WINCTRL1_MEMREAD (0x00010000) -+#define MCF_PCIIWCR_WINCTRL1_MEMRDLINE (0x00030000) -+#define MCF_PCIIWCR_WINCTRL1_MEMRDMUL (0x00050000) -+#define MCF_PCIIWCR_WINCTRL1_IO (0x00090000) -+#define MCF_PCIIWCR_WINCTRL1_E (0x00010000) -+#define MCF_PCIIWCR_WINCTRL2_MEMREAD (0x00000100) -+#define MCF_PCIIWCR_WINCTRL2_MEMRDLINE (0x00000300) -+#define MCF_PCIIWCR_WINCTRL2_MEMRDMUL (0x00000500) -+#define MCF_PCIIWCR_WINCTRL2_IO (0x00000900) -+#define MCF_PCIIWCR_WINCTRL2_E (0x00000100) -+ -+ -+/* Bit definitions and macros for MCF_PCIICR */ -+#define MCF_PCIICR_MAXRETRY(x) (((x)&0x000000FF)<<0) -+#define MCF_PCIICR_TAE (0x01000000) -+#define MCF_PCIICR_IAE (0x02000000) -+#define MCF_PCIICR_REE (0x04000000) -+ -+/* Bit definitions and macros for MCF_PCIISR */ -+#define MCF_PCIISR_TA (0x01000000) -+#define MCF_PCIISR_IA (0x02000000) -+#define MCF_PCIISR_RE (0x04000000) -+ -+/* Bit definitions and macros for MCF_PCICAR */ -+#define MCF_PCICAR_DWORD(x) (((x)&0x0000003F)<<2) -+#define MCF_PCICAR_FUNCNUM(x) (((x)&0x00000007)<<8) -+#define MCF_PCICAR_DEVNUM(x) (((x)&0x0000001F)<<11) -+#define MCF_PCICAR_BUSNUM(x) (((x)&0x000000FF)<<16) -+#define MCF_PCICAR_E (0x80000000) -+ -+/* Bit definitions and macros for MCF_PCITPSR */ -+#define MCF_PCITPSR_PKTSIZE(x) (((x)&0x0000FFFF)<<16) -+ -+/* Bit definitions and macros for MCF_PCITTCR */ -+#define MCF_PCITTCR_DI (0x00000001) -+#define MCF_PCITTCR_W (0x00000010) -+#define MCF_PCITTCR_MAXBEATS(x) (((x)&0x00000007)<<8) -+#define MCF_PCITTCR_MAXRETRY(x) (((x)&0x000000FF)<<16) -+#define MCF_PCITTCR_PCICMD(x) (((x)&0x0000000F)<<24) -+ -+/* Bit definitions and macros for MCF_PCITER */ -+#define MCF_PCITER_NE (0x00010000) -+#define MCF_PCITER_IAE (0x00020000) -+#define MCF_PCITER_TAE (0x00040000) -+#define MCF_PCITER_RE (0x00080000) -+#define MCF_PCITER_SE (0x00100000) -+#define MCF_PCITER_FEE (0x00200000) -+#define MCF_PCITER_ME (0x01000000) -+#define MCF_PCITER_BE (0x08000000) -+#define MCF_PCITER_CM (0x10000000) -+#define MCF_PCITER_RF (0x40000000) -+#define MCF_PCITER_RC (0x80000000) -+ -+/* Bit definitions and macros for MCF_PCITDCR */ -+#define MCF_PCITDCR_PKTSDONE(x) (((x)&0x0000FFFF)<<0) -+#define MCF_PCITDCR_BYTESDONE(x) (((x)&0x0000FFFF)<<16) -+ -+/* Bit definitions and macros for MCF_PCITSR */ -+#define MCF_PCITSR_IA (0x00010000) -+#define MCF_PCITSR_TA (0x00020000) -+#define MCF_PCITSR_RE (0x00040000) -+#define MCF_PCITSR_SE (0x00080000) -+#define MCF_PCITSR_FE (0x00100000) -+#define MCF_PCITSR_BE1 (0x00200000) -+#define MCF_PCITSR_BE2 (0x00400000) -+#define MCF_PCITSR_BE3 (0x00800000) -+#define MCF_PCITSR_NT (0x01000000) -+ -+/* Bit definitions and macros for MCF_PCITFSR */ -+#define MCF_PCITFSR_EMT (0x00010000) -+#define MCF_PCITFSR_ALARM (0x00020000) -+#define MCF_PCITFSR_FU (0x00040000) -+#define MCF_PCITFSR_FR (0x00080000) -+#define MCF_PCITFSR_OF (0x00100000) -+#define MCF_PCITFSR_UF (0x00200000) -+#define MCF_PCITFSR_RXW (0x00400000) -+ -+/* Bit definitions and macros for MCF_PCITFCR */ -+#define MCF_PCITFCR_OF_MSK (0x00080000) -+#define MCF_PCITFCR_UF_MSK (0x00100000) -+#define MCF_PCITFCR_RXW_MSK (0x00200000) -+#define MCF_PCITFCR_FAE_MSK (0x00400000) -+#define MCF_PCITFCR_IP_MSK (0x00800000) -+#define MCF_PCITFCR_GR(x) (((x)&0x00000007)<<24) -+ -+/* Bit definitions and macros for MCF_PCITFAR */ -+#define MCF_PCITFAR_ALARM(x) (((x)&0x0000007F)<<0) -+ -+/* Bit definitions and macros for MCF_PCITFRPR */ -+#define MCF_PCITFRPR_READ(x) (((x)&0x00000FFF)<<0) -+ -+/* Bit definitions and macros for MCF_PCITFWPR */ -+#define MCF_PCITFWPR_WRITE(x) (((x)&0x00000FFF)<<0) -+ -+/* Bit definitions and macros for MCF_PCIRPSR */ -+#define MCF_PCIRPSR_PKTSIZE(x) (((x)&0x0000FFFF)<<16) -+ -+/* Bit definitions and macros for MCF_PCIRTCR */ -+#define MCF_PCIRTCR_DI (0x00000001) -+#define MCF_PCIRTCR_W (0x00000010) -+#define MCF_PCIRTCR_MAXBEATS(x) (((x)&0x00000007)<<8) -+#define MCF_PCIRTCR_FB (0x00001000) -+#define MCF_PCIRTCR_MAXRETRY(x) (((x)&0x000000FF)<<16) -+#define MCF_PCIRTCR_PCICMD(x) (((x)&0x0000000F)<<24) -+ -+/* Bit definitions and macros for MCF_PCIRER */ -+#define MCF_PCIRER_NE (0x00010000) -+#define MCF_PCIRER_IAE (0x00020000) -+#define MCF_PCIRER_TAE (0x00040000) -+#define MCF_PCIRER_RE (0x00080000) -+#define MCF_PCIRER_SE (0x00100000) -+#define MCF_PCIRER_FEE (0x00200000) -+#define MCF_PCIRER_ME (0x01000000) -+#define MCF_PCIRER_BE (0x08000000) -+#define MCF_PCIRER_CM (0x10000000) -+#define MCF_PCIRER_FE (0x20000000) -+#define MCF_PCIRER_RF (0x40000000) -+#define MCF_PCIRER_RC (0x80000000) -+ -+/* Bit definitions and macros for MCF_PCIRDCR */ -+#define MCF_PCIRDCR_PKTSDONE(x) (((x)&0x0000FFFF)<<0) -+#define MCF_PCIRDCR_BYTESDONE(x) (((x)&0x0000FFFF)<<16) -+ -+/* Bit definitions and macros for MCF_PCIRSR */ -+#define MCF_PCIRSR_IA (0x00010000) -+#define MCF_PCIRSR_TA (0x00020000) -+#define MCF_PCIRSR_RE (0x00040000) -+#define MCF_PCIRSR_SE (0x00080000) -+#define MCF_PCIRSR_FE (0x00100000) -+#define MCF_PCIRSR_BE1 (0x00200000) -+#define MCF_PCIRSR_BE2 (0x00400000) -+#define MCF_PCIRSR_BE3 (0x00800000) -+#define MCF_PCIRSR_NT (0x01000000) -+ -+/* Bit definitions and macros for MCF_PCIRFSR */ -+#define MCF_PCIRFSR_EMT (0x00010000) -+#define MCF_PCIRFSR_ALARM (0x00020000) -+#define MCF_PCIRFSR_FU (0x00040000) -+#define MCF_PCIRFSR_FR (0x00080000) -+#define MCF_PCIRFSR_OF (0x00100000) -+#define MCF_PCIRFSR_UF (0x00200000) -+#define MCF_PCIRFSR_RXW (0x00400000) -+ -+/* Bit definitions and macros for MCF_PCIRFCR */ -+#define MCF_PCIRFCR_OF_MSK (0x00080000) -+#define MCF_PCIRFCR_UF_MSK (0x00100000) -+#define MCF_PCIRFCR_RXW_MSK (0x00200000) -+#define MCF_PCIRFCR_FAE_MSK (0x00400000) -+#define MCF_PCIRFCR_IP_MSK (0x00800000) -+#define MCF_PCIRFCR_GR(x) (((x)&0x00000007)<<24) -+ -+/* Bit definitions and macros for MCF_PCIRFAR */ -+#define MCF_PCIRFAR_ALARM(x) (((x)&0x0000007F)<<0) -+ -+/* Bit definitions and macros for MCF_PCIRFRPR */ -+#define MCF_PCIRFRPR_READ(x) (((x)&0x00000FFF)<<0) -+ -+/* Bit definitions and macros for MCF_PCIRFWPR */ -+#define MCF_PCIRFWPR_WRITE(x) (((x)&0x00000FFF)<<0) -+ -+ -+/* Bit definitions and macros for MCF_PCIARB_PACR */ -+#define MCF_PCIARB_PACR_INTMPRI (0x00000001) -+#define MCF_PCIARB_PACR_EXTMPRI(x) (((x)&0x0000001F)<<1) -+#define MCF_PCIARB_PACR_INTMINTEN (0x00010000) -+#define MCF_PCIARB_PACR_EXTMINTEN(x) (((x)&0x0000001F)<<17) -+#define MCF_PCIARB_PACR_PKMD (0x40000000) -+#define MCF_PCIARB_PACR_DS (0x80000000) -+ -+/* Bit definitions and macros for MCF_PCIARB_PASR */ -+#define MCF_PCIARB_PASR_ITLMBK (0x00010000) -+#define MCF_PCIARB_PASR_EXTMBK(x) (((x)&0x0000001F)<<17) -+ -+#endif /* __MCF548X_PCI_H__ */ ---- /dev/null -+++ b/include/asm-m68k/m5485psc.h -@@ -0,0 +1,474 @@ -+/* -+ * File: mcf548x_psc.h -+ * Purpose: Register and bit definitions for the MCF548X -+ * -+ * Notes: -+ * -+ */ -+ -+#ifndef __MCF548X_PSC_H__ -+#define __MCF548X_PSC_H__ -+ -+/********************************************************************* -+* -+* Programmable Serial Controller (PSC) -+* -+*********************************************************************/ -+ -+/* Register read/write macros */ -+#define MCF_PSC_MR0 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008600)) -+#define MCF_PSC_SR0 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008604)) -+#define MCF_PSC_CSR0 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008604)) -+#define MCF_PSC_CR0 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008608)) -+#define MCF_PSC_RB0 (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00860C)) -+#define MCF_PSC_TB0 (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00860C)) -+#define MCF_PSC_TB_8BIT0 (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00860C)) -+#define MCF_PSC_TB_16BIT0 (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00860C)) -+#define MCF_PSC_TB_AC970 (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00860C)) -+#define MCF_PSC_IPCR0 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008610)) -+#define MCF_PSC_ACR0 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008610)) -+#define MCF_PSC_ISR0 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008614)) -+#define MCF_PSC_IMR0 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008614)) -+#define MCF_PSC_CTUR0 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008618)) -+#define MCF_PSC_CTLR0 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00861C)) -+#define MCF_PSC_IP0 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008634)) -+#define MCF_PSC_OPSET0 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008638)) -+#define MCF_PSC_OPRESET0 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00863C)) -+#define MCF_PSC_SICR0 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008640)) -+#define MCF_PSC_IRCR10 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008644)) -+#define MCF_PSC_IRCR20 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008648)) -+#define MCF_PSC_IRSDR0 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00864C)) -+#define MCF_PSC_IRMDR0 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008650)) -+#define MCF_PSC_IRFDR0 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008654)) -+#define MCF_PSC_RFCNT0 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008658)) -+#define MCF_PSC_TFCNT0 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00865C)) -+#define MCF_PSC_RFSR0 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008664)) -+#define MCF_PSC_TFSR0 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008684)) -+#define MCF_PSC_RFCR0 (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x008668)) -+#define MCF_PSC_TFCR0 (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x008688)) -+#define MCF_PSC_RFAR0 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00866E)) -+#define MCF_PSC_TFAR0 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00868E)) -+#define MCF_PSC_RFRP0 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008672)) -+#define MCF_PSC_TFRP0 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008692)) -+#define MCF_PSC_RFWP0 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008676)) -+#define MCF_PSC_TFWP0 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008696)) -+#define MCF_PSC_RLRFP0 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00867A)) -+#define MCF_PSC_TLRFP0 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00869A)) -+#define MCF_PSC_RLWFP0 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00867E)) -+#define MCF_PSC_TLWFP0 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00869E)) -+#define MCF_PSC_MR1 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008700)) -+#define MCF_PSC_SR1 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008704)) -+#define MCF_PSC_CSR1 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008704)) -+#define MCF_PSC_CR1 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008708)) -+#define MCF_PSC_RB1 (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00870C)) -+#define MCF_PSC_TB1 (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00870C)) -+#define MCF_PSC_TB_8BIT1 (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00870C)) -+#define MCF_PSC_TB_16BIT1 (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00870C)) -+#define MCF_PSC_TB_AC971 (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00870C)) -+#define MCF_PSC_IPCR1 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008710)) -+#define MCF_PSC_ACR1 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008710)) -+#define MCF_PSC_ISR1 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008714)) -+#define MCF_PSC_IMR1 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008714)) -+#define MCF_PSC_CTUR1 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008718)) -+#define MCF_PSC_CTLR1 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00871C)) -+#define MCF_PSC_IP1 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008734)) -+#define MCF_PSC_OPSET1 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008738)) -+#define MCF_PSC_OPRESET1 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00873C)) -+#define MCF_PSC_SICR1 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008740)) -+#define MCF_PSC_IRCR11 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008744)) -+#define MCF_PSC_IRCR21 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008748)) -+#define MCF_PSC_IRSDR1 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00874C)) -+#define MCF_PSC_IRMDR1 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008750)) -+#define MCF_PSC_IRFDR1 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008754)) -+#define MCF_PSC_RFCNT1 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008758)) -+#define MCF_PSC_TFCNT1 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00875C)) -+#define MCF_PSC_RFSR1 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008764)) -+#define MCF_PSC_TFSR1 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008784)) -+#define MCF_PSC_RFCR1 (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x008768)) -+#define MCF_PSC_TFCR1 (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x008788)) -+#define MCF_PSC_RFAR1 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00876E)) -+#define MCF_PSC_TFAR1 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00878E)) -+#define MCF_PSC_RFRP1 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008772)) -+#define MCF_PSC_TFRP1 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008792)) -+#define MCF_PSC_RFWP1 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008776)) -+#define MCF_PSC_TFWP1 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008796)) -+#define MCF_PSC_RLRFP1 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00877A)) -+#define MCF_PSC_TLRFP1 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00879A)) -+#define MCF_PSC_RLWFP1 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00877E)) -+#define MCF_PSC_TLWFP1 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00879E)) -+#define MCF_PSC_MR2 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008800)) -+#define MCF_PSC_SR2 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008804)) -+#define MCF_PSC_CSR2 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008804)) -+#define MCF_PSC_CR2 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008808)) -+#define MCF_PSC_RB2 (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00880C)) -+#define MCF_PSC_TB2 (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00880C)) -+#define MCF_PSC_TB_8BIT2 (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00880C)) -+#define MCF_PSC_TB_16BIT2 (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00880C)) -+#define MCF_PSC_TB_AC972 (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00880C)) -+#define MCF_PSC_IPCR2 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008810)) -+#define MCF_PSC_ACR2 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008810)) -+#define MCF_PSC_ISR2 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008814)) -+#define MCF_PSC_IMR2 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008814)) -+#define MCF_PSC_CTUR2 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008818)) -+#define MCF_PSC_CTLR2 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00881C)) -+#define MCF_PSC_IP2 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008834)) -+#define MCF_PSC_OPSET2 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008838)) -+#define MCF_PSC_OPRESET2 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00883C)) -+#define MCF_PSC_SICR2 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008840)) -+#define MCF_PSC_IRCR12 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008844)) -+#define MCF_PSC_IRCR22 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008848)) -+#define MCF_PSC_IRSDR2 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00884C)) -+#define MCF_PSC_IRMDR2 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008850)) -+#define MCF_PSC_IRFDR2 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008854)) -+#define MCF_PSC_RFCNT2 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008858)) -+#define MCF_PSC_TFCNT2 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00885C)) -+#define MCF_PSC_RFSR2 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008864)) -+#define MCF_PSC_TFSR2 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008884)) -+#define MCF_PSC_RFCR2 (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x008868)) -+#define MCF_PSC_TFCR2 (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x008888)) -+#define MCF_PSC_RFAR2 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00886E)) -+#define MCF_PSC_TFAR2 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00888E)) -+#define MCF_PSC_RFRP2 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008872)) -+#define MCF_PSC_TFRP2 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008892)) -+#define MCF_PSC_RFWP2 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008876)) -+#define MCF_PSC_TFWP2 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008896)) -+#define MCF_PSC_RLRFP2 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00887A)) -+#define MCF_PSC_TLRFP2 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00889A)) -+#define MCF_PSC_RLWFP2 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00887E)) -+#define MCF_PSC_TLWFP2 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00889E)) -+#define MCF_PSC_MR3 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008900)) -+#define MCF_PSC_SR3 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008904)) -+#define MCF_PSC_CSR3 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008904)) -+#define MCF_PSC_CR3 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008908)) -+#define MCF_PSC_RB3 (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00890C)) -+#define MCF_PSC_TB3 (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00890C)) -+#define MCF_PSC_TB_8BIT3 (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00890C)) -+#define MCF_PSC_TB_16BIT3 (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00890C)) -+#define MCF_PSC_TB_AC973 (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00890C)) -+#define MCF_PSC_IPCR3 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008910)) -+#define MCF_PSC_ACR3 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008910)) -+#define MCF_PSC_ISR3 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008914)) -+#define MCF_PSC_IMR3 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008914)) -+#define MCF_PSC_CTUR3 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008918)) -+#define MCF_PSC_CTLR3 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00891C)) -+#define MCF_PSC_IP3 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008934)) -+#define MCF_PSC_OPSET3 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008938)) -+#define MCF_PSC_OPRESET3 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00893C)) -+#define MCF_PSC_SICR3 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008940)) -+#define MCF_PSC_IRCR13 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008944)) -+#define MCF_PSC_IRCR23 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008948)) -+#define MCF_PSC_IRSDR3 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00894C)) -+#define MCF_PSC_IRMDR3 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008950)) -+#define MCF_PSC_IRFDR3 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008954)) -+#define MCF_PSC_RFCNT3 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008958)) -+#define MCF_PSC_TFCNT3 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00895C)) -+#define MCF_PSC_RFSR3 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008964)) -+#define MCF_PSC_TFSR3 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008984)) -+#define MCF_PSC_RFCR3 (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x008968)) -+#define MCF_PSC_TFCR3 (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x008988)) -+#define MCF_PSC_RFAR3 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00896E)) -+#define MCF_PSC_TFAR3 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00898E)) -+#define MCF_PSC_RFRP3 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008972)) -+#define MCF_PSC_TFRP3 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008992)) -+#define MCF_PSC_RFWP3 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008976)) -+#define MCF_PSC_TFWP3 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008996)) -+#define MCF_PSC_RLRFP3 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00897A)) -+#define MCF_PSC_TLRFP3 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00899A)) -+#define MCF_PSC_RLWFP3 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00897E)) -+#define MCF_PSC_TLWFP3 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00899E)) -+#define MCF_PSC_MR(x) (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008600+((x)*0x100))) -+#define MCF_PSC_SR(x) (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008604+((x)*0x100))) -+#define MCF_PSC_CSR(x) (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008604+((x)*0x100))) -+#define MCF_PSC_CR(x) (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008608+((x)*0x100))) -+#define MCF_PSC_RB(x) (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00860C+((x)*0x100))) -+#define MCF_PSC_TB(x) (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00860C+((x)*0x100))) -+#define MCF_PSC_TB_8BIT(x) (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00860C+((x)*0x100))) -+#define MCF_PSC_TB_16BIT(x) (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00860C+((x)*0x100))) -+#define MCF_PSC_TB_AC97(x) (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00860C+((x)*0x100))) -+#define MCF_PSC_IPCR(x) (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008610+((x)*0x100))) -+#define MCF_PSC_ACR(x) (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008610+((x)*0x100))) -+#define MCF_PSC_ISR(x) (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008614+((x)*0x100))) -+#define MCF_PSC_IMR(x) (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008614+((x)*0x100))) -+#define MCF_PSC_CTUR(x) (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008618+((x)*0x100))) -+#define MCF_PSC_CTLR(x) (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00861C+((x)*0x100))) -+#define MCF_PSC_IP(x) (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008634+((x)*0x100))) -+#define MCF_PSC_OPSET(x) (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008638+((x)*0x100))) -+#define MCF_PSC_OPRESET(x) (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00863C+((x)*0x100))) -+#define MCF_PSC_SICR(x) (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008640+((x)*0x100))) -+#define MCF_PSC_IRCR1(x) (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008644+((x)*0x100))) -+#define MCF_PSC_IRCR2(x) (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008648+((x)*0x100))) -+#define MCF_PSC_IRSDR(x) (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00864C+((x)*0x100))) -+#define MCF_PSC_IRMDR(x) (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008650+((x)*0x100))) -+#define MCF_PSC_IRFDR(x) (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008654+((x)*0x100))) -+#define MCF_PSC_RFCNT(x) (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008658+((x)*0x100))) -+#define MCF_PSC_TFCNT(x) (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00865C+((x)*0x100))) -+#define MCF_PSC_RFSR(x) (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008664+((x)*0x100))) -+#define MCF_PSC_TFSR(x) (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008684+((x)*0x100))) -+#define MCF_PSC_RFCR(x) (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x008668+((x)*0x100))) -+#define MCF_PSC_TFCR(x) (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x008688+((x)*0x100))) -+#define MCF_PSC_RFAR(x) (*(volatile uint16_t*)(void*)(MCF_MBAR + (0x00866E)+((x)*0x100))) -+#define MCF_PSC_TFAR(x) (*(volatile uint16_t*)(void*)(MCF_MBAR + (0x00868E)+((x)*0x100))) -+#define MCF_PSC_RFRP(x) (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008672+((x)*0x100))) -+#define MCF_PSC_TFRP(x) (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008692+((x)*0x100))) -+#define MCF_PSC_RFWP(x) (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008676+((x)*0x100))) -+#define MCF_PSC_TFWP(x) (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008696+((x)*0x100))) -+#define MCF_PSC_RLRFP(x) (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00867A+((x)*0x100))) -+#define MCF_PSC_TLRFP(x) (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00869A+((x)*0x100))) -+#define MCF_PSC_RLWFP(x) (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00867E+((x)*0x100))) -+#define MCF_PSC_TLWFP(x) (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00869E+((x)*0x100))) -+ -+/* Bit definitions and macros for MCF_PSC_MR */ -+#define MCF_PSC_MR_BC(x) (((x)&0x03)<<0) -+#define MCF_PSC_MR_PT (0x04) -+#define MCF_PSC_MR_PM(x) (((x)&0x03)<<3) -+#define MCF_PSC_MR_ERR (0x20) -+#define MCF_PSC_MR_RXIRQ (0x40) -+#define MCF_PSC_MR_RXRTS (0x80) -+#define MCF_PSC_MR_SB(x) (((x)&0x0F)<<0) -+#define MCF_PSC_MR_TXCTS (0x10) -+#define MCF_PSC_MR_TXRTS (0x20) -+#define MCF_PSC_MR_CM(x) (((x)&0x03)<<6) -+#define MCF_PSC_MR_PM_MULTI_ADDR (0x1C) -+#define MCF_PSC_MR_PM_MULTI_DATA (0x18) -+#define MCF_PSC_MR_PM_NONE (0x10) -+#define MCF_PSC_MR_PM_FORCE_HI (0x0C) -+#define MCF_PSC_MR_PM_FORCE_LO (0x08) -+#define MCF_PSC_MR_PM_ODD (0x04) -+#define MCF_PSC_MR_PM_EVEN (0x00) -+#define MCF_PSC_MR_BC_5 (0x00) -+#define MCF_PSC_MR_BC_6 (0x01) -+#define MCF_PSC_MR_BC_7 (0x02) -+#define MCF_PSC_MR_BC_8 (0x03) -+#define MCF_PSC_MR_CM_NORMAL (0x00) -+#define MCF_PSC_MR_CM_ECHO (0x40) -+#define MCF_PSC_MR_CM_LOCAL_LOOP (0x80) -+#define MCF_PSC_MR_CM_REMOTE_LOOP (0xC0) -+#define MCF_PSC_MR_SB_STOP_BITS_1 (0x07) -+#define MCF_PSC_MR_SB_STOP_BITS_15 (0x08) -+#define MCF_PSC_MR_SB_STOP_BITS_2 (0x0F) -+ -+/* Bit definitions and macros for MCF_PSC_SR */ -+#define MCF_PSC_SR_ERR (0x0040) -+#define MCF_PSC_SR_CDE_DEOF (0x0080) -+#define MCF_PSC_SR_RXRDY (0x0100) -+#define MCF_PSC_SR_FU (0x0200) -+#define MCF_PSC_SR_TXRDY (0x0400) -+#define MCF_PSC_SR_TXEMP_URERR (0x0800) -+#define MCF_PSC_SR_OE (0x1000) -+#define MCF_PSC_SR_PE_CRCERR (0x2000) -+#define MCF_PSC_SR_FE_PHYERR (0x4000) -+#define MCF_PSC_SR_RB_NEOF (0x8000) -+ -+/* Bit definitions and macros for MCF_PSC_CSR */ -+#define MCF_PSC_CSR_TCSEL(x) (((x)&0x0F)<<0) -+#define MCF_PSC_CSR_RCSEL(x) (((x)&0x0F)<<4) -+#define MCF_PSC_CSR_RCSEL_SYS_CLK (0xD0) -+#define MCF_PSC_CSR_RCSEL_CTM16 (0xE0) -+#define MCF_PSC_CSR_RCSEL_CTM (0xF0) -+#define MCF_PSC_CSR_TCSEL_SYS_CLK (0x0D) -+#define MCF_PSC_CSR_TCSEL_CTM16 (0x0E) -+#define MCF_PSC_CSR_TCSEL_CTM (0x0F) -+ -+/* Bit definitions and macros for MCF_PSC_CR */ -+#define MCF_PSC_CR_RXC(x) (((x)&0x03)<<0) -+#define MCF_PSC_CR_TXC(x) (((x)&0x03)<<2) -+#define MCF_PSC_CR_MISC(x) (((x)&0x07)<<4) -+#define MCF_PSC_CR_NONE (0x00) -+#define MCF_PSC_CR_STOP_BREAK (0x70) -+#define MCF_PSC_CR_START_BREAK (0x60) -+#define MCF_PSC_CR_BKCHGINT (0x50) -+#define MCF_PSC_CR_RESET_ERROR (0x40) -+#define MCF_PSC_CR_RESET_TX (0x30) -+#define MCF_PSC_CR_RESET_RX (0x20) -+#define MCF_PSC_CR_RESET_MR (0x10) -+#define MCF_PSC_CR_TX_DISABLED (0x08) -+#define MCF_PSC_CR_TX_ENABLED (0x04) -+#define MCF_PSC_CR_RX_DISABLED (0x02) -+#define MCF_PSC_CR_RX_ENABLED (0x01) -+ -+/* Bit definitions and macros for MCF_PSC_TB_8BIT */ -+#define MCF_PSC_TB_8BIT_TB3(x) (((x)&0x000000FF)<<0) -+#define MCF_PSC_TB_8BIT_TB2(x) (((x)&0x000000FF)<<8) -+#define MCF_PSC_TB_8BIT_TB1(x) (((x)&0x000000FF)<<16) -+#define MCF_PSC_TB_8BIT_TB0(x) (((x)&0x000000FF)<<24) -+ -+/* Bit definitions and macros for MCF_PSC_TB_16BIT */ -+#define MCF_PSC_TB_16BIT_TB1(x) (((x)&0x0000FFFF)<<0) -+#define MCF_PSC_TB_16BIT_TB0(x) (((x)&0x0000FFFF)<<16) -+ -+/* Bit definitions and macros for MCF_PSC_TB_AC97 */ -+#define MCF_PSC_TB_AC97_SOF (0x00000800) -+#define MCF_PSC_TB_AC97_TB(x) (((x)&0x000FFFFF)<<12) -+ -+/* Bit definitions and macros for MCF_PSC_IPCR */ -+#define MCF_PSC_IPCR_RESERVED (0x0C) -+#define MCF_PSC_IPCR_CTS (0x0D) -+#define MCF_PSC_IPCR_D_CTS (0x1C) -+#define MCF_PSC_IPCR_SYNC (0x8C) -+ -+/* Bit definitions and macros for MCF_PSC_ACR */ -+#define MCF_PSC_ACR_IEC0 (0x01) -+#define MCF_PSC_ACR_CTMS(x) (((x)&0x07)<<4) -+#define MCF_PSC_ACR_BRG (0x80) -+ -+/* Bit definitions and macros for MCF_PSC_ISR */ -+#define MCF_PSC_ISR_ERR (0x0040) -+#define MCF_PSC_ISR_DEOF (0x0080) -+#define MCF_PSC_ISR_TXRDY (0x0100) -+#define MCF_PSC_ISR_RXRDY_FU (0x0200) -+#define MCF_PSC_ISR_DB (0x0400) -+#define MCF_PSC_ISR_IPC (0x8000) -+ -+/* Bit definitions and macros for MCF_PSC_IMR */ -+#define MCF_PSC_IMR_ERR (0x0040) -+#define MCF_PSC_IMR_DEOF (0x0080) -+#define MCF_PSC_IMR_TXRDY (0x0100) -+#define MCF_PSC_IMR_RXRDY_FU (0x0200) -+#define MCF_PSC_IMR_DB (0x0400) -+#define MCF_PSC_IMR_IPC (0x8000) -+ -+/* Bit definitions and macros for MCF_PSC_IP */ -+#define MCF_PSC_IP_CTS (0x01) -+#define MCF_PSC_IP_TGL (0x40) -+#define MCF_PSC_IP_LWPR_B (0x80) -+ -+/* Bit definitions and macros for MCF_PSC_OPSET */ -+#define MCF_PSC_OPSET_RTS (0x01) -+ -+/* Bit definitions and macros for MCF_PSC_OPRESET */ -+#define MCF_PSC_OPRESET_RTS (0x01) -+ -+/* Bit definitions and macros for MCF_PSC_SICR */ -+#define MCF_PSC_SICR_SIM(x) (((x)&0x07)<<0) -+#define MCF_PSC_SICR_SHDIR (0x10) -+#define MCF_PSC_SICR_DTS (0x20) -+#define MCF_PSC_SICR_AWR (0x40) -+#define MCF_PSC_SICR_ACRB (0x80) -+#define MCF_PSC_SICR_SIM_UART (0x00) -+#define MCF_PSC_SICR_SIM_MODEM8 (0x01) -+#define MCF_PSC_SICR_SIM_MODEM16 (0x02) -+#define MCF_PSC_SICR_SIM_AC97 (0x03) -+#define MCF_PSC_SICR_SIM_SIR (0x04) -+#define MCF_PSC_SICR_SIM_MIR (0x05) -+#define MCF_PSC_SICR_SIM_FIR (0x06) -+ -+/* Bit definitions and macros for MCF_PSC_IRCR1 */ -+#define MCF_PSC_IRCR1_SPUL (0x01) -+#define MCF_PSC_IRCR1_SIPEN (0x02) -+#define MCF_PSC_IRCR1_FD (0x04) -+ -+/* Bit definitions and macros for MCF_PSC_IRCR2 */ -+#define MCF_PSC_IRCR2_NXTEOF (0x01) -+#define MCF_PSC_IRCR2_ABORT (0x02) -+#define MCF_PSC_IRCR2_SIPREQ (0x04) -+ -+/* Bit definitions and macros for MCF_PSC_IRMDR */ -+#define MCF_PSC_IRMDR_M_FDIV(x) (((x)&0x7F)<<0) -+#define MCF_PSC_IRMDR_FREQ (0x80) -+ -+/* Bit definitions and macros for MCF_PSC_IRFDR */ -+#define MCF_PSC_IRFDR_F_FDIV(x) (((x)&0x0F)<<0) -+ -+/* Bit definitions and macros for MCF_PSC_RFCNT */ -+#define MCF_PSC_RFCNT_CNT(x) (((x)&0x01FF)<<0) -+ -+/* Bit definitions and macros for MCF_PSC_TFCNT */ -+#define MCF_PSC_TFCNT_CNT(x) (((x)&0x01FF)<<0) -+ -+/* Bit definitions and macros for MCF_PSC_RFSR */ -+#define MCF_PSC_RFSR_EMT (0x0001) -+#define MCF_PSC_RFSR_ALARM (0x0002) -+#define MCF_PSC_RFSR_FU (0x0004) -+#define MCF_PSC_RFSR_FRMRY (0x0008) -+#define MCF_PSC_RFSR_OF (0x0010) -+#define MCF_PSC_RFSR_UF (0x0020) -+#define MCF_PSC_RFSR_RXW (0x0040) -+#define MCF_PSC_RFSR_FAE (0x0080) -+#define MCF_PSC_RFSR_FRM(x) (((x)&0x000F)<<8) -+#define MCF_PSC_RFSR_TAG (0x1000) -+#define MCF_PSC_RFSR_TXW (0x4000) -+#define MCF_PSC_RFSR_IP (0x8000) -+#define MCF_PSC_RFSR_FRM_BYTE0 (0x0800) -+#define MCF_PSC_RFSR_FRM_BYTE1 (0x0400) -+#define MCF_PSC_RFSR_FRM_BYTE2 (0x0200) -+#define MCF_PSC_RFSR_FRM_BYTE3 (0x0100) -+ -+/* Bit definitions and macros for MCF_PSC_TFSR */ -+#define MCF_PSC_TFSR_EMT (0x0001) -+#define MCF_PSC_TFSR_ALARM (0x0002) -+#define MCF_PSC_TFSR_FU (0x0004) -+#define MCF_PSC_TFSR_FRMRY (0x0008) -+#define MCF_PSC_TFSR_OF (0x0010) -+#define MCF_PSC_TFSR_UF (0x0020) -+#define MCF_PSC_TFSR_RXW (0x0040) -+#define MCF_PSC_TFSR_FAE (0x0080) -+#define MCF_PSC_TFSR_FRM(x) (((x)&0x000F)<<8) -+#define MCF_PSC_TFSR_TAG (0x1000) -+#define MCF_PSC_TFSR_TXW (0x4000) -+#define MCF_PSC_TFSR_IP (0x8000) -+#define MCF_PSC_TFSR_FRM_BYTE0 (0x0800) -+#define MCF_PSC_TFSR_FRM_BYTE1 (0x0400) -+#define MCF_PSC_TFSR_FRM_BYTE2 (0x0200) -+#define MCF_PSC_TFSR_FRM_BYTE3 (0x0100) -+ -+/* Bit definitions and macros for MCF_PSC_RFCR */ -+#define MCF_PSC_RFCR_CNTR(x) (((x)&0x0000FFFF)<<0) -+#define MCF_PSC_RFCR_TXW_MSK (0x00040000) -+#define MCF_PSC_RFCR_OF_MSK (0x00080000) -+#define MCF_PSC_RFCR_UF_MSK (0x00100000) -+#define MCF_PSC_RFCR_RXW_MSK (0x00200000) -+#define MCF_PSC_RFCR_FAE_MSK (0x00400000) -+#define MCF_PSC_RFCR_IP_MSK (0x00800000) -+#define MCF_PSC_RFCR_GR(x) (((x)&0x00000007)<<24) -+#define MCF_PSC_RFCR_FRMEN (0x08000000) -+#define MCF_PSC_RFCR_TIMER (0x10000000) -+#define MCF_PSC_RFCR_WRITETAG (0x20000000) -+#define MCF_PSC_RFCR_SHADOW (0x80000000) -+ -+/* Bit definitions and macros for MCF_PSC_TFCR */ -+#define MCF_PSC_TFCR_CNTR(x) (((x)&0x0000FFFF)<<0) -+#define MCF_PSC_TFCR_TXW_MSK (0x00040000) -+#define MCF_PSC_TFCR_OF_MSK (0x00080000) -+#define MCF_PSC_TFCR_UF_MSK (0x00100000) -+#define MCF_PSC_TFCR_RXW_MSK (0x00200000) -+#define MCF_PSC_TFCR_FAE_MSK (0x00400000) -+#define MCF_PSC_TFCR_IP_MSK (0x00800000) -+#define MCF_PSC_TFCR_GR(x) (((x)&0x00000007)<<24) -+#define MCF_PSC_TFCR_FRMEN (0x08000000) -+#define MCF_PSC_TFCR_TIMER (0x10000000) -+#define MCF_PSC_TFCR_WRITETAG (0x20000000) -+#define MCF_PSC_TFCR_SHADOW (0x80000000) -+ -+/* Bit definitions and macros for MCF_PSC_RFAR */ -+#define MCF_PSC_RFAR_ALARM(x) (((x)&0x01FF)<<0) -+ -+/* Bit definitions and macros for MCF_PSC_TFAR */ -+#define MCF_PSC_TFAR_ALARM(x) (((x)&0x01FF)<<0) -+ -+/* Bit definitions and macros for MCF_PSC_RFRP */ -+#define MCF_PSC_RFRP_READ(x) (((x)&0x01FF)<<0) -+ -+/* Bit definitions and macros for MCF_PSC_TFRP */ -+#define MCF_PSC_TFRP_READ(x) (((x)&0x01FF)<<0) -+ -+/* Bit definitions and macros for MCF_PSC_RFWP */ -+#define MCF_PSC_RFWP_WRITE(x) (((x)&0x01FF)<<0) -+ -+/* Bit definitions and macros for MCF_PSC_TFWP */ -+#define MCF_PSC_TFWP_WRITE(x) (((x)&0x01FF)<<0) -+ -+/* Bit definitions and macros for MCF_PSC_RLRFP */ -+#define MCF_PSC_RLRFP_LFP(x) (((x)&0x01FF)<<0) -+ -+/* Bit definitions and macros for MCF_PSC_TLRFP */ -+#define MCF_PSC_TLRFP_LFP(x) (((x)&0x01FF)<<0) -+ -+/* Bit definitions and macros for MCF_PSC_RLWFP */ -+#define MCF_PSC_RLWFP_LFP(x) (((x)&0x01FF)<<0) -+ -+/* Bit definitions and macros for MCF_PSC_TLWFP */ -+#define MCF_PSC_TLWFP_LFP(x) (((x)&0x01FF)<<0) -+ -+/********************************************************************/ -+ -+#endif /* __MCF548X_PSC_H__ */ ---- /dev/null -+++ b/include/asm-m68k/m5485sim.h -@@ -0,0 +1,221 @@ -+/* -+ * m5485sim.h -- ColdFire 547x/548x System Integration Unit support. -+ */ -+ -+#ifndef m5485sim_h -+#define m5485sim_h -+ -+ -+/* -+ * System Integration Unit Registers -+ */ -+#define MCF_SDRAMDS MCF_REG32(0x000004) /* SDRAM Drive Strength */ -+#define MCF_SBCR MCF_REG32(0x000010) /* System Breakpoint Control */ -+#define MCF_CSnCFG(x) MCF_REG32(0x000020+(x*4))/* SDRAM Chip Select X */ -+#define MCF_SECSACR MCF_REG32(0x000038) /* Sequential Access Control */ -+#define MCF_RSR MCF_REG32(0x000044) /* Reset Status */ -+#define MCF_JTAGID MCF_REG32(0x000050) /* JTAG Device Identification */ -+ -+/* -+ * FlexBus Chip Selects Registers -+ */ -+#define MCF_CSARn(x) MCF_REG32(0x000500+(x*0xC)) -+#define MCF_CSMRn(x) MCF_REG32(0x000504+(x*0xC)) -+#define MCF_CSCRn(x) MCF_REG32(0x000508+(x*0xC)) -+ -+/* -+ * Interrupt Controller Registers -+ */ -+#define MCF_IPRH MCF_REG32(0x000700) -+#define MCF_IPRL MCF_REG32(0x000704) -+#define MCF_IMRH MCF_REG32(0x000708) -+#define MCF_IMRL MCF_REG32(0x00070C) -+#define MCF_INTFRCH MCF_REG32(0x000710) -+#define MCF_INTFRCL MCF_REG32(0x000714) -+#define MCF_IRLR MCF_REG08(0x000718) -+#define MCF_IACKLPR MCF_REG08(0x000719) -+#define MCF_SWIACK MCF_REG08(0x0007E0) -+#define MCF_LnIACK(x) MCF_REG08(0x0007E4+((x)*0x004)) -+#define MCF_ICR(x) MCF_REG08(0x000740+((x)*0x001)) -+ -+/* -+ * Slice Timers Registers -+ */ -+#define MCF_SLTCNT(x) MCF_REG32(0x000900+((x)*0x010)) -+#define MCF_SCR(x) MCF_REG32(0x000904+((x)*0x010)) -+#define MCF_SCNT(x) MCF_REG32(0x000908+((x)*0x010)) -+#define MCF_SSR(x) MCF_REG32(0x00090C+((x)*0x010)) -+ -+/* -+ * Interrupt sources -+ */ -+#define ISC_EPORT_Fn(x) (x) /* EPORT Interrupts */ -+#define ISC_USB_EPn(x) (15+(x)) /* USB Endopint */ -+#define ISC_USB_ISR (22) /* USB General source */ -+#define ISC_USB_AISR (22) /* USB core source */ -+#define ISC_DSPI_OVRFW (25) /* DSPI overflow */ -+#define ISC_DSPI_RFOF (26) -+#define ISC_DSPI_RFDF (27) -+#define ISC_DSPI_TFUF (28) -+#define ISC_DSPI_TCF (29) -+#define ISC_DSPI_TFFF (30) -+#define ISC_DSPI_EOQF (31) -+#define ISC_PSCn(x) (35-(x)) -+#define ISC_COMM_TIM (36) -+#define ISC_SEC (37) -+#define ISC_FEC1 (38) -+#define ISC_FEC0 (39) -+#define ISC_I2C (40) -+#define ISC_PCI_ARB (41) -+#define ISC_PCI_CB (42) -+#define ISC_PCI_XLB (43) -+#define ISC_DMA (48) -+#define ISC_CANn_ERR(x) (49+(6*(x))) -+#define ISC_CANn_BUSOFF(x) (50+(6*(x))) -+#define ISC_CANn_MBOR(x) (51+(6*(x))) -+#define ISC_CAN0_WAKEIN (52) -+#define ISC_SLTn(x) (54-(x)) -+#define ISC_GPTn(x) (62-(x)) -+ -+/* -+ * Interrupt level and priorities -+ */ -+#define ILP_TOP (MCF_ICR_IL(5) | MCF_ICR_IP(3)) -+#define ILP_SLT0 (MCF_ICR_IL(5) | MCF_ICR_IP(2)) -+#define ILP_SLT1 (MCF_ICR_IL(5) | MCF_ICR_IP(1)) -+#define ILP_DMA (MCF_ICR_IL(5) | MCF_ICR_IP(0)) -+#define ILP_SEC (MCF_ICR_IL(4) | MCF_ICR_IP(7)) -+#define ILP_FEC0 (MCF_ICR_IL(4) | MCF_ICR_IP(6)) -+#define ILP_FEC1 (MCF_ICR_IL(4) | MCF_ICR_IP(5)) -+#define ILP_PCI_XLB (MCF_ICR_IL(4) | MCF_ICR_IP(4)) -+#define ILP_PCI_ARB (MCF_ICR_IL(4) | MCF_ICR_IP(3)) -+#define ILP_PCI_CB (MCF_ICR_IL(4) | MCF_ICR_IP(2)) -+#define ILP_I2C (MCF_ICR_IL(4) | MCF_ICR_IP(1)) -+ -+#define ILP_USB_EPn(x) (MCF_ICR_IL(3) | MCF_ICR_IP(7-(x))) -+#define ILP_USB_EP0 (MCF_ICR_IL(3) | MCF_ICR_IP(7)) -+#define ILP_USB_EP1 (MCF_ICR_IL(3) | MCF_ICR_IP(6)) -+#define ILP_USB_EP2 (MCF_ICR_IL(3) | MCF_ICR_IP(5)) -+#define ILP_USB_EP3 (MCF_ICR_IL(3) | MCF_ICR_IP(4)) -+#define ILP_USB_EP4 (MCF_ICR_IL(3) | MCF_ICR_IP(3)) -+#define ILP_USB_EP5 (MCF_ICR_IL(3) | MCF_ICR_IP(2)) -+#define ILP_USB_EP6 (MCF_ICR_IL(3) | MCF_ICR_IP(1)) -+#define ILP_USB_ISR (MCF_ICR_IL(3) | MCF_ICR_IP(0)) -+ -+#define ILP_USB_AISR (MCF_ICR_IL(2) | MCF_ICR_IP(7)) -+#define ILP_DSPI_OVRFW (MCF_ICR_IL(2) | MCF_ICR_IP(6)) -+#define ILP_DSPI_RFOF (MCF_ICR_IL(2) | MCF_ICR_IP(5)) -+#define ILP_DSPI_RFDF (MCF_ICR_IL(2) | MCF_ICR_IP(4)) -+#define ILP_DSPI_TFUF (MCF_ICR_IL(2) | MCF_ICR_IP(3)) -+#define ILP_DSPI_TCF (MCF_ICR_IL(2) | MCF_ICR_IP(2)) -+#define ILP_DSPI_TFFF (MCF_ICR_IL(2) | MCF_ICR_IP(1)) -+#define ILP_DSPI_EOQF (MCF_ICR_IL(2) | MCF_ICR_IP(0)) -+ -+#define ILP_COMM_TIM (MCF_ICR_IL(1) | MCF_ICR_IP(7)) -+#define ILP_PSCn(x) (MCF_ICR_IL(1) | MCF_ICR_IP(3-((x)&3))) -+#define ILP_PSC0 (MCF_ICR_IL(1) | MCF_ICR_IP(3)) -+#define ILP_PSC1 (MCF_ICR_IL(1) | MCF_ICR_IP(2)) -+#define ILP_PSC2 (MCF_ICR_IL(1) | MCF_ICR_IP(1)) -+#define ILP_PSC3 (MCF_ICR_IL(1) | MCF_ICR_IP(0)) -+ -+ -+ -+ -+ -+/********************************************************************/ -+ -+/* -+ * System Integration Unit Bitfields -+ */ -+ -+/* SBCR */ -+#define MCF_SBCR_PIN2DSPI (0x08000000) -+#define MCF_SBCR_DMA2CPU (0x10000000) -+#define MCF_SBCR_CPU2DMA (0x20000000) -+#define MCF_SBCR_PIN2DMA (0x40000000) -+#define MCF_SBCR_PIN2CPU (0x80000000) -+ -+/* SECSACR */ -+#define MCF_SECSACR_SEQEN (0x00000001) -+ -+/* RSR */ -+#define MCF_RSR_RST (0x00000001) -+#define MCF_RSR_RSTWD (0x00000002) -+#define MCF_RSR_RSTJTG (0x00000008) -+ -+/* JTAGID */ -+#define MCF_JTAGID_REV (0xF0000000) -+#define MCF_JTAGID_PROCESSOR (0x0FFFFFFF) -+#define MCF_JTAGID_MCF5485 (0x0800C01D) -+#define MCF_JTAGID_MCF5484 (0x0800D01D) -+#define MCF_JTAGID_MCF5483 (0x0800E01D) -+#define MCF_JTAGID_MCF5482 (0x0800F01D) -+#define MCF_JTAGID_MCF5481 (0x0801001D) -+#define MCF_JTAGID_MCF5480 (0x0801101D) -+#define MCF_JTAGID_MCF5475 (0x0801201D) -+#define MCF_JTAGID_MCF5474 (0x0801301D) -+#define MCF_JTAGID_MCF5473 (0x0801401D) -+#define MCF_JTAGID_MCF5472 (0x0801501D) -+#define MCF_JTAGID_MCF5471 (0x0801601D) -+#define MCF_JTAGID_MCF5470 (0x0801701D) -+ -+ -+/* -+ * Interrupt Controller Bitfields -+ */ -+#define MCF_IRLR_IRQ(x) (((x)&0x7F)<<1) -+#define MCF_IACKLPR_PRI(x) (((x)&0x0F)<<0) -+#define MCF_IACKLPR_LEVEL(x) (((x)&0x07)<<4) -+#define MCF_ICR_IP(x) (((x)&0x07)<<0) -+#define MCF_ICR_IL(x) (((x)&0x07)<<3) -+ -+/* -+ * Slice Timers Bitfields -+ */ -+#define MCF_SCR_TEN (0x01000000) -+#define MCF_SCR_IEN (0x02000000) -+#define MCF_SCR_RUN (0x04000000) -+#define MCF_SSR_ST (0x01000000) -+#define MCF_SSR_BE (0x02000000) -+ -+ -+/* -+ * Some needed coldfire registers -+ */ -+#define MCF_PAR_PCIBG MCF_REG16(0x000A48) -+#define MCF_PAR_PCIBR MCF_REG16(0x000A4A) -+#define MCF_PAR_PSCn(x) MCF_REG08(0x000A4F-((x)&0x3)) -+#define MCF_PAR_FECI2CIRQ MCF_REG16(0x000A44) -+#define MCF_PAR_DSPI MCF_REG16(0x000A50) -+#define MCF_PAR_TIMER MCF_REG08(0X000A52) -+#define MCF_EPPAR MCF_REG16(0x000F00) -+#define MCF_EPIER MCF_REG08(0x000F05) -+#define MCF_EPFR MCF_REG08(0x000F0C) -+ -+/* -+ * Some GPIO bitfields -+ */ -+#define MCF_PAR_SDA (0x0008) -+#define MCF_PAR_SCL (0x0004) -+#define MCF_PAR_PSC_TXD (0x04) -+#define MCF_PAR_PSC_RXD (0x08) -+#define MCF_PAR_PSC_RTS(x) (((x)&0x03)<<4) -+#define MCF_PAR_PSC_CTS(x) (((x)&0x03)<<6) -+#define MCF_PAR_PSC_CTS_GPIO (0x00) -+#define MCF_PAR_PSC_CTS_BCLK (0x80) -+#define MCF_PAR_PSC_CTS_CTS (0xC0) -+#define MCF_PAR_PSC_RTS_GPIO (0x00) -+#define MCF_PAR_PSC_RTS_FSYNC (0x20) -+#define MCF_PAR_PSC_RTS_RTS (0x30) -+#define MCF_PAR_PSC_CANRX (0x40) -+ -+ -+/* -+ * Some used coldfire values -+ */ -+#define MCF_EPIER_EPIE(x) (0x01 << (x)) -+#define MCF_EPPAR_EPPAx_FALLING (2) -+#define MCF_EPPAR_EPPA(n,x) (((x)&0x0003) << (2*n)) -+ -+ -+#endif /* m5485sim_h */ ---- /dev/null -+++ b/include/asm-m68k/m5485sram.h -@@ -0,0 +1,12 @@ -+#ifndef SYS_SRAM_H -+#define SYS_SRAM_H -+ -+ -+#define SYS_SRAM_DMA_START MCF_MBAR + 0x10000 -+#define SYS_SRAM_DMA_SIZE 8192 -+#define SYS_SRAM_FEC_START SYS_SRAM_DMA_START + SYS_SRAM_DMA_SIZE -+#define SYS_SRAM_FEC_SIZE 2048 -+#define SYS_SRAM_SEC_START SYS_SRAM_FEC_START + SYS_SRAM_FEC_SIZE -+#define SYS_SRAM_SEC_SIZE 1280 -+ -+#endif /* SYS_SRAM_H */ ---- a/include/asm-m68k/machdep.h -+++ b/include/asm-m68k/machdep.h -@@ -32,4 +32,11 @@ extern void (*mach_heartbeat) (int); - extern void (*mach_l2_flush) (int); - extern void (*mach_beep) (unsigned int, unsigned int); - -+#ifdef CONFIG_COLDFIRE -+extern void __init config_coldfire(void); -+extern void __init mmu_context_init(void); -+extern irq_handler_t mach_default_handler; -+extern void (*mach_tick)(void); -+#endif -+ - #endif /* _M68K_MACHDEP_H */ ---- /dev/null -+++ b/include/asm-m68k/MCD_dma.h -@@ -0,0 +1,408 @@ -+/********************************************************************* -+ * -+ * Copyright (C) 2004 Motorola, Inc. -+ * MOTOROLA, INC. All Rights Reserved. -+ * You are hereby granted a copyright license to use -+ * the SOFTWARE so long as this entire notice is -+ * retained without alteration in any modified and/or redistributed -+ * versions, and that such modified versions are clearly identified -+ * as such. No licenses are granted by implication, estoppel or -+ * otherwise under any patents or trademarks of Motorola, Inc. This -+ * software is provided on an "AS IS" basis and without warranty. -+ * -+ * To the maximum extent permitted by applicable law, MOTOROLA -+ * DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED, INCLUDING -+ * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR -+ * PURPOSE AND ANY WARRANTY AGAINST INFRINGEMENT WITH REGARD TO THE -+ * SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF) AND ANY -+ * ACCOMPANYING WRITTEN MATERIALS. -+ * -+ * To the maximum extent permitted by applicable law, IN NO EVENT -+ * SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER (INCLUDING -+ * WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS -+ * INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY -+ * LOSS) ARISING OF THE USE OR INABILITY TO USE THE SOFTWARE. -+ * -+ * Motorola assumes no responsibility for the maintenance and support -+ * of this software -+ ********************************************************************/ -+ -+/* -+ * File: MCD_dma.h -+ * Purpose: Main header file for multi-channel DMA API. -+ * -+ * Notes: -+ * -+ * Modifications: -+ */ -+#ifndef _MCD_API_H -+#define _MCD_API_H -+ -+#include <asm/types.h> -+ -+/* -+ * Turn Execution Unit tasks ON (#define) or OFF (#undef) -+ */ -+#undef MCD_INCLUDE_EU -+ -+/* -+ * Number of DMA channels -+ */ -+#define NCHANNELS 16 -+ -+/* -+ * Total number of variants -+ */ -+#ifdef MCD_INCLUDE_EU -+#define NUMOFVARIANTS 6 -+#else -+#define NUMOFVARIANTS 4 -+#endif -+ -+/* -+ * Define sizes of the various tables -+ */ -+#define TASK_TABLE_SIZE (NCHANNELS*32) -+#define VAR_TAB_SIZE (128) -+#define CONTEXT_SAVE_SIZE (128) -+#define FUNCDESC_TAB_SIZE (256) -+ -+#ifdef MCD_INCLUDE_EU -+#define FUNCDESC_TAB_NUM 16 -+#else -+#define FUNCDESC_TAB_NUM 1 -+#endif -+ -+ -+#ifndef DEFINESONLY -+ -+/* -+ * Portability typedefs -+ */ -+ /* -+#ifndef s32 -+typedef int s32; -+#endif -+#ifndef u32 -+typedef unsigned int u32; -+#endif -+#ifndef s16 -+typedef short s16; -+#endif -+#ifndef u16 -+typedef unsigned short u16; -+#endif -+#ifndef s8 -+typedef char s8; -+#endif -+#ifndef u8 -+typedef unsigned char u8; -+#endif -+*/ -+/* -+ * These structures represent the internal registers of the -+ * multi-channel DMA -+ */ -+struct dmaRegs_s { -+ u32 taskbar; /* task table base address register */ -+ u32 currPtr; -+ u32 endPtr; -+ u32 varTablePtr; -+ u16 dma_rsvd0; -+ u16 ptdControl; /* ptd control */ -+ u32 intPending; /* interrupt pending register */ -+ u32 intMask; /* interrupt mask register */ -+ u16 taskControl[16]; /* task control registers */ -+ u8 priority[32]; /* priority registers */ -+ u32 initiatorMux; /* initiator mux control */ -+ u32 taskSize0; /* task size control register 0. */ -+ u32 taskSize1; /* task size control register 1. */ -+ u32 dma_rsvd1; /* reserved */ -+ u32 dma_rsvd2; /* reserved */ -+ u32 debugComp1; /* debug comparator 1 */ -+ u32 debugComp2; /* debug comparator 2 */ -+ u32 debugControl; /* debug control */ -+ u32 debugStatus; /* debug status */ -+ u32 ptdDebug; /* priority task decode debug */ -+ u32 dma_rsvd3[31]; /* reserved */ -+}; -+typedef volatile struct dmaRegs_s dmaRegs; -+ -+#endif -+ -+/* -+ * PTD contrl reg bits -+ */ -+#define PTD_CTL_TSK_PRI 0x8000 -+#define PTD_CTL_COMM_PREFETCH 0x0001 -+ -+/* -+ * Task Control reg bits and field masks -+ */ -+#define TASK_CTL_EN 0x8000 -+#define TASK_CTL_VALID 0x4000 -+#define TASK_CTL_ALWAYS 0x2000 -+#define TASK_CTL_INIT_MASK 0x1f00 -+#define TASK_CTL_ASTRT 0x0080 -+#define TASK_CTL_HIPRITSKEN 0x0040 -+#define TASK_CTL_HLDINITNUM 0x0020 -+#define TASK_CTL_ASTSKNUM_MASK 0x000f -+ -+/* -+ * Priority reg bits and field masks -+ */ -+#define PRIORITY_HLD 0x80 -+#define PRIORITY_PRI_MASK 0x07 -+ -+/* -+ * Debug Control reg bits and field masks -+ */ -+#define DBG_CTL_BLOCK_TASKS_MASK 0xffff0000 -+#define DBG_CTL_AUTO_ARM 0x00008000 -+#define DBG_CTL_BREAK 0x00004000 -+#define DBG_CTL_COMP1_TYP_MASK 0x00003800 -+#define DBG_CTL_COMP2_TYP_MASK 0x00000070 -+#define DBG_CTL_EXT_BREAK 0x00000004 -+#define DBG_CTL_INT_BREAK 0x00000002 -+ -+/* -+ * PTD Debug reg selector addresses -+ * This reg must be written with a value to show the contents of -+ * one of the desired internal register. -+ */ -+#define PTD_DBG_REQ 0x00 /* shows the state of 31 initiators */ -+#define PTD_DBG_TSK_VLD_INIT 0x01 /* shows which 16 tasks are valid and -+ have initiators asserted */ -+ -+ -+/* -+ * General return values -+ */ -+#define MCD_OK 0 -+#define MCD_ERROR -1 -+#define MCD_TABLE_UNALIGNED -2 -+#define MCD_CHANNEL_INVALID -3 -+ -+/* -+ * MCD_initDma input flags -+ */ -+#define MCD_RELOC_TASKS 0x00000001 -+#define MCD_NO_RELOC_TASKS 0x00000000 -+#define MCD_COMM_PREFETCH_EN 0x00000002 /* Commbus Prefetching - MCF547x/548x ONLY */ -+ -+/* -+ * MCD_dmaStatus Status Values for each channel -+ */ -+#define MCD_NO_DMA 1 /* No DMA has been requested since reset */ -+#define MCD_IDLE 2 /* DMA active, but the initiator is currently inactive */ -+#define MCD_RUNNING 3 /* DMA active, and the initiator is currently active */ -+#define MCD_PAUSED 4 /* DMA active but it is currently paused */ -+#define MCD_HALTED 5 /* the most recent DMA has been killed with MCD_killTask() */ -+#define MCD_DONE 6 /* the most recent DMA has completed. */ -+ -+ -+/* -+ * MCD_startDma parameter defines -+ */ -+ -+/* -+ * Constants for the funcDesc parameter -+ */ -+/* Byte swapping: */ -+#define MCD_NO_BYTE_SWAP 0x00045670 /* to disable byte swapping. */ -+#define MCD_BYTE_REVERSE 0x00076540 /* to reverse the bytes of each u32 of the DMAed data. */ -+#define MCD_U16_REVERSE 0x00067450 /* to reverse the 16-bit halves of -+ each 32-bit data value being DMAed.*/ -+#define MCD_U16_BYTE_REVERSE 0x00054760 /* to reverse the byte halves of each -+ 16-bit half of each 32-bit data value DMAed */ -+#define MCD_NO_BIT_REV 0x00000000 /* do not reverse the bits of each byte DMAed. */ -+#define MCD_BIT_REV 0x00088880 /* reverse the bits of each byte DMAed */ -+/* CRCing: */ -+#define MCD_CRC16 0xc0100000 /* to perform CRC-16 on DMAed data. */ -+#define MCD_CRCCCITT 0xc0200000 /* to perform CRC-CCITT on DMAed data. */ -+#define MCD_CRC32 0xc0300000 /* to perform CRC-32 on DMAed data. */ -+#define MCD_CSUMINET 0xc0400000 /* to perform internet checksums on DMAed data.*/ -+#define MCD_NO_CSUM 0xa0000000 /* to perform no checksumming. */ -+ -+#define MCD_FUNC_NOEU1 (MCD_NO_BYTE_SWAP | MCD_NO_BIT_REV | MCD_NO_CSUM) -+#define MCD_FUNC_NOEU2 (MCD_NO_BYTE_SWAP | MCD_NO_CSUM) -+ -+/* -+ * Constants for the flags parameter -+ */ -+#define MCD_TT_FLAGS_RL 0x00000001 /* Read line */ -+#define MCD_TT_FLAGS_CW 0x00000002 /* Combine Writes */ -+#define MCD_TT_FLAGS_SP 0x00000004 /* Speculative prefetch(XLB) MCF547x/548x ONLY */ -+#define MCD_TT_FLAGS_MASK 0x000000ff -+#define MCD_TT_FLAGS_DEF (MCD_TT_FLAGS_RL | MCD_TT_FLAGS_CW) -+ -+#define MCD_SINGLE_DMA 0x00000100 /* Unchained DMA */ -+#define MCD_CHAIN_DMA /* TBD */ -+#define MCD_EU_DMA /* TBD */ -+#define MCD_FECTX_DMA 0x00001000 /* FEC TX ring DMA */ -+#define MCD_FECRX_DMA 0x00002000 /* FEC RX ring DMA */ -+ -+ -+/* these flags are valid for MCD_startDma and the chained buffer descriptors */ -+#define MCD_BUF_READY 0x80000000 /* indicates that this buffer is now under the DMA's control */ -+#define MCD_WRAP 0x20000000 /* to tell the FEC Dmas to wrap to the first BD */ -+#define MCD_INTERRUPT 0x10000000 /* to generate an interrupt after completion of the DMA. */ -+#define MCD_END_FRAME 0x08000000 /* tell the DMA to end the frame when transferring -+ last byte of data in buffer */ -+#define MCD_CRC_RESTART 0x40000000 /* to empty out the accumulated checksum -+ prior to performing the DMA. */ -+ -+/* Defines for the FEC buffer descriptor control/status word*/ -+#define MCD_FEC_BUF_READY 0x8000 -+#define MCD_FEC_WRAP 0x2000 -+#define MCD_FEC_INTERRUPT 0x1000 -+#define MCD_FEC_END_FRAME 0x0800 -+ -+ -+/* -+ * Defines for general intuitiveness -+ */ -+ -+#define MCD_TRUE 1 -+#define MCD_FALSE 0 -+ -+/* -+ * Three different cases for destination and source. -+ */ -+#define MINUS1 -1 -+#define ZERO 0 -+#define PLUS1 1 -+ -+#ifndef DEFINESONLY -+ -+/* Task Table Entry struct*/ -+typedef struct { -+ u32 TDTstart; /* task descriptor table start */ -+ u32 TDTend; /* task descriptor table end */ -+ u32 varTab; /* variable table start */ -+ u32 FDTandFlags; /* function descriptor table start and flags */ -+ volatile u32 descAddrAndStatus; -+ volatile u32 modifiedVarTab; -+ u32 contextSaveSpace; /* context save space start */ -+ u32 literalBases; -+} TaskTableEntry; -+ -+ -+/* Chained buffer descriptor */ -+typedef volatile struct MCD_bufDesc_struct MCD_bufDesc; -+struct MCD_bufDesc_struct { -+ u32 flags; /* flags describing the DMA */ -+ u32 csumResult; /* checksum from checksumming performed since last checksum reset */ -+ s8 *srcAddr; /* the address to move data from */ -+ s8 *destAddr; /* the address to move data to */ -+ s8 *lastDestAddr; /* the last address written to */ -+ u32 dmaSize; /* the number of bytes to transfer independent of the transfer size */ -+ MCD_bufDesc *next; /* next buffer descriptor in chain */ -+ u32 info; /* private information about this descriptor; DMA does not affect it */ -+}; -+ -+/* Progress Query struct */ -+typedef volatile struct MCD_XferProg_struct { -+ s8 *lastSrcAddr; /* the most-recent or last, post-increment source address */ -+ s8 *lastDestAddr; /* the most-recent or last, post-increment destination address */ -+ u32 dmaSize; /* the amount of data transferred for the current buffer */ -+ MCD_bufDesc *currBufDesc;/* pointer to the current buffer descriptor being DMAed */ -+} MCD_XferProg; -+ -+ -+/* FEC buffer descriptor */ -+typedef volatile struct MCD_bufDescFec_struct { -+ u16 statCtrl; -+ u16 length; -+ u32 dataPointer; -+} MCD_bufDescFec; -+ -+ -+/*************************************************************************/ -+/* -+ * API function Prototypes - see MCD_dmaApi.c for further notes -+ */ -+ -+/* -+ * MCD_startDma starts a particular kind of DMA . -+ */ -+int MCD_startDma ( -+ int channel, /* the channel on which to run the DMA */ -+ s8 *srcAddr, /* the address to move data from, or buffer-descriptor address */ -+ s16 srcIncr, /* the amount to increment the source address per transfer */ -+ s8 *destAddr, /* the address to move data to */ -+ s16 destIncr, /* the amount to increment the destination address per transfer */ -+ u32 dmaSize, /* the number of bytes to transfer independent of the transfer size */ -+ u32 xferSize, /* the number bytes in of each data movement (1, 2, or 4) */ -+ u32 initiator, /* what device initiates the DMA */ -+ int priority, /* priority of the DMA */ -+ u32 flags, /* flags describing the DMA */ -+ u32 funcDesc /* a description of byte swapping, bit swapping, and CRC actions */ -+); -+ -+/* -+ * MCD_initDma() initializes the DMA API by setting up a pointer to the DMA -+ * registers, relocating and creating the appropriate task structures, and -+ * setting up some global settings -+ */ -+int MCD_initDma (dmaRegs *sDmaBarAddr, void *taskTableDest, u32 flags); -+ -+/* -+ * MCD_dmaStatus() returns the status of the DMA on the requested channel. -+ */ -+int MCD_dmaStatus (int channel); -+ -+/* -+ * MCD_XferProgrQuery() returns progress of DMA on requested channel -+ */ -+int MCD_XferProgrQuery (int channel, MCD_XferProg *progRep); -+ -+/* -+ * MCD_killDma() halts the DMA on the requested channel, without any -+ * intention of resuming the DMA. -+ */ -+int MCD_killDma (int channel); -+ -+/* -+ * MCD_continDma() continues a DMA which as stopped due to encountering an -+ * unready buffer descriptor. -+ */ -+int MCD_continDma (int channel); -+ -+/* -+ * MCD_pauseDma() pauses the DMA on the given channel ( if any DMA is -+ * running on that channel). -+ */ -+int MCD_pauseDma (int channel); -+ -+/* -+ * MCD_resumeDma() resumes the DMA on a given channel (if any DMA is -+ * running on that channel). -+ */ -+int MCD_resumeDma (int channel); -+ -+/* -+ * MCD_csumQuery provides the checksum/CRC after performing a non-chained DMA -+ */ -+int MCD_csumQuery (int channel, u32 *csum); -+ -+/* -+ * MCD_getCodeSize provides the packed size required by the microcoded task -+ * and structures. -+ */ -+int MCD_getCodeSize(void); -+ -+/* -+ * MCD_getVersion provides a pointer to a version string and returns a -+ * version number. -+ */ -+int MCD_getVersion(char **longVersion); -+ -+/* macro for setting a location in the variable table */ -+#define MCD_SET_VAR(taskTab,idx,value) ((u32 *)(taskTab)->varTab)[idx] = value -+ /* Note that MCD_SET_VAR() is invoked many times in firing up a DMA function, -+ so I'm avoiding surrounding it with "do {} while(0)" */ -+ -+#endif /* DEFINESONLY */ -+ -+#endif /* _MCD_API_H */ ---- /dev/null -+++ b/include/asm-m68k/mcf5445x_ccm.h -@@ -0,0 +1,163 @@ -+/* -+ * Matt Waddel Matt.Waddel@freescale.com -+ * -+ * Copyright Freescale Semiconductor, Inc. 2007 -+ * -+ * This program is free software; you can redistribute it and/or modify it -+ * under the terms of the GNU General Public License as published by the -+ * Free Software Foundation; either version 2 of the License, or (at your -+ * option) any later version. -+ */ -+ -+#ifndef __MCF5445X_CCM_H__ -+#define __MCF5445X_CCM_H__ -+ -+/********************************************************************* -+* -+* Chip Configuration Module (CCM) -+* -+*********************************************************************/ -+ -+/* Register read/write macros */ -+#define MCF_CCM_CCR MCF_REG16(0xFC0A0004) /* Chip Configuration Register (Read-only) (256 or 360 TEPBGA) */ -+#define MCF_CCM_RCON MCF_REG16(0xFC0A0008) /* Reset Configuration (Read-only) (256 or 360 TEPBGA) */ -+#define MCF_CCM_CIR MCF_REG16(0xFC0A000A) /* Chip Identification Register (Read-only) */ -+#define MCF_CCM_MISCCR MCF_REG16(0xFC0A0010) /* Miscellaneous Control Register */ -+#define MCF_CCM_CDR MCF_REG16(0xFC0A0012) /* Clock Divider Register */ -+#define MCF_CCM_UOCSR MCF_REG16(0xFC0A0014) /* USB On-the-Go Controller Status Register */ -+#define MCF_CCM_SBFSR MCF_REG16(0xFC0A0018) /* Serial Boot Facility Status Register (Read Only) */ -+#define MCF_CCM_SBFCR MCF_REG16(0xFC0A0020) /* Serial Boot Facility Control Register */ -+ -+/* Bit definitions and macros for CCR_360 */ -+#define MCF_CCM_CCR_360_PLLMULT2(x) (((x) & 0x0003)) /* 2-Bit PLL clock mode */ -+#define MCF_CCM_CCR_360_PCISLEW (0x0004) /* PCI pad slew rate mode */ -+#define MCF_CCM_CCR_360_PCIMODE (0x0008) /* PCI host/agent mode */ -+#define MCF_CCM_CCR_360_PLLMODE (0x0010) /* PLL Mode */ -+#define MCF_CCM_CCR_360_FBCONFIG(x) (((x) & 0x0007) << 5) /* Flexbus/PCI port size configuration */ -+#define MCF_CCM_CCR_360_PLLMULT3(x) (((x) & 0x0007)) /* 3-Bit PLL Clock Mode */ -+#define MCF_CCM_CCR_360_OSCMODE (0x0008) /* Oscillator Clock Mode */ -+#define MCF_CCM_CCR_360_FBCONFIG_MASK (0x00E0) -+#define MCF_CCM_CCR_360_PLLMULT2_MASK (0x0003) -+#define MCF_CCM_CCR_360_PLLMULT3_MASK (0x0007) -+#define MCF_CCM_CCR_360_FBCONFIG_NM_NP_32 (0x0000) -+#define MCF_CCM_CCR_360_FBCONFIG_NM_NP_8 (0x0020) -+#define MCF_CCM_CCR_360_FBCONFIG_NM_NP_16 (0x0040) -+#define MCF_CCM_CCR_360_FBCONFIG_M_P_16 (0x0060) -+#define MCF_CCM_CCR_360_FBCONFIG_M_NP_32 (0x0080) -+#define MCF_CCM_CCR_360_FBCONFIG_M_NP_8 (0x00A0) -+#define MCF_CCM_CCR_360_FBCONFIG_M_NP_16 (0x00C0) -+#define MCF_CCM_CCR_360_FBCONFIG_M_P_8 (0x00E0) -+#define MCF_CCM_CCR_360_PLLMULT2_12X (0x0000) -+#define MCF_CCM_CCR_360_PLLMULT2_6X (0x0001) -+#define MCF_CCM_CCR_360_PLLMULT2_16X (0x0002) -+#define MCF_CCM_CCR_360_PLLMULT2_8X (0x0003) -+#define MCF_CCM_CCR_360_PLLMULT3_20X (0x0000) -+#define MCF_CCM_CCR_360_PLLMULT3_10X (0x0001) -+#define MCF_CCM_CCR_360_PLLMULT3_24X (0x0002) -+#define MCF_CCM_CCR_360_PLLMULT3_18X (0x0003) -+#define MCF_CCM_CCR_360_PLLMULT3_12X (0x0004) -+#define MCF_CCM_CCR_360_PLLMULT3_6X (0x0005) -+#define MCF_CCM_CCR_360_PLLMULT3_16X (0x0006) -+#define MCF_CCM_CCR_360_PLLMULT3_8X (0x0007) -+ -+/* Bit definitions and macros for CCR_256 */ -+#define MCF_CCM_CCR_256_PLLMULT3(x) (((x) & 0x0007)) /* 3-Bit PLL clock mode */ -+#define MCF_CCM_CCR_256_OSCMODE (0x0008) /* Oscillator clock mode */ -+#define MCF_CCM_CCR_256_PLLMODE (0x0010) /* PLL Mode */ -+#define MCF_CCM_CCR_256_FBCONFIG(x) (((x) & 0x0007) << 5) /* Flexbus/PCI port size configuration */ -+#define MCF_CCM_CCR_256_FBCONFIG_MASK (0x00E0) -+#define MCF_CCM_CCR_256_FBCONFIG_NM_32 (0x0000) -+#define MCF_CCM_CCR_256_FBCONFIG_NM_8 (0x0020) -+#define MCF_CCM_CCR_256_FBCONFIG_NM_16 (0x0040) -+#define MCF_CCM_CCR_256_FBCONFIG_M_32 (0x0080) -+#define MCF_CCM_CCR_256_FBCONFIG_M_8 (0x00A0) -+#define MCF_CCM_CCR_256_FBCONFIG_M_16 (0x00C0) -+#define MCF_CCM_CCR_256_PLLMULT3_MASK (0x0007) -+#define MCF_CCM_CCR_256_PLLMULT3_20X (0x0000) -+#define MCF_CCM_CCR_256_PLLMULT3_10X (0x0001) -+#define MCF_CCM_CCR_256_PLLMULT3_24X (0x0002) -+#define MCF_CCM_CCR_256_PLLMULT3_18X (0x0003) -+#define MCF_CCM_CCR_256_PLLMULT3_12X (0x0004) -+#define MCF_CCM_CCR_256_PLLMULT3_6X (0x0005) -+#define MCF_CCM_CCR_256_PLLMULT3_16X (0x0006) -+#define MCF_CCM_CCR_256_PLLMULT3_8X (0x0007) -+ -+/* Bit definitions and macros for RCON_360 */ -+#define MCF_CCM_RCON_360_PLLMULT(x) (((x)&0x0003)) /* PLL clock mode */ -+#define MCF_CCM_RCON_360_PCISLEW (0x0004) /* PCI pad slew rate mode */ -+#define MCF_CCM_RCON_360_PCIMODE (0x0008) /* PCI host/agent mode */ -+#define MCF_CCM_RCON_360_PLLMODE (0x0010) /* PLL Mode */ -+#define MCF_CCM_RCON_360_FBCONFIG(x) (((x) & 0x0007) << 5) /* Flexbus/PCI port size configuration */ -+ -+/* Bit definitions and macros for RCON_256 */ -+#define MCF_CCM_RCON_256_PLLMULT(x) (((x) & 0x0007)) /* PLL clock mode */ -+#define MCF_CCM_RCON_256_OSCMODE (0x0008) /* Oscillator clock mode */ -+#define MCF_CCM_RCON_256_PLLMODE (0x0010) /* PLL Mode */ -+#define MCF_CCM_RCON_256_FBCONFIG(x) (((x) & 0x0007) << 5) /* Flexbus/PCI port size configuration */ -+ -+/* Bit definitions and macros for CIR */ -+#define MCF_CCM_CIR_PRN(x) (((x) & 0x003F)) /* Part revision number */ -+#define MCF_CCM_CIR_PIN(x) (((x) & 0x03FF) << 6) /* Part identification number */ -+#define MCF_CCM_CIR_PIN_MASK (0xFFC0) -+#define MCF_CCM_CIR_PRN_MASK (0x003F) -+#define MCF_CCM_CIR_PIN_MCF54450 (0x4F << 6) -+#define MCF_CCM_CIR_PIN_MCF54451 (0x4D << 6) -+#define MCF_CCM_CIR_PIN_MCF54452 (0x4B << 6) -+#define MCF_CCM_CIR_PIN_MCF54453 (0x49 << 6) -+#define MCF_CCM_CIR_PIN_MCF54454 (0x4A << 6) -+#define MCF_CCM_CIR_PIN_MCF54455 (0x48 << 6) -+ -+/* Bit definitions and macros for MISCCR */ -+#define MCF_CCM_MISCCR_USBSRC (0x0001) /* USB clock source */ -+#define MCF_CCM_MISCCR_USBOC (0x0002) /* USB VBUS over-current sense polarity */ -+#define MCF_CCM_MISCCR_USBPUE (0x0004) /* USB transceiver pull-up enable */ -+#define MCF_CCM_MISCCR_SSISRC (0x0010) /* SSI clock source */ -+#define MCF_CCM_MISCCR_TIMDMA (0x0020) /* Timer DMA mux selection */ -+#define MCF_CCM_MISCCR_SSIPUS (0x0040) /* SSI RXD/TXD pull select */ -+#define MCF_CCM_MISCCR_SSIPUE (0x0080) /* SSI RXD/TXD pull enable */ -+#define MCF_CCM_MISCCR_BMT(x) (((x) & 0x0007) << 8) /* Bus monitor timing field */ -+#define MCF_CCM_MISCCR_BME (0x0800) /* Bus monitor external enable bit */ -+#define MCF_CCM_MISCCR_LIMP (0x1000) /* Limp mode enable */ -+#define MCF_CCM_MISCCR_BMT_65536 (0 << 8) -+#define MCF_CCM_MISCCR_BMT_32768 (1 << 8) -+#define MCF_CCM_MISCCR_BMT_16384 (2 << 8) -+#define MCF_CCM_MISCCR_BMT_8192 (3 << 8) -+#define MCF_CCM_MISCCR_BMT_4096 (4 << 8) -+#define MCF_CCM_MISCCR_BMT_2048 (5 << 8) -+#define MCF_CCM_MISCCR_BMT_1024 (6 << 8) -+#define MCF_CCM_MISCCR_BMT_512 (7 << 8) -+#define MCF_CCM_MISCCR_SSIPUE_UP (1 << 7) -+#define MCF_CCM_MISCCR_SSIPUE_DOWN (0 << 7) -+#define MCF_CCM_MISCCR_SSIPUS_UP (1 << 6) -+#define MCF_CCM_MISCCR_SSIPUS_DOWN (0 << 6) -+#define MCF_CCM_MISCCR_TIMDMA_TIM (1 << 5) -+#define MCF_CCM_MISCCR_TIMDMA_SSI (0 << 5) -+#define MCF_CCM_MISCCR_SSISRC_CLKIN (0 << 4) -+#define MCF_CCM_MISCCR_SSISRC_PLL (1 << 4) -+#define MCF_CCM_MISCCR_USBOC_ACTHI (0 << 1) -+#define MCF_CCM_MISCCR_USBOC_ACTLO (1 << 1) -+#define MCF_CCM_MISCCR_USBSRC_CLKIN (0) -+#define MCF_CCM_MISCCR_USBSRC_PLL (1) -+ -+/* Bit definitions and macros for CDR */ -+#define MCF_CCM_CDR_SSIDIV(x) (((x) & 0x00FF)) /* SSI oversampling clock divider */ -+#define MCF_CCM_CDR_LPDIV(x) (((x) & 0x000F) << 8) /* Low power clock divider */ -+ -+/* Bit definitions and macros for UOCSR */ -+#define MCF_CCM_UOCSR_XPDE (0x0001) /* On-chip transceiver pull-down enable */ -+#define MCF_CCM_UOCSR_UOMIE (0x0002) /* USB OTG misc interrupt enable */ -+#define MCF_CCM_UOCSR_WKUP (0x0004) /* USB OTG controller wake-up event */ -+#define MCF_CCM_UOCSR_PWRFLT (0x0008) /* VBUS power fault */ -+#define MCF_CCM_UOCSR_SEND (0x0010) /* Session end */ -+#define MCF_CCM_UOCSR_VVLD (0x0020) /* VBUS valid indicator */ -+#define MCF_CCM_UOCSR_BVLD (0x0040) /* B-peripheral valid indicator */ -+#define MCF_CCM_UOCSR_AVLD (0x0080) /* A-peripheral valid indicator */ -+#define MCF_CCM_UOCSR_DPPU (0x0100) /* D+ pull-up for FS enabled (read-only) */ -+#define MCF_CCM_UOCSR_DCR_VBUS (0x0200) /* VBUS discharge resistor enabled (read-only) */ -+#define MCF_CCM_UOCSR_CRG_VBUS (0x0400) /* VBUS charge resistor enabled (read-only) */ -+#define MCF_CCM_UOCSR_DMPD (0x1000) /* D- 15Kohm pull-down (read-only) */ -+#define MCF_CCM_UOCSR_DPPD (0x2000) /* D+ 15Kohm pull-down (read-only) */ -+ -+/********************************************************************/ -+ -+#endif /* __MCF5445X_CCM_H__ */ ---- /dev/null -+++ b/include/asm-m68k/mcf5445x_dspi.h -@@ -0,0 +1,402 @@ -+/* -+ * Yaroslav Vinogradov yaroslav.vinogradov@freescale.com -+ * -+ * Copyright Freescale Semiconductor, Inc. 2007 -+ * -+ * This program is free software; you can redistribute it and/or modify it -+ * under the terms of the GNU General Public License as published by the -+ * Free Software Foundation; either version 2 of the License, or (at your -+ * option) any later version. -+ */ -+ -+#ifndef __MCF5445X_DSPI_H__ -+#define __MCF5445X_DSPI_H__ -+ -+/********************************************************************* -+* -+* DMA Serial Peripheral Interface (DSPI) -+* -+*********************************************************************/ -+ -+/* Register read/write macros */ -+#define MCF_DSPI_DMCR MCF_REG32(0xFC05C000) /* DSPI Module Configuration Register */ -+#define MCF_DSPI_DTCR MCF_REG32(0xFC05C008) /* DSPI Transfer Count Register */ -+#define MCF_DSPI_DCTAR0 MCF_REG32(0xFC05C00C) /* DSPI Clock and Transfer Attributes Register */ -+#define MCF_DSPI_DCTAR1 MCF_REG32(0xFC05C010) /* DSPI Clock and Transfer Attributes Register */ -+#define MCF_DSPI_DCTAR2 MCF_REG32(0xFC05C014) /* DSPI Clock and Transfer Attributes Register */ -+#define MCF_DSPI_DCTAR3 MCF_REG32(0xFC05C018) /* DSPI Clock and Transfer Attributes Register */ -+#define MCF_DSPI_DCTAR4 MCF_REG32(0xFC05C01C) /* DSPI Clock and Transfer Attributes Register */ -+#define MCF_DSPI_DCTAR5 MCF_REG32(0xFC05C020) /* DSPI Clock and Transfer Attributes Register */ -+#define MCF_DSPI_DCTAR6 MCF_REG32(0xFC05C024) /* DSPI Clock and Transfer Attributes Register */ -+#define MCF_DSPI_DCTAR7 MCF_REG32(0xFC05C028) /* DSPI Clock and Transfer Attributes Register */ -+#define MCF_DSPI_DSR MCF_REG32(0xFC05C02C) /* DSPI Status Register */ -+#define MCF_DSPI_DRSER MCF_REG32(0xFC05C030) /* DSPI DMA/Interrupt Request Select and Enable Register */ -+#define MCF_DSPI_DTFR MCF_REG32(0xFC05C034) /* DSPI Transmit FIFO Register */ -+#define MCF_DSPI_DRFR MCF_REG32(0xFC05C038) /* DSPI Receive FIFO Register */ -+#define MCF_DSPI_DTFDR0 MCF_REG32(0xFC05C03C) /* DSPI Transmit FIFO Debugging Registers */ -+#define MCF_DSPI_DTFDR1 MCF_REG32(0xFC05C040) /* DSPI Transmit FIFO Debugging Registers */ -+#define MCF_DSPI_DTFDR2 MCF_REG32(0xFC05C044) /* DSPI Transmit FIFO Debugging Registers */ -+#define MCF_DSPI_DTFDR3 MCF_REG32(0xFC05C048) /* DSPI Transmit FIFO Debugging Registers */ -+#define MCF_DSPI_DRFDR0 MCF_REG32(0xFC05C07C) /* DSPI Receive FIFO Debugging Registers */ -+#define MCF_DSPI_DRFDR1 MCF_REG32(0xFC05C080) /* DSPI Receive FIFO Debugging Registers */ -+#define MCF_DSPI_DRFDR2 MCF_REG32(0xFC05C084) /* DSPI Receive FIFO Debugging Registers */ -+#define MCF_DSPI_DRFDR3 MCF_REG32(0xFC05C088) /* DSPI Receive FIFO Debugging Registers */ -+ -+/* Parameterized register read/write macros for multiple registers */ -+#define MCF_DSPI_DCTAR(x) MCF_REG32(0xFC05C00C+((x)*0x004)) /* DSPI Clock and Transfer Attributes Register */ -+#define MCF_DSPI_DTFDR(x) MCF_REG32(0xFC05C03C+((x)*0x004)) /* DSPI Transmit FIFO Debugging Registers */ -+#define MCF_DSPI_DRFDR(x) MCF_REG32(0xFC05C07C+((x)*0x004)) /* DSPI Receive FIFO Debugging Registers */ -+ -+/* Bit definitions and macros for DMCR */ -+#define MCF_DSPI_DMCR_HALT (0x00000001) /* Halt -- stops and starts DSPI transfers */ -+#define MCF_DSPI_DMCR_SMPLPT(x) (((x)&0x00000003)<<8) /* Sample point selection */ -+#define MCF_DSPI_DMCR_CLRRXF (0x00000400) /* Clear receive FIFO */ -+#define MCF_DSPI_DMCR_CLRTXF (0x00000800) /* Clear transmit FIFO */ -+#define MCF_DSPI_DMCR_DISRXF (0x00001000) /* Disable receive FIFO */ -+#define MCF_DSPI_DMCR_DISTXF (0x00002000) /* Disable transmit FIFO */ -+#define MCF_DSPI_DMCR_MDIS (0x00004000) /* Module Disable */ -+#define MCF_DSPI_DMCR_PCSIS0 (0x00010000) /* Peripheral chip-select 0 inactive state */ -+#define MCF_DSPI_DMCR_PCSIS1 (0x00020000) /* Peripheral chip-select 1 inactive state */ -+#define MCF_DSPI_DMCR_PCSIS2 (0x00040000) /* Peripheral chip-select 2 inactive state */ -+#define MCF_DSPI_DMCR_PCSIS3 (0x00080000) /* Peripheral chip-select 3 inactive state */ -+#define MCF_DSPI_DMCR_PCSIS4 (0x00100000) /* Peripheral chip-select 4 inactive state */ -+#define MCF_DSPI_DMCR_PCSIS5 (0x00200000) /* Peripheral chip-select 5 inactive state */ -+#define MCF_DSPI_DMCR_PCSIS6 (0x00400000) /* Peripheral chip-select 6 inactive state */ -+#define MCF_DSPI_DMCR_PCSIS7 (0x00800000) /* Peripheral chip-select 7 inactive state */ -+#define MCF_DSPI_DMCR_ROOE (0x01000000) /* Receive FIFO overflow overwrite enable */ -+#define MCF_DSPI_DMCR_PCSSE (0x02000000) /* Peripheral chip select strobe enable */ -+#define MCF_DSPI_DMCR_MTFE (0x04000000) /* Modified timing format enable */ -+#define MCF_DSPI_DMCR_FRZ (0x08000000) /* Freeze */ -+#define MCF_DSPI_DMCR_DCONF(x) (((x)&0x00000003)<<28) /* DSPI configuration */ -+#define MCF_DSPI_DMCR_CONT_SCKE (0x40000000) /* Continuous SCK enable */ -+#define MCF_DSPI_DMCR_MSTR (0x80000000) /* Master/Slave mode select */ -+#define MCF_DSPI_DMCR_DCONF_SPI (0x00000000) -+#define MCF_DSPI_DMCR_PCSIS7_LOW (0x00000000) -+#define MCF_DSPI_DMCR_PCSIS7_HIGH (0x00800000) -+#define MCF_DSPI_DMCR_PCSIS6_LOW (0x00000000) -+#define MCF_DSPI_DMCR_PCSIS6_HIGH (0x00400000) -+#define MCF_DSPI_DMCR_PCSIS5_LOW (0x00000000) -+#define MCF_DSPI_DMCR_PCSIS5_HIGH (0x00200000) -+#define MCF_DSPI_DMCR_PCSIS4_LOW (0x00000000) -+#define MCF_DSPI_DMCR_PCSIS4_HIGH (0x00100000) -+#define MCF_DSPI_DMCR_PCSIS3_LOW (0x00000000) -+#define MCF_DSPI_DMCR_PCSIS3_HIGH (0x00080000) -+#define MCF_DSPI_DMCR_PCSIS2_LOW (0x00000000) -+#define MCF_DSPI_DMCR_PCSIS2_HIGH (0x00040000) -+#define MCF_DSPI_DMCR_PCSIS1_LOW (0x00000000) -+#define MCF_DSPI_DMCR_PCSIS1_HIGH (0x00020000) -+#define MCF_DSPI_DMCR_PCSIS0_LOW (0x00000000) -+#define MCF_DSPI_DMCR_PCSIS0_HIGH (0x00010000) -+ -+/* Bit definitions and macros for DTCR */ -+#define MCF_DSPI_DTCR_SPI_TCNT(x) (((x)&0x0000FFFF)<<16) /* SPI transfer count */ -+ -+/* Bit definitions and macros for DCTAR group */ -+#define MCF_DSPI_DCTAR_BR(x) (((x)&0x0000000F)) /* Baud rate scaler */ -+#define MCF_DSPI_DCTAR_DT(x) (((x)&0x0000000F)<<4) /* Delay after transfer scaler */ -+#define MCF_DSPI_DCTAR_ASC(x) (((x)&0x0000000F)<<8) /* After SCK delay scaler */ -+#define MCF_DSPI_DCTAR_CSSCK(x) (((x)&0x0000000F)<<12) /* PCS to SCK delay scaler */ -+#define MCF_DSPI_DCTAR_PBR(x) (((x)&0x00000003)<<16) /* Baud rate prescaler */ -+#define MCF_DSPI_DCTAR_PDT(x) (((x)&0x00000003)<<18) /* Delay after transfer prescaler */ -+#define MCF_DSPI_DCTAR_PASC(x) (((x)&0x00000003)<<20) /* After SCK delay prescaler */ -+#define MCF_DSPI_DCTAR_PCSSCK(x) (((x)&0x00000003)<<22) /* PCS to SCK delay prescaler */ -+#define MCF_DSPI_DCTAR_LSBFE (0x01000000) /* LSB first enable */ -+#define MCF_DSPI_DCTAR_CPHA (0x02000000) /* Clock phase */ -+#define MCF_DSPI_DCTAR_CPOL (0x04000000) /* Clock polarity */ -+#define MCF_DSPI_DCTAR_FMSZ(x) (((x)&0x0000000F)<<27) /* Frame size */ -+#define MCF_DSPI_DCTAR_DBR (0x80000000) /* Double baud rate */ -+#define MCF_DSPI_DCTAR_CPOL_LOW (0x00000000) -+#define MCF_DSPI_DCTAR_CPOL_HIGH (0x04000000) -+#define MCF_DSPI_DCTAR_CPHA_LATCH_RISING (0x00000000) -+#define MCF_DSPI_DCTAR_CPHA_LATCH_FALLING (0x02000000) -+#define MCF_DSPI_DCTAR_PCSSCK_1CLK (0x00000000) -+#define MCF_DSPI_DCTAR_PCSSCK_3CLK (0x00400000) -+#define MCF_DSPI_DCTAR_PCSSCK_5CLK (0x00800000) -+#define MCF_DSPI_DCTAR_PCSSCK_7CLK (0x00C00000) -+#define MCF_DSPI_DCTAR_PASC_1CLK (0x00000000) -+#define MCF_DSPI_DCTAR_PASC_3CLK (0x00100000) -+#define MCF_DSPI_DCTAR_PASC_5CLK (0x00200000) -+#define MCF_DSPI_DCTAR_PASC_7CLK (0x00300000) -+#define MCF_DSPI_DCTAR_PDT_1CLK (0x00000000) -+#define MCF_DSPI_DCTAR_PDT_3CLK (0x00040000) -+#define MCF_DSPI_DCTAR_PDT_5CLK (0x00080000) -+#define MCF_DSPI_DCTAR_PDT_7CLK (0x000C0000) -+#define MCF_DSPI_DCTAR_PBR_2CLK (0x00000000) -+#define MCF_DSPI_DCTAR_PBR_3CLK (0x00010000) -+#define MCF_DSPI_DCTAR_PBR_5CLK (0x00020000) -+#define MCF_DSPI_DCTAR_PBR_7CLK (0x00030000) -+ -+/* Bit definitions and macros for DCTAR0 */ -+#define MCF_DSPI_DCTAR0_BR(x) (((x)&0x0000000F)) /* Baud rate scaler */ -+#define MCF_DSPI_DCTAR0_DT(x) (((x)&0x0000000F)<<4) /* Delay after transfer scaler */ -+#define MCF_DSPI_DCTAR0_ASC(x) (((x)&0x0000000F)<<8) /* After SCK delay scaler */ -+#define MCF_DSPI_DCTAR0_CSSCK(x) (((x)&0x0000000F)<<12) /* PCS to SCK delay scaler */ -+#define MCF_DSPI_DCTAR0_PBR(x) (((x)&0x00000003)<<16) /* Baud rate prescaler */ -+#define MCF_DSPI_DCTAR0_PDT(x) (((x)&0x00000003)<<18) /* Delay after transfer prescaler */ -+#define MCF_DSPI_DCTAR0_PASC(x) (((x)&0x00000003)<<20) /* After SCK delay prescaler */ -+#define MCF_DSPI_DCTAR0_PCSSCK(x) (((x)&0x00000003)<<22) /* PCS to SCK delay prescaler */ -+#define MCF_DSPI_DCTAR0_LSBFE (0x01000000) /* LSB first enable */ -+#define MCF_DSPI_DCTAR0_CPHA (0x02000000) /* Clock phase */ -+#define MCF_DSPI_DCTAR0_CPOL (0x04000000) /* Clock polarity */ -+#define MCF_DSPI_DCTAR0_FMSZ(x) (((x)&0x0000000F)<<27) /* Frame size */ -+#define MCF_DSPI_DCTAR0_DBR (0x80000000) /* Double baud rate */ -+#define MCF_DSPI_DCTAR0_CPOL_LOW (0x00000000) -+#define MCF_DSPI_DCTAR0_CPOL_HIGH (0x04000000) -+#define MCF_DSPI_DCTAR0_CPHA_LATCH_RISING (0x00000000) -+#define MCF_DSPI_DCTAR0_CPHA_LATCH_FALLING (0x02000000) -+#define MCF_DSPI_DCTAR0_PCSSCK_1CLK (0x00000000) -+#define MCF_DSPI_DCTAR0_PCSSCK_3CLK (0x00400000) -+#define MCF_DSPI_DCTAR0_PCSSCK_5CLK (0x00800000) -+#define MCF_DSPI_DCTAR0_PCSSCK_7CLK (0x00C00000) -+#define MCF_DSPI_DCTAR0_PASC_1CLK (0x00000000) -+#define MCF_DSPI_DCTAR0_PASC_3CLK (0x00100000) -+#define MCF_DSPI_DCTAR0_PASC_5CLK (0x00200000) -+#define MCF_DSPI_DCTAR0_PASC_7CLK (0x00300000) -+#define MCF_DSPI_DCTAR0_PDT_1CLK (0x00000000) -+#define MCF_DSPI_DCTAR0_PDT_3CLK (0x00040000) -+#define MCF_DSPI_DCTAR0_PDT_5CLK (0x00080000) -+#define MCF_DSPI_DCTAR0_PDT_7CLK (0x000C0000) -+#define MCF_DSPI_DCTAR0_PBR_2CLK (0x00000000) -+#define MCF_DSPI_DCTAR0_PBR_3CLK (0x00010000) -+#define MCF_DSPI_DCTAR0_PBR_5CLK (0x00020000) -+#define MCF_DSPI_DCTAR0_PBR_7CLK (0x00030000) -+ -+/* Bit definitions and macros for DCTAR1 */ -+#define MCF_DSPI_DCTAR1_BR(x) (((x)&0x0000000F)) /* Baud rate scaler */ -+#define MCF_DSPI_DCTAR1_DT(x) (((x)&0x0000000F)<<4) /* Delay after transfer scaler */ -+#define MCF_DSPI_DCTAR1_ASC(x) (((x)&0x0000000F)<<8) /* After SCK delay scaler */ -+#define MCF_DSPI_DCTAR1_CSSCK(x) (((x)&0x0000000F)<<12) /* PCS to SCK delay scaler */ -+#define MCF_DSPI_DCTAR1_PBR(x) (((x)&0x00000003)<<16) /* Baud rate prescaler */ -+#define MCF_DSPI_DCTAR1_PDT(x) (((x)&0x00000003)<<18) /* Delay after transfer prescaler */ -+#define MCF_DSPI_DCTAR1_PASC(x) (((x)&0x00000003)<<20) /* After SCK delay prescaler */ -+#define MCF_DSPI_DCTAR1_PCSSCK(x) (((x)&0x00000003)<<22) /* PCS to SCK delay prescaler */ -+#define MCF_DSPI_DCTAR1_LSBFE (0x01000000) /* LSB first enable */ -+#define MCF_DSPI_DCTAR1_CPHA (0x02000000) /* Clock phase */ -+#define MCF_DSPI_DCTAR1_CPOL (0x04000000) /* Clock polarity */ -+#define MCF_DSPI_DCTAR1_FMSZ(x) (((x)&0x0000000F)<<27) /* Frame size */ -+#define MCF_DSPI_DCTAR1_DBR (0x80000000) /* Double baud rate */ -+ -+/* Bit definitions and macros for DCTAR2 */ -+#define MCF_DSPI_DCTAR2_BR(x) (((x)&0x0000000F)) /* Baud rate scaler */ -+#define MCF_DSPI_DCTAR2_DT(x) (((x)&0x0000000F)<<4) /* Delay after transfer scaler */ -+#define MCF_DSPI_DCTAR2_ASC(x) (((x)&0x0000000F)<<8) /* After SCK delay scaler */ -+#define MCF_DSPI_DCTAR2_CSSCK(x) (((x)&0x0000000F)<<12) /* PCS to SCK delay scaler */ -+#define MCF_DSPI_DCTAR2_PBR(x) (((x)&0x00000003)<<16) /* Baud rate prescaler */ -+#define MCF_DSPI_DCTAR2_PDT(x) (((x)&0x00000003)<<18) /* Delay after transfer prescaler */ -+#define MCF_DSPI_DCTAR2_PASC(x) (((x)&0x00000003)<<20) /* After SCK delay prescaler */ -+#define MCF_DSPI_DCTAR2_PCSSCK(x) (((x)&0x00000003)<<22) /* PCS to SCK delay prescaler */ -+#define MCF_DSPI_DCTAR2_LSBFE (0x01000000) /* LSB first enable */ -+#define MCF_DSPI_DCTAR2_CPHA (0x02000000) /* Clock phase */ -+#define MCF_DSPI_DCTAR2_CPOL (0x04000000) /* Clock polarity */ -+#define MCF_DSPI_DCTAR2_FMSZ(x) (((x)&0x0000000F)<<27) /* Frame size */ -+#define MCF_DSPI_DCTAR2_DBR (0x80000000) /* Double baud rate */ -+ -+/* Bit definitions and macros for DCTAR3 */ -+#define MCF_DSPI_DCTAR3_BR(x) (((x)&0x0000000F)) /* Baud rate scaler */ -+#define MCF_DSPI_DCTAR3_DT(x) (((x)&0x0000000F)<<4) /* Delay after transfer scaler */ -+#define MCF_DSPI_DCTAR3_ASC(x) (((x)&0x0000000F)<<8) /* After SCK delay scaler */ -+#define MCF_DSPI_DCTAR3_CSSCK(x) (((x)&0x0000000F)<<12) /* PCS to SCK delay scaler */ -+#define MCF_DSPI_DCTAR3_PBR(x) (((x)&0x00000003)<<16) /* Baud rate prescaler */ -+#define MCF_DSPI_DCTAR3_PDT(x) (((x)&0x00000003)<<18) /* Delay after transfer prescaler */ -+#define MCF_DSPI_DCTAR3_PASC(x) (((x)&0x00000003)<<20) /* After SCK delay prescaler */ -+#define MCF_DSPI_DCTAR3_PCSSCK(x) (((x)&0x00000003)<<22) /* PCS to SCK delay prescaler */ -+#define MCF_DSPI_DCTAR3_LSBFE (0x01000000) /* LSB first enable */ -+#define MCF_DSPI_DCTAR3_CPHA (0x02000000) /* Clock phase */ -+#define MCF_DSPI_DCTAR3_CPOL (0x04000000) /* Clock polarity */ -+#define MCF_DSPI_DCTAR3_FMSZ(x) (((x)&0x0000000F)<<27) /* Frame size */ -+#define MCF_DSPI_DCTAR3_DBR (0x80000000) /* Double baud rate */ -+ -+/* Bit definitions and macros for DCTAR4 */ -+#define MCF_DSPI_DCTAR4_BR(x) (((x)&0x0000000F)) /* Baud rate scaler */ -+#define MCF_DSPI_DCTAR4_DT(x) (((x)&0x0000000F)<<4) /* Delay after transfer scaler */ -+#define MCF_DSPI_DCTAR4_ASC(x) (((x)&0x0000000F)<<8) /* After SCK delay scaler */ -+#define MCF_DSPI_DCTAR4_CSSCK(x) (((x)&0x0000000F)<<12) /* PCS to SCK delay scaler */ -+#define MCF_DSPI_DCTAR4_PBR(x) (((x)&0x00000003)<<16) /* Baud rate prescaler */ -+#define MCF_DSPI_DCTAR4_PDT(x) (((x)&0x00000003)<<18) /* Delay after transfer prescaler */ -+#define MCF_DSPI_DCTAR4_PASC(x) (((x)&0x00000003)<<20) /* After SCK delay prescaler */ -+#define MCF_DSPI_DCTAR4_PCSSCK(x) (((x)&0x00000003)<<22) /* PCS to SCK delay prescaler */ -+#define MCF_DSPI_DCTAR4_LSBFE (0x01000000) /* LSB first enable */ -+#define MCF_DSPI_DCTAR4_CPHA (0x02000000) /* Clock phase */ -+#define MCF_DSPI_DCTAR4_CPOL (0x04000000) /* Clock polarity */ -+#define MCF_DSPI_DCTAR4_FMSZ(x) (((x)&0x0000000F)<<27) /* Frame size */ -+#define MCF_DSPI_DCTAR4_DBR (0x80000000) /* Double baud rate */ -+ -+/* Bit definitions and macros for DCTAR5 */ -+#define MCF_DSPI_DCTAR5_BR(x) (((x)&0x0000000F)) /* Baud rate scaler */ -+#define MCF_DSPI_DCTAR5_DT(x) (((x)&0x0000000F)<<4) /* Delay after transfer scaler */ -+#define MCF_DSPI_DCTAR5_ASC(x) (((x)&0x0000000F)<<8) /* After SCK delay scaler */ -+#define MCF_DSPI_DCTAR5_CSSCK(x) (((x)&0x0000000F)<<12) /* PCS to SCK delay scaler */ -+#define MCF_DSPI_DCTAR5_PBR(x) (((x)&0x00000003)<<16) /* Baud rate prescaler */ -+#define MCF_DSPI_DCTAR5_PDT(x) (((x)&0x00000003)<<18) /* Delay after transfer prescaler */ -+#define MCF_DSPI_DCTAR5_PASC(x) (((x)&0x00000003)<<20) /* After SCK delay prescaler */ -+#define MCF_DSPI_DCTAR5_PCSSCK(x) (((x)&0x00000003)<<22) /* PCS to SCK delay prescaler */ -+#define MCF_DSPI_DCTAR5_LSBFE (0x01000000) /* LSB first enable */ -+#define MCF_DSPI_DCTAR5_CPHA (0x02000000) /* Clock phase */ -+#define MCF_DSPI_DCTAR5_CPOL (0x04000000) /* Clock polarity */ -+#define MCF_DSPI_DCTAR5_FMSZ(x) (((x)&0x0000000F)<<27) /* Frame size */ -+#define MCF_DSPI_DCTAR5_DBR (0x80000000) /* Double baud rate */ -+ -+/* Bit definitions and macros for DCTAR6 */ -+#define MCF_DSPI_DCTAR6_BR(x) (((x)&0x0000000F)) /* Baud rate scaler */ -+#define MCF_DSPI_DCTAR6_DT(x) (((x)&0x0000000F)<<4) /* Delay after transfer scaler */ -+#define MCF_DSPI_DCTAR6_ASC(x) (((x)&0x0000000F)<<8) /* After SCK delay scaler */ -+#define MCF_DSPI_DCTAR6_CSSCK(x) (((x)&0x0000000F)<<12) /* PCS to SCK delay scaler */ -+#define MCF_DSPI_DCTAR6_PBR(x) (((x)&0x00000003)<<16) /* Baud rate prescaler */ -+#define MCF_DSPI_DCTAR6_PDT(x) (((x)&0x00000003)<<18) /* Delay after transfer prescaler */ -+#define MCF_DSPI_DCTAR6_PASC(x) (((x)&0x00000003)<<20) /* After SCK delay prescaler */ -+#define MCF_DSPI_DCTAR6_PCSSCK(x) (((x)&0x00000003)<<22) /* PCS to SCK delay prescaler */ -+#define MCF_DSPI_DCTAR6_LSBFE (0x01000000) /* LSB first enable */ -+#define MCF_DSPI_DCTAR6_CPHA (0x02000000) /* Clock phase */ -+#define MCF_DSPI_DCTAR6_CPOL (0x04000000) /* Clock polarity */ -+#define MCF_DSPI_DCTAR6_FMSZ(x) (((x)&0x0000000F)<<27) /* Frame size */ -+#define MCF_DSPI_DCTAR6_DBR (0x80000000) /* Double baud rate */ -+ -+/* Bit definitions and macros for DCTAR7 */ -+#define MCF_DSPI_DCTAR7_BR(x) (((x)&0x0000000F)) /* Baud rate scaler */ -+#define MCF_DSPI_DCTAR7_DT(x) (((x)&0x0000000F)<<4) /* Delay after transfer scaler */ -+#define MCF_DSPI_DCTAR7_ASC(x) (((x)&0x0000000F)<<8) /* After SCK delay scaler */ -+#define MCF_DSPI_DCTAR7_CSSCK(x) (((x)&0x0000000F)<<12) /* PCS to SCK delay scaler */ -+#define MCF_DSPI_DCTAR7_PBR(x) (((x)&0x00000003)<<16) /* Baud rate prescaler */ -+#define MCF_DSPI_DCTAR7_PDT(x) (((x)&0x00000003)<<18) /* Delay after transfer prescaler */ -+#define MCF_DSPI_DCTAR7_PASC(x) (((x)&0x00000003)<<20) /* After SCK delay prescaler */ -+#define MCF_DSPI_DCTAR7_PCSSCK(x) (((x)&0x00000003)<<22) /* PCS to SCK delay prescaler */ -+#define MCF_DSPI_DCTAR7_LSBFE (0x01000000) /* LSB first enable */ -+#define MCF_DSPI_DCTAR7_CPHA (0x02000000) /* Clock phase */ -+#define MCF_DSPI_DCTAR7_CPOL (0x04000000) /* Clock polarity */ -+#define MCF_DSPI_DCTAR7_FMSZ(x) (((x)&0x0000000F)<<27) /* Frame size */ -+#define MCF_DSPI_DCTAR7_DBR (0x80000000) /* Double baud rate */ -+ -+/* Bit definitions and macros for DSR */ -+#define MCF_DSPI_DSR_RXPTR(x) (((x)&0x0000000F)) /* Receive next pointer */ -+#define MCF_DSPI_DSR_RXCTR(x) (((x)&0x0000000F)<<4) /* Receive FIFO counter */ -+#define MCF_DSPI_DSR_TXPTR(x) (((x)&0x0000000F)<<8) /* Transmit next pointer */ -+#define MCF_DSPI_DSR_TXCTR(x) (((x)&0x0000000F)<<12) /* Transmit FIFO counter */ -+#define MCF_DSPI_DSR_RFDF (0x00020000) /* Receive FIFO drain flag */ -+#define MCF_DSPI_DSR_RFOF (0x00080000) /* Receive FIFO overflow flag */ -+#define MCF_DSPI_DSR_TFFF (0x02000000) /* Transmit FIFO fill flag */ -+#define MCF_DSPI_DSR_TFUF (0x08000000) /* Transmit FIFO underflow flag */ -+#define MCF_DSPI_DSR_EOQF (0x10000000) /* End of queue flag */ -+#define MCF_DSPI_DSR_TXRXS (0x40000000) /* Tx and Rx status (enabled | disabled) */ -+#define MCF_DSPI_DSR_TCF (0x80000000) /* Transfer complete flag */ -+ -+/* Bit definitions and macros for DRSER */ -+#define MCF_DSPI_DRSER_RFDFS (0x00010000) /* Receive FIFO drain DMA or interrupt select */ -+#define MCF_DSPI_DRSER_RFDFE (0x00020000) /* Receive FIFO drain request enable */ -+#define MCF_DSPI_DRSER_RFOFE (0x00080000) /* Receive FIFO overflow request enable */ -+#define MCF_DSPI_DRSER_TFFFS (0x01000000) /* Transmit FIFO fill DMA or interrupt select */ -+#define MCF_DSPI_DRSER_TFFFE (0x02000000) /* Transmit FIFO fill request enable */ -+#define MCF_DSPI_DRSER_TFUFE (0x08000000) /* Transmit FIFO underflow request enable */ -+#define MCF_DSPI_DRSER_EOQFE (0x10000000) /* DSPI finished request enable */ -+#define MCF_DSPI_DRSER_TCFE (0x80000000) /* Transmission complete request enable */ -+ -+/* Bit definitions and macros for DTFR */ -+#define MCF_DSPI_DTFR_TXDATA(x) (((x)&0x0000FFFF)) /* Transmit data */ -+#define MCF_DSPI_DTFR_PCS0 (0x00010000) /* Peripheral chip select 0 */ -+#define MCF_DSPI_DTFR_PCS1 (0x00020000) /* Peripheral chip select 1 */ -+#define MCF_DSPI_DTFR_PCS2 (0x00040000) /* Peripheral chip select 2 */ -+#define MCF_DSPI_DTFR_PCS3 (0x00080000) /* Peripheral chip select 3 */ -+#define MCF_DSPI_DTFR_PCS4 (0x00100000) /* Peripheral chip select 4 */ -+#define MCF_DSPI_DTFR_PCS5 (0x00200000) /* Peripheral chip select 5 */ -+#define MCF_DSPI_DTFR_PCS6 (0x00400000) /* Peripheral chip select 6 */ -+#define MCF_DSPI_DTFR_PCS7 (0x00800000) /* Peripheral chip select 7 */ -+#define MCF_DSPI_DTFR_CTCNT (0x04000000) /* Clear SPI transfer counter */ -+#define MCF_DSPI_DTFR_EOQ (0x08000000) /* End of queue */ -+#define MCF_DSPI_DTFR_CTAS(x) (((x)&0x00000007)<<28) /* Clock and transfer attributes select */ -+#define MCF_DSPI_DTFR_CONT (0x80000000) /* Continuous peripheral chip-select enable */ -+ -+/* Bit definitions and macros for DRFR */ -+#define MCF_DSPI_DRFR_RXDATA(x) (((x)&0x0000FFFF)) /* Receive data */ -+ -+/* Bit definitions and macros for DTFDR group */ -+#define MCF_DSPI_DTFDR_TXDATA(x) (((x)&0x0000FFFF)) /* Transmit data */ -+#define MCF_DSPI_DTFDR_PCS0 (0x00010000) /* Peripheral chip select 0 */ -+#define MCF_DSPI_DTFDR_PCS1 (0x00020000) /* Peripheral chip select 1 */ -+#define MCF_DSPI_DTFDR_PCS2 (0x00040000) /* Peripheral chip select 2 */ -+#define MCF_DSPI_DTFDR_PCS3 (0x00080000) /* Peripheral chip select 3 */ -+#define MCF_DSPI_DTFDR_PCS4 (0x00100000) /* Peripheral chip select 4 */ -+#define MCF_DSPI_DTFDR_PCS5 (0x00200000) /* Peripheral chip select 5 */ -+#define MCF_DSPI_DTFDR_PCS6 (0x00400000) /* Peripheral chip select 6 */ -+#define MCF_DSPI_DTFDR_PCS7 (0x00800000) /* Peripheral chip select 7 */ -+#define MCF_DSPI_DTFDR_CTCNT (0x04000000) /* Clear SPI transfer counter */ -+#define MCF_DSPI_DTFDR_EOQ (0x08000000) /* End of queue */ -+#define MCF_DSPI_DTFDR_CTAS(x) (((x)&0x00000007)<<28) /* Clock and transfer attributes select */ -+#define MCF_DSPI_DTFDR_CONT (0x80000000) /* Continuous peripheral chip-select enable */ -+ -+/* Bit definitions and macros for DTFDR0 */ -+#define MCF_DSPI_DTFDR0_TXDATA(x) (((x)&0x0000FFFF)) /* Transmit data */ -+#define MCF_DSPI_DTFDR0_PCS0 (0x00010000) /* Peripheral chip select 0 */ -+#define MCF_DSPI_DTFDR0_PCS1 (0x00020000) /* Peripheral chip select 1 */ -+#define MCF_DSPI_DTFDR0_PCS2 (0x00040000) /* Peripheral chip select 2 */ -+#define MCF_DSPI_DTFDR0_PCS3 (0x00080000) /* Peripheral chip select 3 */ -+#define MCF_DSPI_DTFDR0_PCS4 (0x00100000) /* Peripheral chip select 4 */ -+#define MCF_DSPI_DTFDR0_PCS5 (0x00200000) /* Peripheral chip select 5 */ -+#define MCF_DSPI_DTFDR0_PCS6 (0x00400000) /* Peripheral chip select 6 */ -+#define MCF_DSPI_DTFDR0_PCS7 (0x00800000) /* Peripheral chip select 7 */ -+#define MCF_DSPI_DTFDR0_CTCNT (0x04000000) /* Clear SPI transfer counter */ -+#define MCF_DSPI_DTFDR0_EOQ (0x08000000) /* End of queue */ -+#define MCF_DSPI_DTFDR0_CTAS(x) (((x)&0x00000007)<<28) /* Clock and transfer attributes select */ -+#define MCF_DSPI_DTFDR0_CONT (0x80000000) /* Continuous peripheral chip-select enable */ -+ -+/* Bit definitions and macros for DTFDR1 */ -+#define MCF_DSPI_DTFDR1_TXDATA(x) (((x)&0x0000FFFF)) /* Transmit data */ -+#define MCF_DSPI_DTFDR1_PCS0 (0x00010000) /* Peripheral chip select 0 */ -+#define MCF_DSPI_DTFDR1_PCS1 (0x00020000) /* Peripheral chip select 1 */ -+#define MCF_DSPI_DTFDR1_PCS2 (0x00040000) /* Peripheral chip select 2 */ -+#define MCF_DSPI_DTFDR1_PCS3 (0x00080000) /* Peripheral chip select 3 */ -+#define MCF_DSPI_DTFDR1_PCS4 (0x00100000) /* Peripheral chip select 4 */ -+#define MCF_DSPI_DTFDR1_PCS5 (0x00200000) /* Peripheral chip select 5 */ -+#define MCF_DSPI_DTFDR1_PCS6 (0x00400000) /* Peripheral chip select 6 */ -+#define MCF_DSPI_DTFDR1_PCS7 (0x00800000) /* Peripheral chip select 7 */ -+#define MCF_DSPI_DTFDR1_CTCNT (0x04000000) /* Clear SPI transfer counter */ -+#define MCF_DSPI_DTFDR1_EOQ (0x08000000) /* End of queue */ -+#define MCF_DSPI_DTFDR1_CTAS(x) (((x)&0x00000007)<<28) /* Clock and transfer attributes select */ -+#define MCF_DSPI_DTFDR1_CONT (0x80000000) /* Continuous peripheral chip-select enable */ -+ -+/* Bit definitions and macros for DTFDR2 */ -+#define MCF_DSPI_DTFDR2_TXDATA(x) (((x)&0x0000FFFF)) /* Transmit data */ -+#define MCF_DSPI_DTFDR2_PCS0 (0x00010000) /* Peripheral chip select 0 */ -+#define MCF_DSPI_DTFDR2_PCS1 (0x00020000) /* Peripheral chip select 1 */ -+#define MCF_DSPI_DTFDR2_PCS2 (0x00040000) /* Peripheral chip select 2 */ -+#define MCF_DSPI_DTFDR2_PCS3 (0x00080000) /* Peripheral chip select 3 */ -+#define MCF_DSPI_DTFDR2_PCS4 (0x00100000) /* Peripheral chip select 4 */ -+#define MCF_DSPI_DTFDR2_PCS5 (0x00200000) /* Peripheral chip select 5 */ -+#define MCF_DSPI_DTFDR2_PCS6 (0x00400000) /* Peripheral chip select 6 */ -+#define MCF_DSPI_DTFDR2_PCS7 (0x00800000) /* Peripheral chip select 7 */ -+#define MCF_DSPI_DTFDR2_CTCNT (0x04000000) /* Clear SPI transfer counter */ -+#define MCF_DSPI_DTFDR2_EOQ (0x08000000) /* End of queue */ -+#define MCF_DSPI_DTFDR2_CTAS(x) (((x)&0x00000007)<<28) /* Clock and transfer attributes select */ -+#define MCF_DSPI_DTFDR2_CONT (0x80000000) /* Continuous peripheral chip-select enable */ -+ -+/* Bit definitions and macros for DTFDR3 */ -+#define MCF_DSPI_DTFDR3_TXDATA(x) (((x)&0x0000FFFF)) /* Transmit data */ -+#define MCF_DSPI_DTFDR3_PCS0 (0x00010000) /* Peripheral chip select 0 */ -+#define MCF_DSPI_DTFDR3_PCS1 (0x00020000) /* Peripheral chip select 1 */ -+#define MCF_DSPI_DTFDR3_PCS2 (0x00040000) /* Peripheral chip select 2 */ -+#define MCF_DSPI_DTFDR3_PCS3 (0x00080000) /* Peripheral chip select 3 */ -+#define MCF_DSPI_DTFDR3_PCS4 (0x00100000) /* Peripheral chip select 4 */ -+#define MCF_DSPI_DTFDR3_PCS5 (0x00200000) /* Peripheral chip select 5 */ -+#define MCF_DSPI_DTFDR3_PCS6 (0x00400000) /* Peripheral chip select 6 */ -+#define MCF_DSPI_DTFDR3_PCS7 (0x00800000) /* Peripheral chip select 7 */ -+#define MCF_DSPI_DTFDR3_CTCNT (0x04000000) /* Clear SPI transfer counter */ -+#define MCF_DSPI_DTFDR3_EOQ (0x08000000) /* End of queue */ -+#define MCF_DSPI_DTFDR3_CTAS(x) (((x)&0x00000007)<<28) /* Clock and transfer attributes select */ -+#define MCF_DSPI_DTFDR3_CONT (0x80000000) /* Continuous peripheral chip-select enable */ -+ -+/* Bit definitions and macros for DRFDR group */ -+#define MCF_DSPI_DRFDR_RXDATA(x) (((x)&0x0000FFFF)) /* Receive data */ -+ -+/* Bit definitions and macros for DRFDR0 */ -+#define MCF_DSPI_DRFDR0_RXDATA(x) (((x)&0x0000FFFF)) /* Receive data */ -+ -+/* Bit definitions and macros for DRFDR1 */ -+#define MCF_DSPI_DRFDR1_RXDATA(x) (((x)&0x0000FFFF)) /* Receive data */ -+ -+/* Bit definitions and macros for DRFDR2 */ -+#define MCF_DSPI_DRFDR2_RXDATA(x) (((x)&0x0000FFFF)) /* Receive data */ -+ -+/* Bit definitions and macros for DRFDR3 */ -+#define MCF_DSPI_DRFDR3_RXDATA(x) (((x)&0x0000FFFF)) /* Receive data */ -+ -+/********************************************************************/ -+ -+#endif /* __MCF5445X_DSPI_H__ */ ---- /dev/null -+++ b/include/asm-m68k/mcf5445x_dtim.h -@@ -0,0 +1,87 @@ -+/* -+ * Matt Waddel Matt.Waddel@freescale.com -+ * -+ * Copyright Freescale Semiconductor, Inc. 2007 -+ * -+ * This program is free software; you can redistribute it and/or modify it -+ * under the terms of the GNU General Public License as published by the -+ * Free Software Foundation; either version 2 of the License, or (at your -+ * option) any later version. -+ */ -+ -+#ifndef __MCF5445X_DTIM_H__ -+#define __MCF5445X_DTIM_H__ -+ -+/********************************************************************* -+* -+* DMA Timers (DTIM) -+* -+*********************************************************************/ -+/* Register read/write macros */ -+#define MCF_DTIM0_DTMR 0xFC070000 /* DMA Timer Mode Register */ -+#define MCF_DTIM0_DTXMR 0xFC070002 /* DMA Timer Extended Mode Register */ -+#define MCF_DTIM0_DTER 0xFC070003 /* DMA Timer Event Register */ -+#define MCF_DTIM0_DTRR 0xFC070004 /* DMA Timer Reference Register */ -+#define MCF_DTIM0_DTCR 0xFC070008 /* DMA Timer Capture Register */ -+#define MCF_DTIM0_DTCN 0xFC07000C /* DMA Timer Counter Register */ -+#define MCF_DTIM1_DTMR 0xFC074000 /* DMA Timer Mode Register */ -+#define MCF_DTIM1_DTXMR 0xFC074002 /* DMA Timer Extended Mode Register */ -+#define MCF_DTIM1_DTER 0xFC074003 /* DMA Timer Event Register */ -+#define MCF_DTIM1_DTRR 0xFC074004 /* DMA Timer Reference Register */ -+#define MCF_DTIM1_DTCR 0xFC074008 /* DMA Timer Capture Register */ -+#define MCF_DTIM1_DTCN 0xFC07400C /* DMA Timer Counter Register */ -+#define MCF_DTIM2_DTMR 0xFC078000 /* DMA Timer Mode Register */ -+#define MCF_DTIM2_DTXMR 0xFC078002 /* DMA Timer Extended Mode Register */ -+#define MCF_DTIM2_DTER 0xFC078003 /* DMA Timer Event Register */ -+#define MCF_DTIM2_DTRR 0xFC078004 /* DMA Timer Reference Register */ -+#define MCF_DTIM2_DTCR 0xFC078008 /* DMA Timer Capture Register */ -+#define MCF_DTIM2_DTCN 0xFC07800C /* DMA Timer Counter Register */ -+#define MCF_DTIM3_DTMR 0xFC07C000 /* DMA Timer Mode Register */ -+#define MCF_DTIM3_DTXMR 0xFC07C002 /* DMA Timer Extended Mode Register */ -+#define MCF_DTIM3_DTER 0xFC07C003 /* DMA Timer Event Register */ -+#define MCF_DTIM3_DTRR 0xFC07C004 /* DMA Timer Reference Register */ -+#define MCF_DTIM3_DTCR 0xFC07C008 /* DMA Timer Capture Register */ -+#define MCF_DTIM3_DTCN 0xFC07C00C /* DMA Timer Counter Register */ -+ -+/* Parameterized register read/write macros for multiple modules */ -+#define MCF_DTIM_DTMR(x) 0xFC070000+((x)*0x4000) /* DMA Timer Mode Register */ -+#define MCF_DTIM_DTXMR(x) 0xFC070002+((x)*0x4000) /* DMA Timer Extended Mode Register */ -+#define MCF_DTIM_DTER(x) 0xFC070003+((x)*0x4000) /* DMA Timer Event Register */ -+#define MCF_DTIM_DTRR(x) 0xFC070004+((x)*0x4000) /* DMA Timer Reference Register */ -+#define MCF_DTIM_DTCR(x) 0xFC070008+((x)*0x4000) /* DMA Timer Capture Register */ -+#define MCF_DTIM_DTCN(x) 0xFC07000C+((x)*0x4000) /* DMA Timer Counter Register */ -+ -+/* Bit definitions and macros for DTMR */ -+#define MCF_DTIM_DTMR_RST (0x0001) /* Reset */ -+#define MCF_DTIM_DTMR_CLK(x) (((x)&0x0003)<<1) /* Input clock source */ -+#define MCF_DTIM_DTMR_FRR (0x0008) /* Free run/restart */ -+#define MCF_DTIM_DTMR_ORRI (0x0010) /* Output reference request/interrupt enable */ -+#define MCF_DTIM_DTMR_OM (0x0020) /* Output Mode */ -+#define MCF_DTIM_DTMR_CE(x) (((x)&0x0003)<<6) /* Capture Edge */ -+#define MCF_DTIM_DTMR_PS(x) (((x)&0x00FF)<<8) /* Prescaler value */ -+#define MCF_DTIM_DTMR_RST_EN (0x0001) -+#define MCF_DTIM_DTMR_RST_RST (0x0000) -+#define MCF_DTIM_DTMR_CE_ANY (0x00C0) -+#define MCF_DTIM_DTMR_CE_FALL (0x0080) -+#define MCF_DTIM_DTMR_CE_RISE (0x0040) -+#define MCF_DTIM_DTMR_CE_NONE (0x0000) -+#define MCF_DTIM_DTMR_CLK_DTIN (0x0006) -+#define MCF_DTIM_DTMR_CLK_DIV16 (0x0004) -+#define MCF_DTIM_DTMR_CLK_DIV1 (0x0002) -+#define MCF_DTIM_DTMR_CLK_STOP (0x0000) -+ -+/* Bit definitions and macros for DTXMR */ -+#define MCF_DTIM_DTXMR_MODE16 (0x01) /* Increment Mode */ -+#define MCF_DTIM_DTXMR_DMAEN (0x80) /* DMA request */ -+ -+/* Bit definitions and macros for DTER */ -+#define MCF_DTIM_DTER_CAP (0x01) /* Capture event */ -+#define MCF_DTIM_DTER_REF (0x02) /* Output reference event */ -+ -+/* Interrupts used for system timers */ -+#define MCFSIM_ICR_TIMER1 (0xFC048040+32) -+#define MCFSIM_ICR_TIMER2 (0xFC048040+33) -+ -+/********************************************************************/ -+ -+#endif /* __MCF5445X_DTIM_H__ */ ---- /dev/null -+++ b/include/asm-m68k/mcf5445x_edma.h -@@ -0,0 +1,1472 @@ -+/* -+ * Yaroslav Vinogradov yaroslav.vinogradov@freescale.com -+ * -+ * Copyright Freescale Semiconductor, Inc. 2007 -+ * -+ * This program is free software; you can redistribute it and/or modify it -+ * under the terms of the GNU General Public License as published by the -+ * Free Software Foundation; either version 2 of the License, or (at your -+ * option) any later version. -+ */ -+#ifndef __MCF5445X_EDMA_H__ -+#define __MCF5445X_EDMA_H__ -+ -+/* -+ * Enhanced DMA (EDMA) -+ */ -+ -+/* Channels */ -+#define MCF_EDMA_CHAN_DREQ0 0 /* External DMA request 0 */ -+#define MCF_EDMA_CHAN_DREQ1 1 /* External DMA request 1 */ -+#define MCF_EDMA_CHAN_UART0_RX 2 /* UART0 Receive */ -+#define MCF_EDMA_CHAN_UART0_TX 3 /* UART0 Transmit */ -+#define MCF_EDMA_CHAN_UART1_RX 4 /* UART1 Receive */ -+#define MCF_EDMA_CHAN_UART1_TX 5 /* UART1 Transmit */ -+#define MCF_EDMA_CHAN_UART2_RX 6 /* UART2 Receive */ -+#define MCF_EDMA_CHAN_UART2_TX 7 /* UART2 Transmit */ -+#define MCF_EDMA_CHAN_TIMER0 8 /* Timer 0 / SSI0 Rx */ -+#define MCF_EDMA_CHAN_TIMER1 9 /* Timer 1 / SSI1 Rx */ -+#define MCF_EDMA_CHAN_TIMER2 10 /* Timer 2 / SSI0 Tx */ -+#define MCF_EDMA_CHAN_TIMER3 11 /* Timer 3 / SSI1 Tx */ -+#define MCF_EDMA_CHAN_DSPI_RX 12 /* DSPI Receive */ -+#define MCF_EDMA_CHAN_DSPI_TX 13 /* DSPI Transmit */ -+#define MCF_EDMA_CHAN_ATA_RX 14 /* ATA Receive */ -+#define MCF_EDMA_CHAN_ATA_TX 15 /* ATA Transmit */ -+ -+/* Register read/write macros */ -+#define MCF_EDMA_CR MCF_REG32(0xFC044000) -+#define MCF_EDMA_ES MCF_REG32(0xFC044004) -+#define MCF_EDMA_ERQ MCF_REG16(0xFC04400E) -+#define MCF_EDMA_EEI MCF_REG16(0xFC044016) -+#define MCF_EDMA_SERQ MCF_REG08(0xFC044018) -+#define MCF_EDMA_CERQ MCF_REG08(0xFC044019) -+#define MCF_EDMA_SEEI MCF_REG08(0xFC04401A) -+#define MCF_EDMA_CEEI MCF_REG08(0xFC04401B) -+#define MCF_EDMA_CINT MCF_REG08(0xFC04401C) -+#define MCF_EDMA_CERR MCF_REG08(0xFC04401D) -+#define MCF_EDMA_SSRT MCF_REG08(0xFC04401E) -+#define MCF_EDMA_CDNE MCF_REG08(0xFC04401F) -+#define MCF_EDMA_INTR MCF_REG16(0xFC044026) -+#define MCF_EDMA_ERR MCF_REG16(0xFC04402E) -+#define MCF_EDMA_DCHPRI0 MCF_REG08(0xFC044100) -+#define MCF_EDMA_DCHPRI1 MCF_REG08(0xFC044101) -+#define MCF_EDMA_DCHPRI2 MCF_REG08(0xFC044102) -+#define MCF_EDMA_DCHPRI3 MCF_REG08(0xFC044103) -+#define MCF_EDMA_DCHPRI4 MCF_REG08(0xFC044104) -+#define MCF_EDMA_DCHPRI5 MCF_REG08(0xFC044105) -+#define MCF_EDMA_DCHPRI6 MCF_REG08(0xFC044106) -+#define MCF_EDMA_DCHPRI7 MCF_REG08(0xFC044107) -+#define MCF_EDMA_DCHPRI8 MCF_REG08(0xFC044108) -+#define MCF_EDMA_DCHPRI9 MCF_REG08(0xFC044109) -+#define MCF_EDMA_DCHPRI10 MCF_REG08(0xFC04410A) -+#define MCF_EDMA_DCHPRI11 MCF_REG08(0xFC04410B) -+#define MCF_EDMA_DCHPRI12 MCF_REG08(0xFC04410C) -+#define MCF_EDMA_DCHPRI13 MCF_REG08(0xFC04410D) -+#define MCF_EDMA_DCHPRI14 MCF_REG08(0xFC04410E) -+#define MCF_EDMA_DCHPRI15 MCF_REG08(0xFC04410F) -+#define MCF_EDMA_TCD0_SADDR MCF_REG32(0xFC045000) -+#define MCF_EDMA_TCD0_ATTR MCF_REG16(0xFC045004) -+#define MCF_EDMA_TCD0_SOFF MCF_REG16(0xFC045006) -+#define MCF_EDMA_TCD0_NBYTES MCF_REG32(0xFC045008) -+#define MCF_EDMA_TCD0_SLAST MCF_REG32(0xFC04500C) -+#define MCF_EDMA_TCD0_DADDR MCF_REG32(0xFC045010) -+#define MCF_EDMA_TCD0_CITER_ELINK MCF_REG16(0xFC045014) -+#define MCF_EDMA_TCD0_CITER MCF_REG16(0xFC045014) -+#define MCF_EDMA_TCD0_DOFF MCF_REG16(0xFC045016) -+#define MCF_EDMA_TCD0_DLAST_SGA MCF_REG32(0xFC045018) -+#define MCF_EDMA_TCD0_BITER_ELINK MCF_REG16(0xFC04501C) -+#define MCF_EDMA_TCD0_BITER MCF_REG16(0xFC04501C) -+#define MCF_EDMA_TCD0_CSR MCF_REG16(0xFC04501E) -+#define MCF_EDMA_TCD1_SADDR MCF_REG32(0xFC045020) -+#define MCF_EDMA_TCD1_ATTR MCF_REG16(0xFC045024) -+#define MCF_EDMA_TCD1_SOFF MCF_REG16(0xFC045026) -+#define MCF_EDMA_TCD1_NBYTES MCF_REG32(0xFC045028) -+#define MCF_EDMA_TCD1_SLAST MCF_REG32(0xFC04502C) -+#define MCF_EDMA_TCD1_DADDR MCF_REG32(0xFC045030) -+#define MCF_EDMA_TCD1_CITER_ELINK MCF_REG16(0xFC045034) -+#define MCF_EDMA_TCD1_CITER MCF_REG16(0xFC045034) -+#define MCF_EDMA_TCD1_DOFF MCF_REG16(0xFC045036) -+#define MCF_EDMA_TCD1_DLAST_SGA MCF_REG32(0xFC045038) -+#define MCF_EDMA_TCD1_BITER MCF_REG16(0xFC04503C) -+#define MCF_EDMA_TCD1_BITER_ELINK MCF_REG16(0xFC04503C) -+#define MCF_EDMA_TCD1_CSR MCF_REG16(0xFC04503E) -+#define MCF_EDMA_TCD2_SADDR MCF_REG32(0xFC045040) -+#define MCF_EDMA_TCD2_ATTR MCF_REG16(0xFC045044) -+#define MCF_EDMA_TCD2_SOFF MCF_REG16(0xFC045046) -+#define MCF_EDMA_TCD2_NBYTES MCF_REG32(0xFC045048) -+#define MCF_EDMA_TCD2_SLAST MCF_REG32(0xFC04504C) -+#define MCF_EDMA_TCD2_DADDR MCF_REG32(0xFC045050) -+#define MCF_EDMA_TCD2_CITER MCF_REG16(0xFC045054) -+#define MCF_EDMA_TCD2_CITER_ELINK MCF_REG16(0xFC045054) -+#define MCF_EDMA_TCD2_DOFF MCF_REG16(0xFC045056) -+#define MCF_EDMA_TCD2_DLAST_SGA MCF_REG32(0xFC045058) -+#define MCF_EDMA_TCD2_BITER_ELINK MCF_REG16(0xFC04505C) -+#define MCF_EDMA_TCD2_BITER MCF_REG16(0xFC04505C) -+#define MCF_EDMA_TCD2_CSR MCF_REG16(0xFC04505E) -+#define MCF_EDMA_TCD3_SADDR MCF_REG32(0xFC045060) -+#define MCF_EDMA_TCD3_ATTR MCF_REG16(0xFC045064) -+#define MCF_EDMA_TCD3_SOFF MCF_REG16(0xFC045066) -+#define MCF_EDMA_TCD3_NBYTES MCF_REG32(0xFC045068) -+#define MCF_EDMA_TCD3_SLAST MCF_REG32(0xFC04506C) -+#define MCF_EDMA_TCD3_DADDR MCF_REG32(0xFC045070) -+#define MCF_EDMA_TCD3_CITER MCF_REG16(0xFC045074) -+#define MCF_EDMA_TCD3_CITER_ELINK MCF_REG16(0xFC045074) -+#define MCF_EDMA_TCD3_DOFF MCF_REG16(0xFC045076) -+#define MCF_EDMA_TCD3_DLAST_SGA MCF_REG32(0xFC045078) -+#define MCF_EDMA_TCD3_BITER_ELINK MCF_REG16(0xFC04507C) -+#define MCF_EDMA_TCD3_BITER MCF_REG16(0xFC04507C) -+#define MCF_EDMA_TCD3_CSR MCF_REG16(0xFC04507E) -+#define MCF_EDMA_TCD4_SADDR MCF_REG32(0xFC045080) -+#define MCF_EDMA_TCD4_ATTR MCF_REG16(0xFC045084) -+#define MCF_EDMA_TCD4_SOFF MCF_REG16(0xFC045086) -+#define MCF_EDMA_TCD4_NBYTES MCF_REG32(0xFC045088) -+#define MCF_EDMA_TCD4_SLAST MCF_REG32(0xFC04508C) -+#define MCF_EDMA_TCD4_DADDR MCF_REG32(0xFC045090) -+#define MCF_EDMA_TCD4_CITER MCF_REG16(0xFC045094) -+#define MCF_EDMA_TCD4_CITER_ELINK MCF_REG16(0xFC045094) -+#define MCF_EDMA_TCD4_DOFF MCF_REG16(0xFC045096) -+#define MCF_EDMA_TCD4_DLAST_SGA MCF_REG32(0xFC045098) -+#define MCF_EDMA_TCD4_BITER MCF_REG16(0xFC04509C) -+#define MCF_EDMA_TCD4_BITER_ELINK MCF_REG16(0xFC04509C) -+#define MCF_EDMA_TCD4_CSR MCF_REG16(0xFC04509E) -+#define MCF_EDMA_TCD5_SADDR MCF_REG32(0xFC0450A0) -+#define MCF_EDMA_TCD5_ATTR MCF_REG16(0xFC0450A4) -+#define MCF_EDMA_TCD5_SOFF MCF_REG16(0xFC0450A6) -+#define MCF_EDMA_TCD5_NBYTES MCF_REG32(0xFC0450A8) -+#define MCF_EDMA_TCD5_SLAST MCF_REG32(0xFC0450AC) -+#define MCF_EDMA_TCD5_DADDR MCF_REG32(0xFC0450B0) -+#define MCF_EDMA_TCD5_CITER MCF_REG16(0xFC0450B4) -+#define MCF_EDMA_TCD5_CITER_ELINK MCF_REG16(0xFC0450B4) -+#define MCF_EDMA_TCD5_DOFF MCF_REG16(0xFC0450B6) -+#define MCF_EDMA_TCD5_DLAST_SGA MCF_REG32(0xFC0450B8) -+#define MCF_EDMA_TCD5_BITER_ELINK MCF_REG16(0xFC0450BC) -+#define MCF_EDMA_TCD5_BITER MCF_REG16(0xFC0450BC) -+#define MCF_EDMA_TCD5_CSR MCF_REG16(0xFC0450BE) -+#define MCF_EDMA_TCD6_SADDR MCF_REG32(0xFC0450C0) -+#define MCF_EDMA_TCD6_ATTR MCF_REG16(0xFC0450C4) -+#define MCF_EDMA_TCD6_SOFF MCF_REG16(0xFC0450C6) -+#define MCF_EDMA_TCD6_NBYTES MCF_REG32(0xFC0450C8) -+#define MCF_EDMA_TCD6_SLAST MCF_REG32(0xFC0450CC) -+#define MCF_EDMA_TCD6_DADDR MCF_REG32(0xFC0450D0) -+#define MCF_EDMA_TCD6_CITER MCF_REG16(0xFC0450D4) -+#define MCF_EDMA_TCD6_CITER_ELINK MCF_REG16(0xFC0450D4) -+#define MCF_EDMA_TCD6_DOFF MCF_REG16(0xFC0450D6) -+#define MCF_EDMA_TCD6_DLAST_SGA MCF_REG32(0xFC0450D8) -+#define MCF_EDMA_TCD6_BITER_ELINK MCF_REG16(0xFC0450DC) -+#define MCF_EDMA_TCD6_BITER MCF_REG16(0xFC0450DC) -+#define MCF_EDMA_TCD6_CSR MCF_REG16(0xFC0450DE) -+#define MCF_EDMA_TCD7_SADDR MCF_REG32(0xFC0450E0) -+#define MCF_EDMA_TCD7_ATTR MCF_REG16(0xFC0450E4) -+#define MCF_EDMA_TCD7_SOFF MCF_REG16(0xFC0450E6) -+#define MCF_EDMA_TCD7_NBYTES MCF_REG32(0xFC0450E8) -+#define MCF_EDMA_TCD7_SLAST MCF_REG32(0xFC0450EC) -+#define MCF_EDMA_TCD7_DADDR MCF_REG32(0xFC0450F0) -+#define MCF_EDMA_TCD7_CITER MCF_REG16(0xFC0450F4) -+#define MCF_EDMA_TCD7_CITER_ELINK MCF_REG16(0xFC0450F4) -+#define MCF_EDMA_TCD7_DOFF MCF_REG16(0xFC0450F6) -+#define MCF_EDMA_TCD7_DLAST_SGA MCF_REG32(0xFC0450F8) -+#define MCF_EDMA_TCD7_BITER_ELINK MCF_REG16(0xFC0450FC) -+#define MCF_EDMA_TCD7_BITER MCF_REG16(0xFC0450FC) -+#define MCF_EDMA_TCD7_CSR MCF_REG16(0xFC0450FE) -+#define MCF_EDMA_TCD8_SADDR MCF_REG32(0xFC045100) -+#define MCF_EDMA_TCD8_ATTR MCF_REG16(0xFC045104) -+#define MCF_EDMA_TCD8_SOFF MCF_REG16(0xFC045106) -+#define MCF_EDMA_TCD8_NBYTES MCF_REG32(0xFC045108) -+#define MCF_EDMA_TCD8_SLAST MCF_REG32(0xFC04510C) -+#define MCF_EDMA_TCD8_DADDR MCF_REG32(0xFC045110) -+#define MCF_EDMA_TCD8_CITER MCF_REG16(0xFC045114) -+#define MCF_EDMA_TCD8_CITER_ELINK MCF_REG16(0xFC045114) -+#define MCF_EDMA_TCD8_DOFF MCF_REG16(0xFC045116) -+#define MCF_EDMA_TCD8_DLAST_SGA MCF_REG32(0xFC045118) -+#define MCF_EDMA_TCD8_BITER_ELINK MCF_REG16(0xFC04511C) -+#define MCF_EDMA_TCD8_BITER MCF_REG16(0xFC04511C) -+#define MCF_EDMA_TCD8_CSR MCF_REG16(0xFC04511E) -+#define MCF_EDMA_TCD9_SADDR MCF_REG32(0xFC045120) -+#define MCF_EDMA_TCD9_ATTR MCF_REG16(0xFC045124) -+#define MCF_EDMA_TCD9_SOFF MCF_REG16(0xFC045126) -+#define MCF_EDMA_TCD9_NBYTES MCF_REG32(0xFC045128) -+#define MCF_EDMA_TCD9_SLAST MCF_REG32(0xFC04512C) -+#define MCF_EDMA_TCD9_DADDR MCF_REG32(0xFC045130) -+#define MCF_EDMA_TCD9_CITER_ELINK MCF_REG16(0xFC045134) -+#define MCF_EDMA_TCD9_CITER MCF_REG16(0xFC045134) -+#define MCF_EDMA_TCD9_DOFF MCF_REG16(0xFC045136) -+#define MCF_EDMA_TCD9_DLAST_SGA MCF_REG32(0xFC045138) -+#define MCF_EDMA_TCD9_BITER_ELINK MCF_REG16(0xFC04513C) -+#define MCF_EDMA_TCD9_BITER MCF_REG16(0xFC04513C) -+#define MCF_EDMA_TCD9_CSR MCF_REG16(0xFC04513E) -+#define MCF_EDMA_TCD10_SADDR MCF_REG32(0xFC045140) -+#define MCF_EDMA_TCD10_ATTR MCF_REG16(0xFC045144) -+#define MCF_EDMA_TCD10_SOFF MCF_REG16(0xFC045146) -+#define MCF_EDMA_TCD10_NBYTES MCF_REG32(0xFC045148) -+#define MCF_EDMA_TCD10_SLAST MCF_REG32(0xFC04514C) -+#define MCF_EDMA_TCD10_DADDR MCF_REG32(0xFC045150) -+#define MCF_EDMA_TCD10_CITER_ELINK MCF_REG16(0xFC045154) -+#define MCF_EDMA_TCD10_CITER MCF_REG16(0xFC045154) -+#define MCF_EDMA_TCD10_DOFF MCF_REG16(0xFC045156) -+#define MCF_EDMA_TCD10_DLAST_SGA MCF_REG32(0xFC045158) -+#define MCF_EDMA_TCD10_BITER MCF_REG16(0xFC04515C) -+#define MCF_EDMA_TCD10_BITER_ELINK MCF_REG16(0xFC04515C) -+#define MCF_EDMA_TCD10_CSR MCF_REG16(0xFC04515E) -+#define MCF_EDMA_TCD11_SADDR MCF_REG32(0xFC045160) -+#define MCF_EDMA_TCD11_ATTR MCF_REG16(0xFC045164) -+#define MCF_EDMA_TCD11_SOFF MCF_REG16(0xFC045166) -+#define MCF_EDMA_TCD11_NBYTES MCF_REG32(0xFC045168) -+#define MCF_EDMA_TCD11_SLAST MCF_REG32(0xFC04516C) -+#define MCF_EDMA_TCD11_DADDR MCF_REG32(0xFC045170) -+#define MCF_EDMA_TCD11_CITER MCF_REG16(0xFC045174) -+#define MCF_EDMA_TCD11_CITER_ELINK MCF_REG16(0xFC045174) -+#define MCF_EDMA_TCD11_DOFF MCF_REG16(0xFC045176) -+#define MCF_EDMA_TCD11_DLAST_SGA MCF_REG32(0xFC045178) -+#define MCF_EDMA_TCD11_BITER MCF_REG16(0xFC04517C) -+#define MCF_EDMA_TCD11_BITER_ELINK MCF_REG16(0xFC04517C) -+#define MCF_EDMA_TCD11_CSR MCF_REG16(0xFC04517E) -+#define MCF_EDMA_TCD12_SADDR MCF_REG32(0xFC045180) -+#define MCF_EDMA_TCD12_ATTR MCF_REG16(0xFC045184) -+#define MCF_EDMA_TCD12_SOFF MCF_REG16(0xFC045186) -+#define MCF_EDMA_TCD12_NBYTES MCF_REG32(0xFC045188) -+#define MCF_EDMA_TCD12_SLAST MCF_REG32(0xFC04518C) -+#define MCF_EDMA_TCD12_DADDR MCF_REG32(0xFC045190) -+#define MCF_EDMA_TCD12_CITER MCF_REG16(0xFC045194) -+#define MCF_EDMA_TCD12_CITER_ELINK MCF_REG16(0xFC045194) -+#define MCF_EDMA_TCD12_DOFF MCF_REG16(0xFC045196) -+#define MCF_EDMA_TCD12_DLAST_SGA MCF_REG32(0xFC045198) -+#define MCF_EDMA_TCD12_BITER MCF_REG16(0xFC04519C) -+#define MCF_EDMA_TCD12_BITER_ELINK MCF_REG16(0xFC04519C) -+#define MCF_EDMA_TCD12_CSR MCF_REG16(0xFC04519E) -+#define MCF_EDMA_TCD13_SADDR MCF_REG32(0xFC0451A0) -+#define MCF_EDMA_TCD13_ATTR MCF_REG16(0xFC0451A4) -+#define MCF_EDMA_TCD13_SOFF MCF_REG16(0xFC0451A6) -+#define MCF_EDMA_TCD13_NBYTES MCF_REG32(0xFC0451A8) -+#define MCF_EDMA_TCD13_SLAST MCF_REG32(0xFC0451AC) -+#define MCF_EDMA_TCD13_DADDR MCF_REG32(0xFC0451B0) -+#define MCF_EDMA_TCD13_CITER_ELINK MCF_REG16(0xFC0451B4) -+#define MCF_EDMA_TCD13_CITER MCF_REG16(0xFC0451B4) -+#define MCF_EDMA_TCD13_DOFF MCF_REG16(0xFC0451B6) -+#define MCF_EDMA_TCD13_DLAST_SGA MCF_REG32(0xFC0451B8) -+#define MCF_EDMA_TCD13_BITER_ELINK MCF_REG16(0xFC0451BC) -+#define MCF_EDMA_TCD13_BITER MCF_REG16(0xFC0451BC) -+#define MCF_EDMA_TCD13_CSR MCF_REG16(0xFC0451BE) -+#define MCF_EDMA_TCD14_SADDR MCF_REG32(0xFC0451C0) -+#define MCF_EDMA_TCD14_ATTR MCF_REG16(0xFC0451C4) -+#define MCF_EDMA_TCD14_SOFF MCF_REG16(0xFC0451C6) -+#define MCF_EDMA_TCD14_NBYTES MCF_REG32(0xFC0451C8) -+#define MCF_EDMA_TCD14_SLAST MCF_REG32(0xFC0451CC) -+#define MCF_EDMA_TCD14_DADDR MCF_REG32(0xFC0451D0) -+#define MCF_EDMA_TCD14_CITER MCF_REG16(0xFC0451D4) -+#define MCF_EDMA_TCD14_CITER_ELINK MCF_REG16(0xFC0451D4) -+#define MCF_EDMA_TCD14_DOFF MCF_REG16(0xFC0451D6) -+#define MCF_EDMA_TCD14_DLAST_SGA MCF_REG32(0xFC0451D8) -+#define MCF_EDMA_TCD14_BITER_ELINK MCF_REG16(0xFC0451DC) -+#define MCF_EDMA_TCD14_BITER MCF_REG16(0xFC0451DC) -+#define MCF_EDMA_TCD14_CSR MCF_REG16(0xFC0451DE) -+#define MCF_EDMA_TCD15_SADDR MCF_REG32(0xFC0451E0) -+#define MCF_EDMA_TCD15_ATTR MCF_REG16(0xFC0451E4) -+#define MCF_EDMA_TCD15_SOFF MCF_REG16(0xFC0451E6) -+#define MCF_EDMA_TCD15_NBYTES MCF_REG32(0xFC0451E8) -+#define MCF_EDMA_TCD15_SLAST MCF_REG32(0xFC0451EC) -+#define MCF_EDMA_TCD15_DADDR MCF_REG32(0xFC0451F0) -+#define MCF_EDMA_TCD15_CITER_ELINK MCF_REG16(0xFC0451F4) -+#define MCF_EDMA_TCD15_CITER MCF_REG16(0xFC0451F4) -+#define MCF_EDMA_TCD15_DOFF MCF_REG16(0xFC0451F6) -+#define MCF_EDMA_TCD15_DLAST_SGA MCF_REG32(0xFC0451F8) -+#define MCF_EDMA_TCD15_BITER MCF_REG16(0xFC0451FC) -+#define MCF_EDMA_TCD15_BITER_ELINK MCF_REG16(0xFC0451FC) -+#define MCF_EDMA_TCD15_CSR MCF_REG16(0xFC0451FE) -+ -+/* Parameterized register read/write macros for multiple registers */ -+#define MCF_EDMA_DCHPRI(x) MCF_REG08(0xFC044100+((x)*0x001)) -+#define MCF_EDMA_TCD_SADDR(x) MCF_REG32(0xFC045000+((x)*0x020)) -+#define MCF_EDMA_TCD_ATTR(x) MCF_REG16(0xFC045004+((x)*0x020)) -+#define MCF_EDMA_TCD_SOFF(x) MCF_REG16(0xFC045006+((x)*0x020)) -+#define MCF_EDMA_TCD_NBYTES(x) MCF_REG32(0xFC045008+((x)*0x020)) -+#define MCF_EDMA_TCD_SLAST(x) MCF_REG32(0xFC04500C+((x)*0x020)) -+#define MCF_EDMA_TCD_DADDR(x) MCF_REG32(0xFC045010+((x)*0x020)) -+#define MCF_EDMA_TCD_CITER_ELINK(x) MCF_REG16(0xFC045014+((x)*0x020)) -+#define MCF_EDMA_TCD_CITER(x) MCF_REG16(0xFC045014+((x)*0x020)) -+#define MCF_EDMA_TCD_DOFF(x) MCF_REG16(0xFC045016+((x)*0x020)) -+#define MCF_EDMA_TCD_DLAST_SGA(x) MCF_REG32(0xFC045018+((x)*0x020)) -+#define MCF_EDMA_TCD_BITER_ELINK(x) MCF_REG16(0xFC04501C+((x)*0x020)) -+#define MCF_EDMA_TCD_BITER(x) MCF_REG16(0xFC04501C+((x)*0x020)) -+#define MCF_EDMA_TCD_CSR(x) MCF_REG16(0xFC04501e +((x)*0x020)) -+ -+/* Bit definitions and macros for CR */ -+#define MCF_EDMA_CR_EDBG (0x00000002) -+#define MCF_EDMA_CR_ERCA (0x00000004) -+ -+/* Bit definitions and macros for ES */ -+#define MCF_EDMA_ES_DBE (0x00000001) -+#define MCF_EDMA_ES_SBE (0x00000002) -+#define MCF_EDMA_ES_SGE (0x00000004) -+#define MCF_EDMA_ES_NCE (0x00000008) -+#define MCF_EDMA_ES_DOE (0x00000010) -+#define MCF_EDMA_ES_DAE (0x00000020) -+#define MCF_EDMA_ES_SOE (0x00000040) -+#define MCF_EDMA_ES_SAE (0x00000080) -+#define MCF_EDMA_ES_ERRCHN(x) (((x)&0x0000000F)<<8) -+#define MCF_EDMA_ES_CPE (0x00004000) -+#define MCF_EDMA_ES_VLD (0x80000000) -+ -+/* Bit definitions and macros for ERQ */ -+#define MCF_EDMA_ERQ_ERQ0 (0x0001) -+#define MCF_EDMA_ERQ_ERQ1 (0x0002) -+#define MCF_EDMA_ERQ_ERQ2 (0x0004) -+#define MCF_EDMA_ERQ_ERQ3 (0x0008) -+#define MCF_EDMA_ERQ_ERQ4 (0x0010) -+#define MCF_EDMA_ERQ_ERQ5 (0x0020) -+#define MCF_EDMA_ERQ_ERQ6 (0x0040) -+#define MCF_EDMA_ERQ_ERQ7 (0x0080) -+#define MCF_EDMA_ERQ_ERQ8 (0x0100) -+#define MCF_EDMA_ERQ_ERQ9 (0x0200) -+#define MCF_EDMA_ERQ_ERQ10 (0x0400) -+#define MCF_EDMA_ERQ_ERQ11 (0x0800) -+#define MCF_EDMA_ERQ_ERQ12 (0x1000) -+#define MCF_EDMA_ERQ_ERQ13 (0x2000) -+#define MCF_EDMA_ERQ_ERQ14 (0x4000) -+#define MCF_EDMA_ERQ_ERQ15 (0x8000) -+ -+/* Bit definitions and macros for EEI */ -+#define MCF_EDMA_EEI_EEI0 (0x0001) -+#define MCF_EDMA_EEI_EEI1 (0x0002) -+#define MCF_EDMA_EEI_EEI2 (0x0004) -+#define MCF_EDMA_EEI_EEI3 (0x0008) -+#define MCF_EDMA_EEI_EEI4 (0x0010) -+#define MCF_EDMA_EEI_EEI5 (0x0020) -+#define MCF_EDMA_EEI_EEI6 (0x0040) -+#define MCF_EDMA_EEI_EEI7 (0x0080) -+#define MCF_EDMA_EEI_EEI8 (0x0100) -+#define MCF_EDMA_EEI_EEI9 (0x0200) -+#define MCF_EDMA_EEI_EEI10 (0x0400) -+#define MCF_EDMA_EEI_EEI11 (0x0800) -+#define MCF_EDMA_EEI_EEI12 (0x1000) -+#define MCF_EDMA_EEI_EEI13 (0x2000) -+#define MCF_EDMA_EEI_EEI14 (0x4000) -+#define MCF_EDMA_EEI_EEI15 (0x8000) -+ -+/* Bit definitions and macros for SERQ */ -+#define MCF_EDMA_SERQ_SERQ(x) (((x)&0x0F)) -+#define MCF_EDMA_SERQ_SAER (0x40) -+ -+/* Bit definitions and macros for CERQ */ -+#define MCF_EDMA_CERQ_CERQ(x) (((x)&0x0F)) -+#define MCF_EDMA_CERQ_CAER (0x40) -+ -+/* Bit definitions and macros for SEEI */ -+#define MCF_EDMA_SEEI_SEEI(x) (((x)&0x0F)) -+#define MCF_EDMA_SEEI_SAEE (0x40) -+ -+/* Bit definitions and macros for CEEI */ -+#define MCF_EDMA_CEEI_CEEI(x) (((x)&0x0F)) -+#define MCF_EDMA_CEEI_CAEE (0x40) -+ -+/* Bit definitions and macros for CINT */ -+#define MCF_EDMA_CINT_CINT(x) (((x)&0x0F)) -+#define MCF_EDMA_CINT_CAIR (0x40) -+ -+/* Bit definitions and macros for CERR */ -+#define MCF_EDMA_CERR_CERR(x) (((x)&0x0F)) -+#define MCF_EDMA_CERR_CAER (0x40) -+ -+/* Bit definitions and macros for SSRT */ -+#define MCF_EDMA_SSRT_SSRT(x) (((x)&0x0F)) -+#define MCF_EDMA_SSRT_SAST (0x40) -+ -+/* Bit definitions and macros for CDNE */ -+#define MCF_EDMA_CDNE_CDNE(x) (((x)&0x0F)) -+#define MCF_EDMA_CDNE_CADN (0x40) -+ -+/* Bit definitions and macros for INTR */ -+#define MCF_EDMA_INTR_INT0 (0x0001) -+#define MCF_EDMA_INTR_INT1 (0x0002) -+#define MCF_EDMA_INTR_INT2 (0x0004) -+#define MCF_EDMA_INTR_INT3 (0x0008) -+#define MCF_EDMA_INTR_INT4 (0x0010) -+#define MCF_EDMA_INTR_INT5 (0x0020) -+#define MCF_EDMA_INTR_INT6 (0x0040) -+#define MCF_EDMA_INTR_INT7 (0x0080) -+#define MCF_EDMA_INTR_INT8 (0x0100) -+#define MCF_EDMA_INTR_INT9 (0x0200) -+#define MCF_EDMA_INTR_INT10 (0x0400) -+#define MCF_EDMA_INTR_INT11 (0x0800) -+#define MCF_EDMA_INTR_INT12 (0x1000) -+#define MCF_EDMA_INTR_INT13 (0x2000) -+#define MCF_EDMA_INTR_INT14 (0x4000) -+#define MCF_EDMA_INTR_INT15 (0x8000) -+ -+/* Bit definitions and macros for ERR */ -+#define MCF_EDMA_ERR_ERR0 (0x0001) -+#define MCF_EDMA_ERR_ERR1 (0x0002) -+#define MCF_EDMA_ERR_ERR2 (0x0004) -+#define MCF_EDMA_ERR_ERR3 (0x0008) -+#define MCF_EDMA_ERR_ERR4 (0x0010) -+#define MCF_EDMA_ERR_ERR5 (0x0020) -+#define MCF_EDMA_ERR_ERR6 (0x0040) -+#define MCF_EDMA_ERR_ERR7 (0x0080) -+#define MCF_EDMA_ERR_ERR8 (0x0100) -+#define MCF_EDMA_ERR_ERR9 (0x0200) -+#define MCF_EDMA_ERR_ERR10 (0x0400) -+#define MCF_EDMA_ERR_ERR11 (0x0800) -+#define MCF_EDMA_ERR_ERR12 (0x1000) -+#define MCF_EDMA_ERR_ERR13 (0x2000) -+#define MCF_EDMA_ERR_ERR14 (0x4000) -+#define MCF_EDMA_ERR_ERR15 (0x8000) -+ -+/* Bit definitions and macros for DCHPRI group */ -+#define MCF_EDMA_DCHPRI_CHPRI(x) (((x)&0x0F)) -+#define MCF_EDMA_DCHPRI_ECP (0x80) -+ -+/* Bit definitions and macros for DCHPRI0 */ -+#define MCF_EDMA_DCHPRI0_CHPRI(x) (((x)&0x0F)) -+#define MCF_EDMA_DCHPRI0_ECP (0x80) -+ -+/* Bit definitions and macros for DCHPRI1 */ -+#define MCF_EDMA_DCHPRI1_CHPRI(x) (((x)&0x0F)) -+#define MCF_EDMA_DCHPRI1_ECP (0x80) -+ -+/* Bit definitions and macros for DCHPRI2 */ -+#define MCF_EDMA_DCHPRI2_CHPRI(x) (((x)&0x0F)) -+#define MCF_EDMA_DCHPRI2_ECP (0x80) -+ -+/* Bit definitions and macros for DCHPRI3 */ -+#define MCF_EDMA_DCHPRI3_CHPRI(x) (((x)&0x0F)) -+#define MCF_EDMA_DCHPRI3_ECP (0x80) -+ -+/* Bit definitions and macros for DCHPRI4 */ -+#define MCF_EDMA_DCHPRI4_CHPRI(x) (((x)&0x0F)) -+#define MCF_EDMA_DCHPRI4_ECP (0x80) -+ -+/* Bit definitions and macros for DCHPRI5 */ -+#define MCF_EDMA_DCHPRI5_CHPRI(x) (((x)&0x0F)) -+#define MCF_EDMA_DCHPRI5_ECP (0x80) -+ -+/* Bit definitions and macros for DCHPRI6 */ -+#define MCF_EDMA_DCHPRI6_CHPRI(x) (((x)&0x0F)) -+#define MCF_EDMA_DCHPRI6_ECP (0x80) -+ -+/* Bit definitions and macros for DCHPRI7 */ -+#define MCF_EDMA_DCHPRI7_CHPRI(x) (((x)&0x0F)) -+#define MCF_EDMA_DCHPRI7_ECP (0x80) -+ -+/* Bit definitions and macros for DCHPRI8 */ -+#define MCF_EDMA_DCHPRI8_CHPRI(x) (((x)&0x0F)) -+#define MCF_EDMA_DCHPRI8_ECP (0x80) -+ -+/* Bit definitions and macros for DCHPRI9 */ -+#define MCF_EDMA_DCHPRI9_CHPRI(x) (((x)&0x0F)) -+#define MCF_EDMA_DCHPRI9_ECP (0x80) -+ -+/* Bit definitions and macros for DCHPRI10 */ -+#define MCF_EDMA_DCHPRI10_CHPRI(x) (((x)&0x0F)) -+#define MCF_EDMA_DCHPRI10_ECP (0x80) -+ -+/* Bit definitions and macros for DCHPRI11 */ -+#define MCF_EDMA_DCHPRI11_CHPRI(x) (((x)&0x0F)) -+#define MCF_EDMA_DCHPRI11_ECP (0x80) -+ -+/* Bit definitions and macros for DCHPRI12 */ -+#define MCF_EDMA_DCHPRI12_CHPRI(x) (((x)&0x0F)) -+#define MCF_EDMA_DCHPRI12_ECP (0x80) -+ -+/* Bit definitions and macros for DCHPRI13 */ -+#define MCF_EDMA_DCHPRI13_CHPRI(x) (((x)&0x0F)) -+#define MCF_EDMA_DCHPRI13_ECP (0x80) -+ -+/* Bit definitions and macros for DCHPRI14 */ -+#define MCF_EDMA_DCHPRI14_CHPRI(x) (((x)&0x0F)) -+#define MCF_EDMA_DCHPRI14_ECP (0x80) -+ -+/* Bit definitions and macros for DCHPRI15 */ -+#define MCF_EDMA_DCHPRI15_CHPRI(x) (((x)&0x0F)) -+#define MCF_EDMA_DCHPRI15_ECP (0x80) -+ -+/* Bit definitions and macros for TCD_SADDR group */ -+#define MCF_EDMA_TCD_SADDR_SADDR(x) (x) -+ -+/* Bit definitions and macros for TCD0_SADDR */ -+#define MCF_EDMA_TCD0_SADDR_SADDR(x) (x) -+ -+/* Bit definitions and macros for TCD_ATTR group */ -+#define MCF_EDMA_TCD_ATTR_DSIZE(x) (((x)&0x0007)) -+#define MCF_EDMA_TCD_ATTR_DMOD(x) (((x)&0x001F)<<3) -+#define MCF_EDMA_TCD_ATTR_SSIZE(x) (((x)&0x0007)<<8) -+#define MCF_EDMA_TCD_ATTR_SMOD(x) (((x)&0x001F)<<11) -+#define MCF_EDMA_TCD_ATTR_SSIZE_8BIT (0x0000) -+#define MCF_EDMA_TCD_ATTR_SSIZE_16BIT (0x0100) -+#define MCF_EDMA_TCD_ATTR_SSIZE_32BIT (0x0200) -+#define MCF_EDMA_TCD_ATTR_SSIZE_16BYTE (0x0400) -+#define MCF_EDMA_TCD_ATTR_DSIZE_8BIT (0x0000) -+#define MCF_EDMA_TCD_ATTR_DSIZE_16BIT (0x0001) -+#define MCF_EDMA_TCD_ATTR_DSIZE_32BIT (0x0002) -+#define MCF_EDMA_TCD_ATTR_DSIZE_16BYTE (0x0004) -+ -+/* Bit definitions and macros for TCD0_ATTR */ -+#define MCF_EDMA_TCD0_ATTR_DSIZE(x) (((x)&0x0007)) -+#define MCF_EDMA_TCD0_ATTR_DMOD(x) (((x)&0x001F)<<3) -+#define MCF_EDMA_TCD0_ATTR_SSIZE(x) (((x)&0x0007)<<8) -+#define MCF_EDMA_TCD0_ATTR_SMOD(x) (((x)&0x001F)<<11) -+#define MCF_EDMA_TCD0_ATTR_SSIZE_8BIT (0x0000) -+#define MCF_EDMA_TCD0_ATTR_SSIZE_16BIT (0x0100) -+#define MCF_EDMA_TCD0_ATTR_SSIZE_32BIT (0x0200) -+#define MCF_EDMA_TCD0_ATTR_SSIZE_16BYTE (0x0400) -+#define MCF_EDMA_TCD0_ATTR_DSIZE_8BIT (0x0000) -+#define MCF_EDMA_TCD0_ATTR_DSIZE_16BIT (0x0001) -+#define MCF_EDMA_TCD0_ATTR_DSIZE_32BIT (0x0002) -+#define MCF_EDMA_TCD0_ATTR_DSIZE_16BYTE (0x0004) -+ -+/* Bit definitions and macros for TCD_SOFF group */ -+#define MCF_EDMA_TCD_SOFF_SOFF(x) (x) -+ -+/* Bit definitions and macros for TCD0_SOFF */ -+#define MCF_EDMA_TCD0_SOFF_SOFF(x) (x) -+ -+/* Bit definitions and macros for TCD_NBYTES group */ -+#define MCF_EDMA_TCD_NBYTES_NBYTES(x) (x) -+ -+/* Bit definitions and macros for TCD0_NBYTES */ -+#define MCF_EDMA_TCD0_NBYTES_NBYTES(x) (x) -+ -+/* Bit definitions and macros for TCD_SLAST group */ -+#define MCF_EDMA_TCD_SLAST_SLAST(x) (x) -+ -+/* Bit definitions and macros for TCD0_SLAST */ -+#define MCF_EDMA_TCD0_SLAST_SLAST(x) (x) -+ -+/* Bit definitions and macros for TCD_DADDR group */ -+#define MCF_EDMA_TCD_DADDR_DADDR(x) (x) -+ -+/* Bit definitions and macros for TCD0_DADDR */ -+#define MCF_EDMA_TCD0_DADDR_DADDR(x) (x) -+ -+/* Bit definitions and macros for TCD_CITER_ELINK group */ -+#define MCF_EDMA_TCD_CITER_ELINK_CITER(x) (((x)&0x01FF)) -+#define MCF_EDMA_TCD_CITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) -+#define MCF_EDMA_TCD_CITER_ELINK_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD0_CITER_ELINK */ -+#define MCF_EDMA_TCD0_CITER_ELINK_CITER(x) (((x)&0x01FF)) -+#define MCF_EDMA_TCD0_CITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) -+#define MCF_EDMA_TCD0_CITER_ELINK_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD_CITER group */ -+#define MCF_EDMA_TCD_CITER_CITER(x) (((x)&0x7FFF)) -+#define MCF_EDMA_TCD_CITER_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD0_CITER */ -+#define MCF_EDMA_TCD0_CITER_CITER(x) (((x)&0x7FFF)) -+#define MCF_EDMA_TCD0_CITER_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD_DOFF group */ -+#define MCF_EDMA_TCD_DOFF_DOFF(x) (x) -+ -+/* Bit definitions and macros for TCD0_DOFF */ -+#define MCF_EDMA_TCD0_DOFF_DOFF(x) (x) -+ -+/* Bit definitions and macros for TCD_DLAST_SGA group */ -+#define MCF_EDMA_TCD_DLAST_SGA_DLAST_SGA(x) (x) -+ -+/* Bit definitions and macros for TCD0_DLAST_SGA */ -+#define MCF_EDMA_TCD0_DLAST_SGA_DLAST_SGA(x) (x) -+ -+/* Bit definitions and macros for TCD_BITER_ELINK group */ -+#define MCF_EDMA_TCD_BITER_ELINK_BITER(x) (((x)&0x01FF)) -+#define MCF_EDMA_TCD_BITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) -+#define MCF_EDMA_TCD_BITER_ELINK_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD0_BITER_ELINK */ -+#define MCF_EDMA_TCD0_BITER_ELINK_BITER(x) (((x)&0x01FF)) -+#define MCF_EDMA_TCD0_BITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) -+#define MCF_EDMA_TCD0_BITER_ELINK_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD_BITER group */ -+#define MCF_EDMA_TCD_BITER_BITER(x) (((x)&0x7FFF)) -+#define MCF_EDMA_TCD_BITER_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD0_BITER */ -+#define MCF_EDMA_TCD0_BITER_BITER(x) (((x)&0x7FFF)) -+#define MCF_EDMA_TCD0_BITER_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD_CSR group */ -+#define MCF_EDMA_TCD_CSR_START (0x0001) -+#define MCF_EDMA_TCD_CSR_INT_MAJOR (0x0002) -+#define MCF_EDMA_TCD_CSR_INT_HALF (0x0004) -+#define MCF_EDMA_TCD_CSR_D_REQ (0x0008) -+#define MCF_EDMA_TCD_CSR_E_SG (0x0010) -+#define MCF_EDMA_TCD_CSR_E_LINK (0x0020) -+#define MCF_EDMA_TCD_CSR_ACTIVE (0x0040) -+#define MCF_EDMA_TCD_CSR_DONE (0x0080) -+#define MCF_EDMA_TCD_CSR_LINKCH(x) (((x)&0x003F)<<8) -+#define MCF_EDMA_TCD_CSR_BWC(x) (((x)&0x0003)<<14) -+#define MCF_EDMA_TCD_CSR_BWC_NO_STALL (0x0000) -+#define MCF_EDMA_TCD_CSR_BWC_4CYC_STALL (0x8000) -+#define MCF_EDMA_TCD_CSR_BWC_8CYC_STALL (0xC000) -+ -+/* Bit definitions and macros for TCD0_CSR */ -+#define MCF_EDMA_TCD0_CSR_START (0x0001) -+#define MCF_EDMA_TCD0_CSR_INT_MAJOR (0x0002) -+#define MCF_EDMA_TCD0_CSR_INT_HALF (0x0004) -+#define MCF_EDMA_TCD0_CSR_D_REQ (0x0008) -+#define MCF_EDMA_TCD0_CSR_E_SG (0x0010) -+#define MCF_EDMA_TCD0_CSR_E_LINK (0x0020) -+#define MCF_EDMA_TCD0_CSR_ACTIVE (0x0040) -+#define MCF_EDMA_TCD0_CSR_DONE (0x0080) -+#define MCF_EDMA_TCD0_CSR_LINKCH(x) (((x)&0x003F)<<8) -+#define MCF_EDMA_TCD0_CSR_BWC(x) (((x)&0x0003)<<14) -+#define MCF_EDMA_TCD0_CSR_BWC_NO_STALL (0x0000) -+#define MCF_EDMA_TCD0_CSR_BWC_4CYC_STALL (0x8000) -+#define MCF_EDMA_TCD0_CSR_BWC_8CYC_STALL (0xC000) -+ -+/* Bit definitions and macros for TCD1_SADDR */ -+#define MCF_EDMA_TCD1_SADDR_SADDR(x) (x) -+ -+/* Bit definitions and macros for TCD1_ATTR */ -+#define MCF_EDMA_TCD1_ATTR_DSIZE(x) (((x)&0x0007)) -+#define MCF_EDMA_TCD1_ATTR_DMOD(x) (((x)&0x001F)<<3) -+#define MCF_EDMA_TCD1_ATTR_SSIZE(x) (((x)&0x0007)<<8) -+#define MCF_EDMA_TCD1_ATTR_SMOD(x) (((x)&0x001F)<<11) -+ -+/* Bit definitions and macros for TCD1_SOFF */ -+#define MCF_EDMA_TCD1_SOFF_SOFF(x) (x) -+ -+/* Bit definitions and macros for TCD1_NBYTES */ -+#define MCF_EDMA_TCD1_NBYTES_NBYTES(x) (x) -+ -+/* Bit definitions and macros for TCD1_SLAST */ -+#define MCF_EDMA_TCD1_SLAST_SLAST(x) (x) -+ -+/* Bit definitions and macros for TCD1_DADDR */ -+#define MCF_EDMA_TCD1_DADDR_DADDR(x) (x) -+ -+/* Bit definitions and macros for TCD1_CITER_ELINK */ -+#define MCF_EDMA_TCD1_CITER_ELINK_CITER(x) (((x)&0x01FF)) -+#define MCF_EDMA_TCD1_CITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) -+#define MCF_EDMA_TCD1_CITER_ELINK_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD1_CITER */ -+#define MCF_EDMA_TCD1_CITER_CITER(x) (((x)&0x7FFF)) -+#define MCF_EDMA_TCD1_CITER_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD1_DOFF */ -+#define MCF_EDMA_TCD1_DOFF_DOFF(x) (x) -+ -+/* Bit definitions and macros for TCD1_DLAST_SGA */ -+#define MCF_EDMA_TCD1_DLAST_SGA_DLAST_SGA(x) (x) -+ -+/* Bit definitions and macros for TCD1_BITER */ -+#define MCF_EDMA_TCD1_BITER_BITER(x) (((x)&0x7FFF)) -+#define MCF_EDMA_TCD1_BITER_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD1_BITER_ELINK */ -+#define MCF_EDMA_TCD1_BITER_ELINK_BITER(x) (((x)&0x01FF)) -+#define MCF_EDMA_TCD1_BITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) -+#define MCF_EDMA_TCD1_BITER_ELINK_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD1_CSR */ -+#define MCF_EDMA_TCD1_CSR_START (0x0001) -+#define MCF_EDMA_TCD1_CSR_INT_MAJOR (0x0002) -+#define MCF_EDMA_TCD1_CSR_INT_HALF (0x0004) -+#define MCF_EDMA_TCD1_CSR_D_REQ (0x0008) -+#define MCF_EDMA_TCD1_CSR_E_SG (0x0010) -+#define MCF_EDMA_TCD1_CSR_E_LINK (0x0020) -+#define MCF_EDMA_TCD1_CSR_ACTIVE (0x0040) -+#define MCF_EDMA_TCD1_CSR_DONE (0x0080) -+#define MCF_EDMA_TCD1_CSR_LINKCH(x) (((x)&0x003F)<<8) -+#define MCF_EDMA_TCD1_CSR_BWC(x) (((x)&0x0003)<<14) -+ -+/* Bit definitions and macros for TCD2_SADDR */ -+#define MCF_EDMA_TCD2_SADDR_SADDR(x) (x) -+ -+/* Bit definitions and macros for TCD2_ATTR */ -+#define MCF_EDMA_TCD2_ATTR_DSIZE(x) (((x)&0x0007)) -+#define MCF_EDMA_TCD2_ATTR_DMOD(x) (((x)&0x001F)<<3) -+#define MCF_EDMA_TCD2_ATTR_SSIZE(x) (((x)&0x0007)<<8) -+#define MCF_EDMA_TCD2_ATTR_SMOD(x) (((x)&0x001F)<<11) -+ -+/* Bit definitions and macros for TCD2_SOFF */ -+#define MCF_EDMA_TCD2_SOFF_SOFF(x) (x) -+ -+/* Bit definitions and macros for TCD2_NBYTES */ -+#define MCF_EDMA_TCD2_NBYTES_NBYTES(x) (x) -+ -+/* Bit definitions and macros for TCD2_SLAST */ -+#define MCF_EDMA_TCD2_SLAST_SLAST(x) (x) -+ -+/* Bit definitions and macros for TCD2_DADDR */ -+#define MCF_EDMA_TCD2_DADDR_DADDR(x) (x) -+ -+/* Bit definitions and macros for TCD2_CITER */ -+#define MCF_EDMA_TCD2_CITER_CITER(x) (((x)&0x7FFF)) -+#define MCF_EDMA_TCD2_CITER_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD2_CITER_ELINK */ -+#define MCF_EDMA_TCD2_CITER_ELINK_CITER(x) (((x)&0x01FF)) -+#define MCF_EDMA_TCD2_CITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) -+#define MCF_EDMA_TCD2_CITER_ELINK_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD2_DOFF */ -+#define MCF_EDMA_TCD2_DOFF_DOFF(x) (x) -+ -+/* Bit definitions and macros for TCD2_DLAST_SGA */ -+#define MCF_EDMA_TCD2_DLAST_SGA_DLAST_SGA(x) (x) -+ -+/* Bit definitions and macros for TCD2_BITER_ELINK */ -+#define MCF_EDMA_TCD2_BITER_ELINK_BITER(x) (((x)&0x01FF)) -+#define MCF_EDMA_TCD2_BITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) -+#define MCF_EDMA_TCD2_BITER_ELINK_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD2_BITER */ -+#define MCF_EDMA_TCD2_BITER_BITER(x) (((x)&0x7FFF)) -+#define MCF_EDMA_TCD2_BITER_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD2_CSR */ -+#define MCF_EDMA_TCD2_CSR_START (0x0001) -+#define MCF_EDMA_TCD2_CSR_INT_MAJOR (0x0002) -+#define MCF_EDMA_TCD2_CSR_INT_HALF (0x0004) -+#define MCF_EDMA_TCD2_CSR_D_REQ (0x0008) -+#define MCF_EDMA_TCD2_CSR_E_SG (0x0010) -+#define MCF_EDMA_TCD2_CSR_E_LINK (0x0020) -+#define MCF_EDMA_TCD2_CSR_ACTIVE (0x0040) -+#define MCF_EDMA_TCD2_CSR_DONE (0x0080) -+#define MCF_EDMA_TCD2_CSR_LINKCH(x) (((x)&0x003F)<<8) -+#define MCF_EDMA_TCD2_CSR_BWC(x) (((x)&0x0003)<<14) -+ -+/* Bit definitions and macros for TCD3_SADDR */ -+#define MCF_EDMA_TCD3_SADDR_SADDR(x) (x) -+ -+/* Bit definitions and macros for TCD3_ATTR */ -+#define MCF_EDMA_TCD3_ATTR_DSIZE(x) (((x)&0x0007)) -+#define MCF_EDMA_TCD3_ATTR_DMOD(x) (((x)&0x001F)<<3) -+#define MCF_EDMA_TCD3_ATTR_SSIZE(x) (((x)&0x0007)<<8) -+#define MCF_EDMA_TCD3_ATTR_SMOD(x) (((x)&0x001F)<<11) -+ -+/* Bit definitions and macros for TCD3_SOFF */ -+#define MCF_EDMA_TCD3_SOFF_SOFF(x) (x) -+ -+/* Bit definitions and macros for TCD3_NBYTES */ -+#define MCF_EDMA_TCD3_NBYTES_NBYTES(x) (x) -+ -+/* Bit definitions and macros for TCD3_SLAST */ -+#define MCF_EDMA_TCD3_SLAST_SLAST(x) (x) -+ -+/* Bit definitions and macros for TCD3_DADDR */ -+#define MCF_EDMA_TCD3_DADDR_DADDR(x) (x) -+ -+/* Bit definitions and macros for TCD3_CITER */ -+#define MCF_EDMA_TCD3_CITER_CITER(x) (((x)&0x7FFF)) -+#define MCF_EDMA_TCD3_CITER_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD3_CITER_ELINK */ -+#define MCF_EDMA_TCD3_CITER_ELINK_CITER(x) (((x)&0x01FF)) -+#define MCF_EDMA_TCD3_CITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) -+#define MCF_EDMA_TCD3_CITER_ELINK_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD3_DOFF */ -+#define MCF_EDMA_TCD3_DOFF_DOFF(x) (x) -+ -+/* Bit definitions and macros for TCD3_DLAST_SGA */ -+#define MCF_EDMA_TCD3_DLAST_SGA_DLAST_SGA(x) (x) -+ -+/* Bit definitions and macros for TCD3_BITER_ELINK */ -+#define MCF_EDMA_TCD3_BITER_ELINK_BITER(x) (((x)&0x01FF)) -+#define MCF_EDMA_TCD3_BITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) -+#define MCF_EDMA_TCD3_BITER_ELINK_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD3_BITER */ -+#define MCF_EDMA_TCD3_BITER_BITER(x) (((x)&0x7FFF)) -+#define MCF_EDMA_TCD3_BITER_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD3_CSR */ -+#define MCF_EDMA_TCD3_CSR_START (0x0001) -+#define MCF_EDMA_TCD3_CSR_INT_MAJOR (0x0002) -+#define MCF_EDMA_TCD3_CSR_INT_HALF (0x0004) -+#define MCF_EDMA_TCD3_CSR_D_REQ (0x0008) -+#define MCF_EDMA_TCD3_CSR_E_SG (0x0010) -+#define MCF_EDMA_TCD3_CSR_E_LINK (0x0020) -+#define MCF_EDMA_TCD3_CSR_ACTIVE (0x0040) -+#define MCF_EDMA_TCD3_CSR_DONE (0x0080) -+#define MCF_EDMA_TCD3_CSR_LINKCH(x) (((x)&0x003F)<<8) -+#define MCF_EDMA_TCD3_CSR_BWC(x) (((x)&0x0003)<<14) -+ -+/* Bit definitions and macros for TCD4_SADDR */ -+#define MCF_EDMA_TCD4_SADDR_SADDR(x) (x) -+ -+/* Bit definitions and macros for TCD4_ATTR */ -+#define MCF_EDMA_TCD4_ATTR_DSIZE(x) (((x)&0x0007)) -+#define MCF_EDMA_TCD4_ATTR_DMOD(x) (((x)&0x001F)<<3) -+#define MCF_EDMA_TCD4_ATTR_SSIZE(x) (((x)&0x0007)<<8) -+#define MCF_EDMA_TCD4_ATTR_SMOD(x) (((x)&0x001F)<<11) -+ -+/* Bit definitions and macros for TCD4_SOFF */ -+#define MCF_EDMA_TCD4_SOFF_SOFF(x) (x) -+ -+/* Bit definitions and macros for TCD4_NBYTES */ -+#define MCF_EDMA_TCD4_NBYTES_NBYTES(x) (x) -+ -+/* Bit definitions and macros for TCD4_SLAST */ -+#define MCF_EDMA_TCD4_SLAST_SLAST(x) (x) -+ -+/* Bit definitions and macros for TCD4_DADDR */ -+#define MCF_EDMA_TCD4_DADDR_DADDR(x) (x) -+ -+/* Bit definitions and macros for TCD4_CITER */ -+#define MCF_EDMA_TCD4_CITER_CITER(x) (((x)&0x7FFF)) -+#define MCF_EDMA_TCD4_CITER_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD4_CITER_ELINK */ -+#define MCF_EDMA_TCD4_CITER_ELINK_CITER(x) (((x)&0x01FF)) -+#define MCF_EDMA_TCD4_CITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) -+#define MCF_EDMA_TCD4_CITER_ELINK_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD4_DOFF */ -+#define MCF_EDMA_TCD4_DOFF_DOFF(x) (x) -+ -+/* Bit definitions and macros for TCD4_DLAST_SGA */ -+#define MCF_EDMA_TCD4_DLAST_SGA_DLAST_SGA(x) (x) -+ -+/* Bit definitions and macros for TCD4_BITER */ -+#define MCF_EDMA_TCD4_BITER_BITER(x) (((x)&0x7FFF)) -+#define MCF_EDMA_TCD4_BITER_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD4_BITER_ELINK */ -+#define MCF_EDMA_TCD4_BITER_ELINK_BITER(x) (((x)&0x01FF)) -+#define MCF_EDMA_TCD4_BITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) -+#define MCF_EDMA_TCD4_BITER_ELINK_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD4_CSR */ -+#define MCF_EDMA_TCD4_CSR_START (0x0001) -+#define MCF_EDMA_TCD4_CSR_INT_MAJOR (0x0002) -+#define MCF_EDMA_TCD4_CSR_INT_HALF (0x0004) -+#define MCF_EDMA_TCD4_CSR_D_REQ (0x0008) -+#define MCF_EDMA_TCD4_CSR_E_SG (0x0010) -+#define MCF_EDMA_TCD4_CSR_E_LINK (0x0020) -+#define MCF_EDMA_TCD4_CSR_ACTIVE (0x0040) -+#define MCF_EDMA_TCD4_CSR_DONE (0x0080) -+#define MCF_EDMA_TCD4_CSR_LINKCH(x) (((x)&0x003F)<<8) -+#define MCF_EDMA_TCD4_CSR_BWC(x) (((x)&0x0003)<<14) -+ -+/* Bit definitions and macros for TCD5_SADDR */ -+#define MCF_EDMA_TCD5_SADDR_SADDR(x) (x) -+ -+/* Bit definitions and macros for TCD5_ATTR */ -+#define MCF_EDMA_TCD5_ATTR_DSIZE(x) (((x)&0x0007)) -+#define MCF_EDMA_TCD5_ATTR_DMOD(x) (((x)&0x001F)<<3) -+#define MCF_EDMA_TCD5_ATTR_SSIZE(x) (((x)&0x0007)<<8) -+#define MCF_EDMA_TCD5_ATTR_SMOD(x) (((x)&0x001F)<<11) -+ -+/* Bit definitions and macros for TCD5_SOFF */ -+#define MCF_EDMA_TCD5_SOFF_SOFF(x) (x) -+ -+/* Bit definitions and macros for TCD5_NBYTES */ -+#define MCF_EDMA_TCD5_NBYTES_NBYTES(x) (x) -+ -+/* Bit definitions and macros for TCD5_SLAST */ -+#define MCF_EDMA_TCD5_SLAST_SLAST(x) (x) -+ -+/* Bit definitions and macros for TCD5_DADDR */ -+#define MCF_EDMA_TCD5_DADDR_DADDR(x) (x) -+ -+/* Bit definitions and macros for TCD5_CITER */ -+#define MCF_EDMA_TCD5_CITER_CITER(x) (((x)&0x7FFF)) -+#define MCF_EDMA_TCD5_CITER_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD5_CITER_ELINK */ -+#define MCF_EDMA_TCD5_CITER_ELINK_CITER(x) (((x)&0x01FF)) -+#define MCF_EDMA_TCD5_CITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) -+#define MCF_EDMA_TCD5_CITER_ELINK_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD5_DOFF */ -+#define MCF_EDMA_TCD5_DOFF_DOFF(x) (x) -+ -+/* Bit definitions and macros for TCD5_DLAST_SGA */ -+#define MCF_EDMA_TCD5_DLAST_SGA_DLAST_SGA(x) (x) -+ -+/* Bit definitions and macros for TCD5_BITER_ELINK */ -+#define MCF_EDMA_TCD5_BITER_ELINK_BITER(x) (((x)&0x01FF)) -+#define MCF_EDMA_TCD5_BITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) -+#define MCF_EDMA_TCD5_BITER_ELINK_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD5_BITER */ -+#define MCF_EDMA_TCD5_BITER_BITER(x) (((x)&0x7FFF)) -+#define MCF_EDMA_TCD5_BITER_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD5_CSR */ -+#define MCF_EDMA_TCD5_CSR_START (0x0001) -+#define MCF_EDMA_TCD5_CSR_INT_MAJOR (0x0002) -+#define MCF_EDMA_TCD5_CSR_INT_HALF (0x0004) -+#define MCF_EDMA_TCD5_CSR_D_REQ (0x0008) -+#define MCF_EDMA_TCD5_CSR_E_SG (0x0010) -+#define MCF_EDMA_TCD5_CSR_E_LINK (0x0020) -+#define MCF_EDMA_TCD5_CSR_ACTIVE (0x0040) -+#define MCF_EDMA_TCD5_CSR_DONE (0x0080) -+#define MCF_EDMA_TCD5_CSR_LINKCH(x) (((x)&0x003F)<<8) -+#define MCF_EDMA_TCD5_CSR_BWC(x) (((x)&0x0003)<<14) -+ -+/* Bit definitions and macros for TCD6_SADDR */ -+#define MCF_EDMA_TCD6_SADDR_SADDR(x) (x) -+ -+/* Bit definitions and macros for TCD6_ATTR */ -+#define MCF_EDMA_TCD6_ATTR_DSIZE(x) (((x)&0x0007)) -+#define MCF_EDMA_TCD6_ATTR_DMOD(x) (((x)&0x001F)<<3) -+#define MCF_EDMA_TCD6_ATTR_SSIZE(x) (((x)&0x0007)<<8) -+#define MCF_EDMA_TCD6_ATTR_SMOD(x) (((x)&0x001F)<<11) -+ -+/* Bit definitions and macros for TCD6_SOFF */ -+#define MCF_EDMA_TCD6_SOFF_SOFF(x) (x) -+ -+/* Bit definitions and macros for TCD6_NBYTES */ -+#define MCF_EDMA_TCD6_NBYTES_NBYTES(x) (x) -+ -+/* Bit definitions and macros for TCD6_SLAST */ -+#define MCF_EDMA_TCD6_SLAST_SLAST(x) (x) -+ -+/* Bit definitions and macros for TCD6_DADDR */ -+#define MCF_EDMA_TCD6_DADDR_DADDR(x) (x) -+ -+/* Bit definitions and macros for TCD6_CITER */ -+#define MCF_EDMA_TCD6_CITER_CITER(x) (((x)&0x7FFF)) -+#define MCF_EDMA_TCD6_CITER_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD6_CITER_ELINK */ -+#define MCF_EDMA_TCD6_CITER_ELINK_CITER(x) (((x)&0x01FF)) -+#define MCF_EDMA_TCD6_CITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) -+#define MCF_EDMA_TCD6_CITER_ELINK_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD6_DOFF */ -+#define MCF_EDMA_TCD6_DOFF_DOFF(x) (x) -+ -+/* Bit definitions and macros for TCD6_DLAST_SGA */ -+#define MCF_EDMA_TCD6_DLAST_SGA_DLAST_SGA(x) (x) -+ -+/* Bit definitions and macros for TCD6_BITER_ELINK */ -+#define MCF_EDMA_TCD6_BITER_ELINK_BITER(x) (((x)&0x01FF)) -+#define MCF_EDMA_TCD6_BITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) -+#define MCF_EDMA_TCD6_BITER_ELINK_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD6_BITER */ -+#define MCF_EDMA_TCD6_BITER_BITER(x) (((x)&0x7FFF)) -+#define MCF_EDMA_TCD6_BITER_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD6_CSR */ -+#define MCF_EDMA_TCD6_CSR_START (0x0001) -+#define MCF_EDMA_TCD6_CSR_INT_MAJOR (0x0002) -+#define MCF_EDMA_TCD6_CSR_INT_HALF (0x0004) -+#define MCF_EDMA_TCD6_CSR_D_REQ (0x0008) -+#define MCF_EDMA_TCD6_CSR_E_SG (0x0010) -+#define MCF_EDMA_TCD6_CSR_E_LINK (0x0020) -+#define MCF_EDMA_TCD6_CSR_ACTIVE (0x0040) -+#define MCF_EDMA_TCD6_CSR_DONE (0x0080) -+#define MCF_EDMA_TCD6_CSR_LINKCH(x) (((x)&0x003F)<<8) -+#define MCF_EDMA_TCD6_CSR_BWC(x) (((x)&0x0003)<<14) -+ -+/* Bit definitions and macros for TCD7_SADDR */ -+#define MCF_EDMA_TCD7_SADDR_SADDR(x) (x) -+ -+/* Bit definitions and macros for TCD7_ATTR */ -+#define MCF_EDMA_TCD7_ATTR_DSIZE(x) (((x)&0x0007)) -+#define MCF_EDMA_TCD7_ATTR_DMOD(x) (((x)&0x001F)<<3) -+#define MCF_EDMA_TCD7_ATTR_SSIZE(x) (((x)&0x0007)<<8) -+#define MCF_EDMA_TCD7_ATTR_SMOD(x) (((x)&0x001F)<<11) -+ -+/* Bit definitions and macros for TCD7_SOFF */ -+#define MCF_EDMA_TCD7_SOFF_SOFF(x) (x) -+ -+/* Bit definitions and macros for TCD7_NBYTES */ -+#define MCF_EDMA_TCD7_NBYTES_NBYTES(x) (x) -+ -+/* Bit definitions and macros for TCD7_SLAST */ -+#define MCF_EDMA_TCD7_SLAST_SLAST(x) (x) -+ -+/* Bit definitions and macros for TCD7_DADDR */ -+#define MCF_EDMA_TCD7_DADDR_DADDR(x) (x) -+ -+/* Bit definitions and macros for TCD7_CITER */ -+#define MCF_EDMA_TCD7_CITER_CITER(x) (((x)&0x7FFF)) -+#define MCF_EDMA_TCD7_CITER_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD7_CITER_ELINK */ -+#define MCF_EDMA_TCD7_CITER_ELINK_CITER(x) (((x)&0x01FF)) -+#define MCF_EDMA_TCD7_CITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) -+#define MCF_EDMA_TCD7_CITER_ELINK_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD7_DOFF */ -+#define MCF_EDMA_TCD7_DOFF_DOFF(x) (x) -+ -+/* Bit definitions and macros for TCD7_DLAST_SGA */ -+#define MCF_EDMA_TCD7_DLAST_SGA_DLAST_SGA(x) (x) -+ -+/* Bit definitions and macros for TCD7_BITER_ELINK */ -+#define MCF_EDMA_TCD7_BITER_ELINK_BITER(x) (((x)&0x01FF)) -+#define MCF_EDMA_TCD7_BITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) -+#define MCF_EDMA_TCD7_BITER_ELINK_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD7_BITER */ -+#define MCF_EDMA_TCD7_BITER_BITER(x) (((x)&0x7FFF)) -+#define MCF_EDMA_TCD7_BITER_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD7_CSR */ -+#define MCF_EDMA_TCD7_CSR_START (0x0001) -+#define MCF_EDMA_TCD7_CSR_INT_MAJOR (0x0002) -+#define MCF_EDMA_TCD7_CSR_INT_HALF (0x0004) -+#define MCF_EDMA_TCD7_CSR_D_REQ (0x0008) -+#define MCF_EDMA_TCD7_CSR_E_SG (0x0010) -+#define MCF_EDMA_TCD7_CSR_E_LINK (0x0020) -+#define MCF_EDMA_TCD7_CSR_ACTIVE (0x0040) -+#define MCF_EDMA_TCD7_CSR_DONE (0x0080) -+#define MCF_EDMA_TCD7_CSR_LINKCH(x) (((x)&0x003F)<<8) -+#define MCF_EDMA_TCD7_CSR_BWC(x) (((x)&0x0003)<<14) -+ -+/* Bit definitions and macros for TCD8_SADDR */ -+#define MCF_EDMA_TCD8_SADDR_SADDR(x) (x) -+ -+/* Bit definitions and macros for TCD8_ATTR */ -+#define MCF_EDMA_TCD8_ATTR_DSIZE(x) (((x)&0x0007)) -+#define MCF_EDMA_TCD8_ATTR_DMOD(x) (((x)&0x001F)<<3) -+#define MCF_EDMA_TCD8_ATTR_SSIZE(x) (((x)&0x0007)<<8) -+#define MCF_EDMA_TCD8_ATTR_SMOD(x) (((x)&0x001F)<<11) -+ -+/* Bit definitions and macros for TCD8_SOFF */ -+#define MCF_EDMA_TCD8_SOFF_SOFF(x) (x) -+ -+/* Bit definitions and macros for TCD8_NBYTES */ -+#define MCF_EDMA_TCD8_NBYTES_NBYTES(x) (x) -+ -+/* Bit definitions and macros for TCD8_SLAST */ -+#define MCF_EDMA_TCD8_SLAST_SLAST(x) (x) -+ -+/* Bit definitions and macros for TCD8_DADDR */ -+#define MCF_EDMA_TCD8_DADDR_DADDR(x) (x) -+ -+/* Bit definitions and macros for TCD8_CITER */ -+#define MCF_EDMA_TCD8_CITER_CITER(x) (((x)&0x7FFF)) -+#define MCF_EDMA_TCD8_CITER_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD8_CITER_ELINK */ -+#define MCF_EDMA_TCD8_CITER_ELINK_CITER(x) (((x)&0x01FF)) -+#define MCF_EDMA_TCD8_CITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) -+#define MCF_EDMA_TCD8_CITER_ELINK_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD8_DOFF */ -+#define MCF_EDMA_TCD8_DOFF_DOFF(x) (x) -+ -+/* Bit definitions and macros for TCD8_DLAST_SGA */ -+#define MCF_EDMA_TCD8_DLAST_SGA_DLAST_SGA(x) (x) -+ -+/* Bit definitions and macros for TCD8_BITER_ELINK */ -+#define MCF_EDMA_TCD8_BITER_ELINK_BITER(x) (((x)&0x01FF)) -+#define MCF_EDMA_TCD8_BITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) -+#define MCF_EDMA_TCD8_BITER_ELINK_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD8_BITER */ -+#define MCF_EDMA_TCD8_BITER_BITER(x) (((x)&0x7FFF)) -+#define MCF_EDMA_TCD8_BITER_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD8_CSR */ -+#define MCF_EDMA_TCD8_CSR_START (0x0001) -+#define MCF_EDMA_TCD8_CSR_INT_MAJOR (0x0002) -+#define MCF_EDMA_TCD8_CSR_INT_HALF (0x0004) -+#define MCF_EDMA_TCD8_CSR_D_REQ (0x0008) -+#define MCF_EDMA_TCD8_CSR_E_SG (0x0010) -+#define MCF_EDMA_TCD8_CSR_E_LINK (0x0020) -+#define MCF_EDMA_TCD8_CSR_ACTIVE (0x0040) -+#define MCF_EDMA_TCD8_CSR_DONE (0x0080) -+#define MCF_EDMA_TCD8_CSR_LINKCH(x) (((x)&0x003F)<<8) -+#define MCF_EDMA_TCD8_CSR_BWC(x) (((x)&0x0003)<<14) -+ -+/* Bit definitions and macros for TCD9_SADDR */ -+#define MCF_EDMA_TCD9_SADDR_SADDR(x) (x) -+ -+/* Bit definitions and macros for TCD9_ATTR */ -+#define MCF_EDMA_TCD9_ATTR_DSIZE(x) (((x)&0x0007)) -+#define MCF_EDMA_TCD9_ATTR_DMOD(x) (((x)&0x001F)<<3) -+#define MCF_EDMA_TCD9_ATTR_SSIZE(x) (((x)&0x0007)<<8) -+#define MCF_EDMA_TCD9_ATTR_SMOD(x) (((x)&0x001F)<<11) -+ -+/* Bit definitions and macros for TCD9_SOFF */ -+#define MCF_EDMA_TCD9_SOFF_SOFF(x) (x) -+ -+/* Bit definitions and macros for TCD9_NBYTES */ -+#define MCF_EDMA_TCD9_NBYTES_NBYTES(x) (x) -+ -+/* Bit definitions and macros for TCD9_SLAST */ -+#define MCF_EDMA_TCD9_SLAST_SLAST(x) (x) -+ -+/* Bit definitions and macros for TCD9_DADDR */ -+#define MCF_EDMA_TCD9_DADDR_DADDR(x) (x) -+ -+/* Bit definitions and macros for TCD9_CITER_ELINK */ -+#define MCF_EDMA_TCD9_CITER_ELINK_CITER(x) (((x)&0x01FF)) -+#define MCF_EDMA_TCD9_CITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) -+#define MCF_EDMA_TCD9_CITER_ELINK_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD9_CITER */ -+#define MCF_EDMA_TCD9_CITER_CITER(x) (((x)&0x7FFF)) -+#define MCF_EDMA_TCD9_CITER_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD9_DOFF */ -+#define MCF_EDMA_TCD9_DOFF_DOFF(x) (x) -+ -+/* Bit definitions and macros for TCD9_DLAST_SGA */ -+#define MCF_EDMA_TCD9_DLAST_SGA_DLAST_SGA(x) (x) -+ -+/* Bit definitions and macros for TCD9_BITER_ELINK */ -+#define MCF_EDMA_TCD9_BITER_ELINK_BITER(x) (((x)&0x01FF)) -+#define MCF_EDMA_TCD9_BITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) -+#define MCF_EDMA_TCD9_BITER_ELINK_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD9_BITER */ -+#define MCF_EDMA_TCD9_BITER_BITER(x) (((x)&0x7FFF)) -+#define MCF_EDMA_TCD9_BITER_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD9_CSR */ -+#define MCF_EDMA_TCD9_CSR_START (0x0001) -+#define MCF_EDMA_TCD9_CSR_INT_MAJOR (0x0002) -+#define MCF_EDMA_TCD9_CSR_INT_HALF (0x0004) -+#define MCF_EDMA_TCD9_CSR_D_REQ (0x0008) -+#define MCF_EDMA_TCD9_CSR_E_SG (0x0010) -+#define MCF_EDMA_TCD9_CSR_E_LINK (0x0020) -+#define MCF_EDMA_TCD9_CSR_ACTIVE (0x0040) -+#define MCF_EDMA_TCD9_CSR_DONE (0x0080) -+#define MCF_EDMA_TCD9_CSR_LINKCH(x) (((x)&0x003F)<<8) -+#define MCF_EDMA_TCD9_CSR_BWC(x) (((x)&0x0003)<<14) -+ -+/* Bit definitions and macros for TCD10_SADDR */ -+#define MCF_EDMA_TCD10_SADDR_SADDR(x) (x) -+ -+/* Bit definitions and macros for TCD10_ATTR */ -+#define MCF_EDMA_TCD10_ATTR_DSIZE(x) (((x)&0x0007)) -+#define MCF_EDMA_TCD10_ATTR_DMOD(x) (((x)&0x001F)<<3) -+#define MCF_EDMA_TCD10_ATTR_SSIZE(x) (((x)&0x0007)<<8) -+#define MCF_EDMA_TCD10_ATTR_SMOD(x) (((x)&0x001F)<<11) -+ -+/* Bit definitions and macros for TCD10_SOFF */ -+#define MCF_EDMA_TCD10_SOFF_SOFF(x) (x) -+ -+/* Bit definitions and macros for TCD10_NBYTES */ -+#define MCF_EDMA_TCD10_NBYTES_NBYTES(x) (x) -+ -+/* Bit definitions and macros for TCD10_SLAST */ -+#define MCF_EDMA_TCD10_SLAST_SLAST(x) (x) -+ -+/* Bit definitions and macros for TCD10_DADDR */ -+#define MCF_EDMA_TCD10_DADDR_DADDR(x) (x) -+ -+/* Bit definitions and macros for TCD10_CITER_ELINK */ -+#define MCF_EDMA_TCD10_CITER_ELINK_CITER(x) (((x)&0x01FF)) -+#define MCF_EDMA_TCD10_CITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) -+#define MCF_EDMA_TCD10_CITER_ELINK_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD10_CITER */ -+#define MCF_EDMA_TCD10_CITER_CITER(x) (((x)&0x7FFF)) -+#define MCF_EDMA_TCD10_CITER_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD10_DOFF */ -+#define MCF_EDMA_TCD10_DOFF_DOFF(x) (x) -+ -+/* Bit definitions and macros for TCD10_DLAST_SGA */ -+#define MCF_EDMA_TCD10_DLAST_SGA_DLAST_SGA(x) (x) -+ -+/* Bit definitions and macros for TCD10_BITER */ -+#define MCF_EDMA_TCD10_BITER_BITER(x) (((x)&0x7FFF)) -+#define MCF_EDMA_TCD10_BITER_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD10_BITER_ELINK */ -+#define MCF_EDMA_TCD10_BITER_ELINK_BITER(x) (((x)&0x01FF)) -+#define MCF_EDMA_TCD10_BITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) -+#define MCF_EDMA_TCD10_BITER_ELINK_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD10_CSR */ -+#define MCF_EDMA_TCD10_CSR_START (0x0001) -+#define MCF_EDMA_TCD10_CSR_INT_MAJOR (0x0002) -+#define MCF_EDMA_TCD10_CSR_INT_HALF (0x0004) -+#define MCF_EDMA_TCD10_CSR_D_REQ (0x0008) -+#define MCF_EDMA_TCD10_CSR_E_SG (0x0010) -+#define MCF_EDMA_TCD10_CSR_E_LINK (0x0020) -+#define MCF_EDMA_TCD10_CSR_ACTIVE (0x0040) -+#define MCF_EDMA_TCD10_CSR_DONE (0x0080) -+#define MCF_EDMA_TCD10_CSR_LINKCH(x) (((x)&0x003F)<<8) -+#define MCF_EDMA_TCD10_CSR_BWC(x) (((x)&0x0003)<<14) -+ -+/* Bit definitions and macros for TCD11_SADDR */ -+#define MCF_EDMA_TCD11_SADDR_SADDR(x) (x) -+ -+/* Bit definitions and macros for TCD11_ATTR */ -+#define MCF_EDMA_TCD11_ATTR_DSIZE(x) (((x)&0x0007)) -+#define MCF_EDMA_TCD11_ATTR_DMOD(x) (((x)&0x001F)<<3) -+#define MCF_EDMA_TCD11_ATTR_SSIZE(x) (((x)&0x0007)<<8) -+#define MCF_EDMA_TCD11_ATTR_SMOD(x) (((x)&0x001F)<<11) -+ -+/* Bit definitions and macros for TCD11_SOFF */ -+#define MCF_EDMA_TCD11_SOFF_SOFF(x) (x) -+ -+/* Bit definitions and macros for TCD11_NBYTES */ -+#define MCF_EDMA_TCD11_NBYTES_NBYTES(x) (x) -+ -+/* Bit definitions and macros for TCD11_SLAST */ -+#define MCF_EDMA_TCD11_SLAST_SLAST(x) (x) -+ -+/* Bit definitions and macros for TCD11_DADDR */ -+#define MCF_EDMA_TCD11_DADDR_DADDR(x) (x) -+ -+/* Bit definitions and macros for TCD11_CITER */ -+#define MCF_EDMA_TCD11_CITER_CITER(x) (((x)&0x7FFF)) -+#define MCF_EDMA_TCD11_CITER_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD11_CITER_ELINK */ -+#define MCF_EDMA_TCD11_CITER_ELINK_CITER(x) (((x)&0x01FF)) -+#define MCF_EDMA_TCD11_CITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) -+#define MCF_EDMA_TCD11_CITER_ELINK_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD11_DOFF */ -+#define MCF_EDMA_TCD11_DOFF_DOFF(x) (x) -+ -+/* Bit definitions and macros for TCD11_DLAST_SGA */ -+#define MCF_EDMA_TCD11_DLAST_SGA_DLAST_SGA(x) (x) -+ -+/* Bit definitions and macros for TCD11_BITER */ -+#define MCF_EDMA_TCD11_BITER_BITER(x) (((x)&0x7FFF)) -+#define MCF_EDMA_TCD11_BITER_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD11_BITER_ELINK */ -+#define MCF_EDMA_TCD11_BITER_ELINK_BITER(x) (((x)&0x01FF)) -+#define MCF_EDMA_TCD11_BITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) -+#define MCF_EDMA_TCD11_BITER_ELINK_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD11_CSR */ -+#define MCF_EDMA_TCD11_CSR_START (0x0001) -+#define MCF_EDMA_TCD11_CSR_INT_MAJOR (0x0002) -+#define MCF_EDMA_TCD11_CSR_INT_HALF (0x0004) -+#define MCF_EDMA_TCD11_CSR_D_REQ (0x0008) -+#define MCF_EDMA_TCD11_CSR_E_SG (0x0010) -+#define MCF_EDMA_TCD11_CSR_E_LINK (0x0020) -+#define MCF_EDMA_TCD11_CSR_ACTIVE (0x0040) -+#define MCF_EDMA_TCD11_CSR_DONE (0x0080) -+#define MCF_EDMA_TCD11_CSR_LINKCH(x) (((x)&0x003F)<<8) -+#define MCF_EDMA_TCD11_CSR_BWC(x) (((x)&0x0003)<<14) -+ -+/* Bit definitions and macros for TCD12_SADDR */ -+#define MCF_EDMA_TCD12_SADDR_SADDR(x) (x) -+ -+/* Bit definitions and macros for TCD12_ATTR */ -+#define MCF_EDMA_TCD12_ATTR_DSIZE(x) (((x)&0x0007)) -+#define MCF_EDMA_TCD12_ATTR_DMOD(x) (((x)&0x001F)<<3) -+#define MCF_EDMA_TCD12_ATTR_SSIZE(x) (((x)&0x0007)<<8) -+#define MCF_EDMA_TCD12_ATTR_SMOD(x) (((x)&0x001F)<<11) -+ -+/* Bit definitions and macros for TCD12_SOFF */ -+#define MCF_EDMA_TCD12_SOFF_SOFF(x) (x) -+ -+/* Bit definitions and macros for TCD12_NBYTES */ -+#define MCF_EDMA_TCD12_NBYTES_NBYTES(x) (x) -+ -+/* Bit definitions and macros for TCD12_SLAST */ -+#define MCF_EDMA_TCD12_SLAST_SLAST(x) (x) -+ -+/* Bit definitions and macros for TCD12_DADDR */ -+#define MCF_EDMA_TCD12_DADDR_DADDR(x) (x) -+ -+/* Bit definitions and macros for TCD12_CITER */ -+#define MCF_EDMA_TCD12_CITER_CITER(x) (((x)&0x7FFF)) -+#define MCF_EDMA_TCD12_CITER_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD12_CITER_ELINK */ -+#define MCF_EDMA_TCD12_CITER_ELINK_CITER(x) (((x)&0x01FF)) -+#define MCF_EDMA_TCD12_CITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) -+#define MCF_EDMA_TCD12_CITER_ELINK_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD12_DOFF */ -+#define MCF_EDMA_TCD12_DOFF_DOFF(x) (x) -+ -+/* Bit definitions and macros for TCD12_DLAST_SGA */ -+#define MCF_EDMA_TCD12_DLAST_SGA_DLAST_SGA(x) (x) -+ -+/* Bit definitions and macros for TCD12_BITER */ -+#define MCF_EDMA_TCD12_BITER_BITER(x) (((x)&0x7FFF)) -+#define MCF_EDMA_TCD12_BITER_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD12_BITER_ELINK */ -+#define MCF_EDMA_TCD12_BITER_ELINK_BITER(x) (((x)&0x01FF)) -+#define MCF_EDMA_TCD12_BITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) -+#define MCF_EDMA_TCD12_BITER_ELINK_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD12_CSR */ -+#define MCF_EDMA_TCD12_CSR_START (0x0001) -+#define MCF_EDMA_TCD12_CSR_INT_MAJOR (0x0002) -+#define MCF_EDMA_TCD12_CSR_INT_HALF (0x0004) -+#define MCF_EDMA_TCD12_CSR_D_REQ (0x0008) -+#define MCF_EDMA_TCD12_CSR_E_SG (0x0010) -+#define MCF_EDMA_TCD12_CSR_E_LINK (0x0020) -+#define MCF_EDMA_TCD12_CSR_ACTIVE (0x0040) -+#define MCF_EDMA_TCD12_CSR_DONE (0x0080) -+#define MCF_EDMA_TCD12_CSR_LINKCH(x) (((x)&0x003F)<<8) -+#define MCF_EDMA_TCD12_CSR_BWC(x) (((x)&0x0003)<<14) -+ -+/* Bit definitions and macros for TCD13_SADDR */ -+#define MCF_EDMA_TCD13_SADDR_SADDR(x) (x) -+ -+/* Bit definitions and macros for TCD13_ATTR */ -+#define MCF_EDMA_TCD13_ATTR_DSIZE(x) (((x)&0x0007)) -+#define MCF_EDMA_TCD13_ATTR_DMOD(x) (((x)&0x001F)<<3) -+#define MCF_EDMA_TCD13_ATTR_SSIZE(x) (((x)&0x0007)<<8) -+#define MCF_EDMA_TCD13_ATTR_SMOD(x) (((x)&0x001F)<<11) -+ -+/* Bit definitions and macros for TCD13_SOFF */ -+#define MCF_EDMA_TCD13_SOFF_SOFF(x) (x) -+ -+/* Bit definitions and macros for TCD13_NBYTES */ -+#define MCF_EDMA_TCD13_NBYTES_NBYTES(x) (x) -+ -+/* Bit definitions and macros for TCD13_SLAST */ -+#define MCF_EDMA_TCD13_SLAST_SLAST(x) (x) -+ -+/* Bit definitions and macros for TCD13_DADDR */ -+#define MCF_EDMA_TCD13_DADDR_DADDR(x) (x) -+ -+/* Bit definitions and macros for TCD13_CITER_ELINK */ -+#define MCF_EDMA_TCD13_CITER_ELINK_CITER(x) (((x)&0x01FF)) -+#define MCF_EDMA_TCD13_CITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) -+#define MCF_EDMA_TCD13_CITER_ELINK_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD13_CITER */ -+#define MCF_EDMA_TCD13_CITER_CITER(x) (((x)&0x7FFF)) -+#define MCF_EDMA_TCD13_CITER_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD13_DOFF */ -+#define MCF_EDMA_TCD13_DOFF_DOFF(x) (x) -+ -+/* Bit definitions and macros for TCD13_DLAST_SGA */ -+#define MCF_EDMA_TCD13_DLAST_SGA_DLAST_SGA(x) (x) -+ -+/* Bit definitions and macros for TCD13_BITER_ELINK */ -+#define MCF_EDMA_TCD13_BITER_ELINK_BITER(x) (((x)&0x01FF)) -+#define MCF_EDMA_TCD13_BITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) -+#define MCF_EDMA_TCD13_BITER_ELINK_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD13_BITER */ -+#define MCF_EDMA_TCD13_BITER_BITER(x) (((x)&0x7FFF)) -+#define MCF_EDMA_TCD13_BITER_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD13_CSR */ -+#define MCF_EDMA_TCD13_CSR_START (0x0001) -+#define MCF_EDMA_TCD13_CSR_INT_MAJOR (0x0002) -+#define MCF_EDMA_TCD13_CSR_INT_HALF (0x0004) -+#define MCF_EDMA_TCD13_CSR_D_REQ (0x0008) -+#define MCF_EDMA_TCD13_CSR_E_SG (0x0010) -+#define MCF_EDMA_TCD13_CSR_E_LINK (0x0020) -+#define MCF_EDMA_TCD13_CSR_ACTIVE (0x0040) -+#define MCF_EDMA_TCD13_CSR_DONE (0x0080) -+#define MCF_EDMA_TCD13_CSR_LINKCH(x) (((x)&0x003F)<<8) -+#define MCF_EDMA_TCD13_CSR_BWC(x) (((x)&0x0003)<<14) -+ -+/* Bit definitions and macros for TCD14_SADDR */ -+#define MCF_EDMA_TCD14_SADDR_SADDR(x) (x) -+ -+/* Bit definitions and macros for TCD14_ATTR */ -+#define MCF_EDMA_TCD14_ATTR_DSIZE(x) (((x)&0x0007)) -+#define MCF_EDMA_TCD14_ATTR_DMOD(x) (((x)&0x001F)<<3) -+#define MCF_EDMA_TCD14_ATTR_SSIZE(x) (((x)&0x0007)<<8) -+#define MCF_EDMA_TCD14_ATTR_SMOD(x) (((x)&0x001F)<<11) -+ -+/* Bit definitions and macros for TCD14_SOFF */ -+#define MCF_EDMA_TCD14_SOFF_SOFF(x) (x) -+ -+/* Bit definitions and macros for TCD14_NBYTES */ -+#define MCF_EDMA_TCD14_NBYTES_NBYTES(x) (x) -+ -+/* Bit definitions and macros for TCD14_SLAST */ -+#define MCF_EDMA_TCD14_SLAST_SLAST(x) (x) -+ -+/* Bit definitions and macros for TCD14_DADDR */ -+#define MCF_EDMA_TCD14_DADDR_DADDR(x) (x) -+ -+/* Bit definitions and macros for TCD14_CITER */ -+#define MCF_EDMA_TCD14_CITER_CITER(x) (((x)&0x7FFF)) -+#define MCF_EDMA_TCD14_CITER_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD14_CITER_ELINK */ -+#define MCF_EDMA_TCD14_CITER_ELINK_CITER(x) (((x)&0x01FF)) -+#define MCF_EDMA_TCD14_CITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) -+#define MCF_EDMA_TCD14_CITER_ELINK_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD14_DOFF */ -+#define MCF_EDMA_TCD14_DOFF_DOFF(x) (x) -+ -+/* Bit definitions and macros for TCD14_DLAST_SGA */ -+#define MCF_EDMA_TCD14_DLAST_SGA_DLAST_SGA(x) (x) -+ -+/* Bit definitions and macros for TCD14_BITER_ELINK */ -+#define MCF_EDMA_TCD14_BITER_ELINK_BITER(x) (((x)&0x01FF)) -+#define MCF_EDMA_TCD14_BITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) -+#define MCF_EDMA_TCD14_BITER_ELINK_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD14_BITER */ -+#define MCF_EDMA_TCD14_BITER_BITER(x) (((x)&0x7FFF)) -+#define MCF_EDMA_TCD14_BITER_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD14_CSR */ -+#define MCF_EDMA_TCD14_CSR_START (0x0001) -+#define MCF_EDMA_TCD14_CSR_INT_MAJOR (0x0002) -+#define MCF_EDMA_TCD14_CSR_INT_HALF (0x0004) -+#define MCF_EDMA_TCD14_CSR_D_REQ (0x0008) -+#define MCF_EDMA_TCD14_CSR_E_SG (0x0010) -+#define MCF_EDMA_TCD14_CSR_E_LINK (0x0020) -+#define MCF_EDMA_TCD14_CSR_ACTIVE (0x0040) -+#define MCF_EDMA_TCD14_CSR_DONE (0x0080) -+#define MCF_EDMA_TCD14_CSR_LINKCH(x) (((x)&0x003F)<<8) -+#define MCF_EDMA_TCD14_CSR_BWC(x) (((x)&0x0003)<<14) -+ -+/* Bit definitions and macros for TCD15_SADDR */ -+#define MCF_EDMA_TCD15_SADDR_SADDR(x) (x) -+ -+/* Bit definitions and macros for TCD15_ATTR */ -+#define MCF_EDMA_TCD15_ATTR_DSIZE(x) (((x)&0x0007)) -+#define MCF_EDMA_TCD15_ATTR_DMOD(x) (((x)&0x001F)<<3) -+#define MCF_EDMA_TCD15_ATTR_SSIZE(x) (((x)&0x0007)<<8) -+#define MCF_EDMA_TCD15_ATTR_SMOD(x) (((x)&0x001F)<<11) -+ -+/* Bit definitions and macros for TCD15_SOFF */ -+#define MCF_EDMA_TCD15_SOFF_SOFF(x) (x) -+ -+/* Bit definitions and macros for TCD15_NBYTES */ -+#define MCF_EDMA_TCD15_NBYTES_NBYTES(x) (x) -+ -+/* Bit definitions and macros for TCD15_SLAST */ -+#define MCF_EDMA_TCD15_SLAST_SLAST(x) (x) -+ -+/* Bit definitions and macros for TCD15_DADDR */ -+#define MCF_EDMA_TCD15_DADDR_DADDR(x) (x) -+ -+/* Bit definitions and macros for TCD15_CITER_ELINK */ -+#define MCF_EDMA_TCD15_CITER_ELINK_CITER(x) (((x)&0x01FF)) -+#define MCF_EDMA_TCD15_CITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) -+#define MCF_EDMA_TCD15_CITER_ELINK_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD15_CITER */ -+#define MCF_EDMA_TCD15_CITER_CITER(x) (((x)&0x7FFF)) -+#define MCF_EDMA_TCD15_CITER_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD15_DOFF */ -+#define MCF_EDMA_TCD15_DOFF_DOFF(x) (x) -+ -+/* Bit definitions and macros for TCD15_DLAST_SGA */ -+#define MCF_EDMA_TCD15_DLAST_SGA_DLAST_SGA(x) (x) -+ -+/* Bit definitions and macros for TCD15_BITER */ -+#define MCF_EDMA_TCD15_BITER_BITER(x) (((x)&0x7FFF)) -+#define MCF_EDMA_TCD15_BITER_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD15_BITER_ELINK */ -+#define MCF_EDMA_TCD15_BITER_ELINK_BITER(x) (((x)&0x01FF)) -+#define MCF_EDMA_TCD15_BITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) -+#define MCF_EDMA_TCD15_BITER_ELINK_E_LINK (0x8000) -+ -+/* Bit definitions and macros for TCD15_CSR */ -+#define MCF_EDMA_TCD15_CSR_START (0x0001) -+#define MCF_EDMA_TCD15_CSR_INT_MAJOR (0x0002) -+#define MCF_EDMA_TCD15_CSR_INT_HALF (0x0004) -+#define MCF_EDMA_TCD15_CSR_D_REQ (0x0008) -+#define MCF_EDMA_TCD15_CSR_E_SG (0x0010) -+#define MCF_EDMA_TCD15_CSR_E_LINK (0x0020) -+#define MCF_EDMA_TCD15_CSR_ACTIVE (0x0040) -+#define MCF_EDMA_TCD15_CSR_DONE (0x0080) -+#define MCF_EDMA_TCD15_CSR_LINKCH(x) (((x)&0x003F)<<8) -+#define MCF_EDMA_TCD15_CSR_BWC(x) (((x)&0x0003)<<14) -+ -+#endif /* __MCF5445X_EDMA_H__ */ ---- /dev/null -+++ b/include/asm-m68k/mcf5445x_eport.h -@@ -0,0 +1,117 @@ -+/* -+ * Kurt Mahan kmahan@freescale.com -+ * -+ * Copyright Freescale Semiconductor, Inc. 2007 -+ * -+ * This program is free software; you can redistribute it and/or modify it -+ * under the terms of the GNU General Public License as published by the -+ * Free Software Foundation; either version 2 of the License, or (at your -+ * option) any later version. -+ */ -+ -+#ifndef __MCF5445X_EPORT_H__ -+#define __MCF5445X_EPORT_H__ -+ -+/********************************************************************* -+* -+* Edge Port Module (EPORT) -+* -+*********************************************************************/ -+ -+/* Register read/write macros */ -+#define MCF_EPORT_EPPAR MCF_REG16(0xFC094000) -+#define MCF_EPORT_EPDDR MCF_REG08(0xFC094002) -+#define MCF_EPORT_EPIER MCF_REG08(0xFC094003) -+#define MCF_EPORT_EPDR MCF_REG08(0xFC094004) -+#define MCF_EPORT_EPPDR MCF_REG08(0xFC094005) -+#define MCF_EPORT_EPFR MCF_REG08(0xFC094006) -+ -+/* Bit definitions and macros for EPPAR */ -+#define MCF_EPORT_EPPAR_EPPA1(x) (((x)&0x0003)<<2) -+#define MCF_EPORT_EPPAR_EPPA2(x) (((x)&0x0003)<<4) -+#define MCF_EPORT_EPPAR_EPPA3(x) (((x)&0x0003)<<6) -+#define MCF_EPORT_EPPAR_EPPA4(x) (((x)&0x0003)<<8) -+#define MCF_EPORT_EPPAR_EPPA5(x) (((x)&0x0003)<<10) -+#define MCF_EPORT_EPPAR_EPPA6(x) (((x)&0x0003)<<12) -+#define MCF_EPORT_EPPAR_EPPA7(x) (((x)&0x0003)<<14) -+#define MCF_EPORT_EPPAR_LEVEL (0) -+#define MCF_EPORT_EPPAR_RISING (1) -+#define MCF_EPORT_EPPAR_FALLING (2) -+#define MCF_EPORT_EPPAR_BOTH (3) -+#define MCF_EPORT_EPPAR_EPPA7_LEVEL (0x0000) -+#define MCF_EPORT_EPPAR_EPPA7_RISING (0x4000) -+#define MCF_EPORT_EPPAR_EPPA7_FALLING (0x8000) -+#define MCF_EPORT_EPPAR_EPPA7_BOTH (0xC000) -+#define MCF_EPORT_EPPAR_EPPA6_LEVEL (0x0000) -+#define MCF_EPORT_EPPAR_EPPA6_RISING (0x1000) -+#define MCF_EPORT_EPPAR_EPPA6_FALLING (0x2000) -+#define MCF_EPORT_EPPAR_EPPA6_BOTH (0x3000) -+#define MCF_EPORT_EPPAR_EPPA5_LEVEL (0x0000) -+#define MCF_EPORT_EPPAR_EPPA5_RISING (0x0400) -+#define MCF_EPORT_EPPAR_EPPA5_FALLING (0x0800) -+#define MCF_EPORT_EPPAR_EPPA5_BOTH (0x0C00) -+#define MCF_EPORT_EPPAR_EPPA4_LEVEL (0x0000) -+#define MCF_EPORT_EPPAR_EPPA4_RISING (0x0100) -+#define MCF_EPORT_EPPAR_EPPA4_FALLING (0x0200) -+#define MCF_EPORT_EPPAR_EPPA4_BOTH (0x0300) -+#define MCF_EPORT_EPPAR_EPPA3_LEVEL (0x0000) -+#define MCF_EPORT_EPPAR_EPPA3_RISING (0x0040) -+#define MCF_EPORT_EPPAR_EPPA3_FALLING (0x0080) -+#define MCF_EPORT_EPPAR_EPPA3_BOTH (0x00C0) -+#define MCF_EPORT_EPPAR_EPPA2_LEVEL (0x0000) -+#define MCF_EPORT_EPPAR_EPPA2_RISING (0x0010) -+#define MCF_EPORT_EPPAR_EPPA2_FALLING (0x0020) -+#define MCF_EPORT_EPPAR_EPPA2_BOTH (0x0030) -+#define MCF_EPORT_EPPAR_EPPA1_LEVEL (0x0000) -+#define MCF_EPORT_EPPAR_EPPA1_RISING (0x0004) -+#define MCF_EPORT_EPPAR_EPPA1_FALLING (0x0008) -+#define MCF_EPORT_EPPAR_EPPA1_BOTH (0x000C) -+ -+/* Bit definitions and macros for EPDDR */ -+#define MCF_EPORT_EPDDR_EPDD1 (0x02) -+#define MCF_EPORT_EPDDR_EPDD2 (0x04) -+#define MCF_EPORT_EPDDR_EPDD3 (0x08) -+#define MCF_EPORT_EPDDR_EPDD4 (0x10) -+#define MCF_EPORT_EPDDR_EPDD5 (0x20) -+#define MCF_EPORT_EPDDR_EPDD6 (0x40) -+#define MCF_EPORT_EPDDR_EPDD7 (0x80) -+ -+/* Bit definitions and macros for EPIER */ -+#define MCF_EPORT_EPIER_EPIE1 (0x02) -+#define MCF_EPORT_EPIER_EPIE2 (0x04) -+#define MCF_EPORT_EPIER_EPIE3 (0x08) -+#define MCF_EPORT_EPIER_EPIE4 (0x10) -+#define MCF_EPORT_EPIER_EPIE5 (0x20) -+#define MCF_EPORT_EPIER_EPIE6 (0x40) -+#define MCF_EPORT_EPIER_EPIE7 (0x80) -+ -+/* Bit definitions and macros for EPDR */ -+#define MCF_EPORT_EPDR_EPD1 (0x02) -+#define MCF_EPORT_EPDR_EPD2 (0x04) -+#define MCF_EPORT_EPDR_EPD3 (0x08) -+#define MCF_EPORT_EPDR_EPD4 (0x10) -+#define MCF_EPORT_EPDR_EPD5 (0x20) -+#define MCF_EPORT_EPDR_EPD6 (0x40) -+#define MCF_EPORT_EPDR_EPD7 (0x80) -+ -+/* Bit definitions and macros for EPPDR */ -+#define MCF_EPORT_EPPDR_EPPD1 (0x02) -+#define MCF_EPORT_EPPDR_EPPD2 (0x04) -+#define MCF_EPORT_EPPDR_EPPD3 (0x08) -+#define MCF_EPORT_EPPDR_EPPD4 (0x10) -+#define MCF_EPORT_EPPDR_EPPD5 (0x20) -+#define MCF_EPORT_EPPDR_EPPD6 (0x40) -+#define MCF_EPORT_EPPDR_EPPD7 (0x80) -+ -+/* Bit definitions and macros for EPFR */ -+#define MCF_EPORT_EPFR_EPF1 (0x02) -+#define MCF_EPORT_EPFR_EPF2 (0x04) -+#define MCF_EPORT_EPFR_EPF3 (0x08) -+#define MCF_EPORT_EPFR_EPF4 (0x10) -+#define MCF_EPORT_EPFR_EPF5 (0x20) -+#define MCF_EPORT_EPFR_EPF6 (0x40) -+#define MCF_EPORT_EPFR_EPF7 (0x80) -+ -+/********************************************************************/ -+ -+#endif /* __MCF5445X_EPORT_H__ */ ---- /dev/null -+++ b/include/asm-m68k/mcf5445x_fbcs.h -@@ -0,0 +1,182 @@ -+/* -+ * Matt Waddel Matt.Waddel@freescale.com -+ * -+ * Copyright Freescale Semiconductor, Inc. 2007 -+ * -+ * This program is free software; you can redistribute it and/or modify it -+ * under the terms of the GNU General Public License as published by the -+ * Free Software Foundation; either version 2 of the License, or (at your -+ * option) any later version. -+ */ -+ -+#ifndef __MCF5445X_FBCS_H__ -+#define __MCF5445X_FBCS_H__ -+ -+/********************************************************************* -+* -+* FlexBus Chip Selects (FBCS) -+* -+*********************************************************************/ -+ -+/* Register read/write macros */ -+#define MCF_FBCS_CSAR0 MCF_REG32(0xFC008000) /* Chip-select Addr Register */ -+#define MCF_FBCS_CSMR0 MCF_REG32(0xFC008004) /* Chip-select Mask Register */ -+#define MCF_FBCS_CSCR0 MCF_REG32(0xFC008008) /* Chip-select Cntl Register */ -+#define MCF_FBCS_CSAR1 MCF_REG32(0xFC00800C) /* Chip-select Addr Register */ -+#define MCF_FBCS_CSMR1 MCF_REG32(0xFC008010) /* Chip-select Mask Register */ -+#define MCF_FBCS_CSCR1 MCF_REG32(0xFC008014) /* Chip-select Cntl Register */ -+#define MCF_FBCS_CSAR2 MCF_REG32(0xFC008018) /* Chip-select Addr Register */ -+#define MCF_FBCS_CSMR2 MCF_REG32(0xFC00801C) /* Chip-select Mask Register */ -+#define MCF_FBCS_CSCR2 MCF_REG32(0xFC008020) /* Chip-select Cntl Register */ -+#define MCF_FBCS_CSAR3 MCF_REG32(0xFC008024) /* Chip-select Addr Register */ -+#define MCF_FBCS_CSMR3 MCF_REG32(0xFC008028) /* Chip-select Mask Register */ -+#define MCF_FBCS_CSCR3 MCF_REG32(0xFC00802C) /* Chip-select Cntl Register */ -+ -+/* Parameterized register read/write macros for multiple registers */ -+#define MCF_FBCS_CSAR(x) MCF_REG32(0xFC008000+((x)*0x00C)) /* Chip-select Addr Register */ -+#define MCF_FBCS_CSMR(x) MCF_REG32(0xFC008004+((x)*0x00C)) /* Chip-select Mask Register */ -+#define MCF_FBCS_CSCR(x) MCF_REG32(0xFC008008+((x)*0x00C)) /* Chip-select Cntl Register */ -+ -+/* Bit definitions and macros for CSAR group */ -+#define MCF_FBCS_CSAR_BA(x) ((x)&0xFFFF0000) -+ -+/* Bit definitions and macros for CSAR0 */ -+#define MCF_FBCS_CSAR0_BA(x) ((x)&0xFFFF0000) -+ -+/* Bit definitions and macros for CSMR group */ -+#define MCF_FBCS_CSMR_V (0x00000001) /* Valid bit */ -+#define MCF_FBCS_CSMR_WP (0x00000100) /* Write protect */ -+#define MCF_FBCS_CSMR_BAM(x) (((x)&0x0000FFFF)<<16) /* Base addr mask */ -+#define MCF_FBCS_CSMR_BAM_4G (0xFFFF0000) -+#define MCF_FBCS_CSMR_BAM_2G (0x7FFF0000) -+#define MCF_FBCS_CSMR_BAM_1G (0x3FFF0000) -+#define MCF_FBCS_CSMR_BAM_1024M (0x3FFF0000) -+#define MCF_FBCS_CSMR_BAM_512M (0x1FFF0000) -+#define MCF_FBCS_CSMR_BAM_256M (0x0FFF0000) -+#define MCF_FBCS_CSMR_BAM_128M (0x07FF0000) -+#define MCF_FBCS_CSMR_BAM_64M (0x03FF0000) -+#define MCF_FBCS_CSMR_BAM_32M (0x01FF0000) -+#define MCF_FBCS_CSMR_BAM_16M (0x00FF0000) -+#define MCF_FBCS_CSMR_BAM_8M (0x007F0000) -+#define MCF_FBCS_CSMR_BAM_4M (0x003F0000) -+#define MCF_FBCS_CSMR_BAM_2M (0x001F0000) -+#define MCF_FBCS_CSMR_BAM_1M (0x000F0000) -+#define MCF_FBCS_CSMR_BAM_1024K (0x000F0000) -+#define MCF_FBCS_CSMR_BAM_512K (0x00070000) -+#define MCF_FBCS_CSMR_BAM_256K (0x00030000) -+#define MCF_FBCS_CSMR_BAM_128K (0x00010000) -+#define MCF_FBCS_CSMR_BAM_64K (0x00000000) -+ -+/* Bit definitions and macros for CSMR0 */ -+#define MCF_FBCS_CSMR0_V (0x00000001) /* Valid bit */ -+#define MCF_FBCS_CSMR0_WP (0x00000100) /* Write protect */ -+#define MCF_FBCS_CSMR0_BAM(x) (((x)&0x0000FFFF)<<16) /* Base addr mask */ -+#define MCF_FBCS_CSMR0_BAM_4G (0xFFFF0000) -+#define MCF_FBCS_CSMR0_BAM_2G (0x7FFF0000) -+#define MCF_FBCS_CSMR0_BAM_1G (0x3FFF0000) -+#define MCF_FBCS_CSMR0_BAM_1024M (0x3FFF0000) -+#define MCF_FBCS_CSMR0_BAM_512M (0x1FFF0000) -+#define MCF_FBCS_CSMR0_BAM_256M (0x0FFF0000) -+#define MCF_FBCS_CSMR0_BAM_128M (0x07FF0000) -+#define MCF_FBCS_CSMR0_BAM_64M (0x03FF0000) -+#define MCF_FBCS_CSMR0_BAM_32M (0x01FF0000) -+#define MCF_FBCS_CSMR0_BAM_16M (0x00FF0000) -+#define MCF_FBCS_CSMR0_BAM_8M (0x007F0000) -+#define MCF_FBCS_CSMR0_BAM_4M (0x003F0000) -+#define MCF_FBCS_CSMR0_BAM_2M (0x001F0000) -+#define MCF_FBCS_CSMR0_BAM_1M (0x000F0000) -+#define MCF_FBCS_CSMR0_BAM_1024K (0x000F0000) -+#define MCF_FBCS_CSMR0_BAM_512K (0x00070000) -+#define MCF_FBCS_CSMR0_BAM_256K (0x00030000) -+#define MCF_FBCS_CSMR0_BAM_128K (0x00010000) -+#define MCF_FBCS_CSMR0_BAM_64K (0x00000000) -+ -+/* Bit definitions and macros for CSCR group */ -+#define MCF_FBCS_CSCR_BSTW (0x00000008) /* Burst-write enable */ -+#define MCF_FBCS_CSCR_BSTR (0x00000010) /* Burst-read enable */ -+#define MCF_FBCS_CSCR_BEM (0x00000020) /* Byte-enable mode */ -+#define MCF_FBCS_CSCR_PS(x) (((x)&0x00000003)<<6) /* Port size */ -+#define MCF_FBCS_CSCR_AA (0x00000100) /* Auto-acknowledge */ -+#define MCF_FBCS_CSCR_WS(x) (((x)&0x0000003F)<<10) /* Wait states */ -+#define MCF_FBCS_CSCR_WRAH(x) (((x)&0x00000003)<<16) /* Write address hold or deselect */ -+#define MCF_FBCS_CSCR_RDAH(x) (((x)&0x00000003)<<18) /* Read address hold or deselect */ -+#define MCF_FBCS_CSCR_ASET(x) (((x)&0x00000003)<<20) /* Address setup */ -+#define MCF_FBCS_CSCR_SWSEN (0x00800000) /* Secondary wait state enable */ -+#define MCF_FBCS_CSCR_SWS(x) (((x)&0x0000003F)<<26) /* Secondary wait states */ -+#define MCF_FBCS_CSCR_PS_8 (0x00000040) -+#define MCF_FBCS_CSCR_PS_16 (0x00000080) -+#define MCF_FBCS_CSCR_PS_32 (0x00000000) -+ -+/* Bit definitions and macros for CSCR0 */ -+#define MCF_FBCS_CSCR0_BSTW (0x00000008) /* Burst-write enable */ -+#define MCF_FBCS_CSCR0_BSTR (0x00000010) /* Burst-read enable */ -+#define MCF_FBCS_CSCR0_BEM (0x00000020) /* Byte-enable mode */ -+#define MCF_FBCS_CSCR0_PS(x) (((x)&0x00000003)<<6) /* Port size */ -+#define MCF_FBCS_CSCR0_AA (0x00000100) /* Auto-acknowledge */ -+#define MCF_FBCS_CSCR0_WS(x) (((x)&0x0000003F)<<10) /* Wait states */ -+#define MCF_FBCS_CSCR0_WRAH(x) (((x)&0x00000003)<<16) /* Write address hold or deselect */ -+#define MCF_FBCS_CSCR0_RDAH(x) (((x)&0x00000003)<<18) /* Read address hold or deselect */ -+#define MCF_FBCS_CSCR0_ASET(x) (((x)&0x00000003)<<20) /* Address setup */ -+#define MCF_FBCS_CSCR0_SWSEN (0x00800000) /* Secondary wait state enable */ -+#define MCF_FBCS_CSCR0_SWS(x) (((x)&0x0000003F)<<26) /* Secondary wait states */ -+#define MCF_FBCS_CSCR0_PS_8 (0x00000040) -+#define MCF_FBCS_CSCR0_PS_16 (0x00000080) -+#define MCF_FBCS_CSCR0_PS_32 (0x00000000) -+ -+/* Bit definitions and macros for CSMR1 */ -+#define MCF_FBCS_CSMR1_V (0x00000001) /* Valid bit */ -+#define MCF_FBCS_CSMR1_WP (0x00000100) /* Write protect */ -+#define MCF_FBCS_CSMR1_BAM(x) (((x)&0x0000FFFF)<<16) /* Base address mask */ -+ -+/* Bit definitions and macros for CSCR1 */ -+#define MCF_FBCS_CSCR1_BSTW (0x00000008) /* Burst-write enable */ -+#define MCF_FBCS_CSCR1_BSTR (0x00000010) /* Burst-read enable */ -+#define MCF_FBCS_CSCR1_BEM (0x00000020) /* Byte-enable mode */ -+#define MCF_FBCS_CSCR1_PS(x) (((x)&0x00000003)<<6) /* Port size */ -+#define MCF_FBCS_CSCR1_AA (0x00000100) /* Auto-acknowledge */ -+#define MCF_FBCS_CSCR1_WS(x) (((x)&0x0000003F)<<10) /* Wait states */ -+#define MCF_FBCS_CSCR1_WRAH(x) (((x)&0x00000003)<<16) /* Write address hold or deselect */ -+#define MCF_FBCS_CSCR1_RDAH(x) (((x)&0x00000003)<<18) /* Read address hold or deselect */ -+#define MCF_FBCS_CSCR1_ASET(x) (((x)&0x00000003)<<20) /* Address setup */ -+#define MCF_FBCS_CSCR1_SWSEN (0x00800000) /* Secondary wait state enable */ -+#define MCF_FBCS_CSCR1_SWS(x) (((x)&0x0000003F)<<26) /* Secondary wait states */ -+ -+/* Bit definitions and macros for CSMR2 */ -+#define MCF_FBCS_CSMR2_V (0x00000001) /* Valid bit */ -+#define MCF_FBCS_CSMR2_WP (0x00000100) /* Write protect */ -+#define MCF_FBCS_CSMR2_BAM(x) (((x)&0x0000FFFF)<<16) /* Base address mask */ -+ -+/* Bit definitions and macros for CSCR2 */ -+#define MCF_FBCS_CSCR2_BSTW (0x00000008) /* Burst-write enable */ -+#define MCF_FBCS_CSCR2_BSTR (0x00000010) /* Burst-read enable */ -+#define MCF_FBCS_CSCR2_BEM (0x00000020) /* Byte-enable mode */ -+#define MCF_FBCS_CSCR2_PS(x) (((x)&0x00000003)<<6) /* Port size */ -+#define MCF_FBCS_CSCR2_AA (0x00000100) /* Auto-acknowledge */ -+#define MCF_FBCS_CSCR2_WS(x) (((x)&0x0000003F)<<10) /* Wait states */ -+#define MCF_FBCS_CSCR2_WRAH(x) (((x)&0x00000003)<<16) /* Write address hold or deselect */ -+#define MCF_FBCS_CSCR2_RDAH(x) (((x)&0x00000003)<<18) /* Read address hold or deselect */ -+#define MCF_FBCS_CSCR2_ASET(x) (((x)&0x00000003)<<20) /* Address setup */ -+#define MCF_FBCS_CSCR2_SWSEN (0x00800000) /* Secondary wait state enable */ -+#define MCF_FBCS_CSCR2_SWS(x) (((x)&0x0000003F)<<26) /* Secondary wait states */ -+ -+/* Bit definitions and macros for CSMR3 */ -+#define MCF_FBCS_CSMR3_V (0x00000001) /* Valid bit */ -+#define MCF_FBCS_CSMR3_WP (0x00000100) /* Write protect */ -+#define MCF_FBCS_CSMR3_BAM(x) (((x)&0x0000FFFF)<<16) /* Base address mask */ -+ -+/* Bit definitions and macros for CSCR3 */ -+#define MCF_FBCS_CSCR3_BSTW (0x00000008) /* Burst-write enable */ -+#define MCF_FBCS_CSCR3_BSTR (0x00000010) /* Burst-read enable */ -+#define MCF_FBCS_CSCR3_BEM (0x00000020) /* Byte-enable mode */ -+#define MCF_FBCS_CSCR3_PS(x) (((x)&0x00000003)<<6) /* Port size */ -+#define MCF_FBCS_CSCR3_AA (0x00000100) /* Auto-acknowledge */ -+#define MCF_FBCS_CSCR3_WS(x) (((x)&0x0000003F)<<10) /* Wait states */ -+#define MCF_FBCS_CSCR3_WRAH(x) (((x)&0x00000003)<<16) /* Write address hold or deselect */ -+#define MCF_FBCS_CSCR3_RDAH(x) (((x)&0x00000003)<<18) /* Read address hold or deselect */ -+#define MCF_FBCS_CSCR3_ASET(x) (((x)&0x00000003)<<20) /* Address setup */ -+#define MCF_FBCS_CSCR3_SWSEN (0x00800000) /* Secondary wait state enable */ -+#define MCF_FBCS_CSCR3_SWS(x) (((x)&0x0000003F)<<26) /* Secondary wait states */ -+ -+/********************************************************************/ -+ -+#endif /* __MCF5445X_FBCS_H__ */ ---- /dev/null -+++ b/include/asm-m68k/mcf5445x_gpio.h -@@ -0,0 +1,1257 @@ -+/* -+ * Matt Waddel Matt.Waddel@freescale.com -+ * -+ * Copyright Freescale Semiconductor, Inc. 2007 -+ * -+ * This program is free software; you can redistribute it and/or modify it -+ * under the terms of the GNU General Public License as published by the -+ * Free Software Foundation; either version 2 of the License, or (at your -+ * option) any later version. -+ */ -+ -+#ifndef __MCF5445X_GPIO_H__ -+#define __MCF5445X_GPIO_H__ -+ -+/********************************************************************* -+* -+* General Purpose I/O Module (GPIO) -+* -+*********************************************************************/ -+ -+/* Register read/write macros */ -+#define MCF_GPIO_PODR_FEC0H MCF_REG08(0xFC0A4000) /* FEC0 High Port Output Data Register */ -+#define MCF_GPIO_PODR_FEC0L MCF_REG08(0xFC0A4001) /* FEC0 Low Port Output Data Register */ -+#define MCF_GPIO_PODR_SSI MCF_REG08(0xFC0A4002) /* SSI Port Output Data Register */ -+#define MCF_GPIO_PODR_FBCTL MCF_REG08(0xFC0A4003) /* Flexbus Control Port Output Data Register */ -+#define MCF_GPIO_PODR_BE MCF_REG08(0xFC0A4004) /* Flexbus Byte Enable Port Output Data Register */ -+#define MCF_GPIO_PODR_CS MCF_REG08(0xFC0A4005) /* Flexbus Chip-Select Port Output Data Register */ -+#define MCF_GPIO_PODR_DMA MCF_REG08(0xFC0A4006) /* DMA Port Output Data Register */ -+#define MCF_GPIO_PODR_FECI2C MCF_REG08(0xFC0A4007) /* FEC1 / I2C Port Output Data Register */ -+#define MCF_GPIO_PODR_UART MCF_REG08(0xFC0A4009) /* UART Port Output Data Register */ -+#define MCF_GPIO_PODR_DSPI MCF_REG08(0xFC0A400A) /* DSPI Port Output Data Register */ -+#define MCF_GPIO_PODR_TIMER MCF_REG08(0xFC0A400B) /* Timer Port Output Data Register */ -+#define MCF_GPIO_PODR_PCI MCF_REG08(0xFC0A400C) /* PCI Port Output Data Register */ -+#define MCF_GPIO_PODR_USB MCF_REG08(0xFC0A400D) /* USB Port Output Data Register */ -+#define MCF_GPIO_PODR_ATAH MCF_REG08(0xFC0A400E) /* ATA High Port Output Data Register */ -+#define MCF_GPIO_PODR_ATAL MCF_REG08(0xFC0A400F) /* ATA Low Port Output Data Register */ -+#define MCF_GPIO_PODR_FEC1H MCF_REG08(0xFC0A4010) /* FEC1 High Port Output Data Register */ -+#define MCF_GPIO_PODR_FEC1L MCF_REG08(0xFC0A4011) /* FEC1 Low Port Output Data Register */ -+#define MCF_GPIO_PODR_FBADH MCF_REG08(0xFC0A4014) /* Flexbus AD High Port Output Data Register */ -+#define MCF_GPIO_PODR_FBADMH MCF_REG08(0xFC0A4015) /* Flexbus AD Med-High Port Output Data Register */ -+#define MCF_GPIO_PODR_FBADML MCF_REG08(0xFC0A4016) /* Flexbus AD Med-Low Port Output Data Register */ -+#define MCF_GPIO_PODR_FBADL MCF_REG08(0xFC0A4017) /* Flexbus AD Low Port Output Data Register */ -+#define MCF_GPIO_PDDR_FEC0H MCF_REG08(0xFC0A4018) /* FEC0 High Port Data Direction Register */ -+#define MCF_GPIO_PDDR_FEC0L MCF_REG08(0xFC0A4019) /* FEC0 Low Port Data Direction Register */ -+#define MCF_GPIO_PDDR_SSI MCF_REG08(0xFC0A401A) /* SSI Port Data Direction Register */ -+#define MCF_GPIO_PDDR_FBCTL MCF_REG08(0xFC0A401B) /* Flexbus Control Port Data Direction Register */ -+#define MCF_GPIO_PDDR_BE MCF_REG08(0xFC0A401C) /* Flexbus Byte Enable Port Data Direction Register */ -+#define MCF_GPIO_PDDR_CS MCF_REG08(0xFC0A401D) /* Flexbus Chip-Select Port Data Direction Register */ -+#define MCF_GPIO_PDDR_DMA MCF_REG08(0xFC0A401E) /* DMA Port Data Direction Register */ -+#define MCF_GPIO_PDDR_FECI2C MCF_REG08(0xFC0A401F) /* FEC1 / I2C Port Data Direction Register */ -+#define MCF_GPIO_PDDR_UART MCF_REG08(0xFC0A4021) /* UART Port Data Direction Register */ -+#define MCF_GPIO_PDDR_DSPI MCF_REG08(0xFC0A4022) /* DSPI Port Data Direction Register */ -+#define MCF_GPIO_PDDR_TIMER MCF_REG08(0xFC0A4023) /* Timer Port Data Direction Register */ -+#define MCF_GPIO_PDDR_PCI MCF_REG08(0xFC0A4024) /* PCI Port Data Direction Register */ -+#define MCF_GPIO_PDDR_USB MCF_REG08(0xFC0A4025) /* USB Port Data Direction Register */ -+#define MCF_GPIO_PDDR_ATAH MCF_REG08(0xFC0A4026) /* ATA High Port Data Direction Register */ -+#define MCF_GPIO_PDDR_ATAL MCF_REG08(0xFC0A4027) /* ATA Low Port Data Direction Register */ -+#define MCF_GPIO_PDDR_FEC1H MCF_REG08(0xFC0A4028) /* FEC1 High Port Data Direction Register */ -+#define MCF_GPIO_PDDR_FEC1L MCF_REG08(0xFC0A4029) /* FEC1 Low Port Data Direction Register */ -+#define MCF_GPIO_PDDR_FBADH MCF_REG08(0xFC0A402C) /* Flexbus AD High Port Data Direction Register */ -+#define MCF_GPIO_PDDR_FBADMH MCF_REG08(0xFC0A402D) /* Flexbus AD Med-High Port Data Direction Register */ -+#define MCF_GPIO_PDDR_FBADML MCF_REG08(0xFC0A402E) /* Flexbus AD Med-Low Port Data Direction Register */ -+#define MCF_GPIO_PDDR_FBADL MCF_REG08(0xFC0A402F) /* Flexbus AD Low Port Data Direction Register */ -+#define MCF_GPIO_PPDSDR_FEC0H MCF_REG08(0xFC0A4030) /* FEC0 High Port Pin Data/Set Data Register */ -+#define MCF_GPIO_PPDSDR_FEC0L MCF_REG08(0xFC0A4031) /* FEC0 Low Port Clear Output Data Register */ -+#define MCF_GPIO_PPDSDR_SSI MCF_REG08(0xFC0A4032) /* SSI Port Pin Data/Set Data Register */ -+#define MCF_GPIO_PPDSDR_FBCTL MCF_REG08(0xFC0A4033) /* Flexbus Control Port Pin Data/Set Data Register */ -+#define MCF_GPIO_PPDSDR_BE MCF_REG08(0xFC0A4034) /* Flexbus Byte Enable Port Pin Data/Set Data Register */ -+#define MCF_GPIO_PPDSDR_CS MCF_REG08(0xFC0A4035) /* Flexbus Chip-Select Port Pin Data/Set Data Register */ -+#define MCF_GPIO_PPDSDR_DMA MCF_REG08(0xFC0A4036) /* DMA Port Pin Data/Set Data Register */ -+#define MCF_GPIO_PPDSDR_FECI2C MCF_REG08(0xFC0A4037) /* FEC1 / I2C Port Pin Data/Set Data Register */ -+#define MCF_GPIO_PPDSDR_UART MCF_REG08(0xFC0A4039) /* UART Port Pin Data/Set Data Register */ -+#define MCF_GPIO_PPDSDR_DSPI MCF_REG08(0xFC0A403A) /* DSPI Port Pin Data/Set Data Register */ -+#define MCF_GPIO_PPDSDR_TIMER MCF_REG08(0xFC0A403B) /* FTimer Port Pin Data/Set Data Register */ -+#define MCF_GPIO_PPDSDR_PCI MCF_REG08(0xFC0A403C) /* PCI Port Pin Data/Set Data Register */ -+#define MCF_GPIO_PPDSDR_USB MCF_REG08(0xFC0A403D) /* USB Port Pin Data/Set Data Register */ -+#define MCF_GPIO_PPDSDR_ATAH MCF_REG08(0xFC0A403E) /* ATA High Port Pin Data/Set Data Register */ -+#define MCF_GPIO_PPDSDR_ATAL MCF_REG08(0xFC0A403F) /* ATA Low Port Pin Data/Set Data Register */ -+#define MCF_GPIO_PPDSDR_FEC1H MCF_REG08(0xFC0A4040) /* FEC1 High Port Pin Data/Set Data Register */ -+#define MCF_GPIO_PPDSDR_FEC1L MCF_REG08(0xFC0A4041) /* FEC1 Low Port Pin Data/Set Data Register */ -+#define MCF_GPIO_PPDSDR_FBADH MCF_REG08(0xFC0A4044) /* Flexbus AD High Port Pin Data/Set Data Register */ -+#define MCF_GPIO_PPDSDR_FBADMH MCF_REG08(0xFC0A4045) /* Flexbus AD Med-High Port Pin Data/Set Data Register */ -+#define MCF_GPIO_PPDSDR_FBADML MCF_REG08(0xFC0A4046) /* Flexbus AD Med-Low Port Pin Data/Set Data Register */ -+#define MCF_GPIO_PPDSDR_FBADL MCF_REG08(0xFC0A4047) /* Flexbus AD Low Port Pin Data/Set Data Register */ -+#define MCF_GPIO_PCLRR_FEC0H MCF_REG08(0xFC0A4048) /* FEC0 High Port Clear Output Data Register */ -+#define MCF_GPIO_PCLRR_FEC0L MCF_REG08(0xFC0A4049) /* FEC0 Low Port Pin Data/Set Data Register */ -+#define MCF_GPIO_PCLRR_SSI MCF_REG08(0xFC0A404A) /* SSI Port Clear Output Data Register */ -+#define MCF_GPIO_PCLRR_FBCTL MCF_REG08(0xFC0A404B) /* Flexbus Control Port Clear Output Data Register */ -+#define MCF_GPIO_PCLRR_BE MCF_REG08(0xFC0A404C) /* Flexbus Byte Enable Port Clear Output Data Register */ -+#define MCF_GPIO_PCLRR_CS MCF_REG08(0xFC0A404D) /* Flexbus Chip-Select Port Clear Output Data Register */ -+#define MCF_GPIO_PCLRR_DMA MCF_REG08(0xFC0A404E) /* DMA Port Clear Output Data Register */ -+#define MCF_GPIO_PCLRR_FECI2C MCF_REG08(0xFC0A404F) /* FEC1 / I2C Port Clear Output Data Register */ -+#define MCF_GPIO_PCLRR_UART MCF_REG08(0xFC0A4051) /* UART Port Clear Output Data Register */ -+#define MCF_GPIO_PCLRR_DSPI MCF_REG08(0xFC0A4052) /* DSPI Port Clear Output Data Register */ -+#define MCF_GPIO_PCLRR_TIMER MCF_REG08(0xFC0A4053) /* Timer Port Clear Output Data Register */ -+#define MCF_GPIO_PCLRR_PCI MCF_REG08(0xFC0A4054) /* PCI Port Clear Output Data Register */ -+#define MCF_GPIO_PCLRR_USB MCF_REG08(0xFC0A4055) /* USB Port Clear Output Data Register */ -+#define MCF_GPIO_PCLRR_ATAH MCF_REG08(0xFC0A4056) /* ATA High Port Clear Output Data Register */ -+#define MCF_GPIO_PCLRR_ATAL MCF_REG08(0xFC0A4057) /* ATA Low Port Clear Output Data Register */ -+#define MCF_GPIO_PCLRR_FEC1H MCF_REG08(0xFC0A4058) /* FEC1 High Port Clear Output Data Register */ -+#define MCF_GPIO_PCLRR_FEC1L MCF_REG08(0xFC0A4059) /* FEC1 Low Port Clear Output Data Register */ -+#define MCF_GPIO_PCLRR_FBADH MCF_REG08(0xFC0A405C) /* Flexbus AD High Port Clear Output Data Register */ -+#define MCF_GPIO_PCLRR_FBADMH MCF_REG08(0xFC0A405D) /* Flexbus AD Med-High Port Clear Output Data Register */ -+#define MCF_GPIO_PCLRR_FBADML MCF_REG08(0xFC0A405E) /* Flexbus AD Med-Low Port Clear Output Data Register */ -+#define MCF_GPIO_PCLRR_FBADL MCF_REG08(0xFC0A405F) /* Flexbus AD Low Port Clear Output Data Register */ -+#define MCF_GPIO_PAR_FEC MCF_REG08(0xFC0A4060) /* FEC Pin Assignment Register */ -+#define MCF_GPIO_PAR_DMA MCF_REG08(0xFC0A4061) /* DMA Pin Assignment Register */ -+#define MCF_GPIO_PAR_FBCTL MCF_REG08(0xFC0A4062) /* Flexbus Control Pin Assignment Register */ -+#define MCF_GPIO_PAR_DSPI MCF_REG08(0xFC0A4063) /* DSPI Pin Assignment Register */ -+#define MCF_GPIO_PAR_BE MCF_REG08(0xFC0A4064) /* Flexbus Byte-Enable Pin Assignment Register */ -+#define MCF_GPIO_PAR_CS MCF_REG08(0xFC0A4065) /* Flexbus Chip-Select Pin Assignment Register */ -+#define MCF_GPIO_PAR_TIMER MCF_REG08(0xFC0A4066) /* Time Pin Assignment Register */ -+#define MCF_GPIO_PAR_USB MCF_REG08(0xFC0A4067) /* USB Pin Assignment Register */ -+#define MCF_GPIO_PAR_UART MCF_REG08(0xFC0A4069) /* UART Pin Assignment Register */ -+#define MCF_GPIO_PAR_FECI2C MCF_REG16(0xFC0A406A) /* FEC / I2C Pin Assignment Register */ -+#define MCF_GPIO_PAR_SSI MCF_REG16(0xFC0A406C) /* SSI Pin Assignment Register */ -+#define MCF_GPIO_PAR_ATA MCF_REG16(0xFC0A406E) /* ATA Pin Assignment Register */ -+#define MCF_GPIO_PAR_IRQ MCF_REG08(0xFC0A4070) /* IRQ Pin Assignment Register */ -+#define MCF_GPIO_PAR_PCI MCF_REG16(0xFC0A4072) /* PCI Pin Assignment Register */ -+#define MCF_GPIO_MSCR_SDRAM MCF_REG08(0xFC0A4074) /* SDRAM Mode Select Control Register */ -+#define MCF_GPIO_MSCR_PCI MCF_REG08(0xFC0A4075) /* PCI Mode Select Control Register */ -+#define MCF_GPIO_DSCR_I2C MCF_REG08(0xFC0A4078) /* I2C Drive Strength Control Register */ -+#define MCF_GPIO_DSCR_FLEXBUS MCF_REG08(0xFC0A4079) /* FLEXBUS Drive Strength Control Register */ -+#define MCF_GPIO_DSCR_FEC MCF_REG08(0xFC0A407A) /* FEC Drive Strength Control Register */ -+#define MCF_GPIO_DSCR_UART MCF_REG08(0xFC0A407B) /* UART Drive Strength Control Register */ -+#define MCF_GPIO_DSCR_DSPI MCF_REG08(0xFC0A407C) /* DSPI Drive Strength Control Register */ -+#define MCF_GPIO_DSCR_TIMER MCF_REG08(0xFC0A407D) /* TIMER Drive Strength Control Register */ -+#define MCF_GPIO_DSCR_SSI MCF_REG08(0xFC0A407E) /* SSI Drive Strength Control Register */ -+#define MCF_GPIO_DSCR_DMA MCF_REG08(0xFC0A407F) /* DMA Drive Strength Control Register */ -+#define MCF_GPIO_DSCR_DEBUG MCF_REG08(0xFC0A4080) /* DEBUG Drive Strength Control Register */ -+#define MCF_GPIO_DSCR_RESET MCF_REG08(0xFC0A4081) /* RESET Drive Strength Control Register */ -+#define MCF_GPIO_DSCR_IRQ MCF_REG08(0xFC0A4082) /* IRQ Drive Strength Control Register */ -+#define MCF_GPIO_DSCR_USB MCF_REG08(0xFC0A4083) /* USB Drive Strength Control Register */ -+#define MCF_GPIO_DSCR_ATA MCF_REG08(0xFC0A4084) /* ATA Drive Strength Control Register */ -+ -+/* Bit definitions and macros for PODR_FEC0H */ -+#define MCF_GPIO_PODR_FEC0H_PODR0 (0x01) /* FEC0_CRS / ULPI_DATA6 */ -+#define MCF_GPIO_PODR_FEC0H_PODR1 (0x02) /* FEC0_RXD0 / FEC0_RMII_RXD0 */ -+#define MCF_GPIO_PODR_FEC0H_PODR2 (0x04) /* FEC0_RXDV/FEC0_RMII_CRS_DV */ -+#define MCF_GPIO_PODR_FEC0H_PODR3 (0x08) /* FEC0_RXCLK / ULPI_DATA1 */ -+#define MCF_GPIO_PODR_FEC0H_PODR4 (0x10) /* FEC0_COL / ULPI_DATA7 */ -+#define MCF_GPIO_PODR_FEC0H_PODR5 (0x20) /* FEC0_TXD0 / FEC0_RMII_TXD0 */ -+#define MCF_GPIO_PODR_FEC0H_PODR6 (0x40) /* FEC0_TXEN / FEC0_RMII_TXEN */ -+#define MCF_GPIO_PODR_FEC0H_PODR7 (0x80) /* FEC0_TXCLK / FEC0_RMII_REF_CLK */ -+ -+/* Bit definitions and macros for PODR_FEC0L */ -+#define MCF_GPIO_PODR_FEC0L_PODR0 (0x01) /* FEC0_RXER / FEC0_RMII_RXER */ -+#define MCF_GPIO_PODR_FEC0L_PODR1 (0x02) /* FEC0_RXD1 / FEC0_RMII_RXD1 */ -+#define MCF_GPIO_PODR_FEC0L_PODR2 (0x04) /* FEC0_RXD2 / ULPI_DATA4 */ -+#define MCF_GPIO_PODR_FEC0L_PODR3 (0x08) /* FEC0_RXD3 / ULPI_DATA5 */ -+#define MCF_GPIO_PODR_FEC0L_PODR4 (0x10) /* FEC0_TXER / ULPI_DATA0 */ -+#define MCF_GPIO_PODR_FEC0L_PODR5 (0x20) /* FEC0_TXD1 / FEC0_RMII_TXD1 */ -+#define MCF_GPIO_PODR_FEC0L_PODR6 (0x40) /* FEC0_TXD2 / ULPI_DATA2 */ -+#define MCF_GPIO_PODR_FEC0L_PODR7 (0x80) /* FEC0_TXD3 / ULPI_DATA3 */ -+ -+/* Bit definitions and macros for PODR_SSI */ -+#define MCF_GPIO_PODR_SSI_PODR0 (0x01) /* SSI_TXD / U1TXD */ -+#define MCF_GPIO_PODR_SSI_PODR1 (0x02) /* SSI_RXD / U1RXD */ -+#define MCF_GPIO_PODR_SSI_PODR2 (0x04) /* SSI_FS / U1RTS */ -+#define MCF_GPIO_PODR_SSI_PODR3 (0x08) /* SSI_BCLK / U1CTS */ -+#define MCF_GPIO_PODR_SSI_PODR4 (0x10) /* SSI_MCLK */ -+ -+/* Bit definitions and macros for PODR_FBCTL */ -+#define MCF_GPIO_PODR_FBCTL_PODR0 (0x01) /* FB_TS / FB_ALE / FB_TBST */ -+#define MCF_GPIO_PODR_FBCTL_PODR1 (0x02) /* FB_RW */ -+#define MCF_GPIO_PODR_FBCTL_PODR2 (0x04) /* FB_TA */ -+#define MCF_GPIO_PODR_FBCTL_PODR3 (0x08) /* FB_OE */ -+ -+/* Bit definitions and macros for PODR_BE */ -+#define MCF_GPIO_PODR_BE_PODR0 (0x01) /* FB_BE/BWE0 / FB_SIZ0 */ -+#define MCF_GPIO_PODR_BE_PODR1 (0x02) /* FB_BE/BWE1 / FB_SIZ1 */ -+#define MCF_GPIO_PODR_BE_PODR2 (0x04) /* FB_BE/BWE2 / FB_SIZ2 */ -+#define MCF_GPIO_PODR_BE_PODR3 (0x08) /* FB_BE/BWE3 / FB_SIZ3 */ -+ -+/* Bit definitions and macros for PODR_CS */ -+#define MCF_GPIO_PODR_CS_PODR1 (0x02) /* FB_CS1 */ -+#define MCF_GPIO_PODR_CS_PODR2 (0x04) /* FB_CS2 */ -+#define MCF_GPIO_PODR_CS_PODR3 (0x08) /* FB_CS3 */ -+ -+/* Bit definitions and macros for PODR_DMA */ -+#define MCF_GPIO_PODR_DMA_PODR0 (0x01) /* DREQ0 */ -+#define MCF_GPIO_PODR_DMA_PODR1 (0x02) /* DACK0 / DSPI_PCS3 */ -+#define MCF_GPIO_PODR_DMA_PODR2 (0x04) /* DREQ1 / USB_CLKIN */ -+#define MCF_GPIO_PODR_DMA_PODR3 (0x08) /* DACK1 / ULPI_DIR */ -+ -+/* Bit definitions and macros for PODR_FECI2C */ -+#define MCF_GPIO_PODR_FECI2C_PODR0 (0x01) /* I2C_SDA / U2RXD */ -+#define MCF_GPIO_PODR_FECI2C_PODR1 (0x02) /* I2C_SCL / U2TXD */ -+#define MCF_GPIO_PODR_FECI2C_PODR2 (0x04) /* FEC0_MDIO */ -+#define MCF_GPIO_PODR_FECI2C_PODR3 (0x08) /* FEC0_MDC */ -+#define MCF_GPIO_PODR_FECI2C_PODR4 (0x10) /* FEC1_MDIO / ATA_DIOW */ -+#define MCF_GPIO_PODR_FECI2C_PODR5 (0x20) /* FEC1_MDC / ATA_DIOR */ -+ -+/* Bit definitions and macros for PODR_UART */ -+#define MCF_GPIO_PODR_UART_PODR0 (0x01) /* U1TXD */ -+#define MCF_GPIO_PODR_UART_PODR1 (0x02) /* U1RXD */ -+#define MCF_GPIO_PODR_UART_PODR2 (0x04) /* U1RTS */ -+#define MCF_GPIO_PODR_UART_PODR3 (0x08) /* U0CTS */ -+#define MCF_GPIO_PODR_UART_PODR4 (0x10) /* U1TXD */ -+#define MCF_GPIO_PODR_UART_PODR5 (0x20) /* U1RXD */ -+#define MCF_GPIO_PODR_UART_PODR6 (0x40) /* U1RTS */ -+#define MCF_GPIO_PODR_UART_PODR7 (0x80) /* U1CTS */ -+ -+/* Bit definitions and macros for PODR_DSPI */ -+#define MCF_GPIO_PODR_DSPI_PODR0 (0x01) /* DSPI_SOUT / SBF_DO */ -+#define MCF_GPIO_PODR_DSPI_PODR1 (0x02) /* DSPI_SIN / SBF_DI */ -+#define MCF_GPIO_PODR_DSPI_PODR2 (0x04) /* DSPI_SCK / SBF_CK */ -+#define MCF_GPIO_PODR_DSPI_PODR3 (0x08) /* DSPI_PCS0/SS */ -+#define MCF_GPIO_PODR_DSPI_PODR4 (0x10) /* DSPI_PCS1 / SBF_CS */ -+#define MCF_GPIO_PODR_DSPI_PODR5 (0x20) /* DSPI_PCS2 */ -+#define MCF_GPIO_PODR_DSPI_PODR6 (0x40) /* DSPI_PCS5/SS */ -+ -+/* Bit definitions and macros for PODR_TIMER */ -+#define MCF_GPIO_PODR_TIMER_PODR0 (0x01) /* T0IN / T0OUT / U2RTS */ -+#define MCF_GPIO_PODR_TIMER_PODR1 (0x02) /* T1IN / T1OUT / U2CTS */ -+#define MCF_GPIO_PODR_TIMER_PODR2 (0x04) /* T2IN / T2OUT / U2TXD */ -+#define MCF_GPIO_PODR_TIMER_PODR3 (0x08) /* T3IN / T3OUT / U2RXD */ -+ -+/* Bit definitions and macros for PODR_PCI */ -+#define MCF_GPIO_PODR_PCI_PODR0 (0x01) /* PCI_REQ0/PCI_EXTGNT */ -+#define MCF_GPIO_PODR_PCI_PODR1 (0x02) /* PCI_REQ1 */ -+#define MCF_GPIO_PODR_PCI_PODR2 (0x04) /* PCI_REQ2 */ -+#define MCF_GPIO_PODR_PCI_PODR3 (0x08) /* PCI_REQ3 / ATA_INTR */ -+#define MCF_GPIO_PODR_PCI_PODR4 (0x10) /* PCI_GNT0/PCI_EXTREQ */ -+#define MCF_GPIO_PODR_PCI_PODR5 (0x20) /* PCI_GNT1 / */ -+#define MCF_GPIO_PODR_PCI_PODR6 (0x40) /* PCI_GNT2 / */ -+#define MCF_GPIO_PODR_PCI_PODR7 (0x80) /* PCI_GNT3 / ATA_DMACK */ -+ -+/* Bit definitions and macros for PODR_USB */ -+#define MCF_GPIO_PODR_USB_PODR0 (0x01) /* USB_VBUS_OC / ULPI_STP */ -+#define MCF_GPIO_PODR_USB_PODR1 (0x02) /* USB_VBUS_EN / USB_PULLUP / ULPI_NXT */ -+ -+/* Bit definitions and macros for PODR_ATAH */ -+#define MCF_GPIO_PODR_ATAH_PODR0 (0x01) /* ATA_DA0 */ -+#define MCF_GPIO_PODR_ATAH_PODR1 (0x02) /* ATA_DA1 */ -+#define MCF_GPIO_PODR_ATAH_PODR2 (0x04) /* ATA_DA2 */ -+#define MCF_GPIO_PODR_ATAH_PODR3 (0x08) /* ATA_CS0 */ -+#define MCF_GPIO_PODR_ATAH_PODR4 (0x10) /* ATA_CS1 */ -+#define MCF_GPIO_PODR_ATAH_PODR5 (0x20) /* ATA_BUFFER_EN */ -+ -+/* Bit definitions and macros for PODR_ATAL */ -+#define MCF_GPIO_PODR_ATAL_PODR0 (0x01) /* ATA_IORDY */ -+#define MCF_GPIO_PODR_ATAL_PODR1 (0x02) /* ATA_DMARQ */ -+#define MCF_GPIO_PODR_ATAL_PODR2 (0x04) /* ATA_RESET */ -+ -+/* Bit definitions and macros for PODR_FEC1H */ -+#define MCF_GPIO_PODR_FEC1H_PODR0 (0x01) /* FEC1_CRS / ATA_DATA6 */ -+#define MCF_GPIO_PODR_FEC1H_PODR1 (0x02) /* FEC1_RXD0 / FEC1_RMII_RXD0 / ATA_DATA13 */ -+#define MCF_GPIO_PODR_FEC1H_PODR2 (0x04) /* FEC1_RXDV / FEC1_RMII_CRS_DV / ATA_DATA15 */ -+#define MCF_GPIO_PODR_FEC1H_PODR3 (0x08) /* FEC1_RXCLK / ATA_DATA5 */ -+#define MCF_GPIO_PODR_FEC1H_PODR4 (0x10) /* FEC1_COL / ATA_DATA7 */ -+#define MCF_GPIO_PODR_FEC1H_PODR5 (0x20) /* FEC1_TXD0 / FEC1_RMII_TXD0 / ATA_DATA9 */ -+#define MCF_GPIO_PODR_FEC1H_PODR6 (0x40) /* FEC1_TXEN / FEC1_RMII_TXEN / ATA_DATA8 */ -+#define MCF_GPIO_PODR_FEC1H_PODR7 (0x80) /* FEC1_TXCLK / FEC1_RMII_REF_CLK / ATA_DATA11 */ -+ -+/* Bit definitions and macros for PODR_FEC1L */ -+#define MCF_GPIO_PODR_FEC1L_PODR0 (0x01) /* FEC1_RXER / FEC1_RMII_RXER / ATA_DATA12 */ -+#define MCF_GPIO_PODR_FEC1L_PODR1 (0x02) /* FEC1_RXD1 / FEC1_RMII_RXD1 / ATA_DATA14 */ -+#define MCF_GPIO_PODR_FEC1L_PODR2 (0x04) /* FEC1_RXD2 / ATA_DATA3 */ -+#define MCF_GPIO_PODR_FEC1L_PODR3 (0x08) /* FEC1_RXD3 / ATA_DATA4 */ -+#define MCF_GPIO_PODR_FEC1L_PODR4 (0x10) /* FEC1_TXER / ATA_DATA0 */ -+#define MCF_GPIO_PODR_FEC1L_PODR5 (0x20) /* FEC1_TXD1 / FEC1_RMII_TXD1 / ATA_DATA10 */ -+#define MCF_GPIO_PODR_FEC1L_PODR6 (0x40) /* FEC1_TXD2 / ATA_DATA1 */ -+#define MCF_GPIO_PODR_FEC1L_PODR7 (0x80) /* FEC1_TXD3 / ATA_DATA2 */ -+ -+/* Bit definitions and macros for PODR_FBADH */ -+#define MCF_GPIO_PODR_FBADH_PODR0 (0x01) /* FB_AD24 */ -+#define MCF_GPIO_PODR_FBADH_PODR1 (0x02) /* FB_AD25 */ -+#define MCF_GPIO_PODR_FBADH_PODR2 (0x04) /* FB_AD26 */ -+#define MCF_GPIO_PODR_FBADH_PODR3 (0x08) /* FB_AD27 */ -+#define MCF_GPIO_PODR_FBADH_PODR4 (0x10) /* FB_AD28 */ -+#define MCF_GPIO_PODR_FBADH_PODR5 (0x20) /* FB_AD29 */ -+#define MCF_GPIO_PODR_FBADH_PODR6 (0x40) /* FB_AD30 */ -+#define MCF_GPIO_PODR_FBADH_PODR7 (0x80) /* FB_AD31 */ -+ -+/* Bit definitions and macros for PODR_FBADMH */ -+#define MCF_GPIO_PODR_FBADMH_PODR0 (0x01) /* FB_AD16 */ -+#define MCF_GPIO_PODR_FBADMH_PODR1 (0x02) /* FB_AD17 */ -+#define MCF_GPIO_PODR_FBADMH_PODR2 (0x04) /* FB_AD18 */ -+#define MCF_GPIO_PODR_FBADMH_PODR3 (0x08) /* FB_AD19 */ -+#define MCF_GPIO_PODR_FBADMH_PODR4 (0x10) /* FB_AD20 */ -+#define MCF_GPIO_PODR_FBADMH_PODR5 (0x20) /* FB_AD21 */ -+#define MCF_GPIO_PODR_FBADMH_PODR6 (0x40) /* FB_AD22 */ -+#define MCF_GPIO_PODR_FBADMH_PODR7 (0x80) /* FB_AD23 */ -+ -+/* Bit definitions and macros for PODR_FBADML */ -+#define MCF_GPIO_PODR_FBADML_PODR0 (0x01) /* FB_AD8 */ -+#define MCF_GPIO_PODR_FBADML_PODR1 (0x02) /* FB_AD9 */ -+#define MCF_GPIO_PODR_FBADML_PODR2 (0x04) /* FB_AD10 */ -+#define MCF_GPIO_PODR_FBADML_PODR3 (0x08) /* FB_AD11 */ -+#define MCF_GPIO_PODR_FBADML_PODR4 (0x10) /* FB_AD12 */ -+#define MCF_GPIO_PODR_FBADML_PODR5 (0x20) /* FB_AD13 */ -+#define MCF_GPIO_PODR_FBADML_PODR6 (0x40) /* FB_AD14 */ -+#define MCF_GPIO_PODR_FBADML_PODR7 (0x80) /* FB_AD15 */ -+ -+/* Bit definitions and macros for PODR_FBADL */ -+#define MCF_GPIO_PODR_FBADL_PODR0 (0x01) /* FB_AD0 */ -+#define MCF_GPIO_PODR_FBADL_PODR1 (0x02) /* FB_AD1 */ -+#define MCF_GPIO_PODR_FBADL_PODR2 (0x04) /* FB_AD2 */ -+#define MCF_GPIO_PODR_FBADL_PODR3 (0x08) /* FB_AD3 */ -+#define MCF_GPIO_PODR_FBADL_PODR4 (0x10) /* FB_AD4 */ -+#define MCF_GPIO_PODR_FBADL_PODR5 (0x20) /* FB_AD5 */ -+#define MCF_GPIO_PODR_FBADL_PODR6 (0x40) /* FB_AD6 */ -+#define MCF_GPIO_PODR_FBADL_PODR7 (0x80) /* FB_AD7 */ -+ -+/* Bit definitions and macros for PDDR_FEC0H */ -+#define MCF_GPIO_PDDR_FEC0H_PDDR0 (0x01) /* FEC0_CRS / ULPI_DATA6 */ -+#define MCF_GPIO_PDDR_FEC0H_PDDR1 (0x02) /* FEC0_RXD0 / FEC0_RMII_RXD0 */ -+#define MCF_GPIO_PDDR_FEC0H_PDDR2 (0x04) /* FEC0_RXDV/FEC0_RMII_CRS_DV */ -+#define MCF_GPIO_PDDR_FEC0H_PDDR3 (0x08) /* FEC0_RXCLK / ULPI_DATA1 */ -+#define MCF_GPIO_PDDR_FEC0H_PDDR4 (0x10) /* FEC0_COL / ULPI_DATA7 */ -+#define MCF_GPIO_PDDR_FEC0H_PDDR5 (0x20) /* FEC0_TXD0 / FEC0_RMII_TXD0 */ -+#define MCF_GPIO_PDDR_FEC0H_PDDR6 (0x40) /* FEC0_TXEN / FEC0_RMII_TXEN */ -+#define MCF_GPIO_PDDR_FEC0H_PDDR7 (0x80) /* FEC0_TXCLK / FEC0_RMII_REF_CLK */ -+ -+/* Bit definitions and macros for PDDR_FEC0L */ -+#define MCF_GPIO_PDDR_FEC0L_PDDR0 (0x01) /* FEC0_RXER / FEC0_RMII_RXER */ -+#define MCF_GPIO_PDDR_FEC0L_PDDR1 (0x02) /* FEC0_RXD1 / FEC0_RMII_RXD1 */ -+#define MCF_GPIO_PDDR_FEC0L_PDDR2 (0x04) /* FEC0_RXD2 / ULPI_DATA4 */ -+#define MCF_GPIO_PDDR_FEC0L_PDDR3 (0x08) /* FEC0_RXD3 / ULPI_DATA5 */ -+#define MCF_GPIO_PDDR_FEC0L_PDDR4 (0x10) /* FEC0_TXER / ULPI_DATA0 */ -+#define MCF_GPIO_PDDR_FEC0L_PDDR5 (0x20) /* FEC0_TXD1 / FEC0_RMII_TXD1 */ -+#define MCF_GPIO_PDDR_FEC0L_PDDR6 (0x40) /* FEC0_TXD2 / ULPI_DATA2 */ -+#define MCF_GPIO_PDDR_FEC0L_PDDR7 (0x80) /* FEC0_TXD3 / ULPI_DATA3 */ -+ -+/* Bit definitions and macros for PDDR_SSI */ -+#define MCF_GPIO_PDDR_SSI_PDDR0 (0x01) /* SSI_TXD / U1TXD */ -+#define MCF_GPIO_PDDR_SSI_PDDR1 (0x02) /* SSI_RXD / U1RXD */ -+#define MCF_GPIO_PDDR_SSI_PDDR2 (0x04) /* SSI_FS / U1RTS */ -+#define MCF_GPIO_PDDR_SSI_PDDR3 (0x08) /* SSI_BCLK / U1CTS */ -+#define MCF_GPIO_PDDR_SSI_PDDR4 (0x10) /* SSI_MCLK */ -+ -+/* Bit definitions and macros for PDDR_FBCTL */ -+#define MCF_GPIO_PDDR_FBCTL_PDDR0 (0x01) /* FB_TS / FB_ALE / FB_TBST */ -+#define MCF_GPIO_PDDR_FBCTL_PDDR1 (0x02) /* FB_RW */ -+#define MCF_GPIO_PDDR_FBCTL_PDDR2 (0x04) /* FB_TA */ -+#define MCF_GPIO_PDDR_FBCTL_PDDR3 (0x08) /* FB_OE */ -+ -+/* Bit definitions and macros for PDDR_BE */ -+#define MCF_GPIO_PDDR_BE_PDDR0 (0x01) /* FB_BE/BWE0 / FB_SIZ0 */ -+#define MCF_GPIO_PDDR_BE_PDDR1 (0x02) /* FB_BE/BWE1 / FB_SIZ1 */ -+#define MCF_GPIO_PDDR_BE_PDDR2 (0x04) /* FB_BE/BWE2 / FB_SIZ2 */ -+#define MCF_GPIO_PDDR_BE_PDDR3 (0x08) /* FB_BE/BWE3 / FB_SIZ3 */ -+ -+/* Bit definitions and macros for PDDR_CS */ -+#define MCF_GPIO_PDDR_CS_PDDR1 (0x02) /* FB_CS1 */ -+#define MCF_GPIO_PDDR_CS_PDDR2 (0x04) /* FB_CS2 */ -+#define MCF_GPIO_PDDR_CS_PDDR3 (0x08) /* FB_CS3 */ -+ -+/* Bit definitions and macros for PDDR_DMA */ -+#define MCF_GPIO_PDDR_DMA_PDDR0 (0x01) /* DREQ0 */ -+#define MCF_GPIO_PDDR_DMA_PDDR1 (0x02) /* DACK0 / DSPI_PCS3 */ -+#define MCF_GPIO_PDDR_DMA_PDDR2 (0x04) /* DREQ1 / USB_CLKIN */ -+#define MCF_GPIO_PDDR_DMA_PDDR3 (0x08) /* DACK1 / ULPI_DIR */ -+ -+/* Bit definitions and macros for PDDR_FECI2C */ -+#define MCF_GPIO_PDDR_FECI2C_PDDR0 (0x01) /* I2C_SDA / U2RXD */ -+#define MCF_GPIO_PDDR_FECI2C_PDDR1 (0x02) /* I2C_SCL / U2TXD */ -+#define MCF_GPIO_PDDR_FECI2C_PDDR2 (0x04) /* FEC0_MDIO */ -+#define MCF_GPIO_PDDR_FECI2C_PDDR3 (0x08) /* FEC0_MDC */ -+#define MCF_GPIO_PDDR_FECI2C_PDDR4 (0x10) /* FEC1_MDIO / ATA_DIOW */ -+#define MCF_GPIO_PDDR_FECI2C_PDDR5 (0x20) /* FEC1_MDC / ATA_DIOR */ -+ -+/* Bit definitions and macros for PDDR_UART */ -+#define MCF_GPIO_PDDR_UART_PDDR0 (0x01) /* U1TXD */ -+#define MCF_GPIO_PDDR_UART_PDDR1 (0x02) /* U1RXD */ -+#define MCF_GPIO_PDDR_UART_PDDR2 (0x04) /* U1RTS */ -+#define MCF_GPIO_PDDR_UART_PDDR3 (0x08) /* U0CTS */ -+#define MCF_GPIO_PDDR_UART_PDDR4 (0x10) /* U1TXD */ -+#define MCF_GPIO_PDDR_UART_PDDR5 (0x20) /* U1RXD */ -+#define MCF_GPIO_PDDR_UART_PDDR6 (0x40) /* U1RTS */ -+#define MCF_GPIO_PDDR_UART_PDDR7 (0x80) /* U1CTS */ -+ -+/* Bit definitions and macros for PDDR_DSPI */ -+#define MCF_GPIO_PDDR_DSPI_PDDR0 (0x01) /* DSPI_SOUT / SBF_DO */ -+#define MCF_GPIO_PDDR_DSPI_PDDR1 (0x02) /* DSPI_SIN / SBF_DI */ -+#define MCF_GPIO_PDDR_DSPI_PDDR2 (0x04) /* DSPI_SCK / SBF_CK */ -+#define MCF_GPIO_PDDR_DSPI_PDDR3 (0x08) /* DSPI_PCS0/SS */ -+#define MCF_GPIO_PDDR_DSPI_PDDR4 (0x10) /* DSPI_PCS1 / SBF_CS */ -+#define MCF_GPIO_PDDR_DSPI_PDDR5 (0x20) /* DSPI_PCS2 */ -+#define MCF_GPIO_PDDR_DSPI_PDDR6 (0x40) /* DSPI_PCS5/SS */ -+ -+/* Bit definitions and macros for PDDR_TIMER */ -+#define MCF_GPIO_PDDR_TIMER_PDDR0 (0x01) /* T0IN / T0OUT / U2RTS */ -+#define MCF_GPIO_PDDR_TIMER_PDDR1 (0x02) /* T1IN / T1OUT / U2CTS */ -+#define MCF_GPIO_PDDR_TIMER_PDDR2 (0x04) /* T2IN / T2OUT / U2TXD */ -+#define MCF_GPIO_PDDR_TIMER_PDDR3 (0x08) /* T3IN / T3OUT / U2RXD */ -+ -+/* Bit definitions and macros for PDDR_PCI */ -+#define MCF_GPIO_PDDR_PCI_PDDR0 (0x01) /* PCI_REQ0/PCI_EXTGNT */ -+#define MCF_GPIO_PDDR_PCI_PDDR1 (0x02) /* PCI_REQ1 */ -+#define MCF_GPIO_PDDR_PCI_PDDR2 (0x04) /* PCI_REQ2 */ -+#define MCF_GPIO_PDDR_PCI_PDDR3 (0x08) /* PCI_REQ3 / ATA_INTR */ -+#define MCF_GPIO_PDDR_PCI_PDDR4 (0x10) /* PCI_GNT0/PCI_EXTREQ */ -+#define MCF_GPIO_PDDR_PCI_PDDR5 (0x20) /* PCI_GNT1 / */ -+#define MCF_GPIO_PDDR_PCI_PDDR6 (0x40) /* PCI_GNT2 / */ -+#define MCF_GPIO_PDDR_PCI_PDDR7 (0x80) /* PCI_GNT3 / ATA_DMACK */ -+ -+/* Bit definitions and macros for PDDR_USB */ -+#define MCF_GPIO_PDDR_USB_PDDR0 (0x01) /* USB_VBUS_OC / ULPI_STP */ -+#define MCF_GPIO_PDDR_USB_PDDR1 (0x02) /* USB_VBUS_EN / USB_PULLUP / ULPI_NXT */ -+ -+/* Bit definitions and macros for PDDR_ATAH */ -+#define MCF_GPIO_PDDR_ATAH_PDDR0 (0x01) /* ATA_DA0 */ -+#define MCF_GPIO_PDDR_ATAH_PDDR1 (0x02) /* ATA_DA1 */ -+#define MCF_GPIO_PDDR_ATAH_PDDR2 (0x04) /* ATA_DA2 */ -+#define MCF_GPIO_PDDR_ATAH_PDDR3 (0x08) /* ATA_CS0 */ -+#define MCF_GPIO_PDDR_ATAH_PDDR4 (0x10) /* ATA_CS1 */ -+#define MCF_GPIO_PDDR_ATAH_PDDR5 (0x20) /* ATA_BUFFER_EN */ -+ -+/* Bit definitions and macros for PDDR_ATAL */ -+#define MCF_GPIO_PDDR_ATAL_PDDR0 (0x01) /* ATA_IORDY */ -+#define MCF_GPIO_PDDR_ATAL_PDDR1 (0x02) /* ATA_DMARQ */ -+#define MCF_GPIO_PDDR_ATAL_PDDR2 (0x04) /* ATA_RESET */ -+ -+/* Bit definitions and macros for PDDR_FEC1H */ -+#define MCF_GPIO_PDDR_FEC1H_PDDR0 (0x01) /* FEC1_CRS / ATA_DATA6 */ -+#define MCF_GPIO_PDDR_FEC1H_PDDR1 (0x02) /* FEC1_RXD0 / FEC1_RMII_RXD0 / ATA_DATA13 */ -+#define MCF_GPIO_PDDR_FEC1H_PDDR2 (0x04) /* FEC1_RXDV / FEC1_RMII_CRS_DV / ATA_DATA15 */ -+#define MCF_GPIO_PDDR_FEC1H_PDDR3 (0x08) /* FEC1_RXCLK / ATA_DATA5 */ -+#define MCF_GPIO_PDDR_FEC1H_PDDR4 (0x10) /* FEC1_COL / ATA_DATA7 */ -+#define MCF_GPIO_PDDR_FEC1H_PDDR5 (0x20) /* FEC1_TXD0 / FEC1_RMII_TXD0 / ATA_DATA9 */ -+#define MCF_GPIO_PDDR_FEC1H_PDDR6 (0x40) /* FEC1_TXEN / FEC1_RMII_TXEN / ATA_DATA8 */ -+#define MCF_GPIO_PDDR_FEC1H_PDDR7 (0x80) /* FEC1_TXCLK / FEC1_RMII_REF_CLK / ATA_DATA11 */ -+ -+/* Bit definitions and macros for PDDR_FEC1L */ -+#define MCF_GPIO_PDDR_FEC1L_PDDR0 (0x01) /* FEC1_RXER / FEC1_RMII_RXER / ATA_DATA12 */ -+#define MCF_GPIO_PDDR_FEC1L_PDDR1 (0x02) /* FEC1_RXD1 / FEC1_RMII_RXD1 / ATA_DATA14 */ -+#define MCF_GPIO_PDDR_FEC1L_PDDR2 (0x04) /* FEC1_RXD2 / ATA_DATA3 */ -+#define MCF_GPIO_PDDR_FEC1L_PDDR3 (0x08) /* FEC1_RXD3 / ATA_DATA4 */ -+#define MCF_GPIO_PDDR_FEC1L_PDDR4 (0x10) /* FEC1_TXER / ATA_DATA0 */ -+#define MCF_GPIO_PDDR_FEC1L_PDDR5 (0x20) /* FEC1_TXD1 / FEC1_RMII_TXD1 / ATA_DATA10 */ -+#define MCF_GPIO_PDDR_FEC1L_PDDR6 (0x40) /* FEC1_TXD2 / ATA_DATA1 */ -+#define MCF_GPIO_PDDR_FEC1L_PDDR7 (0x80) /* FEC1_TXD3 / ATA_DATA2 */ -+ -+/* Bit definitions and macros for PDDR_FBADH */ -+#define MCF_GPIO_PDDR_FBADH_PDDR0 (0x01) /* FB_AD24 */ -+#define MCF_GPIO_PDDR_FBADH_PDDR1 (0x02) /* FB_AD25 */ -+#define MCF_GPIO_PDDR_FBADH_PDDR2 (0x04) /* FB_AD26 */ -+#define MCF_GPIO_PDDR_FBADH_PDDR3 (0x08) /* FB_AD27 */ -+#define MCF_GPIO_PDDR_FBADH_PDDR4 (0x10) /* FB_AD28 */ -+#define MCF_GPIO_PDDR_FBADH_PDDR5 (0x20) /* FB_AD29 */ -+#define MCF_GPIO_PDDR_FBADH_PDDR6 (0x40) /* FB_AD30 */ -+#define MCF_GPIO_PDDR_FBADH_PDDR7 (0x80) /* FB_AD31 */ -+ -+/* Bit definitions and macros for PDDR_FBADMH */ -+#define MCF_GPIO_PDDR_FBADMH_PDDR0 (0x01) /* FB_AD16 */ -+#define MCF_GPIO_PDDR_FBADMH_PDDR1 (0x02) /* FB_AD17 */ -+#define MCF_GPIO_PDDR_FBADMH_PDDR2 (0x04) /* FB_AD18 */ -+#define MCF_GPIO_PDDR_FBADMH_PDDR3 (0x08) /* FB_AD19 */ -+#define MCF_GPIO_PDDR_FBADMH_PDDR4 (0x10) /* FB_AD20 */ -+#define MCF_GPIO_PDDR_FBADMH_PDDR5 (0x20) /* FB_AD21 */ -+#define MCF_GPIO_PDDR_FBADMH_PDDR6 (0x40) /* FB_AD22 */ -+#define MCF_GPIO_PDDR_FBADMH_PDDR7 (0x80) /* FB_AD23 */ -+ -+/* Bit definitions and macros for PDDR_FBADML */ -+#define MCF_GPIO_PDDR_FBADML_PDDR0 (0x01) /* FB_AD8 */ -+#define MCF_GPIO_PDDR_FBADML_PDDR1 (0x02) /* FB_AD9 */ -+#define MCF_GPIO_PDDR_FBADML_PDDR2 (0x04) /* FB_AD10 */ -+#define MCF_GPIO_PDDR_FBADML_PDDR3 (0x08) /* FB_AD11 */ -+#define MCF_GPIO_PDDR_FBADML_PDDR4 (0x10) /* FB_AD12 */ -+#define MCF_GPIO_PDDR_FBADML_PDDR5 (0x20) /* FB_AD13 */ -+#define MCF_GPIO_PDDR_FBADML_PDDR6 (0x40) /* FB_AD14 */ -+#define MCF_GPIO_PDDR_FBADML_PDDR7 (0x80) /* FB_AD15 */ -+ -+/* Bit definitions and macros for PDDR_FBADL */ -+#define MCF_GPIO_PDDR_FBADL_PDDR0 (0x01) /* FB_AD0 */ -+#define MCF_GPIO_PDDR_FBADL_PDDR1 (0x02) /* FB_AD1 */ -+#define MCF_GPIO_PDDR_FBADL_PDDR2 (0x04) /* FB_AD2 */ -+#define MCF_GPIO_PDDR_FBADL_PDDR3 (0x08) /* FB_AD3 */ -+#define MCF_GPIO_PDDR_FBADL_PDDR4 (0x10) /* FB_AD4 */ -+#define MCF_GPIO_PDDR_FBADL_PDDR5 (0x20) /* FB_AD5 */ -+#define MCF_GPIO_PDDR_FBADL_PDDR6 (0x40) /* FB_AD6 */ -+#define MCF_GPIO_PDDR_FBADL_PDDR7 (0x80) /* FB_AD7 */ -+ -+/* Bit definitions and macros for PPDSDR_FEC0H */ -+#define MCF_GPIO_PPDSDR_FEC0H_PPDR0 (0x01) /* FEC0_CRS / ULPI_DATA6 */ -+#define MCF_GPIO_PPDSDR_FEC0H_PPDR1 (0x02) /* FEC0_RXD0 / FEC0_RMII_RXD0 */ -+#define MCF_GPIO_PPDSDR_FEC0H_PPDR2 (0x04) /* FEC0_RXDV / FEC0_RMII_CRS_DV */ -+#define MCF_GPIO_PPDSDR_FEC0H_PPDR3 (0x08) /* FEC0_RXCLK / ULPI_DATA1 */ -+#define MCF_GPIO_PPDSDR_FEC0H_PPDR4 (0x10) /* FEC0_COL / ULPI_DATA7 */ -+#define MCF_GPIO_PPDSDR_FEC0H_PPDR5 (0x20) /* FEC0_TXD0 / FEC0_RMII_TXD0 */ -+#define MCF_GPIO_PPDSDR_FEC0H_PPDR6 (0x40) /* FEC0_TXEN / FEC0_RMII_TXEN */ -+#define MCF_GPIO_PPDSDR_FEC0H_PPDR7 (0x80) /* FEC0_TXCLK / FEC0_RMII_REF_CLK */ -+ -+/* Bit definitions and macros for PPDSDR_FEC0L */ -+#define MCF_GPIO_PPDSDR_FEC0L_PCLRR0 (0x01) /* FEC0_RXER / FEC0_RMII_RXER */ -+#define MCF_GPIO_PPDSDR_FEC0L_PCLRR1 (0x02) /* FEC0_RXD1 / FEC0_RMII_RXD1 */ -+#define MCF_GPIO_PPDSDR_FEC0L_PCLRR2 (0x04) /* FEC0_RXD2 / ULPI_DATA4 */ -+#define MCF_GPIO_PPDSDR_FEC0L_PCLRR3 (0x08) /* FEC0_RXD3 / ULPI_DATA5 */ -+#define MCF_GPIO_PPDSDR_FEC0L_PCLRR4 (0x10) /* FEC0_TXER / ULPI_DATA0 */ -+#define MCF_GPIO_PPDSDR_FEC0L_PCLRR5 (0x20) /* FEC0_TXD1 / FEC0_RMII_TXD1 */ -+#define MCF_GPIO_PPDSDR_FEC0L_PCLRR6 (0x40) /* FEC0_TXD2 / ULPI_DATA2 */ -+#define MCF_GPIO_PPDSDR_FEC0L_PCLRR7 (0x80) /* FEC0_TXD3 / ULPI_DATA3 */ -+ -+/* Bit definitions and macros for PPDSDR_SSI */ -+#define MCF_GPIO_PPDSDR_SSI_PPDR0 (0x01) /* SSI_TXD / U1TXD */ -+#define MCF_GPIO_PPDSDR_SSI_PPDR1 (0x02) /* SSI_RXD / U1RXD */ -+#define MCF_GPIO_PPDSDR_SSI_PPDR2 (0x04) /* SSI_FS / U1RTS */ -+#define MCF_GPIO_PPDSDR_SSI_PPDR3 (0x08) /* SSI_BCLK / U1CTS */ -+#define MCF_GPIO_PPDSDR_SSI_PPDR4 (0x10) /* SSI_MCLK */ -+ -+/* Bit definitions and macros for PPDSDR_FBCTL */ -+#define MCF_GPIO_PPDSDR_FBCTL_PPDR0 (0x01) /* FB_TS / FB_ALE / FB_TBST */ -+#define MCF_GPIO_PPDSDR_FBCTL_PPDR1 (0x02) /* FB_RW */ -+#define MCF_GPIO_PPDSDR_FBCTL_PPDR2 (0x04) /* FB_TA */ -+#define MCF_GPIO_PPDSDR_FBCTL_PPDR3 (0x08) /* FB_OE */ -+ -+/* Bit definitions and macros for PPDSDR_BE */ -+#define MCF_GPIO_PPDSDR_BE_PPDR0 (0x01) /* FB_BE/BWE0 / FB_SIZ0 */ -+#define MCF_GPIO_PPDSDR_BE_PPDR1 (0x02) /* FB_BE/BWE1 / FB_SIZ1 */ -+#define MCF_GPIO_PPDSDR_BE_PPDR2 (0x04) /* FB_BE/BWE2 / FB_SIZ2 */ -+#define MCF_GPIO_PPDSDR_BE_PPDR3 (0x08) /* FB_BE/BWE3 / FB_SIZ3 */ -+ -+/* Bit definitions and macros for PPDSDR_CS */ -+#define MCF_GPIO_PPDSDR_CS_PPDR1 (0x02) /* FB_CS1 */ -+#define MCF_GPIO_PPDSDR_CS_PPDR2 (0x04) /* FB_CS2 */ -+#define MCF_GPIO_PPDSDR_CS_PPDR3 (0x08) /* FB_CS3 */ -+ -+/* Bit definitions and macros for PPDSDR_DMA */ -+#define MCF_GPIO_PPDSDR_DMA_PPDR0 (0x01) /* DREQ0 */ -+#define MCF_GPIO_PPDSDR_DMA_PPDR1 (0x02) /* DACK0 / DSPI_PCS3 */ -+#define MCF_GPIO_PPDSDR_DMA_PPDR2 (0x04) /* DREQ1 / USB_CLKIN */ -+#define MCF_GPIO_PPDSDR_DMA_PPDR3 (0x08) /* DACK1 / ULPI_DIR */ -+ -+/* Bit definitions and macros for PPDSDR_FECI2C */ -+#define MCF_GPIO_PPDSDR_FECI2C_PPDR0 (0x01) /* I2C_SDA / U2RXD */ -+#define MCF_GPIO_PPDSDR_FECI2C_PPDR1 (0x02) /* I2C_SCL / U2TXD */ -+#define MCF_GPIO_PPDSDR_FECI2C_PPDR2 (0x04) /* FEC0_MDIO */ -+#define MCF_GPIO_PPDSDR_FECI2C_PPDR3 (0x08) /* FEC0_MDC */ -+#define MCF_GPIO_PPDSDR_FECI2C_PPDR4 (0x10) /* FEC1_MDIO / ATA_DIOW */ -+#define MCF_GPIO_PPDSDR_FECI2C_PPDR5 (0x20) /* FEC1_MDC / ATA_DIOR */ -+ -+/* Bit definitions and macros for PPDSDR_UART */ -+#define MCF_GPIO_PPDSDR_UART_PPDR0 (0x01) /* U1TXD */ -+#define MCF_GPIO_PPDSDR_UART_PPDR1 (0x02) /* U1RXD */ -+#define MCF_GPIO_PPDSDR_UART_PPDR2 (0x04) /* U1RTS */ -+#define MCF_GPIO_PPDSDR_UART_PPDR3 (0x08) /* U0CTS */ -+#define MCF_GPIO_PPDSDR_UART_PPDR4 (0x10) /* U1TXD */ -+#define MCF_GPIO_PPDSDR_UART_PPDR5 (0x20) /* U1RXD */ -+#define MCF_GPIO_PPDSDR_UART_PPDR6 (0x40) /* U1RTS */ -+#define MCF_GPIO_PPDSDR_UART_PPDR7 (0x80) /* U1CTS */ -+ -+/* Bit definitions and macros for PPDSDR_DSPI */ -+#define MCF_GPIO_PPDSDR_DSPI_PPDR0 (0x01) /* DSPI_SOUT / SBF_DO */ -+#define MCF_GPIO_PPDSDR_DSPI_PPDR1 (0x02) /* DSPI_SIN / SBF_DI */ -+#define MCF_GPIO_PPDSDR_DSPI_PPDR2 (0x04) /* DSPI_SCK / SBF_CK */ -+#define MCF_GPIO_PPDSDR_DSPI_PPDR3 (0x08) /* DSPI_PCS0/SS */ -+#define MCF_GPIO_PPDSDR_DSPI_PPDR4 (0x10) /* DSPI_PCS1 / SBF_CS */ -+#define MCF_GPIO_PPDSDR_DSPI_PPDR5 (0x20) /* DSPI_PCS2 */ -+#define MCF_GPIO_PPDSDR_DSPI_PPDR6 (0x40) /* DSPI_PCS5/SS */ -+ -+/* Bit definitions and macros for PPDSDR_TIMER */ -+#define MCF_GPIO_PPDSDR_TIMER_PPDR0 (0x01) /* T0IN / T0OUT / U2RTS */ -+#define MCF_GPIO_PPDSDR_TIMER_PPDR1 (0x02) /* T1IN / T1OUT / U2CTS */ -+#define MCF_GPIO_PPDSDR_TIMER_PPDR2 (0x04) /* T2IN / T2OUT / U2TXD */ -+#define MCF_GPIO_PPDSDR_TIMER_PPDR3 (0x08) /* T3IN / T3OUT / U2RXD */ -+ -+/* Bit definitions and macros for PPDSDR_PCI */ -+#define MCF_GPIO_PPDSDR_PCI_PPDR0 (0x01) /* PCI_REQ0/PCI_EXTGNT */ -+#define MCF_GPIO_PPDSDR_PCI_PPDR1 (0x02) /* PCI_REQ1 */ -+#define MCF_GPIO_PPDSDR_PCI_PPDR2 (0x04) /* PCI_REQ2 */ -+#define MCF_GPIO_PPDSDR_PCI_PPDR3 (0x08) /* PCI_REQ3 / ATA_INTR */ -+#define MCF_GPIO_PPDSDR_PCI_PPDR4 (0x10) /* PCI_GNT0/PCI_EXTREQ */ -+#define MCF_GPIO_PPDSDR_PCI_PPDR5 (0x20) /* PCI_GNT1 / */ -+#define MCF_GPIO_PPDSDR_PCI_PPDR6 (0x40) /* PCI_GNT2 / */ -+#define MCF_GPIO_PPDSDR_PCI_PPDR7 (0x80) /* PCI_GNT3 / ATA_DMACK */ -+ -+/* Bit definitions and macros for PPDSDR_USB */ -+#define MCF_GPIO_PPDSDR_USB_PPDR0 (0x01) /* USB_VBUS_OC / ULPI_STP */ -+#define MCF_GPIO_PPDSDR_USB_PPDR1 (0x02) /* USB_VBUS_EN / USB_PULLUP / ULPI_NXT */ -+ -+/* Bit definitions and macros for PPDSDR_ATAH */ -+#define MCF_GPIO_PPDSDR_ATAH_PPDR0 (0x01) /* ATA_DA0 */ -+#define MCF_GPIO_PPDSDR_ATAH_PPDR1 (0x02) /* ATA_DA1 */ -+#define MCF_GPIO_PPDSDR_ATAH_PPDR2 (0x04) /* ATA_DA2 */ -+#define MCF_GPIO_PPDSDR_ATAH_PPDR3 (0x08) /* ATA_CS0 */ -+#define MCF_GPIO_PPDSDR_ATAH_PPDR4 (0x10) /* ATA_CS1 */ -+#define MCF_GPIO_PPDSDR_ATAH_PPDR5 (0x20) /* ATA_BUFFER_EN */ -+ -+/* Bit definitions and macros for PPDSDR_ATAL */ -+#define MCF_GPIO_PPDSDR_ATAL_PPDR0 (0x01) /* ATA_IORDY */ -+#define MCF_GPIO_PPDSDR_ATAL_PPDR1 (0x02) /* ATA_DMARQ */ -+#define MCF_GPIO_PPDSDR_ATAL_PPDR2 (0x04) /* ATA_RESET */ -+ -+/* Bit definitions and macros for PPDSDR_FEC1H */ -+#define MCF_GPIO_PPDSDR_FEC1H_PPDR0 (0x01) /* FEC1_CRS / ATA_DATA6 */ -+#define MCF_GPIO_PPDSDR_FEC1H_PPDR1 (0x02) /* FEC1_RXD0 / FEC1_RMII_RXD0 / ATA_DATA13 */ -+#define MCF_GPIO_PPDSDR_FEC1H_PPDR2 (0x04) /* FEC1_RXDV / FEC1_RMII_CRS_DV / ATA_DATA15 */ -+#define MCF_GPIO_PPDSDR_FEC1H_PPDR3 (0x08) /* FEC1_RXCLK / ATA_DATA5 */ -+#define MCF_GPIO_PPDSDR_FEC1H_PPDR4 (0x10) /* FEC1_COL / ATA_DATA7 */ -+#define MCF_GPIO_PPDSDR_FEC1H_PPDR5 (0x20) /* FEC1_TXD0 / FEC1_RMII_TXD0 / ATA_DATA9 */ -+#define MCF_GPIO_PPDSDR_FEC1H_PPDR6 (0x40) /* FEC1_TXEN / FEC1_RMII_TXEN / ATA_DATA8 */ -+#define MCF_GPIO_PPDSDR_FEC1H_PPDR7 (0x80) /* FEC1_TXCLK / FEC1_RMII_REF_CLK / ATA_DATA11 */ -+ -+/* Bit definitions and macros for PPDSDR_FEC1L */ -+#define MCF_GPIO_PPDSDR_FEC1L_PPDR0 (0x01) /* FEC1_RXER / FEC1_RMII_RXER / ATA_DATA12 */ -+#define MCF_GPIO_PPDSDR_FEC1L_PPDR1 (0x02) /* FEC1_RXD1 / FEC1_RMII_RXD1 / ATA_DATA14 */ -+#define MCF_GPIO_PPDSDR_FEC1L_PPDR2 (0x04) /* FEC1_RXD2 / ATA_DATA3 */ -+#define MCF_GPIO_PPDSDR_FEC1L_PPDR3 (0x08) /* FEC1_RXD3 / ATA_DATA4 */ -+#define MCF_GPIO_PPDSDR_FEC1L_PPDR4 (0x10) /* FEC1_TXER / ATA_DATA0 */ -+#define MCF_GPIO_PPDSDR_FEC1L_PPDR5 (0x20) /* FEC1_TXD1 / FEC1_RMII_TXD1 / ATA_DATA10 */ -+#define MCF_GPIO_PPDSDR_FEC1L_PPDR6 (0x40) /* FEC1_TXD2 / ATA_DATA1 */ -+#define MCF_GPIO_PPDSDR_FEC1L_PPDR7 (0x80) /* FEC1_TXD3 / ATA_DATA2 */ -+ -+/* Bit definitions and macros for PPDSDR_FBADH */ -+#define MCF_GPIO_PPDSDR_FBADH_PPDR0 (0x01) /* FB_AD24 */ -+#define MCF_GPIO_PPDSDR_FBADH_PPDR1 (0x02) /* FB_AD25 */ -+#define MCF_GPIO_PPDSDR_FBADH_PPDR2 (0x04) /* FB_AD26 */ -+#define MCF_GPIO_PPDSDR_FBADH_PPDR3 (0x08) /* FB_AD27 */ -+#define MCF_GPIO_PPDSDR_FBADH_PPDR4 (0x10) /* FB_AD28 */ -+#define MCF_GPIO_PPDSDR_FBADH_PPDR5 (0x20) /* FB_AD29 */ -+#define MCF_GPIO_PPDSDR_FBADH_PPDR6 (0x40) /* FB_AD30 */ -+#define MCF_GPIO_PPDSDR_FBADH_PPDR7 (0x80) /* FB_AD31 */ -+ -+/* Bit definitions and macros for PPDSDR_FBADMH */ -+#define MCF_GPIO_PPDSDR_FBADMH_PPDR0 (0x01) /* FB_AD16 */ -+#define MCF_GPIO_PPDSDR_FBADMH_PPDR1 (0x02) /* FB_AD17 */ -+#define MCF_GPIO_PPDSDR_FBADMH_PPDR2 (0x04) /* FB_AD18 */ -+#define MCF_GPIO_PPDSDR_FBADMH_PPDR3 (0x08) /* FB_AD19 */ -+#define MCF_GPIO_PPDSDR_FBADMH_PPDR4 (0x10) /* FB_AD20 */ -+#define MCF_GPIO_PPDSDR_FBADMH_PPDR5 (0x20) /* FB_AD21 */ -+#define MCF_GPIO_PPDSDR_FBADMH_PPDR6 (0x40) /* FB_AD22 */ -+#define MCF_GPIO_PPDSDR_FBADMH_PPDR7 (0x80) /* FB_AD23 */ -+ -+/* Bit definitions and macros for PPDSDR_FBADML */ -+#define MCF_GPIO_PPDSDR_FBADML_PPDR0 (0x01) /* FB_AD8 */ -+#define MCF_GPIO_PPDSDR_FBADML_PPDR1 (0x02) /* FB_AD9 */ -+#define MCF_GPIO_PPDSDR_FBADML_PPDR2 (0x04) /* FB_AD10 */ -+#define MCF_GPIO_PPDSDR_FBADML_PPDR3 (0x08) /* FB_AD11 */ -+#define MCF_GPIO_PPDSDR_FBADML_PPDR4 (0x10) /* FB_AD12 */ -+#define MCF_GPIO_PPDSDR_FBADML_PPDR5 (0x20) /* FB_AD13 */ -+#define MCF_GPIO_PPDSDR_FBADML_PPDR6 (0x40) /* FB_AD14 */ -+#define MCF_GPIO_PPDSDR_FBADML_PPDR7 (0x80) /* FB_AD15 */ -+ -+/* Bit definitions and macros for PPDSDR_FBADL */ -+#define MCF_GPIO_PPDSDR_FBADL_PPDR0 (0x01) /* FB_AD0 */ -+#define MCF_GPIO_PPDSDR_FBADL_PPDR1 (0x02) /* FB_AD1 */ -+#define MCF_GPIO_PPDSDR_FBADL_PPDR2 (0x04) /* FB_AD2 */ -+#define MCF_GPIO_PPDSDR_FBADL_PPDR3 (0x08) /* FB_AD3 */ -+#define MCF_GPIO_PPDSDR_FBADL_PPDR4 (0x10) /* FB_AD4 */ -+#define MCF_GPIO_PPDSDR_FBADL_PPDR5 (0x20) /* FB_AD5 */ -+#define MCF_GPIO_PPDSDR_FBADL_PPDR6 (0x40) /* FB_AD6 */ -+#define MCF_GPIO_PPDSDR_FBADL_PPDR7 (0x80) /* FB_AD7 */ -+ -+/* Bit definitions and macros for PCLRR_FEC0H */ -+#define MCF_GPIO_PCLRR_FEC0H_PCLRR0 (0x01) /* FEC0_CRS / ULPI_DATA6 */ -+#define MCF_GPIO_PCLRR_FEC0H_PCLRR1 (0x02) /* FEC0_RXD0 / FEC0_RMII_RXD0 */ -+#define MCF_GPIO_PCLRR_FEC0H_PCLRR2 (0x04) /* FEC0_RXDV/FEC0_RMII_CRS_DV */ -+#define MCF_GPIO_PCLRR_FEC0H_PCLRR3 (0x08) /* FEC0_RXCLK / ULPI_DATA1 */ -+#define MCF_GPIO_PCLRR_FEC0H_PCLRR4 (0x10) /* FEC0_COL / ULPI_DATA7 */ -+#define MCF_GPIO_PCLRR_FEC0H_PCLRR5 (0x20) /* FEC0_TXD0 / FEC0_RMII_TXD0 */ -+#define MCF_GPIO_PCLRR_FEC0H_PCLRR6 (0x40) /* FEC0_TXEN / FEC0_RMII_TXEN */ -+#define MCF_GPIO_PCLRR_FEC0H_PCLRR7 (0x80) /* FEC0_TXCLK / FEC0_RMII_REF_CLK */ -+ -+/* Bit definitions and macros for PCLRR_FEC0L */ -+#define MCF_GPIO_PCLRR_FEC0L_PPDR0 (0x01) /* FEC0_RXER / FEC0_RMII_RXER */ -+#define MCF_GPIO_PCLRR_FEC0L_PPDR1 (0x02) /* FEC0_RXD1 / FEC0_RMII_RXD1 */ -+#define MCF_GPIO_PCLRR_FEC0L_PPDR2 (0x04) /* FEC0_RXD2 / ULPI_DATA4 */ -+#define MCF_GPIO_PCLRR_FEC0L_PPDR3 (0x08) /* FEC0_RXD3 / ULPI_DATA5 */ -+#define MCF_GPIO_PCLRR_FEC0L_PPDR4 (0x10) /* FEC0_TXER / ULPI_DATA0 */ -+#define MCF_GPIO_PCLRR_FEC0L_PPDR5 (0x20) /* FEC0_TXD1 / FEC0_RMII_TXD1 */ -+#define MCF_GPIO_PCLRR_FEC0L_PPDR6 (0x40) /* FEC0_TXD2 / ULPI_DATA2 */ -+#define MCF_GPIO_PCLRR_FEC0L_PPDR7 (0x80) /* FEC0_TXD3 / ULPI_DATA3 */ -+ -+/* Bit definitions and macros for PCLRR_SSI */ -+#define MCF_GPIO_PCLRR_SSI_PCLRR0 (0x01) /* SSI_TXD / U1TXD */ -+#define MCF_GPIO_PCLRR_SSI_PCLRR1 (0x02) /* SSI_RXD / U1RXD */ -+#define MCF_GPIO_PCLRR_SSI_PCLRR2 (0x04) /* SSI_FS / U1RTS */ -+#define MCF_GPIO_PCLRR_SSI_PCLRR3 (0x08) /* SSI_BCLK / U1CTS */ -+#define MCF_GPIO_PCLRR_SSI_PCLRR4 (0x10) /* SSI_MCLK */ -+ -+/* Bit definitions and macros for PCLRR_FBCTL */ -+#define MCF_GPIO_PCLRR_FBCTL_PCLRR0 (0x01) /* FB_TS / FB_ALE / FB_TBST */ -+#define MCF_GPIO_PCLRR_FBCTL_PCLRR1 (0x02) /* FB_RW */ -+#define MCF_GPIO_PCLRR_FBCTL_PCLRR2 (0x04) /* FB_TA */ -+#define MCF_GPIO_PCLRR_FBCTL_PCLRR3 (0x08) /* FB_OE */ -+ -+/* Bit definitions and macros for PCLRR_BE */ -+#define MCF_GPIO_PCLRR_BE_PCLRR0 (0x01) /* FB_BE/BWE0 / FB_SIZ0 */ -+#define MCF_GPIO_PCLRR_BE_PCLRR1 (0x02) /* FB_BE/BWE1 / FB_SIZ1 */ -+#define MCF_GPIO_PCLRR_BE_PCLRR2 (0x04) /* FB_BE/BWE2 / FB_SIZ2 */ -+#define MCF_GPIO_PCLRR_BE_PCLRR3 (0x08) /* FB_BE/BWE3 / FB_SIZ3 */ -+ -+/* Bit definitions and macros for PCLRR_CS */ -+#define MCF_GPIO_PCLRR_CS_PCLRR1 (0x02) /* FB_CS1 */ -+#define MCF_GPIO_PCLRR_CS_PCLRR2 (0x04) /* FB_CS2 */ -+#define MCF_GPIO_PCLRR_CS_PCLRR3 (0x08) /* FB_CS3 */ -+ -+/* Bit definitions and macros for PCLRR_DMA */ -+#define MCF_GPIO_PCLRR_DMA_PCLRR0 (0x01) /* DREQ0 */ -+#define MCF_GPIO_PCLRR_DMA_PCLRR1 (0x02) /* DACK0 / DSPI_PCS3 */ -+#define MCF_GPIO_PCLRR_DMA_PCLRR2 (0x04) /* DREQ1 / USB_CLKIN */ -+#define MCF_GPIO_PCLRR_DMA_PCLRR3 (0x08) /* DACK1 / ULPI_DIR */ -+ -+/* Bit definitions and macros for PCLRR_FECI2C */ -+#define MCF_GPIO_PCLRR_FECI2C_PCLRR0 (0x01) /* I2C_SDA / U2RXD */ -+#define MCF_GPIO_PCLRR_FECI2C_PCLRR1 (0x02) /* I2C_SCL / U2TXD */ -+#define MCF_GPIO_PCLRR_FECI2C_PCLRR2 (0x04) /* FEC0_MDIO */ -+#define MCF_GPIO_PCLRR_FECI2C_PCLRR3 (0x08) /* FEC0_MDC */ -+#define MCF_GPIO_PCLRR_FECI2C_PCLRR4 (0x10) /* FEC1_MDIO / ATA_DIOW */ -+#define MCF_GPIO_PCLRR_FECI2C_PCLRR5 (0x20) /* FEC1_MDC / ATA_DIOR */ -+ -+/* Bit definitions and macros for PCLRR_UART */ -+#define MCF_GPIO_PCLRR_UART_PCLRR0 (0x01) /* U1TXD */ -+#define MCF_GPIO_PCLRR_UART_PCLRR1 (0x02) /* U1RXD */ -+#define MCF_GPIO_PCLRR_UART_PCLRR2 (0x04) /* U1RTS */ -+#define MCF_GPIO_PCLRR_UART_PCLRR3 (0x08) /* U0CTS */ -+#define MCF_GPIO_PCLRR_UART_PCLRR4 (0x10) /* U1TXD */ -+#define MCF_GPIO_PCLRR_UART_PCLRR5 (0x20) /* U1RXD */ -+#define MCF_GPIO_PCLRR_UART_PCLRR6 (0x40) /* U1RTS */ -+#define MCF_GPIO_PCLRR_UART_PCLRR7 (0x80) /* U1CTS */ -+ -+/* Bit definitions and macros for PCLRR_DSPI */ -+#define MCF_GPIO_PCLRR_DSPI_PCLRR0 (0x01) /* DSPI_SOUT / SBF_DO */ -+#define MCF_GPIO_PCLRR_DSPI_PCLRR1 (0x02) /* DSPI_SIN / SBF_DI */ -+#define MCF_GPIO_PCLRR_DSPI_PCLRR2 (0x04) /* DSPI_SCK / SBF_CK */ -+#define MCF_GPIO_PCLRR_DSPI_PCLRR3 (0x08) /* DSPI_PCS0/SS */ -+#define MCF_GPIO_PCLRR_DSPI_PCLRR4 (0x10) /* DSPI_PCS1 / SBF_CS */ -+#define MCF_GPIO_PCLRR_DSPI_PCLRR5 (0x20) /* DSPI_PCS2 */ -+#define MCF_GPIO_PCLRR_DSPI_PCLRR6 (0x40) /* DSPI_PCS5/SS */ -+ -+/* Bit definitions and macros for PCLRR_TIMER */ -+#define MCF_GPIO_PCLRR_TIMER_PCLRR0 (0x01) /* T0IN / T0OUT / U2RTS */ -+#define MCF_GPIO_PCLRR_TIMER_PCLRR1 (0x02) /* T1IN / T1OUT / U2CTS */ -+#define MCF_GPIO_PCLRR_TIMER_PCLRR2 (0x04) /* T2IN / T2OUT / U2TXD */ -+#define MCF_GPIO_PCLRR_TIMER_PCLRR3 (0x08) /* T3IN / T3OUT / U2RXD */ -+ -+/* Bit definitions and macros for PCLRR_PCI */ -+#define MCF_GPIO_PCLRR_PCI_PCLRR0 (0x01) /* PCI_REQ0/PCI_EXTGNT */ -+#define MCF_GPIO_PCLRR_PCI_PCLRR1 (0x02) /* PCI_REQ1 */ -+#define MCF_GPIO_PCLRR_PCI_PCLRR2 (0x04) /* PCI_REQ2 */ -+#define MCF_GPIO_PCLRR_PCI_PCLRR3 (0x08) /* PCI_REQ3 / ATA_INTR */ -+#define MCF_GPIO_PCLRR_PCI_PCLRR4 (0x10) /* PCI_GNT0/PCI_EXTREQ */ -+#define MCF_GPIO_PCLRR_PCI_PCLRR5 (0x20) /* PCI_GNT1 / */ -+#define MCF_GPIO_PCLRR_PCI_PCLRR6 (0x40) /* PCI_GNT2 / */ -+#define MCF_GPIO_PCLRR_PCI_PCLRR7 (0x80) /* PCI_GNT3 / ATA_DMACK */ -+ -+/* Bit definitions and macros for PCLRR_USB */ -+#define MCF_GPIO_PCLRR_USB_PCLRR0 (0x01) /* USB_VBUS_OC / ULPI_STP */ -+#define MCF_GPIO_PCLRR_USB_PCLRR1 (0x02) /* USB_VBUS_EN / USB_PULLUP / ULPI_NXT */ -+ -+/* Bit definitions and macros for PCLRR_ATAH */ -+#define MCF_GPIO_PCLRR_ATAH_PCLRR0 (0x01) /* ATA_DA0 */ -+#define MCF_GPIO_PCLRR_ATAH_PCLRR1 (0x02) /* ATA_DA1 */ -+#define MCF_GPIO_PCLRR_ATAH_PCLRR2 (0x04) /* ATA_DA2 */ -+#define MCF_GPIO_PCLRR_ATAH_PCLRR3 (0x08) /* ATA_CS0 */ -+#define MCF_GPIO_PCLRR_ATAH_PCLRR4 (0x10) /* ATA_CS1 */ -+#define MCF_GPIO_PCLRR_ATAH_PCLRR5 (0x20) /* ATA_BUFFER_EN */ -+ -+/* Bit definitions and macros for PCLRR_ATAL */ -+#define MCF_GPIO_PCLRR_ATAL_PCLRR0 (0x01) /* ATA_IORDY */ -+#define MCF_GPIO_PCLRR_ATAL_PCLRR1 (0x02) /* ATA_DMARQ */ -+#define MCF_GPIO_PCLRR_ATAL_PCLRR2 (0x04) /* ATA_RESET */ -+ -+/* Bit definitions and macros for PCLRR_FEC1H */ -+#define MCF_GPIO_PCLRR_FEC1H_PCLRR0 (0x01) /* FEC1_CRS / ATA_DATA6 */ -+#define MCF_GPIO_PCLRR_FEC1H_PCLRR1 (0x02) /* FEC1_RXD0 / FEC1_RMII_RXD0 / ATA_DATA13 */ -+#define MCF_GPIO_PCLRR_FEC1H_PCLRR2 (0x04) /* FEC1_RXDV / FEC1_RMII_CRS_DV / ATA_DATA15 */ -+#define MCF_GPIO_PCLRR_FEC1H_PCLRR3 (0x08) /* FEC1_RXCLK / ATA_DATA5 */ -+#define MCF_GPIO_PCLRR_FEC1H_PCLRR4 (0x10) /* FEC1_COL / ATA_DATA7 */ -+#define MCF_GPIO_PCLRR_FEC1H_PCLRR5 (0x20) /* FEC1_TXD0 / FEC1_RMII_TXD0 / ATA_DATA9 */ -+#define MCF_GPIO_PCLRR_FEC1H_PCLRR6 (0x40) /* FEC1_TXEN / FEC1_RMII_TXEN / ATA_DATA8 */ -+#define MCF_GPIO_PCLRR_FEC1H_PCLRR7 (0x80) /* FEC1_TXCLK / FEC1_RMII_REF_CLK / ATA_DATA11 */ -+ -+/* Bit definitions and macros for PCLRR_FEC1L */ -+#define MCF_GPIO_PCLRR_FEC1L_PCLRR0 (0x01) /* FEC1_RXER / FEC1_RMII_RXER / ATA_DATA12 */ -+#define MCF_GPIO_PCLRR_FEC1L_PCLRR1 (0x02) /* FEC1_RXD1 / FEC1_RMII_RXD1 / ATA_DATA14 */ -+#define MCF_GPIO_PCLRR_FEC1L_PCLRR2 (0x04) /* FEC1_RXD2 / ATA_DATA3 */ -+#define MCF_GPIO_PCLRR_FEC1L_PCLRR3 (0x08) /* FEC1_RXD3 / ATA_DATA4 */ -+#define MCF_GPIO_PCLRR_FEC1L_PCLRR4 (0x10) /* FEC1_TXER / ATA_DATA0 */ -+#define MCF_GPIO_PCLRR_FEC1L_PCLRR5 (0x20) /* FEC1_TXD1 / FEC1_RMII_TXD1 / ATA_DATA10 */ -+#define MCF_GPIO_PCLRR_FEC1L_PCLRR6 (0x40) /* FEC1_TXD2 / ATA_DATA1 */ -+#define MCF_GPIO_PCLRR_FEC1L_PCLRR7 (0x80) /* FEC1_TXD3 / ATA_DATA2 */ -+ -+/* Bit definitions and macros for PCLRR_FBADH */ -+#define MCF_GPIO_PCLRR_FBADH_PCLRR0 (0x01) /* FB_AD24 */ -+#define MCF_GPIO_PCLRR_FBADH_PCLRR1 (0x02) /* FB_AD25 */ -+#define MCF_GPIO_PCLRR_FBADH_PCLRR2 (0x04) /* FB_AD26 */ -+#define MCF_GPIO_PCLRR_FBADH_PCLRR3 (0x08) /* FB_AD27 */ -+#define MCF_GPIO_PCLRR_FBADH_PCLRR4 (0x10) /* FB_AD28 */ -+#define MCF_GPIO_PCLRR_FBADH_PCLRR5 (0x20) /* FB_AD29 */ -+#define MCF_GPIO_PCLRR_FBADH_PCLRR6 (0x40) /* FB_AD30 */ -+#define MCF_GPIO_PCLRR_FBADH_PCLRR7 (0x80) /* FB_AD31 */ -+ -+/* Bit definitions and macros for PCLRR_FBADMH */ -+#define MCF_GPIO_PCLRR_FBADMH_PCLRR0 (0x01) /* FB_AD16 */ -+#define MCF_GPIO_PCLRR_FBADMH_PCLRR1 (0x02) /* FB_AD17 */ -+#define MCF_GPIO_PCLRR_FBADMH_PCLRR2 (0x04) /* FB_AD18 */ -+#define MCF_GPIO_PCLRR_FBADMH_PCLRR3 (0x08) /* FB_AD19 */ -+#define MCF_GPIO_PCLRR_FBADMH_PCLRR4 (0x10) /* FB_AD20 */ -+#define MCF_GPIO_PCLRR_FBADMH_PCLRR5 (0x20) /* FB_AD21 */ -+#define MCF_GPIO_PCLRR_FBADMH_PCLRR6 (0x40) /* FB_AD22 */ -+#define MCF_GPIO_PCLRR_FBADMH_PCLRR7 (0x80) /* FB_AD23 */ -+ -+/* Bit definitions and macros for PCLRR_FBADML */ -+#define MCF_GPIO_PCLRR_FBADML_PCLRR0 (0x01) /* FB_AD8 */ -+#define MCF_GPIO_PCLRR_FBADML_PCLRR1 (0x02) /* FB_AD9 */ -+#define MCF_GPIO_PCLRR_FBADML_PCLRR2 (0x04) /* FB_AD10 */ -+#define MCF_GPIO_PCLRR_FBADML_PCLRR3 (0x08) /* FB_AD11 */ -+#define MCF_GPIO_PCLRR_FBADML_PCLRR4 (0x10) /* FB_AD12 */ -+#define MCF_GPIO_PCLRR_FBADML_PCLRR5 (0x20) /* FB_AD13 */ -+#define MCF_GPIO_PCLRR_FBADML_PCLRR6 (0x40) /* FB_AD14 */ -+#define MCF_GPIO_PCLRR_FBADML_PCLRR7 (0x80) /* FB_AD15 */ -+ -+/* Bit definitions and macros for PCLRR_FBADL */ -+#define MCF_GPIO_PCLRR_FBADL_PCLRR0 (0x01) /* FB_AD0 */ -+#define MCF_GPIO_PCLRR_FBADL_PCLRR1 (0x02) /* FB_AD1 */ -+#define MCF_GPIO_PCLRR_FBADL_PCLRR2 (0x04) /* FB_AD2 */ -+#define MCF_GPIO_PCLRR_FBADL_PCLRR3 (0x08) /* FB_AD3 */ -+#define MCF_GPIO_PCLRR_FBADL_PCLRR4 (0x10) /* FB_AD4 */ -+#define MCF_GPIO_PCLRR_FBADL_PCLRR5 (0x20) /* FB_AD5 */ -+#define MCF_GPIO_PCLRR_FBADL_PCLRR6 (0x40) /* FB_AD6 */ -+#define MCF_GPIO_PCLRR_FBADL_PCLRR7 (0x80) /* FB_AD7 */ -+ -+/* Bit definitions and macros for PAR_FEC */ -+#define MCF_GPIO_PAR_FEC_FEC0(x) (((x)&0x07)) -+#define MCF_GPIO_PAR_FEC_FEC1(x) (((x)&0x07)<<4) -+#define MCF_GPIO_PAR_FEC_FEC1_MASK (0x8F) -+#define MCF_GPIO_PAR_FEC_FEC1_MII (0x70) -+#define MCF_GPIO_PAR_FEC_FEC1_RMII_GPIO (0x30) -+#define MCF_GPIO_PAR_FEC_FEC1_RMII_ATA (0x20) -+#define MCF_GPIO_PAR_FEC_FEC1_ATA (0x10) -+#define MCF_GPIO_PAR_FEC_FEC1_GPIO (0x00) -+#define MCF_GPIO_PAR_FEC_FEC0_MASK (0xF8) -+#define MCF_GPIO_PAR_FEC_FEC0_MII (0x07) -+#define MCF_GPIO_PAR_FEC_FEC0_RMII_GPIO (0x03) -+#define MCF_GPIO_PAR_FEC_FEC0_RMII_ULPI (0x02) -+#define MCF_GPIO_PAR_FEC_FEC0_ULPI (0x01) -+#define MCF_GPIO_PAR_FEC_FEC0_GPIO (0x00) -+ -+/* Bit definitions and macros for PAR_DMA */ -+#define MCF_GPIO_PAR_DMA_DREQ0 (0x01) -+#define MCF_GPIO_PAR_DMA_DACK0(x) (((x)&0x03)<<2) -+#define MCF_GPIO_PAR_DMA_DREQ1(x) (((x)&0x03)<<4) -+#define MCF_GPIO_PAR_DMA_DACK1(x) (((x)&0x03)<<6) -+#define MCF_GPIO_PAR_DMA_DACK1_MASK (0x3F) -+#define MCF_GPIO_PAR_DMA_DACK1_DACK1 (0xC0) -+#define MCF_GPIO_PAR_DMA_DACK1_ULPI_DIR (0x40) -+#define MCF_GPIO_PAR_DMA_DACK1_GPIO (0x00) -+#define MCF_GPIO_PAR_DMA_DREQ1_MASK (0xCF) -+#define MCF_GPIO_PAR_DMA_DREQ1_DREQ1 (0x30) -+#define MCF_GPIO_PAR_DMA_DREQ1_USB_CLKIN (0x10) -+#define MCF_GPIO_PAR_DMA_DREQ1_GPIO (0x00) -+#define MCF_GPIO_PAR_DMA_DACK0_MASK (0xF3) -+#define MCF_GPIO_PAR_DMA_DACK0_DACK1 (0x0C) -+#define MCF_GPIO_PAR_DMA_DACK0_ULPI_DIR (0x04) -+#define MCF_GPIO_PAR_DMA_DACK0_GPIO (0x00) -+#define MCF_GPIO_PAR_DMA_DREQ0_DREQ0 (0x01) -+#define MCF_GPIO_PAR_DMA_DREQ0_GPIO (0x00) -+ -+/* Bit definitions and macros for PAR_FBCTL */ -+#define MCF_GPIO_PAR_FBCTL_TS(x) (((x)&0x03)<<3) -+#define MCF_GPIO_PAR_FBCTL_RW (0x20) -+#define MCF_GPIO_PAR_FBCTL_TA (0x40) -+#define MCF_GPIO_PAR_FBCTL_OE (0x80) -+#define MCF_GPIO_PAR_FBCTL_OE_OE (0x80) -+#define MCF_GPIO_PAR_FBCTL_OE_GPIO (0x00) -+#define MCF_GPIO_PAR_FBCTL_TA_TA (0x40) -+#define MCF_GPIO_PAR_FBCTL_TA_GPIO (0x00) -+#define MCF_GPIO_PAR_FBCTL_RW_RW (0x20) -+#define MCF_GPIO_PAR_FBCTL_RW_GPIO (0x00) -+#define MCF_GPIO_PAR_FBCTL_TS_MASK (0xE7) -+#define MCF_GPIO_PAR_FBCTL_TS_TS (0x18) -+#define MCF_GPIO_PAR_FBCTL_TS_ALE (0x10) -+#define MCF_GPIO_PAR_FBCTL_TS_TBST (0x08) -+#define MCF_GPIO_PAR_FBCTL_TS_GPIO (0x80) -+ -+/* Bit definitions and macros for PAR_DSPI */ -+#define MCF_GPIO_PAR_DSPI_SCK (0x01) -+#define MCF_GPIO_PAR_DSPI_SOUT (0x02) -+#define MCF_GPIO_PAR_DSPI_SIN (0x04) -+#define MCF_GPIO_PAR_DSPI_PCS0 (0x08) -+#define MCF_GPIO_PAR_DSPI_PCS1 (0x10) -+#define MCF_GPIO_PAR_DSPI_PCS2 (0x20) -+#define MCF_GPIO_PAR_DSPI_PCS5 (0x40) -+#define MCF_GPIO_PAR_DSPI_PCS5_PCS5 (0x40) -+#define MCF_GPIO_PAR_DSPI_PCS5_GPIO (0x00) -+#define MCF_GPIO_PAR_DSPI_PCS2_PCS2 (0x20) -+#define MCF_GPIO_PAR_DSPI_PCS2_GPIO (0x00) -+#define MCF_GPIO_PAR_DSPI_PCS1_PCS1 (0x10) -+#define MCF_GPIO_PAR_DSPI_PCS1_GPIO (0x00) -+#define MCF_GPIO_PAR_DSPI_PCS0_PCS0 (0x08) -+#define MCF_GPIO_PAR_DSPI_PCS0_GPIO (0x00) -+#define MCF_GPIO_PAR_DSPI_SIN_SIN (0x04) -+#define MCF_GPIO_PAR_DSPI_SIN_GPIO (0x00) -+#define MCF_GPIO_PAR_DSPI_SOUT_SOUT (0x02) -+#define MCF_GPIO_PAR_DSPI_SOUT_GPIO (0x00) -+#define MCF_GPIO_PAR_DSPI_SCK_SCK (0x01) -+#define MCF_GPIO_PAR_DSPI_SCK_GPIO (0x00) -+ -+/* Bit definitions and macros for PAR_BE */ -+#define MCF_GPIO_PAR_BE_BE0 (0x01) -+#define MCF_GPIO_PAR_BE_BE1 (0x04) -+#define MCF_GPIO_PAR_BE_BE2(x) (((x)&0x03)<<4) -+#define MCF_GPIO_PAR_BE_BE3(x) (((x)&0x03)<<6) -+#define MCF_GPIO_PAR_BE_BE3_MASK (0x3F) -+#define MCF_GPIO_PAR_BE_BE3_BE3 (0xC0) -+#define MCF_GPIO_PAR_BE_BE3_TSIZ1 (0x80) -+#define MCF_GPIO_PAR_BE_BE3_GPIO (0x00) -+#define MCF_GPIO_PAR_BE_BE2_MASK (0xCF) -+#define MCF_GPIO_PAR_BE_BE2_BE2 (0x30) -+#define MCF_GPIO_PAR_BE_BE2_TSIZ0 (0x20) -+#define MCF_GPIO_PAR_BE_BE2_GPIO (0x00) -+#define MCF_GPIO_PAR_BE_BE1_BE1 (0x04) -+#define MCF_GPIO_PAR_BE_BE1_GPIO (0x00) -+#define MCF_GPIO_PAR_BE_BE0_BE0 (0x01) -+#define MCF_GPIO_PAR_BE_BE0_GPIO (0x00) -+ -+/* Bit definitions and macros for PAR_CS */ -+#define MCF_GPIO_PAR_CS_CS1 (0x02) -+#define MCF_GPIO_PAR_CS_CS2 (0x04) -+#define MCF_GPIO_PAR_CS_CS3 (0x08) -+#define MCF_GPIO_PAR_CS_CS3_CS3 (0x08) -+#define MCF_GPIO_PAR_CS_CS3_GPIO (0x00) -+#define MCF_GPIO_PAR_CS_CS2_CS2 (0x04) -+#define MCF_GPIO_PAR_CS_CS2_GPIO (0x00) -+#define MCF_GPIO_PAR_CS_CS1_CS1 (0x02) -+#define MCF_GPIO_PAR_CS_CS1_GPIO (0x00) -+ -+/* Bit definitions and macros for PAR_TIMER */ -+#define MCF_GPIO_PAR_TIMER_T0IN(x) (((x)&0x03)) -+#define MCF_GPIO_PAR_TIMER_T1IN(x) (((x)&0x03)<<2) -+#define MCF_GPIO_PAR_TIMER_T2IN(x) (((x)&0x03)<<4) -+#define MCF_GPIO_PAR_TIMER_T3IN(x) (((x)&0x03)<<6) -+#define MCF_GPIO_PAR_TIMER_T3IN_MASK (0x3F) -+#define MCF_GPIO_PAR_TIMER_T3IN_T3IN (0xC0) -+#define MCF_GPIO_PAR_TIMER_T3IN_T3OUT (0x80) -+#define MCF_GPIO_PAR_TIMER_T3IN_U2RXD (0x40) -+#define MCF_GPIO_PAR_TIMER_T3IN_GPIO (0x00) -+#define MCF_GPIO_PAR_TIMER_T2IN_MASK (0xCF) -+#define MCF_GPIO_PAR_TIMER_T2IN_T2IN (0x30) -+#define MCF_GPIO_PAR_TIMER_T2IN_T2OUT (0x20) -+#define MCF_GPIO_PAR_TIMER_T2IN_U2TXD (0x10) -+#define MCF_GPIO_PAR_TIMER_T2IN_GPIO (0x00) -+#define MCF_GPIO_PAR_TIMER_T1IN_MASK (0xF3) -+#define MCF_GPIO_PAR_TIMER_T1IN_T1IN (0x0C) -+#define MCF_GPIO_PAR_TIMER_T1IN_T1OUT (0x08) -+#define MCF_GPIO_PAR_TIMER_T1IN_U2CTS (0x04) -+#define MCF_GPIO_PAR_TIMER_T1IN_GPIO (0x00) -+#define MCF_GPIO_PAR_TIMER_T0IN_MASK (0xFC) -+#define MCF_GPIO_PAR_TIMER_T0IN_T0IN (0x03) -+#define MCF_GPIO_PAR_TIMER_T0IN_T0OUT (0x02) -+#define MCF_GPIO_PAR_TIMER_T0IN_U2RTS (0x01) -+#define MCF_GPIO_PAR_TIMER_T0IN_GPIO (0x00) -+ -+/* Bit definitions and macros for PAR_USB */ -+#define MCF_GPIO_PAR_USB_VBUSOC(x) (((x)&0x03)) -+#define MCF_GPIO_PAR_USB_VBUSEN(x) (((x)&0x03)<<2) -+#define MCF_GPIO_PAR_USB_VBUSEN_MASK (0xF3) -+#define MCF_GPIO_PAR_USB_VBUSEN_VBUSEN (0x0C) -+#define MCF_GPIO_PAR_USB_VBUSEN_USBPULLUP (0x08) -+#define MCF_GPIO_PAR_USB_VBUSEN_ULPI_NXT (0x04) -+#define MCF_GPIO_PAR_USB_VBUSEN_GPIO (0x00) -+#define MCF_GPIO_PAR_USB_VBUSOC_MASK (0xFC) -+#define MCF_GPIO_PAR_USB_VBUSOC_VBUSOC (0x03) -+#define MCF_GPIO_PAR_USB_VBUSOC_ULPI_STP (0x01) -+#define MCF_GPIO_PAR_USB_VBUSOC_GPIO (0x00) -+ -+/* Bit definitions and macros for PAR_UART */ -+#define MCF_GPIO_PAR_UART_U0TXD (0x01) -+#define MCF_GPIO_PAR_UART_U0RXD (0x02) -+#define MCF_GPIO_PAR_UART_U0RTS (0x04) -+#define MCF_GPIO_PAR_UART_U0CTS (0x08) -+#define MCF_GPIO_PAR_UART_U1TXD (0x10) -+#define MCF_GPIO_PAR_UART_U1RXD (0x20) -+#define MCF_GPIO_PAR_UART_U1RTS (0x40) -+#define MCF_GPIO_PAR_UART_U1CTS (0x80) -+#define MCF_GPIO_PAR_UART_U1CTS_U1CTS (0x80) -+#define MCF_GPIO_PAR_UART_U1CTS_GPIO (0x00) -+#define MCF_GPIO_PAR_UART_U1RTS_U1RTS (0x40) -+#define MCF_GPIO_PAR_UART_U1RTS_GPIO (0x00) -+#define MCF_GPIO_PAR_UART_U1RXD_U1RXD (0x20) -+#define MCF_GPIO_PAR_UART_U1RXD_GPIO (0x00) -+#define MCF_GPIO_PAR_UART_U1TXD_U1TXD (0x10) -+#define MCF_GPIO_PAR_UART_U1TXD_GPIO (0x00) -+#define MCF_GPIO_PAR_UART_U0CTS_U0CTS (0x08) -+#define MCF_GPIO_PAR_UART_U0CTS_GPIO (0x00) -+#define MCF_GPIO_PAR_UART_U0RTS_U0RTS (0x04) -+#define MCF_GPIO_PAR_UART_U0RTS_GPIO (0x00) -+#define MCF_GPIO_PAR_UART_U0RXD_U0RXD (0x02) -+#define MCF_GPIO_PAR_UART_U0RXD_GPIO (0x00) -+#define MCF_GPIO_PAR_UART_U0TXD_U0TXD (0x01) -+#define MCF_GPIO_PAR_UART_U0TXD_GPIO (0x00) -+ -+/* Bit definitions and macros for PAR_FECI2C */ -+#define MCF_GPIO_PAR_FECI2C_SDA(x) (((x)&0x0003)) -+#define MCF_GPIO_PAR_FECI2C_SCL(x) (((x)&0x0003)<<2) -+#define MCF_GPIO_PAR_FECI2C_PAR_SDA(x) (((x)&0x0003)) -+#define MCF_GPIO_PAR_FECI2C_PAR_SCL(x) (((x)&0x0003)<<2) -+#define MCF_GPIO_PAR_FECI2C_MDIO0 (0x0010) -+#define MCF_GPIO_PAR_FECI2C_MDC0 (0x0040) -+#define MCF_GPIO_PAR_FECI2C_MDIO1(x) (((x)&0x0003)<<8) -+#define MCF_GPIO_PAR_FECI2C_MDC1(x) (((x)&0x0003)<<10) -+#define MCF_GPIO_PAR_FECI2C_MDC1_MASK (0xF3FF) -+#define MCF_GPIO_PAR_FECI2C_MDC1_MDC1 (0x0C00) -+#define MCF_GPIO_PAR_FECI2C_MDC1_ATA_DIOR (0x0800) -+#define MCF_GPIO_PAR_FECI2C_MDC1_GPIO (0x0000) -+#define MCF_GPIO_PAR_FECI2C_MDIO1_MASK (0xFCFF) -+#define MCF_GPIO_PAR_FECI2C_MDIO1_MDIO1 (0x0300) -+#define MCF_GPIO_PAR_FECI2C_MDIO1_ATA_DIOW (0x0200) -+#define MCF_GPIO_PAR_FECI2C_MDIO1_GPIO (0x0000) -+#define MCF_GPIO_PAR_FECI2C_MDC0_MDC0 (0x0040) -+#define MCF_GPIO_PAR_FECI2C_MDC0_GPIO (0x0000) -+#define MCF_GPIO_PAR_FECI2C_MDIO0_MDIO0 (0x0010) -+#define MCF_GPIO_PAR_FECI2C_MDIO0_GPIO (0x0000) -+#define MCF_GPIO_PAR_FECI2C_SCL_MASK (0xFFF3) -+#define MCF_GPIO_PAR_FECI2C_SCL_SCL (0x000C) -+#define MCF_GPIO_PAR_FECI2C_SCL_U2TXD (0x0004) -+#define MCF_GPIO_PAR_FECI2C_SCL_GPIO (0x0000) -+#define MCF_GPIO_PAR_FECI2C_SDA_MASK (0xFFFC) -+#define MCF_GPIO_PAR_FECI2C_SDA_SDA (0x0003) -+#define MCF_GPIO_PAR_FECI2C_SDA_U2RXD (0x0001) -+#define MCF_GPIO_PAR_FECI2C_SDA_GPIO (0x0000) -+ -+/* Bit definitions and macros for PAR_SSI */ -+#define MCF_GPIO_PAR_SSI_MCLK (0x0001) -+#define MCF_GPIO_PAR_SSI_STXD(x) (((x)&0x0003)<<2) -+#define MCF_GPIO_PAR_SSI_SRXD(x) (((x)&0x0003)<<4) -+#define MCF_GPIO_PAR_SSI_FS(x) (((x)&0x0003)<<6) -+#define MCF_GPIO_PAR_SSI_BCLK(x) (((x)&0x0003)<<8) -+#define MCF_GPIO_PAR_SSI_BCLK_MASK (0xFCFF) -+#define MCF_GPIO_PAR_SSI_BCLK_BCLK (0x0300) -+#define MCF_GPIO_PAR_SSI_BCLK_U1CTS (0x0200) -+#define MCF_GPIO_PAR_SSI_BCLK_GPIO (0x0000) -+#define MCF_GPIO_PAR_SSI_FS_MASK (0xFF3F) -+#define MCF_GPIO_PAR_SSI_FS_FS (0x00C0) -+#define MCF_GPIO_PAR_SSI_FS_U1RTS (0x0080) -+#define MCF_GPIO_PAR_SSI_FS_GPIO (0x0000) -+#define MCF_GPIO_PAR_SSI_SRXD_MASK (0xFFCF) -+#define MCF_GPIO_PAR_SSI_SRXD_SRXD (0x0030) -+#define MCF_GPIO_PAR_SSI_SRXD_U1RXD (0x0020) -+#define MCF_GPIO_PAR_SSI_SRXD_GPIO (0x0000) -+#define MCF_GPIO_PAR_SSI_STXD_MASK (0xFFF3) -+#define MCF_GPIO_PAR_SSI_STXD_STXD (0x000C) -+#define MCF_GPIO_PAR_SSI_STXD_U1TXD (0x0008) -+#define MCF_GPIO_PAR_SSI_STXD_GPIO (0x0000) -+#define MCF_GPIO_PAR_SSI_MCLK_MCLK (0x0001) -+#define MCF_GPIO_PAR_SSI_MCLK_GPIO (0x0000) -+ -+/* Bit definitions and macros for PAR_ATA */ -+#define MCF_GPIO_PAR_ATA_IORDY (0x0001) -+#define MCF_GPIO_PAR_ATA_DMARQ (0x0002) -+#define MCF_GPIO_PAR_ATA_RESET (0x0004) -+#define MCF_GPIO_PAR_ATA_DA0 (0x0020) -+#define MCF_GPIO_PAR_ATA_DA1 (0x0040) -+#define MCF_GPIO_PAR_ATA_DA2 (0x0080) -+#define MCF_GPIO_PAR_ATA_CS0 (0x0100) -+#define MCF_GPIO_PAR_ATA_CS1 (0x0200) -+#define MCF_GPIO_PAR_ATA_BUFEN (0x0400) -+#define MCF_GPIO_PAR_ATA_BUFEN_BUFEN (0x0400) -+#define MCF_GPIO_PAR_ATA_BUFEN_GPIO (0x0000) -+#define MCF_GPIO_PAR_ATA_CS1_CS1 (0x0200) -+#define MCF_GPIO_PAR_ATA_CS1_GPIO (0x0000) -+#define MCF_GPIO_PAR_ATA_CS0_CS0 (0x0100) -+#define MCF_GPIO_PAR_ATA_CS0_GPIO (0x0000) -+#define MCF_GPIO_PAR_ATA_DA2_DA2 (0x0080) -+#define MCF_GPIO_PAR_ATA_DA2_GPIO (0x0000) -+#define MCF_GPIO_PAR_ATA_DA1_DA1 (0x0040) -+#define MCF_GPIO_PAR_ATA_DA1_GPIO (0x0000) -+#define MCF_GPIO_PAR_ATA_DA0_DA0 (0x0020) -+#define MCF_GPIO_PAR_ATA_DA0_GPIO (0x0000) -+#define MCF_GPIO_PAR_ATA_RESET_RESET (0x0004) -+#define MCF_GPIO_PAR_ATA_RESET_GPIO (0x0000) -+#define MCF_GPIO_PAR_ATA_DMARQ_DMARQ (0x0002) -+#define MCF_GPIO_PAR_ATA_DMARQ_GPIO (0x0000) -+#define MCF_GPIO_PAR_ATA_IORDY_IORDY (0x0001) -+#define MCF_GPIO_PAR_ATA_IORDY_GPIO (0x0000) -+ -+/* Bit definitions and macros for PAR_IRQ */ -+#define MCF_GPIO_PAR_IRQ_IRQ1 (0x02) -+#define MCF_GPIO_PAR_IRQ_IRQ4 (0x10) -+#define MCF_GPIO_PAR_IRQ_IRQ4_IRQ4 (0x10) -+#define MCF_GPIO_PAR_IRQ_IRQ4_GPIO (0x00) -+#define MCF_GPIO_PAR_IRQ_IRQ1_IRQ1 (0x02) -+#define MCF_GPIO_PAR_IRQ_IRQ1_GPIO (0x00) -+ -+/* Bit definitions and macros for PAR_PCI */ -+#define MCF_GPIO_PAR_PCI_REQ0 (0x0001) -+#define MCF_GPIO_PAR_PCI_REQ1 (0x0004) -+#define MCF_GPIO_PAR_PCI_REQ2 (0x0010) -+#define MCF_GPIO_PAR_PCI_REQ3(x) (((x)&0x0003)<<6) -+#define MCF_GPIO_PAR_PCI_GNT0 (0x0100) -+#define MCF_GPIO_PAR_PCI_GNT1 (0x0400) -+#define MCF_GPIO_PAR_PCI_GNT2 (0x1000) -+#define MCF_GPIO_PAR_PCI_GNT3(x) (((x)&0x0003)<<14) -+#define MCF_GPIO_PAR_PCI_GNT3_MASK (0x3FFF) -+#define MCF_GPIO_PAR_PCI_GNT3_GNT3 (0xC000) -+#define MCF_GPIO_PAR_PCI_GNT3_ATA_DMACK (0x8000) -+#define MCF_GPIO_PAR_PCI_GNT3_GPIO (0x0000) -+#define MCF_GPIO_PAR_PCI_GNT2_GNT2 (0x1000) -+#define MCF_GPIO_PAR_PCI_GNT2_GPIO (0x0000) -+#define MCF_GPIO_PAR_PCI_GNT1_GNT1 (0x0400) -+#define MCF_GPIO_PAR_PCI_GNT1_GPIO (0x0000) -+#define MCF_GPIO_PAR_PCI_GNT0_GNT0 (0x0100) -+#define MCF_GPIO_PAR_PCI_GNT0_GPIO (0x0000) -+#define MCF_GPIO_PAR_PCI_REQ3_MASK (0xFF3F) -+#define MCF_GPIO_PAR_PCI_REQ3_REQ3 (0x00C0) -+#define MCF_GPIO_PAR_PCI_REQ3_ATA_INTRQ (0x0080) -+#define MCF_GPIO_PAR_PCI_REQ3_GPIO (0x0000) -+#define MCF_GPIO_PAR_PCI_REQ2_REQ2 (0x0010) -+#define MCF_GPIO_PAR_PCI_REQ2_GPIO (0x0000) -+#define MCF_GPIO_PAR_PCI_REQ1_REQ1 (0x0040) -+#define MCF_GPIO_PAR_PCI_REQ1_GPIO (0x0000) -+#define MCF_GPIO_PAR_PCI_REQ0_REQ0 (0x0001) -+#define MCF_GPIO_PAR_PCI_REQ0_GPIO (0x0000) -+ -+/* Bit definitions and macros for MSCR_SDRAM */ -+#define MCF_GPIO_MSCR_SDRAM_SDCTL(x) (((x)&0x03)) -+#define MCF_GPIO_MSCR_SDRAM_SDCLK(x) (((x)&0x03)<<2) -+#define MCF_GPIO_MSCR_SDRAM_SDDQS(x) (((x)&0x03)<<4) -+#define MCF_GPIO_MSCR_SDRAM_SDDATA(x) (((x)&0x03)<<6) -+#define MCF_GPIO_MSCR_SDRAM_SDDATA_MASK (0x3F) -+#define MCF_GPIO_MSCR_SDRAM_SDDATA_DDR1 (0xC0) -+#define MCF_GPIO_MSCR_SDRAM_SDDATA_DDR2 (0x80) -+#define MCF_GPIO_MSCR_SDRAM_SDDATA_FS_LPDDR (0x40) -+#define MCF_GPIO_MSCR_SDRAM_SDDATA_HS_LPDDR (0x00) -+#define MCF_GPIO_MSCR_SDRAM_SDDQS_MASK (0xCF) -+#define MCF_GPIO_MSCR_SDRAM_SDDQS_DDR1 (0x30) -+#define MCF_GPIO_MSCR_SDRAM_SDDQS_DDR2 (0x20) -+#define MCF_GPIO_MSCR_SDRAM_SDDQS_FS_LPDDR (0x10) -+#define MCF_GPIO_MSCR_SDRAM_SDDQS_HS_LPDDR (0x00) -+#define MCF_GPIO_MSCR_SDRAM_SDCLK_MASK (0xF3) -+#define MCF_GPIO_MSCR_SDRAM_SDCLK_DDR1 (0x0C) -+#define MCF_GPIO_MSCR_SDRAM_SDCLK_DDR2 (0x08) -+#define MCF_GPIO_MSCR_SDRAM_SDCLK_FS_LPDDR (0x04) -+#define MCF_GPIO_MSCR_SDRAM_SDCLK_HS_LPDDR (0x00) -+#define MCF_GPIO_MSCR_SDRAM_SDCTL_MASK (0xFC) -+#define MCF_GPIO_MSCR_SDRAM_SDCTL_DDR1 (0x03) -+#define MCF_GPIO_MSCR_SDRAM_SDCTL_DDR2 (0x02) -+#define MCF_GPIO_MSCR_SDRAM_SDCTL_FS_LPDDR (0x01) -+#define MCF_GPIO_MSCR_SDRAM_SDCTL_HS_LPDDR (0x00) -+ -+/* Bit definitions and macros for MSCR_PCI */ -+#define MCF_GPIO_MSCR_PCI_PCI (0x01) -+#define MCF_GPIO_MSCR_PCI_PCI_HI_66MHZ (0x01) -+#define MCF_GPIO_MSCR_PCI_PCI_LO_33MHZ (0x00) -+ -+/* Bit definitions and macros for DSCR_I2C */ -+#define MCF_GPIO_DSCR_I2C_I2C(x) (((x)&0x03)) -+#define MCF_GPIO_DSCR_I2C_I2C_LOAD_50PF (0x03) -+#define MCF_GPIO_DSCR_I2C_I2C_LOAD_30PF (0x02) -+#define MCF_GPIO_DSCR_I2C_I2C_LOAD_20PF (0x01) -+#define MCF_GPIO_DSCR_I2C_I2C_LOAD_10PF (0x00) -+ -+/* Bit definitions and macros for DSCR_FLEXBUS */ -+#define MCF_GPIO_DSCR_FLEXBUS_FBADL(x) (((x)&0x03)) -+#define MCF_GPIO_DSCR_FLEXBUS_FBADH(x) (((x)&0x03)<<2) -+#define MCF_GPIO_DSCR_FLEXBUS_FBCTL(x) (((x)&0x03)<<4) -+#define MCF_GPIO_DSCR_FLEXBUS_FBCLK(x) (((x)&0x03)<<6) -+#define MCF_GPIO_DSCR_FLEXBUS_FBCLK_LOAD_50PF (0xC0) -+#define MCF_GPIO_DSCR_FLEXBUS_FBCLK_LOAD_30P (0x80) -+#define MCF_GPIO_DSCR_FLEXBUS_FBCLK_LOAD_20PF (0x40) -+#define MCF_GPIO_DSCR_FLEXBUS_FBCLK_LOAD_10PF (0x00) -+#define MCF_GPIO_DSCR_FLEXBUS_FBCTL_LOAD_50PF (0x30) -+#define MCF_GPIO_DSCR_FLEXBUS_FBCTL_LOAD_30PF (0x20) -+#define MCF_GPIO_DSCR_FLEXBUS_FBCTL_LOAD_20PF (0x10) -+#define MCF_GPIO_DSCR_FLEXBUS_FBCTL_LOAD_10PF (0x00) -+#define MCF_GPIO_DSCR_FLEXBUS_FBADH_LOAD_50PF (0x0C) -+#define MCF_GPIO_DSCR_FLEXBUS_FBADH_LOAD_30PF (0x08) -+#define MCF_GPIO_DSCR_FLEXBUS_FBADH_LOAD_20PF (0x04) -+#define MCF_GPIO_DSCR_FLEXBUS_FBADH_LOAD_10PF (0x00) -+#define MCF_GPIO_DSCR_FLEXBUS_FBADL_LOAD_50PF (0x03) -+#define MCF_GPIO_DSCR_FLEXBUS_FBADL_LOAD_30PF (0x02) -+#define MCF_GPIO_DSCR_FLEXBUS_FBADL_LOAD_20PF (0x01) -+#define MCF_GPIO_DSCR_FLEXBUS_FBADL_LOAD_10PF (0x00) -+ -+/* Bit definitions and macros for DSCR_FEC */ -+#define MCF_GPIO_DSCR_FEC_FEC0(x) (((x)&0x03)) -+#define MCF_GPIO_DSCR_FEC_FEC1(x) (((x)&0x03)<<2) -+#define MCF_GPIO_DSCR_FEC_FEC1_LOAD_50PF (0x0C) -+#define MCF_GPIO_DSCR_FEC_FEC1_LOAD_30PF (0x08) -+#define MCF_GPIO_DSCR_FEC_FEC1_LOAD_20PF (0x04) -+#define MCF_GPIO_DSCR_FEC_FEC1_LOAD_10PF (0x00) -+#define MCF_GPIO_DSCR_FEC_FEC0_LOAD_50PF (0x03) -+#define MCF_GPIO_DSCR_FEC_FEC0_LOAD_30PF (0x02) -+#define MCF_GPIO_DSCR_FEC_FEC0_LOAD_20PF (0x01) -+#define MCF_GPIO_DSCR_FEC_FEC0_LOAD_10PF (0x00) -+ -+/* Bit definitions and macros for DSCR_UART */ -+#define MCF_GPIO_DSCR_UART_UART0(x) (((x)&0x03)) -+#define MCF_GPIO_DSCR_UART_UART1(x) (((x)&0x03)<<2) -+#define MCF_GPIO_DSCR_UART_UART1_LOAD_50PF (0x0C) -+#define MCF_GPIO_DSCR_UART_UART1_LOAD_30PF (0x08) -+#define MCF_GPIO_DSCR_UART_UART1_LOAD_20PF (0x04) -+#define MCF_GPIO_DSCR_UART_UART1_LOAD_10PF (0x00) -+#define MCF_GPIO_DSCR_UART_UART0_LOAD_50PF (0x03) -+#define MCF_GPIO_DSCR_UART_UART0_LOAD_30PF (0x02) -+#define MCF_GPIO_DSCR_UART_UART0_LOAD_20PF (0x01) -+#define MCF_GPIO_DSCR_UART_UART0_LOAD_10PF (0x00) -+ -+/* Bit definitions and macros for DSCR_DSPI */ -+#define MCF_GPIO_DSCR_DSPI_DSPI(x) (((x)&0x03)) -+#define MCF_GPIO_DSCR_DSPI_DSPI_LOAD_50PF (0x03) -+#define MCF_GPIO_DSCR_DSPI_DSPI_LOAD_30PF (0x02) -+#define MCF_GPIO_DSCR_DSPI_DSPI_LOAD_20PF (0x01) -+#define MCF_GPIO_DSCR_DSPI_DSPI_LOAD_10PF (0x00) -+ -+/* Bit definitions and macros for DSCR_TIMER */ -+#define MCF_GPIO_DSCR_TIMER_TIMER(x) (((x)&0x03)) -+#define MCF_GPIO_DSCR_TIMER_TIMER_LOAD_50PF (0x03) -+#define MCF_GPIO_DSCR_TIMER_TIMER_LOAD_30PF (0x02) -+#define MCF_GPIO_DSCR_TIMER_TIMER_LOAD_20PF (0x01) -+#define MCF_GPIO_DSCR_TIMER_TIMER_LOAD_10PF (0x00) -+ -+/* Bit definitions and macros for DSCR_SSI */ -+#define MCF_GPIO_DSCR_SSI_SSI(x) (((x)&0x03)) -+#define MCF_GPIO_DSCR_SSI_SSI_LOAD_50PF (0x03) -+#define MCF_GPIO_DSCR_SSI_SSI_LOAD_30PF (0x02) -+#define MCF_GPIO_DSCR_SSI_SSI_LOAD_20PF (0x01) -+#define MCF_GPIO_DSCR_SSI_SSI_LOAD_10PF (0x00) -+ -+/* Bit definitions and macros for DSCR_DMA */ -+#define MCF_GPIO_DSCR_DMA_DMA(x) (((x)&0x03)) -+#define MCF_GPIO_DSCR_DMA_DMA_LOAD_50PF (0x03) -+#define MCF_GPIO_DSCR_DMA_DMA_LOAD_30PF (0x02) -+#define MCF_GPIO_DSCR_DMA_DMA_LOAD_20PF (0x01) -+#define MCF_GPIO_DSCR_DMA_DMA_LOAD_10PF (0x00) -+ -+/* Bit definitions and macros for DSCR_DEBUG */ -+#define MCF_GPIO_DSCR_DEBUG_DEBUG(x) (((x)&0x03)) -+#define MCF_GPIO_DSCR_DEBUG_DEBUG_LOAD_50PF (0x03) -+#define MCF_GPIO_DSCR_DEBUG_DEBUG_LOAD_30PF (0x02) -+#define MCF_GPIO_DSCR_DEBUG_DEBUG_LOAD_20PF (0x01) -+#define MCF_GPIO_DSCR_DEBUG_DEBUG_LOAD_10PF (0x00) -+ -+/* Bit definitions and macros for DSCR_RESET */ -+#define MCF_GPIO_DSCR_RESET_RESET(x) (((x)&0x03)) -+#define MCF_GPIO_DSCR_RESET_RESET_LOAD_50PF (0x03) -+#define MCF_GPIO_DSCR_RESET_RESET_LOAD_30PF (0x02) -+#define MCF_GPIO_DSCR_RESET_RESET_LOAD_20PF (0x01) -+#define MCF_GPIO_DSCR_RESET_RESET_LOAD_10PF (0x00) -+ -+/* Bit definitions and macros for DSCR_IRQ */ -+#define MCF_GPIO_DSCR_IRQ_IRQ(x) (((x)&0x03)) -+#define MCF_GPIO_DSCR_IRQ_IRQ_LOAD_50PF (0x03) -+#define MCF_GPIO_DSCR_IRQ_IRQ_LOAD_30PF (0x02) -+#define MCF_GPIO_DSCR_IRQ_IRQ_LOAD_20PF (0x01) -+#define MCF_GPIO_DSCR_IRQ_IRQ_LOAD_10PF (0x00) -+ -+/* Bit definitions and macros for DSCR_USB */ -+#define MCF_GPIO_DSCR_USB_USB(x) (((x)&0x03)) -+#define MCF_GPIO_DSCR_USB_USB_LOAD_50PF (0x03) -+#define MCF_GPIO_DSCR_USB_USB_LOAD_30PF (0x02) -+#define MCF_GPIO_DSCR_USB_USB_LOAD_20PF (0x01) -+#define MCF_GPIO_DSCR_USB_USB_LOAD_10PF (0x00) -+ -+/* Bit definitions and macros for DSCR_ATA */ -+#define MCF_GPIO_DSCR_ATA_ATA(x) (((x)&0x03)) -+#define MCF_GPIO_DSCR_ATA_ATA_LOAD_50PF (0x03) -+#define MCF_GPIO_DSCR_ATA_ATA_LOAD_30PF (0x02) -+#define MCF_GPIO_DSCR_ATA_ATA_LOAD_20PF (0x01) -+#define MCF_GPIO_DSCR_ATA_ATA_LOAD_10PF (0x00) -+ -+/********************************************************************/ -+ -+#endif /* __MCF5445X_GPIO_H__ */ ---- /dev/null -+++ b/include/asm-m68k/mcf5445x_i2c.h -@@ -0,0 +1,39 @@ -+/* -+ * Matt Waddel Matt.Waddel@freescale.com -+ * -+ * Copyright Freescale Semiconductor, Inc. 2007 -+ * -+ * This program is free software; you can redistribute it and/or modify it -+ * under the terms of the GNU General Public License as published by the -+ * Free Software Foundation; either version 2 of the License, or (at your -+ * option) any later version. -+ */ -+ -+#ifndef __MCF5445X_I2C_H__ -+#define __MCF5445X_I2C_H__ -+ -+/********************************************************************* -+* -+* I2C Module (I2C) -+* -+*********************************************************************/ -+ -+/* Register read/write macros */ -+#define MCF_I2C_I2ADR (volatile u8 *)(0xFC058000) -+#define MCF_I2C_I2FDR (volatile u8 *)(0xFC058004) -+#define MCF_I2C_I2CR (volatile u8 *)(0xFC058008) -+#define MCF_I2C_I2SR (volatile u8 *)(0xFC05800C) -+#define MCF_I2C_I2DR (volatile u8 *)(0xFC058010) -+ -+/* Bit definitions and macros for I2AR */ -+#define MCF_I2C_I2AR_ADR(x) (((x)&0x7F)<<1) -+ -+/* Bit definitions and macros for I2FDR */ -+#define MCF_I2C_I2FDR_IC(x) (((x)&0x3F)) -+ -+/* Bit definitions and macros for I2DR */ -+#define MCF_I2C_I2DR_DATA(x) (x) -+ -+/********************************************************************/ -+ -+#endif /* __MCF5445X_I2C_H__ */ ---- /dev/null -+++ b/include/asm-m68k/mcf5445x_intc.h -@@ -0,0 +1,724 @@ -+/* -+ * Matt Waddel Matt.Waddel@freescale.com -+ * -+ * Copyright Freescale Semiconductor, Inc. 2007 -+ * -+ * This program is free software; you can redistribute it and/or modify it -+ * under the terms of the GNU General Public License as published by the -+ * Free Software Foundation; either version 2 of the License, or (at your -+ * option) any later version. -+ */ -+ -+#ifndef __MCF5445X_INTC_H__ -+#define __MCF5445X_INTC_H__ -+ -+/********************************************************************* -+* -+* Interrupt Controller (INTC) -+* -+*********************************************************************/ -+ -+/* Register read/write macros */ -+#define MCF_INTC0_IPRH MCF_REG32(0xFC048000) -+#define MCF_INTC0_IPRL MCF_REG32(0xFC048004) -+#define MCF_INTC0_IMRH MCF_REG32(0xFC048008) -+#define MCF_INTC0_IMRL MCF_REG32(0xFC04800C) -+#define MCF_INTC0_INTFRCH MCF_REG32(0xFC048010) -+#define MCF_INTC0_INTFRCL MCF_REG32(0xFC048014) -+#define MCF_INTC0_ICONFIG MCF_REG16(0xFC04801A) -+#define MCF_INTC0_SIMR MCF_REG08(0xFC04801C) -+#define MCF_INTC0_CIMR MCF_REG08(0xFC04801D) -+#define MCF_INTC0_CLMASK MCF_REG08(0xFC04801E) -+#define MCF_INTC0_SLMASK MCF_REG08(0xFC04801F) -+#define MCF_INTC0_ICR1 MCF_REG08(0xFC048041) -+#define MCF_INTC0_ICR2 MCF_REG08(0xFC048042) -+#define MCF_INTC0_ICR3 MCF_REG08(0xFC048043) -+#define MCF_INTC0_ICR4 MCF_REG08(0xFC048044) -+#define MCF_INTC0_ICR5 MCF_REG08(0xFC048045) -+#define MCF_INTC0_ICR6 MCF_REG08(0xFC048046) -+#define MCF_INTC0_ICR7 MCF_REG08(0xFC048047) -+#define MCF_INTC0_ICR8 MCF_REG08(0xFC048048) -+#define MCF_INTC0_ICR9 MCF_REG08(0xFC048049) -+#define MCF_INTC0_ICR10 MCF_REG08(0xFC04804A) -+#define MCF_INTC0_ICR11 MCF_REG08(0xFC04804B) -+#define MCF_INTC0_ICR12 MCF_REG08(0xFC04804C) -+#define MCF_INTC0_ICR13 MCF_REG08(0xFC04804D) -+#define MCF_INTC0_ICR14 MCF_REG08(0xFC04804E) -+#define MCF_INTC0_ICR15 MCF_REG08(0xFC04804F) -+#define MCF_INTC0_ICR16 MCF_REG08(0xFC048050) -+#define MCF_INTC0_ICR17 MCF_REG08(0xFC048051) -+#define MCF_INTC0_ICR18 MCF_REG08(0xFC048052) -+#define MCF_INTC0_ICR19 MCF_REG08(0xFC048053) -+#define MCF_INTC0_ICR20 MCF_REG08(0xFC048054) -+#define MCF_INTC0_ICR21 MCF_REG08(0xFC048055) -+#define MCF_INTC0_ICR22 MCF_REG08(0xFC048056) -+#define MCF_INTC0_ICR23 MCF_REG08(0xFC048057) -+#define MCF_INTC0_ICR24 MCF_REG08(0xFC048058) -+#define MCF_INTC0_ICR25 MCF_REG08(0xFC048059) -+#define MCF_INTC0_ICR26 MCF_REG08(0xFC04805A) -+#define MCF_INTC0_ICR27 MCF_REG08(0xFC04805B) -+#define MCF_INTC0_ICR28 MCF_REG08(0xFC04805C) -+#define MCF_INTC0_ICR29 MCF_REG08(0xFC04805D) -+#define MCF_INTC0_ICR30 MCF_REG08(0xFC04805E) -+#define MCF_INTC0_ICR31 MCF_REG08(0xFC04805F) -+#define MCF_INTC0_ICR32 MCF_REG08(0xFC048060) -+#define MCF_INTC0_ICR33 MCF_REG08(0xFC048061) -+#define MCF_INTC0_ICR34 MCF_REG08(0xFC048062) -+#define MCF_INTC0_ICR35 MCF_REG08(0xFC048063) -+#define MCF_INTC0_ICR36 MCF_REG08(0xFC048064) -+#define MCF_INTC0_ICR37 MCF_REG08(0xFC048065) -+#define MCF_INTC0_ICR38 MCF_REG08(0xFC048066) -+#define MCF_INTC0_ICR39 MCF_REG08(0xFC048067) -+#define MCF_INTC0_ICR40 MCF_REG08(0xFC048068) -+#define MCF_INTC0_ICR41 MCF_REG08(0xFC048069) -+#define MCF_INTC0_ICR42 MCF_REG08(0xFC04806A) -+#define MCF_INTC0_ICR43 MCF_REG08(0xFC04806B) -+#define MCF_INTC0_ICR44 MCF_REG08(0xFC04806C) -+#define MCF_INTC0_ICR45 MCF_REG08(0xFC04806D) -+#define MCF_INTC0_ICR46 MCF_REG08(0xFC04806E) -+#define MCF_INTC0_ICR47 MCF_REG08(0xFC04806F) -+#define MCF_INTC0_ICR48 MCF_REG08(0xFC048070) -+#define MCF_INTC0_ICR49 MCF_REG08(0xFC048071) -+#define MCF_INTC0_ICR50 MCF_REG08(0xFC048072) -+#define MCF_INTC0_ICR51 MCF_REG08(0xFC048073) -+#define MCF_INTC0_ICR52 MCF_REG08(0xFC048074) -+#define MCF_INTC0_ICR53 MCF_REG08(0xFC048075) -+#define MCF_INTC0_ICR54 MCF_REG08(0xFC048076) -+#define MCF_INTC0_ICR55 MCF_REG08(0xFC048077) -+#define MCF_INTC0_ICR56 MCF_REG08(0xFC048078) -+#define MCF_INTC0_ICR57 MCF_REG08(0xFC048079) -+#define MCF_INTC0_ICR58 MCF_REG08(0xFC04807A) -+#define MCF_INTC0_ICR59 MCF_REG08(0xFC04807B) -+#define MCF_INTC0_ICR60 MCF_REG08(0xFC04807C) -+#define MCF_INTC0_ICR61 MCF_REG08(0xFC04807D) -+#define MCF_INTC0_ICR62 MCF_REG08(0xFC04807E) -+#define MCF_INTC0_ICR63 MCF_REG08(0xFC04807F) -+#define MCF_INTC0_SWIACK MCF_REG08(0xFC0480E0) -+#define MCF_INTC0_L1IACK MCF_REG08(0xFC0480E4) -+#define MCF_INTC0_L2IACK MCF_REG08(0xFC0480E8) -+#define MCF_INTC0_L3IACK MCF_REG08(0xFC0480EC) -+#define MCF_INTC0_L4IACK MCF_REG08(0xFC0480F0) -+#define MCF_INTC0_L5IACK MCF_REG08(0xFC0480F4) -+#define MCF_INTC0_L6IACK MCF_REG08(0xFC0480F8) -+#define MCF_INTC0_L7IACK MCF_REG08(0xFC0480FC) -+#define MCF_INTC1_IPRH MCF_REG32(0xFC04C000) -+#define MCF_INTC1_IPRL MCF_REG32(0xFC04C004) -+#define MCF_INTC1_IMRH MCF_REG32(0xFC04C008) -+#define MCF_INTC1_IMRL MCF_REG32(0xFC04C00C) -+#define MCF_INTC1_INTFRCH MCF_REG32(0xFC04C010) -+#define MCF_INTC1_INTFRCL MCF_REG32(0xFC04C014) -+#define MCF_INTC1_ICONFIG MCF_REG16(0xFC04C01A) -+#define MCF_INTC1_SIMR MCF_REG08(0xFC04C01C) -+#define MCF_INTC1_CIMR MCF_REG08(0xFC04C01D) -+#define MCF_INTC1_CLMASK MCF_REG08(0xFC04C01E) -+#define MCF_INTC1_SLMASK MCF_REG08(0xFC04C01F) -+#define MCF_INTC1_ICR1 MCF_REG08(0xFC04C041) -+#define MCF_INTC1_ICR2 MCF_REG08(0xFC04C042) -+#define MCF_INTC1_ICR3 MCF_REG08(0xFC04C043) -+#define MCF_INTC1_ICR4 MCF_REG08(0xFC04C044) -+#define MCF_INTC1_ICR5 MCF_REG08(0xFC04C045) -+#define MCF_INTC1_ICR6 MCF_REG08(0xFC04C046) -+#define MCF_INTC1_ICR7 MCF_REG08(0xFC04C047) -+#define MCF_INTC1_ICR8 MCF_REG08(0xFC04C048) -+#define MCF_INTC1_ICR9 MCF_REG08(0xFC04C049) -+#define MCF_INTC1_ICR10 MCF_REG08(0xFC04C04A) -+#define MCF_INTC1_ICR11 MCF_REG08(0xFC04C04B) -+#define MCF_INTC1_ICR12 MCF_REG08(0xFC04C04C) -+#define MCF_INTC1_ICR13 MCF_REG08(0xFC04C04D) -+#define MCF_INTC1_ICR14 MCF_REG08(0xFC04C04E) -+#define MCF_INTC1_ICR15 MCF_REG08(0xFC04C04F) -+#define MCF_INTC1_ICR16 MCF_REG08(0xFC04C050) -+#define MCF_INTC1_ICR17 MCF_REG08(0xFC04C051) -+#define MCF_INTC1_ICR18 MCF_REG08(0xFC04C052) -+#define MCF_INTC1_ICR19 MCF_REG08(0xFC04C053) -+#define MCF_INTC1_ICR20 MCF_REG08(0xFC04C054) -+#define MCF_INTC1_ICR21 MCF_REG08(0xFC04C055) -+#define MCF_INTC1_ICR22 MCF_REG08(0xFC04C056) -+#define MCF_INTC1_ICR23 MCF_REG08(0xFC04C057) -+#define MCF_INTC1_ICR24 MCF_REG08(0xFC04C058) -+#define MCF_INTC1_ICR25 MCF_REG08(0xFC04C059) -+#define MCF_INTC1_ICR26 MCF_REG08(0xFC04C05A) -+#define MCF_INTC1_ICR27 MCF_REG08(0xFC04C05B) -+#define MCF_INTC1_ICR28 MCF_REG08(0xFC04C05C) -+#define MCF_INTC1_ICR29 MCF_REG08(0xFC04C05D) -+#define MCF_INTC1_ICR30 MCF_REG08(0xFC04C05E) -+#define MCF_INTC1_ICR31 MCF_REG08(0xFC04C05F) -+#define MCF_INTC1_ICR32 MCF_REG08(0xFC04C060) -+#define MCF_INTC1_ICR33 MCF_REG08(0xFC04C061) -+#define MCF_INTC1_ICR34 MCF_REG08(0xFC04C062) -+#define MCF_INTC1_ICR35 MCF_REG08(0xFC04C063) -+#define MCF_INTC1_ICR36 MCF_REG08(0xFC04C064) -+#define MCF_INTC1_ICR37 MCF_REG08(0xFC04C065) -+#define MCF_INTC1_ICR38 MCF_REG08(0xFC04C066) -+#define MCF_INTC1_ICR39 MCF_REG08(0xFC04C067) -+#define MCF_INTC1_ICR40 MCF_REG08(0xFC04C068) -+#define MCF_INTC1_ICR41 MCF_REG08(0xFC04C069) -+#define MCF_INTC1_ICR42 MCF_REG08(0xFC04C06A) -+#define MCF_INTC1_ICR43 MCF_REG08(0xFC04C06B) -+#define MCF_INTC1_ICR44 MCF_REG08(0xFC04C06C) -+#define MCF_INTC1_ICR45 MCF_REG08(0xFC04C06D) -+#define MCF_INTC1_ICR46 MCF_REG08(0xFC04C06E) -+#define MCF_INTC1_ICR47 MCF_REG08(0xFC04C06F) -+#define MCF_INTC1_ICR48 MCF_REG08(0xFC04C070) -+#define MCF_INTC1_ICR49 MCF_REG08(0xFC04C071) -+#define MCF_INTC1_ICR50 MCF_REG08(0xFC04C072) -+#define MCF_INTC1_ICR51 MCF_REG08(0xFC04C073) -+#define MCF_INTC1_ICR52 MCF_REG08(0xFC04C074) -+#define MCF_INTC1_ICR53 MCF_REG08(0xFC04C075) -+#define MCF_INTC1_ICR54 MCF_REG08(0xFC04C076) -+#define MCF_INTC1_ICR55 MCF_REG08(0xFC04C077) -+#define MCF_INTC1_ICR56 MCF_REG08(0xFC04C078) -+#define MCF_INTC1_ICR57 MCF_REG08(0xFC04C079) -+#define MCF_INTC1_ICR58 MCF_REG08(0xFC04C07A) -+#define MCF_INTC1_ICR59 MCF_REG08(0xFC04C07B) -+#define MCF_INTC1_ICR60 MCF_REG08(0xFC04C07C) -+#define MCF_INTC1_ICR61 MCF_REG08(0xFC04C07D) -+#define MCF_INTC1_ICR62 MCF_REG08(0xFC04C07E) -+#define MCF_INTC1_ICR63 MCF_REG08(0xFC04C07F) -+#define MCF_INTC1_SWIACK MCF_REG08(0xFC04C0E0) -+#define MCF_INTC1_L1IACK MCF_REG08(0xFC04C0E4) -+#define MCF_INTC1_L2IACK MCF_REG08(0xFC04C0E8) -+#define MCF_INTC1_L3IACK MCF_REG08(0xFC04C0EC) -+#define MCF_INTC1_L4IACK MCF_REG08(0xFC04C0F0) -+#define MCF_INTC1_L5IACK MCF_REG08(0xFC04C0F4) -+#define MCF_INTC1_L6IACK MCF_REG08(0xFC04C0F8 -+#define MCF_INTC1_L7IACK MCF_REG08(0xFC04C0FC) -+ -+/* Parameterized register read/write macros for multiple registers */ -+#define MCF_INTC0_ICR(x) MCF_REG08(0xFC048041+((x-1)*0x001)) -+#define MCF_INTC0_LIACK(x) MCF_REG08(0xFC0480E4+((x-1)*0x004)) -+#define MCF_INTC1_ICR(x) MCF_REG08(0xFC04C041+((x-1)*0x001)) -+#define MCF_INTC1_LIACK(x) MCF_REG08(0xFC04C0E4+((x-1)*0x004)) -+ -+/* Parameterized register read/write macros for multiple modules */ -+#define MCF_INTC_IPRH(x) MCF_REG32(0xFC048000+((x)*0x4000)) -+#define MCF_INTC_IPRL(x) MCF_REG32(0xFC048004+((x)*0x4000)) -+#define MCF_INTC_IMRH(x) MCF_REG32(0xFC048008+((x)*0x4000)) -+#define MCF_INTC_IMRL(x) MCF_REG32(0xFC04800C+((x)*0x4000)) -+#define MCF_INTC_INTFRCH(x) MCF_REG32(0xFC048010+((x)*0x4000)) -+#define MCF_INTC_INTFRCL(x) MCF_REG32(0xFC048014+((x)*0x4000)) -+#define MCF_INTC_ICONFIG(x) MCF_REG16(0xFC04801A+((x)*0x4000)) -+#define MCF_INTC_SIMR(x) MCF_REG08(0xFC04801C+((x)*0x4000)) -+#define MCF_INTC_CIMR(x) MCF_REG08(0xFC04801D+((x)*0x4000)) -+#define MCF_INTC_CLMASK(x) MCF_REG08(0xFC04801E+((x)*0x4000)) -+#define MCF_INTC_SLMASK(x) MCF_REG08(0xFC04801F+((x)*0x4000)) -+#define MCF_INTC_ICR1(x) MCF_REG08(0xFC048041+((x)*0x4000)) -+#define MCF_INTC_ICR2(x) MCF_REG08(0xFC048042+((x)*0x4000)) -+#define MCF_INTC_ICR3(x) MCF_REG08(0xFC048043+((x)*0x4000)) -+#define MCF_INTC_ICR4(x) MCF_REG08(0xFC048044+((x)*0x4000)) -+#define MCF_INTC_ICR5(x) MCF_REG08(0xFC048045+((x)*0x4000)) -+#define MCF_INTC_ICR6(x) MCF_REG08(0xFC048046+((x)*0x4000)) -+#define MCF_INTC_ICR7(x) MCF_REG08(0xFC048047+((x)*0x4000)) -+#define MCF_INTC_ICR8(x) MCF_REG08(0xFC048048+((x)*0x4000)) -+#define MCF_INTC_ICR9(x) MCF_REG08(0xFC048049+((x)*0x4000)) -+#define MCF_INTC_ICR10(x) MCF_REG08(0xFC04804A+((x)*0x4000)) -+#define MCF_INTC_ICR11(x) MCF_REG08(0xFC04804B+((x)*0x4000)) -+#define MCF_INTC_ICR12(x) MCF_REG08(0xFC04804C+((x)*0x4000)) -+#define MCF_INTC_ICR13(x) MCF_REG08(0xFC04804D+((x)*0x4000)) -+#define MCF_INTC_ICR14(x) MCF_REG08(0xFC04804E+((x)*0x4000)) -+#define MCF_INTC_ICR15(x) MCF_REG08(0xFC04804F+((x)*0x4000)) -+#define MCF_INTC_ICR16(x) MCF_REG08(0xFC048050+((x)*0x4000)) -+#define MCF_INTC_ICR17(x) MCF_REG08(0xFC048051+((x)*0x4000)) -+#define MCF_INTC_ICR18(x) MCF_REG08(0xFC048052+((x)*0x4000)) -+#define MCF_INTC_ICR19(x) MCF_REG08(0xFC048053+((x)*0x4000)) -+#define MCF_INTC_ICR20(x) MCF_REG08(0xFC048054+((x)*0x4000)) -+#define MCF_INTC_ICR21(x) MCF_REG08(0xFC048055+((x)*0x4000)) -+#define MCF_INTC_ICR22(x) MCF_REG08(0xFC048056+((x)*0x4000)) -+#define MCF_INTC_ICR23(x) MCF_REG08(0xFC048057+((x)*0x4000)) -+#define MCF_INTC_ICR24(x) MCF_REG08(0xFC048058+((x)*0x4000)) -+#define MCF_INTC_ICR25(x) MCF_REG08(0xFC048059+((x)*0x4000)) -+#define MCF_INTC_ICR26(x) MCF_REG08(0xFC04805A+((x)*0x4000)) -+#define MCF_INTC_ICR27(x) MCF_REG08(0xFC04805B+((x)*0x4000)) -+#define MCF_INTC_ICR28(x) MCF_REG08(0xFC04805C+((x)*0x4000)) -+#define MCF_INTC_ICR29(x) MCF_REG08(0xFC04805D+((x)*0x4000)) -+#define MCF_INTC_ICR30(x) MCF_REG08(0xFC04805E+((x)*0x4000)) -+#define MCF_INTC_ICR31(x) MCF_REG08(0xFC04805F+((x)*0x4000)) -+#define MCF_INTC_ICR32(x) MCF_REG08(0xFC048060+((x)*0x4000)) -+#define MCF_INTC_ICR33(x) MCF_REG08(0xFC048061+((x)*0x4000)) -+#define MCF_INTC_ICR34(x) MCF_REG08(0xFC048062+((x)*0x4000)) -+#define MCF_INTC_ICR35(x) MCF_REG08(0xFC048063+((x)*0x4000)) -+#define MCF_INTC_ICR36(x) MCF_REG08(0xFC048064+((x)*0x4000)) -+#define MCF_INTC_ICR37(x) MCF_REG08(0xFC048065+((x)*0x4000)) -+#define MCF_INTC_ICR38(x) MCF_REG08(0xFC048066+((x)*0x4000)) -+#define MCF_INTC_ICR39(x) MCF_REG08(0xFC048067+((x)*0x4000)) -+#define MCF_INTC_ICR40(x) MCF_REG08(0xFC048068+((x)*0x4000)) -+#define MCF_INTC_ICR41(x) MCF_REG08(0xFC048069+((x)*0x4000)) -+#define MCF_INTC_ICR42(x) MCF_REG08(0xFC04806A+((x)*0x4000)) -+#define MCF_INTC_ICR43(x) MCF_REG08(0xFC04806B+((x)*0x4000)) -+#define MCF_INTC_ICR44(x) MCF_REG08(0xFC04806C+((x)*0x4000)) -+#define MCF_INTC_ICR45(x) MCF_REG08(0xFC04806D+((x)*0x4000)) -+#define MCF_INTC_ICR46(x) MCF_REG08(0xFC04806E+((x)*0x4000)) -+#define MCF_INTC_ICR47(x) MCF_REG08(0xFC04806F+((x)*0x4000)) -+#define MCF_INTC_ICR48(x) MCF_REG08(0xFC048070+((x)*0x4000)) -+#define MCF_INTC_ICR49(x) MCF_REG08(0xFC048071+((x)*0x4000)) -+#define MCF_INTC_ICR50(x) MCF_REG08(0xFC048072+((x)*0x4000)) -+#define MCF_INTC_ICR51(x) MCF_REG08(0xFC048073+((x)*0x4000)) -+#define MCF_INTC_ICR52(x) MCF_REG08(0xFC048074+((x)*0x4000)) -+#define MCF_INTC_ICR53(x) MCF_REG08(0xFC048075+((x)*0x4000)) -+#define MCF_INTC_ICR54(x) MCF_REG08(0xFC048076+((x)*0x4000)) -+#define MCF_INTC_ICR55(x) MCF_REG08(0xFC048077+((x)*0x4000)) -+#define MCF_INTC_ICR56(x) MCF_REG08(0xFC048078+((x)*0x4000)) -+#define MCF_INTC_ICR57(x) MCF_REG08(0xFC048079+((x)*0x4000)) -+#define MCF_INTC_ICR58(x) MCF_REG08(0xFC04807A+((x)*0x4000)) -+#define MCF_INTC_ICR59(x) MCF_REG08(0xFC04807B+((x)*0x4000)) -+#define MCF_INTC_ICR60(x) MCF_REG08(0xFC04807C+((x)*0x4000)) -+#define MCF_INTC_ICR61(x) MCF_REG08(0xFC04807D+((x)*0x4000)) -+#define MCF_INTC_ICR62(x) MCF_REG08(0xFC04807E+((x)*0x4000)) -+#define MCF_INTC_ICR63(x) MCF_REG08(0xFC04807F+((x)*0x4000)) -+#define MCF_INTC_SWIACK(x) MCF_REG08(0xFC0480E0+((x)*0x4000)) -+#define MCF_INTC_L1IACK(x) MCF_REG08(0xFC0480E4+((x)*0x4000)) -+#define MCF_INTC_L2IACK(x) MCF_REG08(0xFC0480E8+((x)*0x4000)) -+#define MCF_INTC_L3IACK(x) MCF_REG08(0xFC0480EC+((x)*0x4000)) -+#define MCF_INTC_L4IACK(x) MCF_REG08(0xFC0480F0+((x)*0x4000)) -+#define MCF_INTC_L5IACK(x) MCF_REG08(0xFC0480F4+((x)*0x4000)) -+#define MCF_INTC_L6IACK(x) MCF_REG08(0xFC0480F8+((x)*0x4000)) -+#define MCF_INTC_L7IACK(x) MCF_REG08(0xFC0480FC+((x)*0x4000)) -+ -+/* Bit definitions and macros for IPRH */ -+#define MCF_INTC_IPRH_INT32 (0x00000001) -+#define MCF_INTC_IPRH_INT33 (0x00000002) -+#define MCF_INTC_IPRH_INT34 (0x00000004) -+#define MCF_INTC_IPRH_INT35 (0x00000008) -+#define MCF_INTC_IPRH_INT36 (0x00000010) -+#define MCF_INTC_IPRH_INT37 (0x00000020) -+#define MCF_INTC_IPRH_INT38 (0x00000040) -+#define MCF_INTC_IPRH_INT39 (0x00000080) -+#define MCF_INTC_IPRH_INT40 (0x00000100) -+#define MCF_INTC_IPRH_INT41 (0x00000200) -+#define MCF_INTC_IPRH_INT42 (0x00000400) -+#define MCF_INTC_IPRH_INT43 (0x00000800) -+#define MCF_INTC_IPRH_INT44 (0x00001000) -+#define MCF_INTC_IPRH_INT45 (0x00002000) -+#define MCF_INTC_IPRH_INT46 (0x00004000) -+#define MCF_INTC_IPRH_INT47 (0x00008000) -+#define MCF_INTC_IPRH_INT48 (0x00010000) -+#define MCF_INTC_IPRH_INT49 (0x00020000) -+#define MCF_INTC_IPRH_INT50 (0x00040000) -+#define MCF_INTC_IPRH_INT51 (0x00080000) -+#define MCF_INTC_IPRH_INT52 (0x00100000) -+#define MCF_INTC_IPRH_INT53 (0x00200000) -+#define MCF_INTC_IPRH_INT54 (0x00400000) -+#define MCF_INTC_IPRH_INT55 (0x00800000) -+#define MCF_INTC_IPRH_INT56 (0x01000000) -+#define MCF_INTC_IPRH_INT57 (0x02000000) -+#define MCF_INTC_IPRH_INT58 (0x04000000) -+#define MCF_INTC_IPRH_INT59 (0x08000000) -+#define MCF_INTC_IPRH_INT60 (0x10000000) -+#define MCF_INTC_IPRH_INT61 (0x20000000) -+#define MCF_INTC_IPRH_INT62 (0x40000000) -+#define MCF_INTC_IPRH_INT63 (0x80000000) -+ -+/* Bit definitions and macros for IPRL */ -+#define MCF_INTC_IPRL_INT0 (0x00000001) -+#define MCF_INTC_IPRL_INT1 (0x00000002) -+#define MCF_INTC_IPRL_INT2 (0x00000004) -+#define MCF_INTC_IPRL_INT3 (0x00000008) -+#define MCF_INTC_IPRL_INT4 (0x00000010) -+#define MCF_INTC_IPRL_INT5 (0x00000020) -+#define MCF_INTC_IPRL_INT6 (0x00000040) -+#define MCF_INTC_IPRL_INT7 (0x00000080) -+#define MCF_INTC_IPRL_INT8 (0x00000100) -+#define MCF_INTC_IPRL_INT9 (0x00000200) -+#define MCF_INTC_IPRL_INT10 (0x00000400) -+#define MCF_INTC_IPRL_INT11 (0x00000800) -+#define MCF_INTC_IPRL_INT12 (0x00001000) -+#define MCF_INTC_IPRL_INT13 (0x00002000) -+#define MCF_INTC_IPRL_INT14 (0x00004000) -+#define MCF_INTC_IPRL_INT15 (0x00008000) -+#define MCF_INTC_IPRL_INT16 (0x00010000) -+#define MCF_INTC_IPRL_INT17 (0x00020000) -+#define MCF_INTC_IPRL_INT18 (0x00040000) -+#define MCF_INTC_IPRL_INT19 (0x00080000) -+#define MCF_INTC_IPRL_INT20 (0x00100000) -+#define MCF_INTC_IPRL_INT21 (0x00200000) -+#define MCF_INTC_IPRL_INT22 (0x00400000) -+#define MCF_INTC_IPRL_INT23 (0x00800000) -+#define MCF_INTC_IPRL_INT24 (0x01000000) -+#define MCF_INTC_IPRL_INT25 (0x02000000) -+#define MCF_INTC_IPRL_INT26 (0x04000000) -+#define MCF_INTC_IPRL_INT27 (0x08000000) -+#define MCF_INTC_IPRL_INT28 (0x10000000) -+#define MCF_INTC_IPRL_INT29 (0x20000000) -+#define MCF_INTC_IPRL_INT30 (0x40000000) -+#define MCF_INTC_IPRL_INT31 (0x80000000) -+ -+/* Bit definitions and macros for IMRH */ -+#define MCF_INTC_IMRH_INT_MASK32 (0x00000001) -+#define MCF_INTC_IMRH_INT_MASK33 (0x00000002) -+#define MCF_INTC_IMRH_INT_MASK34 (0x00000004) -+#define MCF_INTC_IMRH_INT_MASK35 (0x00000008) -+#define MCF_INTC_IMRH_INT_MASK36 (0x00000010) -+#define MCF_INTC_IMRH_INT_MASK37 (0x00000020) -+#define MCF_INTC_IMRH_INT_MASK38 (0x00000040) -+#define MCF_INTC_IMRH_INT_MASK39 (0x00000080) -+#define MCF_INTC_IMRH_INT_MASK40 (0x00000100) -+#define MCF_INTC_IMRH_INT_MASK41 (0x00000200) -+#define MCF_INTC_IMRH_INT_MASK42 (0x00000400) -+#define MCF_INTC_IMRH_INT_MASK43 (0x00000800) -+#define MCF_INTC_IMRH_INT_MASK44 (0x00001000) -+#define MCF_INTC_IMRH_INT_MASK45 (0x00002000) -+#define MCF_INTC_IMRH_INT_MASK46 (0x00004000) -+#define MCF_INTC_IMRH_INT_MASK47 (0x00008000) -+#define MCF_INTC_IMRH_INT_MASK48 (0x00010000) -+#define MCF_INTC_IMRH_INT_MASK49 (0x00020000) -+#define MCF_INTC_IMRH_INT_MASK50 (0x00040000) -+#define MCF_INTC_IMRH_INT_MASK51 (0x00080000) -+#define MCF_INTC_IMRH_INT_MASK52 (0x00100000) -+#define MCF_INTC_IMRH_INT_MASK53 (0x00200000) -+#define MCF_INTC_IMRH_INT_MASK54 (0x00400000) -+#define MCF_INTC_IMRH_INT_MASK55 (0x00800000) -+#define MCF_INTC_IMRH_INT_MASK56 (0x01000000) -+#define MCF_INTC_IMRH_INT_MASK57 (0x02000000) -+#define MCF_INTC_IMRH_INT_MASK58 (0x04000000) -+#define MCF_INTC_IMRH_INT_MASK59 (0x08000000) -+#define MCF_INTC_IMRH_INT_MASK60 (0x10000000) -+#define MCF_INTC_IMRH_INT_MASK61 (0x20000000) -+#define MCF_INTC_IMRH_INT_MASK62 (0x40000000) -+#define MCF_INTC_IMRH_INT_MASK63 (0x80000000) -+ -+/* Bit definitions and macros for IMRL */ -+#define MCF_INTC_IMRL_INT_MASK0 (0x00000001) -+#define MCF_INTC_IMRL_INT_MASK1 (0x00000002) -+#define MCF_INTC_IMRL_INT_MASK2 (0x00000004) -+#define MCF_INTC_IMRL_INT_MASK3 (0x00000008) -+#define MCF_INTC_IMRL_INT_MASK4 (0x00000010) -+#define MCF_INTC_IMRL_INT_MASK5 (0x00000020) -+#define MCF_INTC_IMRL_INT_MASK6 (0x00000040) -+#define MCF_INTC_IMRL_INT_MASK7 (0x00000080) -+#define MCF_INTC_IMRL_INT_MASK8 (0x00000100) -+#define MCF_INTC_IMRL_INT_MASK9 (0x00000200) -+#define MCF_INTC_IMRL_INT_MASK10 (0x00000400) -+#define MCF_INTC_IMRL_INT_MASK11 (0x00000800) -+#define MCF_INTC_IMRL_INT_MASK12 (0x00001000) -+#define MCF_INTC_IMRL_INT_MASK13 (0x00002000) -+#define MCF_INTC_IMRL_INT_MASK14 (0x00004000) -+#define MCF_INTC_IMRL_INT_MASK15 (0x00008000) -+#define MCF_INTC_IMRL_INT_MASK16 (0x00010000) -+#define MCF_INTC_IMRL_INT_MASK17 (0x00020000) -+#define MCF_INTC_IMRL_INT_MASK18 (0x00040000) -+#define MCF_INTC_IMRL_INT_MASK19 (0x00080000) -+#define MCF_INTC_IMRL_INT_MASK20 (0x00100000) -+#define MCF_INTC_IMRL_INT_MASK21 (0x00200000) -+#define MCF_INTC_IMRL_INT_MASK22 (0x00400000) -+#define MCF_INTC_IMRL_INT_MASK23 (0x00800000) -+#define MCF_INTC_IMRL_INT_MASK24 (0x01000000) -+#define MCF_INTC_IMRL_INT_MASK25 (0x02000000) -+#define MCF_INTC_IMRL_INT_MASK26 (0x04000000) -+#define MCF_INTC_IMRL_INT_MASK27 (0x08000000) -+#define MCF_INTC_IMRL_INT_MASK28 (0x10000000) -+#define MCF_INTC_IMRL_INT_MASK29 (0x20000000) -+#define MCF_INTC_IMRL_INT_MASK30 (0x40000000) -+#define MCF_INTC_IMRL_INT_MASK31 (0x80000000) -+ -+/* Bit definitions and macros for INTFRCH */ -+#define MCF_INTC_INTFRCH_INTFRC32 (0x00000001) -+#define MCF_INTC_INTFRCH_INTFRC33 (0x00000002) -+#define MCF_INTC_INTFRCH_INTFRC34 (0x00000004) -+#define MCF_INTC_INTFRCH_INTFRC35 (0x00000008) -+#define MCF_INTC_INTFRCH_INTFRC36 (0x00000010) -+#define MCF_INTC_INTFRCH_INTFRC37 (0x00000020) -+#define MCF_INTC_INTFRCH_INTFRC38 (0x00000040) -+#define MCF_INTC_INTFRCH_INTFRC39 (0x00000080) -+#define MCF_INTC_INTFRCH_INTFRC40 (0x00000100) -+#define MCF_INTC_INTFRCH_INTFRC41 (0x00000200) -+#define MCF_INTC_INTFRCH_INTFRC42 (0x00000400) -+#define MCF_INTC_INTFRCH_INTFRC43 (0x00000800) -+#define MCF_INTC_INTFRCH_INTFRC44 (0x00001000) -+#define MCF_INTC_INTFRCH_INTFRC45 (0x00002000) -+#define MCF_INTC_INTFRCH_INTFRC46 (0x00004000) -+#define MCF_INTC_INTFRCH_INTFRC47 (0x00008000) -+#define MCF_INTC_INTFRCH_INTFRC48 (0x00010000) -+#define MCF_INTC_INTFRCH_INTFRC49 (0x00020000) -+#define MCF_INTC_INTFRCH_INTFRC50 (0x00040000) -+#define MCF_INTC_INTFRCH_INTFRC51 (0x00080000) -+#define MCF_INTC_INTFRCH_INTFRC52 (0x00100000) -+#define MCF_INTC_INTFRCH_INTFRC53 (0x00200000) -+#define MCF_INTC_INTFRCH_INTFRC54 (0x00400000) -+#define MCF_INTC_INTFRCH_INTFRC55 (0x00800000) -+#define MCF_INTC_INTFRCH_INTFRC56 (0x01000000) -+#define MCF_INTC_INTFRCH_INTFRC57 (0x02000000) -+#define MCF_INTC_INTFRCH_INTFRC58 (0x04000000) -+#define MCF_INTC_INTFRCH_INTFRC59 (0x08000000) -+#define MCF_INTC_INTFRCH_INTFRC60 (0x10000000) -+#define MCF_INTC_INTFRCH_INTFRC61 (0x20000000) -+#define MCF_INTC_INTFRCH_INTFRC62 (0x40000000) -+#define MCF_INTC_INTFRCH_INTFRC63 (0x80000000) -+ -+/* Bit definitions and macros for INTFRCL */ -+#define MCF_INTC_INTFRCL_INTFRC0 (0x00000001) -+#define MCF_INTC_INTFRCL_INTFRC1 (0x00000002) -+#define MCF_INTC_INTFRCL_INTFRC2 (0x00000004) -+#define MCF_INTC_INTFRCL_INTFRC3 (0x00000008) -+#define MCF_INTC_INTFRCL_INTFRC4 (0x00000010) -+#define MCF_INTC_INTFRCL_INTFRC5 (0x00000020) -+#define MCF_INTC_INTFRCL_INTFRC6 (0x00000040) -+#define MCF_INTC_INTFRCL_INTFRC7 (0x00000080) -+#define MCF_INTC_INTFRCL_INTFRC8 (0x00000100) -+#define MCF_INTC_INTFRCL_INTFRC9 (0x00000200) -+#define MCF_INTC_INTFRCL_INTFRC10 (0x00000400) -+#define MCF_INTC_INTFRCL_INTFRC11 (0x00000800) -+#define MCF_INTC_INTFRCL_INTFRC12 (0x00001000) -+#define MCF_INTC_INTFRCL_INTFRC13 (0x00002000) -+#define MCF_INTC_INTFRCL_INTFRC14 (0x00004000) -+#define MCF_INTC_INTFRCL_INTFRC15 (0x00008000) -+#define MCF_INTC_INTFRCL_INTFRC16 (0x00010000) -+#define MCF_INTC_INTFRCL_INTFRC17 (0x00020000) -+#define MCF_INTC_INTFRCL_INTFRC18 (0x00040000) -+#define MCF_INTC_INTFRCL_INTFRC19 (0x00080000) -+#define MCF_INTC_INTFRCL_INTFRC20 (0x00100000) -+#define MCF_INTC_INTFRCL_INTFRC21 (0x00200000) -+#define MCF_INTC_INTFRCL_INTFRC22 (0x00400000) -+#define MCF_INTC_INTFRCL_INTFRC23 (0x00800000) -+#define MCF_INTC_INTFRCL_INTFRC24 (0x01000000) -+#define MCF_INTC_INTFRCL_INTFRC25 (0x02000000) -+#define MCF_INTC_INTFRCL_INTFRC26 (0x04000000) -+#define MCF_INTC_INTFRCL_INTFRC27 (0x08000000) -+#define MCF_INTC_INTFRCL_INTFRC28 (0x10000000) -+#define MCF_INTC_INTFRCL_INTFRC29 (0x20000000) -+#define MCF_INTC_INTFRCL_INTFRC30 (0x40000000) -+#define MCF_INTC_INTFRCL_INTFRC31 (0x80000000) -+ -+/* Bit definitions and macros for ICONFIG */ -+#define MCF_INTC_ICONFIG_EMASK (0x0020) -+#define MCF_INTC_ICONFIG_ELVLPRI1 (0x0200) -+#define MCF_INTC_ICONFIG_ELVLPRI2 (0x0400) -+#define MCF_INTC_ICONFIG_ELVLPRI3 (0x0800) -+#define MCF_INTC_ICONFIG_ELVLPRI4 (0x1000) -+#define MCF_INTC_ICONFIG_ELVLPRI5 (0x2000) -+#define MCF_INTC_ICONFIG_ELVLPRI6 (0x4000) -+#define MCF_INTC_ICONFIG_ELVLPRI7 (0x8000) -+ -+/* Bit definitions and macros for SIMR */ -+#define MCF_INTC_SIMR_SIMR(x) (((x)&0x7F)) -+ -+/* Bit definitions and macros for CIMR */ -+#define MCF_INTC_CIMR_CIMR(x) (((x)&0x7F)) -+ -+/* Bit definitions and macros for CLMASK */ -+#define MCF_INTC_CLMASK_CLMASK(x) (((x)&0x0F)) -+ -+/* Bit definitions and macros for SLMASK */ -+#define MCF_INTC_SLMASK_SLMASK(x) (((x)&0x0F)) -+ -+/* Bit definitions and macros for ICR group */ -+#define MCF_INTC_ICR_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR1 */ -+#define MCF_INTC_ICR1_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR2 */ -+#define MCF_INTC_ICR2_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR3 */ -+#define MCF_INTC_ICR3_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR4 */ -+#define MCF_INTC_ICR4_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR5 */ -+#define MCF_INTC_ICR5_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR6 */ -+#define MCF_INTC_ICR6_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR7 */ -+#define MCF_INTC_ICR7_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR8 */ -+#define MCF_INTC_ICR8_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR9 */ -+#define MCF_INTC_ICR9_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR10 */ -+#define MCF_INTC_ICR10_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR11 */ -+#define MCF_INTC_ICR11_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR12 */ -+#define MCF_INTC_ICR12_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR13 */ -+#define MCF_INTC_ICR13_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR14 */ -+#define MCF_INTC_ICR14_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR15 */ -+#define MCF_INTC_ICR15_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR16 */ -+#define MCF_INTC_ICR16_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR17 */ -+#define MCF_INTC_ICR17_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR18 */ -+#define MCF_INTC_ICR18_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR19 */ -+#define MCF_INTC_ICR19_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR20 */ -+#define MCF_INTC_ICR20_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR21 */ -+#define MCF_INTC_ICR21_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR22 */ -+#define MCF_INTC_ICR22_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR23 */ -+#define MCF_INTC_ICR23_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR24 */ -+#define MCF_INTC_ICR24_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR25 */ -+#define MCF_INTC_ICR25_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR26 */ -+#define MCF_INTC_ICR26_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR27 */ -+#define MCF_INTC_ICR27_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR28 */ -+#define MCF_INTC_ICR28_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR29 */ -+#define MCF_INTC_ICR29_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR30 */ -+#define MCF_INTC_ICR30_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR31 */ -+#define MCF_INTC_ICR31_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR32 */ -+#define MCF_INTC_ICR32_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR33 */ -+#define MCF_INTC_ICR33_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR34 */ -+#define MCF_INTC_ICR34_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR35 */ -+#define MCF_INTC_ICR35_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR36 */ -+#define MCF_INTC_ICR36_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR37 */ -+#define MCF_INTC_ICR37_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR38 */ -+#define MCF_INTC_ICR38_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR39 */ -+#define MCF_INTC_ICR39_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR40 */ -+#define MCF_INTC_ICR40_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR41 */ -+#define MCF_INTC_ICR41_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR42 */ -+#define MCF_INTC_ICR42_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR43 */ -+#define MCF_INTC_ICR43_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR44 */ -+#define MCF_INTC_ICR44_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR45 */ -+#define MCF_INTC_ICR45_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR46 */ -+#define MCF_INTC_ICR46_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR47 */ -+#define MCF_INTC_ICR47_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR48 */ -+#define MCF_INTC_ICR48_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR49 */ -+#define MCF_INTC_ICR49_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR50 */ -+#define MCF_INTC_ICR50_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR51 */ -+#define MCF_INTC_ICR51_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR52 */ -+#define MCF_INTC_ICR52_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR53 */ -+#define MCF_INTC_ICR53_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR54 */ -+#define MCF_INTC_ICR54_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR55 */ -+#define MCF_INTC_ICR55_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR56 */ -+#define MCF_INTC_ICR56_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR57 */ -+#define MCF_INTC_ICR57_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR58 */ -+#define MCF_INTC_ICR58_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR59 */ -+#define MCF_INTC_ICR59_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR60 */ -+#define MCF_INTC_ICR60_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR61 */ -+#define MCF_INTC_ICR61_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR62 */ -+#define MCF_INTC_ICR62_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for ICR63 */ -+#define MCF_INTC_ICR63_IL(x) (((x)&0x07)) -+ -+/* Bit definitions and macros for SWIACK */ -+#define MCF_INTC_SWIACK_VECTOR(x) (x) -+ -+/* Bit definitions and macros for LIACK group */ -+#define MCF_INTC_LIACK_VECTOR(x) (x) -+ -+/* Bit definitions and macros for L1IACK */ -+#define MCF_INTC_L1IACK_VECTOR(x) (x) -+ -+/* Bit definitions and macros for L2IACK */ -+#define MCF_INTC_L2IACK_VECTOR(x) (x) -+ -+/* Bit definitions and macros for L3IACK */ -+#define MCF_INTC_L3IACK_VECTOR(x) (x) -+ -+/* Bit definitions and macros for L4IACK */ -+#define MCF_INTC_L4IACK_VECTOR(x) (x) -+ -+/* Bit definitions and macros for L5IACK */ -+#define MCF_INTC_L5IACK_VECTOR(x) (x) -+ -+/* Bit definitions and macros for L6IACK */ -+#define MCF_INTC_L6IACK_VECTOR(x) (x) -+ -+/* Bit definitions and macros for L7IACK */ -+#define MCF_INTC_L7IACK_VECTOR(x) (x) -+ -+/********************************************************************/ -+ -+#endif /* __MCF5445X_INTC_H__ */ ---- /dev/null -+++ b/include/asm-m68k/mcf5445x_pciarb.h -@@ -0,0 +1,40 @@ -+/* -+ * Kurt Mahan kmahan@freescale.com -+ * -+ * Copyright Freescale Semiconductor, Inc. 2007 -+ * -+ * This program is free software; you can redistribute it and/or modify it -+ * under the terms of the GNU General Public License as published by the -+ * Free Software Foundation; either version 2 of the License, or (at your -+ * option) any later version. -+ */ -+ -+#ifndef __MCF5445X_PCIARB_H__ -+#define __MCF5445X_PCIARB_H__ -+ -+/********************************************************************* -+* -+* PCI Arbiter Module (PCIARB) -+* -+*********************************************************************/ -+ -+/* Register read/write macros */ -+#define MCF_PCIARB_PACR MCF_REG32(0xFC0AC000) -+#define MCF_PCIARB_PASR MCF_REG32(0xFC0AC004) -+ -+/* Bit definitions and macros for PACR */ -+#define MCF_PCIARB_PACR_INTMPRI (0x00000001) -+#define MCF_PCIARB_PACR_EXTMPRI(x) (((x)&0x0000001F)<<1) -+#define MCF_PCIARB_PACR_RA (0x00008000) -+#define MCF_PCIARB_PACR_INTMINTEN (0x00010000) -+#define MCF_PCIARB_PACR_EXTMINTEN(x) (((x)&0x0000001F)<<17) -+#define MCF_PCIARB_PACR_PKMD (0x40000000) -+#define MCF_PCIARB_PACR_DS (0x80000000) -+ -+/* Bit definitions and macros for PASR */ -+#define MCF_PCIARB_PASR_ITLMBK (0x00010000) -+#define MCF_PCIARB_PASR_EXTMBK(x) (((x)&0x0000001F)<<17) -+ -+/********************************************************************/ -+ -+#endif /* __MCF5445X_PCIARB_H__ */ ---- /dev/null -+++ b/include/asm-m68k/mcf5445x_pci.h -@@ -0,0 +1,238 @@ -+/* -+ * Kurt Mahan kmahan@freescale.com -+ * -+ * Copyright Freescale Semiconductor, Inc. 2007 -+ * -+ * This program is free software; you can redistribute it and/or modify it -+ * under the terms of the GNU General Public License as published by the -+ * Free Software Foundation; either version 2 of the License, or (at your -+ * option) any later version. -+ */ -+ -+#ifndef __MCF5445X_PCI_H__ -+#define __MCF5445X_PCI_H__ -+ -+/********************************************************************* -+* -+* PCI Bus Controller (PCI) -+* -+*********************************************************************/ -+ -+/* Register read/write macros */ -+#define MCF_PCI_PCIIDR MCF_REG32(0xFC0A8000) -+#define MCF_PCI_PCISCR MCF_REG32(0xFC0A8004) -+#define MCF_PCI_PCICCRIR MCF_REG32(0xFC0A8008) -+#define MCF_PCI_PCICR1 MCF_REG32(0xFC0A800C) -+#define MCF_PCI_PCIBAR0 MCF_REG32(0xFC0A8010) -+#define MCF_PCI_PCIBAR1 MCF_REG32(0xFC0A8014) -+#define MCF_PCI_PCIBAR2 MCF_REG32(0xFC0A8018) -+#define MCF_PCI_PCIBAR3 MCF_REG32(0xFC0A801C) -+#define MCF_PCI_PCIBAR4 MCF_REG32(0xFC0A8020) -+#define MCF_PCI_PCIBAR5 MCF_REG32(0xFC0A8024) -+#define MCF_PCI_PCISID MCF_REG32(0xFC0A802C) -+#define MCF_PCI_PCICR2 MCF_REG32(0xFC0A803C) -+#define MCF_PCI_PCIGSCR MCF_REG32(0xFC0A8060) -+#define MCF_PCI_PCITBATR0A MCF_REG32(0xFC0A8064) -+#define MCF_PCI_PCITBATR1A MCF_REG32(0xFC0A8068) -+#define MCF_PCI_PCITCR MCF_REG32(0xFC0A806C) -+#define MCF_PCI_PCIIW0BTAR MCF_REG32(0xFC0A8070) -+#define MCF_PCI_PCIIW1BTAR MCF_REG32(0xFC0A8074) -+#define MCF_PCI_PCIIW2BTAR MCF_REG32(0xFC0A8078) -+#define MCF_PCI_PCIIWCR MCF_REG32(0xFC0A8080) -+#define MCF_PCI_PCIICR MCF_REG32(0xFC0A8084) -+#define MCF_PCI_PCIISR MCF_REG32(0xFC0A8088) -+#define MCF_PCI_PCITCR2 MCF_REG32(0xFC0A808C) -+#define MCF_PCI_PCITBATR0 MCF_REG32(0xFC0A8090) -+#define MCF_PCI_PCITBATR1 MCF_REG32(0xFC0A8094) -+#define MCF_PCI_PCITBATR2 MCF_REG32(0xFC0A8098) -+#define MCF_PCI_PCITBATR3 MCF_REG32(0xFC0A809C) -+#define MCF_PCI_PCITBATR4 MCF_REG32(0xFC0A80A0) -+#define MCF_PCI_PCITBATR5 MCF_REG32(0xFC0A80A4) -+#define MCF_PCI_PCICAR MCF_REG32(0xFC0A80F8) -+ -+/* Parameterized register read/write macros for multiple registers */ -+#define MCF_PCI_PCIIWBTAR(x) MCF_REG32(0xFC0A8070+((x)*0x004)) -+ -+/* Bit definitions and macros for PCIIDR */ -+#define MCF_PCI_PCIIDR_VENDORID(x) (((x)&0x0000FFFF)) -+#define MCF_PCI_PCIIDR_DEVICEID(x) (((x)&0x0000FFFF)<<16) -+ -+/* Bit definitions and macros for PCISCR */ -+#define MCF_PCI_PCISCR_M (0x00000002) -+#define MCF_PCI_PCISCR_B (0x00000004) -+#define MCF_PCI_PCISCR_SP (0x00000008) -+#define MCF_PCI_PCISCR_MW (0x00000010) -+#define MCF_PCI_PCISCR_PER (0x00000040) -+#define MCF_PCI_PCISCR_S (0x00000100) -+#define MCF_PCI_PCISCR_F (0x00000200) -+#define MCF_PCI_PCISCR_C (0x00100000) -+#define MCF_PCI_PCISCR_66M (0x00200000) -+#define MCF_PCI_PCISCR_R (0x00400000) -+#define MCF_PCI_PCISCR_FC (0x00800000) -+#define MCF_PCI_PCISCR_DP (0x01000000) -+#define MCF_PCI_PCISCR_DT(x) (((x)&0x00000003)<<25) -+#define MCF_PCI_PCISCR_TS (0x08000000) -+#define MCF_PCI_PCISCR_TR (0x10000000) -+#define MCF_PCI_PCISCR_MA (0x20000000) -+#define MCF_PCI_PCISCR_SE (0x40000000) -+#define MCF_PCI_PCISCR_PE (0x80000000) -+ -+/* Bit definitions and macros for PCICCRIR */ -+#define MCF_PCI_PCICCRIR_REVID(x) (((x)&0x000000FF)) -+#define MCF_PCI_PCICCRIR_CLASSCODE(x) (((x)&0x00FFFFFF)<<8) -+ -+/* Bit definitions and macros for PCICR1 */ -+#define MCF_PCI_PCICR1_CACHELINESIZE(x) (((x)&0x0000000F)) -+#define MCF_PCI_PCICR1_LATTIMER(x) (((x)&0x000000FF)<<8) -+#define MCF_PCI_PCICR1_HEADERTYPE(x) (((x)&0x000000FF)<<16) -+#define MCF_PCI_PCICR1_BIST(x) (((x)&0x000000FF)<<24) -+ -+/* Bit definitions and macros for PCIBAR0 */ -+#define MCF_PCI_PCIBAR0_IO (0x00000001) -+#define MCF_PCI_PCIBAR0_RANGE(x) (((x)&0x00000003)<<1) -+#define MCF_PCI_PCIBAR0_PREF (0x00000008) -+#define MCF_PCI_PCIBAR0_BAR0(x) (((x)&0x00003FFF)<<18) -+ -+/* Bit definitions and macros for PCIBAR1 */ -+#define MCF_PCI_PCIBAR1_IO (0x00000001) -+#define MCF_PCI_PCIBAR1_PREF (0x00000008) -+#define MCF_PCI_PCIBAR1_BAR1(x) (((x)&0x00000FFF)<<20) -+ -+/* Bit definitions and macros for PCIBAR2 */ -+#define MCF_PCI_PCIBAR2_IO (0x00000001) -+#define MCF_PCI_PCIBAR2_RANGE(x) (((x)&0x00000003)<<1) -+#define MCF_PCI_PCIBAR2_PREF (0x00000008) -+#define MCF_PCI_PCIBAR2_BAR2(x) (((x)&0x000003FF)<<22) -+ -+/* Bit definitions and macros for PCIBAR3 */ -+#define MCF_PCI_PCIBAR3_IO (0x00000001) -+#define MCF_PCI_PCIBAR3_PREF (0x00000008) -+#define MCF_PCI_PCIBAR3_BAR3(x) (((x)&0x000000FF)<<24) -+ -+/* Bit definitions and macros for PCIBAR4 */ -+#define MCF_PCI_PCIBAR4_IO (0x00000001) -+#define MCF_PCI_PCIBAR4_RANGE(x) (((x)&0x00000003)<<1) -+#define MCF_PCI_PCIBAR4_PREF (0x00000008) -+#define MCF_PCI_PCIBAR4_BAR4(x) (((x)&0x0000001F)<<27) -+ -+/* Bit definitions and macros for PCIBAR5 */ -+#define MCF_PCI_PCIBAR5_IO (0x00000001) -+#define MCF_PCI_PCIBAR5_PREF (0x00000008) -+#define MCF_PCI_PCIBAR5_BAR5(x) (((x)&0x0000000F)<<28) -+ -+/* Bit definitions and macros for PCISID */ -+#define MCF_PCI_PCISID_VENDORID(x) (((x)&0x0000FFFF)) -+#define MCF_PCI_PCISID_ID(x) (((x)&0x0000FFFF)<<16) -+ -+/* Bit definitions and macros for PCICR2 */ -+#define MCF_PCI_PCICR2_INTLINE(x) (((x)&0x000000FF)) -+#define MCF_PCI_PCICR2_INTPIN(x) (((x)&0x000000FF)<<8) -+#define MCF_PCI_PCICR2_MINGNT(x) (((x)&0x000000FF)<<16) -+#define MCF_PCI_PCICR2_MAXLAT(x) (((x)&0x000000FF)<<24) -+ -+/* Bit definitions and macros for PCIGSCR */ -+#define MCF_PCI_PCIGSCR_PR (0x00000001) -+#define MCF_PCI_PCIGSCR_SEE (0x00001000) -+#define MCF_PCI_PCIGSCR_PEE (0x00002000) -+#define MCF_PCI_PCIGSCR_SE (0x10000000) -+#define MCF_PCI_PCIGSCR_PE (0x20000000) -+ -+/* Bit definitions and macros for PCITBATR0A */ -+#define MCF_PCI_PCITBATR0A_EN (0x00000001) -+#define MCF_PCI_PCITBATR0A_BAT0(x) (((x)&0x00003FFF)<<18) -+ -+/* Bit definitions and macros for PCITBATR1A */ -+#define MCF_PCI_PCITBATR1A_EN (0x00000001) -+#define MCF_PCI_PCITBATR1A_BAT1(x) (((x)&0x00000FFF)<<20) -+ -+/* Bit definitions and macros for PCITCR */ -+#define MCF_PCI_PCITCR_WCT(x) (((x)&0x000000FF)) -+#define MCF_PCI_PCITCR_WCD (0x00000100) -+#define MCF_PCI_PCITCR_P (0x00010000) -+#define MCF_PCI_PCITCR_PID (0x00020000) -+#define MCF_PCI_PCITCR_LD (0x01000000) -+ -+/* Bit definitions and macros for PCIIWBTAR group */ -+#define MCF_PCI_PCIIWBTAR_WBA(x) ((((x)&0xFF000000))) -+#define MCF_PCI_PCIIWBTAR_WAM(x) ((((x)&0xFF000000) -+#define MCF_PCI_PCIIWBTAR_WTA(x) ((((x)&0xFF000000) -+ -+/* Bit definitions and macros for PCIIW0BTAR */ -+#define MCF_PCI_PCIIW0BTAR_WBA(x) ((((x)&0xFF000000))) -+#define MCF_PCI_PCIIW0BTAR_WAM(x) ((((x)&0xFF000000) -+#define MCF_PCI_PCIIW0BTAR_WTA(x) ((((x)&0xFF000000) -+ -+/* Bit definitions and macros for PCIIWCR */ -+#define MCF_PCI_PCIIWCR_WINCTRL2(x) (((x)&0x0000000F)<<8) -+#define MCF_PCI_PCIIWCR_WINCTRL1(x) (((x)&0x0000000F)<<16) -+#define MCF_PCI_PCIIWCR_WINCTRL0(x) (((x)&0x0000000F)<<24) -+#define MCF_PCI_PCIIWCR_WINCTRL0_ENABLE (0x01000000) -+#define MCF_PCI_PCIIWCR_WINCTRL0_MEMREAD (0x01000000) -+#define MCF_PCI_PCIIWCR_WINCTRL0_MEMRDLINE (0x03000000) -+#define MCF_PCI_PCIIWCR_WINCTRL0_MEMRDMUL (0x05000000) -+#define MCF_PCI_PCIIWCR_WINCTRL0_IO (0x09000000) -+#define MCF_PCI_PCIIWCR_WINCTRL1_MEMREAD (0x00010000) -+#define MCF_PCI_PCIIWCR_WINCTRL1_ENABLE (0x00010000) -+#define MCF_PCI_PCIIWCR_WINCTRL1_MEMRDLINE (0x00030000) -+#define MCF_PCI_PCIIWCR_WINCTRL1_MEMRDMUL (0x00050000) -+#define MCF_PCI_PCIIWCR_WINCTRL1_IO (0x00090000) -+#define MCF_PCI_PCIIWCR_WINCTRL2_ENABLE (0x00000100) -+#define MCF_PCI_PCIIWCR_WINCTRL2_MEMREAD (0x00000100) -+#define MCF_PCI_PCIIWCR_WINCTRL2_MEMRDLINE (0x00000300) -+#define MCF_PCI_PCIIWCR_WINCTRL2_MEMRDMUL (0x00000500) -+#define MCF_PCI_PCIIWCR_WINCTRL2_IO (0x00000900) -+ -+/* Bit definitions and macros for PCIICR */ -+#define MCF_PCI_PCIICR_MAXRETRY(x) (((x)&0x000000FF)) -+#define MCF_PCI_PCIICR_TAE (0x01000000) -+#define MCF_PCI_PCIICR_IAE (0x02000000) -+#define MCF_PCI_PCIICR_REE (0x04000000) -+ -+/* Bit definitions and macros for PCIISR */ -+#define MCF_PCI_PCIISR_TA (0x01000000) -+#define MCF_PCI_PCIISR_IA (0x02000000) -+#define MCF_PCI_PCIISR_RE (0x04000000) -+ -+/* Bit definitions and macros for PCITCR2 */ -+#define MCF_PCI_PCITCR2_CR (0x00000001) -+#define MCF_PCI_PCITCR2_B0E (0x00000100) -+#define MCF_PCI_PCITCR2_B1E (0x00000200) -+#define MCF_PCI_PCITCR2_B2E (0x00000400) -+#define MCF_PCI_PCITCR2_B3E (0x00000800) -+#define MCF_PCI_PCITCR2_B4E (0x00001000) -+#define MCF_PCI_PCITCR2_B5E (0x00002000) -+ -+/* Bit definitions and macros for PCITBATR0 */ -+#define MCF_PCI_PCITBATR0_EN (0x00000001) -+#define MCF_PCI_PCITBATR0_BAT0(x) (((x)&0x00003FFF)<<18) -+ -+/* Bit definitions and macros for PCITBATR1 */ -+#define MCF_PCI_PCITBATR1_EN (0x00000001) -+#define MCF_PCI_PCITBATR1_BAT1(x) (((x)&0x00000FFF)<<20) -+ -+/* Bit definitions and macros for PCITBATR2 */ -+#define MCF_PCI_PCITBATR2_EN (0x00000001) -+#define MCF_PCI_PCITBATR2_BAT2(x) (((x)&0x000003FF)<<22) -+ -+/* Bit definitions and macros for PCITBATR3 */ -+#define MCF_PCI_PCITBATR3_EN (0x00000001) -+#define MCF_PCI_PCITBATR3_BAT3(x) (((x)&0x000000FF)<<24) -+ -+/* Bit definitions and macros for PCITBATR4 */ -+#define MCF_PCI_PCITBATR4_EN (0x00000001) -+#define MCF_PCI_PCITBATR4_BAT4(x) (((x)&0x0000001F)<<27) -+ -+/* Bit definitions and macros for PCITBATR5 */ -+#define MCF_PCI_PCITBATR5_EN (0x00000001) -+#define MCF_PCI_PCITBATR5_BAT5(x) (((x)&0x0000000F)<<28) -+ -+/* Bit definitions and macros for PCICAR */ -+#define MCF_PCI_PCICAR_DWORD(x) ((x)&0x000000FC) -+#define MCF_PCI_PCICAR_FUNCNUM(x) (((x)&0x00000007)<<8) -+#define MCF_PCI_PCICAR_DEVNUM(x) (((x)&0x0000001F)<<11) -+#define MCF_PCI_PCICAR_BUSNUM(x) (((x)&0x000000FF)<<16) -+#define MCF_PCI_PCICAR_E (0x80000000) -+ -+/********************************************************************/ -+ -+#endif /* __MCF5445X_PCI_H__ */ ---- /dev/null -+++ b/include/asm-m68k/mcf5445x_sdramc.h -@@ -0,0 +1,115 @@ -+/* -+ * Matt Waddel Matt.Waddel@freescale.com -+ * -+ * Copyright Freescale Semiconductor, Inc. 2007 -+ * -+ * This program is free software; you can redistribute it and/or modify it -+ * under the terms of the GNU General Public License as published by the -+ * Free Software Foundation; either version 2 of the License, or (at your -+ * option) any later version. -+ */ -+ -+#ifndef __MCF5445X_SDRAMC_H__ -+#define __MCF5445X_SDRAMC_H__ -+ -+/********************************************************************* -+* -+* SDRAM Controller (SDRAMC) -+* -+*********************************************************************/ -+ -+/* Register read/write macros */ -+#define MCF_SDRAMC_SDMR (*(vuint32 *)(0xFC0B8000)) /* SDRAM Mode/Extended Mode Register */ -+#define MCF_SDRAMC_SDCR (*(vuint32 *)(0xFC0B8004)) /* SDRAM Control Register */ -+#define MCF_SDRAMC_SDCFG1 (*(vuint32 *)(0xFC0B8008)) /* SDRAM Configuration Register 1 */ -+#define MCF_SDRAMC_SDCFG2 (*(vuint32 *)(0xFC0B800C)) /* SDRAM Configuration Register 2 */ -+#define MCF_SDRAMC_SDCS0 (*(vuint32 *)(0xFC0B8110)) /* SDRAM Chip Select Register */ -+#define MCF_SDRAMC_SDCS1 (*(vuint32 *)(0xFC0B8114)) /* SDRAM Chip Select Register */ -+ -+/* Parameterized register read/write macros for multiple registers */ -+#define MCF_SDRAMC_SDCS(x) (*(vuint32 *)(0xFC0B8110+((x)*0x004))) /* SDRAM Chip Select Register */ -+ -+/* Bit definitions and macros for SDMR */ -+#define MCF_SDRAMC_SDMR_DDR2_AD(x) (((x)&0x00003FFF)) /* Address for DDR2 */ -+#define MCF_SDRAMC_SDMR_CMD (0x00010000) /* Command */ -+#define MCF_SDRAMC_SDMR_AD(x) (((x)&0x00000FFF)<<18) /* Address */ -+#define MCF_SDRAMC_SDMR_BK(x) (((x)&0x00000003)<<30) /* Bank Address */ -+#define MCF_SDRAMC_SDMR_BK_LMR (0x00000000) -+#define MCF_SDRAMC_SDMR_BK_LEMR (0x40000000) -+ -+/* Bit definitions and macros for SDCR */ -+#define MCF_SDRAMC_SDCR_DPD (0x00000001) /* Deep Power-Down Mode */ -+#define MCF_SDRAMC_SDCR_IPALL (0x00000002) /* Initiate Precharge All */ -+#define MCF_SDRAMC_SDCR_IREF (0x00000004) /* Initiate Refresh */ -+#define MCF_SDRAMC_SDCR_DQS_OE(x) (((x)&0x00000003)<<10) /* DQS Output Enable */ -+#define MCF_SDRAMC_SDCR_MEM_PS (0x00002000) /* Data Port Size */ -+#define MCF_SDRAMC_SDCR_REF_CNT(x) (((x)&0x0000003F)<<16) /* Periodic Refresh Counter */ -+#define MCF_SDRAMC_SDCR_OE_RULE (0x00400000) /* Drive Rule Selection */ -+#define MCF_SDRAMC_SDCR_ADDR_MUX(x) (((x)&0x00000003)<<24) /* Internal Address Mux Select */ -+#define MCF_SDRAMC_SDCR_DDR2_MODE (0x08000000) /* DDR2 Mode Select */ -+#define MCF_SDRAMC_SDCR_REF_EN (0x10000000) /* Refresh Enable */ -+#define MCF_SDRAMC_SDCR_DDR_MODE (0x20000000) /* DDR Mode Select */ -+#define MCF_SDRAMC_SDCR_CKE (0x40000000) /* Clock Enable */ -+#define MCF_SDRAMC_SDCR_MODE_EN (0x80000000) /* SDRAM Mode Register Programming Enable */ -+#define MCF_SDRAMC_SDCR_DQS_OE_BOTH (0x00000C00) -+ -+/* Bit definitions and macros for SDCFG1 */ -+#define MCF_SDRAMC_SDCFG1_WT_LAT(x) (((x)&0x00000007)<<4) /* Write Latency */ -+#define MCF_SDRAMC_SDCFG1_REF2ACT(x) (((x)&0x0000000F)<<8) /* Refresh to active delay */ -+#define MCF_SDRAMC_SDCFG1_PRE2ACT(x) (((x)&0x00000007)<<12) /* Precharge to active delay */ -+#define MCF_SDRAMC_SDCFG1_ACT2RW(x) (((x)&0x00000007)<<16) /* Active to read/write delay */ -+#define MCF_SDRAMC_SDCFG1_RD_LAT(x) (((x)&0x0000000F)<<20) /* Read CAS Latency */ -+#define MCF_SDRAMC_SDCFG1_SWT2RWP(x) (((x)&0x00000007)<<24) /* Single write to read/write/precharge delay */ -+#define MCF_SDRAMC_SDCFG1_SRD2RWP(x) (((x)&0x0000000F)<<28) /* Single read to read/write/precharge delay */ -+ -+/* Bit definitions and macros for SDCFG2 */ -+#define MCF_SDRAMC_SDCFG2_BL(x) (((x)&0x0000000F)<<16) /* Burst Length */ -+#define MCF_SDRAMC_SDCFG2_BRD2W(x) (((x)&0x0000000F)<<20) /* Burst read to write delay */ -+#define MCF_SDRAMC_SDCFG2_BWT2RWP(x) (((x)&0x0000000F)<<24) /* Burst write to read/write/precharge delay */ -+#define MCF_SDRAMC_SDCFG2_BRD2RP(x) (((x)&0x0000000F)<<28) /* Burst read to read/precharge delay */ -+ -+/* Bit definitions and macros for SDCS group */ -+#define MCF_SDRAMC_SDCS_CSSZ(x) (((x)&0x0000001F)) /* Chip-Select Size */ -+#define MCF_SDRAMC_SDCS_CSBA(x) (((x)&0x00000FFF)<<20) /* Chip-Select Base Address */ -+#define MCF_SDRAMC_SDCS_BA(x) ((x)&0xFFF00000) -+#define MCF_SDRAMC_SDCS_CSSZ_DISABLE (0x00000000) -+#define MCF_SDRAMC_SDCS_CSSZ_1MBYTE (0x00000013) -+#define MCF_SDRAMC_SDCS_CSSZ_2MBYTE (0x00000014) -+#define MCF_SDRAMC_SDCS_CSSZ_4MBYTE (0x00000015) -+#define MCF_SDRAMC_SDCS_CSSZ_8MBYTE (0x00000016) -+#define MCF_SDRAMC_SDCS_CSSZ_16MBYTE (0x00000017) -+#define MCF_SDRAMC_SDCS_CSSZ_32MBYTE (0x00000018) -+#define MCF_SDRAMC_SDCS_CSSZ_64MBYTE (0x00000019) -+#define MCF_SDRAMC_SDCS_CSSZ_128MBYTE (0x0000001A) -+#define MCF_SDRAMC_SDCS_CSSZ_256MBYTE (0x0000001B) -+#define MCF_SDRAMC_SDCS_CSSZ_512MBYTE (0x0000001C) -+#define MCF_SDRAMC_SDCS_CSSZ_1GBYTE (0x0000001D) -+#define MCF_SDRAMC_SDCS_CSSZ_2GBYTE (0x0000001E) -+#define MCF_SDRAMC_SDCS_CSSZ_4GBYTE (0x0000001F) -+ -+/* Bit definitions and macros for SDCS0 */ -+#define MCF_SDRAMC_SDCS0_CSSZ(x) (((x)&0x0000001F)) /* Chip-Select Size */ -+#define MCF_SDRAMC_SDCS0_CSBA(x) (((x)&0x00000FFF)<<20) /* Chip-Select Base Address */ -+#define MCF_SDRAMC_SDCS0_BA(x) ((x)&0xFFF00000) -+#define MCF_SDRAMC_SDCS0_CSSZ_DISABLE (0x00000000) -+#define MCF_SDRAMC_SDCS0_CSSZ_1MBYTE (0x00000013) -+#define MCF_SDRAMC_SDCS0_CSSZ_2MBYTE (0x00000014) -+#define MCF_SDRAMC_SDCS0_CSSZ_4MBYTE (0x00000015) -+#define MCF_SDRAMC_SDCS0_CSSZ_8MBYTE (0x00000016) -+#define MCF_SDRAMC_SDCS0_CSSZ_16MBYTE (0x00000017) -+#define MCF_SDRAMC_SDCS0_CSSZ_32MBYTE (0x00000018) -+#define MCF_SDRAMC_SDCS0_CSSZ_64MBYTE (0x00000019) -+#define MCF_SDRAMC_SDCS0_CSSZ_128MBYTE (0x0000001A) -+#define MCF_SDRAMC_SDCS0_CSSZ_256MBYTE (0x0000001B) -+#define MCF_SDRAMC_SDCS0_CSSZ_512MBYTE (0x0000001C) -+#define MCF_SDRAMC_SDCS0_CSSZ_1GBYTE (0x0000001D) -+#define MCF_SDRAMC_SDCS0_CSSZ_2GBYTE (0x0000001E) -+#define MCF_SDRAMC_SDCS0_CSSZ_4GBYTE (0x0000001F) -+ -+/* Bit definitions and macros for SDCS1 */ -+#define MCF_SDRAMC_SDCS1_CSSZ(x) (((x)&0x0000001F)) /* Chip-Select Size */ -+#define MCF_SDRAMC_SDCS1_CSBA(x) (((x)&0x00000FFF)<<20) /* Chip-Select Base Address */ -+ -+/********************************************************************/ -+ -+#endif /* __MCF5445X_SDRAMC_H__ */ ---- /dev/null -+++ b/include/asm-m68k/mcf5445x_ssi.h -@@ -0,0 +1,187 @@ -+/* -+ * Yaroslav Vinogradov yaroslav.vinogradov@freescale.com -+ * -+ * Copyright Freescale Semiconductor, Inc. 2007 -+ * -+ * This program is free software; you can redistribute it and/or modify it -+ * under the terms of the GNU General Public License as published by the -+ * Free Software Foundation; either version 2 of the License, or (at your -+ * option) any later version. -+ */ -+ -+#ifndef __MCF5445X_SSI_H__ -+#define __MCF5445X_SSI_H__ -+ -+/********************************************************************* -+* -+* Synchronous Serial Interface (SSI) -+* -+*********************************************************************/ -+ -+/* Register read/write macros */ -+#define MCF_SSI_TX0 MCF_REG32(0xFC0BC000) -+#define MCF_SSI_TX1 MCF_REG32(0xFC0BC004) -+#define MCF_SSI_RX0 MCF_REG32(0xFC0BC008) -+#define MCF_SSI_RX1 MCF_REG32(0xFC0BC00C) -+#define MCF_SSI_CR MCF_REG32(0xFC0BC010) -+#define MCF_SSI_ISR MCF_REG32(0xFC0BC014) -+#define MCF_SSI_IER MCF_REG32(0xFC0BC018) -+#define MCF_SSI_TCR MCF_REG32(0xFC0BC01C) -+#define MCF_SSI_RCR MCF_REG32(0xFC0BC020) -+#define MCF_SSI_CCR MCF_REG32(0xFC0BC024) -+#define MCF_SSI_FCSR MCF_REG32(0xFC0BC02C) -+#define MCF_SSI_ACR MCF_REG32(0xFC0BC038) -+#define MCF_SSI_ACADD MCF_REG32(0xFC0BC03C) -+#define MCF_SSI_ACDAT MCF_REG32(0xFC0BC040) -+#define MCF_SSI_ATAG MCF_REG32(0xFC0BC044) -+#define MCF_SSI_TMASK MCF_REG32(0xFC0BC048) -+#define MCF_SSI_RMASK MCF_REG32(0xFC0BC04C) -+ -+/* Parameterized register read/write macros for multiple registers */ -+#define MCF_SSI_TX(x) MCF_REG32(0xFC0BC000+((x)*0x004)) -+#define MCF_SSI_RX(x) MCF_REG32(0xFC0BC008+((x)*0x004)) -+ -+/* Bit definitions and macros for TX group */ -+#define MCF_SSI_TX_SSI_TX(x) (x) -+ -+/* Bit definitions and macros for TX0 */ -+#define MCF_SSI_TX0_SSI_TX(x) (x) -+ -+/* Bit definitions and macros for TX1 */ -+#define MCF_SSI_TX1_SSI_TX(x) (x) -+ -+/* Bit definitions and macros for RX group */ -+#define MCF_SSI_RX_SSI_RX(x) (x) -+ -+/* Bit definitions and macros for RX0 */ -+#define MCF_SSI_RX0_SSI_RX(x) (x) -+ -+/* Bit definitions and macros for RX1 */ -+#define MCF_SSI_RX1_SSI_RX(x) (x) -+ -+/* Bit definitions and macros for CR */ -+#define MCF_SSI_CR_SSI_EN (0x00000001) -+#define MCF_SSI_CR_TE (0x00000002) -+#define MCF_SSI_CR_RE (0x00000004) -+#define MCF_SSI_CR_NET (0x00000008) -+#define MCF_SSI_CR_SYN (0x00000010) -+#define MCF_SSI_CR_I2S(x) (((x)&0x00000003)<<5) -+#define MCF_SSI_CR_MCE (0x00000080) -+#define MCF_SSI_CR_TCH (0x00000100) -+#define MCF_SSI_CR_CIS (0x00000200) -+#define MCF_SSI_CR_I2S_NORMAL (0x00000000) -+#define MCF_SSI_CR_I2S_MASTER (0x00000020) -+#define MCF_SSI_CR_I2S_SLAVE (0x00000040) -+ -+/* Bit definitions and macros for ISR */ -+#define MCF_SSI_ISR_TFE0 (0x00000001) -+#define MCF_SSI_ISR_TFE1 (0x00000002) -+#define MCF_SSI_ISR_RFF0 (0x00000004) -+#define MCF_SSI_ISR_RFF1 (0x00000008) -+#define MCF_SSI_ISR_RLS (0x00000010) -+#define MCF_SSI_ISR_TLS (0x00000020) -+#define MCF_SSI_ISR_RFS (0x00000040) -+#define MCF_SSI_ISR_TFS (0x00000080) -+#define MCF_SSI_ISR_TUE0 (0x00000100) -+#define MCF_SSI_ISR_TUE1 (0x00000200) -+#define MCF_SSI_ISR_ROE0 (0x00000400) -+#define MCF_SSI_ISR_ROE1 (0x00000800) -+#define MCF_SSI_ISR_TDE0 (0x00001000) -+#define MCF_SSI_ISR_TDE1 (0x00002000) -+#define MCF_SSI_ISR_RDR0 (0x00004000) -+#define MCF_SSI_ISR_RDR1 (0x00008000) -+#define MCF_SSI_ISR_RXT (0x00010000) -+#define MCF_SSI_ISR_CMDDU (0x00020000) -+#define MCF_SSI_ISR_CMDAU (0x00040000) -+ -+/* Bit definitions and macros for IER */ -+#define MCF_SSI_IER_TFE0 (0x00000001) -+#define MCF_SSI_IER_TFE1 (0x00000002) -+#define MCF_SSI_IER_RFF0 (0x00000004) -+#define MCF_SSI_IER_RFF1 (0x00000008) -+#define MCF_SSI_IER_RLS (0x00000010) -+#define MCF_SSI_IER_TLS (0x00000020) -+#define MCF_SSI_IER_RFS (0x00000040) -+#define MCF_SSI_IER_TFS (0x00000080) -+#define MCF_SSI_IER_TUE0 (0x00000100) -+#define MCF_SSI_IER_TUE1 (0x00000200) -+#define MCF_SSI_IER_ROE0 (0x00000400) -+#define MCF_SSI_IER_ROE1 (0x00000800) -+#define MCF_SSI_IER_TDE0 (0x00001000) -+#define MCF_SSI_IER_TDE1 (0x00002000) -+#define MCF_SSI_IER_RDR0 (0x00004000) -+#define MCF_SSI_IER_RDR1 (0x00008000) -+#define MCF_SSI_IER_RXT (0x00010000) -+#define MCF_SSI_IER_CMDU (0x00020000) -+#define MCF_SSI_IER_CMDAU (0x00040000) -+#define MCF_SSI_IER_TIE (0x00080000) -+#define MCF_SSI_IER_TDMAE (0x00100000) -+#define MCF_SSI_IER_RIE (0x00200000) -+#define MCF_SSI_IER_RDMAE (0x00400000) -+ -+/* Bit definitions and macros for TCR */ -+#define MCF_SSI_TCR_TEFS (0x00000001) -+#define MCF_SSI_TCR_TFSL (0x00000002) -+#define MCF_SSI_TCR_TFSI (0x00000004) -+#define MCF_SSI_TCR_TSCKP (0x00000008) -+#define MCF_SSI_TCR_TSHFD (0x00000010) -+#define MCF_SSI_TCR_TXDIR (0x00000020) -+#define MCF_SSI_TCR_TFDIR (0x00000040) -+#define MCF_SSI_TCR_TFEN0 (0x00000080) -+#define MCF_SSI_TCR_TFEN1 (0x00000100) -+#define MCF_SSI_TCR_TXBIT0 (0x00000200) -+ -+/* Bit definitions and macros for RCR */ -+#define MCF_SSI_RCR_REFS (0x00000001) -+#define MCF_SSI_RCR_RFSL (0x00000002) -+#define MCF_SSI_RCR_RFSI (0x00000004) -+#define MCF_SSI_RCR_RSCKP (0x00000008) -+#define MCF_SSI_RCR_RSHFD (0x00000010) -+#define MCF_SSI_RCR_RFEN0 (0x00000080) -+#define MCF_SSI_RCR_RFEN1 (0x00000100) -+#define MCF_SSI_RCR_RXBIT0 (0x00000200) -+#define MCF_SSI_RCR_RXEXT (0x00000400) -+ -+/* Bit definitions and macros for CCR */ -+#define MCF_SSI_CCR_PM(x) (((x)&0x000000FF)) -+#define MCF_SSI_CCR_DC(x) (((x)&0x0000001F)<<8) -+#define MCF_SSI_CCR_WL(x) (((x)&0x0000000F)<<13) -+#define MCF_SSI_CCR_PSR (0x00020000) -+#define MCF_SSI_CCR_DIV2 (0x00040000) -+ -+/* Bit definitions and macros for FCSR */ -+#define MCF_SSI_FCSR_TFWM0(x) (((x)&0x0000000F)) -+#define MCF_SSI_FCSR_RFWM0(x) (((x)&0x0000000F)<<4) -+#define MCF_SSI_FCSR_TFCNT0(x) (((x)&0x0000000F)<<8) -+#define MCF_SSI_FCSR_RFCNT0(x) (((x)&0x0000000F)<<12) -+#define MCF_SSI_FCSR_TFWM1(x) (((x)&0x0000000F)<<16) -+#define MCF_SSI_FCSR_RFWM1(x) (((x)&0x0000000F)<<20) -+#define MCF_SSI_FCSR_TFCNT1(x) (((x)&0x0000000F)<<24) -+#define MCF_SSI_FCSR_RFCNT1(x) (((x)&0x0000000F)<<28) -+ -+/* Bit definitions and macros for ACR */ -+#define MCF_SSI_ACR_AC97EN (0x00000001) -+#define MCF_SSI_ACR_FV (0x00000002) -+#define MCF_SSI_ACR_TIF (0x00000004) -+#define MCF_SSI_ACR_RD (0x00000008) -+#define MCF_SSI_ACR_WR (0x00000010) -+#define MCF_SSI_ACR_FRDIV(x) (((x)&0x0000003F)<<5) -+ -+/* Bit definitions and macros for ACADD */ -+#define MCF_SSI_ACADD_SSI_ACADD(x) (((x)&0x0007FFFF)) -+ -+/* Bit definitions and macros for ACDAT */ -+#define MCF_SSI_ACDAT_SSI_ACDAT(x) (((x)&0x0007FFFF)) -+ -+/* Bit definitions and macros for ATAG */ -+#define MCF_SSI_ATAG_DDI_ATAG(x) (((x)&0x0000FFFF)) -+ -+/* Bit definitions and macros for TMASK */ -+#define MCF_SSI_TMASK_SSI_TMASK(x) (x) -+ -+/* Bit definitions and macros for RMASK */ -+#define MCF_SSI_RMASK_SSI_RMASK(x) (x) -+ -+/********************************************************************/ -+ -+#endif /* __MCF5445X_SSI_H__ */ ---- /dev/null -+++ b/include/asm-m68k/mcf5445x_usb.h -@@ -0,0 +1,50 @@ -+/* -+ * Duck Schmid duck@freescale.com -+ * -+ * Copyright 2005-2007 Freescale Semiconductor, Inc. All Rights Reserved. -+ */ -+ -+/* -+ * The code contained herein is licensed under the GNU General Public -+ * License. You may obtain a copy of the GNU General Public License -+ * Version 2 or later at the following locations: -+ * -+ * http://www.opensource.org/licenses/gpl-license.html -+ * http://www.gnu.org/copyleft/gpl.html -+ */ -+ -+#include <asm/mcfsim.h> -+ -+/* ehci_arc_hc_driver.flags value */ -+#define FSL_PLATFORM_HC_FLAGS (HCD_USB2 | HCD_MEMORY) -+ -+static inline int fsl_platform_verify(struct platform_device *pdev) -+{ -+ return 0; -+} -+ -+static inline void fsl_platform_usb_setup(struct usb_hcd *hcd) -+{ -+} -+ -+static inline void fsl_platform_set_host_mode(struct usb_hcd *hcd) -+{ -+ unsigned int temp; -+ struct fsl_usb2_platform_data *pdata; -+ struct fsl_usb_host_regs *regs; -+ -+ pdata = hcd->self.controller->platform_data; -+ regs = pdata->regs; -+ -+ if (pdata->xcvr_ops && pdata->xcvr_ops->set_host) -+ pdata->xcvr_ops->set_host(); -+ -+ /* set host mode and select "big endian" */ -+ temp = fsl_readl(®s->usbmode); -+ temp |= USBMODE_CM_HOST | (pdata->es ? USBMODE_ES : 0); -+ fsl_writel(temp, ®s->usbmode); -+ -+ pr_debug("%s: set usbmode to 0x%x\n\n", __FUNCTION__, -+ fsl_readl(®s->usbmode)); -+ -+} ---- /dev/null -+++ b/include/asm-m68k/mcf5445x_xbs.h -@@ -0,0 +1,81 @@ -+/* -+ * Kurt Mahan kmahan@freescale.com -+ * -+ * Copyright Freescale Semiconductor, Inc. 2007 -+ * -+ * This program is free software; you can redistribute it and/or modify it -+ * under the terms of the GNU General Public License as published by the -+ * Free Software Foundation; either version 2 of the License, or (at your -+ * option) any later version. -+ */ -+ -+#ifndef __MCF5445X_XBS_H__ -+#define __MCF5445X_XBS_H__ -+ -+/* -+ * Crossbar Switch (XBS) -+ */ -+ -+/* Register read/write macros */ -+#define MCF_XBS_PRS1 MCF_REG32(0xFC004100) /* Flexbus Priority */ -+#define MCF_XBS_CRS1 MCF_REG32(0xFC004110) /* Flexbus Control */ -+#define MCF_XBS_PRS2 MCF_REG32(0xFC004200) /* SDRam Priority */ -+#define MCF_XBS_CRS2 MCF_REG32(0xFC004210) /* SDRam Control */ -+#define MCF_XBS_PRS3 MCF_REG32(0xFC004300) /* ATA Priority */ -+#define MCF_XBS_CRS3 MCF_REG32(0xFC004310) /* ATA Control */ -+#define MCF_XBS_PRS4 MCF_REG32(0xFC004400) /* SRAM Priority */ -+#define MCF_XBS_CRS4 MCF_REG32(0xFC004410) /* SRAM Control */ -+#define MCF_XBS_PRS5 MCF_REG32(0xFC004500) /* PCI Priority */ -+#define MCF_XBS_CRS5 MCF_REG32(0xFC004510) /* PCI Control */ -+#define MCF_XBS_PRS6 MCF_REG32(0xFC004600) /* Slave6 Priority */ -+#define MCF_XBS_CRS6 MCF_REG32(0xFC004610) /* Slave6 Control */ -+#define MCF_XBS_PRS7 MCF_REG32(0xFC004700) /* Other Priority */ -+#define MCF_XBS_CRS7 MCF_REG32(0xFC004710) /* Other Control */ -+ -+/* Priorities */ -+#define MCF_XBS_PRI_1 0 /* Level 1 (highest) */ -+#define MCF_XBS_PRI_2 1 /* Level 2 */ -+#define MCF_XBS_PRI_3 2 /* Level 3 */ -+#define MCF_XBS_PRI_4 3 /* Level 4 */ -+#define MCF_XBS_PRI_5 4 /* Level 5 */ -+#define MCF_XBS_PRI_6 5 /* Level 6 */ -+#define MCF_XBS_PRI_7 6 /* Level 7 (lowest) */ -+#define MCF_XBS_PRI_MASK 7 /* Mask (Not a valid level) */ -+ -+/* Priority Register (PRSn) Defs */ -+#define MCF_XBS_PRS_MACRO(m,p) ((p)<<((m)<<2)) -+#define MCF_XBS_PRS_M0(p) MCF_XBS_PRS_MACRO(0, p) /* Coldfire Core */ -+#define MCF_XBS_PRS_M1(p) MCF_XBS_PRS_MACRO(1, p) /* eDMA */ -+#define MCF_XBS_PRS_M2(p) MCF_XBS_PRS_MACRO(2, p) /* FEC0 */ -+#define MCF_XBS_PRS_M3(p) MCF_XBS_PRS_MACRO(3, p) /* FEC1 */ -+#define MCF_XBS_PRS_M4(p) MCF_XBS_PRS_MACRO(4, p) /* Master 4 */ -+#define MCF_XBS_PRS_M5(p) MCF_XBS_PRS_MACRO(5, p) /* PCI */ -+#define MCF_XBS_PRS_M6(p) MCF_XBS_PRS_MACRO(6, p) /* USB OTG */ -+#define MCF_XBS_PRS_M7(p) MCF_XBS_PRS_MACRO(7, p) /* Serial Boot */ -+ -+/* Control Register (CRSn) Defs */ -+#define MCF_XBS_CRS_RO 0x80000000 /* Read Only */ -+#define MCF_XBS_CRS_ARB 0x00000100 /* Arbitration Mode */ -+#define MCF_XBS_CRS_PCTL 0x00000030 /* Parking Control */ -+#define MCF_XBS_CRS_PARK 0x00000007 /* Park Location */ -+ -+/* MCF_XBS_CRS_ARB Defs */ -+#define MCF_ABS_CRS_ARB_FIXED 0x00000000 /* Fixed priority */ -+#define MCF_ABS_CRS_ARB_ROUND 0x00000100 /* Round Robin priority */ -+ -+/* MCF_XBS_CRS_PCTL Defs */ -+#define MCF_ABS_CRS_PCTL_PARK 0x00000000 /* Park on the defined PARK */ -+#define MCF_ABS_CRS_PCTL_LAST 0x00000010 /* Park on the last master */ -+#define MCF_ABS_CRS_PCTL_NONE 0x00000020 /* Don't park */ -+ -+/* MCF_XBS_CRS_PARK Defs */ -+#define MCF_ABS_CRS_PARK_M0 0x00000000 /* Park on Coldfire Core */ -+#define MCF_ABS_CRS_PARK_M1 0x00000001 /* Park on eDMA */ -+#define MCF_ABS_CRS_PARK_M2 0x00000002 /* Park on FEC0 */ -+#define MCF_ABS_CRS_PARK_M3 0x00000003 /* Park on FEC1 */ -+#define MCF_ABS_CRS_PARK_M4 0x00000004 /* Park on Reserved */ -+#define MCF_ABS_CRS_PARK_M5 0x00000005 /* Park on PCI */ -+#define MCF_ABS_CRS_PARK_M6 0x00000006 /* Park on USB OTG */ -+#define MCF_ABS_CRS_PARK_M7 0x00000007 /* Park on Serial Boot */ -+ -+#endif /* __MCF5445X_XBS_H__ */ ---- /dev/null -+++ b/include/asm-m68k/mcfdspi.h -@@ -0,0 +1,48 @@ -+/* -+ * mcfdspi.h-DSPI controller for the ColdFire processors. -+ * -+ * Andrey Butok -+ * Copyright Freescale Semiconductor, Inc. 2008 -+ * -+ * This file is based on mcfqspi.h -+ * -+ * This program is free software; you can redistribute it and/or modify it -+ * under the terms of the GNU General Public License as published by the -+ * Free Software Foundation; either version 2 of the License, or (at your -+ * option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -+ * -+ *************************************************************************** -+ * Changes: -+ * v0.001 25 March 2008 Andrey Butok -+ * Initial Release - developed on uClinux with 2.6.23 kernel. -+ * -+ */ -+ -+#ifndef MCFDSPI_H_ -+#define MCFDSPI_H_ -+ -+struct coldfire_dspi_chip { -+ u8 mode; -+ u8 bits_per_word; -+ u16 void_write_data; -+ /* Only used in master mode */ -+ u8 dbr; /* Double baud rate */ -+ u8 pbr; /* Baud rate prescaler */ -+ u8 br; /* Baud rate scaler */ -+ u8 pcssck; /* PCS to SCK delay prescaler */ -+ u8 pasc; /* After SCK delay prescaler */ -+ u8 pdt; /* Delay after transfer prescaler */ -+ u8 cssck; /* PCS to SCK delay scaler */ -+ u8 asc; /* After SCK delay scaler */ -+ u8 dt; /* Delay after transfer scaler */ -+}; -+#endif /*MCFDSPI_H_*/ ---- /dev/null -+++ b/include/asm-m68k/mcfqspi.h -@@ -0,0 +1,51 @@ -+/****************************************************************************/ -+/* -+ * mcfqspi.h - Master QSPI controller for the ColdFire processors -+ * -+ * (C) Copyright 2005, Intec Automation, -+ * Mike Lavender (mike@steroidmicros) -+ * -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 2 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program; if not, write to the Free Software -+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -+/* ------------------------------------------------------------------------- */ -+ -+#ifndef MCFQSPI_H_ -+#define MCFQSPI_H_ -+ -+#define QSPI_CS_INIT 0x01 -+#define QSPI_CS_ASSERT 0x02 -+#define QSPI_CS_DROP 0x04 -+ -+struct coldfire_spi_master { -+ u16 bus_num; -+ u16 num_chipselect; -+ u8 irq_source; -+ u32 irq_vector; -+ u32 irq_mask; -+ u8 irq_lp; -+ u8 par_val; -+ u32 *irq_list; -+ void (*cs_control)(u8 cs, u8 command); -+}; -+ -+ -+struct coldfire_spi_chip { -+ u8 mode; -+ u8 bits_per_word; -+ u8 del_cs_to_clk; -+ u8 del_after_trans; -+ u16 void_write_data; -+}; -+#endif /*MCFQSPI_H_*/ ---- /dev/null -+++ b/include/asm-m68k/mcfsim.h -@@ -0,0 +1,102 @@ -+/* -+ * mcfsim.h -- ColdFire System Integration Module support. -+ * -+ * (C) Copyright 1999-2003, Greg Ungerer (gerg@snapgear.com) -+ * (C) Copyright 2000, Lineo Inc. (www.lineo.com) -+ */ -+ -+#ifndef mcfsim_h -+#define mcfsim_h -+ -+#if defined(CONFIG_COLDFIRE) -+#include <asm/coldfire.h> -+#endif -+ -+#if defined(CONFIG_M5445X) -+#include <asm/mcf5445x_intc.h> -+#include <asm/mcf5445x_gpio.h> -+#include <asm/mcf5445x_i2c.h> -+#include <asm/mcf5445x_ccm.h> -+#include <asm/mcf5445x_pci.h> -+#include <asm/mcf5445x_pciarb.h> -+#include <asm/mcf5445x_eport.h> -+#include <asm/mcf5445x_fbcs.h> -+#include <asm/mcf5445x_xbs.h> -+#include <asm/mcf5445x_dtim.h> -+#elif defined(CONFIG_M547X_8X) -+#include <asm/m5485sim.h> -+#include <asm/m5485gpio.h> -+#endif -+ -+/* -+ * Define the base address of the SIM within the MBAR address space. -+ */ -+#define MCFSIM_BASE 0x0 /* Base address of SIM */ -+ -+/* -+ * Bit definitions for the ICR family of registers. -+ */ -+#define MCFSIM_ICR_AUTOVEC 0x80 /* Auto-vectored intr */ -+#define MCFSIM_ICR_LEVEL0 0x00 /* Level 0 intr */ -+#define MCFSIM_ICR_LEVEL1 0x04 /* Level 1 intr */ -+#define MCFSIM_ICR_LEVEL2 0x08 /* Level 2 intr */ -+#define MCFSIM_ICR_LEVEL3 0x0c /* Level 3 intr */ -+#define MCFSIM_ICR_LEVEL4 0x10 /* Level 4 intr */ -+#define MCFSIM_ICR_LEVEL5 0x14 /* Level 5 intr */ -+#define MCFSIM_ICR_LEVEL6 0x18 /* Level 6 intr */ -+#define MCFSIM_ICR_LEVEL7 0x1c /* Level 7 intr */ -+ -+#define MCFSIM_ICR_PRI0 0x00 /* Priority 0 intr */ -+#define MCFSIM_ICR_PRI1 0x01 /* Priority 1 intr */ -+#define MCFSIM_ICR_PRI2 0x02 /* Priority 2 intr */ -+#define MCFSIM_ICR_PRI3 0x03 /* Priority 3 intr */ -+ -+/* -+ * Bit definitions for the Interrupt Mask register (IMR). -+ */ -+#define MCFSIM_IMR_EINT1 0x0002 /* External intr # 1 */ -+#define MCFSIM_IMR_EINT2 0x0004 /* External intr # 2 */ -+#define MCFSIM_IMR_EINT3 0x0008 /* External intr # 3 */ -+#define MCFSIM_IMR_EINT4 0x0010 /* External intr # 4 */ -+#define MCFSIM_IMR_EINT5 0x0020 /* External intr # 5 */ -+#define MCFSIM_IMR_EINT6 0x0040 /* External intr # 6 */ -+#define MCFSIM_IMR_EINT7 0x0080 /* External intr # 7 */ -+ -+#define MCFSIM_IMR_SWD 0x0100 /* Software Watchdog intr */ -+#define MCFSIM_IMR_TIMER1 0x0200 /* TIMER 1 intr */ -+#define MCFSIM_IMR_TIMER2 0x0400 /* TIMER 2 intr */ -+#define MCFSIM_IMR_MBUS 0x0800 /* MBUS intr */ -+#define MCFSIM_IMR_UART1 0x1000 /* UART 1 intr */ -+#define MCFSIM_IMR_UART2 0x2000 /* UART 2 intr */ -+ -+/* -+ * Mask for all of the SIM devices. Some parts have more or less -+ * SIM devices. This is a catchall for the sandard set. -+ */ -+#ifndef MCFSIM_IMR_MASKALL -+#define MCFSIM_IMR_MASKALL 0x3ffe /* All intr sources */ -+#endif -+ -+ -+/* -+ * PIT interrupt settings, if not found in mXXXXsim.h file. -+ */ -+#ifndef ICR_INTRCONF -+#define ICR_INTRCONF 0x2b /* PIT1 level 5, priority 3 */ -+#endif -+#ifndef MCFPIT_IMR -+#define MCFPIT_IMR MCFINTC_IMRH -+#endif -+#ifndef MCFPIT_IMR_IBIT -+#define MCFPIT_IMR_IBIT (1 << (MCFINT_PIT1 - 32)) -+#endif -+ -+ -+#ifndef __ASSEMBLY__ -+/* -+ * Definition for the interrupt auto-vectoring support. -+ */ -+extern void mcf_autovector(unsigned int vec); -+#endif /* __ASSEMBLY__ */ -+ -+#endif /* mcfsim_h */ ---- /dev/null -+++ b/include/asm-m68k/mcfuart.h -@@ -0,0 +1,194 @@ -+/* -+ * mcfuart.h -- ColdFire internal UART support defines. -+ * -+ * Matt Waddel Matt.Waddel@freescale.com -+ * Copyright Freescale Semiconductor, Inc. 2007 -+ * -+ * Derived from m68knommu version of this same file (Greg Ungerer & Lineo). -+ * -+ */ -+ -+#ifndef mcfuart_h -+#define mcfuart_h -+ -+/* -+ * Define the base address of the UARTS within the MBAR address -+ * space. -+ */ -+#if defined(CONFIG_M5445X) -+#include <asm/mcf5445x_intc.h> -+#define MCFUART_BASE1 0xfc060000 /* Base address of UART1 */ -+#define MCFUART_BASE2 0xfc064000 /* Base address of UART2 */ -+#define MCFUART_BASE3 0xfc068000 /* Base address of UART3 */ -+#define MCFINT_VECBASE 64 -+#define MCFINT_UART0 26 -+ -+#elif defined(CONFIG_M547X_8X) -+ -+#define MCFUART_BASE1 0x8600 /* Base address of UART1 */ -+#define MCFUART_BASE2 0x8700 /* Base address of UART2 */ -+#define MCFUART_BASE3 0x8800 /* Base address of UART3 */ -+#define MCFUART_BASE4 0x8900 /* Base address of UART4 */ -+#define MCFINT_VECBASE 64 -+#define MCFINT_UART0 35 -+#endif -+ -+ -+/* -+ * Define the ColdFire UART register set addresses. -+ */ -+#define MCFUART_UMR 0x00 /* Mode register (r/w) */ -+#define MCFUART_USR 0x04 /* Status register (r) */ -+#define MCFUART_UCSR 0x04 /* Clock Select (w) */ -+#define MCFUART_UCR 0x08 /* Command register (w) */ -+#define MCFUART_URB 0x0c /* Receiver Buffer (r) */ -+#define MCFUART_UTB 0x0c /* Transmit Buffer (w) */ -+#define MCFUART_UIPCR 0x10 /* Input Port Change (r) */ -+#define MCFUART_UACR 0x10 /* Auxiliary Control (w) */ -+#define MCFUART_UISR 0x14 /* Interrup Status (r) */ -+#define MCFUART_UIMR 0x14 /* Interrupt Mask (w) */ -+#define MCFUART_UBG1 0x18 /* Baud Rate MSB (r/w) */ -+#define MCFUART_UBG2 0x1c /* Baud Rate LSB (r/w) */ -+#ifdef CONFIG_M5272 -+#define MCFUART_UTF 0x28 /* Transmitter FIFO (r/w) */ -+#define MCFUART_URF 0x2c /* Receiver FIFO (r/w) */ -+#define MCFUART_UFPD 0x30 /* Frac Prec. Divider (r/w) */ -+#else -+#define MCFUART_UIVR 0x30 /* Interrupt Vector (r/w) */ -+#endif -+#define MCFUART_UIPR 0x34 /* Input Port (r) */ -+#define MCFUART_UOP1 0x38 /* Output Port Bit Set (w) */ -+#define MCFUART_UOP0 0x3c /* Output Port Bit Reset (w) */ -+ -+ -+/* -+ * Define bit flags in Mode Register 1 (MR1). -+ */ -+#define MCFUART_MR1_RXRTS 0x80 /* Auto RTS flow control */ -+#define MCFUART_MR1_RXIRQFULL 0x40 /* RX IRQ type FULL */ -+#define MCFUART_MR1_RXIRQRDY 0x00 /* RX IRQ type RDY */ -+#define MCFUART_MR1_RXERRBLOCK 0x20 /* RX block error mode */ -+#define MCFUART_MR1_RXERRCHAR 0x00 /* RX char error mode */ -+ -+#define MCFUART_MR1_PARITYNONE 0x10 /* No parity */ -+#define MCFUART_MR1_PARITYEVEN 0x00 /* Even parity */ -+#define MCFUART_MR1_PARITYODD 0x04 /* Odd parity */ -+#define MCFUART_MR1_PARITYSPACE 0x08 /* Space parity */ -+#define MCFUART_MR1_PARITYMARK 0x0c /* Mark parity */ -+ -+#define MCFUART_MR1_CS5 0x00 /* 5 bits per char */ -+#define MCFUART_MR1_CS6 0x01 /* 6 bits per char */ -+#define MCFUART_MR1_CS7 0x02 /* 7 bits per char */ -+#define MCFUART_MR1_CS8 0x03 /* 8 bits per char */ -+ -+/* -+ * Define bit flags in Mode Register 2 (MR2). -+ */ -+#define MCFUART_MR2_LOOPBACK 0x80 /* Loopback mode */ -+#define MCFUART_MR2_REMOTELOOP 0xc0 /* Remote loopback mode */ -+#define MCFUART_MR2_AUTOECHO 0x40 /* Automatic echo */ -+#define MCFUART_MR2_TXRTS 0x20 /* Assert RTS on TX */ -+#define MCFUART_MR2_TXCTS 0x10 /* Auto CTS flow control */ -+ -+#define MCFUART_MR2_STOP1 0x07 /* 1 stop bit */ -+#define MCFUART_MR2_STOP15 0x08 /* 1.5 stop bits */ -+#define MCFUART_MR2_STOP2 0x0f /* 2 stop bits */ -+ -+/* -+ * Define bit flags in Status Register (USR). -+ */ -+#define MCFUART_USR_RXBREAK 0x80 /* Received BREAK */ -+#define MCFUART_USR_RXFRAMING 0x40 /* Received framing error */ -+#define MCFUART_USR_RXPARITY 0x20 /* Received parity error */ -+#define MCFUART_USR_RXOVERRUN 0x10 /* Received overrun error */ -+#define MCFUART_USR_TXEMPTY 0x08 /* Transmitter empty */ -+#define MCFUART_USR_TXREADY 0x04 /* Transmitter ready */ -+#define MCFUART_USR_RXFULL 0x02 /* Receiver full */ -+#define MCFUART_USR_RXREADY 0x01 /* Receiver ready */ -+ -+#if defined(CONFIG_M547X_8X) -+#define MCFUART_USR_TXREADY_BN 0x0a -+#define MCFUART_USR_TXEMPTY_BN 0x0b -+#endif -+ -+#define MCFUART_USR_RXERR (MCFUART_USR_RXBREAK | MCFUART_USR_RXFRAMING | \ -+ MCFUART_USR_RXPARITY | MCFUART_USR_RXOVERRUN) -+ -+/* -+ * Define bit flags in Clock Select Register (UCSR). -+ */ -+#define MCFUART_UCSR_RXCLKTIMER 0xd0 /* RX clock is timer */ -+#define MCFUART_UCSR_RXCLKEXT16 0xe0 /* RX clock is external x16 */ -+#define MCFUART_UCSR_RXCLKEXT1 0xf0 /* RX clock is external x1 */ -+ -+#define MCFUART_UCSR_TXCLKTIMER 0x0d /* TX clock is timer */ -+#define MCFUART_UCSR_TXCLKEXT16 0x0e /* TX clock is external x16 */ -+#define MCFUART_UCSR_TXCLKEXT1 0x0f /* TX clock is external x1 */ -+ -+/* -+ * Define bit flags in Command Register (UCR). -+ */ -+#define MCFUART_UCR_CMDNULL 0x00 /* No command */ -+#define MCFUART_UCR_CMDRESETMRPTR 0x10 /* Reset MR pointer */ -+#define MCFUART_UCR_CMDRESETRX 0x20 /* Reset receiver */ -+#define MCFUART_UCR_CMDRESETTX 0x30 /* Reset transmitter */ -+#define MCFUART_UCR_CMDRESETERR 0x40 /* Reset error status */ -+#define MCFUART_UCR_CMDRESETBREAK 0x50 /* Reset BREAK change */ -+#define MCFUART_UCR_CMDBREAKSTART 0x60 /* Start BREAK */ -+#define MCFUART_UCR_CMDBREAKSTOP 0x70 /* Stop BREAK */ -+ -+#define MCFUART_UCR_TXNULL 0x00 /* No TX command */ -+#define MCFUART_UCR_TXENABLE 0x04 /* Enable TX */ -+#define MCFUART_UCR_TXDISABLE 0x08 /* Disable TX */ -+#define MCFUART_UCR_RXNULL 0x00 /* No RX command */ -+#define MCFUART_UCR_RXENABLE 0x01 /* Enable RX */ -+#define MCFUART_UCR_RXDISABLE 0x02 /* Disable RX */ -+ -+/* -+ * Define bit flags in Input Port Change Register (UIPCR). -+ */ -+#define MCFUART_UIPCR_CTSCOS 0x10 /* CTS change of state */ -+#define MCFUART_UIPCR_CTS 0x01 /* CTS value */ -+ -+/* -+ * Define bit flags in Input Port Register (UIP). -+ */ -+#define MCFUART_UIPR_CTS 0x01 /* CTS value */ -+ -+/* -+ * Define bit flags in Output Port Registers (UOP). -+ * Clear bit by writing to UOP0, set by writing to UOP1. -+ */ -+#define MCFUART_UOP_RTS 0x01 /* RTS set or clear */ -+ -+/* -+ * Define bit flags in the Auxiliary Control Register (UACR). -+ */ -+#define MCFUART_UACR_IEC 0x01 /* Input enable control */ -+ -+/* -+ * Define bit flags in Interrupt Status Register (UISR). -+ * These same bits are used for the Interrupt Mask Register (UIMR). -+ */ -+#define MCFUART_UIR_COS 0x80 /* Change of state (CTS) */ -+#define MCFUART_UIR_DELTABREAK 0x04 /* Break start or stop */ -+#define MCFUART_UIR_RXREADY 0x02 /* Receiver ready */ -+#define MCFUART_UIR_TXREADY 0x01 /* Transmitter ready */ -+ -+#ifdef CONFIG_M5272 -+/* -+ * Define bit flags in the Transmitter FIFO Register (UTF). -+ */ -+#define MCFUART_UTF_TXB 0x1f /* Transmitter data level */ -+#define MCFUART_UTF_FULL 0x20 /* Transmitter fifo full */ -+#define MCFUART_UTF_TXS 0xc0 /* Transmitter status */ -+ -+/* -+ * Define bit flags in the Receiver FIFO Register (URF). -+ */ -+#define MCFUART_URF_RXB 0x1f /* Receiver data level */ -+#define MCFUART_URF_FULL 0x20 /* Receiver fifo full */ -+#define MCFUART_URF_RXS 0xc0 /* Receiver status */ -+#endif -+ -+#endif /* mcfuart_h */ ---- a/include/asm-m68k/mmu_context.h -+++ b/include/asm-m68k/mmu_context.h -@@ -7,7 +7,7 @@ static inline void enter_lazy_tlb(struct - { - } - --#ifndef CONFIG_SUN3 -+#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE) - - #include <asm/setup.h> - #include <asm/page.h> -@@ -102,7 +102,7 @@ static inline void activate_mm(struct mm - switch_mm_0460(next_mm); - } - --#else /* CONFIG_SUN3 */ -+#elif defined(CONFIG_SUN3) - #include <asm/sun3mmu.h> - #include <linux/sched.h> - -@@ -150,5 +150,155 @@ static inline void activate_mm(struct mm - activate_context(next_mm); - } - --#endif -+#else /* CONFIG_COLDFIRE */ -+ -+#include <asm/coldfire.h> -+#include <asm/atomic.h> -+#include <asm/bitops.h> -+#include <asm/mmu.h> -+ -+#define NO_CONTEXT 256 -+#define LAST_CONTEXT 255 -+#define FIRST_CONTEXT 1 -+ -+extern void set_context(mm_context_t context, pgd_t *pgd); -+extern unsigned long context_map[]; -+extern mm_context_t next_mmu_context; -+ -+extern atomic_t nr_free_contexts; -+extern struct mm_struct *context_mm[LAST_CONTEXT+1]; -+extern void steal_context(void); -+ -+static inline void get_mmu_context(struct mm_struct *mm) -+{ -+ mm_context_t ctx; -+ -+ if (mm->context != NO_CONTEXT) -+ return; -+ while (atomic_dec_and_test_lt(&nr_free_contexts)) { -+ atomic_inc(&nr_free_contexts); -+ steal_context(); -+ } -+ ctx = next_mmu_context; -+ while (test_and_set_bit(ctx, context_map)) { -+ ctx = find_next_zero_bit(context_map, LAST_CONTEXT+1, ctx); -+ if (ctx > LAST_CONTEXT) -+ ctx = 0; -+ } -+ next_mmu_context = (ctx + 1) & LAST_CONTEXT; -+ mm->context = ctx; -+ context_mm[ctx] = mm; -+} -+ -+/* -+ * Set up the context for a new address space. -+ */ -+#define init_new_context(tsk, mm) (((mm)->context = NO_CONTEXT), 0) -+ -+/* -+ * We're finished using the context for an address space. -+ */ -+static inline void destroy_context(struct mm_struct *mm) -+{ -+ if (mm->context != NO_CONTEXT) { -+ clear_bit(mm->context, context_map); -+ mm->context = NO_CONTEXT; -+ atomic_inc(&nr_free_contexts); -+ } -+} -+ -+static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next, -+ struct task_struct *tsk) -+{ -+ get_mmu_context(tsk->mm); -+ set_context(tsk->mm->context, next->pgd); -+} -+ -+/* -+ * After we have set current->mm to a new value, this activates -+ * the context for the new mm so we see the new mappings. -+ */ -+static inline void activate_mm(struct mm_struct *active_mm, -+ struct mm_struct *mm) -+{ -+ get_mmu_context(mm); -+ set_context(mm->context, mm->pgd); -+} -+ -+#define deactivate_mm(tsk, mm) do { } while (0) -+ -+extern void mmu_context_init(void); -+#if defined(CONFIG_M547X_8X) -+#define prepare_arch_switch(next) load_ksp_mmu(next) -+ -+static inline void load_ksp_mmu(struct task_struct *task) -+{ -+ int flags; -+ struct mm_struct *mm; -+ int asid; -+ pgd_t *pgd; -+ pmd_t *pmd; -+ pte_t *pte; -+ unsigned long mmuar; -+ -+ local_irq_save(flags); -+ mmuar = task->thread.ksp; -+ -+ /* Search for a valid TLB entry, if one is found, don't remap */ -+ *MMUAR = mmuar; -+ *MMUOR = MMUOR_STLB | MMUOR_ADR; -+ if ((*MMUSR) & MMUSR_HIT) -+ goto end; -+ -+ if (mmuar >= PAGE_OFFSET) { -+ mm = &init_mm; -+ } else { -+ printk ("load_ksp_mmu: non-kernel mm found: 0x%08x\n", (unsigned int) task->mm); -+ mm = task->mm; -+ } -+ -+ if (!mm) -+ goto bug; -+ -+ pgd = pgd_offset(mm, mmuar); -+ if (pgd_none(*pgd)) -+ goto bug; -+ -+ pmd = pmd_offset(pgd, mmuar); -+ if (pmd_none(*pmd)) -+ goto bug; -+ -+ pte = (mmuar >= PAGE_OFFSET) ? pte_offset_kernel(pmd, mmuar) -+ : pte_offset_map(pmd, mmuar); -+ if (pte_none(*pte) || !pte_present(*pte)) -+ goto bug; -+ -+ set_pte(pte, pte_mkyoung(*pte)); -+ asid = mm->context & 0xff; -+ if (!pte_dirty(*pte) && mmuar<=PAGE_OFFSET) -+ set_pte(pte, pte_wrprotect(*pte)); -+ -+ *MMUTR = (mmuar & PAGE_MASK) | (asid << CF_ASID_MMU_SHIFT) -+ | (((int)(pte->pte) & (int)CF_PAGE_MMUTR_MASK ) >> CF_PAGE_MMUTR_SHIFT) -+ | MMUTR_V; -+ -+ *MMUDR = (pte_val(*pte) & PAGE_MASK) -+ | ((pte->pte) & CF_PAGE_MMUDR_MASK) -+ | MMUDR_SZ8K | MMUDR_X; -+ -+ *MMUOR = MMUOR_ACC | MMUOR_UAA; -+ asm ("nop"); -+ -+ goto end; -+ -+bug: -+ printk ("ksp load failed: mm=0x%08x ksp=0x%08x\n", (unsigned int) mm, (unsigned int) mmuar); -+ -+end: -+ local_irq_restore(flags); -+} -+ -+#endif /* CONFIG_M547X_8X */ -+ -+#endif /* CONFIG_COLDFIRE */ - #endif ---- a/include/asm-m68k/page.h -+++ b/include/asm-m68k/page.h -@@ -4,7 +4,7 @@ - #include <linux/const.h> - - /* PAGE_SHIFT determines the page size */ --#ifndef CONFIG_SUN3 -+#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE) - #define PAGE_SHIFT (12) - #else - #define PAGE_SHIFT (13) -@@ -116,10 +116,31 @@ typedef struct page *pgtable_t; - - extern unsigned long m68k_memoffset; - --#ifndef CONFIG_SUN3 -+#if !defined(CONFIG_SUN3) - - #define WANT_PAGE_VIRTUAL - -+#if defined(CONFIG_COLDFIRE) -+static inline unsigned long ___pa(void *vaddr) -+{ -+#if CONFIG_SDRAM_BASE != PAGE_OFFSET -+ return (((unsigned long)vaddr & 0x0fffffff) + CONFIG_SDRAM_BASE); -+#else -+ return (unsigned long)vaddr; -+#endif -+} -+#define __pa(vaddr) ___pa((void *)(vaddr)) -+ -+static inline void *__va(unsigned long paddr) -+{ -+#if CONFIG_SDRAM_BASE != PAGE_OFFSET -+ return (void *)((paddr & 0x0fffffff) + PAGE_OFFSET); -+#else -+ return (void *)paddr; -+#endif -+} -+ -+#else - static inline unsigned long ___pa(void *vaddr) - { - unsigned long paddr; -@@ -141,6 +162,7 @@ static inline void *__va(unsigned long p - : "0" (paddr), "i" (m68k_fixup_memoffset)); - return vaddr; - } -+#endif - - #else /* !CONFIG_SUN3 */ - /* This #define is a horrible hack to suppress lots of warnings. --m */ -@@ -172,6 +194,8 @@ static inline void *__va(unsigned long x - * memory node, but we have no highmem, so that works for now. - * TODO: implement (fast) pfn<->pgdat_idx conversion functions, this makes lots - * of the shifts unnecessary. -+ * -+ * PFNs are used to map physical pages. So PFN[0] maps to the base phys addr. - */ - #define virt_to_pfn(kaddr) (__pa(kaddr) >> PAGE_SHIFT) - #define pfn_to_virt(pfn) __va((pfn) << PAGE_SHIFT) -@@ -228,4 +252,9 @@ static inline __attribute_const__ int __ - - #include <asm-generic/page.h> - -+#ifdef CONFIG_VSYSCALL -+/* vDSO support */ -+#define __HAVE_ARCH_GATE_AREA -+#endif -+ - #endif /* _M68K_PAGE_H */ ---- a/include/asm-m68k/page_offset.h -+++ b/include/asm-m68k/page_offset.h -@@ -1,8 +1,15 @@ -+/* -+ * Page and physical memory maps. -+ */ -+#if defined(CONFIG_SUN3) -+#define PAGE_OFFSET_RAW 0x0E000000 -+ -+#elif defined(CONFIG_M5445X) || defined(CONFIG_M547X_8X) -+#define PHYS_OFFSET CONFIG_SDRAM_BASE -+#define PAGE_OFFSET_RAW (PHYS_OFFSET) -+/* #define PAGE_OFFSET_RAW 0xC0000000 */ - --/* This handles the memory map.. */ --#ifndef CONFIG_SUN3 --#define PAGE_OFFSET_RAW 0x00000000 - #else --#define PAGE_OFFSET_RAW 0x0E000000 -+/* default */ -+#define PAGE_OFFSET_RAW 0x00000000 - #endif -- ---- a/include/asm-m68k/pci.h -+++ b/include/asm-m68k/pci.h -@@ -1,57 +1,10 @@ --#ifndef _ASM_M68K_PCI_H --#define _ASM_M68K_PCI_H -+#ifndef M68K_PCI_H -+#define M68K_PCI_H - --/* -- * asm-m68k/pci_m68k.h - m68k specific PCI declarations. -- * -- * Written by Wout Klaren. -- */ -+#ifdef CONFIG_M5445X -+#include "5445x_pci.h" -+#else -+#include "548x_pci.h" -+#endif - --#include <asm/scatterlist.h> -- --struct pci_ops; -- --/* -- * Structure with hardware dependent information and functions of the -- * PCI bus. -- */ -- --struct pci_bus_info --{ -- /* -- * Resources of the PCI bus. -- */ -- -- struct resource mem_space; -- struct resource io_space; -- -- /* -- * System dependent functions. -- */ -- -- struct pci_ops *m68k_pci_ops; -- -- void (*fixup)(int pci_modify); -- void (*conf_device)(struct pci_dev *dev); --}; -- --#define pcibios_assign_all_busses() 0 --#define pcibios_scan_all_fns(a, b) 0 -- --static inline void pcibios_set_master(struct pci_dev *dev) --{ -- /* No special bus mastering setup handling */ --} -- --static inline void pcibios_penalize_isa_irq(int irq, int active) --{ -- /* We don't do dynamic PCI IRQ allocation */ --} -- --/* The PCI address space does equal the physical memory -- * address space. The networking and block device layers use -- * this boolean for bounce buffer decisions. -- */ --#define PCI_DMA_BUS_IS_PHYS (1) -- --#endif /* _ASM_M68K_PCI_H */ -+#endif /* M68K_PCI_H */ ---- a/include/asm-m68k/pgalloc.h -+++ b/include/asm-m68k/pgalloc.h -@@ -8,8 +8,10 @@ - #include <asm/virtconvert.h> - - --#ifdef CONFIG_SUN3 -+#if defined(CONFIG_SUN3) - #include <asm/sun3_pgalloc.h> -+#elif defined(CONFIG_COLDFIRE) -+#include <asm/cf_pgalloc.h> - #else - #include <asm/motorola_pgalloc.h> - #endif ---- a/include/asm-m68k/pgtable.h -+++ b/include/asm-m68k/pgtable.h -@@ -40,6 +40,8 @@ - /* PGDIR_SHIFT determines what a third-level page table entry can map */ - #ifdef CONFIG_SUN3 - #define PGDIR_SHIFT 17 -+#elif defined(CONFIG_COLDFIRE) -+#define PGDIR_SHIFT 22 - #else - #define PGDIR_SHIFT 25 - #endif -@@ -54,6 +56,10 @@ - #define PTRS_PER_PTE 16 - #define PTRS_PER_PMD 1 - #define PTRS_PER_PGD 2048 -+#elif defined(CONFIG_COLDFIRE) -+#define PTRS_PER_PTE 512 -+#define PTRS_PER_PMD 1 -+#define PTRS_PER_PGD 1024 - #else - #define PTRS_PER_PTE 1024 - #define PTRS_PER_PMD 8 -@@ -66,6 +72,11 @@ - #ifdef CONFIG_SUN3 - #define KMAP_START 0x0DC00000 - #define KMAP_END 0x0E000000 -+#elif defined(CONFIG_COLDFIRE) -+#define VMALLOC_START 0xc0000000 -+#define VMALLOC_END 0xcfffffff -+#define KMAP_START (VMALLOC_END + 1) -+#define KMAP_END 0xe0000000 - #else - #define KMAP_START 0xd0000000 - #define KMAP_END 0xf0000000 -@@ -79,9 +90,11 @@ - * The vmalloc() routines leaves a hole of 4kB between each vmalloced - * area for the same reason. ;) - */ -+#if !defined(CONFIG_COLDFIRE) - #define VMALLOC_OFFSET (8*1024*1024) - #define VMALLOC_START (((unsigned long) high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1)) - #define VMALLOC_END KMAP_START -+#endif - #else - extern unsigned long vmalloc_end; - #define VMALLOC_START 0x0f800000 -@@ -130,6 +143,8 @@ static inline void update_mmu_cache(stru - - #ifdef CONFIG_SUN3 - #include <asm/sun3_pgtable.h> -+#elif defined(CONFIG_COLDFIRE) -+#include <asm/cf_pgtable.h> - #else - #include <asm/motorola_pgtable.h> - #endif -@@ -140,6 +155,9 @@ static inline void update_mmu_cache(stru - /* - * Macro to mark a page protection value as "uncacheable". - */ -+#ifdef CONFIG_COLDFIRE -+# define pgprot_noncached(prot) (__pgprot(pgprot_val(prot) | CF_PAGE_NOCACHE)) -+#else /* CONFIG_COLDFIRE */ - #ifdef SUN3_PAGE_NOCACHE - # define __SUN3_PAGE_NOCACHE SUN3_PAGE_NOCACHE - #else -@@ -154,6 +172,7 @@ static inline void update_mmu_cache(stru - ? (__pgprot((pgprot_val(prot) & _CACHEMASK040) | _PAGE_NOCACHE_S)) \ - : (prot))) - -+#endif /* CONFIG_COLDFIRE */ - #endif /* !__ASSEMBLY__ */ - - /* ---- a/include/asm-m68k/processor.h -+++ b/include/asm-m68k/processor.h -@@ -22,24 +22,38 @@ static inline unsigned long rdusp(void) - { - unsigned long usp; - -+#ifndef CONFIG_COLDFIRE - __asm__ __volatile__("move %/usp,%0" : "=a" (usp)); -+#else -+ __asm__ __volatile__("movel %/usp,%0" : "=a" (usp)); -+#endif - return usp; - } - - static inline void wrusp(unsigned long usp) - { -+#ifndef CONFIG_COLDFIRE - __asm__ __volatile__("move %0,%/usp" : : "a" (usp)); -+#else -+ __asm__ __volatile__("movel %0,%/usp" : : "a" (usp)); -+#endif - } - - /* - * User space process size: 3.75GB. This is hardcoded into a few places, - * so don't change it unless you know what you are doing. - */ --#ifndef CONFIG_SUN3 -+#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE) - #define TASK_SIZE (0xF0000000UL) -+#elif defined(CONFIG_COLDFIRE) -+#define TASK_SIZE (0xC0000000UL) -+#else /* CONFIG_SUN3 */ -+#ifdef __ASSEMBLY__ -+#define TASK_SIZE (0x0E000000) - #else - #define TASK_SIZE (0x0E000000UL) - #endif -+#endif - - #ifdef __KERNEL__ - #define STACK_TOP TASK_SIZE -@@ -49,9 +63,11 @@ static inline void wrusp(unsigned long u - /* This decides where the kernel will search for a free chunk of vm - * space during mmap's. - */ --#ifndef CONFIG_SUN3 --#define TASK_UNMAPPED_BASE 0xC0000000UL --#else -+#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE) -+#define TASK_UNMAPPED_BASE 0xC0000000UL -+#elif defined(CONFIG_COLDFIRE) -+#define TASK_UNMAPPED_BASE 0x80000000UL -+#else /* CONFIG_SUN3 */ - #define TASK_UNMAPPED_BASE 0x0A000000UL - #endif - #define TASK_UNMAPPED_ALIGN(addr, off) PAGE_ALIGN(addr) -@@ -60,7 +76,11 @@ struct thread_struct { - unsigned long ksp; /* kernel stack pointer */ - unsigned long usp; /* user stack pointer */ - unsigned short sr; /* saved status register */ -+#ifndef CONFIG_COLDFIRE - unsigned short fs; /* saved fs (sfc, dfc) */ -+#else -+ mm_segment_t fs; -+#endif - unsigned long crp[2]; /* cpu root pointer */ - unsigned long esp0; /* points to SR of stack frame */ - unsigned long faddr; /* info about last fault */ -@@ -81,6 +101,7 @@ struct thread_struct { - /* - * Do necessary setup to start up a newly executed thread. - */ -+#ifndef CONFIG_COLDFIRE - static inline void start_thread(struct pt_regs * regs, unsigned long pc, - unsigned long usp) - { -@@ -91,6 +112,23 @@ static inline void start_thread(struct p - regs->sr &= ~0x2000; - wrusp(usp); - } -+#else -+/* -+ * Do necessary setup to start up a newly executed thread. -+ * -+ * pass the data segment into user programs if it exists, -+ * it can't hurt anything as far as I can tell -+ */ -+#define start_thread(_regs, _pc, _usp) \ -+do { \ -+ set_fs(USER_DS); /* reads from user space */ \ -+ (_regs)->pc = (_pc); \ -+ if (current->mm) \ -+ (_regs)->d5 = current->mm->start_data; \ -+ (_regs)->sr &= ~0x2000; \ -+ wrusp(_usp); \ -+} while (0) -+#endif - - /* Forward declaration, a strange C thing */ - struct task_struct; ---- a/include/asm-m68k/ptrace.h -+++ b/include/asm-m68k/ptrace.h -@@ -38,10 +38,21 @@ struct pt_regs { - long d0; - long orig_d0; - long stkadj; -+#ifndef CONFIG_COLDFIRE - unsigned short sr; - unsigned long pc; - unsigned format : 4; /* frame format specifier */ - unsigned vector : 12; /* vector offset */ -+#else -+ unsigned long mmuar; -+ unsigned long mmusr; -+ unsigned format : 4; /* frame format specifier */ -+ unsigned fs2 : 2; -+ unsigned vector: 8; -+ unsigned fs1 : 2; -+ unsigned short sr; -+ unsigned long pc; -+#endif - }; - - /* ---- a/include/asm-m68k/raw_io.h -+++ b/include/asm-m68k/raw_io.h -@@ -46,6 +46,29 @@ extern void __iounmap(void *addr, unsign - #define out_le16(addr,w) (void)((*(__force volatile __le16 *) (addr)) = cpu_to_le16(w)) - #define out_le32(addr,l) (void)((*(__force volatile __le32 *) (addr)) = cpu_to_le32(l)) - -+#if (defined CONFIG_COLDFIRE) && (defined CONFIG_PCI) -+unsigned char pci_inb(long addr); -+unsigned short pci_inw(long addr); -+unsigned long pci_inl(long addr); -+void pci_outb(unsigned char val, long addr); -+void pci_outw(unsigned short val, long addr); -+void pci_outl(unsigned long val, long addr); -+unsigned short pci_raw_inw(long addr); -+unsigned long pci_raw_inl(long addr); -+void pci_raw_outw(unsigned short val, long addr); -+void pci_raw_outl(unsigned long val, long addr); -+#define raw_inb(port) pci_inb((long)((volatile unsigned char *)(port))) -+#define raw_inw(port) pci_raw_inw((long)((volatile unsigned short *)(port))) -+#define raw_inl(port) pci_raw_inl((long)((volatile unsigned long *)(port))) -+ -+#define raw_outb(val,port) pci_outb((val),(long)((volatile unsigned char *)(port))) -+#define raw_outw(val,port) pci_raw_outw((val),(long)((volatile unsigned short *)(port))) -+#define raw_outl(val,port) pci_raw_outl((val),(long)((volatile unsigned long *)(port))) -+ -+#define swap_inw(port) pci_inw((long)((volatile unsigned short *)(port))) -+#define swap_outw(val,port) pci_outw((val),(long)((volatile unsigned short *)(port))) -+ -+#else - #define raw_inb in_8 - #define raw_inw in_be16 - #define raw_inl in_be32 -@@ -60,6 +83,9 @@ extern void __iounmap(void *addr, unsign - #define __raw_writew(val,addr) out_be16((addr),(val)) - #define __raw_writel(val,addr) out_be32((addr),(val)) - -+#define swap_inw(port) in_le16((port)) -+#define swap_outw(val,port) out_le16((port),(val)) -+#endif - static inline void raw_insb(volatile u8 __iomem *port, u8 *buf, unsigned int len) - { - unsigned int i; -@@ -77,6 +103,7 @@ static inline void raw_outsb(volatile u8 - out_8(port, *buf++); - } - -+#ifndef CONFIG_COLDFIRE - static inline void raw_insw(volatile u16 __iomem *port, u16 *buf, unsigned int nr) - { - unsigned int tmp; -@@ -342,6 +369,63 @@ static inline void raw_outsw_swapw(volat - : "d0", "a0", "a1", "d6"); - } - -+ -+#else /*CONFIG_COLDFIRE */ -+ -+static inline void raw_insw(volatile u16 *port, u16 *buf, unsigned int nr) -+{ -+ unsigned int i; -+ -+ for (i = 0; i < nr; i++) -+ *buf++ = raw_inw(port); -+} -+ -+static inline void raw_outsw(volatile u16 *port, const u16 *buf, -+ unsigned int nr) -+{ -+ unsigned int i; -+ -+ for (i = 0; i < nr; i++, buf++) -+ raw_outw(*buf, port); -+} -+ -+static inline void raw_insl(volatile u32 *port, u32 *buf, unsigned int nr) -+{ -+ unsigned int i; -+ -+ for (i = 0; i < nr; i++) -+ *buf++ = raw_inl(port); -+} -+ -+static inline void raw_outsl(volatile u32 *port, const u32 *buf, -+ unsigned int nr) -+{ -+ unsigned int i; -+ -+ for (i = 0; i < nr; i++, buf++) -+ raw_outl(*buf, port); -+} -+ -+static inline void raw_insw_swapw(volatile u16 *port, u16 *buf, -+ unsigned int nr) -+{ -+ unsigned int i; -+ -+ for (i = 0; i < nr; i++) -+ *buf++ = in_le16(port); -+ -+} -+ -+static inline void raw_outsw_swapw(volatile u16 __iomem *port, const u16 *buf, -+ unsigned int nr) -+{ -+ unsigned int i; -+ -+ for (i = 0; i < nr; i++, buf++) -+ out_le16(port, *buf); -+} -+#endif /*CONFIG_COLDFIRE */ -+ - #endif /* __KERNEL__ */ - - #endif /* _RAW_IO_H */ ---- a/include/asm-m68k/segment.h -+++ b/include/asm-m68k/segment.h -@@ -29,6 +29,7 @@ typedef struct { - * Get/set the SFC/DFC registers for MOVES instructions - */ - -+#ifndef CONFIG_COLDFIRE - static inline mm_segment_t get_fs(void) - { - mm_segment_t _v; -@@ -50,6 +51,15 @@ static inline void set_fs(mm_segment_t v - : /* no outputs */ : "r" (val.seg) : "memory"); - } - -+#else /* CONFIG_COLDFIRE */ -+ -+#include <asm/current.h> -+#define get_fs() (current->thread.fs) -+#define set_fs(val) (current->thread.fs = (val)) -+#define get_ds() (KERNEL_DS) -+ -+#endif /* CONFIG_COLDFIRE */ -+ - #define segment_eq(a,b) ((a).seg == (b).seg) - - #endif /* __ASSEMBLY__ */ ---- a/include/asm-m68k/setup.h -+++ b/include/asm-m68k/setup.h -@@ -40,6 +40,7 @@ - #define MACH_HP300 9 - #define MACH_Q40 10 - #define MACH_SUN3X 11 -+#define MACH_CFMMU 12 - - #define COMMAND_LINE_SIZE 256 - -@@ -189,6 +190,14 @@ extern unsigned long m68k_machtype; - # define MACH_TYPE (MACH_SUN3X) - #endif - -+#if !defined(CONFIG_COLDFIRE) -+# define MACH_IS_COLDFIRE (0) -+#else -+# define CONFIG_COLDFIRE_ONLY -+# define MACH_IS_COLDFIRE (1) -+# define MACH_TYPE (MACH_CFMMU) -+#endif -+ - #ifndef MACH_TYPE - # define MACH_TYPE (m68k_machtype) - #endif -@@ -211,23 +220,31 @@ extern unsigned long m68k_machtype; - #define CPUB_68030 1 - #define CPUB_68040 2 - #define CPUB_68060 3 -+#define CPUB_CFV4E 4 - - #define CPU_68020 (1<<CPUB_68020) - #define CPU_68030 (1<<CPUB_68030) - #define CPU_68040 (1<<CPUB_68040) - #define CPU_68060 (1<<CPUB_68060) -+#define CPU_CFV4E (1<<CPUB_CFV4E) - - #define FPUB_68881 0 - #define FPUB_68882 1 - #define FPUB_68040 2 /* Internal FPU */ - #define FPUB_68060 3 /* Internal FPU */ - #define FPUB_SUNFPA 4 /* Sun-3 FPA */ -+#define FPUB_CFV4E 5 - - #define FPU_68881 (1<<FPUB_68881) - #define FPU_68882 (1<<FPUB_68882) - #define FPU_68040 (1<<FPUB_68040) - #define FPU_68060 (1<<FPUB_68060) - #define FPU_SUNFPA (1<<FPUB_SUNFPA) -+#ifndef CONFIG_M5445X -+#define FPU_CFV4E (1<<FPUB_CFV4E) -+#else -+#define FPU_CFV4E 0 -+#endif - - #define MMUB_68851 0 - #define MMUB_68030 1 /* Internal MMU */ -@@ -235,6 +252,7 @@ extern unsigned long m68k_machtype; - #define MMUB_68060 3 /* Internal MMU */ - #define MMUB_APOLLO 4 /* Custom Apollo */ - #define MMUB_SUN3 5 /* Custom Sun-3 */ -+#define MMUB_CFV4E 6 - - #define MMU_68851 (1<<MMUB_68851) - #define MMU_68030 (1<<MMUB_68030) -@@ -242,6 +260,7 @@ extern unsigned long m68k_machtype; - #define MMU_68060 (1<<MMUB_68060) - #define MMU_SUN3 (1<<MMUB_SUN3) - #define MMU_APOLLO (1<<MMUB_APOLLO) -+#define MMU_CFV4E (1<<MMUB_CFV4E) - - #ifdef __KERNEL__ - -@@ -341,6 +360,14 @@ extern int m68k_is040or060; - # endif - #endif - -+#if !defined(CONFIG_CFV4E) -+# define CPU_IS_COLDFIRE (0) -+#else -+# define CPU_IS_COLDFIRE (1) -+# define CPU_IS_CFV4E (1) -+# define MMU_IS_CFV4E (1) -+#endif -+ - #define CPU_TYPE (m68k_cputype) - - #ifdef CONFIG_M68KFPU_EMU ---- a/include/asm-m68k/signal.h -+++ b/include/asm-m68k/signal.h -@@ -150,6 +150,7 @@ typedef struct sigaltstack { - #ifdef __KERNEL__ - #include <asm/sigcontext.h> - -+#ifndef CONFIG_COLDFIRE - #define __HAVE_ARCH_SIG_BITOPS - - static inline void sigaddset(sigset_t *set, int _sig) -@@ -200,6 +201,10 @@ static inline int sigfindinword(unsigned - - struct pt_regs; - extern void ptrace_signal_deliver(struct pt_regs *regs, void *cookie); -+#else -+ -+#define ptrace_signal_deliver(regs, cookie) do { } while (0) -+#endif /* CONFIG_COLDFIRE */ - - #endif /* __KERNEL__ */ - ---- a/include/asm-m68k/string.h -+++ b/include/asm-m68k/string.h -@@ -93,6 +93,7 @@ static inline char *strchr(const char *s - return (char *)s - 1; - } - -+#ifndef CONFIG_COLDFIRE - #define __HAVE_ARCH_STRCMP - static inline int strcmp(const char *cs, const char *ct) - { -@@ -110,6 +111,7 @@ static inline int strcmp(const char *cs, - : "+a" (cs), "+a" (ct), "=d" (res)); - return res; - } -+#endif - - #define __HAVE_ARCH_MEMSET - extern void *memset(void *, int, __kernel_size_t); ---- a/include/asm-m68k/system.h -+++ b/include/asm-m68k/system.h -@@ -5,9 +5,24 @@ - #include <linux/kernel.h> - #include <asm/segment.h> - #include <asm/entry.h> -+#include <asm/cfcache.h> - - #ifdef __KERNEL__ - -+#ifdef CONFIG_COLDFIRE -+#define FLUSH_BC (0x00040000) -+ -+#define finish_arch_switch(prev) do { \ -+ unsigned long tmpreg; \ -+ asm volatile ( "move.l %2,%0\n" \ -+ "orl %1,%0\n" \ -+ "movec %0,%%cacr" \ -+ : "=&d" (tmpreg) \ -+ : "id" (FLUSH_BC), "m" (shadow_cacr)); \ -+ } while(0) -+ -+#endif -+ - /* - * switch_to(n) should switch tasks to task ptr, first checking that - * ptr isn't the current task, in which case it does nothing. This -@@ -63,16 +78,25 @@ asmlinkage void resume(void); - #define smp_read_barrier_depends() ((void)0) - - /* interrupt control.. */ --#if 0 --#define local_irq_enable() asm volatile ("andiw %0,%%sr": : "i" (ALLOWINT) : "memory") --#else - #include <linux/hardirq.h> -+#ifndef CONFIG_COLDFIRE - #define local_irq_enable() ({ \ - if (MACH_IS_Q40 || !hardirq_count()) \ - asm volatile ("andiw %0,%%sr": : "i" (ALLOWINT) : "memory"); \ - }) --#endif - #define local_irq_disable() asm volatile ("oriw #0x0700,%%sr": : : "memory") -+#else /* CONFIG_COLDFIRE */ -+#define local_irq_enable() \ -+ asm volatile ("move.w %%sr, %%d0\n\t" \ -+ "andil #0xf8ff,%%d0\n\t" \ -+ "move.w %%d0, %%sr\n" \ -+ : : : "cc", "d0", "memory") -+#define local_irq_disable() \ -+ asm volatile ("move %/sr,%%d0\n\t" \ -+ "ori.l #0x0700,%%d0\n\t" \ -+ "move %%d0,%/sr\n" \ -+ : : : "cc", "%d0", "memory") -+#endif - #define local_save_flags(x) asm volatile ("movew %%sr,%0":"=d" (x) : : "memory") - #define local_irq_restore(x) asm volatile ("movew %0,%%sr": :"d" (x) : "memory") - ---- a/include/asm-m68k/thread_info.h -+++ b/include/asm-m68k/thread_info.h -@@ -58,5 +58,6 @@ struct thread_info { - #define TIF_DELAYED_TRACE 14 /* single step a syscall */ - #define TIF_SYSCALL_TRACE 15 /* syscall trace active */ - #define TIF_MEMDIE 16 -+#define TIF_FREEZE 17 /* freezing processes */ - - #endif /* _ASM_M68K_THREAD_INFO_H */ ---- a/include/asm-m68k/tlbflush.h -+++ b/include/asm-m68k/tlbflush.h -@@ -2,7 +2,7 @@ - #define _M68K_TLBFLUSH_H - - --#ifndef CONFIG_SUN3 -+#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE) - - #include <asm/current.h> - -@@ -92,7 +92,12 @@ static inline void flush_tlb_kernel_rang - flush_tlb_all(); - } - --#else -+static inline void flush_tlb_pgtables(struct mm_struct *mm, -+ unsigned long start, unsigned long end) -+{ -+} -+ -+#elif defined(CONFIG_SUN3) - - - /* Reserved PMEGs. */ -@@ -214,6 +219,13 @@ static inline void flush_tlb_kernel_page - sun3_put_segmap (addr & ~(SUN3_PMEG_SIZE - 1), SUN3_INVALID_PMEG); - } - -+static inline void flush_tlb_pgtables(struct mm_struct *mm, -+ unsigned long start, unsigned long end) -+{ -+} -+ -+#else /* CONFIG_COLDFIRE */ -+#include <asm/cf_tlbflush.h> - #endif - - #endif /* _M68K_TLBFLUSH_H */ ---- a/include/asm-m68k/uaccess.h -+++ b/include/asm-m68k/uaccess.h -@@ -1,6 +1,9 @@ - #ifndef __M68K_UACCESS_H - #define __M68K_UACCESS_H - -+#ifdef CONFIG_COLDFIRE -+#include <asm/cf_uaccess.h> -+#else - /* - * User space memory access functions - */ -@@ -367,4 +370,5 @@ unsigned long __clear_user(void __user * - - #define strlen_user(str) strnlen_user(str, 32767) - -+#endif /* CONFIG_COLDFIRE */ - #endif /* _M68K_UACCESS_H */ ---- a/include/asm-m68k/virtconvert.h -+++ b/include/asm-m68k/virtconvert.h -@@ -46,9 +46,14 @@ static inline void *phys_to_virt(unsigne - #define virt_to_bus(a) (virt_to_phys(a) + (MACH_IS_HADES ? 0x80000000 : 0)) - #define bus_to_virt(a) (phys_to_virt((a) - (MACH_IS_HADES ? 0x80000000 : 0))) - #else -+#ifdef CONFIG_COLDFIRE -+#define virt_to_bus(a) (a - PAGE_OFFSET + PCI_DMA_BASE) -+#define bus_to_virt(a) (a - PCI_DMA_BASE + PAGE_OFFSET) -+#else /* CONFIG_COLDFIRE */ - #define virt_to_bus virt_to_phys - #define bus_to_virt phys_to_virt - #endif -+#endif - - #endif - #endif ---- /dev/null -+++ b/include/linux/can/dev.h -@@ -0,0 +1,62 @@ -+/* -+ * linux/can/dev.h -+ * -+ * Definitions for CAN controller network devices lib (work in progress) -+ * -+ * * * $Id$ -+ * -+ * Author: Andrey Volkov <avolkov@varma-el.com> -+ * Copyright (c) 2006 Varma Electronics Oy -+ * -+ */ -+ -+#ifndef CAN_DEVICE_H -+#define CAN_DEVICE_H -+ -+#include <linux/version.h> -+#include <linux/can/error.h> -+#include <linux/can/ioctl.h> -+ -+struct can_priv { -+ struct can_device_stats can_stats; -+ -+ /* can-bus oscillator frequency, in Hz, -+ BE CAREFUL! SOME CONTROLLERS (LIKE SJA1000) -+ FOOLISH ABOUT THIS FRQ (for sja1000 as ex. this -+ clock must be xtal clock divided by 2). */ -+ u32 can_sys_clock; -+ -+ /* by default max_brp is equal 64, -+ but for a Freescale TouCAN, as ex., it can be 255*/ -+ u32 max_brp; -+ /* For the mostly all controllers, max_sjw is equal 4, but -+ some, hmm, CAN implementations hardwared it to 1 */ -+ u8 max_sjw; -+ -+ u32 baudrate; /* in bauds */ -+ struct can_bittime bit_time; -+ -+ spinlock_t irq_lock; -+ /* Please hold this lock when touching net_stats/can_stats*/ -+ spinlock_t stats_lock; -+ -+ can_state_t state; -+ can_mode_t mode; -+ can_ctrlmode_t ctrlmode; -+ -+ int (*do_set_bit_time)(struct net_device *dev, struct can_bittime *br); -+ int (*do_get_state) (struct net_device *dev, can_state_t *state); -+ int (*do_set_mode) (struct net_device *dev, can_mode_t mode); -+ int (*do_set_ctrlmode)(struct net_device *dev, can_ctrlmode_t ctrlmode); -+ int (*do_get_ctrlmode)(struct net_device *dev, can_ctrlmode_t *ctrlmode); -+}; -+ -+#define ND2D(_ndev) (_ndev->dev.parent) -+ -+struct net_device *alloc_candev(int sizeof_priv); -+void free_candev(struct net_device *dev); -+ -+int can_calc_bit_time(struct can_priv *can, u32 baudrate, -+ struct can_bittime_std *bit_time); -+ -+#endif /* CAN_DEVICE_H */ ---- /dev/null -+++ b/include/linux/can/ioctl.h -@@ -0,0 +1,152 @@ -+/* -+ * linux/can/ioctl.h -+ * -+ * Definitions for CAN controller setup (work in progress) -+ * -+ * $Id$ -+ * -+ * Send feedback to <socketcan-users@lists.berlios.de> -+ * -+ */ -+ -+#ifndef CAN_IOCTL_H -+#define CAN_IOCTL_H -+ -+#include <linux/sockios.h> -+ -+ -+/* max. 16 private ioctls */ -+ -+#define SIOCSCANBAUDRATE (SIOCDEVPRIVATE+0) -+#define SIOCGCANBAUDRATE (SIOCDEVPRIVATE+1) -+ -+#define SIOCSCANCUSTOMBITTIME (SIOCDEVPRIVATE+2) -+#define SIOCGCANCUSTOMBITTIME (SIOCDEVPRIVATE+3) -+ -+#define SIOCSCANMODE (SIOCDEVPRIVATE+4) -+#define SIOCGCANMODE (SIOCDEVPRIVATE+5) -+ -+#define SIOCSCANCTRLMODE (SIOCDEVPRIVATE+6) -+#define SIOCGCANCTRLMODE (SIOCDEVPRIVATE+7) -+ -+#define SIOCSCANFILTER (SIOCDEVPRIVATE+8) -+#define SIOCGCANFILTER (SIOCDEVPRIVATE+9) -+ -+#define SIOCGCANSTATE (SIOCDEVPRIVATE+10) -+#define SIOCGCANSTATS (SIOCDEVPRIVATE+11) -+ -+#define SIOCSCANERRORCONFIG (SIOCDEVPRIVATE+12) -+#define SIOCGCANERRORCONFIG (SIOCDEVPRIVATE+13) -+ -+/* parameters for ioctls */ -+ -+/* SIOC[SG]CANBAUDRATE */ -+/* baudrate for CAN-controller in bits per second. */ -+/* 0 = Scan for baudrate (Autobaud) */ -+ -+typedef __u32 can_baudrate_t; -+ -+ -+/* SIOC[SG]CANCUSTOMBITTIME */ -+ -+typedef enum CAN_BITTIME_TYPE { -+ CAN_BITTIME_STD, -+ CAN_BITTIME_BTR -+} can_bittime_type_t; -+ -+/* TSEG1 of controllers usually is a sum of synch_seg (always 1), -+ * prop_seg and phase_seg1, TSEG2 = phase_seg2 */ -+ -+struct can_bittime_std { -+ __u32 brp; /* baud rate prescaler */ -+ __u8 prop_seg; /* from 1 to 8 */ -+ __u8 phase_seg1; /* from 1 to 8 */ -+ __u8 phase_seg2; /* from 1 to 8 */ -+ __u8 sjw:7; /* from 1 to 4 */ -+ __u8 sam:1; /* 1 - enable triple sampling */ -+}; -+ -+struct can_bittime_btr { -+ __u8 btr0; -+ __u8 btr1; -+}; -+ -+struct can_bittime { -+ can_bittime_type_t type; -+ union { -+ struct can_bittime_std std; -+ struct can_bittime_btr btr; -+ }; -+}; -+ -+#define CAN_BAUDRATE_UNCONFIGURED ((__u32) 0xFFFFFFFFU) -+#define CAN_BAUDRATE_UNKNOWN 0 -+ -+/* SIOC[SG]CANMODE */ -+ -+typedef __u32 can_mode_t; -+ -+#define CAN_MODE_STOP 0 -+#define CAN_MODE_START 1 -+#define CAN_MODE_SLEEP 2 -+ -+ -+/* SIOC[SG]CANCTRLMODE */ -+ -+typedef __u32 can_ctrlmode_t; -+ -+#define CAN_CTRLMODE_LOOPBACK 0x1 -+#define CAN_CTRLMODE_LISTENONLY 0x2 -+ -+ -+/* SIOCGCANFILTER */ -+ -+typedef __u32 can_filter_t; -+ -+/* filter modes (may vary due to controller specific capabilities) */ -+#define CAN_FILTER_CAPAB 0 /* get filter type capabilities -+ (32 Bit value) */ -+#define CAN_FILTER_MASK_VALUE 1 /* easy bit filter (see struct can_filter) */ -+#define CAN_FILTER_SFF_BITMASK 2 /* bitfield with 2048 bit SFF filter */ -+ /* filters 3 - 31 currently undefined */ -+ -+#define CAN_FILTER_MAX 31 /* max. filter type value */ -+ -+ -+/* SIOCGCANSTATE */ -+ -+typedef __u32 can_state_t; -+ -+#define CAN_STATE_ACTIVE 0 -+#define CAN_STATE_BUS_WARNING 1 -+#define CAN_STATE_BUS_PASSIVE 2 -+#define CAN_STATE_BUS_OFF 3 -+#define CAN_STATE_SCANNING_BAUDRATE 4 -+#define CAN_STATE_STOPPED 5 -+#define CAN_STATE_SLEEPING 6 -+ -+ -+/* SIOCGCANSTATS */ -+ -+struct can_device_stats { -+ int error_warning; -+ int data_overrun; -+ int wakeup; -+ int bus_error; -+ int error_passive; -+ int arbitration_lost; -+ int restarts; -+ int bus_error_at_init; -+}; -+ -+/* SIOC[SG]CANERRORCONFIG */ -+ -+typedef enum CAN_ERRCFG_TYPE { -+ CAN_ERRCFG_MASK, -+ CAN_ERRCFG_BUSERR, -+ CAN_ERRCFG_BUSOFF -+} can_errcfg_type_t; -+ -+/* tbd */ -+ -+#endif /* CAN_IOCTL_H */ ---- /dev/null -+++ b/include/linux/can/version.h -@@ -0,0 +1,22 @@ -+/* -+ * linux/can/version.h -+ * -+ * Version information for the CAN network layer implementation -+ -+ * Author: Urs Thuermann <urs.thuermann@volkswagen.de> -+ * Copyright (c) 2002-2007 Volkswagen Group Electronic Research -+ * All rights reserved. -+ * -+ * Send feedback to <socketcan-users@lists.berlios.de> -+ * -+ */ -+ -+#ifndef CAN_VERSION_H -+#define CAN_VERSION_H -+ -+#define RCSID(s) asm(".section .rodata.str1.1,\"aMS\",@progbits,1\n\t" \ -+ ".string \"" s "\"\n\t.previous\n") -+ -+RCSID("$Id$"); -+ -+#endif /* CAN_VERSION_H */ ---- a/include/linux/fb.h -+++ b/include/linux/fb.h -@@ -873,6 +873,17 @@ struct fb_info { - #define fb_writeq sbus_writeq - #define fb_memset sbus_memset_io - -+#elif defined(CONFIG_COLDFIRE) -+#define fb_readb readb -+#define fb_readw readw -+#define fb_readl readl -+#define fb_readq readq -+#define fb_writeb writeb -+#define fb_writew writew -+#define fb_writel writel -+#define fb_writeq writeq -+#define fb_memset memset_io -+ - #elif defined(__i386__) || defined(__alpha__) || defined(__x86_64__) || defined(__hppa__) || (defined(__sh__) && !defined(__SH5__)) || defined(__powerpc__) || defined(__avr32__) - - #define fb_readb __raw_readb -@@ -899,7 +910,7 @@ struct fb_info { - - #endif - --#if defined (__BIG_ENDIAN) -+#if defined (__BIG_ENDIAN) && !defined(CONFIG_COLDFIRE) - #define FB_LEFT_POS(bpp) (32 - bpp) - #define FB_SHIFT_HIGH(val, bits) ((val) >> (bits)) - #define FB_SHIFT_LOW(val, bits) ((val) << (bits)) ---- a/include/linux/fsl_devices.h -+++ b/include/linux/fsl_devices.h -@@ -91,6 +91,19 @@ enum fsl_usb2_operating_modes { - FSL_USB2_DR_OTG, - }; - -+/* DDD -+ * replace _operating_modes with _controller -+ * -+ * the operating_mode tests in fsl_platform_verify() aren't needed, -+ * since the ehci driver isn't going to be probe()d unless it's -+ * "fsl-ehci" device anyway, and what we really need to know is -+ * which controller (MPH/DR) we're dealing with -+ */ -+enum fsl_usb2_controller { -+ FSL_USB2_MPH, -+ FSL_USB2_DR, -+}; -+ - enum fsl_usb2_phy_modes { - FSL_USB2_PHY_NONE, - FSL_USB2_PHY_ULPI, -@@ -101,9 +114,36 @@ enum fsl_usb2_phy_modes { - - struct fsl_usb2_platform_data { - /* board specific information */ -- enum fsl_usb2_operating_modes operating_mode; -+ /* -+ * DDD see note above -+ * enum fsl_usb2_operating_modes operating_mode; -+ */ -+ enum fsl_usb2_controller controller; - enum fsl_usb2_phy_modes phy_mode; - unsigned int port_enables; -+ /* -+ * DDD this could arguably be moved to a separate -+ * fsl usb2 device header file -+ */ -+ char *name; /* pretty print */ -+ int (*platform_init) (struct platform_device *); -+ void (*platform_uninit) (struct platform_device *); -+ int (*platform_verify) (struct platform_device *); -+ u32 xcvr_type; /* PORTSCX_PTS_* */ -+ u32 view; /* ULPI viewport register */ -+ u32 r_start; /* start of MEM resource */ -+ u32 r_len; /* length of MEM resource */ -+ void __iomem *regs; /* ioremap'd register base */ -+ unsigned big_endian_mmio : 1; -+ unsigned big_endian_desc : 1; -+ unsigned es : 1; /* need USBMODE:ES */ -+ unsigned have_sysif_regs : 1; -+ unsigned le_setup_buf : 1; -+ unsigned does_otg : 1; /* set IFF it's an OTG port */ -+ -+ unsigned power_budget; /* for hcd->power_budget */ -+ struct fsl_xcvr_ops *xcvr_ops; -+ int max_ep_nr; /* max # of endpoints */ - }; - - /* Flags in fsl_usb2_mph_platform_data */ -@@ -126,5 +166,16 @@ struct mpc8xx_pcmcia_ops { - int(*voltage_set)(int slot, int vcc, int vpp); - }; - -+struct fsl_ata_platform_data { -+#ifdef CONFIG_FSL_PATA_USE_DMA -+ int udma_mask; /* UDMA modes h/w can handle */ -+ int fifo_alarm; /* value for fifo_alarm reg */ -+ int max_sg; /* longest sglist h/w can handle */ -+#endif -+ int (*init)(struct platform_device *pdev); -+ void (*exit)(void); -+ int (*get_clk_rate)(void); -+}; -+ - #endif /* _FSL_DEVICE_H_ */ - #endif /* __KERNEL__ */ ---- a/include/linux/pci.h -+++ b/include/linux/pci.h -@@ -458,8 +458,10 @@ int __must_check pcibios_enable_device(s - char *pcibios_setup(char *str); - - /* Used only when drivers/pci/setup.c is used */ -+#ifndef CONFIG_COLDFIRE - void pcibios_align_resource(void *, struct resource *, resource_size_t, - resource_size_t); -+#endif - void pcibios_update_irq(struct pci_dev *, int irq); - - /* Generic PCI functions used internally */ ---- /dev/null -+++ b/include/linux/spi/mcfqspi.h -@@ -0,0 +1,80 @@ -+/****************************************************************************/ -+ -+/* -+ * mcfqspi.c - Master QSPI controller for the ColdFire processors -+ * -+ * (C) Copyright 2005, Intec Automation, -+ * Mike Lavender (mike@steroidmicros) -+ * -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 2 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program; if not, write to the Free Software -+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -+/* ------------------------------------------------------------------------- */ -+ -+#ifndef MCFQSPI_H_ -+#define MCFQSPI_H_ -+ -+#define QSPI_CS_INIT 0x01 -+#define QSPI_CS_ASSERT 0x02 -+#define QSPI_CS_DROP 0x04 -+ -+#define QSPIIOCS_DOUT_HIZ 1 /* QMR[DOHIE] set hi-z dout between transfers */ -+#define QSPIIOCS_BITS 2 /* QMR[BITS] set transfer size */ -+#define QSPIIOCG_BITS 3 /* QMR[BITS] get transfer size */ -+#define QSPIIOCS_CPOL 4 /* QMR[CPOL] set SCK inactive state */ -+#define QSPIIOCS_CPHA 5 /* QMR[CPHA] set SCK phase, 1=rising edge */ -+#define QSPIIOCS_BAUD 6 /* QMR[BAUD] set SCK baud rate divider */ -+#define QSPIIOCS_QCD 7 /* QDLYR[QCD] set start delay */ -+#define QSPIIOCS_DTL 8 /* QDLYR[DTL] set after delay */ -+#define QSPIIOCS_CONT 9 /* continuous CS asserted during transfer */ -+#define QSPIIOCS_READDATA 10 /* set data send during read */ -+#define QSPIIOCS_ODD_MOD 11 /* if length of buffer is a odd number, 16-bit transfers */ -+ /* are finalized with a 8-bit transfer */ -+#define QSPIIOCS_DSP_MOD 12 /* transfers are bounded to 15/30 bytes (a multiple of 3 bytes = 1 DSPword) */ -+#define QSPIIOCS_POLL_MOD 13 /* driver uses polling instead of interrupts */ -+ -+#define QSPIIOCS_SET_CSIV 14 /* sets CSIV flag (cs inactive level) */ -+ -+#ifdef CONFIG_M520x -+#undef MCF_GPIO_PAR_QSPI -+#define MCF_GPIO_PAR_QSPI (0xA4034) -+#endif -+ -+struct coldfire_spi_master { -+ u16 bus_num; -+ u16 num_chipselect; -+ u8 irq_source; -+ u32 irq_vector; -+ u32 irq_mask; -+ u8 irq_lp; -+ u8 par_val; -+ u16 par_val16; -+ void (*cs_control)(u8 cs, u8 command); -+}; -+ -+ -+struct coldfire_spi_chip { -+ u8 mode; -+ u8 bits_per_word; -+ u8 del_cs_to_clk; -+ u8 del_after_trans; -+ u16 void_write_data; -+}; -+ -+typedef struct qspi_read_data { -+ __u32 length; -+ __u8 *buf; /* data to send during read */ -+ unsigned int loop : 1; -+} qspi_read_data; -+#endif /*MCFQSPI_H_*/ ---- /dev/null -+++ b/include/linux/usb/fsl_usb2.h -@@ -0,0 +1,463 @@ -+/* -+ * Copyright 2005-2007 Freescale Semiconductor, Inc. All Rights Reserved. -+ */ -+ -+/* -+ * The code contained herein is licensed under the GNU General Public -+ * License. You may obtain a copy of the GNU General Public License -+ * Version 2 or later at the following locations: -+ * -+ * http://www.opensource.org/licenses/gpl-license.html -+ * http://www.gnu.org/copyleft/gpl.html -+ */ -+ -+/* -+ * Freescale USB device/endpoint management registers -+ */ -+#ifndef __FSL_USB2_H -+#define __FSL_USB2_H -+ -+ -+ /* USB DR device mode registers (Little Endian) */ -+struct fsl_usb_device_regs { -+ /* Capability register */ -+ u32 id; -+ u32 res1[63]; -+ u16 caplength; /* Capability Register Length */ -+ u16 hciversion; /* Host Controller Interface Version */ -+ u32 hcsparams; /* Host Controller Structual Parameters */ -+ u32 hccparams; /* Host Controller Capability Parameters */ -+ u32 res2[5]; -+ u32 dciversion; /* Device Controller Interface Version */ -+ u32 dccparams; /* Device Controller Capability Parameters */ -+ u32 res3[6]; -+ /* Operation register */ -+ u32 usbcmd; /* USB Command Register */ -+ u32 usbsts; /* USB Status Register */ -+ u32 usbintr; /* USB Interrupt Enable Register */ -+ u32 frindex; /* Frame Index Register */ -+ u32 res4; -+ u32 deviceaddr; /* Device Address */ -+ u32 endpointlistaddr; /* Endpoint List Address Register */ -+ u32 res5; -+ u32 burstsize; /* Master Interface Data Burst Size Register */ -+ u32 txttfilltuning; /* Transmit FIFO Tuning Controls Register */ -+ u32 res6[2]; -+ u32 ulpiview; -+ u32 res7[3]; -+ u32 configflag; /* Configure Flag Register */ -+ u32 portsc1; /* Port 1 Status and Control Register */ -+ u32 res8[7]; -+ u32 otgsc; /* On-The-Go Status and Control */ -+ u32 usbmode; /* USB Mode Register */ -+ u32 endptsetupstat; /* Endpoint Setup Status Register */ -+ u32 endpointprime; /* Endpoint Initialization Register */ -+ u32 endptflush; /* Endpoint Flush Register */ -+ u32 endptstatus; /* Endpoint Status Register */ -+ u32 endptcomplete; /* Endpoint Complete Register */ -+#if 0 -+ u32 endptctrl[USB_MAX_ENDPOINTS]; /* Endpoint Control Registers */ -+#else -+ // DDD see DCCPARAMS:DEN for the real number of device endpoints -+ // DDD 16 is the max -+ u32 endptctrl[16]; /* Endpoint Control Registers */ -+#endif -+}; -+ -+ /* USB DR host mode registers (Little Endian) */ -+struct fsl_usb_host_regs { -+ /* Capability register */ -+ u32 id; -+ u32 res1[63]; -+ u16 caplength; /* Capability Register Length */ -+ u16 hciversion; /* Host Controller Interface Version */ -+ u32 hcsparams; /* Host Controller Structual Parameters */ -+ u32 hccparams; /* Host Controller Capability Parameters */ -+ u32 res2[5]; -+ u32 dciversion; /* Device Controller Interface Version */ -+ u32 dccparams; /* Device Controller Capability Parameters */ -+ u32 res3[6]; -+ /* Operation register */ -+ u32 usbcmd; /* USB Command Register */ -+ u32 usbsts; /* USB Status Register */ -+ u32 usbintr; /* USB Interrupt Enable Register */ -+ u32 frindex; /* Frame Index Register */ -+ u32 res4; -+ u32 periodiclistbase; /* Periodic Frame List Base Address Register */ -+ u32 asynclistaddr; /* Current Asynchronous List Address Register */ -+ u32 res5; -+ u32 burstsize; /* Master Interface Data Burst Size Register */ -+ u32 txttfilltuning; /* Transmit FIFO Tuning Controls Register */ -+ u32 res6[2]; -+ u32 ulpiview; -+ u32 res7[3]; -+ u32 configflag; /* Configure Flag Register */ -+ u32 portsc1; /* Port 1 Status and Control Register */ -+ u32 res8[7]; -+ u32 otgsc; /* On-The-Go Status and Control */ -+ u32 usbmode; /* USB Mode Register */ -+ u32 endptsetupstat; /* Endpoint Setup Status Register */ -+ u32 endpointprime; /* Endpoint Initialization Register */ -+ u32 endptflush; /* Endpoint Flush Register */ -+ u32 endptstatus; /* Endpoint Status Register */ -+ u32 endptcomplete; /* Endpoint Complete Register */ -+#if 0 -+ u32 endptctrl[USB_MAX_ENDPOINTS]; /* Endpoint Control Registers */ -+#else -+ /* DDD see DCCPARAMS:DEN for the real number of device endpoints */ -+ /* DDD 16 is the max */ -+ u32 endptctrl[16]; /* Endpoint Control Registers */ -+#endif -+}; -+ -+ /* non-EHCI USB system interface registers (Big Endian) */ -+struct usb_sys_interface { -+ u32 snoop1; -+ u32 snoop2; -+ u32 age_cnt_thresh; /* Age Count Threshold Register */ -+ u32 pri_ctrl; /* Priority Control Register */ -+ u32 si_ctrl; /* System Interface Control Register */ -+ u32 res[59]; -+ u32 control; /* General Purpose Control Register */ -+}; -+ -+/* ep0 transfer state */ -+#define WAIT_FOR_SETUP 0 -+#define DATA_STATE_XMIT 1 -+#define DATA_STATE_NEED_ZLP 2 -+#define WAIT_FOR_OUT_STATUS 3 -+#define DATA_STATE_RECV 4 -+ -+/* Frame Index Register Bit Masks */ -+#define USB_FRINDEX_MASKS 0x3fff -+ -+ -+ -+/* USBCMD Register Bit Masks */ -+#define USB_CMD_RUN_STOP 0x00000001 -+#define USB_CMD_CTRL_RESET 0x00000002 -+#define USB_CMD_PERIODIC_SCHEDULE_EN 0x00000010 -+#define USB_CMD_ASYNC_SCHEDULE_EN 0x00000020 -+#define USB_CMD_INT_AA_DOORBELL 0x00000040 -+#define USB_CMD_ASP 0x00000300 -+#define USB_CMD_ASYNC_SCH_PARK_EN 0x00000800 -+#define USB_CMD_SUTW 0x00002000 -+#define USB_CMD_ATDTW 0x00004000 -+#define USB_CMD_ITC 0x00FF0000 -+ -+/* bit 15,3,2 are frame list size */ -+#define USB_CMD_FRAME_SIZE_1024 0x00000000 -+#define USB_CMD_FRAME_SIZE_512 0x00000004 -+#define USB_CMD_FRAME_SIZE_256 0x00000008 -+#define USB_CMD_FRAME_SIZE_128 0x0000000C -+#define USB_CMD_FRAME_SIZE_64 0x00008000 -+#define USB_CMD_FRAME_SIZE_32 0x00008004 -+#define USB_CMD_FRAME_SIZE_16 0x00008008 -+#define USB_CMD_FRAME_SIZE_8 0x0000800C -+ -+/* bit 9-8 are async schedule park mode count */ -+#define USB_CMD_ASP_00 0x00000000 -+#define USB_CMD_ASP_01 0x00000100 -+#define USB_CMD_ASP_10 0x00000200 -+#define USB_CMD_ASP_11 0x00000300 -+#define USB_CMD_ASP_BIT_POS 8 -+ -+/* bit 23-16 are interrupt threshold control */ -+#define USB_CMD_ITC_NO_THRESHOLD 0x00000000 -+#define USB_CMD_ITC_1_MICRO_FRM 0x00010000 -+#define USB_CMD_ITC_2_MICRO_FRM 0x00020000 -+#define USB_CMD_ITC_4_MICRO_FRM 0x00040000 -+#define USB_CMD_ITC_8_MICRO_FRM 0x00080000 -+#define USB_CMD_ITC_16_MICRO_FRM 0x00100000 -+#define USB_CMD_ITC_32_MICRO_FRM 0x00200000 -+#define USB_CMD_ITC_64_MICRO_FRM 0x00400000 -+#define USB_CMD_ITC_BIT_POS 16 -+ -+ -+ -+ -+/* USB STS Register Bit Masks */ -+#define USB_STS_INT 0x00000001 -+#define USB_STS_ERR 0x00000002 -+#define USB_STS_PORT_CHANGE 0x00000004 -+#define USB_STS_FRM_LST_ROLL 0x00000008 -+#define USB_STS_SYS_ERR 0x00000010 -+#define USB_STS_IAA 0x00000020 -+#define USB_STS_RESET 0x00000040 -+#define USB_STS_SOF 0x00000080 -+#define USB_STS_SUSPEND 0x00000100 -+#define USB_STS_HC_HALTED 0x00001000 -+#define USB_STS_RCL 0x00002000 -+#define USB_STS_PERIODIC_SCHEDULE 0x00004000 -+#define USB_STS_ASYNC_SCHEDULE 0x00008000 -+ -+/* USB INTR Register Bit Masks */ -+#define USB_INTR_INT_EN 0x00000001 -+#define USB_INTR_ERR_INT_EN 0x00000002 -+#define USB_INTR_PTC_DETECT_EN 0x00000004 -+#define USB_INTR_FRM_LST_ROLL_EN 0x00000008 -+#define USB_INTR_SYS_ERR_EN 0x00000010 -+#define USB_INTR_ASYN_ADV_EN 0x00000020 -+#define USB_INTR_RESET_EN 0x00000040 -+#define USB_INTR_SOF_EN 0x00000080 -+#define USB_INTR_DEVICE_SUSPEND 0x00000100 -+ -+/* Device Address bit masks */ -+#define USB_DEVICE_ADDRESS_MASK 0xFE000000 -+#define USB_DEVICE_ADDRESS_BIT_POS 25 -+ -+/* endpoint list address bit masks */ -+#define USB_EP_LIST_ADDRESS_MASK 0xfffff800 -+ -+ -+/* x_PORTSCx */ -+/* bit 31-30 are port transceiver select */ -+#define PORTSCX_PTS_MASK (3 << 30) /* parallel xcvr select mask */ -+#define PORTSCX_PHY_TYPE_SEL PORTSCX_PTS_MASK -+#define PORTSCX_PTS_UTMI (0 << 30) /* UTMI/UTMI+ */ -+#define PORTSCX_PTS_PHILIPS (1 << 30) /* Philips classic */ -+#define PORTSCX_PTS_ULPI (2 << 30) /* ULPI */ -+#define PORTSCX_PTS_SERIAL (3 << 30) /* serial */ -+#define PORTSCX_PTS_FSLS PORTSCX_PTS_SERIAL -+#define PORTSCX_PTS_ONCHIP PORTSCX_PTS_FSLS -+ -+#define PORTSCX_STS (1 << 29) /* serial xcvr select */ -+ -+/* bit 28 is parallel transceiver width for UTMI interface */ -+#define PORTSCX_PTW_8BIT (0 << 28) /* 8 bit parallel xcvr */ -+#define PORTSCX_PTW_16BIT (1 << 28) /* 16 bi parallel xcvr */ -+ -+/* bit 27-26 are port speed */ -+#define PORTSCX_PORT_SPEED_FULL (0 << 26) -+#define PORTSCX_PORT_SPEED_LOW (1 << 26) -+#define PORTSCX_PORT_SPEED_HIGH (2 << 26) -+#define PORTSCX_PORT_SPEED_UNDEF (3 << 26) -+#define PORTSCX_PORT_SPEED_MASK (3 << 26) -+ -+#define PORTSCX_PHY_LOW_POWER_SPD (1 << 23) /* phy low pwr suspend/clk disable */ -+ -+/* bit 19-16 are port test control */ -+#define PORTSCX_PTC_DISABLE (0 << 16) -+#define PORTSCX_PTC_JSTATE (1 << 16) -+#define PORTSCX_PTC_KSTATE (2 << 16) -+#define PORTSCX_PTC_SEQNAK (3 << 16) /* SE0 (host) / NAK (device) */ -+#define PORTSCX_PTC_PACKET (4 << 16) -+#define PORTSCX_PTC_FORCE_EN_HS (5 << 16) -+#define PORTSCX_PTC_FORCE_EN_FS (6 << 16) -+#define PORTSCX_PTC_FORCE_EN_LS (7 << 16) -+ -+ -+/* bit 15-14 are port indicator control */ -+#define PORTSCX_PIC_OFF (0 << 14) -+#define PORTSCX_PIC_AMBER (1 << 14) -+#define PORTSCX_PIC_GREEN (2 << 14) -+#define PORTSCX_PIC_UNDEF (3 << 14) -+ -+#define PORTSCX_PORT_POWER (1 << 12) /* port power */ -+ -+/* bit 11-10 are line status */ -+#define PORTSCX_LS_MASK (3 << 10) /* Line State mask */ -+#define PORTSCX_LS_SE0 (0 << 10) /* SE0 */ -+#define PORTSCX_LS_K_STATE (1 << 10) /* K-state */ -+#define PORTSCX_LS_J_STATE (2 << 10) /* J-state */ -+ -+#define PORTSCX_PORT_RESET (1 << 8) /* Port reset */ -+#define PORTSCX_PORT_SUSPEND (1 << 7) /* Suspend */ -+#define PORTSCX_PORT_FORCE_RESUME (1 << 6) /* Force port resume */ -+#define PORTSCX_OVER_CURRENT_CHG (1 << 5) /* over current change */ -+#define PORTSCX_OVER_CURRENT_ACT (1 << 4) /* over currrent active */ -+#define PORTSCX_PORT_EN_DIS_CHANGE (1 << 3) /* port {en,dis}able change */ -+#define PORTSCX_PORT_ENABLE (1 << 2) /* port enabled */ -+#define PORTSCX_CONNECT_STATUS_CHANGE (1 << 1) /* connect status change */ -+#define PORTSCX_CURRENT_CONNECT_STATUS (1 << 0) /* current connect status */ -+ -+#define PORTSCX_W1C_BITS \ -+ ( PORTSCX_CONNECT_STATUS_CHANGE | \ -+ PORTSCX_PORT_EN_DIS_CHANGE | \ -+ PORTSCX_OVER_CURRENT_CHG ) -+ -+ -+ -+/* UOG_OTGSC Register Bits */ -+/* control bits: */ -+#define OTGSC_CTRL_VBUS_DISCHARGE (1 << 0) -+#define OTGSC_CTRL_VBUS_CHARGE (1 << 1) -+#define OTGSC_CTRL_OTG_TERM (1 << 3) /* controls DM pulldown */ -+#define OTGSC_CTRL_DATA_PULSING (1 << 4) -+#define OTGSC_CTRL_USB_ID_PU (1 << 5) /* enable ID pullup */ -+/* current status: (R/O) */ -+#define OTGSC_STS_USB_ID (1 << 8) /* 0=A-device 1=B-device */ -+#define OTGSC_STS_A_VBUS_VALID (1 << 9) -+#define OTGSC_STS_A_SESSION_VALID (1 << 10) -+#define OTGSC_STS_B_SESSION_VALID (1 << 11) -+#define OTGSC_STS_B_SESSION_END (1 << 12) -+#define OTGSC_STS_1ms_TIMER (1 << 13) -+#define OTGSC_STS_DATA_PULSE (1 << 14) -+/* interrupt status: (write to clear) */ -+#define OTGSC_INTSTS_MASK (0x7f << 16) -+#define OTGSC_INTSTS_USB_ID (1 << 16) -+#define OTGSC_INTSTS_A_VBUS_VALID (1 << 17) -+#define OTGSC_INTSTS_A_SESSION_VALID (1 << 18) -+#define OTGSC_INTSTS_B_SESSION_VALID (1 << 19) -+#define OTGSC_INTSTS_B_SESSION_END (1 << 20) -+#define OTGSC_INTSTS_1MS_TIMER (1 << 21) -+#define OTGSC_INTSTS_DATA_PULSE (1 << 22) -+/* interrupt enables: */ -+#define OTGSC_IE_MASK (0x7f << 24) -+#define OTGSC_IE_USB_ID (1 << 24) -+#define OTGSC_IE_A_VBUS_VALID (1 << 25) -+#define OTGSC_IE_A_SESSION_VALID (1 << 26) -+#define OTGSC_IE_B_SESSION_VALID (1 << 27) -+#define OTGSC_IE_B_SESSION_END (1 << 28) -+#define OTGSC_IE_1ms_TIMER (1 << 29) -+#define OTGSC_IE_DATA_PULSE (1 << 30) -+ -+#if 1 /* DDD FIXME these here for compatibility between my names and Leo's */ -+/* OTG interrupt enable bit masks */ -+#define OTGSC_INTERRUPT_ENABLE_BITS_MASK OTGSC_IE_MASK -+ -+/* OTG interrupt status bit masks */ -+#define OTGSC_INTERRUPT_STATUS_BITS_MASK OTGSC_INTSTS_MASK -+#endif // 1 -+ -+ -+ -+/* x_USBMODE */ -+#undef USBMODE_SDIS /* defined as bit 3 in drivers/usb/host/ehci.h */ -+#define USBMODE_SDIS (1 << 4) /* stream disable mode */ -+#define USBMODE_SLOM (1 << 3) /* setup lockout mode */ -+#define USBMODE_ES (1 << 2) /* (big) endian select */ -+#define USBMODE_CM_MASK (3 << 0) /* controller mode mask */ -+#define USBMODE_CM_HOST (3 << 0) /* host */ -+#define USBMODE_CM_DEVICE (2 << 0) /* device */ -+// DDD #define USBMODE_CM_IDLE (0 << 0) /* idle */ -+ -+/* DDD for compatibility for now */ -+#define USB_MODE_CTRL_MODE_IDLE USBMODE_CM_IDLE -+#define USB_MODE_CTRL_MODE_DEVICE USBMODE_CM_DEVICE -+#define USB_MODE_CTRL_MODE_HOST USBMODE_CM_HOST -+#define USB_MODE_SETUP_LOCK_OFF USBMODE_SLOM -+#define USB_MODE_STREAM_DISABLE USBMODE_SDIS -+ -+ -+/* ULPIVIEW register bits */ -+#define ULPIVW_WU (1 << 31) /* Wakeup */ -+#define ULPIVW_RUN (1 << 30) /* read/write run */ -+#define ULPIVW_WRITE (1 << 29) /* 0=read 1=write */ -+#define ULPIVW_SS (1 << 27) /* SyncState */ -+#define ULPIVW_PORT_MASK 0x07 /* Port field */ -+#define ULPIVW_PORT_SHIFT 24 -+#define ULPIVW_ADDR_MASK 0xFF /* data address field */ -+#define ULPIVW_ADDR_SHIFT 16 -+#define ULPIVW_RDATA_MASK 0xFF /* read data field */ -+#define ULPIVW_RDATA_SHIFT 8 -+#define ULPIVW_WDATA_MASK 0xFF /* write data field */ -+#define ULPIVW_WDATA_SHIFT 0 -+ -+ -+/* Endpoint Flush Register */ -+#define EPFLUSH_TX_OFFSET 0x00010000 -+#define EPFLUSH_RX_OFFSET 0x00000000 -+ -+/* Endpoint Setup Status bit masks */ -+#define EP_SETUP_STATUS_MASK 0x0000003F -+#define EP_SETUP_STATUS_EP0 0x00000001 -+ -+/* ENDPOINTCTRLx Register Bit Masks */ -+#define EPCTRL_TX_ENABLE 0x00800000 -+#define EPCTRL_TX_DATA_TOGGLE_RST 0x00400000 /* Not EP0 */ -+#define EPCTRL_TX_DATA_TOGGLE_INH 0x00200000 /* Not EP0 */ -+#define EPCTRL_TX_TYPE 0x000C0000 -+#define EPCTRL_TX_DATA_SOURCE 0x00020000 /* Not EP0 */ -+#define EPCTRL_TX_EP_STALL 0x00010000 -+#define EPCTRL_RX_ENABLE 0x00000080 -+#define EPCTRL_RX_DATA_TOGGLE_RST 0x00000040 /* Not EP0 */ -+#define EPCTRL_RX_DATA_TOGGLE_INH 0x00000020 /* Not EP0 */ -+#define EPCTRL_RX_TYPE 0x0000000C -+#define EPCTRL_RX_DATA_SINK 0x00000002 /* Not EP0 */ -+#define EPCTRL_RX_EP_STALL 0x00000001 -+ -+/* bit 19-18 and 3-2 are endpoint type */ -+#define EPCTRL_EP_TYPE_CONTROL 0 -+#define EPCTRL_EP_TYPE_ISO 1 -+#define EPCTRL_EP_TYPE_BULK 2 -+#define EPCTRL_EP_TYPE_INTERRUPT 3 -+#define EPCTRL_TX_EP_TYPE_SHIFT 18 -+#define EPCTRL_RX_EP_TYPE_SHIFT 2 -+ -+/* SNOOPn Register Bit Masks */ -+#define SNOOP_ADDRESS_MASK 0xFFFFF000 -+#define SNOOP_SIZE_ZERO 0x00 /* snooping disable */ -+#define SNOOP_SIZE_4KB 0x0B /* 4KB snoop size */ -+#define SNOOP_SIZE_8KB 0x0C -+#define SNOOP_SIZE_16KB 0x0D -+#define SNOOP_SIZE_32KB 0x0E -+#define SNOOP_SIZE_64KB 0x0F -+#define SNOOP_SIZE_128KB 0x10 -+#define SNOOP_SIZE_256KB 0x11 -+#define SNOOP_SIZE_512KB 0x12 -+#define SNOOP_SIZE_1MB 0x13 -+#define SNOOP_SIZE_2MB 0x14 -+#define SNOOP_SIZE_4MB 0x15 -+#define SNOOP_SIZE_8MB 0x16 -+#define SNOOP_SIZE_16MB 0x17 -+#define SNOOP_SIZE_32MB 0x18 -+#define SNOOP_SIZE_64MB 0x19 -+#define SNOOP_SIZE_128MB 0x1A -+#define SNOOP_SIZE_256MB 0x1B -+#define SNOOP_SIZE_512MB 0x1C -+#define SNOOP_SIZE_1GB 0x1D -+#define SNOOP_SIZE_2GB 0x1E /* 2GB snoop size */ -+ -+/* pri_ctrl Register Bit Masks */ -+#define PRI_CTRL_PRI_LVL1 0x0000000C -+#define PRI_CTRL_PRI_LVL0 0x00000003 -+ -+/* si_ctrl Register Bit Masks */ -+#define SI_CTRL_ERR_DISABLE 0x00000010 -+#define SI_CTRL_IDRC_DISABLE 0x00000008 -+#define SI_CTRL_RD_SAFE_EN 0x00000004 -+#define SI_CTRL_RD_PREFETCH_DISABLE 0x00000002 -+#define SI_CTRL_RD_PREFEFETCH_VAL 0x00000001 -+ -+ -+/* control Register Bit Masks */ -+#define USB_CTRL_IOENB 0x00000004 -+#define USB_CTRL_ULPI_INT0EN 0x00000001 -+ -+ -+/* Endpoint Transfer Descriptor bit Masks */ -+#define DTD_NEXT_TERMINATE 0x00000001 -+#define DTD_IOC 0x00008000 -+#define DTD_STATUS_ACTIVE 0x00000080 -+#define DTD_STATUS_HALTED 0x00000040 -+#define DTD_STATUS_DATA_BUFF_ERR 0x00000020 -+#define DTD_STATUS_TRANSACTION_ERR 0x00000008 -+#define DTD_RESERVED_FIELDS 0x80007300 -+#define DTD_ADDR_MASK 0xFFFFFFE0 -+#define DTD_PACKET_SIZE 0x7FFF0000 -+#define DTD_LENGTH_BIT_POS 16 -+#define DTD_ERROR_MASK (DTD_STATUS_HALTED | \ -+ DTD_STATUS_DATA_BUFF_ERR | \ -+ DTD_STATUS_TRANSACTION_ERR) -+/* Alignment requirements; must be a power of two */ -+#define DTD_ALIGNMENT 0x20 -+#define QH_ALIGNMENT 2048 -+ -+/* Controller dma boundary */ -+#define UDC_DMA_BOUNDARY 0x1000 -+ -+#if defined CONFIG_PPC32 -+#define fsl_readl(addr) in_le32((addr)) -+#define fsl_writel(addr, val32) out_le32((addr), (val32)) -+#elif defined CONFIG_COLDFIRE -+#define fsl_readl(addr) in_be32((__force unsigned *)(addr)) -+#define fsl_writel(val32, addr) out_be32((__force unsigned *)(addr), (val32)) -+ -+#define fsl_readw(addr) in_be16((__force unsigned *)(addr)) -+#define fsl_writew(val16, addr) out_be16((__force unsigned *)(addr), (val16)) -+#else -+#error fsl_{readl, writel} must be defined -+#endif -+ -+#endif /* __FSL_USB2_H */ ---- /dev/null -+++ b/include/linux/usb/fsl_xcvr.h -@@ -0,0 +1,42 @@ -+/* -+ * Copyright 2007 Freescale Semiconductor, Inc. All Rights Reserved. -+ */ -+ -+/* -+ * The code contained herein is licensed under the GNU General Public -+ * License. You may obtain a copy of the GNU General Public License -+ * Version 2 or later at the following locations: -+ * -+ * http://www.opensource.org/licenses/gpl-license.html -+ * http://www.gnu.org/copyleft/gpl.html -+ */ -+ -+enum fsl_usb_ctrlr { -+ USB_CTRLR_H1 = 0, -+ USB_CTRLR_H2 = 1, -+ USB_CTRLR_OTG = 2, -+}; -+ -+ -+/** -+ * struct fsl_xcvr_ops - USB transceiver operations -+ * -+ * @xcvr_type: one of PORTSCX_PTS_{UTMI,SERIAL,ULPI} -+ * @init: transceiver- and board-specific initialization function -+ * @uninit: transceiver- and board-specific uninitialization function -+ * @set_host: -+ * @set_device: -+ * -+ */ -+struct fsl_xcvr_ops { -+ enum fsl_usb_ctrlr ctrlr; /* H1, H2, OTG */ -+ u32 xcvr_type; -+ -+ void (*init)(struct platform_device *pdev); -+ void (*uninit)(struct platform_device *pdev); -+ void (*set_host)(void); /* DDD combine set_host and _device ? */ -+ void (*set_device)(void); -+ void (*set_vbus_power)(struct fsl_usb2_platform_data *pdata, int on); -+}; -+ -+ ---- /dev/null -+++ b/net/can/dev.c -@@ -0,0 +1,292 @@ -+/* -+ * $Id$ -+ * -+ * Copyright (C) 2005 Marc Kleine-Budde, Pengutronix -+ * Copyright (C) 2006 Andrey Volkov, Varma Electronics -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the version 2 of the GNU General Public License -+ * as published by the Free Software Foundation -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -+ */ -+ -+#include <linux/module.h> -+#include <linux/netdevice.h> -+#include <linux/if_arp.h> -+#include <linux/can.h> -+#include <linux/can/dev.h> -+ -+MODULE_DESCRIPTION("CAN netdevice library"); -+MODULE_LICENSE("GPL v2"); -+MODULE_AUTHOR("Marc Kleine-Budde <mkl@pengutronix.de>, " -+ "Andrey Volkov <avolkov@varma-el.com>"); -+ -+/* -+ Abstract: -+ Baud rate calculated with next formula: -+ baud = frq/(brp*(1 + prop_seg+ phase_seg1 + phase_seg2)) -+ -+ This calc function based on work of Florian Hartwich and Armin Bassemi -+ "The Configuration of the CAN Bit Timing" -+ (http://www.semiconductors.bosch.de/pdf/CiA99Paper.pdf) -+ -+ Parameters: -+ [in] -+ bit_time_nsec - expected bit time in nanosecs -+ -+ [out] -+ bit_time - calculated time segments, for meaning of -+ each field read CAN standard. -+*/ -+ -+#define DEFAULT_MAX_BRP 64U -+#define DEFAULT_MAX_SJW 4U -+ -+/* All below values in tq units */ -+#define MAX_BIT_TIME 25U -+#define MIN_BIT_TIME 8U -+#define MAX_PROP_SEG 8U -+#define MAX_PHASE_SEG1 8U -+#define MAX_PHASE_SEG2 8U -+ -+int can_calc_bit_time(struct can_priv *can, u32 baudrate, -+ struct can_bittime_std *bit_time) -+{ -+ int best_error = -1; /* Ariphmetic error */ -+ int df, best_df = -1; /* oscillator's tolerance range */ -+ u32 quanta; /*in tq units*/ -+ u32 brp, phase_seg1, phase_seg2, sjw, prop_seg; -+ u32 brp_min, brp_max, brp_expected; -+ u64 tmp; -+ -+ /* baudrate range [1baud,1Mbaud] */ -+ if (baudrate == 0 || baudrate > 1000000UL) -+ return -EINVAL; -+ -+ tmp = (u64)can->can_sys_clock*1000; -+ do_div(tmp, baudrate); -+ brp_expected = (u32)tmp; -+ -+ brp_min = brp_expected / (1000 * MAX_BIT_TIME); -+ if (brp_min == 0) -+ brp_min = 1; -+ if (brp_min > can->max_brp) -+ return -ERANGE; -+ -+ brp_max = (brp_expected + 500 * MIN_BIT_TIME) / (1000 * MIN_BIT_TIME); -+ if (brp_max == 0) -+ brp_max = 1; -+ if (brp_max > can->max_brp) -+ brp_max = can->max_brp; -+ -+ for (brp = brp_min; brp <= brp_max; brp++) { -+ quanta = brp_expected / (brp * 1000); -+ if (quanta < MAX_BIT_TIME && quanta * brp * 1000 != -+ brp_expected) -+ quanta++; -+ if (quanta < MIN_BIT_TIME || quanta > MAX_BIT_TIME) -+ continue; -+ -+ phase_seg2 = min((quanta - 3) / 2, MAX_PHASE_SEG2); -+ for (sjw = can->max_sjw; sjw > 0; sjw--) { -+ for (; phase_seg2 > sjw; phase_seg2--) { -+ u32 err1, err2; -+ phase_seg1 = phase_seg2 % 2 ? -+ phase_seg2-1 : phase_seg2; -+ prop_seg = quanta-1 - phase_seg2 - phase_seg1; -+ /* -+ * FIXME: support of longer lines -+ * (i.e. bigger prop_seg) is more prefered -+ * than support of cheap oscillators -+ * (i.e. bigger df/phase_seg1/phase_seg2) -+ * */ -+ -+ if (prop_seg < phase_seg1) -+ continue; -+ if (prop_seg > MAX_PROP_SEG) -+ goto next_brp; -+ -+ err1 = phase_seg1 * brp * 500 * 1000 / -+ (13 * brp_expected - phase_seg2 * -+ brp * 1000); -+ err2 = sjw * brp * 50 * 1000 / brp_expected; -+ -+ df = min(err1, err2); -+ if (df >= best_df) { -+ unsigned error = abs(brp_expected * 10 / -+ (brp * (1 + prop_seg + -+ phase_seg1 + -+ phase_seg2)) - 10000); -+ -+ if (error > 10 || error > best_error) -+ continue; -+ -+ if (error == best_error && prop_seg < -+ bit_time->prop_seg) -+ continue; -+ -+ best_error = error; -+ best_df = df; -+ bit_time->brp = brp; -+ bit_time->prop_seg = prop_seg; -+ bit_time->phase_seg1 = phase_seg1; -+ bit_time->phase_seg2 = phase_seg2; -+ bit_time->sjw = sjw; -+ bit_time->sam = -+ (bit_time->phase_seg1 > 3); -+ } -+ } -+ } -+next_brp: ; -+ } -+ -+ if (best_error < 0) -+ return -EDOM; -+ return 0; -+} -+EXPORT_SYMBOL(can_calc_bit_time); -+ -+static int can_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) -+{ -+ struct can_priv *can = netdev_priv(dev); -+ struct can_bittime *bt = (struct can_bittime *)&ifr->ifr_ifru; -+ ulong *baudrate = (ulong *)&ifr->ifr_ifru; -+ int ret = -EOPNOTSUPP; -+ -+ dev_dbg(ND2D(dev), "(%s) 0x%08x %p\n", __func__, cmd, &ifr->ifr_ifru); -+ -+ switch (cmd) { -+ case SIOCSCANBAUDRATE: -+ if (can->do_set_bit_time) { -+ struct can_bittime bit_time; -+ ret = can_calc_bit_time(can, *baudrate, &bit_time.std); -+ if (ret != 0) -+ break; -+ bit_time.type = CAN_BITTIME_STD; -+ ret = can->do_set_bit_time(dev, &bit_time); -+ if (!ret) { -+ can->baudrate = *baudrate; -+ can->bit_time = bit_time; -+ } -+ } -+ break; -+ case SIOCGCANBAUDRATE: -+ *baudrate = can->baudrate; -+ ret = 0; -+ break; -+ case SIOCSCANCUSTOMBITTIME: -+ if (can->do_set_bit_time) { -+ ret = can->do_set_bit_time(dev, bt); -+ if (!ret) { -+ can->bit_time = *bt; -+ if (bt->type == CAN_BITTIME_STD && bt->std.brp) { -+ can->baudrate = can->can_sys_clock / -+ (bt->std.brp * (1 + bt->std.prop_seg + -+ bt->std.phase_seg1 + -+ bt->std.phase_seg2)); -+ } else -+ can->baudrate = CAN_BAUDRATE_UNKNOWN; -+ } -+ } -+ break; -+ case SIOCGCANCUSTOMBITTIME: -+ *bt = can->bit_time; -+ ret = 0; -+ break; -+ case SIOCSCANMODE: -+ if (can->do_set_mode) { -+ can_mode_t mode = -+ *((can_mode_t *)(&ifr->ifr_ifru)); -+ if (mode == CAN_MODE_START && -+ can->baudrate == CAN_BAUDRATE_UNCONFIGURED) { -+ dev_info(ND2D(dev), "Impossible to start \ -+ on UNKNOWN speed\n"); -+ ret = EINVAL; -+ } else -+ return can->do_set_mode(dev, mode); -+ } -+ break; -+ case SIOCGCANMODE: -+ *((can_mode_t *)(&ifr->ifr_ifru)) = can->mode; -+ ret = 0; -+ break; -+ case SIOCSCANCTRLMODE: -+ if (can->do_set_ctrlmode) { -+ can_ctrlmode_t ctrlmode = -+ *((can_ctrlmode_t *)(&ifr->ifr_ifru)); -+ return can->do_set_ctrlmode(dev, ctrlmode); -+ } -+ break; -+ case SIOCGCANCTRLMODE: -+ *((can_ctrlmode_t *)(&ifr->ifr_ifru)) = can->ctrlmode; -+ ret = 0; -+ break; -+ case SIOCSCANFILTER: -+ break; -+ case SIOCGCANFILTER: -+ break; -+ case SIOCGCANSTATE: -+ if (can->do_get_state) -+ return can->do_get_state(dev, -+ (can_state_t *)(&ifr->ifr_ifru)); -+ break; -+ case SIOCGCANSTATS: -+ *((struct can_device_stats *)(&ifr->ifr_ifru)) = can->can_stats; -+ ret = 0; -+ break; -+ } -+ -+ return ret; -+} -+ -+static void can_setup(struct net_device *dev) -+{ -+ dev->type = ARPHRD_CAN; -+ dev->mtu = sizeof(struct can_frame); -+ dev->do_ioctl = can_ioctl; -+ dev->hard_header_len = 0; -+ dev->addr_len = 0; -+ dev->tx_queue_len = 10; -+ -+ /* New-style flags. */ -+ dev->flags = IFF_NOARP; -+ dev->features = NETIF_F_NO_CSUM; -+} -+ -+/* -+ * Function alloc_candev -+ * Allocates and sets up an CAN device -+ */ -+struct net_device *alloc_candev(int sizeof_priv) -+{ -+ struct net_device *dev; -+ struct can_priv *priv; -+ -+ dev = alloc_netdev(sizeof_priv, "can%d", can_setup); -+ if (!dev) -+ return NULL; -+ -+ priv = netdev_priv(dev); -+ -+ priv->baudrate = CAN_BAUDRATE_UNCONFIGURED; -+ priv->max_brp = DEFAULT_MAX_BRP; -+ priv->max_sjw = DEFAULT_MAX_SJW; -+ spin_lock_init(&priv->irq_lock); -+ -+ return dev; -+} -+EXPORT_SYMBOL(alloc_candev); -+ -+void free_candev(struct net_device *dev) -+{ -+ free_netdev(dev); -+} -+EXPORT_SYMBOL(free_candev); ---- a/net/can/Makefile -+++ b/net/can/Makefile -@@ -10,3 +10,6 @@ can-raw-objs := raw.o - - obj-$(CONFIG_CAN_BCM) += can-bcm.o - can-bcm-objs := bcm.o -+ -+obj-$(CONFIG_CAN) += candev.o -+candev-objs := dev.o ---- a/net/irda/irlap.c -+++ b/net/irda/irlap.c -@@ -627,7 +627,7 @@ void irlap_status_indication(struct irla - { - switch (quality_of_link) { - case STATUS_NO_ACTIVITY: -- IRDA_MESSAGE("IrLAP, no activity on link!\n"); -+ /* IRDA_MESSAGE("IrLAP, no activity on link!\n"); */ - break; - case STATUS_NOISY: - IRDA_MESSAGE("IrLAP, noisy link!\n"); ---- /dev/null -+++ b/scripts/checkfiles -@@ -0,0 +1,35 @@ -+#!/bin/sh -+# (c) 2007, Erez Zadok <ezk@cs.sunysb.edu> (initial version) -+# Licensed under the terms of the GNU GPL License version 2 -+# -+# Check source files for compliance with coding standards, using terse -+# output in the style that g/cc produces. This output can be easily parsed -+# within text editors (e.g., emacs/vim) which can produce a split text -+# screen showing in one screen the error message, and in another screen the -+# corresponding source file, with the cursor placed on the offending line. -+# See for example the documentation for Emacs's "next-error" command, often -+# bound to M-x ` (ESC x back-tick). -+ -+# Usage: checkfiles file [files...] -+# if "file" is a directory, will check all *.[hc] files recursively -+ -+# check usage -+usage() { -+ echo "Usage: checkfiles file [files...]" -+ echo "(if \"file\" is a directory, check recursively for all C sources/headers)" -+ exit 1 -+} -+ -+# if test -z "$@" ; then -+# usage -+# fi -+if ! test -f scripts/checkpatch.pl ; then -+ echo "checkfiles: must run from top level source tree" -+ exit 1 -+fi -+ -+# check coding-style compliance of each source file found -+find "$@" -type f -name '*.[hc]' | \ -+while read f ; do -+ diff -u /dev/null $f | perl scripts/checkpatch.pl - -+done ---- /dev/null -+++ b/scripts/checkfilesterse -@@ -0,0 +1,34 @@ -+#!/bin/sh -+# (c) 2007, Erez Zadok <ezk@cs.sunysb.edu> (initial version) -+# Licensed under the terms of the GNU GPL License version 2 -+# -+# Check source files for compliance with coding standards, using terse -+# output in the style that g/cc produces. This output can be easily parsed -+# within text editors (e.g., emacs/vim) which can produce a split text -+# screen showing in one screen the error message, and in another screen the -+# corresponding source file, with the cursor placed on the offending line. -+# See for example the documentation for Emacs's "next-error" command, often -+# bound to M-x ` (ESC x back-tick). -+ -+# Usage: checkfiles file [files...] -+# if "file" is a directory, will check all *.[hc] files recursively -+ -+# check usage -+usage() { -+ echo "Usage: checkfiles file [files...]" -+ echo "(if \"file\" is a directory, check recursively for all C sources/headers)" -+ exit 1 -+} -+if test -z "" ; then -+ usage -+fi -+if ! test -f scripts/checkpatch.pl ; then -+ echo "checkfiles: must run from top level source tree" -+ exit 1 -+fi -+ -+# check coding-style compliance of each source file found, using terse output -+find "$@" -type f -name '*.[hc]' | \ -+while read f ; do -+ diff -u /dev/null $f | perl scripts/checkpatch.pl -t - -+done diff --git a/target/linux/coldfire/patches/001-mcfv4e_checkfiles_script.patch b/target/linux/coldfire/patches/001-mcfv4e_checkfiles_script.patch new file mode 100644 index 0000000000..16b85368a4 --- /dev/null +++ b/target/linux/coldfire/patches/001-mcfv4e_checkfiles_script.patch @@ -0,0 +1,94 @@ +From d54d785a28afb65811c5d5ad727c57233deb6f60 Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Wed, 31 Oct 2007 16:36:51 -0600 +Subject: [PATCH] Scripts to allow running files through checkpatch.pl + +Scripts based on scripts/checkfiles that are in various trees. + +These should not be sent up because there are already patches from +the original script author. + +LTIBName: mcfv4e-checkfiles-script +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + scripts/checkfiles | 35 +++++++++++++++++++++++++++++++++++ + scripts/checkfilesterse | 34 ++++++++++++++++++++++++++++++++++ + 2 files changed, 69 insertions(+), 0 deletions(-) + create mode 100755 scripts/checkfiles + create mode 100755 scripts/checkfilesterse + +--- /dev/null ++++ b/scripts/checkfiles +@@ -0,0 +1,35 @@ ++#!/bin/sh ++# (c) 2007, Erez Zadok <ezk@cs.sunysb.edu> (initial version) ++# Licensed under the terms of the GNU GPL License version 2 ++# ++# Check source files for compliance with coding standards, using terse ++# output in the style that g/cc produces. This output can be easily parsed ++# within text editors (e.g., emacs/vim) which can produce a split text ++# screen showing in one screen the error message, and in another screen the ++# corresponding source file, with the cursor placed on the offending line. ++# See for example the documentation for Emacs's "next-error" command, often ++# bound to M-x ` (ESC x back-tick). ++ ++# Usage: checkfiles file [files...] ++# if "file" is a directory, will check all *.[hc] files recursively ++ ++# check usage ++usage() { ++ echo "Usage: checkfiles file [files...]" ++ echo "(if \"file\" is a directory, check recursively for all C sources/headers)" ++ exit 1 ++} ++ ++# if test -z "$@" ; then ++# usage ++# fi ++if ! test -f scripts/checkpatch.pl ; then ++ echo "checkfiles: must run from top level source tree" ++ exit 1 ++fi ++ ++# check coding-style compliance of each source file found ++find "$@" -type f -name '*.[hc]' | \ ++while read f ; do ++ diff -u /dev/null $f | perl scripts/checkpatch.pl - ++done +--- /dev/null ++++ b/scripts/checkfilesterse +@@ -0,0 +1,34 @@ ++#!/bin/sh ++# (c) 2007, Erez Zadok <ezk@cs.sunysb.edu> (initial version) ++# Licensed under the terms of the GNU GPL License version 2 ++# ++# Check source files for compliance with coding standards, using terse ++# output in the style that g/cc produces. This output can be easily parsed ++# within text editors (e.g., emacs/vim) which can produce a split text ++# screen showing in one screen the error message, and in another screen the ++# corresponding source file, with the cursor placed on the offending line. ++# See for example the documentation for Emacs's "next-error" command, often ++# bound to M-x ` (ESC x back-tick). ++ ++# Usage: checkfiles file [files...] ++# if "file" is a directory, will check all *.[hc] files recursively ++ ++# check usage ++usage() { ++ echo "Usage: checkfiles file [files...]" ++ echo "(if \"file\" is a directory, check recursively for all C sources/headers)" ++ exit 1 ++} ++if test -z "" ; then ++ usage ++fi ++if ! test -f scripts/checkpatch.pl ; then ++ echo "checkfiles: must run from top level source tree" ++ exit 1 ++fi ++ ++# check coding-style compliance of each source file found, using terse output ++find "$@" -type f -name '*.[hc]' | \ ++while read f ; do ++ diff -u /dev/null $f | perl scripts/checkpatch.pl -t - ++done diff --git a/target/linux/coldfire/patches/002-mcfv4e_coldfire_headers.patch b/target/linux/coldfire/patches/002-mcfv4e_coldfire_headers.patch new file mode 100644 index 0000000000..a31b288175 --- /dev/null +++ b/target/linux/coldfire/patches/002-mcfv4e_coldfire_headers.patch @@ -0,0 +1,1646 @@ +From 127797e5cf8a036825007586b914b75897aba554 Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Wed, 31 Oct 2007 16:39:31 -0600 +Subject: [PATCH] Add Coldfire Support into existing headers. + +Modifications to the various M68k header files to add +Coldfire processor support. + +LTIBName: mcfv4e-coldfire-headers +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + include/asm-m68k/atomic.h | 23 ++- + include/asm-m68k/bitops.h | 426 ++++++++++++++++++++++++++++++++++++++++ + include/asm-m68k/bootinfo.h | 13 ++ + include/asm-m68k/byteorder.h | 12 +- + include/asm-m68k/cacheflush.h | 4 + + include/asm-m68k/checksum.h | 10 + + include/asm-m68k/delay.h | 26 +++ + include/asm-m68k/div64.h | 4 + + include/asm-m68k/elf.h | 2 +- + include/asm-m68k/fpu.h | 2 + + include/asm-m68k/io.h | 26 +++- + include/asm-m68k/irq.h | 5 +- + include/asm-m68k/machdep.h | 7 + + include/asm-m68k/mmu_context.h | 84 ++++++++- + include/asm-m68k/page.h | 20 ++- + include/asm-m68k/page_offset.h | 7 +- + include/asm-m68k/pci.h | 99 ++++++---- + include/asm-m68k/pgalloc.h | 4 +- + include/asm-m68k/pgtable.h | 15 ++ + include/asm-m68k/processor.h | 46 ++++- + include/asm-m68k/ptrace.h | 11 + + include/asm-m68k/raw_io.h | 58 ++++++ + include/asm-m68k/segment.h | 10 + + include/asm-m68k/setup.h | 27 +++ + include/asm-m68k/signal.h | 5 + + include/asm-m68k/string.h | 2 + + include/asm-m68k/system.h | 17 ++- + include/asm-m68k/thread_info.h | 1 + + include/asm-m68k/tlbflush.h | 16 ++- + include/asm-m68k/uaccess.h | 4 + + 30 files changed, 925 insertions(+), 61 deletions(-) + +--- a/include/asm-m68k/atomic.h ++++ b/include/asm-m68k/atomic.h +@@ -2,7 +2,7 @@ + #define __ARCH_M68K_ATOMIC__ + + +-#include <asm/system.h> ++#include <asm/system.h> /* local_irq_XXX() */ + + /* + * Atomic operations that C can't guarantee us. Useful for +@@ -21,12 +21,20 @@ typedef struct { int counter; } atomic_t + + static inline void atomic_add(int i, atomic_t *v) + { ++#ifndef CONFIG_COLDFIRE + __asm__ __volatile__("addl %1,%0" : "+m" (*v) : "id" (i)); ++#else ++ __asm__ __volatile__("addl %1,%0" : "=m" (*v) : "d" (i), "m" (*v)); ++#endif + } + + static inline void atomic_sub(int i, atomic_t *v) + { ++#ifndef CONFIG_COLDFIRE + __asm__ __volatile__("subl %1,%0" : "+m" (*v) : "id" (i)); ++#else ++ __asm__ __volatile__("subl %1,%0" : "=m" (*v) : "d" (i), "m" (*v)); ++#endif + } + + static inline void atomic_inc(atomic_t *v) +@@ -46,6 +54,14 @@ static inline int atomic_dec_and_test(at + return c != 0; + } + ++static __inline__ int atomic_dec_and_test_lt(volatile atomic_t *v) ++{ ++ char c; ++ __asm__ __volatile__("subql #1,%1; slt %0" : "=d" (c), "=m" (*v) ++ : "m" (*v)); ++ return c != 0 ; ++} ++ + static inline int atomic_inc_and_test(atomic_t *v) + { + char c; +@@ -156,7 +172,12 @@ static inline int atomic_sub_and_test(in + static inline int atomic_add_negative(int i, atomic_t *v) + { + char c; ++#ifndef CONFIG_COLDFIRE + __asm__ __volatile__("addl %2,%1; smi %0" : "=d" (c), "+m" (*v): "g" (i)); ++#else ++ __asm__ __volatile__("addl %2,%1; smi %0" : "=d" (c), "=m" (*v) ++ : "d" (i) , "m" (*v)); ++#endif + return c != 0; + } + +--- a/include/asm-m68k/bitops.h ++++ b/include/asm-m68k/bitops.h +@@ -19,6 +19,7 @@ + * + * They use the standard big-endian m680x0 bit ordering. + */ ++#ifndef CONFIG_COLDFIRE + + #define test_and_set_bit(nr,vaddr) \ + (__builtin_constant_p(nr) ? \ +@@ -457,4 +458,429 @@ static inline int ext2_find_next_bit(con + + #endif /* __KERNEL__ */ + ++#else /* CONFIG_COLDFIRE */ ++ ++#define test_and_set_bit(nr,vaddr) \ ++ (__builtin_constant_p(nr) ? \ ++ __constant_coldfire_test_and_set_bit(nr, vaddr) : \ ++ __generic_coldfire_test_and_set_bit(nr, vaddr)) ++ ++ ++static __inline__ int __constant_coldfire_test_and_set_bit(int nr, ++ volatile void *vaddr) ++{ ++ char retval; ++ volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3]; ++ ++ __asm__ __volatile__ ("bset %2,%1; sne %0" ++ : "=d" (retval), "+QUd" (*p) ++ : "di" (nr & 7)); ++ return retval; ++} ++ ++static __inline__ int __generic_coldfire_test_and_set_bit(int nr, ++ volatile void *vaddr) ++{ ++ char retval; ++ ++ __asm__ __volatile__ ("bset %2,%1; sne %0" ++ : "=d" (retval), "=m" (((volatile char *)vaddr)[(nr^31) >> 3]) ++ : "d" (nr) ++ : "memory"); ++ return retval; ++} ++#define __test_and_set_bit(nr, vaddr) test_and_set_bit(nr, vaddr) ++ ++#define set_bit(nr,vaddr) \ ++ (__builtin_constant_p(nr) ? \ ++ __constant_coldfire_set_bit(nr, vaddr) : \ ++ __generic_coldfire_set_bit(nr, vaddr)) ++ ++static __inline__ void __constant_coldfire_set_bit(int nr, ++ volatile void *vaddr) ++{ ++ volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3]; ++ __asm__ __volatile__ ("bset %1,%0" ++ : "+QUd" (*p) : "di" (nr & 7)); ++} ++ ++static __inline__ void __generic_coldfire_set_bit(int nr, volatile void *vaddr) ++{ ++ __asm__ __volatile__ ("bset %1,%0" ++ : "=m" (((volatile char *)vaddr)[(nr^31) >> 3]) ++ : "d" (nr) ++ : "memory"); ++} ++#define __set_bit(nr, vaddr) set_bit(nr, vaddr) ++ ++#define test_and_clear_bit(nr, vaddr) \ ++ (__builtin_constant_p(nr) ? \ ++ __constant_coldfire_test_and_clear_bit(nr, vaddr) : \ ++ __generic_coldfire_test_and_clear_bit(nr, vaddr)) ++ ++static __inline__ int __constant_coldfire_test_and_clear_bit(int nr, ++ volatile void *vaddr) ++{ ++ char retval; ++ volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3]; ++ ++ __asm__ __volatile__ ("bclr %2,%1; sne %0" ++ : "=d" (retval), "+QUd" (*p) ++ : "id" (nr & 7)); ++ ++ return retval; ++} ++ ++static __inline__ int __generic_coldfire_test_and_clear_bit(int nr, ++ volatile void *vaddr) ++{ ++ char retval; ++ ++ __asm__ __volatile__ ("bclr %2,%1; sne %0" ++ : "=d" (retval), "=m" (((volatile char *)vaddr)[(nr^31) >> 3]) ++ : "d" (nr & 7) ++ : "memory"); ++ ++ return retval; ++} ++#define __test_and_clear_bit(nr, vaddr) test_and_clear_bit(nr, vaddr) ++ ++/* ++ * clear_bit() doesn't provide any barrier for the compiler. ++ */ ++#define smp_mb__before_clear_bit() barrier() ++#define smp_mb__after_clear_bit() barrier() ++ ++#define clear_bit(nr,vaddr) \ ++ (__builtin_constant_p(nr) ? \ ++ __constant_coldfire_clear_bit(nr, vaddr) : \ ++ __generic_coldfire_clear_bit(nr, vaddr)) ++ ++static __inline__ void __constant_coldfire_clear_bit(int nr, ++ volatile void *vaddr) ++{ ++ volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3]; ++ __asm__ __volatile__ ("bclr %1,%0" ++ : "+QUd" (*p) : "id" (nr & 7)); ++} ++ ++static __inline__ void __generic_coldfire_clear_bit(int nr, ++ volatile void *vaddr) ++{ ++ __asm__ __volatile__ ("bclr %1,%0" ++ : "=m" (((volatile char *)vaddr)[(nr^31) >> 3]) ++ : "d" (nr) ++ : "memory"); ++} ++#define __clear_bit(nr, vaddr) clear_bit(nr, vaddr) ++ ++#define test_and_change_bit(nr, vaddr) \ ++ (__builtin_constant_p(nr) ? \ ++ __constant_coldfire_test_and_change_bit(nr, vaddr) : \ ++ __generic_coldfire_test_and_change_bit(nr, vaddr)) ++ ++static __inline__ int __constant_coldfire_test_and_change_bit(int nr, ++ volatile void *vaddr) ++{ ++ char retval; ++ volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3]; ++ ++ __asm__ __volatile__ ("bchg %2,%1; sne %0" ++ : "=d" (retval), "+QUd" (*p) ++ : "id" (nr & 7)); ++ ++ return retval; ++} ++ ++static __inline__ int __generic_coldfire_test_and_change_bit(int nr, ++ volatile void *vaddr) ++{ ++ char retval; ++ ++ __asm__ __volatile__ ("bchg %2,%1; sne %0" ++ : "=d" (retval), "=m" (((volatile char *)vaddr)[(nr^31) >> 3]) ++ : "id" (nr) ++ : "memory"); ++ ++ return retval; ++} ++#define __test_and_change_bit(nr, vaddr) test_and_change_bit(nr, vaddr) ++#define __change_bit(nr, vaddr) change_bit(nr, vaddr) ++ ++#define change_bit(nr,vaddr) \ ++ (__builtin_constant_p(nr) ? \ ++ __constant_coldfire_change_bit(nr, vaddr) : \ ++ __generic_coldfire_change_bit(nr, vaddr)) ++ ++static __inline__ void __constant_coldfire_change_bit(int nr, ++ volatile void *vaddr) ++{ ++ volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3]; ++ __asm__ __volatile__ ("bchg %1,%0" ++ : "+QUd" (*p) : "id" (nr & 7)); ++} ++ ++static __inline__ void __generic_coldfire_change_bit(int nr, ++ volatile void *vaddr) ++{ ++ __asm__ __volatile__ ("bchg %1,%0" ++ : "=m" (((volatile char *)vaddr)[(nr^31) >> 3]) ++ : "d" (nr) ++ : "memory"); ++} ++ ++static inline int test_bit(int nr, const unsigned long *vaddr) ++{ ++ return (vaddr[nr >> 5] & (1UL << (nr & 31))) != 0; ++} ++ ++static __inline__ unsigned long ffz(unsigned long word) ++{ ++ unsigned long result = 0; ++ ++ while (word & 1) { ++ result++; ++ word >>= 1; ++ } ++ return result; ++} ++ ++/* find_next_zero_bit() finds the first zero bit in a bit string of length ++ * 'size' bits, starting the search at bit 'offset'. This is largely based ++ * on Linus's ALPHA routines. ++ */ ++static __inline__ unsigned long find_next_zero_bit(void *addr, ++ unsigned long size, unsigned long offset) ++{ ++ unsigned long *p = ((unsigned long *) addr) + (offset >> 5); ++ unsigned long result = offset & ~31UL; ++ unsigned long tmp; ++ ++ if (offset >= size) ++ return size; ++ size -= result; ++ offset &= 31UL; ++ if (offset) { ++ tmp = *(p++); ++ tmp |= ~0UL >> (32-offset); ++ if (size < 32) ++ goto found_first; ++ if (~tmp) ++ goto found_middle; ++ size -= 32; ++ result += 32; ++ } ++ while (size & ~31UL) { ++ tmp = *(p++); ++ if (~tmp) ++ goto found_middle; ++ result += 32; ++ size -= 32; ++ } ++ if (!size) ++ return result; ++ tmp = *p; ++ ++found_first: ++ tmp |= ~0UL >> size; ++found_middle: ++ return result + ffz(tmp); ++} ++ ++#define find_first_zero_bit(addr, size) find_next_zero_bit(((void *)addr), \ ++ (size), 0) ++ ++/* Ported from included/linux/bitops.h */ ++static __inline__ int ffs(int x) ++{ ++ int r = 1; ++ ++ if (!x) ++ return 0; ++ if (!(x & 0xffff)) { ++ x >>= 16; ++ r += 16; ++ } ++ if (!(x & 0xff)) { ++ x >>= 8; ++ r += 8; ++ } ++ if (!(x & 0xf)) { ++ x >>= 4; ++ r += 4; ++ } ++ if (!(x & 3)) { ++ x >>= 2; ++ r += 2; ++ } ++ if (!(x & 1)) { ++ x >>= 1; ++ r += 1; ++ } ++ return r; ++} ++#define __ffs(x) (ffs(x) - 1) ++ ++/* find_next_bit - find the next set bit in a memory region ++ * (from asm-ppc/bitops.h) ++ */ ++static __inline__ unsigned long find_next_bit(const unsigned long *addr, ++ unsigned long size, unsigned long offset) ++{ ++ unsigned int *p = ((unsigned int *) addr) + (offset >> 5); ++ unsigned int result = offset & ~31UL; ++ unsigned int tmp; ++ ++ if (offset >= size) ++ return size; ++ size -= result; ++ offset &= 31UL; ++ if (offset) { ++ tmp = *p++; ++ tmp &= ~0UL << offset; ++ if (size < 32) ++ goto found_first; ++ if (tmp) ++ goto found_middle; ++ size -= 32; ++ result += 32; ++ } ++ while (size >= 32) { ++ tmp = *p++; ++ if (tmp != 0) ++ goto found_middle; ++ result += 32; ++ size -= 32; ++ } ++ if (!size) ++ return result; ++ tmp = *p; ++ ++found_first: ++ tmp &= ~0UL >> (32 - size); ++ if (tmp == 0UL) /* Are any bits set? */ ++ return result + size; /* Nope. */ ++found_middle: ++ return result + __ffs(tmp); ++} ++ ++#define find_first_bit(addr, size) find_next_bit((addr), (size), 0) ++ ++#ifdef __KERNEL__ ++ ++/* Ported from include/linux/bitops.h */ ++static __inline__ int fls(int x) ++{ ++ int r = 32; ++ ++ if (!x) ++ return 0; ++ if (!(x & 0xffff0000u)) { ++ x <<= 16; ++ r -= 16; ++ } ++ if (!(x & 0xff000000u)) { ++ x <<= 8; ++ r -= 8; ++ } ++ if (!(x & 0xf0000000u)) { ++ x <<= 4; ++ r -= 4; ++ } ++ if (!(x & 0xc0000000u)) { ++ x <<= 2; ++ r -= 2; ++ } ++ if (!(x & 0x80000000u)) { ++ x <<= 1; ++ r -= 1; ++ } ++ return r; ++} ++ ++#include <asm-generic/bitops/fls64.h> ++#include <asm-generic/bitops/sched.h> ++#include <asm-generic/bitops/hweight.h> ++ ++#define minix_find_first_zero_bit(addr, size) find_next_zero_bit((addr), \ ++ (size), 0) ++#define minix_test_and_set_bit(nr, addr) test_and_set_bit((nr), \ ++ (unsigned long *)(addr)) ++#define minix_set_bit(nr, addr) set_bit((nr), \ ++ (unsigned long *)(addr)) ++#define minix_test_and_clear_bit(nr, addr) test_and_clear_bit((nr), \ ++ (unsigned long *)(addr)) ++ ++static inline int minix_test_bit(int nr, const volatile unsigned long *vaddr) ++{ ++ int *a = (int *)vaddr; ++ int mask; ++ ++ a += nr >> 5; ++ mask = 1 << (nr & 0x1f); ++ return ((mask & *a) != 0); ++} ++ ++#define ext2_set_bit(nr, addr) test_and_set_bit((nr) ^ 24, \ ++ (unsigned long *)(addr)) ++#define ext2_set_bit_atomic(lock, nr, addr) test_and_set_bit((nr) ^ 24, \ ++ (unsigned long *)(addr)) ++#define ext2_clear_bit(nr, addr) test_and_clear_bit((nr) ^ 24, \ ++ (unsigned long *)(addr)) ++#define ext2_clear_bit_atomic(lock, nr, addr) test_and_clear_bit((nr) ^ 24, \ ++ (unsigned long *)(addr)) ++ ++static inline int ext2_test_bit(int nr, const void *vaddr) ++{ ++ const unsigned char *p = vaddr; ++ return (p[nr >> 3] & (1U << (nr & 7))) != 0; ++} ++ ++static inline int ext2_find_first_zero_bit(const void *vaddr, unsigned size) ++{ ++ const unsigned long *p = vaddr, *addr = vaddr; ++ int res; ++ ++ if (!size) ++ return 0; ++ ++ size = (size >> 5) + ((size & 31) > 0); ++ while (*p++ == ~0UL) { ++ if (--size == 0) ++ return (p - addr) << 5; ++ } ++ ++ --p; ++ for (res = 0; res < 32; res++) ++ if (!ext2_test_bit (res, p)) ++ break; ++ return (p - addr) * 32 + res; ++} ++ ++static inline int ext2_find_next_zero_bit(const void *vaddr, unsigned size, ++ unsigned offset) ++{ ++ const unsigned long *addr = vaddr; ++ const unsigned long *p = addr + (offset >> 5); ++ int bit = offset & 31UL, res; ++ ++ if (offset >= size) ++ return size; ++ ++ if (bit) { ++ /* Look for zero in first longword */ ++ for (res = bit; res < 32; res++) ++ if (!ext2_test_bit (res, p)) ++ return (p - addr) * 32 + res; ++ p++; ++ } ++ /* No zero yet, search remaining full bytes for a zero */ ++ res = ext2_find_first_zero_bit(p, size - 32 * (p - addr)); ++ return (p - addr) * 32 + res; ++} ++ ++#endif /* KERNEL */ ++ ++#endif /* CONFIG_COLDFIRE */ ++ + #endif /* _M68K_BITOPS_H */ +--- a/include/asm-m68k/bootinfo.h ++++ b/include/asm-m68k/bootinfo.h +@@ -49,6 +49,19 @@ struct bi_record { + #endif /* __ASSEMBLY__ */ + + ++#ifndef __ASSEMBLY__ ++ ++struct uboot_record { ++ unsigned long bd_info; ++ unsigned long initrd_start; ++ unsigned long initrd_end; ++ unsigned long cmd_line_start; ++ unsigned long cmd_line_stop; ++}; ++ ++#endif /* __ASSEMBLY__ */ ++ ++ + /* + * Tag Definitions + * +--- a/include/asm-m68k/byteorder.h ++++ b/include/asm-m68k/byteorder.h +@@ -4,8 +4,15 @@ + #include <asm/types.h> + #include <linux/compiler.h> + +-#ifdef __GNUC__ +- ++#if defined(__GNUC__) ++#if defined(__mcfisaaplus__) || defined(__mcfisac__) ++static __inline__ __attribute_const__ __u32 ___arch__swab32(__u32 val) ++{ ++ __asm__ ("byterev %0" : "=d" (val) : "0" (val)); ++ return val; ++} ++#define __arch__swab32(x) ___arch__swab32(x) ++#elif !defined(__mcoldfire__) + static __inline__ __attribute_const__ __u32 ___arch__swab32(__u32 val) + { + __asm__("rolw #8,%0; swap %0; rolw #8,%0" : "=d" (val) : "0" (val)); +@@ -14,6 +21,7 @@ static __inline__ __attribute_const__ __ + #define __arch__swab32(x) ___arch__swab32(x) + + #endif ++#endif + + #if defined(__GNUC__) && !defined(__STRICT_ANSI__) || defined(__KERNEL__) + # define __BYTEORDER_HAS_U64__ +--- a/include/asm-m68k/cacheflush.h ++++ b/include/asm-m68k/cacheflush.h +@@ -6,6 +6,9 @@ + /* cache code */ + #define FLUSH_I_AND_D (0x00000808) + #define FLUSH_I (0x00000008) ++#ifdef CONFIG_COLDFIRE ++#include <asm/cf_cacheflush.h> ++#else /* !CONFIG_COLDFIRE */ + + /* + * Cache handling functions +@@ -153,4 +156,5 @@ static inline void copy_from_user_page(s + memcpy(dst, src, len); + } + ++#endif /* !CONFIG_COLDFIRE */ + #endif /* _M68K_CACHEFLUSH_H */ +--- a/include/asm-m68k/checksum.h ++++ b/include/asm-m68k/checksum.h +@@ -34,6 +34,7 @@ extern __wsum csum_partial_copy_nocheck( + void *dst, int len, + __wsum sum); + ++#ifndef CONFIG_COLDFIRE /* CF has own copy in arch/m68k/lib/checksum.c */ + /* + * This is a version of ip_compute_csum() optimized for IP headers, + * which always checksum on 4 octet boundaries. +@@ -59,6 +60,9 @@ static inline __sum16 ip_fast_csum(const + : "memory"); + return (__force __sum16)~sum; + } ++#else ++extern __sum16 ip_fast_csum(const void *iph, unsigned int ihl); ++#endif + + /* + * Fold a partial checksum +@@ -67,6 +71,11 @@ static inline __sum16 ip_fast_csum(const + static inline __sum16 csum_fold(__wsum sum) + { + unsigned int tmp = (__force u32)sum; ++#ifdef CONFIG_COLDFIRE ++ tmp = (tmp & 0xffff) + (tmp >> 16); ++ tmp = (tmp & 0xffff) + (tmp >> 16); ++ return (__force __sum16) ~tmp; ++#else + __asm__("swap %1\n\t" + "addw %1, %0\n\t" + "clrw %1\n\t" +@@ -74,6 +83,7 @@ static inline __sum16 csum_fold(__wsum s + : "=&d" (sum), "=&d" (tmp) + : "0" (sum), "1" (tmp)); + return (__force __sum16)~sum; ++#endif + } + + +--- a/include/asm-m68k/delay.h ++++ b/include/asm-m68k/delay.h +@@ -11,8 +11,25 @@ + + static inline void __delay(unsigned long loops) + { ++#if defined(CONFIG_COLDFIRE) ++ /* The coldfire runs this loop at significantly different speeds ++ * depending upon long word alignment or not. We'll pad it to ++ * long word alignment which is the faster version. ++ * The 0x4a8e is of course a 'tstl %fp' instruction. This is better ++ * than using a NOP (0x4e71) instruction because it executes in one ++ * cycle not three and doesn't allow for an arbitary delay waiting ++ * for bus cycles to finish. Also fp/a6 isn't likely to cause a ++ * stall waiting for the register to become valid if such is added ++ * to the coldfire at some stage. ++ */ ++ __asm__ __volatile__ (".balignw 4, 0x4a8e\n\t" ++ "1: subql #1, %0\n\t" ++ "jcc 1b" ++ : "=d" (loops) : "0" (loops)); ++#else + __asm__ __volatile__ ("1: subql #1,%0; jcc 1b" + : "=d" (loops) : "0" (loops)); ++#endif + } + + extern void __bad_udelay(void); +@@ -26,12 +43,17 @@ extern void __bad_udelay(void); + */ + static inline void __const_udelay(unsigned long xloops) + { ++#if defined(CONFIG_COLDFIRE) ++ ++ __delay(((((unsigned long long) xloops * loops_per_jiffy))>>32)*HZ); ++#else + unsigned long tmp; + + __asm__ ("mulul %2,%0:%1" + : "=d" (xloops), "=d" (tmp) + : "d" (xloops), "1" (loops_per_jiffy)); + __delay(xloops * HZ); ++#endif + } + + static inline void __udelay(unsigned long usecs) +@@ -46,12 +68,16 @@ static inline void __udelay(unsigned lon + static inline unsigned long muldiv(unsigned long a, unsigned long b, + unsigned long c) + { ++#if defined(CONFIG_COLDFIRE) ++ return (long)(((unsigned long long)a * b)/c); ++#else + unsigned long tmp; + + __asm__ ("mulul %2,%0:%1; divul %3,%0:%1" + : "=d" (tmp), "=d" (a) + : "d" (b), "d" (c), "1" (a)); + return a; ++#endif + } + + #endif /* defined(_M68K_DELAY_H) */ +--- a/include/asm-m68k/div64.h ++++ b/include/asm-m68k/div64.h +@@ -5,6 +5,7 @@ + + /* n = n / base; return rem; */ + ++#ifndef CONFIG_COLDFIRE + #define do_div(n, base) ({ \ + union { \ + unsigned long n32[2]; \ +@@ -24,6 +25,9 @@ + (n) = __n.n64; \ + __rem; \ + }) ++#else ++# include <asm-generic/div64.h> ++#endif + + extern uint64_t div64_64(uint64_t dividend, uint64_t divisor); + #endif /* _M68K_DIV64_H */ +--- a/include/asm-m68k/elf.h ++++ b/include/asm-m68k/elf.h +@@ -60,7 +60,7 @@ typedef struct user_m68kfp_struct elf_fp + #define ELF_PLAT_INIT(_r, load_addr) _r->a1 = 0 + + #define USE_ELF_CORE_DUMP +-#ifndef CONFIG_SUN3 ++#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE) + #define ELF_EXEC_PAGESIZE 4096 + #else + #define ELF_EXEC_PAGESIZE 8192 +--- a/include/asm-m68k/fpu.h ++++ b/include/asm-m68k/fpu.h +@@ -12,6 +12,8 @@ + #define FPSTATESIZE (96/sizeof(unsigned char)) + #elif defined(CONFIG_M68KFPU_EMU) + #define FPSTATESIZE (28/sizeof(unsigned char)) ++#elif defined(CONFIG_CFV4E) ++#define FPSTATESIZE (16/sizeof(unsigned char)) + #elif defined(CONFIG_M68060) + #define FPSTATESIZE (12/sizeof(unsigned char)) + #else +--- a/include/asm-m68k/io.h ++++ b/include/asm-m68k/io.h +@@ -397,10 +397,12 @@ static inline void memcpy_toio(volatile + __builtin_memcpy((void __force *) dst, src, count); + } + +-#ifndef CONFIG_SUN3 +-#define IO_SPACE_LIMIT 0xffff +-#else ++#if defined(CONFIG_SUN3) + #define IO_SPACE_LIMIT 0x0fffffff ++#elif defined(CONFIG_COLDFIRE) ++#define IO_SPACE_LIMIT 0xffffffff ++#else ++#define IO_SPACE_LIMIT 0xffff + #endif + + #endif /* __KERNEL__ */ +@@ -418,4 +420,22 @@ static inline void memcpy_toio(volatile + */ + #define xlate_dev_kmem_ptr(p) p + ++#ifdef CONFIG_COLDFIRE ++ ++#define memset_io(a, b, c) memset((void *)(a), (b), (c)) ++#define memcpy_fromio(a, b, c) memcpy((a), (void *)(b), (c)) ++#define memcpy_toio(a, b, c) memcpy((void *)(a), (b), (c)) ++#if !defined(readb) ++#define readb(addr) \ ++ ({ unsigned char __v = (*(volatile unsigned char *) (addr)); __v; }) ++#define readw(addr) \ ++ ({ unsigned short __v = (*(volatile unsigned short *) (addr)); __v; }) ++#define readl(addr) \ ++ ({ unsigned int __v = (*(volatile unsigned int *) (addr)); __v; }) ++#define writeb(b, addr) (void)((*(volatile unsigned char *) (addr)) = (b)) ++#define writew(b, addr) (void)((*(volatile unsigned short *) (addr)) = (b)) ++#define writel(b, addr) (void)((*(volatile unsigned int *) (addr)) = (b)) ++#endif /* readb */ ++#endif /* CONFIG_COLDFIRE */ ++ + #endif /* _IO_H */ +--- a/include/asm-m68k/irq.h ++++ b/include/asm-m68k/irq.h +@@ -11,7 +11,10 @@ + * Currently the Atari has 72 and the Amiga 24, but if both are + * supported in the kernel it is better to make room for 72. + */ +-#if defined(CONFIG_VME) || defined(CONFIG_SUN3) || defined(CONFIG_SUN3X) ++#if defined(CONFIG_COLDFIRE) ++#define SYS_IRQS 256 ++#define NR_IRQS SYS_IRQS ++#elif defined(CONFIG_VME) || defined(CONFIG_SUN3) || defined(CONFIG_SUN3X) + #define NR_IRQS 200 + #elif defined(CONFIG_ATARI) || defined(CONFIG_MAC) + #define NR_IRQS 72 +--- a/include/asm-m68k/machdep.h ++++ b/include/asm-m68k/machdep.h +@@ -32,4 +32,11 @@ extern void (*mach_heartbeat) (int); + extern void (*mach_l2_flush) (int); + extern void (*mach_beep) (unsigned int, unsigned int); + ++#ifdef CONFIG_COLDFIRE ++extern void __init config_coldfire(void); ++extern void __init mmu_context_init(void); ++extern irq_handler_t mach_default_handler; ++extern void (*mach_tick)(void); ++#endif ++ + #endif /* _M68K_MACHDEP_H */ +--- a/include/asm-m68k/mmu_context.h ++++ b/include/asm-m68k/mmu_context.h +@@ -7,7 +7,7 @@ static inline void enter_lazy_tlb(struct + { + } + +-#ifndef CONFIG_SUN3 ++#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE) + + #include <asm/setup.h> + #include <asm/page.h> +@@ -102,7 +102,7 @@ static inline void activate_mm(struct mm + switch_mm_0460(next_mm); + } + +-#else /* CONFIG_SUN3 */ ++#elif defined(CONFIG_SUN3) + #include <asm/sun3mmu.h> + #include <linux/sched.h> + +@@ -150,5 +150,83 @@ static inline void activate_mm(struct mm + activate_context(next_mm); + } + +-#endif ++#else /* CONFIG_COLDFIRE */ ++ ++#include <asm/atomic.h> ++#include <asm/bitops.h> ++#include <asm/mmu.h> ++ ++#define NO_CONTEXT 256 ++#define LAST_CONTEXT 255 ++#define FIRST_CONTEXT 1 ++ ++extern void set_context(mm_context_t context, pgd_t *pgd); ++extern unsigned long context_map[]; ++extern mm_context_t next_mmu_context; ++ ++extern atomic_t nr_free_contexts; ++extern struct mm_struct *context_mm[LAST_CONTEXT+1]; ++extern void steal_context(void); ++ ++static inline void get_mmu_context(struct mm_struct *mm) ++{ ++ mm_context_t ctx; ++ ++ if (mm->context != NO_CONTEXT) ++ return; ++ while (atomic_dec_and_test_lt(&nr_free_contexts)) { ++ atomic_inc(&nr_free_contexts); ++ steal_context(); ++ } ++ ctx = next_mmu_context; ++ while (test_and_set_bit(ctx, context_map)) { ++ ctx = find_next_zero_bit(context_map, LAST_CONTEXT+1, ctx); ++ if (ctx > LAST_CONTEXT) ++ ctx = 0; ++ } ++ next_mmu_context = (ctx + 1) & LAST_CONTEXT; ++ mm->context = ctx; ++ context_mm[ctx] = mm; ++} ++ ++/* ++ * Set up the context for a new address space. ++ */ ++#define init_new_context(tsk, mm) (((mm)->context = NO_CONTEXT), 0) ++ ++/* ++ * We're finished using the context for an address space. ++ */ ++static inline void destroy_context(struct mm_struct *mm) ++{ ++ if (mm->context != NO_CONTEXT) { ++ clear_bit(mm->context, context_map); ++ mm->context = NO_CONTEXT; ++ atomic_inc(&nr_free_contexts); ++ } ++} ++ ++static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next, ++ struct task_struct *tsk) ++{ ++ get_mmu_context(tsk->mm); ++ set_context(tsk->mm->context, next->pgd); ++} ++ ++/* ++ * After we have set current->mm to a new value, this activates ++ * the context for the new mm so we see the new mappings. ++ */ ++static inline void activate_mm(struct mm_struct *active_mm, ++ struct mm_struct *mm) ++{ ++ get_mmu_context(mm); ++ set_context(mm->context, mm->pgd); ++} ++ ++#define deactivate_mm(tsk, mm) do { } while (0) ++ ++extern void mmu_context_init(void); ++ ++#endif /* CONFIG_COLDFIRE */ + #endif +--- a/include/asm-m68k/page.h ++++ b/include/asm-m68k/page.h +@@ -4,7 +4,7 @@ + #include <linux/const.h> + + /* PAGE_SHIFT determines the page size */ +-#ifndef CONFIG_SUN3 ++#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE) + #define PAGE_SHIFT (12) + #else + #define PAGE_SHIFT (13) +@@ -116,10 +116,23 @@ typedef struct page *pgtable_t; + + extern unsigned long m68k_memoffset; + +-#ifndef CONFIG_SUN3 ++#if !defined(CONFIG_SUN3) + + #define WANT_PAGE_VIRTUAL + ++#if defined(CONFIG_COLDFIRE) ++static inline unsigned long ___pa(void *vaddr) ++{ ++ return (((unsigned long)vaddr & 0x0fffffff) + CONFIG_SDRAM_BASE); ++} ++#define __pa(vaddr) ___pa((void *)(vaddr)) ++ ++static inline void *__va(unsigned long paddr) ++{ ++ return (void *)((paddr & 0x0fffffff) + PAGE_OFFSET); ++} ++ ++#else + static inline unsigned long ___pa(void *vaddr) + { + unsigned long paddr; +@@ -141,6 +154,7 @@ static inline void *__va(unsigned long p + : "0" (paddr), "i" (m68k_fixup_memoffset)); + return vaddr; + } ++#endif + + #else /* !CONFIG_SUN3 */ + /* This #define is a horrible hack to suppress lots of warnings. --m */ +@@ -172,6 +186,8 @@ static inline void *__va(unsigned long x + * memory node, but we have no highmem, so that works for now. + * TODO: implement (fast) pfn<->pgdat_idx conversion functions, this makes lots + * of the shifts unnecessary. ++ * ++ * PFNs are used to map physical pages. So PFN[0] maps to the base phys addr. + */ + #define virt_to_pfn(kaddr) (__pa(kaddr) >> PAGE_SHIFT) + #define pfn_to_virt(pfn) __va((pfn) << PAGE_SHIFT) +--- a/include/asm-m68k/page_offset.h ++++ b/include/asm-m68k/page_offset.h +@@ -1,8 +1,11 @@ + + /* This handles the memory map.. */ +-#ifndef CONFIG_SUN3 ++#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE) + #define PAGE_OFFSET_RAW 0x00000000 +-#else ++#elif defined(CONFIG_SUN3) + #define PAGE_OFFSET_RAW 0x0E000000 ++#else /* CONFIG_COLDFIRE */ ++#define PAGE_OFFSET_RAW 0xC0000000 ++#define PHYS_OFFSET 0x40000000 + #endif + +--- a/include/asm-m68k/pci.h ++++ b/include/asm-m68k/pci.h +@@ -1,57 +1,86 @@ +-#ifndef _ASM_M68K_PCI_H +-#define _ASM_M68K_PCI_H +- + /* +- * asm-m68k/pci_m68k.h - m68k specific PCI declarations. ++ * asm-m68k/pci.h - m68k specific PCI declarations. + * +- * Written by Wout Klaren. ++ * Coldfire Implementation Copyright (c) 2007 Freescale Semiconductor, Inc. ++ * Kurt Mahan <kmahan@freescale.com> + */ ++#ifndef _ASM_M68K_PCI_H ++#define _ASM_M68K_PCI_H + +-#include <asm/scatterlist.h> ++#ifdef CONFIG_PCI + +-struct pci_ops; ++#include <asm-generic/pci-dma-compat.h> + + /* +- * Structure with hardware dependent information and functions of the +- * PCI bus. ++ * The PCI address space does equal the physical memory ++ * address space. The networking and block device layers use ++ * this boolean for bounce buffer decisions. + */ ++#define PCI_DMA_BUS_IS_PHYS (1) + +-struct pci_bus_info +-{ +- /* +- * Resources of the PCI bus. +- */ +- +- struct resource mem_space; +- struct resource io_space; ++#define PCIBIOS_MIN_IO 0x00004000 ++#define PCIBIOS_MIN_MEM 0x02000000 + +- /* +- * System dependent functions. +- */ ++#define pcibios_assign_all_busses() 0 ++#define pcibios_scan_all_fns(a, b) 0 + +- struct pci_ops *m68k_pci_ops; ++static inline void ++pcibios_set_master(struct pci_dev *dev) ++{ ++ /* no special bus mastering setup handling */ ++} + +- void (*fixup)(int pci_modify); +- void (*conf_device)(struct pci_dev *dev); +-}; ++static inline void ++pcibios_penalize_isa_irq(int irq, int active) ++{ ++ /* no dynamic PCI IRQ allocation */ ++} + +-#define pcibios_assign_all_busses() 0 +-#define pcibios_scan_all_fns(a, b) 0 ++static inline void ++pcibios_add_platform_entries(struct pci_dev *dev) ++{ ++ /* no special handling */ ++} + +-static inline void pcibios_set_master(struct pci_dev *dev) ++static inline void ++pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region, ++ struct resource *res) + { +- /* No special bus mastering setup handling */ ++#ifdef CONFIG_M54455 ++ if ((res->start == 0xa0000000) || (res->start == 0xa8000000)) { ++ /* HACK! FIX! kludge to fix bridge mapping */ ++ region->start = res->start & 0x0fffffff; ++ region->end = res->end & 0x0fffffff; ++ } else { ++ region->start = res->start; ++ region->end = res->end; ++ } ++#else ++ region->start = res->start; ++ region->end = res->end; ++#endif + } + +-static inline void pcibios_penalize_isa_irq(int irq, int active) ++static inline void ++pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, ++ struct pci_bus_region *region) + { +- /* We don't do dynamic PCI IRQ allocation */ ++ res->start = region->start; ++ res->end = region->end; + } + +-/* The PCI address space does equal the physical memory +- * address space. The networking and block device layers use +- * this boolean for bounce buffer decisions. +- */ +-#define PCI_DMA_BUS_IS_PHYS (1) ++static inline struct resource * ++pcibios_select_root(struct pci_dev *pdev, struct resource *res) ++{ ++ struct resource *root = NULL; ++ ++ if (res->flags & IORESOURCE_IO) ++ root = &ioport_resource; ++ if (res->flags & IORESOURCE_MEM) ++ root = &iomem_resource; ++ ++ return root; ++} + ++#endif /* CONFIG_PCI */ + #endif /* _ASM_M68K_PCI_H */ +--- a/include/asm-m68k/pgalloc.h ++++ b/include/asm-m68k/pgalloc.h +@@ -8,8 +8,10 @@ + #include <asm/virtconvert.h> + + +-#ifdef CONFIG_SUN3 ++#if defined(CONFIG_SUN3) + #include <asm/sun3_pgalloc.h> ++#elif defined(CONFIG_COLDFIRE) ++#include <asm/cf_pgalloc.h> + #else + #include <asm/motorola_pgalloc.h> + #endif +--- a/include/asm-m68k/pgtable.h ++++ b/include/asm-m68k/pgtable.h +@@ -40,6 +40,8 @@ + /* PGDIR_SHIFT determines what a third-level page table entry can map */ + #ifdef CONFIG_SUN3 + #define PGDIR_SHIFT 17 ++#elif defined(CONFIG_COLDFIRE) ++#define PGDIR_SHIFT 22 + #else + #define PGDIR_SHIFT 25 + #endif +@@ -54,6 +56,10 @@ + #define PTRS_PER_PTE 16 + #define PTRS_PER_PMD 1 + #define PTRS_PER_PGD 2048 ++#elif defined(CONFIG_COLDFIRE) ++#define PTRS_PER_PTE 512 ++#define PTRS_PER_PMD 1 ++#define PTRS_PER_PGD 1024 + #else + #define PTRS_PER_PTE 1024 + #define PTRS_PER_PMD 8 +@@ -66,6 +72,9 @@ + #ifdef CONFIG_SUN3 + #define KMAP_START 0x0DC00000 + #define KMAP_END 0x0E000000 ++#elif defined(CONFIG_COLDFIRE) ++#define KMAP_START 0xe0000000 ++#define KMAP_END 0xf0000000 + #else + #define KMAP_START 0xd0000000 + #define KMAP_END 0xf0000000 +@@ -130,6 +139,8 @@ static inline void update_mmu_cache(stru + + #ifdef CONFIG_SUN3 + #include <asm/sun3_pgtable.h> ++#elif defined(CONFIG_COLDFIRE) ++#include <asm/cf_pgtable.h> + #else + #include <asm/motorola_pgtable.h> + #endif +@@ -140,6 +151,9 @@ static inline void update_mmu_cache(stru + /* + * Macro to mark a page protection value as "uncacheable". + */ ++#ifdef CONFIG_COLDFIRE ++# define pgprot_noncached(prot) (__pgprot(pgprot_val(prot) | CF_PAGE_NOCACHE)) ++#else /* CONFIG_COLDFIRE */ + #ifdef SUN3_PAGE_NOCACHE + # define __SUN3_PAGE_NOCACHE SUN3_PAGE_NOCACHE + #else +@@ -154,6 +168,7 @@ static inline void update_mmu_cache(stru + ? (__pgprot((pgprot_val(prot) & _CACHEMASK040) | _PAGE_NOCACHE_S)) \ + : (prot))) + ++#endif /* CONFIG_COLDFIRE */ + #endif /* !__ASSEMBLY__ */ + + /* +--- a/include/asm-m68k/processor.h ++++ b/include/asm-m68k/processor.h +@@ -22,24 +22,38 @@ static inline unsigned long rdusp(void) + { + unsigned long usp; + ++#ifndef CONFIG_COLDFIRE + __asm__ __volatile__("move %/usp,%0" : "=a" (usp)); ++#else ++ __asm__ __volatile__("movel %/usp,%0" : "=a" (usp)); ++#endif + return usp; + } + + static inline void wrusp(unsigned long usp) + { ++#ifndef CONFIG_COLDFIRE + __asm__ __volatile__("move %0,%/usp" : : "a" (usp)); ++#else ++ __asm__ __volatile__("movel %0,%/usp" : : "a" (usp)); ++#endif + } + + /* + * User space process size: 3.75GB. This is hardcoded into a few places, + * so don't change it unless you know what you are doing. + */ +-#ifndef CONFIG_SUN3 ++#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE) + #define TASK_SIZE (0xF0000000UL) ++#elif defined(CONFIG_COLDFIRE) ++#define TASK_SIZE (0xC0000000UL) ++#else /* CONFIG_SUN3 */ ++#ifdef __ASSEMBLY__ ++#define TASK_SIZE (0x0E000000) + #else + #define TASK_SIZE (0x0E000000UL) + #endif ++#endif + + #ifdef __KERNEL__ + #define STACK_TOP TASK_SIZE +@@ -49,9 +63,11 @@ static inline void wrusp(unsigned long u + /* This decides where the kernel will search for a free chunk of vm + * space during mmap's. + */ +-#ifndef CONFIG_SUN3 +-#define TASK_UNMAPPED_BASE 0xC0000000UL +-#else ++#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE) ++#define TASK_UNMAPPED_BASE 0xC0000000UL ++#elif defined(CONFIG_COLDFIRE) ++#define TASK_UNMAPPED_BASE 0x80000000UL ++#else /* CONFIG_SUN3 */ + #define TASK_UNMAPPED_BASE 0x0A000000UL + #endif + #define TASK_UNMAPPED_ALIGN(addr, off) PAGE_ALIGN(addr) +@@ -60,7 +76,11 @@ struct thread_struct { + unsigned long ksp; /* kernel stack pointer */ + unsigned long usp; /* user stack pointer */ + unsigned short sr; /* saved status register */ ++#ifndef CONFIG_COLDFIRE + unsigned short fs; /* saved fs (sfc, dfc) */ ++#else ++ mm_segment_t fs; ++#endif + unsigned long crp[2]; /* cpu root pointer */ + unsigned long esp0; /* points to SR of stack frame */ + unsigned long faddr; /* info about last fault */ +@@ -81,6 +101,7 @@ struct thread_struct { + /* + * Do necessary setup to start up a newly executed thread. + */ ++#ifndef CONFIG_COLDFIRE + static inline void start_thread(struct pt_regs * regs, unsigned long pc, + unsigned long usp) + { +@@ -91,6 +112,23 @@ static inline void start_thread(struct p + regs->sr &= ~0x2000; + wrusp(usp); + } ++#else ++/* ++ * Do necessary setup to start up a newly executed thread. ++ * ++ * pass the data segment into user programs if it exists, ++ * it can't hurt anything as far as I can tell ++ */ ++#define start_thread(_regs, _pc, _usp) \ ++do { \ ++ set_fs(USER_DS); /* reads from user space */ \ ++ (_regs)->pc = (_pc); \ ++ if (current->mm) \ ++ (_regs)->d5 = current->mm->start_data; \ ++ (_regs)->sr &= ~0x2000; \ ++ wrusp(_usp); \ ++} while (0) ++#endif + + /* Forward declaration, a strange C thing */ + struct task_struct; +--- a/include/asm-m68k/ptrace.h ++++ b/include/asm-m68k/ptrace.h +@@ -38,10 +38,21 @@ struct pt_regs { + long d0; + long orig_d0; + long stkadj; ++#ifndef CONFIG_COLDFIRE + unsigned short sr; + unsigned long pc; + unsigned format : 4; /* frame format specifier */ + unsigned vector : 12; /* vector offset */ ++#else ++ unsigned long mmuar; ++ unsigned long mmusr; ++ unsigned format : 4; /* frame format specifier */ ++ unsigned fs2 : 2; ++ unsigned vector: 8; ++ unsigned fs1 : 2; ++ unsigned short sr; ++ unsigned long pc; ++#endif + }; + + /* +--- a/include/asm-m68k/raw_io.h ++++ b/include/asm-m68k/raw_io.h +@@ -77,6 +77,7 @@ static inline void raw_outsb(volatile u8 + out_8(port, *buf++); + } + ++#ifndef CONFIG_COLDFIRE + static inline void raw_insw(volatile u16 __iomem *port, u16 *buf, unsigned int nr) + { + unsigned int tmp; +@@ -342,6 +343,63 @@ static inline void raw_outsw_swapw(volat + : "d0", "a0", "a1", "d6"); + } + ++ ++#else /*CONFIG_COLDFIRE */ ++ ++static inline void raw_insw(volatile u16 *port, u16 *buf, unsigned int nr) ++{ ++ unsigned int i; ++ ++ for (i = 0; i < nr; i++) ++ *buf++ = raw_inw(port); ++} ++ ++static inline void raw_outsw(volatile u16 *port, const u16 *buf, ++ unsigned int nr) ++{ ++ unsigned int i; ++ ++ for (i = 0; i < nr; i++, buf++) ++ raw_outw(*buf, port); ++} ++ ++static inline void raw_insl(volatile u32 *port, u32 *buf, unsigned int nr) ++{ ++ unsigned int i; ++ ++ for (i = 0; i < nr; i++) ++ *buf++ = raw_inl(port); ++} ++ ++static inline void raw_outsl(volatile u32 *port, const u32 *buf, ++ unsigned int nr) ++{ ++ unsigned int i; ++ ++ for (i = 0; i < nr; i++, buf++) ++ raw_outl(*buf, port); ++} ++ ++static inline void raw_insw_swapw(volatile u16 *port, u16 *buf, ++ unsigned int nr) ++{ ++ unsigned int i; ++ ++ for (i = 0; i < nr; i++) ++ *buf++ = in_le16(port); ++ ++} ++ ++static inline void raw_outsw_swapw(volatile u16 __iomem *port, const u16 *buf, ++ unsigned int nr) ++{ ++ unsigned int i; ++ ++ for (i = 0; i < nr; i++, buf++) ++ out_le16(port, *buf); ++} ++#endif /*CONFIG_COLDFIRE */ ++ + #endif /* __KERNEL__ */ + + #endif /* _RAW_IO_H */ +--- a/include/asm-m68k/segment.h ++++ b/include/asm-m68k/segment.h +@@ -29,6 +29,7 @@ typedef struct { + * Get/set the SFC/DFC registers for MOVES instructions + */ + ++#ifndef CONFIG_COLDFIRE + static inline mm_segment_t get_fs(void) + { + mm_segment_t _v; +@@ -50,6 +51,15 @@ static inline void set_fs(mm_segment_t v + : /* no outputs */ : "r" (val.seg) : "memory"); + } + ++#else /* CONFIG_COLDFIRE */ ++ ++#include <asm/current.h> ++#define get_fs() (current->thread.fs) ++#define set_fs(val) (current->thread.fs = (val)) ++#define get_ds() (KERNEL_DS) ++ ++#endif /* CONFIG_COLDFIRE */ ++ + #define segment_eq(a,b) ((a).seg == (b).seg) + + #endif /* __ASSEMBLY__ */ +--- a/include/asm-m68k/setup.h ++++ b/include/asm-m68k/setup.h +@@ -40,6 +40,7 @@ + #define MACH_HP300 9 + #define MACH_Q40 10 + #define MACH_SUN3X 11 ++#define MACH_CFMMU 12 + + #define COMMAND_LINE_SIZE 256 + +@@ -189,6 +190,14 @@ extern unsigned long m68k_machtype; + # define MACH_TYPE (MACH_SUN3X) + #endif + ++#if !defined(CONFIG_COLDFIRE) ++# define MACH_IS_COLDFIRE (0) ++#else ++# define CONFIG_COLDFIRE_ONLY ++# define MACH_IS_COLDFIRE (1) ++# define MACH_TYPE (MACH_CFMMU) ++#endif ++ + #ifndef MACH_TYPE + # define MACH_TYPE (m68k_machtype) + #endif +@@ -211,23 +220,31 @@ extern unsigned long m68k_machtype; + #define CPUB_68030 1 + #define CPUB_68040 2 + #define CPUB_68060 3 ++#define CPUB_CFV4E 4 + + #define CPU_68020 (1<<CPUB_68020) + #define CPU_68030 (1<<CPUB_68030) + #define CPU_68040 (1<<CPUB_68040) + #define CPU_68060 (1<<CPUB_68060) ++#define CPU_CFV4E (1<<CPUB_CFV4E) + + #define FPUB_68881 0 + #define FPUB_68882 1 + #define FPUB_68040 2 /* Internal FPU */ + #define FPUB_68060 3 /* Internal FPU */ + #define FPUB_SUNFPA 4 /* Sun-3 FPA */ ++#define FPUB_CFV4E 5 + + #define FPU_68881 (1<<FPUB_68881) + #define FPU_68882 (1<<FPUB_68882) + #define FPU_68040 (1<<FPUB_68040) + #define FPU_68060 (1<<FPUB_68060) + #define FPU_SUNFPA (1<<FPUB_SUNFPA) ++#ifndef CONFIG_M54455 ++#define FPU_CFV4E (1<<FPUB_CFV4E) ++#else ++#define FPU_CFV4E 0 ++#endif + + #define MMUB_68851 0 + #define MMUB_68030 1 /* Internal MMU */ +@@ -235,6 +252,7 @@ extern unsigned long m68k_machtype; + #define MMUB_68060 3 /* Internal MMU */ + #define MMUB_APOLLO 4 /* Custom Apollo */ + #define MMUB_SUN3 5 /* Custom Sun-3 */ ++#define MMUB_CFV4E 6 + + #define MMU_68851 (1<<MMUB_68851) + #define MMU_68030 (1<<MMUB_68030) +@@ -242,6 +260,7 @@ extern unsigned long m68k_machtype; + #define MMU_68060 (1<<MMUB_68060) + #define MMU_SUN3 (1<<MMUB_SUN3) + #define MMU_APOLLO (1<<MMUB_APOLLO) ++#define MMU_CFV4E (1<<MMUB_CFV4E) + + #ifdef __KERNEL__ + +@@ -341,6 +360,14 @@ extern int m68k_is040or060; + # endif + #endif + ++#if !defined(CONFIG_CFV4E) ++# define CPU_IS_COLDFIRE (0) ++#else ++# define CPU_IS_COLDFIRE (1) ++# define CPU_IS_CFV4E (1) ++# define MMU_IS_CFV4E (1) ++#endif ++ + #define CPU_TYPE (m68k_cputype) + + #ifdef CONFIG_M68KFPU_EMU +--- a/include/asm-m68k/signal.h ++++ b/include/asm-m68k/signal.h +@@ -150,6 +150,7 @@ typedef struct sigaltstack { + #ifdef __KERNEL__ + #include <asm/sigcontext.h> + ++#ifndef CONFIG_COLDFIRE + #define __HAVE_ARCH_SIG_BITOPS + + static inline void sigaddset(sigset_t *set, int _sig) +@@ -200,6 +201,10 @@ static inline int sigfindinword(unsigned + + struct pt_regs; + extern void ptrace_signal_deliver(struct pt_regs *regs, void *cookie); ++#else ++ ++#define ptrace_signal_deliver(regs, cookie) do { } while (0) ++#endif /* CONFIG_COLDFIRE */ + + #endif /* __KERNEL__ */ + +--- a/include/asm-m68k/string.h ++++ b/include/asm-m68k/string.h +@@ -93,6 +93,7 @@ static inline char *strchr(const char *s + return (char *)s - 1; + } + ++#ifndef CONFIG_COLDFIRE + #define __HAVE_ARCH_STRCMP + static inline int strcmp(const char *cs, const char *ct) + { +@@ -110,6 +111,7 @@ static inline int strcmp(const char *cs, + : "+a" (cs), "+a" (ct), "=d" (res)); + return res; + } ++#endif + + #define __HAVE_ARCH_MEMSET + extern void *memset(void *, int, __kernel_size_t); +--- a/include/asm-m68k/system.h ++++ b/include/asm-m68k/system.h +@@ -63,16 +63,25 @@ asmlinkage void resume(void); + #define smp_read_barrier_depends() ((void)0) + + /* interrupt control.. */ +-#if 0 +-#define local_irq_enable() asm volatile ("andiw %0,%%sr": : "i" (ALLOWINT) : "memory") +-#else + #include <linux/hardirq.h> ++#ifndef CONFIG_COLDFIRE + #define local_irq_enable() ({ \ + if (MACH_IS_Q40 || !hardirq_count()) \ + asm volatile ("andiw %0,%%sr": : "i" (ALLOWINT) : "memory"); \ + }) +-#endif + #define local_irq_disable() asm volatile ("oriw #0x0700,%%sr": : : "memory") ++#else /* CONFIG_COLDFIRE */ ++#define local_irq_enable() \ ++ asm volatile ("move.w %%sr, %%d0\n\t" \ ++ "andil #0xf8ff,%%d0\n\t" \ ++ "move.w %%d0, %%sr\n" \ ++ : : : "cc", "d0", "memory") ++#define local_irq_disable() \ ++ asm volatile ("move %/sr,%%d0\n\t" \ ++ "ori.l #0x0700,%%d0\n\t" \ ++ "move %%d0,%/sr\n" \ ++ : : : "cc", "%d0", "memory") ++#endif + #define local_save_flags(x) asm volatile ("movew %%sr,%0":"=d" (x) : : "memory") + #define local_irq_restore(x) asm volatile ("movew %0,%%sr": :"d" (x) : "memory") + +--- a/include/asm-m68k/thread_info.h ++++ b/include/asm-m68k/thread_info.h +@@ -58,5 +58,6 @@ struct thread_info { + #define TIF_DELAYED_TRACE 14 /* single step a syscall */ + #define TIF_SYSCALL_TRACE 15 /* syscall trace active */ + #define TIF_MEMDIE 16 ++#define TIF_FREEZE 17 /* freezing processes */ + + #endif /* _ASM_M68K_THREAD_INFO_H */ +--- a/include/asm-m68k/tlbflush.h ++++ b/include/asm-m68k/tlbflush.h +@@ -2,7 +2,7 @@ + #define _M68K_TLBFLUSH_H + + +-#ifndef CONFIG_SUN3 ++#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE) + + #include <asm/current.h> + +@@ -92,7 +92,12 @@ static inline void flush_tlb_kernel_rang + flush_tlb_all(); + } + +-#else ++static inline void flush_tlb_pgtables(struct mm_struct *mm, ++ unsigned long start, unsigned long end) ++{ ++} ++ ++#elif defined(CONFIG_SUN3) + + + /* Reserved PMEGs. */ +@@ -214,6 +219,13 @@ static inline void flush_tlb_kernel_page + sun3_put_segmap (addr & ~(SUN3_PMEG_SIZE - 1), SUN3_INVALID_PMEG); + } + ++static inline void flush_tlb_pgtables(struct mm_struct *mm, ++ unsigned long start, unsigned long end) ++{ ++} ++ ++#else /* CONFIG_COLDFIRE */ ++#include <asm/cf_tlbflush.h> + #endif + + #endif /* _M68K_TLBFLUSH_H */ +--- a/include/asm-m68k/uaccess.h ++++ b/include/asm-m68k/uaccess.h +@@ -1,6 +1,9 @@ + #ifndef __M68K_UACCESS_H + #define __M68K_UACCESS_H + ++#ifdef CONFIG_COLDFIRE ++#include <asm/cf_uaccess.h> ++#else + /* + * User space memory access functions + */ +@@ -367,4 +370,5 @@ unsigned long __clear_user(void __user * + + #define strlen_user(str) strnlen_user(str, 32767) + ++#endif /* CONFIG_COLDFIRE */ + #endif /* _M68K_UACCESS_H */ diff --git a/target/linux/coldfire/patches/003-mcfv4e_coldfire_headers2.patch b/target/linux/coldfire/patches/003-mcfv4e_coldfire_headers2.patch new file mode 100644 index 0000000000..473cebcf7c --- /dev/null +++ b/target/linux/coldfire/patches/003-mcfv4e_coldfire_headers2.patch @@ -0,0 +1,1865 @@ +From 3da86cd2810e9ba4e4a9e7471a92025172c1c990 Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Wed, 31 Oct 2007 16:41:41 -0600 +Subject: [PATCH] Add Coldfire specific header files. + +LTIBName: mcfv4e-coldfire-headers2 +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + include/asm-m68k/cf_cacheflush.h | 160 ++++++++++++++++ + include/asm-m68k/cf_entry.h | 146 +++++++++++++++ + include/asm-m68k/cf_pgalloc.h | 99 ++++++++++ + include/asm-m68k/cf_pgtable.h | 357 ++++++++++++++++++++++++++++++++++++ + include/asm-m68k/cf_tlbflush.h | 59 ++++++ + include/asm-m68k/cf_uaccess.h | 376 ++++++++++++++++++++++++++++++++++++++ + include/asm-m68k/cfcache.h | 86 +++++++++ + include/asm-m68k/cfmmu.h | 104 +++++++++++ + include/asm-m68k/coldfire.h | 38 ++++ + include/asm-m68k/coldfire_edma.h | 39 ++++ + include/asm-m68k/mcfqspi.h | 50 +++++ + include/asm-m68k/mcfsim.h | 96 ++++++++++ + include/asm-m68k/mcfuart.h | 180 ++++++++++++++++++ + 13 files changed, 1790 insertions(+), 0 deletions(-) + create mode 100644 include/asm-m68k/cf_cacheflush.h + create mode 100644 include/asm-m68k/cf_entry.h + create mode 100644 include/asm-m68k/cf_pgalloc.h + create mode 100644 include/asm-m68k/cf_pgtable.h + create mode 100644 include/asm-m68k/cf_tlbflush.h + create mode 100644 include/asm-m68k/cf_uaccess.h + create mode 100644 include/asm-m68k/cfcache.h + create mode 100644 include/asm-m68k/cfmmu.h + create mode 100644 include/asm-m68k/coldfire.h + create mode 100644 include/asm-m68k/coldfire_edma.h + create mode 100644 include/asm-m68k/mcfqspi.h + create mode 100644 include/asm-m68k/mcfsim.h + create mode 100644 include/asm-m68k/mcfuart.h + +--- /dev/null ++++ b/include/asm-m68k/cf_cacheflush.h +@@ -0,0 +1,160 @@ ++#ifndef M68K_CF_CACHEFLUSH_H ++#define M68K_CF_CACHEFLUSH_H ++ ++#include <asm/cfcache.h> ++ ++/* ++ * Cache handling functions ++ */ ++ ++#define flush_icache() \ ++({ \ ++ unsigned long set; \ ++ unsigned long start_set; \ ++ unsigned long end_set; \ ++ \ ++ start_set = 0; \ ++ end_set = (unsigned long)LAST_DCACHE_ADDR; \ ++ \ ++ for (set = start_set; set <= end_set; set += (0x10 - 3)) \ ++ asm volatile("cpushl %%ic,(%0)\n" \ ++ "\taddq%.l #1,%0\n" \ ++ "\tcpushl %%ic,(%0)\n" \ ++ "\taddq%.l #1,%0\n" \ ++ "\tcpushl %%ic,(%0)\n" \ ++ "\taddq%.l #1,%0\n" \ ++ "\tcpushl %%ic,(%0)" : : "a" (set)); \ ++}) ++ ++/* ++ * invalidate the cache for the specified memory range. ++ * It starts at the physical address specified for ++ * the given number of bytes. ++ */ ++extern void cache_clear(unsigned long paddr, int len); ++/* ++ * push any dirty cache in the specified memory range. ++ * It starts at the physical address specified for ++ * the given number of bytes. ++ */ ++extern void cache_push(unsigned long paddr, int len); ++ ++/* ++ * push and invalidate pages in the specified user virtual ++ * memory range. ++ */ ++extern void cache_push_v(unsigned long vaddr, int len); ++ ++/* This is needed whenever the virtual mapping of the current ++ process changes. */ ++ ++ ++#define flush_cache_all() do { } while (0) ++#define flush_cache_mm(mm) do { } while (0) ++#define flush_cache_range(mm, a, b) do { } while (0) ++#define flush_cache_page(vma, vmaddr, pfn) do { } while (0) ++ ++#define flush_dcache_range(paddr, len) do { } while (0) ++ ++/* Push the page at kernel virtual address and clear the icache */ ++/* use cpush %bc instead of cpush %dc, cinv %ic */ ++#define flush_page_to_ram(page) __flush_page_to_ram((void *) page_address(page)) ++extern inline void __flush_page_to_ram(void *address) ++{ ++ unsigned long set; ++ unsigned long start_set; ++ unsigned long end_set; ++ unsigned long addr = (unsigned long) address; ++ ++ addr &= ~(PAGE_SIZE - 1); /* round down to page start address */ ++ ++ start_set = addr & _ICACHE_SET_MASK; ++ end_set = (addr + PAGE_SIZE-1) & _ICACHE_SET_MASK; ++ ++ if (start_set > end_set) { ++ /* from the begining to the lowest address */ ++ for (set = 0; set <= end_set; set += (0x10 - 3)) ++ asm volatile("cpushl %%bc,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%bc,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%bc,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%bc,(%0)" : : "a" (set)); ++ ++ /* next loop will finish the cache ie pass the hole */ ++ end_set = LAST_ICACHE_ADDR; ++ } ++ for (set = start_set; set <= end_set; set += (0x10 - 3)) ++ asm volatile("cpushl %%bc,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%bc,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%bc,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%bc,(%0)" : : "a" (set)); ++} ++ ++#define flush_dcache_page(page) do { } while (0) ++#define flush_icache_page(vma, pg) do { } while (0) ++#define flush_icache_user_range(adr, len) do { } while (0) ++/* NL */ ++#define flush_icache_user_page(vma, page, addr, len) do { } while (0) ++ ++/* Push n pages at kernel virtual address and clear the icache */ ++/* use cpush %bc instead of cpush %dc, cinv %ic */ ++extern inline void flush_icache_range(unsigned long address, ++ unsigned long endaddr) ++{ ++ unsigned long set; ++ unsigned long start_set; ++ unsigned long end_set; ++ ++ start_set = address & _ICACHE_SET_MASK; ++ end_set = endaddr & _ICACHE_SET_MASK; ++ ++ if (start_set > end_set) { ++ /* from the begining to the lowest address */ ++ for (set = 0; set <= end_set; set += (0x10 - 3)) ++ asm volatile("cpushl %%ic,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%ic,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%ic,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%ic,(%0)" : : "a" (set)); ++ ++ /* next loop will finish the cache ie pass the hole */ ++ end_set = LAST_ICACHE_ADDR; ++ } ++ for (set = start_set; set <= end_set; set += (0x10 - 3)) ++ asm volatile("cpushl %%ic,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%ic,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%ic,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%ic,(%0)" : : "a" (set)); ++} ++ ++static inline void copy_to_user_page(struct vm_area_struct *vma, ++ struct page *page, unsigned long vaddr, ++ void *dst, void *src, int len) ++{ ++ memcpy(dst, src, len); ++ flush_icache_user_page(vma, page, vaddr, len); ++} ++static inline void copy_from_user_page(struct vm_area_struct *vma, ++ struct page *page, unsigned long vaddr, ++ void *dst, void *src, int len) ++{ ++ memcpy(dst, src, len); ++} ++ ++#define flush_cache_dup_mm(mm) flush_cache_mm(mm) ++#define flush_cache_vmap(start, end) flush_cache_all() ++#define flush_cache_vunmap(start, end) flush_cache_all() ++#define flush_dcache_mmap_lock(mapping) do { } while (0) ++#define flush_dcache_mmap_unlock(mapping) do { } while (0) ++ ++#endif /* M68K_CF_CACHEFLUSH_H */ +--- /dev/null ++++ b/include/asm-m68k/cf_entry.h +@@ -0,0 +1,146 @@ ++#ifndef __CF_M68K_ENTRY_H ++#define __CF_M68K_ENTRY_H ++ ++#include <asm/setup.h> ++#include <asm/page.h> ++#include <asm/coldfire.h> ++#include <asm/cfmmu.h> ++#include <asm/asm-offsets.h> ++ ++/* ++ * Stack layout in 'ret_from_exception': ++ * ++ * This allows access to the syscall arguments in registers d1-d5 ++ * ++ * 0(sp) - d1 ++ * 4(sp) - d2 ++ * 8(sp) - d3 ++ * C(sp) - d4 ++ * 10(sp) - d5 ++ * 14(sp) - a0 ++ * 18(sp) - a1 ++ * 1C(sp) - a2 ++ * 20(sp) - d0 ++ * 24(sp) - orig_d0 ++ * 28(sp) - stack adjustment ++ * 2C(sp) - sr ++ * 2E(sp) - pc ++ * 32(sp) - format & vector ++ * 36(sp) - MMUSR ++ * 3A(sp) - MMUAR ++ */ ++ ++/* ++ * 97/05/14 Andreas: Register %a2 is now set to the current task throughout ++ * the whole kernel. ++ */ ++ ++/* the following macro is used when enabling interrupts */ ++/* portable version */ ++#define ALLOWINT (~0x700) ++#define MAX_NOINT_IPL 0 ++ ++#ifdef __ASSEMBLY__ ++ ++#define curptr a2 ++ ++LFLUSH_I_AND_D = 0x00000808 ++LSIGTRAP = 5 ++ ++/* process bits for task_struct.ptrace */ ++PT_TRACESYS_OFF = 3 ++PT_TRACESYS_BIT = 1 ++PT_PTRACED_OFF = 3 ++PT_PTRACED_BIT = 0 ++PT_DTRACE_OFF = 3 ++PT_DTRACE_BIT = 2 ++ ++#define SAVE_ALL_INT save_all_int ++#define SAVE_ALL_SYS save_all_sys ++#define RESTORE_ALL restore_all ++/* ++ * This defines the normal kernel pt-regs layout. ++ * ++ * regs a3-a6 and d6-d7 are preserved by C code ++ * the kernel doesn't mess with usp unless it needs to ++ */ ++ ++/* ++ * a -1 in the orig_d0 field signifies ++ * that the stack frame is NOT for syscall ++ */ ++.macro save_all_int ++ movel MMUSR,%sp@- ++ movel MMUAR,%sp@- ++ clrl %sp@- | stk_adj ++ pea -1:w | orig d0 ++ movel %d0,%sp@- | d0 ++ subal #(8*4), %sp ++ moveml %d1-%d5/%a0-%a1/%curptr,%sp@ ++.endm ++ ++.macro save_all_sys ++ movel MMUSR,%sp@- ++ movel MMUAR,%sp@- ++ clrl %sp@- | stk_adj ++ movel %d0,%sp@- | orig d0 ++ movel %d0,%sp@- | d0 ++ subal #(8*4), %sp ++ moveml %d1-%d5/%a0-%a1/%curptr,%sp@ ++.endm ++ ++.macro restore_all ++ moveml %sp@,%a0-%a1/%curptr/%d1-%d5 ++ addal #(8*4), %sp ++ movel %sp@+,%d0 | d0 ++ addql #4,%sp | orig d0 ++ addl %sp@+,%sp | stk_adj ++ addql #8,%sp | MMUAR & MMUSR ++ rte ++.endm ++ ++#define SWITCH_STACK_SIZE (6*4+4) /* includes return address */ ++ ++#define SAVE_SWITCH_STACK save_switch_stack ++#define RESTORE_SWITCH_STACK restore_switch_stack ++#define GET_CURRENT(tmp) get_current tmp ++ ++.macro save_switch_stack ++ subal #(6*4), %sp ++ moveml %a3-%a6/%d6-%d7,%sp@ ++.endm ++ ++.macro restore_switch_stack ++ moveml %sp@,%a3-%a6/%d6-%d7 ++ addal #(6*4), %sp ++.endm ++ ++.macro get_current reg=%d0 ++ movel %sp,\reg ++ andl #-THREAD_SIZE,\reg ++ movel \reg,%curptr ++ movel %curptr@,%curptr ++.endm ++ ++#else /* C source */ ++ ++#define STR(X) STR1(X) ++#define STR1(X) #X ++ ++#define PT_OFF_ORIG_D0 0x24 ++#define PT_OFF_FORMATVEC 0x32 ++#define PT_OFF_SR 0x2C ++#define SAVE_ALL_INT \ ++ "clrl %%sp@-;" /* stk_adj */ \ ++ "pea -1:w;" /* orig d0 = -1 */ \ ++ "movel %%d0,%%sp@-;" /* d0 */ \ ++ "subal #(8*4),%sp" \ ++ "moveml %%d1-%%d5/%%a0-%%a2,%%sp@" ++#define GET_CURRENT(tmp) \ ++ "movel %%sp,"#tmp"\n\t" \ ++ "andw #-"STR(THREAD_SIZE)","#tmp"\n\t" \ ++ "movel "#tmp",%%a2\n\t" ++ ++#endif ++ ++#endif /* __CF_M68K_ENTRY_H */ +--- /dev/null ++++ b/include/asm-m68k/cf_pgalloc.h +@@ -0,0 +1,99 @@ ++#ifndef M68K_CF_PGALLOC_H ++#define M68K_CF_PGALLOC_H ++ ++#include <asm/coldfire.h> ++#include <asm/page.h> ++#include <asm/cf_tlbflush.h> ++ ++extern inline void pte_free_kernel(pte_t *pte) ++{ ++ free_page((unsigned long) pte); ++} ++ ++extern const char bad_pmd_string[]; ++ ++extern inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm, ++ unsigned long address) ++{ ++ unsigned long page = __get_free_page(GFP_DMA|__GFP_REPEAT); ++ ++ if (!page) ++ return NULL; ++ ++ memset((void *)page, 0, PAGE_SIZE); ++ return (pte_t *) (page); ++} ++ ++extern inline pmd_t *pmd_alloc_kernel(pgd_t *pgd, unsigned long address) ++{ ++ return (pmd_t *) pgd; ++} ++ ++#define pmd_alloc_one_fast(mm, address) ({ BUG(); ((pmd_t *)1); }) ++#define pmd_alloc_one(mm, address) ({ BUG(); ((pmd_t *)2); }) ++ ++#define pte_alloc_one_fast(mm, addr) pte_alloc_one(mm, addr) ++ ++#define pmd_populate(mm, pmd, page) (pmd_val(*pmd) = \ ++ (unsigned long)(page_address(page))) ++#define pmd_populate_kernel(mm, pmd, pte) (pmd_val(*pmd) = (unsigned long)(pte)) ++ ++static inline void __pte_free_tlb(struct mmu_gather *tlb, struct page *page) ++{ ++ __free_page(page); ++} ++ ++#define __pmd_free_tlb(tlb, pmd) do { } while (0) ++ ++static inline struct page *pte_alloc_one(struct mm_struct *mm, ++ unsigned long address) ++{ ++ struct page *page = alloc_pages(GFP_DMA|__GFP_REPEAT, 0); ++ pte_t *pte; ++ ++ if (!page) ++ return NULL; ++ ++ pte = kmap(page); ++ if (pte) { ++ clear_page(pte); ++ __flush_page_to_ram(pte); ++ flush_tlb_kernel_page(pte); ++ nocache_page(pte); ++ } ++ kunmap(pte); ++ ++ return page; ++} ++ ++extern inline void pte_free(struct page *page) ++{ ++ __free_page(page); ++} ++ ++/* ++ * In our implementation, each pgd entry contains 1 pmd that is never allocated ++ * or freed. pgd_present is always 1, so this should never be called. -NL ++ */ ++#define pmd_free(pmd) BUG() ++ ++extern inline void pgd_free(pgd_t *pgd) ++{ ++ free_page((unsigned long) pgd); ++} ++ ++extern inline pgd_t *pgd_alloc(struct mm_struct *mm) ++{ ++ pgd_t *new_pgd; ++ ++ new_pgd = (pgd_t *)__get_free_page(GFP_DMA | __GFP_NOWARN); ++ if (!new_pgd) ++ return NULL; ++ memcpy(new_pgd, swapper_pg_dir, PAGE_SIZE); ++ memset(new_pgd, 0, PAGE_OFFSET >> PGDIR_SHIFT); ++ return new_pgd; ++} ++ ++#define pgd_populate(mm, pmd, pte) BUG() ++ ++#endif /* M68K_CF_PGALLOC_H */ +--- /dev/null ++++ b/include/asm-m68k/cf_pgtable.h +@@ -0,0 +1,357 @@ ++#ifndef _CF_PGTABLE_H ++#define _CF_PGTABLE_H ++ ++#include <asm/cfmmu.h> ++#include <asm/page.h> ++ ++#ifndef __ASSEMBLY__ ++#include <asm/virtconvert.h> ++#include <linux/linkage.h> ++ ++/* For virtual address to physical address conversion */ ++#define VTOP(addr) __pa(addr) ++#define PTOV(addr) __va(addr) ++ ++ ++#endif /* !__ASSEMBLY__ */ ++ ++/* Page protection values within PTE. */ ++ ++/* MMUDR bits, in proper place. */ ++#define CF_PAGE_LOCKED (0x00000002) ++#define CF_PAGE_EXEC (0x00000004) ++#define CF_PAGE_WRITABLE (0x00000008) ++#define CF_PAGE_READABLE (0x00000010) ++#define CF_PAGE_SYSTEM (0x00000020) ++#define CF_PAGE_COPYBACK (0x00000040) ++#define CF_PAGE_NOCACHE (0x00000080) ++ ++#define CF_CACHEMASK (~0x00000040) ++#define CF_PAGE_MMUDR_MASK (0x000000fe) ++ ++#define _PAGE_NOCACHE030 (CF_PAGE_NOCACHE) ++ ++/* MMUTR bits, need shifting down. */ ++#define CF_PAGE_VALID (0x00000400) ++#define CF_PAGE_SHARED (0x00000800) ++ ++#define CF_PAGE_MMUTR_MASK (0x00000c00) ++#define CF_PAGE_MMUTR_SHIFT (10) ++#define CF_ASID_MMU_SHIFT (2) ++ ++/* Fake bits, not implemented in CF, will get masked out before ++ hitting hardware, and might go away altogether once this port is ++ complete. */ ++#if PAGE_SHIFT < 13 ++#error COLDFIRE Error: Pages must be at least 8k in size ++#endif ++#define CF_PAGE_ACCESSED (0x00001000) ++#define CF_PAGE_FILE (0x00000200) ++#define CF_PAGE_DIRTY (0x00000001) ++ ++#define _PAGE_CACHE040 0x020 /* 68040 cache mode, cachable, copyback */ ++#define _PAGE_NOCACHE_S 0x040 /* 68040 no-cache mode, serialized */ ++#define _PAGE_NOCACHE 0x060 /* 68040 cache mode, non-serialized */ ++#define _PAGE_CACHE040W 0x000 /* 68040 cache mode, cachable, write-through */ ++#define _DESCTYPE_MASK 0x003 ++#define _CACHEMASK040 (~0x060) ++#define _PAGE_GLOBAL040 0x400 /* 68040 global bit, used for kva descs */ ++ ++ ++/* Externally used page protection values. */ ++#define _PAGE_PRESENT (CF_PAGE_VALID) ++#define _PAGE_ACCESSED (CF_PAGE_ACCESSED) ++#define _PAGE_DIRTY (CF_PAGE_DIRTY) ++#define _PAGE_READWRITE (CF_PAGE_WRITABLE \ ++ | CF_PAGE_READABLE \ ++ | CF_PAGE_SYSTEM \ ++ | CF_PAGE_SHARED) ++ ++/* Compound page protection values. */ ++#define PAGE_NONE __pgprot(CF_PAGE_VALID \ ++ | CF_PAGE_ACCESSED) ++ ++#define PAGE_SHARED __pgprot(CF_PAGE_VALID \ ++ | CF_PAGE_ACCESSED \ ++ | CF_PAGE_SHARED) ++ ++#define PAGE_INIT __pgprot(CF_PAGE_VALID \ ++ | CF_PAGE_WRITABLE \ ++ | CF_PAGE_READABLE \ ++ | CF_PAGE_EXEC \ ++ | CF_PAGE_SYSTEM \ ++ | CF_PAGE_SHARED) ++ ++#define PAGE_KERNEL __pgprot(CF_PAGE_VALID \ ++ | CF_PAGE_WRITABLE \ ++ | CF_PAGE_READABLE \ ++ | CF_PAGE_EXEC \ ++ | CF_PAGE_SYSTEM \ ++ | CF_PAGE_SHARED \ ++ | CF_PAGE_ACCESSED) ++ ++#define PAGE_COPY __pgprot(CF_PAGE_VALID \ ++ | CF_PAGE_ACCESSED \ ++ | CF_PAGE_READABLE \ ++ | CF_PAGE_DIRTY) ++/* ++ * Page protections for initialising protection_map. See mm/mmap.c ++ * for use. In general, the bit positions are xwr, and P-items are ++ * private, the S-items are shared. ++ */ ++ ++#define __P000 PAGE_NONE ++#define __P100 __pgprot(CF_PAGE_VALID \ ++ | CF_PAGE_ACCESSED \ ++ | CF_PAGE_EXEC) ++#define __P010 __pgprot(CF_PAGE_VALID \ ++ | CF_PAGE_WRITABLE \ ++ | CF_PAGE_ACCESSED) ++#define __P110 __pgprot(CF_PAGE_VALID \ ++ | CF_PAGE_ACCESSED \ ++ | CF_PAGE_WRITABLE \ ++ | CF_PAGE_EXEC) ++#define __P001 __pgprot(CF_PAGE_VALID \ ++ | CF_PAGE_ACCESSED \ ++ | CF_PAGE_READABLE) ++#define __P101 __pgprot(CF_PAGE_VALID \ ++ | CF_PAGE_ACCESSED \ ++ | CF_PAGE_READABLE \ ++ | CF_PAGE_EXEC) ++#define __P011 __pgprot(CF_PAGE_VALID \ ++ | CF_PAGE_READABLE \ ++ | CF_PAGE_WRITABLE \ ++ | CF_PAGE_ACCESSED) ++#define __P111 __pgprot(CF_PAGE_VALID \ ++ | CF_PAGE_ACCESSED \ ++ | CF_PAGE_WRITABLE \ ++ | CF_PAGE_READABLE \ ++ | CF_PAGE_EXEC) ++ ++#define __S000 PAGE_NONE ++#define __S100 __pgprot(CF_PAGE_VALID \ ++ | CF_PAGE_ACCESSED \ ++ | CF_PAGE_SHARED \ ++ | CF_PAGE_EXEC) ++#define __S010 PAGE_SHARED ++#define __S110 __pgprot(CF_PAGE_VALID \ ++ | CF_PAGE_ACCESSED \ ++ | CF_PAGE_SHARED \ ++ | CF_PAGE_EXEC) ++#define __S001 __pgprot(CF_PAGE_VALID \ ++ | CF_PAGE_ACCESSED \ ++ | CF_PAGE_SHARED \ ++ | CF_PAGE_READABLE) ++#define __S101 __pgprot(CF_PAGE_VALID \ ++ | CF_PAGE_ACCESSED \ ++ | CF_PAGE_SHARED \ ++ | CF_PAGE_READABLE \ ++ | CF_PAGE_EXEC) ++#define __S011 __pgprot(CF_PAGE_VALID \ ++ | CF_PAGE_ACCESSED \ ++ | CF_PAGE_SHARED \ ++ | CF_PAGE_READABLE) ++#define __S111 __pgprot(CF_PAGE_VALID \ ++ | CF_PAGE_ACCESSED \ ++ | CF_PAGE_SHARED \ ++ | CF_PAGE_READABLE \ ++ | CF_PAGE_EXEC) ++ ++#define PTE_MASK PAGE_MASK ++#define CF_PAGE_CHG_MASK (PTE_MASK | CF_PAGE_ACCESSED | CF_PAGE_DIRTY) ++ ++#ifndef __ASSEMBLY__ ++ ++/* ++ * Conversion functions: convert a page and protection to a page entry, ++ * and a page entry and page directory to the page they refer to. ++ */ ++#define mk_pte(page, pgprot) pfn_pte(page_to_pfn(page), (pgprot)) ++ ++extern inline pte_t pte_modify(pte_t pte, pgprot_t newprot) ++{ ++ pte_val(pte) = (pte_val(pte) & CF_PAGE_CHG_MASK) | pgprot_val(newprot); ++ return pte; ++} ++ ++#define pmd_set(pmdp, ptep) do {} while (0) ++ ++extern inline void pgd_set(pgd_t *pgdp, pmd_t *pmdp) ++{ ++ pgd_val(*pgdp) = virt_to_phys(pmdp); ++} ++ ++#define __pte_page(pte) \ ++ ((unsigned long) ((pte_val(pte) & CF_PAGE_PGNUM_MASK) + PAGE_OFFSET)) ++#define __pmd_page(pmd) ((unsigned long) (pmd_val(pmd))) ++ ++extern inline int pte_none(pte_t pte) ++{ ++ return !pte_val(pte); ++} ++extern inline int pte_present(pte_t pte) ++{ ++ return pte_val(pte) & CF_PAGE_VALID; ++} ++extern inline void pte_clear(struct mm_struct *mm, unsigned long addr, ++ pte_t *ptep) ++{ ++ pte_val(*ptep) = 0; ++} ++ ++#define pte_pagenr(pte) ((__pte_page(pte) - PAGE_OFFSET) >> PAGE_SHIFT) ++#define pte_page(pte) virt_to_page(__pte_page(pte)) ++ ++extern inline int pmd_none2(pmd_t *pmd) { return !pmd_val(*pmd); } ++#define pmd_none(pmd) pmd_none2(&(pmd)) ++extern inline int pmd_bad2(pmd_t *pmd) { return 0; } ++#define pmd_bad(pmd) pmd_bad2(&(pmd)) ++#define pmd_present(pmd) (!pmd_none2(&(pmd))) ++extern inline void pmd_clear(pmd_t *pmdp) { pmd_val(*pmdp) = 0; } ++ ++extern inline int pgd_none(pgd_t pgd) { return 0; } ++extern inline int pgd_bad(pgd_t pgd) { return 0; } ++extern inline int pgd_present(pgd_t pgd) { return 1; } ++extern inline void pgd_clear(pgd_t *pgdp) {} ++ ++ ++#define pte_ERROR(e) \ ++ printk(KERN_ERR "%s:%d: bad pte %08lx.\n", \ ++ __FILE__, __LINE__, pte_val(e)) ++#define pmd_ERROR(e) \ ++ printk(KERN_ERR "%s:%d: bad pmd %08lx.\n", \ ++ __FILE__, __LINE__, pmd_val(e)) ++#define pgd_ERROR(e) \ ++ printk(KERN_ERR "%s:%d: bad pgd %08lx.\n", \ ++ __FILE__, __LINE__, pgd_val(e)) ++ ++ ++/* ++ * The following only work if pte_present() is true. ++ * Undefined behaviour if not... ++ * [we have the full set here even if they don't change from m68k] ++ */ ++extern inline int pte_read(pte_t pte) \ ++ { return pte_val(pte) & CF_PAGE_READABLE; } ++extern inline int pte_write(pte_t pte) \ ++ { return pte_val(pte) & CF_PAGE_WRITABLE; } ++extern inline int pte_exec(pte_t pte) \ ++ { return pte_val(pte) & CF_PAGE_EXEC; } ++extern inline int pte_dirty(pte_t pte) \ ++ { return pte_val(pte) & CF_PAGE_DIRTY; } ++extern inline int pte_young(pte_t pte) \ ++ { return pte_val(pte) & CF_PAGE_ACCESSED; } ++extern inline int pte_file(pte_t pte) \ ++ { return pte_val(pte) & CF_PAGE_FILE; } ++ ++extern inline pte_t pte_wrprotect(pte_t pte) \ ++ { pte_val(pte) &= ~CF_PAGE_WRITABLE; return pte; } ++extern inline pte_t pte_rdprotect(pte_t pte) \ ++ { pte_val(pte) &= ~CF_PAGE_READABLE; return pte; } ++extern inline pte_t pte_exprotect(pte_t pte) \ ++ { pte_val(pte) &= ~CF_PAGE_EXEC; return pte; } ++extern inline pte_t pte_mkclean(pte_t pte) \ ++ { pte_val(pte) &= ~CF_PAGE_DIRTY; return pte; } ++extern inline pte_t pte_mkold(pte_t pte) \ ++ { pte_val(pte) &= ~CF_PAGE_ACCESSED; return pte; } ++extern inline pte_t pte_mkwrite(pte_t pte) \ ++ { pte_val(pte) |= CF_PAGE_WRITABLE; return pte; } ++extern inline pte_t pte_mkread(pte_t pte) \ ++ { pte_val(pte) |= CF_PAGE_READABLE; return pte; } ++extern inline pte_t pte_mkexec(pte_t pte) \ ++ { pte_val(pte) |= CF_PAGE_EXEC; return pte; } ++extern inline pte_t pte_mkdirty(pte_t pte) \ ++ { pte_val(pte) |= CF_PAGE_DIRTY; return pte; } ++extern inline pte_t pte_mkyoung(pte_t pte) \ ++ { pte_val(pte) |= CF_PAGE_ACCESSED; return pte; } ++extern inline pte_t pte_mknocache(pte_t pte) \ ++ { pte_val(pte) |= 0x80 | (pte_val(pte) & ~0x40); return pte; } ++extern inline pte_t pte_mkcache(pte_t pte) \ ++ { pte_val(pte) &= ~CF_PAGE_NOCACHE; return pte; } ++ ++#define swapper_pg_dir kernel_pg_dir ++extern pgd_t kernel_pg_dir[PTRS_PER_PGD]; ++ ++/* Find an entry in a pagetable directory. */ ++#define pgd_index(address) ((address) >> PGDIR_SHIFT) ++ ++#define pgd_offset(mm, address) ((mm)->pgd + pgd_index(address)) ++ ++/* Find an entry in a kernel pagetable directory. */ ++#define pgd_offset_k(address) pgd_offset(&init_mm, address) ++ ++/* Find an entry in the second-level pagetable. */ ++extern inline pmd_t *pmd_offset(pgd_t *pgd, unsigned long address) ++{ ++ return (pmd_t *) pgd; ++} ++ ++/* Find an entry in the third-level pagetable. */ ++#define __pte_offset(address) ((address >> PAGE_SHIFT) & (PTRS_PER_PTE - 1)) ++#define pte_offset_kernel(dir, address) ((pte_t *) __pmd_page(*(dir)) + \ ++ __pte_offset(address)) ++ ++/* Disable caching for page at given kernel virtual address. */ ++static inline void nocache_page(void *vaddr) ++{ ++ pgd_t *dir; ++ pmd_t *pmdp; ++ pte_t *ptep; ++ unsigned long addr = (unsigned long)vaddr; ++ ++ dir = pgd_offset_k(addr); ++ pmdp = pmd_offset(dir, addr); ++ ptep = pte_offset_kernel(pmdp, addr); ++ *ptep = pte_mknocache(*ptep); ++} ++ ++/* Enable caching for page at given kernel virtual address. */ ++static inline void cache_page(void *vaddr) ++{ ++ pgd_t *dir; ++ pmd_t *pmdp; ++ pte_t *ptep; ++ unsigned long addr = (unsigned long)vaddr; ++ ++ dir = pgd_offset_k(addr); ++ pmdp = pmd_offset(dir, addr); ++ ptep = pte_offset_kernel(pmdp, addr); ++ *ptep = pte_mkcache(*ptep); ++} ++ ++#define PTE_FILE_MAX_BITS 21 ++#define PTE_FILE_SHIFT 11 ++ ++static inline unsigned long pte_to_pgoff(pte_t pte) ++{ ++ return pte_val(pte) >> PTE_FILE_SHIFT; ++} ++ ++static inline pte_t pgoff_to_pte(unsigned pgoff) ++{ ++ pte_t pte = __pte((pgoff << PTE_FILE_SHIFT) + CF_PAGE_FILE); ++ return pte; ++} ++ ++/* Encode and de-code a swap entry (must be !pte_none(e) && !pte_present(e)) */ ++#define __swp_entry(type, offset) ((swp_entry_t) { (type) | \ ++ (offset << PTE_FILE_SHIFT) }) ++#define __swp_type(x) ((x).val & 0xFF) ++#define __swp_offset(x) ((x).val >> PTE_FILE_SHIFT) ++#define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) }) ++#define __swp_entry_to_pte(x) (__pte((x).val)) ++ ++#define pmd_page(pmd) virt_to_page(__pmd_page(pmd)) ++ ++#define pte_offset_map(pmdp, address) ((pte_t *)__pmd_page(*pmdp) + \ ++ __pte_offset(address)) ++#define pte_offset_map_nested(pmdp, address) pte_offset_map(pmdp, address) ++#define pte_unmap(pte) kunmap(pte) ++#define pte_unmap_nested(pte) kunmap(pte) ++ ++#define pfn_pte(pfn, prot) __pte(((pfn) << PAGE_SHIFT) | pgprot_val(prot)) ++#define pte_pfn(pte) (pte_val(pte) >> PAGE_SHIFT) ++ ++ ++#endif /* !__ASSEMBLY__ */ ++#endif /* !_CF_PGTABLE_H */ +--- /dev/null ++++ b/include/asm-m68k/cf_tlbflush.h +@@ -0,0 +1,59 @@ ++#ifndef M68K_CF_TLBFLUSH_H ++#define M68K_CF_TLBFLUSH_H ++ ++#include <asm/coldfire.h> ++ ++/* Flush all userspace mappings. */ ++static inline void flush_tlb_all(void) ++{ ++ preempt_disable(); ++ *MMUOR = MMUOR_CNL; ++ preempt_enable(); ++} ++ ++/* Clear user TLB entries within the context named in mm */ ++static inline void flush_tlb_mm(struct mm_struct *mm) ++{ ++ preempt_disable(); ++ *MMUOR = MMUOR_CNL; ++ preempt_enable(); ++} ++ ++/* Flush a single TLB page. */ ++static inline void flush_tlb_page(struct vm_area_struct *vma, ++ unsigned long addr) ++{ ++ preempt_disable(); ++ *MMUOR = MMUOR_CNL; ++ preempt_enable(); ++} ++/* Flush a range of pages from TLB. */ ++ ++static inline void flush_tlb_range(struct mm_struct *mm, ++ unsigned long start, unsigned long end) ++{ ++ preempt_disable(); ++ *MMUOR = MMUOR_CNL; ++ preempt_enable(); ++} ++ ++/* Flush kernel page from TLB. */ ++static inline void flush_tlb_kernel_page(void *addr) ++{ ++ preempt_disable(); ++ *MMUOR = MMUOR_CNL; ++ preempt_enable(); ++} ++ ++static inline void flush_tlb_kernel_range(unsigned long start, ++ unsigned long end) ++{ ++ flush_tlb_all(); ++} ++ ++extern inline void flush_tlb_pgtables(struct mm_struct *mm, ++ unsigned long start, unsigned long end) ++{ ++} ++ ++#endif /* M68K_CF_TLBFLUSH_H */ +--- /dev/null ++++ b/include/asm-m68k/cf_uaccess.h +@@ -0,0 +1,376 @@ ++#ifndef __M68K_CF_UACCESS_H ++#define __M68K_CF_UACCESS_H ++ ++/* ++ * User space memory access functions ++ */ ++ ++/* The "moves" command is not available in the CF instruction set. */ ++#include <linux/compiler.h> ++#include <linux/errno.h> ++#include <linux/types.h> ++#include <linux/sched.h> ++#include <asm/segment.h> ++ ++#define VERIFY_READ 0 ++#define VERIFY_WRITE 1 ++ ++/* We let the MMU do all checking */ ++#define access_ok(type, addr, size) 1 ++ ++/* ++ * The exception table consists of pairs of addresses: the first is the ++ * address of an instruction that is allowed to fault, and the second is ++ * the address at which the program should continue. No registers are ++ * modified, so it is entirely up to the continuation code to figure out ++ * what to do. ++ * ++ * All the routines below use bits of fixup code that are out of line ++ * with the main instruction path. This means when everything is well, ++ * we don't even have to jump over them. Further, they do not intrude ++ * on our cache or tlb entries. ++ */ ++ ++struct exception_table_entry ++{ ++ unsigned long insn, fixup; ++}; ++ ++extern int __put_user_bad(void); ++extern int __get_user_bad(void); ++ ++#define __put_user_asm(res, x, ptr, bwl, reg, err) \ ++asm volatile ("\n" \ ++ "1: move."#bwl" %2,%1\n" \ ++ "2:\n" \ ++ " .section .fixup,\"ax\"\n" \ ++ " .even\n" \ ++ "10: moveq.l %3,%0\n" \ ++ " jra 2b\n" \ ++ " .previous\n" \ ++ "\n" \ ++ " .section __ex_table,\"a\"\n" \ ++ " .align 4\n" \ ++ " .long 1b,10b\n" \ ++ " .long 2b,10b\n" \ ++ " .previous" \ ++ : "+d" (res), "=m" (*(ptr)) \ ++ : #reg (x), "i" (err)) ++ ++/* ++ * These are the main single-value transfer routines. They automatically ++ * use the right size if we just have the right pointer type. ++ */ ++ ++#define __put_user(x, ptr) \ ++({ \ ++ typeof(*(ptr)) __pu_val = (x); \ ++ int __pu_err = 0; \ ++ __chk_user_ptr(ptr); \ ++ switch (sizeof (*(ptr))) { \ ++ case 1: \ ++ __put_user_asm(__pu_err, __pu_val, ptr, b, d, -EFAULT); \ ++ break; \ ++ case 2: \ ++ __put_user_asm(__pu_err, __pu_val, ptr, w, d, -EFAULT); \ ++ break; \ ++ case 4: \ ++ __put_user_asm(__pu_err, __pu_val, ptr, l, r, -EFAULT); \ ++ break; \ ++ case 8: \ ++ { \ ++ const void __user *__pu_ptr = (ptr); \ ++ asm volatile ("\n" \ ++ "1: move.l %2,(%1)+\n" \ ++ "2: move.l %R2,(%1)\n" \ ++ "3:\n" \ ++ " .section .fixup,\"ax\"\n" \ ++ " .even\n" \ ++ "10: movel %3,%0\n" \ ++ " jra 3b\n" \ ++ " .previous\n" \ ++ "\n" \ ++ " .section __ex_table,\"a\"\n" \ ++ " .align 4\n" \ ++ " .long 1b,10b\n" \ ++ " .long 2b,10b\n" \ ++ " .long 3b,10b\n" \ ++ " .previous" \ ++ : "+d" (__pu_err), "+a" (__pu_ptr) \ ++ : "r" (__pu_val), "i" (-EFAULT) \ ++ : "memory"); \ ++ break; \ ++ } \ ++ default: \ ++ __pu_err = __put_user_bad(); \ ++ break; \ ++ } \ ++ __pu_err; \ ++}) ++#define put_user(x, ptr) __put_user(x, ptr) ++ ++ ++#define __get_user_asm(res, x, ptr, type, bwl, reg, err) ({ \ ++ type __gu_val; \ ++ asm volatile ("\n" \ ++ "1: move."#bwl" %2,%1\n" \ ++ "2:\n" \ ++ " .section .fixup,\"ax\"\n" \ ++ " .even\n" \ ++ "10: move.l %3,%0\n" \ ++ " subl %1,%1\n" \ ++ " jra 2b\n" \ ++ " .previous\n" \ ++ "\n" \ ++ " .section __ex_table,\"a\"\n" \ ++ " .align 4\n" \ ++ " .long 1b,10b\n" \ ++ " .previous" \ ++ : "+d" (res), "=&" #reg (__gu_val) \ ++ : "m" (*(ptr)), "i" (err)); \ ++ (x) = (typeof(*(ptr)))(unsigned long)__gu_val; \ ++}) ++ ++#define __get_user(x, ptr) \ ++({ \ ++ int __gu_err = 0; \ ++ __chk_user_ptr(ptr); \ ++ switch (sizeof(*(ptr))) { \ ++ case 1: \ ++ __get_user_asm(__gu_err, x, ptr, u8, b, d, -EFAULT); \ ++ break; \ ++ case 2: \ ++ __get_user_asm(__gu_err, x, ptr, u16, w, d, -EFAULT); \ ++ break; \ ++ case 4: \ ++ __get_user_asm(__gu_err, x, ptr, u32, l, r, -EFAULT); \ ++ break; \ ++/* case 8: disabled because gcc-4.1 has a broken typeof \ ++ { \ ++ const void *__gu_ptr = (ptr); \ ++ u64 __gu_val; \ ++ asm volatile ("\n" \ ++ "1: move.l (%2)+,%1\n" \ ++ "2: move.l (%2),%R1\n" \ ++ "3:\n" \ ++ " .section .fixup,\"ax\"\n" \ ++ " .even\n" \ ++ "10: move.l %3,%0\n" \ ++ " subl %1,%1\n" \ ++ " subl %R1,%R1\n" \ ++ " jra 3b\n" \ ++ " .previous\n" \ ++ "\n" \ ++ " .section __ex_table,\"a\"\n" \ ++ " .align 4\n" \ ++ " .long 1b,10b\n" \ ++ " .long 2b,10b\n" \ ++ " .previous" \ ++ : "+d" (__gu_err), "=&r" (__gu_val), \ ++ "+a" (__gu_ptr) \ ++ : "i" (-EFAULT) \ ++ : "memory"); \ ++ (x) = (typeof(*(ptr)))__gu_val; \ ++ break; \ ++ } */ \ ++ default: \ ++ __gu_err = __get_user_bad(); \ ++ break; \ ++ } \ ++ __gu_err; \ ++}) ++#define get_user(x, ptr) __get_user(x, ptr) ++ ++unsigned long __generic_copy_from_user(void *to, const void __user *from, ++ unsigned long n); ++unsigned long __generic_copy_to_user(void __user *to, const void *from, ++ unsigned long n); ++ ++#define __constant_copy_from_user_asm(res, to, from, tmp, n, s1, s2, s3)\ ++ asm volatile ("\n" \ ++ "1: move."#s1" (%2)+,%3\n" \ ++ " move."#s1" %3,(%1)+\n" \ ++ "2: move."#s2" (%2)+,%3\n" \ ++ " move."#s2" %3,(%1)+\n" \ ++ " .ifnc \""#s3"\",\"\"\n" \ ++ "3: move."#s3" (%2)+,%3\n" \ ++ " move."#s3" %3,(%1)+\n" \ ++ " .endif\n" \ ++ "4:\n" \ ++ " .section __ex_table,\"a\"\n" \ ++ " .align 4\n" \ ++ " .long 1b,10f\n" \ ++ " .long 2b,20f\n" \ ++ " .ifnc \""#s3"\",\"\"\n" \ ++ " .long 3b,30f\n" \ ++ " .endif\n" \ ++ " .previous\n" \ ++ "\n" \ ++ " .section .fixup,\"ax\"\n" \ ++ " .even\n" \ ++ "10: clr."#s1" (%1)+\n" \ ++ "20: clr."#s2" (%1)+\n" \ ++ " .ifnc \""#s3"\",\"\"\n" \ ++ "30: clr."#s3" (%1)+\n" \ ++ " .endif\n" \ ++ " moveq.l #"#n",%0\n" \ ++ " jra 4b\n" \ ++ " .previous\n" \ ++ : "+d" (res), "+&a" (to), "+a" (from), "=&d" (tmp) \ ++ : : "memory") ++ ++static __always_inline unsigned long ++__constant_copy_from_user(void *to, const void __user *from, unsigned long n) ++{ ++ unsigned long res = 0, tmp; ++ ++ switch (n) { ++ case 1: ++ __get_user_asm(res, *(u8 *)to, (u8 __user *)from, u8, b, d, 1); ++ break; ++ case 2: ++ __get_user_asm(res, *(u16 *)to, (u16 __user *)from, u16, w, ++ d, 2); ++ break; ++ case 3: ++ __constant_copy_from_user_asm(res, to, from, tmp, 3, w, b,); ++ break; ++ case 4: ++ __get_user_asm(res, *(u32 *)to, (u32 __user *)from, u32, l, ++ r, 4); ++ break; ++ case 5: ++ __constant_copy_from_user_asm(res, to, from, tmp, 5, l, b,); ++ break; ++ case 6: ++ __constant_copy_from_user_asm(res, to, from, tmp, 6, l, w,); ++ break; ++ case 7: ++ __constant_copy_from_user_asm(res, to, from, tmp, 7, l, w, b); ++ break; ++ case 8: ++ __constant_copy_from_user_asm(res, to, from, tmp, 8, l, l,); ++ break; ++ case 9: ++ __constant_copy_from_user_asm(res, to, from, tmp, 9, l, l, b); ++ break; ++ case 10: ++ __constant_copy_from_user_asm(res, to, from, tmp, 10, l, l, w); ++ break; ++ case 12: ++ __constant_copy_from_user_asm(res, to, from, tmp, 12, l, l, l); ++ break; ++ default: ++ /* we limit the inlined version to 3 moves */ ++ return __generic_copy_from_user(to, from, n); ++ } ++ ++ return res; ++} ++ ++#define __constant_copy_to_user_asm(res, to, from, tmp, n, s1, s2, s3) \ ++ asm volatile ("\n" \ ++ " move."#s1" (%2)+,%3\n" \ ++ "11: move."#s1" %3,(%1)+\n" \ ++ "12: move."#s2" (%2)+,%3\n" \ ++ "21: move."#s2" %3,(%1)+\n" \ ++ "22:\n" \ ++ " .ifnc \""#s3"\",\"\"\n" \ ++ " move."#s3" (%2)+,%3\n" \ ++ "31: move."#s3" %3,(%1)+\n" \ ++ "32:\n" \ ++ " .endif\n" \ ++ "4:\n" \ ++ "\n" \ ++ " .section __ex_table,\"a\"\n" \ ++ " .align 4\n" \ ++ " .long 11b,5f\n" \ ++ " .long 12b,5f\n" \ ++ " .long 21b,5f\n" \ ++ " .long 22b,5f\n" \ ++ " .ifnc \""#s3"\",\"\"\n" \ ++ " .long 31b,5f\n" \ ++ " .long 32b,5f\n" \ ++ " .endif\n" \ ++ " .previous\n" \ ++ "\n" \ ++ " .section .fixup,\"ax\"\n" \ ++ " .even\n" \ ++ "5: moveq.l #"#n",%0\n" \ ++ " jra 4b\n" \ ++ " .previous\n" \ ++ : "+d" (res), "+a" (to), "+a" (from), "=&d" (tmp) \ ++ : : "memory") ++ ++static __always_inline unsigned long ++__constant_copy_to_user(void __user *to, const void *from, unsigned long n) ++{ ++ unsigned long res = 0, tmp; ++ ++ switch (n) { ++ case 1: ++ __put_user_asm(res, *(u8 *)from, (u8 __user *)to, b, d, 1); ++ break; ++ case 2: ++ __put_user_asm(res, *(u16 *)from, (u16 __user *)to, w, d, 2); ++ break; ++ case 3: ++ __constant_copy_to_user_asm(res, to, from, tmp, 3, w, b,); ++ break; ++ case 4: ++ __put_user_asm(res, *(u32 *)from, (u32 __user *)to, l, r, 4); ++ break; ++ case 5: ++ __constant_copy_to_user_asm(res, to, from, tmp, 5, l, b,); ++ break; ++ case 6: ++ __constant_copy_to_user_asm(res, to, from, tmp, 6, l, w,); ++ break; ++ case 7: ++ __constant_copy_to_user_asm(res, to, from, tmp, 7, l, w, b); ++ break; ++ case 8: ++ __constant_copy_to_user_asm(res, to, from, tmp, 8, l, l,); ++ break; ++ case 9: ++ __constant_copy_to_user_asm(res, to, from, tmp, 9, l, l, b); ++ break; ++ case 10: ++ __constant_copy_to_user_asm(res, to, from, tmp, 10, l, l, w); ++ break; ++ case 12: ++ __constant_copy_to_user_asm(res, to, from, tmp, 12, l, l, l); ++ break; ++ default: ++ /* limit the inlined version to 3 moves */ ++ return __generic_copy_to_user(to, from, n); ++ } ++ ++ return res; ++} ++ ++#define __copy_from_user(to, from, n) \ ++(__builtin_constant_p(n) ? \ ++ __constant_copy_from_user(to, from, n) : \ ++ __generic_copy_from_user(to, from, n)) ++ ++#define __copy_to_user(to, from, n) \ ++(__builtin_constant_p(n) ? \ ++ __constant_copy_to_user(to, from, n) : \ ++ __generic_copy_to_user(to, from, n)) ++ ++#define __copy_to_user_inatomic __copy_to_user ++#define __copy_from_user_inatomic __copy_from_user ++ ++#define copy_from_user(to, from, n) __copy_from_user(to, from, n) ++#define copy_to_user(to, from, n) __copy_to_user(to, from, n) ++ ++long strncpy_from_user(char *dst, const char __user *src, long count); ++long strnlen_user(const char __user *src, long n); ++unsigned long __clear_user(void __user *to, unsigned long n); ++ ++#define clear_user __clear_user ++ ++#define strlen_user(str) strnlen_user(str, 32767) ++ ++#endif /* _M68K_CF_UACCESS_H */ +--- /dev/null ++++ b/include/asm-m68k/cfcache.h +@@ -0,0 +1,86 @@ ++/* ++ * include/asm-m68k/cfcache.h ++ */ ++#ifndef CF_CFCACHE_H ++#define CF_CFCACHE_H ++ ++#define CF_CACR_DEC (0x80000000) /* Data Cache Enable */ ++#define CF_CACR_DW (0x40000000) /* Data default Write-protect */ ++#define CF_CACR_DESB (0x20000000) /* Data Enable Store Buffer */ ++#define CF_CACR_DDPI (0x10000000) /* Data Disable CPUSHL Invalidate */ ++#define CF_CACR_DHLCK (0x08000000) /* 1/2 Data Cache Lock Mode */ ++#define CF_CACR_DDCM_00 (0x00000000) /* Cacheable writethrough imprecise */ ++#define CF_CACR_DDCM_01 (0x02000000) /* Cacheable copyback */ ++#define CF_CACR_DDCM_10 (0x04000000) /* Noncacheable precise */ ++#define CF_CACR_DDCM_11 (0x06000000) /* Noncacheable imprecise */ ++#define CF_CACR_DCINVA (0x01000000) /* Data Cache Invalidate All */ ++#define CF_CACR_IVO (0x00100000) /* Invalidate only */ ++#define CF_CACR_BEC (0x00080000) /* Branch Cache Enable */ ++#define CF_CACR_BCINVA (0x00040000) /* Branch Cache Invalidate All */ ++#define CF_CACR_IEC (0x00008000) /* Instruction Cache Enable */ ++#define CF_CACR_SPA (0x00004000) /* Search by Physical Address */ ++#define CF_CACR_DNFB (0x00002000) /* Default cache-inhibited fill buf */ ++#define CF_CACR_IDPI (0x00001000) /* Instr Disable CPUSHL Invalidate */ ++#define CF_CACR_IHLCK (0x00000800) /* 1/2 Instruction Cache Lock Mode */ ++#define CF_CACR_IDCM (0x00000400) /* Noncacheable Instr default mode */ ++#define CF_CACR_ICINVA (0x00000100) /* Instr Cache Invalidate All */ ++#define CF_CACR_EUSP (0x00000020) /* Switch stacks in user mode */ ++ ++#define DCACHE_LINE_SIZE 0x0010 /* bytes per line */ ++#define DCACHE_WAY_SIZE 0x2000 /* words per cache block */ ++#define CACHE_DISABLE_MODE (CF_CACR_DCINVA+CF_CACR_BCINVA+CF_CACR_ICINVA) ++#ifdef CONFIG_M5445X_DISABLE_CACHE ++/* disable cache for testing rev0 silicon */ ++#define CACHE_INITIAL_MODE (CF_CACR_EUSP) ++#else ++#define CACHE_INITIAL_MODE (CF_CACR_DEC+CF_CACR_BEC+CF_CACR_IEC+CF_CACR_EUSP) ++#endif ++ ++#define _DCACHE_SIZE (2*16384) ++#define _ICACHE_SIZE (2*16384) ++ ++#define _SET_SHIFT 4 ++ ++/* ++ * Masks for cache sizes. Programming note: because the set size is a ++ * power of two, the mask is also the last address in the set. ++ * This may need to be #ifdef for other Coldfire processors. ++ */ ++ ++#define _DCACHE_SET_MASK ((_DCACHE_SIZE/64-1)<<_SET_SHIFT) ++#define _ICACHE_SET_MASK ((_ICACHE_SIZE/64-1)<<_SET_SHIFT) ++#define LAST_DCACHE_ADDR _DCACHE_SET_MASK ++#define LAST_ICACHE_ADDR _ICACHE_SET_MASK ++ ++ ++#ifndef __ASSEMBLY__ ++ ++extern void DcacheFlushInvalidate(void); ++ ++extern void DcacheDisable(void); ++extern void DcacheEnable(void); ++ ++/******************************************************************************/ ++/*** Unimplemented Cache functionality ***/ ++/******************************************************************************/ ++#define preDcacheInvalidateBlockMark() ++#define postDcacheInvalidateBlockMark() ++#define DcacheZeroBlock(p, l) fast_bzero((char *)(p), (long)(l)) ++#define loadDcacheInvalidateBlock() ASSERT(!"Not Implemented on V4e") ++#define IcacheInvalidateBlock() ASSERT(!"Not Implemented on V4e") ++ ++/******************************************************************************/ ++/*** Redundant Cache functionality on ColdFire ***/ ++/******************************************************************************/ ++#define DcacheInvalidateBlock(p, l) DcacheFlushInvalidateCacheBlock(p, l) ++#define DcacheFlushCacheBlock(p, l) DcacheFlushInvalidateCacheBlock(p, l) ++#define DcacheFlushBlock(p, l) DcacheFlushInvalidateCacheBlock(p, l) ++ ++extern void DcacheFlushInvalidateCacheBlock(void *start, unsigned long size); ++extern void FLASHDcacheFlushInvalidate(void); ++ ++extern void cacr_set(unsigned long x); ++ ++#endif /* !__ASSEMBLY__ */ ++ ++#endif /* CF_CACHE_H */ +--- /dev/null ++++ b/include/asm-m68k/cfmmu.h +@@ -0,0 +1,104 @@ ++/* ++ * Definitions for Coldfire V4e MMU ++ */ ++#include <asm/movs.h> ++ ++#ifndef __CF_MMU_H__ ++#define __CF_MMU_H__ ++ ++ ++#define MMU_BASE 0xE1000000 ++ ++ ++#define MMUCR (MMU_BASE+0x00) ++#define MMUCR_ASMN 1 ++#define MMUCR_ASM (1<<MMUCR_ASMN) ++#define MMUCR_ENN 0 ++#define MMUCR_EN (1<<MMUCR_ENN) ++ ++#define MMUOR REG16(MMU_BASE+0x04+0x02) ++#define MMUOR_AAN 16 ++#define MMUOR_AA (0xffff<<MMUOR_AAN) ++#define MMUOR_STLBN 8 ++#define MMUOR_STLB (1<<MMUOR_STLBN) ++#define MMUOR_CAN 7 ++#define MMUOR_CA (1<<MMUOR_CAN) ++#define MMUOR_CNLN 6 ++#define MMUOR_CNL (1<<MMUOR_CNLN) ++#define MMUOR_CASN 5 ++#define MMUOR_CAS (1<<MMUOR_CASN) ++#define MMUOR_ITLBN 4 ++#define MMUOR_ITLB (1<<MMUOR_ITLBN) ++#define MMUOR_ADRN 3 ++#define MMUOR_ADR (1<<MMUOR_ADRN) ++#define MMUOR_RWN 2 ++#define MMUOR_RW (1<<MMUOR_RWN) ++#define MMUOR_ACCN 1 ++#define MMUOR_ACC (1<<MMUOR_ACCN) ++#define MMUOR_UAAN 0 ++#define MMUOR_UAA (1<<MMUOR_UAAN) ++ ++#define MMUSR REG32(MMU_BASE+0x08) ++#define MMUSR_SPFN 5 ++#define MMUSR_SPF (1<<MMUSR_SPFN) ++#define MMUSR_RFN 4 ++#define MMUSR_RF (1<<MMUSR_RFN) ++#define MMUSR_WFN 3 ++#define MMUSR_WF (1<<MMUSR_WFN) ++#define MMUSR_HITN 1 ++#define MMUSR_HIT (1<<MMUSR_HITN) ++ ++#define MMUAR REG32(MMU_BASE+0x10) ++#define MMUAR_VPN 1 ++#define MMUAR_VP (0xfffffffe) ++#define MMUAR_SN 0 ++#define MMUAR_S (1<<MMUAR_SN) ++ ++#define MMUTR REG32(MMU_BASE+0x14) ++#define MMUTR_VAN 10 ++#define MMUTR_VA (0xfffffc00) ++#define MMUTR_IDN 2 ++#define MMUTR_ID (0xff<<MMUTR_IDN) ++#define MMUTR_SGN 1 ++#define MMUTR_SG (1<<MMUTR_SGN) ++#define MMUTR_VN 0 ++#define MMUTR_V (1<<MMUTR_VN) ++ ++#define MMUDR REG32(MMU_BASE+0x18) ++#define MMUDR_PAN 10 ++#define MMUDR_PA (0xfffffc00) ++#define MMUDR_SZN 8 ++#define MMUDR_SZ_MASK (0x2<<MMUDR_SZN) ++#define MMUDR_SZ1M (0<<MMUDR_SZN) ++#define MMUDR_SZ4K (1<<MMUDR_SZN) ++#define MMUDR_SZ8K (2<<MMUDR_SZN) ++#define MMUDR_SZ16M (3<<MMUDR_SZN) ++#define MMUDR_CMN 6 ++#define MMUDR_INC (2<<MMUDR_CMN) ++#define MMUDR_IC (0<<MMUDR_CMN) ++#define MMUDR_DWT (0<<MMUDR_CMN) ++#define MMUDR_DCB (1<<MMUDR_CMN) ++#define MMUDR_DNCP (2<<MMUDR_CMN) ++#define MMUDR_DNCIP (3<<MMUDR_CMN) ++#define MMUDR_SPN 5 ++#define MMUDR_SP (1<<MMUDR_SPN) ++#define MMUDR_RN 4 ++#define MMUDR_R (1<<MMUDR_RN) ++#define MMUDR_WN 3 ++#define MMUDR_W (1<<MMUDR_WN) ++#define MMUDR_XN 2 ++#define MMUDR_X (1<<MMUDR_XN) ++#define MMUDR_LKN 1 ++#define MMUDR_LK (1<<MMUDR_LKN) ++ ++ ++#ifndef __ASSEMBLY__ ++#define CF_PMEGS_NUM 256 ++#define CF_INVALID_CONTEXT 255 ++#define CF_PAGE_PGNUM_MASK (PAGE_MASK) ++ ++extern int cf_tlb_miss(struct pt_regs *regs, int write, int dtlb, ++ int extension_word); ++#endif /* __ASSEMBLY__*/ ++ ++#endif /* !__CF_MMU_H__ */ +--- /dev/null ++++ b/include/asm-m68k/coldfire.h +@@ -0,0 +1,38 @@ ++#ifndef _COLDFIRE_H_ ++#define _COLDFIRE_H_ ++ ++#define MCF_MBAR 0x0 ++#define MCF_RAMBAR1 0x40000000 ++#define MCF_SRAM 0x80000000 ++#define MCF_CLK CONFIG_MCFCLK ++#define MCF_BUSCLK (CONFIG_MCFCLK/2) ++ ++#ifdef __ASSEMBLY__ ++#define REG32 ++#define REG16 ++#define REG08 ++#else /* __ASSEMBLY__ */ ++#define REG32(x) ((volatile unsigned long *)(x)) ++#define REG16(x) ((volatile unsigned short *)(x)) ++#define REG08(x) ((volatile unsigned char *)(x)) ++ ++#define MCF_REG32(x) *(volatile unsigned long *)(MCF_MBAR+(x)) ++#define MCF_REG16(x) *(volatile unsigned short *)(MCF_MBAR+(x)) ++#define MCF_REG08(x) *(volatile unsigned char *)(MCF_MBAR+(x)) ++ ++void cacr_set(unsigned long); ++unsigned long cacr_get(void); ++ ++#define coldfire_enable_irq0(irq) MCF_INTC0_CIMR = (irq); ++ ++#define coldfire_enable_irq1(irq) MCF_INTC1_CIMR = (irq); ++ ++#define coldfire_disable_irq0(irq) MCF_INTC0_SIMR = (irq); ++ ++#define coldfire_disable_irq1(irq) MCF_INTC1_SIMR = (irq); ++ ++#define getiprh() MCF_INTC0_IPRH ++ ++#endif /* __ASSEMBLY__ */ ++ ++#endif /* _COLDFIRE_H_ */ +--- /dev/null ++++ b/include/asm-m68k/coldfire_edma.h +@@ -0,0 +1,39 @@ ++#ifndef _LINUX_COLDFIRE_DMA_H ++#define _LINUX_COLDFIRE_DMA_H ++ ++#include <linux/interrupt.h> ++ ++#define EDMA_DRIVER_NAME "ColdFire-eDMA" ++#define DMA_DEV_MINOR 1 ++ ++#define EDMA_INT_CHANNEL_BASE 8 ++#define EDMA_INT_CONTROLLER_BASE 64 ++#define EDMA_CHANNELS 16 ++ ++#define EDMA_IRQ_LEVEL 5 ++ ++typedef irqreturn_t (*edma_irq_handler)(int, void *); ++typedef void (*edma_error_handler)(int, void *); ++ ++void set_edma_params(int channel, u32 source, u32 dest, ++ u32 attr, u32 soff, u32 nbytes, u32 slast, ++ u32 citer, u32 biter, u32 doff, u32 dlast_sga); ++ ++void start_edma_transfer(int channel, int major_int); ++ ++void stop_edma_transfer(int channel); ++ ++void confirm_edma_interrupt_handled(int channel); ++ ++void init_edma(void); ++ ++int request_edma_channel(int channel, ++ edma_irq_handler handler, ++ edma_error_handler error_handler, ++ void *dev, ++ spinlock_t *lock, ++ const char *device_id); ++ ++int free_edma_channel(int channel, void *dev); ++ ++#endif +--- /dev/null ++++ b/include/asm-m68k/mcfqspi.h +@@ -0,0 +1,50 @@ ++/****************************************************************************/ ++/* ++ * mcfqspi.h - Master QSPI controller for the ColdFire processors ++ * ++ * (C) Copyright 2005, Intec Automation, ++ * Mike Lavender (mike@steroidmicros) ++ * ++ ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 2 of the License, or ++ (at your option) any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program; if not, write to the Free Software ++ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ ++/* ------------------------------------------------------------------------- */ ++ ++#ifndef MCFQSPI_H_ ++#define MCFQSPI_H_ ++ ++#define QSPI_CS_INIT 0x01 ++#define QSPI_CS_ASSERT 0x02 ++#define QSPI_CS_DROP 0x04 ++ ++struct coldfire_spi_master { ++ u16 bus_num; ++ u16 num_chipselect; ++ u8 irq_source; ++ u32 irq_vector; ++ u32 irq_mask; ++ u8 irq_lp; ++ u8 par_val; ++ void (*cs_control)(u8 cs, u8 command); ++}; ++ ++ ++struct coldfire_spi_chip { ++ u8 mode; ++ u8 bits_per_word; ++ u8 del_cs_to_clk; ++ u8 del_after_trans; ++ u16 void_write_data; ++}; ++#endif /*MCFQSPI_H_*/ +--- /dev/null ++++ b/include/asm-m68k/mcfsim.h +@@ -0,0 +1,96 @@ ++/* ++ * mcfsim.h -- ColdFire System Integration Module support. ++ * ++ * (C) Copyright 1999-2003, Greg Ungerer (gerg@snapgear.com) ++ * (C) Copyright 2000, Lineo Inc. (www.lineo.com) ++ */ ++ ++#ifndef mcfsim_h ++#define mcfsim_h ++ ++#if defined(CONFIG_COLDFIRE) ++#include <asm/coldfire.h> ++#endif ++ ++#if defined(CONFIG_M54455) ++#include <asm/mcf5445x_intc.h> ++#include <asm/mcf5445x_gpio.h> ++#include <asm/mcf5445x_i2c.h> ++#include <asm/mcf5445x_ccm.h> ++#include <asm/mcf5445x_pci.h> ++#include <asm/mcf5445x_pciarb.h> ++#include <asm/mcf5445x_eport.h> ++#endif ++ ++/* ++ * Define the base address of the SIM within the MBAR address space. ++ */ ++#define MCFSIM_BASE 0x0 /* Base address of SIM */ ++ ++/* ++ * Bit definitions for the ICR family of registers. ++ */ ++#define MCFSIM_ICR_AUTOVEC 0x80 /* Auto-vectored intr */ ++#define MCFSIM_ICR_LEVEL0 0x00 /* Level 0 intr */ ++#define MCFSIM_ICR_LEVEL1 0x04 /* Level 1 intr */ ++#define MCFSIM_ICR_LEVEL2 0x08 /* Level 2 intr */ ++#define MCFSIM_ICR_LEVEL3 0x0c /* Level 3 intr */ ++#define MCFSIM_ICR_LEVEL4 0x10 /* Level 4 intr */ ++#define MCFSIM_ICR_LEVEL5 0x14 /* Level 5 intr */ ++#define MCFSIM_ICR_LEVEL6 0x18 /* Level 6 intr */ ++#define MCFSIM_ICR_LEVEL7 0x1c /* Level 7 intr */ ++ ++#define MCFSIM_ICR_PRI0 0x00 /* Priority 0 intr */ ++#define MCFSIM_ICR_PRI1 0x01 /* Priority 1 intr */ ++#define MCFSIM_ICR_PRI2 0x02 /* Priority 2 intr */ ++#define MCFSIM_ICR_PRI3 0x03 /* Priority 3 intr */ ++ ++/* ++ * Bit definitions for the Interrupt Mask register (IMR). ++ */ ++#define MCFSIM_IMR_EINT1 0x0002 /* External intr # 1 */ ++#define MCFSIM_IMR_EINT2 0x0004 /* External intr # 2 */ ++#define MCFSIM_IMR_EINT3 0x0008 /* External intr # 3 */ ++#define MCFSIM_IMR_EINT4 0x0010 /* External intr # 4 */ ++#define MCFSIM_IMR_EINT5 0x0020 /* External intr # 5 */ ++#define MCFSIM_IMR_EINT6 0x0040 /* External intr # 6 */ ++#define MCFSIM_IMR_EINT7 0x0080 /* External intr # 7 */ ++ ++#define MCFSIM_IMR_SWD 0x0100 /* Software Watchdog intr */ ++#define MCFSIM_IMR_TIMER1 0x0200 /* TIMER 1 intr */ ++#define MCFSIM_IMR_TIMER2 0x0400 /* TIMER 2 intr */ ++#define MCFSIM_IMR_MBUS 0x0800 /* MBUS intr */ ++#define MCFSIM_IMR_UART1 0x1000 /* UART 1 intr */ ++#define MCFSIM_IMR_UART2 0x2000 /* UART 2 intr */ ++ ++/* ++ * Mask for all of the SIM devices. Some parts have more or less ++ * SIM devices. This is a catchall for the sandard set. ++ */ ++#ifndef MCFSIM_IMR_MASKALL ++#define MCFSIM_IMR_MASKALL 0x3ffe /* All intr sources */ ++#endif ++ ++ ++/* ++ * PIT interrupt settings, if not found in mXXXXsim.h file. ++ */ ++#ifndef ICR_INTRCONF ++#define ICR_INTRCONF 0x2b /* PIT1 level 5, priority 3 */ ++#endif ++#ifndef MCFPIT_IMR ++#define MCFPIT_IMR MCFINTC_IMRH ++#endif ++#ifndef MCFPIT_IMR_IBIT ++#define MCFPIT_IMR_IBIT (1 << (MCFINT_PIT1 - 32)) ++#endif ++ ++ ++#ifndef __ASSEMBLY__ ++/* ++ * Definition for the interrupt auto-vectoring support. ++ */ ++extern void mcf_autovector(unsigned int vec); ++#endif /* __ASSEMBLY__ */ ++ ++#endif /* mcfsim_h */ +--- /dev/null ++++ b/include/asm-m68k/mcfuart.h +@@ -0,0 +1,180 @@ ++/* ++ * mcfuart.h -- ColdFire internal UART support defines. ++ * ++ * Matt Waddel Matt.Waddel@freescale.com ++ * Copyright Freescale Semiconductor, Inc. 2007 ++ * ++ * Derived from m68knommu version of this same file (Greg Ungerer & Lineo). ++ * ++ */ ++ ++#ifndef mcfuart_h ++#define mcfuart_h ++ ++/* ++ * Define the base address of the UARTS within the MBAR address ++ * space. ++ */ ++#if defined(CONFIG_M54455) ++#include <asm/mcf5445x_intc.h> ++#define MCFUART_BASE1 0xfc060000 /* Base address of UART1 */ ++#define MCFUART_BASE2 0xfc064000 /* Base address of UART2 */ ++#define MCFUART_BASE3 0xfc068000 /* Base address of UART3 */ ++#define MCFINT_VECBASE 64 ++#define MCFINT_UART0 26 ++#endif ++ ++ ++/* ++ * Define the ColdFire UART register set addresses. ++ */ ++#define MCFUART_UMR 0x00 /* Mode register (r/w) */ ++#define MCFUART_USR 0x04 /* Status register (r) */ ++#define MCFUART_UCSR 0x04 /* Clock Select (w) */ ++#define MCFUART_UCR 0x08 /* Command register (w) */ ++#define MCFUART_URB 0x0c /* Receiver Buffer (r) */ ++#define MCFUART_UTB 0x0c /* Transmit Buffer (w) */ ++#define MCFUART_UIPCR 0x10 /* Input Port Change (r) */ ++#define MCFUART_UACR 0x10 /* Auxiliary Control (w) */ ++#define MCFUART_UISR 0x14 /* Interrup Status (r) */ ++#define MCFUART_UIMR 0x14 /* Interrupt Mask (w) */ ++#define MCFUART_UBG1 0x18 /* Baud Rate MSB (r/w) */ ++#define MCFUART_UBG2 0x1c /* Baud Rate LSB (r/w) */ ++#ifdef CONFIG_M5272 ++#define MCFUART_UTF 0x28 /* Transmitter FIFO (r/w) */ ++#define MCFUART_URF 0x2c /* Receiver FIFO (r/w) */ ++#define MCFUART_UFPD 0x30 /* Frac Prec. Divider (r/w) */ ++#else ++#define MCFUART_UIVR 0x30 /* Interrupt Vector (r/w) */ ++#endif ++#define MCFUART_UIPR 0x34 /* Input Port (r) */ ++#define MCFUART_UOP1 0x38 /* Output Port Bit Set (w) */ ++#define MCFUART_UOP0 0x3c /* Output Port Bit Reset (w) */ ++ ++ ++/* ++ * Define bit flags in Mode Register 1 (MR1). ++ */ ++#define MCFUART_MR1_RXRTS 0x80 /* Auto RTS flow control */ ++#define MCFUART_MR1_RXIRQFULL 0x40 /* RX IRQ type FULL */ ++#define MCFUART_MR1_RXIRQRDY 0x00 /* RX IRQ type RDY */ ++#define MCFUART_MR1_RXERRBLOCK 0x20 /* RX block error mode */ ++#define MCFUART_MR1_RXERRCHAR 0x00 /* RX char error mode */ ++ ++#define MCFUART_MR1_PARITYNONE 0x10 /* No parity */ ++#define MCFUART_MR1_PARITYEVEN 0x00 /* Even parity */ ++#define MCFUART_MR1_PARITYODD 0x04 /* Odd parity */ ++#define MCFUART_MR1_PARITYSPACE 0x08 /* Space parity */ ++#define MCFUART_MR1_PARITYMARK 0x0c /* Mark parity */ ++ ++#define MCFUART_MR1_CS5 0x00 /* 5 bits per char */ ++#define MCFUART_MR1_CS6 0x01 /* 6 bits per char */ ++#define MCFUART_MR1_CS7 0x02 /* 7 bits per char */ ++#define MCFUART_MR1_CS8 0x03 /* 8 bits per char */ ++ ++/* ++ * Define bit flags in Mode Register 2 (MR2). ++ */ ++#define MCFUART_MR2_LOOPBACK 0x80 /* Loopback mode */ ++#define MCFUART_MR2_REMOTELOOP 0xc0 /* Remote loopback mode */ ++#define MCFUART_MR2_AUTOECHO 0x40 /* Automatic echo */ ++#define MCFUART_MR2_TXRTS 0x20 /* Assert RTS on TX */ ++#define MCFUART_MR2_TXCTS 0x10 /* Auto CTS flow control */ ++ ++#define MCFUART_MR2_STOP1 0x07 /* 1 stop bit */ ++#define MCFUART_MR2_STOP15 0x08 /* 1.5 stop bits */ ++#define MCFUART_MR2_STOP2 0x0f /* 2 stop bits */ ++ ++/* ++ * Define bit flags in Status Register (USR). ++ */ ++#define MCFUART_USR_RXBREAK 0x80 /* Received BREAK */ ++#define MCFUART_USR_RXFRAMING 0x40 /* Received framing error */ ++#define MCFUART_USR_RXPARITY 0x20 /* Received parity error */ ++#define MCFUART_USR_RXOVERRUN 0x10 /* Received overrun error */ ++#define MCFUART_USR_TXEMPTY 0x08 /* Transmitter empty */ ++#define MCFUART_USR_TXREADY 0x04 /* Transmitter ready */ ++#define MCFUART_USR_RXFULL 0x02 /* Receiver full */ ++#define MCFUART_USR_RXREADY 0x01 /* Receiver ready */ ++ ++#define MCFUART_USR_RXERR (MCFUART_USR_RXBREAK | MCFUART_USR_RXFRAMING | \ ++ MCFUART_USR_RXPARITY | MCFUART_USR_RXOVERRUN) ++ ++/* ++ * Define bit flags in Clock Select Register (UCSR). ++ */ ++#define MCFUART_UCSR_RXCLKTIMER 0xd0 /* RX clock is timer */ ++#define MCFUART_UCSR_RXCLKEXT16 0xe0 /* RX clock is external x16 */ ++#define MCFUART_UCSR_RXCLKEXT1 0xf0 /* RX clock is external x1 */ ++ ++#define MCFUART_UCSR_TXCLKTIMER 0x0d /* TX clock is timer */ ++#define MCFUART_UCSR_TXCLKEXT16 0x0e /* TX clock is external x16 */ ++#define MCFUART_UCSR_TXCLKEXT1 0x0f /* TX clock is external x1 */ ++ ++/* ++ * Define bit flags in Command Register (UCR). ++ */ ++#define MCFUART_UCR_CMDNULL 0x00 /* No command */ ++#define MCFUART_UCR_CMDRESETMRPTR 0x10 /* Reset MR pointer */ ++#define MCFUART_UCR_CMDRESETRX 0x20 /* Reset receiver */ ++#define MCFUART_UCR_CMDRESETTX 0x30 /* Reset transmitter */ ++#define MCFUART_UCR_CMDRESETERR 0x40 /* Reset error status */ ++#define MCFUART_UCR_CMDRESETBREAK 0x50 /* Reset BREAK change */ ++#define MCFUART_UCR_CMDBREAKSTART 0x60 /* Start BREAK */ ++#define MCFUART_UCR_CMDBREAKSTOP 0x70 /* Stop BREAK */ ++ ++#define MCFUART_UCR_TXNULL 0x00 /* No TX command */ ++#define MCFUART_UCR_TXENABLE 0x04 /* Enable TX */ ++#define MCFUART_UCR_TXDISABLE 0x08 /* Disable TX */ ++#define MCFUART_UCR_RXNULL 0x00 /* No RX command */ ++#define MCFUART_UCR_RXENABLE 0x01 /* Enable RX */ ++#define MCFUART_UCR_RXDISABLE 0x02 /* Disable RX */ ++ ++/* ++ * Define bit flags in Input Port Change Register (UIPCR). ++ */ ++#define MCFUART_UIPCR_CTSCOS 0x10 /* CTS change of state */ ++#define MCFUART_UIPCR_CTS 0x01 /* CTS value */ ++ ++/* ++ * Define bit flags in Input Port Register (UIP). ++ */ ++#define MCFUART_UIPR_CTS 0x01 /* CTS value */ ++ ++/* ++ * Define bit flags in Output Port Registers (UOP). ++ * Clear bit by writing to UOP0, set by writing to UOP1. ++ */ ++#define MCFUART_UOP_RTS 0x01 /* RTS set or clear */ ++ ++/* ++ * Define bit flags in the Auxiliary Control Register (UACR). ++ */ ++#define MCFUART_UACR_IEC 0x01 /* Input enable control */ ++ ++/* ++ * Define bit flags in Interrupt Status Register (UISR). ++ * These same bits are used for the Interrupt Mask Register (UIMR). ++ */ ++#define MCFUART_UIR_COS 0x80 /* Change of state (CTS) */ ++#define MCFUART_UIR_DELTABREAK 0x04 /* Break start or stop */ ++#define MCFUART_UIR_RXREADY 0x02 /* Receiver ready */ ++#define MCFUART_UIR_TXREADY 0x01 /* Transmitter ready */ ++ ++#ifdef CONFIG_M5272 ++/* ++ * Define bit flags in the Transmitter FIFO Register (UTF). ++ */ ++#define MCFUART_UTF_TXB 0x1f /* Transmitter data level */ ++#define MCFUART_UTF_FULL 0x20 /* Transmitter fifo full */ ++#define MCFUART_UTF_TXS 0xc0 /* Transmitter status */ ++ ++/* ++ * Define bit flags in the Receiver FIFO Register (URF). ++ */ ++#define MCFUART_URF_RXB 0x1f /* Receiver data level */ ++#define MCFUART_URF_FULL 0x20 /* Receiver fifo full */ ++#define MCFUART_URF_RXS 0xc0 /* Receiver status */ ++#endif ++ ++#endif /* mcfuart_h */ diff --git a/target/linux/coldfire/patches/004-m5445x_headers.patch b/target/linux/coldfire/patches/004-m5445x_headers.patch new file mode 100644 index 0000000000..3a72bf65d0 --- /dev/null +++ b/target/linux/coldfire/patches/004-m5445x_headers.patch @@ -0,0 +1,5136 @@ +From fa0f89c9cf9ceecc3feac1d96914c8e91f98d90f Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Wed, 31 Oct 2007 16:43:01 -0600 +Subject: [PATCH] Add MCF5445x Specific Header Files. + +LTIBName: m5445x-headers +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + include/asm-m68k/mcf5445x_ccm.h | 161 ++++ + include/asm-m68k/mcf5445x_dspi.h | 402 ++++++++++ + include/asm-m68k/mcf5445x_dtim.h | 87 +++ + include/asm-m68k/mcf5445x_edma.h | 1458 ++++++++++++++++++++++++++++++++++++ + include/asm-m68k/mcf5445x_eport.h | 117 +++ + include/asm-m68k/mcf5445x_fbcs.h | 182 +++++ + include/asm-m68k/mcf5445x_gpio.h | 1257 +++++++++++++++++++++++++++++++ + include/asm-m68k/mcf5445x_i2c.h | 39 + + include/asm-m68k/mcf5445x_intc.h | 724 ++++++++++++++++++ + include/asm-m68k/mcf5445x_pci.h | 238 ++++++ + include/asm-m68k/mcf5445x_pciarb.h | 40 + + include/asm-m68k/mcf5445x_sdramc.h | 115 +++ + include/asm-m68k/mcf5445x_ssi.h | 187 +++++ + include/asm-m68k/mcf5445x_usb.h | 49 ++ + 14 files changed, 5056 insertions(+), 0 deletions(-) + create mode 100644 include/asm-m68k/mcf5445x_ccm.h + create mode 100644 include/asm-m68k/mcf5445x_dspi.h + create mode 100644 include/asm-m68k/mcf5445x_dtim.h + create mode 100644 include/asm-m68k/mcf5445x_edma.h + create mode 100644 include/asm-m68k/mcf5445x_eport.h + create mode 100644 include/asm-m68k/mcf5445x_fbcs.h + create mode 100644 include/asm-m68k/mcf5445x_gpio.h + create mode 100644 include/asm-m68k/mcf5445x_i2c.h + create mode 100644 include/asm-m68k/mcf5445x_intc.h + create mode 100644 include/asm-m68k/mcf5445x_pci.h + create mode 100644 include/asm-m68k/mcf5445x_pciarb.h + create mode 100644 include/asm-m68k/mcf5445x_sdramc.h + create mode 100644 include/asm-m68k/mcf5445x_ssi.h + create mode 100644 include/asm-m68k/mcf5445x_usb.h + +--- /dev/null ++++ b/include/asm-m68k/mcf5445x_ccm.h +@@ -0,0 +1,161 @@ ++/* ++ * Matt Waddel Matt.Waddel@freescale.com ++ * ++ * Copyright Freescale Semiconductor, Inc. 2007 ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ */ ++ ++#ifndef __MCF5445X_CCM_H__ ++#define __MCF5445X_CCM_H__ ++ ++/********************************************************************* ++* ++* Chip Configuration Module (CCM) ++* ++*********************************************************************/ ++ ++/* Register read/write macros */ ++#define MCF_CCM_CCR MCF_REG16(0xFC0A0004) /* Chip Configuration Register (Read-only) (256 or 360 TEPBGA) */ ++#define MCF_CCM_RCON MCF_REG16(0xFC0A0008) /* Reset Configuration (Read-only) (256 or 360 TEPBGA) */ ++#define MCF_CCM_CIR MCF_REG16(0xFC0A000A) /* Chip Identification Register (Read-only) */ ++#define MCF_CCM_MISCCR MCF_REG16(0xFC0A0010) /* Miscellaneous Control Register */ ++#define MCF_CCM_CDR MCF_REG16(0xFC0A0012) /* Clock Divider Register */ ++#define MCF_CCM_UOCSR MCF_REG16(0xFC0A0014) /* USB On-the-Go Controller Status Register */ ++#define MCF_CCM_SBFSR MCF_REG16(0xFC0A0018) /* Serial Boot Facility Status Register (Read Only) */ ++#define MCF_CCM_SBFCR MCF_REG16(0xFC0A0020) /* Serial Boot Facility Control Register */ ++ ++/* Bit definitions and macros for CCR_360 */ ++#define MCF_CCM_CCR_360_PLLMULT2(x) (((x) & 0x0003)) /* 2-Bit PLL clock mode */ ++#define MCF_CCM_CCR_360_PCISLEW (0x0004) /* PCI pad slew rate mode */ ++#define MCF_CCM_CCR_360_PCIMODE (0x0008) /* PCI host/agent mode */ ++#define MCF_CCM_CCR_360_PLLMODE (0x0010) /* PLL Mode */ ++#define MCF_CCM_CCR_360_FBCONFIG(x) (((x) & 0x0007) << 5) /* Flexbus/PCI port size configuration */ ++#define MCF_CCM_CCR_360_PLLMULT3(x) (((x) & 0x0007)) /* 3-Bit PLL Clock Mode */ ++#define MCF_CCM_CCR_360_OSCMODE (0x0008) /* Oscillator Clock Mode */ ++#define MCF_CCM_CCR_360_FBCONFIG_MASK (0x00E0) ++#define MCF_CCM_CCR_360_PLLMULT2_MASK (0x0003) ++#define MCF_CCM_CCR_360_PLLMULT3_MASK (0x0007) ++#define MCF_CCM_CCR_360_FBCONFIG_NM_NP_32 (0x0000) ++#define MCF_CCM_CCR_360_FBCONFIG_NM_NP_8 (0x0020) ++#define MCF_CCM_CCR_360_FBCONFIG_NM_NP_16 (0x0040) ++#define MCF_CCM_CCR_360_FBCONFIG_M_P_16 (0x0060) ++#define MCF_CCM_CCR_360_FBCONFIG_M_NP_32 (0x0080) ++#define MCF_CCM_CCR_360_FBCONFIG_M_NP_8 (0x00A0) ++#define MCF_CCM_CCR_360_FBCONFIG_M_NP_16 (0x00C0) ++#define MCF_CCM_CCR_360_FBCONFIG_M_P_8 (0x00E0) ++#define MCF_CCM_CCR_360_PLLMULT2_12X (0x0000) ++#define MCF_CCM_CCR_360_PLLMULT2_6X (0x0001) ++#define MCF_CCM_CCR_360_PLLMULT2_16X (0x0002) ++#define MCF_CCM_CCR_360_PLLMULT2_8X (0x0003) ++#define MCF_CCM_CCR_360_PLLMULT3_20X (0x0000) ++#define MCF_CCM_CCR_360_PLLMULT3_10X (0x0001) ++#define MCF_CCM_CCR_360_PLLMULT3_24X (0x0002) ++#define MCF_CCM_CCR_360_PLLMULT3_18X (0x0003) ++#define MCF_CCM_CCR_360_PLLMULT3_12X (0x0004) ++#define MCF_CCM_CCR_360_PLLMULT3_6X (0x0005) ++#define MCF_CCM_CCR_360_PLLMULT3_16X (0x0006) ++#define MCF_CCM_CCR_360_PLLMULT3_8X (0x0007) ++ ++/* Bit definitions and macros for CCR_256 */ ++#define MCF_CCM_CCR_256_PLLMULT3(x) (((x) & 0x0007)) /* 3-Bit PLL clock mode */ ++#define MCF_CCM_CCR_256_OSCMODE (0x0008) /* Oscillator clock mode */ ++#define MCF_CCM_CCR_256_PLLMODE (0x0010) /* PLL Mode */ ++#define MCF_CCM_CCR_256_FBCONFIG(x) (((x) & 0x0007) << 5) /* Flexbus/PCI port size configuration */ ++#define MCF_CCM_CCR_256_FBCONFIG_MASK (0x00E0) ++#define MCF_CCM_CCR_256_FBCONFIG_NM_32 (0x0000) ++#define MCF_CCM_CCR_256_FBCONFIG_NM_8 (0x0020) ++#define MCF_CCM_CCR_256_FBCONFIG_NM_16 (0x0040) ++#define MCF_CCM_CCR_256_FBCONFIG_M_32 (0x0080) ++#define MCF_CCM_CCR_256_FBCONFIG_M_8 (0x00A0) ++#define MCF_CCM_CCR_256_FBCONFIG_M_16 (0x00C0) ++#define MCF_CCM_CCR_256_PLLMULT3_MASK (0x0007) ++#define MCF_CCM_CCR_256_PLLMULT3_20X (0x0000) ++#define MCF_CCM_CCR_256_PLLMULT3_10X (0x0001) ++#define MCF_CCM_CCR_256_PLLMULT3_24X (0x0002) ++#define MCF_CCM_CCR_256_PLLMULT3_18X (0x0003) ++#define MCF_CCM_CCR_256_PLLMULT3_12X (0x0004) ++#define MCF_CCM_CCR_256_PLLMULT3_6X (0x0005) ++#define MCF_CCM_CCR_256_PLLMULT3_16X (0x0006) ++#define MCF_CCM_CCR_256_PLLMULT3_8X (0x0007) ++ ++/* Bit definitions and macros for RCON_360 */ ++#define MCF_CCM_RCON_360_PLLMULT(x) (((x)&0x0003)) /* PLL clock mode */ ++#define MCF_CCM_RCON_360_PCISLEW (0x0004) /* PCI pad slew rate mode */ ++#define MCF_CCM_RCON_360_PCIMODE (0x0008) /* PCI host/agent mode */ ++#define MCF_CCM_RCON_360_PLLMODE (0x0010) /* PLL Mode */ ++#define MCF_CCM_RCON_360_FBCONFIG(x) (((x) & 0x0007) << 5) /* Flexbus/PCI port size configuration */ ++ ++/* Bit definitions and macros for RCON_256 */ ++#define MCF_CCM_RCON_256_PLLMULT(x) (((x) & 0x0007)) /* PLL clock mode */ ++#define MCF_CCM_RCON_256_OSCMODE (0x0008) /* Oscillator clock mode */ ++#define MCF_CCM_RCON_256_PLLMODE (0x0010) /* PLL Mode */ ++#define MCF_CCM_RCON_256_FBCONFIG(x) (((x) & 0x0007) << 5) /* Flexbus/PCI port size configuration */ ++ ++/* Bit definitions and macros for CIR */ ++#define MCF_CCM_CIR_PRN(x) (((x) & 0x003F)) /* Part revision number */ ++#define MCF_CCM_CIR_PIN(x) (((x) & 0x03FF) << 6) /* Part identification number */ ++#define MCF_CCM_CIR_PIN_MASK (0xFFC0) ++#define MCF_CCM_CIR_PRN_MASK (0x003F) ++#define MCF_CCM_CIR_PIN_MCF54450 (0x4F << 6) ++#define MCF_CCM_CIR_PIN_MCF54451 (0x4D << 6) ++#define MCF_CCM_CIR_PIN_MCF54452 (0x4B << 6) ++#define MCF_CCM_CIR_PIN_MCF54453 (0x49 << 6) ++#define MCF_CCM_CIR_PIN_MCF54454 (0x4A << 6) ++#define MCF_CCM_CIR_PIN_MCF54455 (0x48 << 6) ++ ++/* Bit definitions and macros for MISCCR */ ++#define MCF_CCM_MISCCR_USBSRC (0x0001) /* USB clock source */ ++#define MCF_CCM_MISCCR_USBOC (0x0002) /* USB VBUS over-current sense polarity */ ++#define MCF_CCM_MISCCR_USBPUE (0x0004) /* USB transceiver pull-up enable */ ++#define MCF_CCM_MISCCR_SSISRC (0x0010) /* SSI clock source */ ++#define MCF_CCM_MISCCR_TIMDMA (0x0020) /* Timer DMA mux selection */ ++#define MCF_CCM_MISCCR_SSIPUS (0x0040) /* SSI RXD/TXD pull select */ ++#define MCF_CCM_MISCCR_SSIPUE (0x0080) /* SSI RXD/TXD pull enable */ ++#define MCF_CCM_MISCCR_BMT(x) (((x) & 0x0007) << 8) /* Bus monitor timing field */ ++#define MCF_CCM_MISCCR_BME (0x0800) /* Bus monitor external enable bit */ ++#define MCF_CCM_MISCCR_LIMP (0x1000) /* Limp mode enable */ ++#define MCF_CCM_MISCCR_BMT_65536 (0) ++#define MCF_CCM_MISCCR_BMT_32768 (1) ++#define MCF_CCM_MISCCR_BMT_16384 (2) ++#define MCF_CCM_MISCCR_BMT_8192 (3) ++#define MCF_CCM_MISCCR_BMT_4096 (4) ++#define MCF_CCM_MISCCR_BMT_2048 (5) ++#define MCF_CCM_MISCCR_BMT_1024 (6) ++#define MCF_CCM_MISCCR_BMT_512 (7) ++#define MCF_CCM_MISCCR_SSIPUS_UP (1) ++#define MCF_CCM_MISCCR_SSIPUS_DOWN (0) ++#define MCF_CCM_MISCCR_TIMDMA_TIM (1) ++#define MCF_CCM_MISCCR_TIMDMA_SSI (0) ++#define MCF_CCM_MISCCR_SSISRC_CLKIN (0) ++#define MCF_CCM_MISCCR_SSISRC_PLL (1) ++#define MCF_CCM_MISCCR_USBOC_ACTHI (0) ++#define MCF_CCM_MISCCR_USBOV_ACTLO (1) ++#define MCF_CCM_MISCCR_USBSRC_CLKIN (0) ++#define MCF_CCM_MISCCR_USBSRC_PLL (1) ++ ++/* Bit definitions and macros for CDR */ ++#define MCF_CCM_CDR_SSIDIV(x) (((x) & 0x00FF)) /* SSI oversampling clock divider */ ++#define MCF_CCM_CDR_LPDIV(x) (((x) & 0x000F) << 8) /* Low power clock divider */ ++ ++/* Bit definitions and macros for UOCSR */ ++#define MCF_CCM_UOCSR_XPDE (0x0001) /* On-chip transceiver pull-down enable */ ++#define MCF_CCM_UOCSR_UOMIE (0x0002) /* USB OTG misc interrupt enable */ ++#define MCF_CCM_UOCSR_WKUP (0x0004) /* USB OTG controller wake-up event */ ++#define MCF_CCM_UOCSR_PWRFLT (0x0008) /* VBUS power fault */ ++#define MCF_CCM_UOCSR_SEND (0x0010) /* Session end */ ++#define MCF_CCM_UOCSR_VVLD (0x0020) /* VBUS valid indicator */ ++#define MCF_CCM_UOCSR_BVLD (0x0040) /* B-peripheral valid indicator */ ++#define MCF_CCM_UOCSR_AVLD (0x0080) /* A-peripheral valid indicator */ ++#define MCF_CCM_UOCSR_DPPU (0x0100) /* D+ pull-up for FS enabled (read-only) */ ++#define MCF_CCM_UOCSR_DCR_VBUS (0x0200) /* VBUS discharge resistor enabled (read-only) */ ++#define MCF_CCM_UOCSR_CRG_VBUS (0x0400) /* VBUS charge resistor enabled (read-only) */ ++#define MCF_CCM_UOCSR_DMPD (0x1000) /* D- 15Kohm pull-down (read-only) */ ++#define MCF_CCM_UOCSR_DPPD (0x2000) /* D+ 15Kohm pull-down (read-only) */ ++ ++/********************************************************************/ ++ ++#endif /* __MCF5445X_CCM_H__ */ +--- /dev/null ++++ b/include/asm-m68k/mcf5445x_dspi.h +@@ -0,0 +1,402 @@ ++/* ++ * Yaroslav Vinogradov yaroslav.vinogradov@freescale.com ++ * ++ * Copyright Freescale Semiconductor, Inc. 2007 ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ */ ++ ++#ifndef __MCF5445X_DSPI_H__ ++#define __MCF5445X_DSPI_H__ ++ ++/********************************************************************* ++* ++* DMA Serial Peripheral Interface (DSPI) ++* ++*********************************************************************/ ++ ++/* Register read/write macros */ ++#define MCF_DSPI_DMCR MCF_REG32(0xFC05C000) /* DSPI Module Configuration Register */ ++#define MCF_DSPI_DTCR MCF_REG32(0xFC05C008) /* DSPI Transfer Count Register */ ++#define MCF_DSPI_DCTAR0 MCF_REG32(0xFC05C00C) /* DSPI Clock and Transfer Attributes Register */ ++#define MCF_DSPI_DCTAR1 MCF_REG32(0xFC05C010) /* DSPI Clock and Transfer Attributes Register */ ++#define MCF_DSPI_DCTAR2 MCF_REG32(0xFC05C014) /* DSPI Clock and Transfer Attributes Register */ ++#define MCF_DSPI_DCTAR3 MCF_REG32(0xFC05C018) /* DSPI Clock and Transfer Attributes Register */ ++#define MCF_DSPI_DCTAR4 MCF_REG32(0xFC05C01C) /* DSPI Clock and Transfer Attributes Register */ ++#define MCF_DSPI_DCTAR5 MCF_REG32(0xFC05C020) /* DSPI Clock and Transfer Attributes Register */ ++#define MCF_DSPI_DCTAR6 MCF_REG32(0xFC05C024) /* DSPI Clock and Transfer Attributes Register */ ++#define MCF_DSPI_DCTAR7 MCF_REG32(0xFC05C028) /* DSPI Clock and Transfer Attributes Register */ ++#define MCF_DSPI_DSR MCF_REG32(0xFC05C02C) /* DSPI Status Register */ ++#define MCF_DSPI_DRSER MCF_REG32(0xFC05C030) /* DSPI DMA/Interrupt Request Select and Enable Register */ ++#define MCF_DSPI_DTFR MCF_REG32(0xFC05C034) /* DSPI Transmit FIFO Register */ ++#define MCF_DSPI_DRFR MCF_REG32(0xFC05C038) /* DSPI Receive FIFO Register */ ++#define MCF_DSPI_DTFDR0 MCF_REG32(0xFC05C03C) /* DSPI Transmit FIFO Debugging Registers */ ++#define MCF_DSPI_DTFDR1 MCF_REG32(0xFC05C040) /* DSPI Transmit FIFO Debugging Registers */ ++#define MCF_DSPI_DTFDR2 MCF_REG32(0xFC05C044) /* DSPI Transmit FIFO Debugging Registers */ ++#define MCF_DSPI_DTFDR3 MCF_REG32(0xFC05C048) /* DSPI Transmit FIFO Debugging Registers */ ++#define MCF_DSPI_DRFDR0 MCF_REG32(0xFC05C07C) /* DSPI Receive FIFO Debugging Registers */ ++#define MCF_DSPI_DRFDR1 MCF_REG32(0xFC05C080) /* DSPI Receive FIFO Debugging Registers */ ++#define MCF_DSPI_DRFDR2 MCF_REG32(0xFC05C084) /* DSPI Receive FIFO Debugging Registers */ ++#define MCF_DSPI_DRFDR3 MCF_REG32(0xFC05C088) /* DSPI Receive FIFO Debugging Registers */ ++ ++/* Parameterized register read/write macros for multiple registers */ ++#define MCF_DSPI_DCTAR(x) MCF_REG32(0xFC05C00C+((x)*0x004)) /* DSPI Clock and Transfer Attributes Register */ ++#define MCF_DSPI_DTFDR(x) MCF_REG32(0xFC05C03C+((x)*0x004)) /* DSPI Transmit FIFO Debugging Registers */ ++#define MCF_DSPI_DRFDR(x) MCF_REG32(0xFC05C07C+((x)*0x004)) /* DSPI Receive FIFO Debugging Registers */ ++ ++/* Bit definitions and macros for DMCR */ ++#define MCF_DSPI_DMCR_HALT (0x00000001) /* Halt -- stops and starts DSPI transfers */ ++#define MCF_DSPI_DMCR_SMPLPT(x) (((x)&0x00000003)<<8) /* Sample point selection */ ++#define MCF_DSPI_DMCR_CLRRXF (0x00000400) /* Clear receive FIFO */ ++#define MCF_DSPI_DMCR_CLRTXF (0x00000800) /* Clear transmit FIFO */ ++#define MCF_DSPI_DMCR_DISRXF (0x00001000) /* Disable receive FIFO */ ++#define MCF_DSPI_DMCR_DISTXF (0x00002000) /* Disable transmit FIFO */ ++#define MCF_DSPI_DMCR_MDIS (0x00004000) /* Module Disable */ ++#define MCF_DSPI_DMCR_PCSIS0 (0x00010000) /* Peripheral chip-select 0 inactive state */ ++#define MCF_DSPI_DMCR_PCSIS1 (0x00020000) /* Peripheral chip-select 1 inactive state */ ++#define MCF_DSPI_DMCR_PCSIS2 (0x00040000) /* Peripheral chip-select 2 inactive state */ ++#define MCF_DSPI_DMCR_PCSIS3 (0x00080000) /* Peripheral chip-select 3 inactive state */ ++#define MCF_DSPI_DMCR_PCSIS4 (0x00100000) /* Peripheral chip-select 4 inactive state */ ++#define MCF_DSPI_DMCR_PCSIS5 (0x00200000) /* Peripheral chip-select 5 inactive state */ ++#define MCF_DSPI_DMCR_PCSIS6 (0x00400000) /* Peripheral chip-select 6 inactive state */ ++#define MCF_DSPI_DMCR_PCSIS7 (0x00800000) /* Peripheral chip-select 7 inactive state */ ++#define MCF_DSPI_DMCR_ROOE (0x01000000) /* Receive FIFO overflow overwrite enable */ ++#define MCF_DSPI_DMCR_PCSSE (0x02000000) /* Peripheral chip select strobe enable */ ++#define MCF_DSPI_DMCR_MTFE (0x04000000) /* Modified timing format enable */ ++#define MCF_DSPI_DMCR_FRZ (0x08000000) /* Freeze */ ++#define MCF_DSPI_DMCR_DCONF(x) (((x)&0x00000003)<<28) /* DSPI configuration */ ++#define MCF_DSPI_DMCR_CONT_SCKE (0x40000000) /* Continuous SCK enable */ ++#define MCF_DSPI_DMCR_MSTR (0x80000000) /* Master/Slave mode select */ ++#define MCF_DSPI_DMCR_DCONF_SPI (0x00000000) ++#define MCF_DSPI_DMCR_PCSIS7_LOW (0x00000000) ++#define MCF_DSPI_DMCR_PCSIS7_HIGH (0x00800000) ++#define MCF_DSPI_DMCR_PCSIS6_LOW (0x00000000) ++#define MCF_DSPI_DMCR_PCSIS6_HIGH (0x00400000) ++#define MCF_DSPI_DMCR_PCSIS5_LOW (0x00000000) ++#define MCF_DSPI_DMCR_PCSIS5_HIGH (0x00200000) ++#define MCF_DSPI_DMCR_PCSIS4_LOW (0x00000000) ++#define MCF_DSPI_DMCR_PCSIS4_HIGH (0x00100000) ++#define MCF_DSPI_DMCR_PCSIS3_LOW (0x00000000) ++#define MCF_DSPI_DMCR_PCSIS3_HIGH (0x00080000) ++#define MCF_DSPI_DMCR_PCSIS2_LOW (0x00000000) ++#define MCF_DSPI_DMCR_PCSIS2_HIGH (0x00040000) ++#define MCF_DSPI_DMCR_PCSIS1_LOW (0x00000000) ++#define MCF_DSPI_DMCR_PCSIS1_HIGH (0x00020000) ++#define MCF_DSPI_DMCR_PCSIS0_LOW (0x00000000) ++#define MCF_DSPI_DMCR_PCSIS0_HIGH (0x00010000) ++ ++/* Bit definitions and macros for DTCR */ ++#define MCF_DSPI_DTCR_SPI_TCNT(x) (((x)&0x0000FFFF)<<16) /* SPI transfer count */ ++ ++/* Bit definitions and macros for DCTAR group */ ++#define MCF_DSPI_DCTAR_BR(x) (((x)&0x0000000F)) /* Baud rate scaler */ ++#define MCF_DSPI_DCTAR_DT(x) (((x)&0x0000000F)<<4) /* Delay after transfer scaler */ ++#define MCF_DSPI_DCTAR_ASC(x) (((x)&0x0000000F)<<8) /* After SCK delay scaler */ ++#define MCF_DSPI_DCTAR_CSSCK(x) (((x)&0x0000000F)<<12) /* PCS to SCK delay scaler */ ++#define MCF_DSPI_DCTAR_PBR(x) (((x)&0x00000003)<<16) /* Baud rate prescaler */ ++#define MCF_DSPI_DCTAR_PDT(x) (((x)&0x00000003)<<18) /* Delay after transfer prescaler */ ++#define MCF_DSPI_DCTAR_PASC(x) (((x)&0x00000003)<<20) /* After SCK delay prescaler */ ++#define MCF_DSPI_DCTAR_PCSSCK(x) (((x)&0x00000003)<<22) /* PCS to SCK delay prescaler */ ++#define MCF_DSPI_DCTAR_LSBFE (0x01000000) /* LSB first enable */ ++#define MCF_DSPI_DCTAR_CPHA (0x02000000) /* Clock phase */ ++#define MCF_DSPI_DCTAR_CPOL (0x04000000) /* Clock polarity */ ++#define MCF_DSPI_DCTAR_FMSZ(x) (((x)&0x0000000F)<<27) /* Frame size */ ++#define MCF_DSPI_DCTAR_DBR (0x80000000) /* Double baud rate */ ++#define MCF_DSPI_DCTAR_CPOL_LOW (0x00000000) ++#define MCF_DSPI_DCTAR_CPOL_HIGH (0x04000000) ++#define MCF_DSPI_DCTAR_CPHA_LATCH_RISING (0x00000000) ++#define MCF_DSPI_DCTAR_CPHA_LATCH_FALLING (0x02000000) ++#define MCF_DSPI_DCTAR_PCSSCK_1CLK (0x00000000) ++#define MCF_DSPI_DCTAR_PCSSCK_3CLK (0x00400000) ++#define MCF_DSPI_DCTAR_PCSSCK_5CLK (0x00800000) ++#define MCF_DSPI_DCTAR_PCSSCK_7CLK (0x00C00000) ++#define MCF_DSPI_DCTAR_PASC_1CLK (0x00000000) ++#define MCF_DSPI_DCTAR_PASC_3CLK (0x00100000) ++#define MCF_DSPI_DCTAR_PASC_5CLK (0x00200000) ++#define MCF_DSPI_DCTAR_PASC_7CLK (0x00300000) ++#define MCF_DSPI_DCTAR_PDT_1CLK (0x00000000) ++#define MCF_DSPI_DCTAR_PDT_3CLK (0x00040000) ++#define MCF_DSPI_DCTAR_PDT_5CLK (0x00080000) ++#define MCF_DSPI_DCTAR_PDT_7CLK (0x000C0000) ++#define MCF_DSPI_DCTAR_PBR_2CLK (0x00000000) ++#define MCF_DSPI_DCTAR_PBR_3CLK (0x00010000) ++#define MCF_DSPI_DCTAR_PBR_5CLK (0x00020000) ++#define MCF_DSPI_DCTAR_PBR_7CLK (0x00030000) ++ ++/* Bit definitions and macros for DCTAR0 */ ++#define MCF_DSPI_DCTAR0_BR(x) (((x)&0x0000000F)) /* Baud rate scaler */ ++#define MCF_DSPI_DCTAR0_DT(x) (((x)&0x0000000F)<<4) /* Delay after transfer scaler */ ++#define MCF_DSPI_DCTAR0_ASC(x) (((x)&0x0000000F)<<8) /* After SCK delay scaler */ ++#define MCF_DSPI_DCTAR0_CSSCK(x) (((x)&0x0000000F)<<12) /* PCS to SCK delay scaler */ ++#define MCF_DSPI_DCTAR0_PBR(x) (((x)&0x00000003)<<16) /* Baud rate prescaler */ ++#define MCF_DSPI_DCTAR0_PDT(x) (((x)&0x00000003)<<18) /* Delay after transfer prescaler */ ++#define MCF_DSPI_DCTAR0_PASC(x) (((x)&0x00000003)<<20) /* After SCK delay prescaler */ ++#define MCF_DSPI_DCTAR0_PCSSCK(x) (((x)&0x00000003)<<22) /* PCS to SCK delay prescaler */ ++#define MCF_DSPI_DCTAR0_LSBFE (0x01000000) /* LSB first enable */ ++#define MCF_DSPI_DCTAR0_CPHA (0x02000000) /* Clock phase */ ++#define MCF_DSPI_DCTAR0_CPOL (0x04000000) /* Clock polarity */ ++#define MCF_DSPI_DCTAR0_FMSZ(x) (((x)&0x0000000F)<<27) /* Frame size */ ++#define MCF_DSPI_DCTAR0_DBR (0x80000000) /* Double baud rate */ ++#define MCF_DSPI_DCTAR0_CPOL_LOW (0x00000000) ++#define MCF_DSPI_DCTAR0_CPOL_HIGH (0x04000000) ++#define MCF_DSPI_DCTAR0_CPHA_LATCH_RISING (0x00000000) ++#define MCF_DSPI_DCTAR0_CPHA_LATCH_FALLING (0x02000000) ++#define MCF_DSPI_DCTAR0_PCSSCK_1CLK (0x00000000) ++#define MCF_DSPI_DCTAR0_PCSSCK_3CLK (0x00400000) ++#define MCF_DSPI_DCTAR0_PCSSCK_5CLK (0x00800000) ++#define MCF_DSPI_DCTAR0_PCSSCK_7CLK (0x00C00000) ++#define MCF_DSPI_DCTAR0_PASC_1CLK (0x00000000) ++#define MCF_DSPI_DCTAR0_PASC_3CLK (0x00100000) ++#define MCF_DSPI_DCTAR0_PASC_5CLK (0x00200000) ++#define MCF_DSPI_DCTAR0_PASC_7CLK (0x00300000) ++#define MCF_DSPI_DCTAR0_PDT_1CLK (0x00000000) ++#define MCF_DSPI_DCTAR0_PDT_3CLK (0x00040000) ++#define MCF_DSPI_DCTAR0_PDT_5CLK (0x00080000) ++#define MCF_DSPI_DCTAR0_PDT_7CLK (0x000C0000) ++#define MCF_DSPI_DCTAR0_PBR_2CLK (0x00000000) ++#define MCF_DSPI_DCTAR0_PBR_3CLK (0x00010000) ++#define MCF_DSPI_DCTAR0_PBR_5CLK (0x00020000) ++#define MCF_DSPI_DCTAR0_PBR_7CLK (0x00030000) ++ ++/* Bit definitions and macros for DCTAR1 */ ++#define MCF_DSPI_DCTAR1_BR(x) (((x)&0x0000000F)) /* Baud rate scaler */ ++#define MCF_DSPI_DCTAR1_DT(x) (((x)&0x0000000F)<<4) /* Delay after transfer scaler */ ++#define MCF_DSPI_DCTAR1_ASC(x) (((x)&0x0000000F)<<8) /* After SCK delay scaler */ ++#define MCF_DSPI_DCTAR1_CSSCK(x) (((x)&0x0000000F)<<12) /* PCS to SCK delay scaler */ ++#define MCF_DSPI_DCTAR1_PBR(x) (((x)&0x00000003)<<16) /* Baud rate prescaler */ ++#define MCF_DSPI_DCTAR1_PDT(x) (((x)&0x00000003)<<18) /* Delay after transfer prescaler */ ++#define MCF_DSPI_DCTAR1_PASC(x) (((x)&0x00000003)<<20) /* After SCK delay prescaler */ ++#define MCF_DSPI_DCTAR1_PCSSCK(x) (((x)&0x00000003)<<22) /* PCS to SCK delay prescaler */ ++#define MCF_DSPI_DCTAR1_LSBFE (0x01000000) /* LSB first enable */ ++#define MCF_DSPI_DCTAR1_CPHA (0x02000000) /* Clock phase */ ++#define MCF_DSPI_DCTAR1_CPOL (0x04000000) /* Clock polarity */ ++#define MCF_DSPI_DCTAR1_FMSZ(x) (((x)&0x0000000F)<<27) /* Frame size */ ++#define MCF_DSPI_DCTAR1_DBR (0x80000000) /* Double baud rate */ ++ ++/* Bit definitions and macros for DCTAR2 */ ++#define MCF_DSPI_DCTAR2_BR(x) (((x)&0x0000000F)) /* Baud rate scaler */ ++#define MCF_DSPI_DCTAR2_DT(x) (((x)&0x0000000F)<<4) /* Delay after transfer scaler */ ++#define MCF_DSPI_DCTAR2_ASC(x) (((x)&0x0000000F)<<8) /* After SCK delay scaler */ ++#define MCF_DSPI_DCTAR2_CSSCK(x) (((x)&0x0000000F)<<12) /* PCS to SCK delay scaler */ ++#define MCF_DSPI_DCTAR2_PBR(x) (((x)&0x00000003)<<16) /* Baud rate prescaler */ ++#define MCF_DSPI_DCTAR2_PDT(x) (((x)&0x00000003)<<18) /* Delay after transfer prescaler */ ++#define MCF_DSPI_DCTAR2_PASC(x) (((x)&0x00000003)<<20) /* After SCK delay prescaler */ ++#define MCF_DSPI_DCTAR2_PCSSCK(x) (((x)&0x00000003)<<22) /* PCS to SCK delay prescaler */ ++#define MCF_DSPI_DCTAR2_LSBFE (0x01000000) /* LSB first enable */ ++#define MCF_DSPI_DCTAR2_CPHA (0x02000000) /* Clock phase */ ++#define MCF_DSPI_DCTAR2_CPOL (0x04000000) /* Clock polarity */ ++#define MCF_DSPI_DCTAR2_FMSZ(x) (((x)&0x0000000F)<<27) /* Frame size */ ++#define MCF_DSPI_DCTAR2_DBR (0x80000000) /* Double baud rate */ ++ ++/* Bit definitions and macros for DCTAR3 */ ++#define MCF_DSPI_DCTAR3_BR(x) (((x)&0x0000000F)) /* Baud rate scaler */ ++#define MCF_DSPI_DCTAR3_DT(x) (((x)&0x0000000F)<<4) /* Delay after transfer scaler */ ++#define MCF_DSPI_DCTAR3_ASC(x) (((x)&0x0000000F)<<8) /* After SCK delay scaler */ ++#define MCF_DSPI_DCTAR3_CSSCK(x) (((x)&0x0000000F)<<12) /* PCS to SCK delay scaler */ ++#define MCF_DSPI_DCTAR3_PBR(x) (((x)&0x00000003)<<16) /* Baud rate prescaler */ ++#define MCF_DSPI_DCTAR3_PDT(x) (((x)&0x00000003)<<18) /* Delay after transfer prescaler */ ++#define MCF_DSPI_DCTAR3_PASC(x) (((x)&0x00000003)<<20) /* After SCK delay prescaler */ ++#define MCF_DSPI_DCTAR3_PCSSCK(x) (((x)&0x00000003)<<22) /* PCS to SCK delay prescaler */ ++#define MCF_DSPI_DCTAR3_LSBFE (0x01000000) /* LSB first enable */ ++#define MCF_DSPI_DCTAR3_CPHA (0x02000000) /* Clock phase */ ++#define MCF_DSPI_DCTAR3_CPOL (0x04000000) /* Clock polarity */ ++#define MCF_DSPI_DCTAR3_FMSZ(x) (((x)&0x0000000F)<<27) /* Frame size */ ++#define MCF_DSPI_DCTAR3_DBR (0x80000000) /* Double baud rate */ ++ ++/* Bit definitions and macros for DCTAR4 */ ++#define MCF_DSPI_DCTAR4_BR(x) (((x)&0x0000000F)) /* Baud rate scaler */ ++#define MCF_DSPI_DCTAR4_DT(x) (((x)&0x0000000F)<<4) /* Delay after transfer scaler */ ++#define MCF_DSPI_DCTAR4_ASC(x) (((x)&0x0000000F)<<8) /* After SCK delay scaler */ ++#define MCF_DSPI_DCTAR4_CSSCK(x) (((x)&0x0000000F)<<12) /* PCS to SCK delay scaler */ ++#define MCF_DSPI_DCTAR4_PBR(x) (((x)&0x00000003)<<16) /* Baud rate prescaler */ ++#define MCF_DSPI_DCTAR4_PDT(x) (((x)&0x00000003)<<18) /* Delay after transfer prescaler */ ++#define MCF_DSPI_DCTAR4_PASC(x) (((x)&0x00000003)<<20) /* After SCK delay prescaler */ ++#define MCF_DSPI_DCTAR4_PCSSCK(x) (((x)&0x00000003)<<22) /* PCS to SCK delay prescaler */ ++#define MCF_DSPI_DCTAR4_LSBFE (0x01000000) /* LSB first enable */ ++#define MCF_DSPI_DCTAR4_CPHA (0x02000000) /* Clock phase */ ++#define MCF_DSPI_DCTAR4_CPOL (0x04000000) /* Clock polarity */ ++#define MCF_DSPI_DCTAR4_FMSZ(x) (((x)&0x0000000F)<<27) /* Frame size */ ++#define MCF_DSPI_DCTAR4_DBR (0x80000000) /* Double baud rate */ ++ ++/* Bit definitions and macros for DCTAR5 */ ++#define MCF_DSPI_DCTAR5_BR(x) (((x)&0x0000000F)) /* Baud rate scaler */ ++#define MCF_DSPI_DCTAR5_DT(x) (((x)&0x0000000F)<<4) /* Delay after transfer scaler */ ++#define MCF_DSPI_DCTAR5_ASC(x) (((x)&0x0000000F)<<8) /* After SCK delay scaler */ ++#define MCF_DSPI_DCTAR5_CSSCK(x) (((x)&0x0000000F)<<12) /* PCS to SCK delay scaler */ ++#define MCF_DSPI_DCTAR5_PBR(x) (((x)&0x00000003)<<16) /* Baud rate prescaler */ ++#define MCF_DSPI_DCTAR5_PDT(x) (((x)&0x00000003)<<18) /* Delay after transfer prescaler */ ++#define MCF_DSPI_DCTAR5_PASC(x) (((x)&0x00000003)<<20) /* After SCK delay prescaler */ ++#define MCF_DSPI_DCTAR5_PCSSCK(x) (((x)&0x00000003)<<22) /* PCS to SCK delay prescaler */ ++#define MCF_DSPI_DCTAR5_LSBFE (0x01000000) /* LSB first enable */ ++#define MCF_DSPI_DCTAR5_CPHA (0x02000000) /* Clock phase */ ++#define MCF_DSPI_DCTAR5_CPOL (0x04000000) /* Clock polarity */ ++#define MCF_DSPI_DCTAR5_FMSZ(x) (((x)&0x0000000F)<<27) /* Frame size */ ++#define MCF_DSPI_DCTAR5_DBR (0x80000000) /* Double baud rate */ ++ ++/* Bit definitions and macros for DCTAR6 */ ++#define MCF_DSPI_DCTAR6_BR(x) (((x)&0x0000000F)) /* Baud rate scaler */ ++#define MCF_DSPI_DCTAR6_DT(x) (((x)&0x0000000F)<<4) /* Delay after transfer scaler */ ++#define MCF_DSPI_DCTAR6_ASC(x) (((x)&0x0000000F)<<8) /* After SCK delay scaler */ ++#define MCF_DSPI_DCTAR6_CSSCK(x) (((x)&0x0000000F)<<12) /* PCS to SCK delay scaler */ ++#define MCF_DSPI_DCTAR6_PBR(x) (((x)&0x00000003)<<16) /* Baud rate prescaler */ ++#define MCF_DSPI_DCTAR6_PDT(x) (((x)&0x00000003)<<18) /* Delay after transfer prescaler */ ++#define MCF_DSPI_DCTAR6_PASC(x) (((x)&0x00000003)<<20) /* After SCK delay prescaler */ ++#define MCF_DSPI_DCTAR6_PCSSCK(x) (((x)&0x00000003)<<22) /* PCS to SCK delay prescaler */ ++#define MCF_DSPI_DCTAR6_LSBFE (0x01000000) /* LSB first enable */ ++#define MCF_DSPI_DCTAR6_CPHA (0x02000000) /* Clock phase */ ++#define MCF_DSPI_DCTAR6_CPOL (0x04000000) /* Clock polarity */ ++#define MCF_DSPI_DCTAR6_FMSZ(x) (((x)&0x0000000F)<<27) /* Frame size */ ++#define MCF_DSPI_DCTAR6_DBR (0x80000000) /* Double baud rate */ ++ ++/* Bit definitions and macros for DCTAR7 */ ++#define MCF_DSPI_DCTAR7_BR(x) (((x)&0x0000000F)) /* Baud rate scaler */ ++#define MCF_DSPI_DCTAR7_DT(x) (((x)&0x0000000F)<<4) /* Delay after transfer scaler */ ++#define MCF_DSPI_DCTAR7_ASC(x) (((x)&0x0000000F)<<8) /* After SCK delay scaler */ ++#define MCF_DSPI_DCTAR7_CSSCK(x) (((x)&0x0000000F)<<12) /* PCS to SCK delay scaler */ ++#define MCF_DSPI_DCTAR7_PBR(x) (((x)&0x00000003)<<16) /* Baud rate prescaler */ ++#define MCF_DSPI_DCTAR7_PDT(x) (((x)&0x00000003)<<18) /* Delay after transfer prescaler */ ++#define MCF_DSPI_DCTAR7_PASC(x) (((x)&0x00000003)<<20) /* After SCK delay prescaler */ ++#define MCF_DSPI_DCTAR7_PCSSCK(x) (((x)&0x00000003)<<22) /* PCS to SCK delay prescaler */ ++#define MCF_DSPI_DCTAR7_LSBFE (0x01000000) /* LSB first enable */ ++#define MCF_DSPI_DCTAR7_CPHA (0x02000000) /* Clock phase */ ++#define MCF_DSPI_DCTAR7_CPOL (0x04000000) /* Clock polarity */ ++#define MCF_DSPI_DCTAR7_FMSZ(x) (((x)&0x0000000F)<<27) /* Frame size */ ++#define MCF_DSPI_DCTAR7_DBR (0x80000000) /* Double baud rate */ ++ ++/* Bit definitions and macros for DSR */ ++#define MCF_DSPI_DSR_RXPTR(x) (((x)&0x0000000F)) /* Receive next pointer */ ++#define MCF_DSPI_DSR_RXCTR(x) (((x)&0x0000000F)<<4) /* Receive FIFO counter */ ++#define MCF_DSPI_DSR_TXPTR(x) (((x)&0x0000000F)<<8) /* Transmit next pointer */ ++#define MCF_DSPI_DSR_TXCTR(x) (((x)&0x0000000F)<<12) /* Transmit FIFO counter */ ++#define MCF_DSPI_DSR_RFDF (0x00020000) /* Receive FIFO drain flag */ ++#define MCF_DSPI_DSR_RFOF (0x00080000) /* Receive FIFO overflow flag */ ++#define MCF_DSPI_DSR_TFFF (0x02000000) /* Transmit FIFO fill flag */ ++#define MCF_DSPI_DSR_TFUF (0x08000000) /* Transmit FIFO underflow flag */ ++#define MCF_DSPI_DSR_EOQF (0x10000000) /* End of queue flag */ ++#define MCF_DSPI_DSR_TXRXS (0x40000000) /* Tx and Rx status (enabled | disabled) */ ++#define MCF_DSPI_DSR_TCF (0x80000000) /* Transfer complete flag */ ++ ++/* Bit definitions and macros for DRSER */ ++#define MCF_DSPI_DRSER_RFDFS (0x00010000) /* Receive FIFO drain DMA or interrupt select */ ++#define MCF_DSPI_DRSER_RFDFE (0x00020000) /* Receive FIFO drain request enable */ ++#define MCF_DSPI_DRSER_RFOFE (0x00080000) /* Receive FIFO overflow request enable */ ++#define MCF_DSPI_DRSER_TFFFS (0x01000000) /* Transmit FIFO fill DMA or interrupt select */ ++#define MCF_DSPI_DRSER_TFFFE (0x02000000) /* Transmit FIFO fill request enable */ ++#define MCF_DSPI_DRSER_TFUFE (0x08000000) /* Transmit FIFO underflow request enable */ ++#define MCF_DSPI_DRSER_EOQFE (0x10000000) /* DSPI finished request enable */ ++#define MCF_DSPI_DRSER_TCFE (0x80000000) /* Transmission complete request enable */ ++ ++/* Bit definitions and macros for DTFR */ ++#define MCF_DSPI_DTFR_TXDATA(x) (((x)&0x0000FFFF)) /* Transmit data */ ++#define MCF_DSPI_DTFR_PCS0 (0x00010000) /* Peripheral chip select 0 */ ++#define MCF_DSPI_DTFR_PCS1 (0x00020000) /* Peripheral chip select 1 */ ++#define MCF_DSPI_DTFR_PCS2 (0x00040000) /* Peripheral chip select 2 */ ++#define MCF_DSPI_DTFR_PCS3 (0x00080000) /* Peripheral chip select 3 */ ++#define MCF_DSPI_DTFR_PCS4 (0x00100000) /* Peripheral chip select 4 */ ++#define MCF_DSPI_DTFR_PCS5 (0x00200000) /* Peripheral chip select 5 */ ++#define MCF_DSPI_DTFR_PCS6 (0x00400000) /* Peripheral chip select 6 */ ++#define MCF_DSPI_DTFR_PCS7 (0x00800000) /* Peripheral chip select 7 */ ++#define MCF_DSPI_DTFR_CTCNT (0x04000000) /* Clear SPI transfer counter */ ++#define MCF_DSPI_DTFR_EOQ (0x08000000) /* End of queue */ ++#define MCF_DSPI_DTFR_CTAS(x) (((x)&0x00000007)<<28) /* Clock and transfer attributes select */ ++#define MCF_DSPI_DTFR_CONT (0x80000000) /* Continuous peripheral chip-select enable */ ++ ++/* Bit definitions and macros for DRFR */ ++#define MCF_DSPI_DRFR_RXDATA(x) (((x)&0x0000FFFF)) /* Receive data */ ++ ++/* Bit definitions and macros for DTFDR group */ ++#define MCF_DSPI_DTFDR_TXDATA(x) (((x)&0x0000FFFF)) /* Transmit data */ ++#define MCF_DSPI_DTFDR_PCS0 (0x00010000) /* Peripheral chip select 0 */ ++#define MCF_DSPI_DTFDR_PCS1 (0x00020000) /* Peripheral chip select 1 */ ++#define MCF_DSPI_DTFDR_PCS2 (0x00040000) /* Peripheral chip select 2 */ ++#define MCF_DSPI_DTFDR_PCS3 (0x00080000) /* Peripheral chip select 3 */ ++#define MCF_DSPI_DTFDR_PCS4 (0x00100000) /* Peripheral chip select 4 */ ++#define MCF_DSPI_DTFDR_PCS5 (0x00200000) /* Peripheral chip select 5 */ ++#define MCF_DSPI_DTFDR_PCS6 (0x00400000) /* Peripheral chip select 6 */ ++#define MCF_DSPI_DTFDR_PCS7 (0x00800000) /* Peripheral chip select 7 */ ++#define MCF_DSPI_DTFDR_CTCNT (0x04000000) /* Clear SPI transfer counter */ ++#define MCF_DSPI_DTFDR_EOQ (0x08000000) /* End of queue */ ++#define MCF_DSPI_DTFDR_CTAS(x) (((x)&0x00000007)<<28) /* Clock and transfer attributes select */ ++#define MCF_DSPI_DTFDR_CONT (0x80000000) /* Continuous peripheral chip-select enable */ ++ ++/* Bit definitions and macros for DTFDR0 */ ++#define MCF_DSPI_DTFDR0_TXDATA(x) (((x)&0x0000FFFF)) /* Transmit data */ ++#define MCF_DSPI_DTFDR0_PCS0 (0x00010000) /* Peripheral chip select 0 */ ++#define MCF_DSPI_DTFDR0_PCS1 (0x00020000) /* Peripheral chip select 1 */ ++#define MCF_DSPI_DTFDR0_PCS2 (0x00040000) /* Peripheral chip select 2 */ ++#define MCF_DSPI_DTFDR0_PCS3 (0x00080000) /* Peripheral chip select 3 */ ++#define MCF_DSPI_DTFDR0_PCS4 (0x00100000) /* Peripheral chip select 4 */ ++#define MCF_DSPI_DTFDR0_PCS5 (0x00200000) /* Peripheral chip select 5 */ ++#define MCF_DSPI_DTFDR0_PCS6 (0x00400000) /* Peripheral chip select 6 */ ++#define MCF_DSPI_DTFDR0_PCS7 (0x00800000) /* Peripheral chip select 7 */ ++#define MCF_DSPI_DTFDR0_CTCNT (0x04000000) /* Clear SPI transfer counter */ ++#define MCF_DSPI_DTFDR0_EOQ (0x08000000) /* End of queue */ ++#define MCF_DSPI_DTFDR0_CTAS(x) (((x)&0x00000007)<<28) /* Clock and transfer attributes select */ ++#define MCF_DSPI_DTFDR0_CONT (0x80000000) /* Continuous peripheral chip-select enable */ ++ ++/* Bit definitions and macros for DTFDR1 */ ++#define MCF_DSPI_DTFDR1_TXDATA(x) (((x)&0x0000FFFF)) /* Transmit data */ ++#define MCF_DSPI_DTFDR1_PCS0 (0x00010000) /* Peripheral chip select 0 */ ++#define MCF_DSPI_DTFDR1_PCS1 (0x00020000) /* Peripheral chip select 1 */ ++#define MCF_DSPI_DTFDR1_PCS2 (0x00040000) /* Peripheral chip select 2 */ ++#define MCF_DSPI_DTFDR1_PCS3 (0x00080000) /* Peripheral chip select 3 */ ++#define MCF_DSPI_DTFDR1_PCS4 (0x00100000) /* Peripheral chip select 4 */ ++#define MCF_DSPI_DTFDR1_PCS5 (0x00200000) /* Peripheral chip select 5 */ ++#define MCF_DSPI_DTFDR1_PCS6 (0x00400000) /* Peripheral chip select 6 */ ++#define MCF_DSPI_DTFDR1_PCS7 (0x00800000) /* Peripheral chip select 7 */ ++#define MCF_DSPI_DTFDR1_CTCNT (0x04000000) /* Clear SPI transfer counter */ ++#define MCF_DSPI_DTFDR1_EOQ (0x08000000) /* End of queue */ ++#define MCF_DSPI_DTFDR1_CTAS(x) (((x)&0x00000007)<<28) /* Clock and transfer attributes select */ ++#define MCF_DSPI_DTFDR1_CONT (0x80000000) /* Continuous peripheral chip-select enable */ ++ ++/* Bit definitions and macros for DTFDR2 */ ++#define MCF_DSPI_DTFDR2_TXDATA(x) (((x)&0x0000FFFF)) /* Transmit data */ ++#define MCF_DSPI_DTFDR2_PCS0 (0x00010000) /* Peripheral chip select 0 */ ++#define MCF_DSPI_DTFDR2_PCS1 (0x00020000) /* Peripheral chip select 1 */ ++#define MCF_DSPI_DTFDR2_PCS2 (0x00040000) /* Peripheral chip select 2 */ ++#define MCF_DSPI_DTFDR2_PCS3 (0x00080000) /* Peripheral chip select 3 */ ++#define MCF_DSPI_DTFDR2_PCS4 (0x00100000) /* Peripheral chip select 4 */ ++#define MCF_DSPI_DTFDR2_PCS5 (0x00200000) /* Peripheral chip select 5 */ ++#define MCF_DSPI_DTFDR2_PCS6 (0x00400000) /* Peripheral chip select 6 */ ++#define MCF_DSPI_DTFDR2_PCS7 (0x00800000) /* Peripheral chip select 7 */ ++#define MCF_DSPI_DTFDR2_CTCNT (0x04000000) /* Clear SPI transfer counter */ ++#define MCF_DSPI_DTFDR2_EOQ (0x08000000) /* End of queue */ ++#define MCF_DSPI_DTFDR2_CTAS(x) (((x)&0x00000007)<<28) /* Clock and transfer attributes select */ ++#define MCF_DSPI_DTFDR2_CONT (0x80000000) /* Continuous peripheral chip-select enable */ ++ ++/* Bit definitions and macros for DTFDR3 */ ++#define MCF_DSPI_DTFDR3_TXDATA(x) (((x)&0x0000FFFF)) /* Transmit data */ ++#define MCF_DSPI_DTFDR3_PCS0 (0x00010000) /* Peripheral chip select 0 */ ++#define MCF_DSPI_DTFDR3_PCS1 (0x00020000) /* Peripheral chip select 1 */ ++#define MCF_DSPI_DTFDR3_PCS2 (0x00040000) /* Peripheral chip select 2 */ ++#define MCF_DSPI_DTFDR3_PCS3 (0x00080000) /* Peripheral chip select 3 */ ++#define MCF_DSPI_DTFDR3_PCS4 (0x00100000) /* Peripheral chip select 4 */ ++#define MCF_DSPI_DTFDR3_PCS5 (0x00200000) /* Peripheral chip select 5 */ ++#define MCF_DSPI_DTFDR3_PCS6 (0x00400000) /* Peripheral chip select 6 */ ++#define MCF_DSPI_DTFDR3_PCS7 (0x00800000) /* Peripheral chip select 7 */ ++#define MCF_DSPI_DTFDR3_CTCNT (0x04000000) /* Clear SPI transfer counter */ ++#define MCF_DSPI_DTFDR3_EOQ (0x08000000) /* End of queue */ ++#define MCF_DSPI_DTFDR3_CTAS(x) (((x)&0x00000007)<<28) /* Clock and transfer attributes select */ ++#define MCF_DSPI_DTFDR3_CONT (0x80000000) /* Continuous peripheral chip-select enable */ ++ ++/* Bit definitions and macros for DRFDR group */ ++#define MCF_DSPI_DRFDR_RXDATA(x) (((x)&0x0000FFFF)) /* Receive data */ ++ ++/* Bit definitions and macros for DRFDR0 */ ++#define MCF_DSPI_DRFDR0_RXDATA(x) (((x)&0x0000FFFF)) /* Receive data */ ++ ++/* Bit definitions and macros for DRFDR1 */ ++#define MCF_DSPI_DRFDR1_RXDATA(x) (((x)&0x0000FFFF)) /* Receive data */ ++ ++/* Bit definitions and macros for DRFDR2 */ ++#define MCF_DSPI_DRFDR2_RXDATA(x) (((x)&0x0000FFFF)) /* Receive data */ ++ ++/* Bit definitions and macros for DRFDR3 */ ++#define MCF_DSPI_DRFDR3_RXDATA(x) (((x)&0x0000FFFF)) /* Receive data */ ++ ++/********************************************************************/ ++ ++#endif /* __MCF5445X_DSPI_H__ */ +--- /dev/null ++++ b/include/asm-m68k/mcf5445x_dtim.h +@@ -0,0 +1,87 @@ ++/* ++ * Matt Waddel Matt.Waddel@freescale.com ++ * ++ * Copyright Freescale Semiconductor, Inc. 2007 ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ */ ++ ++#ifndef __MCF5445X_DTIM_H__ ++#define __MCF5445X_DTIM_H__ ++ ++/********************************************************************* ++* ++* DMA Timers (DTIM) ++* ++*********************************************************************/ ++/* Register read/write macros */ ++#define MCF_DTIM0_DTMR 0xFC070000 /* DMA Timer Mode Register */ ++#define MCF_DTIM0_DTXMR 0xFC070002 /* DMA Timer Extended Mode Register */ ++#define MCF_DTIM0_DTER 0xFC070003 /* DMA Timer Event Register */ ++#define MCF_DTIM0_DTRR 0xFC070004 /* DMA Timer Reference Register */ ++#define MCF_DTIM0_DTCR 0xFC070008 /* DMA Timer Capture Register */ ++#define MCF_DTIM0_DTCN 0xFC07000C /* DMA Timer Counter Register */ ++#define MCF_DTIM1_DTMR 0xFC074000 /* DMA Timer Mode Register */ ++#define MCF_DTIM1_DTXMR 0xFC074002 /* DMA Timer Extended Mode Register */ ++#define MCF_DTIM1_DTER 0xFC074003 /* DMA Timer Event Register */ ++#define MCF_DTIM1_DTRR 0xFC074004 /* DMA Timer Reference Register */ ++#define MCF_DTIM1_DTCR 0xFC074008 /* DMA Timer Capture Register */ ++#define MCF_DTIM1_DTCN 0xFC07400C /* DMA Timer Counter Register */ ++#define MCF_DTIM2_DTMR 0xFC078000 /* DMA Timer Mode Register */ ++#define MCF_DTIM2_DTXMR 0xFC078002 /* DMA Timer Extended Mode Register */ ++#define MCF_DTIM2_DTER 0xFC078003 /* DMA Timer Event Register */ ++#define MCF_DTIM2_DTRR 0xFC078004 /* DMA Timer Reference Register */ ++#define MCF_DTIM2_DTCR 0xFC078008 /* DMA Timer Capture Register */ ++#define MCF_DTIM2_DTCN 0xFC07800C /* DMA Timer Counter Register */ ++#define MCF_DTIM3_DTMR 0xFC07C000 /* DMA Timer Mode Register */ ++#define MCF_DTIM3_DTXMR 0xFC07C002 /* DMA Timer Extended Mode Register */ ++#define MCF_DTIM3_DTER 0xFC07C003 /* DMA Timer Event Register */ ++#define MCF_DTIM3_DTRR 0xFC07C004 /* DMA Timer Reference Register */ ++#define MCF_DTIM3_DTCR 0xFC07C008 /* DMA Timer Capture Register */ ++#define MCF_DTIM3_DTCN 0xFC07C00C /* DMA Timer Counter Register */ ++ ++/* Parameterized register read/write macros for multiple modules */ ++#define MCF_DTIM_DTMR(x) 0xFC070000+((x)*0x4000) /* DMA Timer Mode Register */ ++#define MCF_DTIM_DTXMR(x) 0xFC070002+((x)*0x4000) /* DMA Timer Extended Mode Register */ ++#define MCF_DTIM_DTER(x) 0xFC070003+((x)*0x4000) /* DMA Timer Event Register */ ++#define MCF_DTIM_DTRR(x) 0xFC070004+((x)*0x4000) /* DMA Timer Reference Register */ ++#define MCF_DTIM_DTCR(x) 0xFC070008+((x)*0x4000) /* DMA Timer Capture Register */ ++#define MCF_DTIM_DTCN(x) 0xFC07000C+((x)*0x4000) /* DMA Timer Counter Register */ ++ ++/* Bit definitions and macros for DTMR */ ++#define MCF_DTIM_DTMR_RST (0x0001) /* Reset */ ++#define MCF_DTIM_DTMR_CLK(x) (((x)&0x0003)<<1) /* Input clock source */ ++#define MCF_DTIM_DTMR_FRR (0x0008) /* Free run/restart */ ++#define MCF_DTIM_DTMR_ORRI (0x0010) /* Output reference request/interrupt enable */ ++#define MCF_DTIM_DTMR_OM (0x0020) /* Output Mode */ ++#define MCF_DTIM_DTMR_CE(x) (((x)&0x0003)<<6) /* Capture Edge */ ++#define MCF_DTIM_DTMR_PS(x) (((x)&0x00FF)<<8) /* Prescaler value */ ++#define MCF_DTIM_DTMR_RST_EN (0x0001) ++#define MCF_DTIM_DTMR_RST_RST (0x0000) ++#define MCF_DTIM_DTMR_CE_ANY (0x00C0) ++#define MCF_DTIM_DTMR_CE_FALL (0x0080) ++#define MCF_DTIM_DTMR_CE_RISE (0x0040) ++#define MCF_DTIM_DTMR_CE_NONE (0x0000) ++#define MCF_DTIM_DTMR_CLK_DTIN (0x0006) ++#define MCF_DTIM_DTMR_CLK_DIV16 (0x0004) ++#define MCF_DTIM_DTMR_CLK_DIV1 (0x0002) ++#define MCF_DTIM_DTMR_CLK_STOP (0x0000) ++ ++/* Bit definitions and macros for DTXMR */ ++#define MCF_DTIM_DTXMR_MODE16 (0x01) /* Increment Mode */ ++#define MCF_DTIM_DTXMR_DMAEN (0x80) /* DMA request */ ++ ++/* Bit definitions and macros for DTER */ ++#define MCF_DTIM_DTER_CAP (0x01) /* Capture event */ ++#define MCF_DTIM_DTER_REF (0x02) /* Output reference event */ ++ ++/* Interrupts used for system timers */ ++#define MCFSIM_ICR_TIMER1 (0xFC048040+32) ++#define MCFSIM_ICR_TIMER2 (0xFC048040+33) ++ ++/********************************************************************/ ++ ++#endif /* __MCF5445X_DTIM_H__ */ +--- /dev/null ++++ b/include/asm-m68k/mcf5445x_edma.h +@@ -0,0 +1,1458 @@ ++/* ++ * Yaroslav Vinogradov yaroslav.vinogradov@freescale.com ++ * ++ * Copyright Freescale Semiconductor, Inc. 2007 ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ */ ++#ifndef __MCF5445X_EDMA_H__ ++#define __MCF5445X_EDMA_H__ ++ ++/********************************************************************* ++* ++* Enhanced DMA (EDMA) ++* ++*********************************************************************/ ++ ++/* Register read/write macros */ ++#define MCF_EDMA_CR MCF_REG32(0xFC044000) ++#define MCF_EDMA_ES MCF_REG32(0xFC044004) ++#define MCF_EDMA_ERQ MCF_REG16(0xFC04400E) ++#define MCF_EDMA_EEI MCF_REG16(0xFC044016) ++#define MCF_EDMA_SERQ MCF_REG08(0xFC044018) ++#define MCF_EDMA_CERQ MCF_REG08(0xFC044019) ++#define MCF_EDMA_SEEI MCF_REG08(0xFC04401A) ++#define MCF_EDMA_CEEI MCF_REG08(0xFC04401B) ++#define MCF_EDMA_CINT MCF_REG08(0xFC04401C) ++#define MCF_EDMA_CERR MCF_REG08(0xFC04401D) ++#define MCF_EDMA_SSRT MCF_REG08(0xFC04401E) ++#define MCF_EDMA_CDNE MCF_REG08(0xFC04401F) ++#define MCF_EDMA_INTR MCF_REG16(0xFC044026) ++#define MCF_EDMA_ERR MCF_REG16(0xFC04402E) ++#define MCF_EDMA_DCHPRI0 MCF_REG08(0xFC044100) ++#define MCF_EDMA_DCHPRI1 MCF_REG08(0xFC044101) ++#define MCF_EDMA_DCHPRI2 MCF_REG08(0xFC044102) ++#define MCF_EDMA_DCHPRI3 MCF_REG08(0xFC044103) ++#define MCF_EDMA_DCHPRI4 MCF_REG08(0xFC044104) ++#define MCF_EDMA_DCHPRI5 MCF_REG08(0xFC044105) ++#define MCF_EDMA_DCHPRI6 MCF_REG08(0xFC044106) ++#define MCF_EDMA_DCHPRI7 MCF_REG08(0xFC044107) ++#define MCF_EDMA_DCHPRI8 MCF_REG08(0xFC044108) ++#define MCF_EDMA_DCHPRI9 MCF_REG08(0xFC044109) ++#define MCF_EDMA_DCHPRI10 MCF_REG08(0xFC04410A) ++#define MCF_EDMA_DCHPRI11 MCF_REG08(0xFC04410B) ++#define MCF_EDMA_DCHPRI12 MCF_REG08(0xFC04410C) ++#define MCF_EDMA_DCHPRI13 MCF_REG08(0xFC04410D) ++#define MCF_EDMA_DCHPRI14 MCF_REG08(0xFC04410E) ++#define MCF_EDMA_DCHPRI15 MCF_REG08(0xFC04410F) ++#define MCF_EDMA_TCD0_SADDR MCF_REG32(0xFC045000) ++#define MCF_EDMA_TCD0_ATTR MCF_REG16(0xFC045004) ++#define MCF_EDMA_TCD0_SOFF MCF_REG16(0xFC045006) ++#define MCF_EDMA_TCD0_NBYTES MCF_REG32(0xFC045008) ++#define MCF_EDMA_TCD0_SLAST MCF_REG32(0xFC04500C) ++#define MCF_EDMA_TCD0_DADDR MCF_REG32(0xFC045010) ++#define MCF_EDMA_TCD0_CITER_ELINK MCF_REG16(0xFC045014) ++#define MCF_EDMA_TCD0_CITER MCF_REG16(0xFC045014) ++#define MCF_EDMA_TCD0_DOFF MCF_REG16(0xFC045016) ++#define MCF_EDMA_TCD0_DLAST_SGA MCF_REG32(0xFC045018) ++#define MCF_EDMA_TCD0_BITER_ELINK MCF_REG16(0xFC04501C) ++#define MCF_EDMA_TCD0_BITER MCF_REG16(0xFC04501C) ++#define MCF_EDMA_TCD0_CSR MCF_REG16(0xFC04501E) ++#define MCF_EDMA_TCD1_SADDR MCF_REG32(0xFC045020) ++#define MCF_EDMA_TCD1_ATTR MCF_REG16(0xFC045024) ++#define MCF_EDMA_TCD1_SOFF MCF_REG16(0xFC045026) ++#define MCF_EDMA_TCD1_NBYTES MCF_REG32(0xFC045028) ++#define MCF_EDMA_TCD1_SLAST MCF_REG32(0xFC04502C) ++#define MCF_EDMA_TCD1_DADDR MCF_REG32(0xFC045030) ++#define MCF_EDMA_TCD1_CITER_ELINK MCF_REG16(0xFC045034) ++#define MCF_EDMA_TCD1_CITER MCF_REG16(0xFC045034) ++#define MCF_EDMA_TCD1_DOFF MCF_REG16(0xFC045036) ++#define MCF_EDMA_TCD1_DLAST_SGA MCF_REG32(0xFC045038) ++#define MCF_EDMA_TCD1_BITER MCF_REG16(0xFC04503C) ++#define MCF_EDMA_TCD1_BITER_ELINK MCF_REG16(0xFC04503C) ++#define MCF_EDMA_TCD1_CSR MCF_REG16(0xFC04503E) ++#define MCF_EDMA_TCD2_SADDR MCF_REG32(0xFC045040) ++#define MCF_EDMA_TCD2_ATTR MCF_REG16(0xFC045044) ++#define MCF_EDMA_TCD2_SOFF MCF_REG16(0xFC045046) ++#define MCF_EDMA_TCD2_NBYTES MCF_REG32(0xFC045048) ++#define MCF_EDMA_TCD2_SLAST MCF_REG32(0xFC04504C) ++#define MCF_EDMA_TCD2_DADDR MCF_REG32(0xFC045050) ++#define MCF_EDMA_TCD2_CITER MCF_REG16(0xFC045054) ++#define MCF_EDMA_TCD2_CITER_ELINK MCF_REG16(0xFC045054) ++#define MCF_EDMA_TCD2_DOFF MCF_REG16(0xFC045056) ++#define MCF_EDMA_TCD2_DLAST_SGA MCF_REG32(0xFC045058) ++#define MCF_EDMA_TCD2_BITER_ELINK MCF_REG16(0xFC04505C) ++#define MCF_EDMA_TCD2_BITER MCF_REG16(0xFC04505C) ++#define MCF_EDMA_TCD2_CSR MCF_REG16(0xFC04505E) ++#define MCF_EDMA_TCD3_SADDR MCF_REG32(0xFC045060) ++#define MCF_EDMA_TCD3_ATTR MCF_REG16(0xFC045064) ++#define MCF_EDMA_TCD3_SOFF MCF_REG16(0xFC045066) ++#define MCF_EDMA_TCD3_NBYTES MCF_REG32(0xFC045068) ++#define MCF_EDMA_TCD3_SLAST MCF_REG32(0xFC04506C) ++#define MCF_EDMA_TCD3_DADDR MCF_REG32(0xFC045070) ++#define MCF_EDMA_TCD3_CITER MCF_REG16(0xFC045074) ++#define MCF_EDMA_TCD3_CITER_ELINK MCF_REG16(0xFC045074) ++#define MCF_EDMA_TCD3_DOFF MCF_REG16(0xFC045076) ++#define MCF_EDMA_TCD3_DLAST_SGA MCF_REG32(0xFC045078) ++#define MCF_EDMA_TCD3_BITER_ELINK MCF_REG16(0xFC04507C) ++#define MCF_EDMA_TCD3_BITER MCF_REG16(0xFC04507C) ++#define MCF_EDMA_TCD3_CSR MCF_REG16(0xFC04507E) ++#define MCF_EDMA_TCD4_SADDR MCF_REG32(0xFC045080) ++#define MCF_EDMA_TCD4_ATTR MCF_REG16(0xFC045084) ++#define MCF_EDMA_TCD4_SOFF MCF_REG16(0xFC045086) ++#define MCF_EDMA_TCD4_NBYTES MCF_REG32(0xFC045088) ++#define MCF_EDMA_TCD4_SLAST MCF_REG32(0xFC04508C) ++#define MCF_EDMA_TCD4_DADDR MCF_REG32(0xFC045090) ++#define MCF_EDMA_TCD4_CITER MCF_REG16(0xFC045094) ++#define MCF_EDMA_TCD4_CITER_ELINK MCF_REG16(0xFC045094) ++#define MCF_EDMA_TCD4_DOFF MCF_REG16(0xFC045096) ++#define MCF_EDMA_TCD4_DLAST_SGA MCF_REG32(0xFC045098) ++#define MCF_EDMA_TCD4_BITER MCF_REG16(0xFC04509C) ++#define MCF_EDMA_TCD4_BITER_ELINK MCF_REG16(0xFC04509C) ++#define MCF_EDMA_TCD4_CSR MCF_REG16(0xFC04509E) ++#define MCF_EDMA_TCD5_SADDR MCF_REG32(0xFC0450A0) ++#define MCF_EDMA_TCD5_ATTR MCF_REG16(0xFC0450A4) ++#define MCF_EDMA_TCD5_SOFF MCF_REG16(0xFC0450A6) ++#define MCF_EDMA_TCD5_NBYTES MCF_REG32(0xFC0450A8) ++#define MCF_EDMA_TCD5_SLAST MCF_REG32(0xFC0450AC) ++#define MCF_EDMA_TCD5_DADDR MCF_REG32(0xFC0450B0) ++#define MCF_EDMA_TCD5_CITER MCF_REG16(0xFC0450B4) ++#define MCF_EDMA_TCD5_CITER_ELINK MCF_REG16(0xFC0450B4) ++#define MCF_EDMA_TCD5_DOFF MCF_REG16(0xFC0450B6) ++#define MCF_EDMA_TCD5_DLAST_SGA MCF_REG32(0xFC0450B8) ++#define MCF_EDMA_TCD5_BITER_ELINK MCF_REG16(0xFC0450BC) ++#define MCF_EDMA_TCD5_BITER MCF_REG16(0xFC0450BC) ++#define MCF_EDMA_TCD5_CSR MCF_REG16(0xFC0450BE) ++#define MCF_EDMA_TCD6_SADDR MCF_REG32(0xFC0450C0) ++#define MCF_EDMA_TCD6_ATTR MCF_REG16(0xFC0450C4) ++#define MCF_EDMA_TCD6_SOFF MCF_REG16(0xFC0450C6) ++#define MCF_EDMA_TCD6_NBYTES MCF_REG32(0xFC0450C8) ++#define MCF_EDMA_TCD6_SLAST MCF_REG32(0xFC0450CC) ++#define MCF_EDMA_TCD6_DADDR MCF_REG32(0xFC0450D0) ++#define MCF_EDMA_TCD6_CITER MCF_REG16(0xFC0450D4) ++#define MCF_EDMA_TCD6_CITER_ELINK MCF_REG16(0xFC0450D4) ++#define MCF_EDMA_TCD6_DOFF MCF_REG16(0xFC0450D6) ++#define MCF_EDMA_TCD6_DLAST_SGA MCF_REG32(0xFC0450D8) ++#define MCF_EDMA_TCD6_BITER_ELINK MCF_REG16(0xFC0450DC) ++#define MCF_EDMA_TCD6_BITER MCF_REG16(0xFC0450DC) ++#define MCF_EDMA_TCD6_CSR MCF_REG16(0xFC0450DE) ++#define MCF_EDMA_TCD7_SADDR MCF_REG32(0xFC0450E0) ++#define MCF_EDMA_TCD7_ATTR MCF_REG16(0xFC0450E4) ++#define MCF_EDMA_TCD7_SOFF MCF_REG16(0xFC0450E6) ++#define MCF_EDMA_TCD7_NBYTES MCF_REG32(0xFC0450E8) ++#define MCF_EDMA_TCD7_SLAST MCF_REG32(0xFC0450EC) ++#define MCF_EDMA_TCD7_DADDR MCF_REG32(0xFC0450F0) ++#define MCF_EDMA_TCD7_CITER MCF_REG16(0xFC0450F4) ++#define MCF_EDMA_TCD7_CITER_ELINK MCF_REG16(0xFC0450F4) ++#define MCF_EDMA_TCD7_DOFF MCF_REG16(0xFC0450F6) ++#define MCF_EDMA_TCD7_DLAST_SGA MCF_REG32(0xFC0450F8) ++#define MCF_EDMA_TCD7_BITER_ELINK MCF_REG16(0xFC0450FC) ++#define MCF_EDMA_TCD7_BITER MCF_REG16(0xFC0450FC) ++#define MCF_EDMA_TCD7_CSR MCF_REG16(0xFC0450FE) ++#define MCF_EDMA_TCD8_SADDR MCF_REG32(0xFC045100) ++#define MCF_EDMA_TCD8_ATTR MCF_REG16(0xFC045104) ++#define MCF_EDMA_TCD8_SOFF MCF_REG16(0xFC045106) ++#define MCF_EDMA_TCD8_NBYTES MCF_REG32(0xFC045108) ++#define MCF_EDMA_TCD8_SLAST MCF_REG32(0xFC04510C) ++#define MCF_EDMA_TCD8_DADDR MCF_REG32(0xFC045110) ++#define MCF_EDMA_TCD8_CITER MCF_REG16(0xFC045114) ++#define MCF_EDMA_TCD8_CITER_ELINK MCF_REG16(0xFC045114) ++#define MCF_EDMA_TCD8_DOFF MCF_REG16(0xFC045116) ++#define MCF_EDMA_TCD8_DLAST_SGA MCF_REG32(0xFC045118) ++#define MCF_EDMA_TCD8_BITER_ELINK MCF_REG16(0xFC04511C) ++#define MCF_EDMA_TCD8_BITER MCF_REG16(0xFC04511C) ++#define MCF_EDMA_TCD8_CSR MCF_REG16(0xFC04511E) ++#define MCF_EDMA_TCD9_SADDR MCF_REG32(0xFC045120) ++#define MCF_EDMA_TCD9_ATTR MCF_REG16(0xFC045124) ++#define MCF_EDMA_TCD9_SOFF MCF_REG16(0xFC045126) ++#define MCF_EDMA_TCD9_NBYTES MCF_REG32(0xFC045128) ++#define MCF_EDMA_TCD9_SLAST MCF_REG32(0xFC04512C) ++#define MCF_EDMA_TCD9_DADDR MCF_REG32(0xFC045130) ++#define MCF_EDMA_TCD9_CITER_ELINK MCF_REG16(0xFC045134) ++#define MCF_EDMA_TCD9_CITER MCF_REG16(0xFC045134) ++#define MCF_EDMA_TCD9_DOFF MCF_REG16(0xFC045136) ++#define MCF_EDMA_TCD9_DLAST_SGA MCF_REG32(0xFC045138) ++#define MCF_EDMA_TCD9_BITER_ELINK MCF_REG16(0xFC04513C) ++#define MCF_EDMA_TCD9_BITER MCF_REG16(0xFC04513C) ++#define MCF_EDMA_TCD9_CSR MCF_REG16(0xFC04513E) ++#define MCF_EDMA_TCD10_SADDR MCF_REG32(0xFC045140) ++#define MCF_EDMA_TCD10_ATTR MCF_REG16(0xFC045144) ++#define MCF_EDMA_TCD10_SOFF MCF_REG16(0xFC045146) ++#define MCF_EDMA_TCD10_NBYTES MCF_REG32(0xFC045148) ++#define MCF_EDMA_TCD10_SLAST MCF_REG32(0xFC04514C) ++#define MCF_EDMA_TCD10_DADDR MCF_REG32(0xFC045150) ++#define MCF_EDMA_TCD10_CITER_ELINK MCF_REG16(0xFC045154) ++#define MCF_EDMA_TCD10_CITER MCF_REG16(0xFC045154) ++#define MCF_EDMA_TCD10_DOFF MCF_REG16(0xFC045156) ++#define MCF_EDMA_TCD10_DLAST_SGA MCF_REG32(0xFC045158) ++#define MCF_EDMA_TCD10_BITER MCF_REG16(0xFC04515C) ++#define MCF_EDMA_TCD10_BITER_ELINK MCF_REG16(0xFC04515C) ++#define MCF_EDMA_TCD10_CSR MCF_REG16(0xFC04515E) ++#define MCF_EDMA_TCD11_SADDR MCF_REG32(0xFC045160) ++#define MCF_EDMA_TCD11_ATTR MCF_REG16(0xFC045164) ++#define MCF_EDMA_TCD11_SOFF MCF_REG16(0xFC045166) ++#define MCF_EDMA_TCD11_NBYTES MCF_REG32(0xFC045168) ++#define MCF_EDMA_TCD11_SLAST MCF_REG32(0xFC04516C) ++#define MCF_EDMA_TCD11_DADDR MCF_REG32(0xFC045170) ++#define MCF_EDMA_TCD11_CITER MCF_REG16(0xFC045174) ++#define MCF_EDMA_TCD11_CITER_ELINK MCF_REG16(0xFC045174) ++#define MCF_EDMA_TCD11_DOFF MCF_REG16(0xFC045176) ++#define MCF_EDMA_TCD11_DLAST_SGA MCF_REG32(0xFC045178) ++#define MCF_EDMA_TCD11_BITER MCF_REG16(0xFC04517C) ++#define MCF_EDMA_TCD11_BITER_ELINK MCF_REG16(0xFC04517C) ++#define MCF_EDMA_TCD11_CSR MCF_REG16(0xFC04517E) ++#define MCF_EDMA_TCD12_SADDR MCF_REG32(0xFC045180) ++#define MCF_EDMA_TCD12_ATTR MCF_REG16(0xFC045184) ++#define MCF_EDMA_TCD12_SOFF MCF_REG16(0xFC045186) ++#define MCF_EDMA_TCD12_NBYTES MCF_REG32(0xFC045188) ++#define MCF_EDMA_TCD12_SLAST MCF_REG32(0xFC04518C) ++#define MCF_EDMA_TCD12_DADDR MCF_REG32(0xFC045190) ++#define MCF_EDMA_TCD12_CITER MCF_REG16(0xFC045194) ++#define MCF_EDMA_TCD12_CITER_ELINK MCF_REG16(0xFC045194) ++#define MCF_EDMA_TCD12_DOFF MCF_REG16(0xFC045196) ++#define MCF_EDMA_TCD12_DLAST_SGA MCF_REG32(0xFC045198) ++#define MCF_EDMA_TCD12_BITER MCF_REG16(0xFC04519C) ++#define MCF_EDMA_TCD12_BITER_ELINK MCF_REG16(0xFC04519C) ++#define MCF_EDMA_TCD12_CSR MCF_REG16(0xFC04519E) ++#define MCF_EDMA_TCD13_SADDR MCF_REG32(0xFC0451A0) ++#define MCF_EDMA_TCD13_ATTR MCF_REG16(0xFC0451A4) ++#define MCF_EDMA_TCD13_SOFF MCF_REG16(0xFC0451A6) ++#define MCF_EDMA_TCD13_NBYTES MCF_REG32(0xFC0451A8) ++#define MCF_EDMA_TCD13_SLAST MCF_REG32(0xFC0451AC) ++#define MCF_EDMA_TCD13_DADDR MCF_REG32(0xFC0451B0) ++#define MCF_EDMA_TCD13_CITER_ELINK MCF_REG16(0xFC0451B4) ++#define MCF_EDMA_TCD13_CITER MCF_REG16(0xFC0451B4) ++#define MCF_EDMA_TCD13_DOFF MCF_REG16(0xFC0451B6) ++#define MCF_EDMA_TCD13_DLAST_SGA MCF_REG32(0xFC0451B8) ++#define MCF_EDMA_TCD13_BITER_ELINK MCF_REG16(0xFC0451BC) ++#define MCF_EDMA_TCD13_BITER MCF_REG16(0xFC0451BC) ++#define MCF_EDMA_TCD13_CSR MCF_REG16(0xFC0451BE) ++#define MCF_EDMA_TCD14_SADDR MCF_REG32(0xFC0451C0) ++#define MCF_EDMA_TCD14_ATTR MCF_REG16(0xFC0451C4) ++#define MCF_EDMA_TCD14_SOFF MCF_REG16(0xFC0451C6) ++#define MCF_EDMA_TCD14_NBYTES MCF_REG32(0xFC0451C8) ++#define MCF_EDMA_TCD14_SLAST MCF_REG32(0xFC0451CC) ++#define MCF_EDMA_TCD14_DADDR MCF_REG32(0xFC0451D0) ++#define MCF_EDMA_TCD14_CITER MCF_REG16(0xFC0451D4) ++#define MCF_EDMA_TCD14_CITER_ELINK MCF_REG16(0xFC0451D4) ++#define MCF_EDMA_TCD14_DOFF MCF_REG16(0xFC0451D6) ++#define MCF_EDMA_TCD14_DLAST_SGA MCF_REG32(0xFC0451D8) ++#define MCF_EDMA_TCD14_BITER_ELINK MCF_REG16(0xFC0451DC) ++#define MCF_EDMA_TCD14_BITER MCF_REG16(0xFC0451DC) ++#define MCF_EDMA_TCD14_CSR MCF_REG16(0xFC0451DE) ++#define MCF_EDMA_TCD15_SADDR MCF_REG32(0xFC0451E0) ++#define MCF_EDMA_TCD15_ATTR MCF_REG16(0xFC0451E4) ++#define MCF_EDMA_TCD15_SOFF MCF_REG16(0xFC0451E6) ++#define MCF_EDMA_TCD15_NBYTES MCF_REG32(0xFC0451E8) ++#define MCF_EDMA_TCD15_SLAST MCF_REG32(0xFC0451EC) ++#define MCF_EDMA_TCD15_DADDR MCF_REG32(0xFC0451F0) ++#define MCF_EDMA_TCD15_CITER_ELINK MCF_REG16(0xFC0451F4) ++#define MCF_EDMA_TCD15_CITER MCF_REG16(0xFC0451F4) ++#define MCF_EDMA_TCD15_DOFF MCF_REG16(0xFC0451F6) ++#define MCF_EDMA_TCD15_DLAST_SGA MCF_REG32(0xFC0451F8) ++#define MCF_EDMA_TCD15_BITER MCF_REG16(0xFC0451FC) ++#define MCF_EDMA_TCD15_BITER_ELINK MCF_REG16(0xFC0451FC) ++#define MCF_EDMA_TCD15_CSR MCF_REG16(0xFC0451FE) ++ ++/* Parameterized register read/write macros for multiple registers */ ++#define MCF_EDMA_DCHPRI(x) MCF_REG08(0xFC044100+((x)*0x001)) ++#define MCF_EDMA_TCD_SADDR(x) MCF_REG32(0xFC045000+((x)*0x020)) ++#define MCF_EDMA_TCD_ATTR(x) MCF_REG16(0xFC045004+((x)*0x020)) ++#define MCF_EDMA_TCD_SOFF(x) MCF_REG16(0xFC045006+((x)*0x020)) ++#define MCF_EDMA_TCD_NBYTES(x) MCF_REG32(0xFC045008+((x)*0x020)) ++#define MCF_EDMA_TCD_SLAST(x) MCF_REG32(0xFC04500C+((x)*0x020)) ++#define MCF_EDMA_TCD_DADDR(x) MCF_REG32(0xFC045010+((x)*0x020)) ++#define MCF_EDMA_TCD_CITER_ELINK(x) MCF_REG16(0xFC045014+((x)*0x020)) ++#define MCF_EDMA_TCD_CITER(x) MCF_REG16(0xFC045014+((x)*0x020)) ++#define MCF_EDMA_TCD_DOFF(x) MCF_REG16(0xFC045016+((x)*0x020)) ++#define MCF_EDMA_TCD_DLAST_SGA(x) MCF_REG32(0xFC045018+((x)*0x020)) ++#define MCF_EDMA_TCD_BITER_ELINK(x) MCF_REG16(0xFC04501C+((x)*0x020)) ++#define MCF_EDMA_TCD_BITER(x) MCF_REG16(0xFC04501C+((x)*0x020)) ++#define MCF_EDMA_TCD_CSR(x) MCF_REG16(0xFC04501e +((x)*0x020)) ++ ++/* Bit definitions and macros for CR */ ++#define MCF_EDMA_CR_EDBG (0x00000002) ++#define MCF_EDMA_CR_ERCA (0x00000004) ++ ++/* Bit definitions and macros for ES */ ++#define MCF_EDMA_ES_DBE (0x00000001) ++#define MCF_EDMA_ES_SBE (0x00000002) ++#define MCF_EDMA_ES_SGE (0x00000004) ++#define MCF_EDMA_ES_NCE (0x00000008) ++#define MCF_EDMA_ES_DOE (0x00000010) ++#define MCF_EDMA_ES_DAE (0x00000020) ++#define MCF_EDMA_ES_SOE (0x00000040) ++#define MCF_EDMA_ES_SAE (0x00000080) ++#define MCF_EDMA_ES_ERRCHN(x) (((x)&0x0000000F)<<8) ++#define MCF_EDMA_ES_CPE (0x00004000) ++#define MCF_EDMA_ES_VLD (0x80000000) ++ ++/* Bit definitions and macros for ERQ */ ++#define MCF_EDMA_ERQ_ERQ0 (0x0001) ++#define MCF_EDMA_ERQ_ERQ1 (0x0002) ++#define MCF_EDMA_ERQ_ERQ2 (0x0004) ++#define MCF_EDMA_ERQ_ERQ3 (0x0008) ++#define MCF_EDMA_ERQ_ERQ4 (0x0010) ++#define MCF_EDMA_ERQ_ERQ5 (0x0020) ++#define MCF_EDMA_ERQ_ERQ6 (0x0040) ++#define MCF_EDMA_ERQ_ERQ7 (0x0080) ++#define MCF_EDMA_ERQ_ERQ8 (0x0100) ++#define MCF_EDMA_ERQ_ERQ9 (0x0200) ++#define MCF_EDMA_ERQ_ERQ10 (0x0400) ++#define MCF_EDMA_ERQ_ERQ11 (0x0800) ++#define MCF_EDMA_ERQ_ERQ12 (0x1000) ++#define MCF_EDMA_ERQ_ERQ13 (0x2000) ++#define MCF_EDMA_ERQ_ERQ14 (0x4000) ++#define MCF_EDMA_ERQ_ERQ15 (0x8000) ++ ++/* Bit definitions and macros for EEI */ ++#define MCF_EDMA_EEI_EEI0 (0x0001) ++#define MCF_EDMA_EEI_EEI1 (0x0002) ++#define MCF_EDMA_EEI_EEI2 (0x0004) ++#define MCF_EDMA_EEI_EEI3 (0x0008) ++#define MCF_EDMA_EEI_EEI4 (0x0010) ++#define MCF_EDMA_EEI_EEI5 (0x0020) ++#define MCF_EDMA_EEI_EEI6 (0x0040) ++#define MCF_EDMA_EEI_EEI7 (0x0080) ++#define MCF_EDMA_EEI_EEI8 (0x0100) ++#define MCF_EDMA_EEI_EEI9 (0x0200) ++#define MCF_EDMA_EEI_EEI10 (0x0400) ++#define MCF_EDMA_EEI_EEI11 (0x0800) ++#define MCF_EDMA_EEI_EEI12 (0x1000) ++#define MCF_EDMA_EEI_EEI13 (0x2000) ++#define MCF_EDMA_EEI_EEI14 (0x4000) ++#define MCF_EDMA_EEI_EEI15 (0x8000) ++ ++/* Bit definitions and macros for SERQ */ ++#define MCF_EDMA_SERQ_SERQ(x) (((x)&0x0F)) ++#define MCF_EDMA_SERQ_SAER (0x40) ++ ++/* Bit definitions and macros for CERQ */ ++#define MCF_EDMA_CERQ_CERQ(x) (((x)&0x0F)) ++#define MCF_EDMA_CERQ_CAER (0x40) ++ ++/* Bit definitions and macros for SEEI */ ++#define MCF_EDMA_SEEI_SEEI(x) (((x)&0x0F)) ++#define MCF_EDMA_SEEI_SAEE (0x40) ++ ++/* Bit definitions and macros for CEEI */ ++#define MCF_EDMA_CEEI_CEEI(x) (((x)&0x0F)) ++#define MCF_EDMA_CEEI_CAEE (0x40) ++ ++/* Bit definitions and macros for CINT */ ++#define MCF_EDMA_CINT_CINT(x) (((x)&0x0F)) ++#define MCF_EDMA_CINT_CAIR (0x40) ++ ++/* Bit definitions and macros for CERR */ ++#define MCF_EDMA_CERR_CERR(x) (((x)&0x0F)) ++#define MCF_EDMA_CERR_CAER (0x40) ++ ++/* Bit definitions and macros for SSRT */ ++#define MCF_EDMA_SSRT_SSRT(x) (((x)&0x0F)) ++#define MCF_EDMA_SSRT_SAST (0x40) ++ ++/* Bit definitions and macros for CDNE */ ++#define MCF_EDMA_CDNE_CDNE(x) (((x)&0x0F)) ++#define MCF_EDMA_CDNE_CADN (0x40) ++ ++/* Bit definitions and macros for INTR */ ++#define MCF_EDMA_INTR_INT0 (0x0001) ++#define MCF_EDMA_INTR_INT1 (0x0002) ++#define MCF_EDMA_INTR_INT2 (0x0004) ++#define MCF_EDMA_INTR_INT3 (0x0008) ++#define MCF_EDMA_INTR_INT4 (0x0010) ++#define MCF_EDMA_INTR_INT5 (0x0020) ++#define MCF_EDMA_INTR_INT6 (0x0040) ++#define MCF_EDMA_INTR_INT7 (0x0080) ++#define MCF_EDMA_INTR_INT8 (0x0100) ++#define MCF_EDMA_INTR_INT9 (0x0200) ++#define MCF_EDMA_INTR_INT10 (0x0400) ++#define MCF_EDMA_INTR_INT11 (0x0800) ++#define MCF_EDMA_INTR_INT12 (0x1000) ++#define MCF_EDMA_INTR_INT13 (0x2000) ++#define MCF_EDMA_INTR_INT14 (0x4000) ++#define MCF_EDMA_INTR_INT15 (0x8000) ++ ++/* Bit definitions and macros for ERR */ ++#define MCF_EDMA_ERR_ERR0 (0x0001) ++#define MCF_EDMA_ERR_ERR1 (0x0002) ++#define MCF_EDMA_ERR_ERR2 (0x0004) ++#define MCF_EDMA_ERR_ERR3 (0x0008) ++#define MCF_EDMA_ERR_ERR4 (0x0010) ++#define MCF_EDMA_ERR_ERR5 (0x0020) ++#define MCF_EDMA_ERR_ERR6 (0x0040) ++#define MCF_EDMA_ERR_ERR7 (0x0080) ++#define MCF_EDMA_ERR_ERR8 (0x0100) ++#define MCF_EDMA_ERR_ERR9 (0x0200) ++#define MCF_EDMA_ERR_ERR10 (0x0400) ++#define MCF_EDMA_ERR_ERR11 (0x0800) ++#define MCF_EDMA_ERR_ERR12 (0x1000) ++#define MCF_EDMA_ERR_ERR13 (0x2000) ++#define MCF_EDMA_ERR_ERR14 (0x4000) ++#define MCF_EDMA_ERR_ERR15 (0x8000) ++ ++/* Bit definitions and macros for DCHPRI group */ ++#define MCF_EDMA_DCHPRI_CHPRI(x) (((x)&0x0F)) ++#define MCF_EDMA_DCHPRI_ECP (0x80) ++ ++/* Bit definitions and macros for DCHPRI0 */ ++#define MCF_EDMA_DCHPRI0_CHPRI(x) (((x)&0x0F)) ++#define MCF_EDMA_DCHPRI0_ECP (0x80) ++ ++/* Bit definitions and macros for DCHPRI1 */ ++#define MCF_EDMA_DCHPRI1_CHPRI(x) (((x)&0x0F)) ++#define MCF_EDMA_DCHPRI1_ECP (0x80) ++ ++/* Bit definitions and macros for DCHPRI2 */ ++#define MCF_EDMA_DCHPRI2_CHPRI(x) (((x)&0x0F)) ++#define MCF_EDMA_DCHPRI2_ECP (0x80) ++ ++/* Bit definitions and macros for DCHPRI3 */ ++#define MCF_EDMA_DCHPRI3_CHPRI(x) (((x)&0x0F)) ++#define MCF_EDMA_DCHPRI3_ECP (0x80) ++ ++/* Bit definitions and macros for DCHPRI4 */ ++#define MCF_EDMA_DCHPRI4_CHPRI(x) (((x)&0x0F)) ++#define MCF_EDMA_DCHPRI4_ECP (0x80) ++ ++/* Bit definitions and macros for DCHPRI5 */ ++#define MCF_EDMA_DCHPRI5_CHPRI(x) (((x)&0x0F)) ++#define MCF_EDMA_DCHPRI5_ECP (0x80) ++ ++/* Bit definitions and macros for DCHPRI6 */ ++#define MCF_EDMA_DCHPRI6_CHPRI(x) (((x)&0x0F)) ++#define MCF_EDMA_DCHPRI6_ECP (0x80) ++ ++/* Bit definitions and macros for DCHPRI7 */ ++#define MCF_EDMA_DCHPRI7_CHPRI(x) (((x)&0x0F)) ++#define MCF_EDMA_DCHPRI7_ECP (0x80) ++ ++/* Bit definitions and macros for DCHPRI8 */ ++#define MCF_EDMA_DCHPRI8_CHPRI(x) (((x)&0x0F)) ++#define MCF_EDMA_DCHPRI8_ECP (0x80) ++ ++/* Bit definitions and macros for DCHPRI9 */ ++#define MCF_EDMA_DCHPRI9_CHPRI(x) (((x)&0x0F)) ++#define MCF_EDMA_DCHPRI9_ECP (0x80) ++ ++/* Bit definitions and macros for DCHPRI10 */ ++#define MCF_EDMA_DCHPRI10_CHPRI(x) (((x)&0x0F)) ++#define MCF_EDMA_DCHPRI10_ECP (0x80) ++ ++/* Bit definitions and macros for DCHPRI11 */ ++#define MCF_EDMA_DCHPRI11_CHPRI(x) (((x)&0x0F)) ++#define MCF_EDMA_DCHPRI11_ECP (0x80) ++ ++/* Bit definitions and macros for DCHPRI12 */ ++#define MCF_EDMA_DCHPRI12_CHPRI(x) (((x)&0x0F)) ++#define MCF_EDMA_DCHPRI12_ECP (0x80) ++ ++/* Bit definitions and macros for DCHPRI13 */ ++#define MCF_EDMA_DCHPRI13_CHPRI(x) (((x)&0x0F)) ++#define MCF_EDMA_DCHPRI13_ECP (0x80) ++ ++/* Bit definitions and macros for DCHPRI14 */ ++#define MCF_EDMA_DCHPRI14_CHPRI(x) (((x)&0x0F)) ++#define MCF_EDMA_DCHPRI14_ECP (0x80) ++ ++/* Bit definitions and macros for DCHPRI15 */ ++#define MCF_EDMA_DCHPRI15_CHPRI(x) (((x)&0x0F)) ++#define MCF_EDMA_DCHPRI15_ECP (0x80) ++ ++/* Bit definitions and macros for TCD_SADDR group */ ++#define MCF_EDMA_TCD_SADDR_SADDR(x) (x) ++ ++/* Bit definitions and macros for TCD0_SADDR */ ++#define MCF_EDMA_TCD0_SADDR_SADDR(x) (x) ++ ++/* Bit definitions and macros for TCD_ATTR group */ ++#define MCF_EDMA_TCD_ATTR_DSIZE(x) (((x)&0x0007)) ++#define MCF_EDMA_TCD_ATTR_DMOD(x) (((x)&0x001F)<<3) ++#define MCF_EDMA_TCD_ATTR_SSIZE(x) (((x)&0x0007)<<8) ++#define MCF_EDMA_TCD_ATTR_SMOD(x) (((x)&0x001F)<<11) ++#define MCF_EDMA_TCD_ATTR_SSIZE_8BIT (0x0000) ++#define MCF_EDMA_TCD_ATTR_SSIZE_16BIT (0x0100) ++#define MCF_EDMA_TCD_ATTR_SSIZE_32BIT (0x0200) ++#define MCF_EDMA_TCD_ATTR_SSIZE_16BYTE (0x0400) ++#define MCF_EDMA_TCD_ATTR_DSIZE_8BIT (0x0000) ++#define MCF_EDMA_TCD_ATTR_DSIZE_16BIT (0x0001) ++#define MCF_EDMA_TCD_ATTR_DSIZE_32BIT (0x0002) ++#define MCF_EDMA_TCD_ATTR_DSIZE_16BYTE (0x0004) ++ ++/* Bit definitions and macros for TCD0_ATTR */ ++#define MCF_EDMA_TCD0_ATTR_DSIZE(x) (((x)&0x0007)) ++#define MCF_EDMA_TCD0_ATTR_DMOD(x) (((x)&0x001F)<<3) ++#define MCF_EDMA_TCD0_ATTR_SSIZE(x) (((x)&0x0007)<<8) ++#define MCF_EDMA_TCD0_ATTR_SMOD(x) (((x)&0x001F)<<11) ++#define MCF_EDMA_TCD0_ATTR_SSIZE_8BIT (0x0000) ++#define MCF_EDMA_TCD0_ATTR_SSIZE_16BIT (0x0100) ++#define MCF_EDMA_TCD0_ATTR_SSIZE_32BIT (0x0200) ++#define MCF_EDMA_TCD0_ATTR_SSIZE_16BYTE (0x0400) ++#define MCF_EDMA_TCD0_ATTR_DSIZE_8BIT (0x0000) ++#define MCF_EDMA_TCD0_ATTR_DSIZE_16BIT (0x0001) ++#define MCF_EDMA_TCD0_ATTR_DSIZE_32BIT (0x0002) ++#define MCF_EDMA_TCD0_ATTR_DSIZE_16BYTE (0x0004) ++ ++/* Bit definitions and macros for TCD_SOFF group */ ++#define MCF_EDMA_TCD_SOFF_SOFF(x) (x) ++ ++/* Bit definitions and macros for TCD0_SOFF */ ++#define MCF_EDMA_TCD0_SOFF_SOFF(x) (x) ++ ++/* Bit definitions and macros for TCD_NBYTES group */ ++#define MCF_EDMA_TCD_NBYTES_NBYTES(x) (x) ++ ++/* Bit definitions and macros for TCD0_NBYTES */ ++#define MCF_EDMA_TCD0_NBYTES_NBYTES(x) (x) ++ ++/* Bit definitions and macros for TCD_SLAST group */ ++#define MCF_EDMA_TCD_SLAST_SLAST(x) (x) ++ ++/* Bit definitions and macros for TCD0_SLAST */ ++#define MCF_EDMA_TCD0_SLAST_SLAST(x) (x) ++ ++/* Bit definitions and macros for TCD_DADDR group */ ++#define MCF_EDMA_TCD_DADDR_DADDR(x) (x) ++ ++/* Bit definitions and macros for TCD0_DADDR */ ++#define MCF_EDMA_TCD0_DADDR_DADDR(x) (x) ++ ++/* Bit definitions and macros for TCD_CITER_ELINK group */ ++#define MCF_EDMA_TCD_CITER_ELINK_CITER(x) (((x)&0x01FF)) ++#define MCF_EDMA_TCD_CITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) ++#define MCF_EDMA_TCD_CITER_ELINK_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD0_CITER_ELINK */ ++#define MCF_EDMA_TCD0_CITER_ELINK_CITER(x) (((x)&0x01FF)) ++#define MCF_EDMA_TCD0_CITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) ++#define MCF_EDMA_TCD0_CITER_ELINK_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD_CITER group */ ++#define MCF_EDMA_TCD_CITER_CITER(x) (((x)&0x7FFF)) ++#define MCF_EDMA_TCD_CITER_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD0_CITER */ ++#define MCF_EDMA_TCD0_CITER_CITER(x) (((x)&0x7FFF)) ++#define MCF_EDMA_TCD0_CITER_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD_DOFF group */ ++#define MCF_EDMA_TCD_DOFF_DOFF(x) (x) ++ ++/* Bit definitions and macros for TCD0_DOFF */ ++#define MCF_EDMA_TCD0_DOFF_DOFF(x) (x) ++ ++/* Bit definitions and macros for TCD_DLAST_SGA group */ ++#define MCF_EDMA_TCD_DLAST_SGA_DLAST_SGA(x) (x) ++ ++/* Bit definitions and macros for TCD0_DLAST_SGA */ ++#define MCF_EDMA_TCD0_DLAST_SGA_DLAST_SGA(x) (x) ++ ++/* Bit definitions and macros for TCD_BITER_ELINK group */ ++#define MCF_EDMA_TCD_BITER_ELINK_BITER(x) (((x)&0x01FF)) ++#define MCF_EDMA_TCD_BITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) ++#define MCF_EDMA_TCD_BITER_ELINK_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD0_BITER_ELINK */ ++#define MCF_EDMA_TCD0_BITER_ELINK_BITER(x) (((x)&0x01FF)) ++#define MCF_EDMA_TCD0_BITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) ++#define MCF_EDMA_TCD0_BITER_ELINK_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD_BITER group */ ++#define MCF_EDMA_TCD_BITER_BITER(x) (((x)&0x7FFF)) ++#define MCF_EDMA_TCD_BITER_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD0_BITER */ ++#define MCF_EDMA_TCD0_BITER_BITER(x) (((x)&0x7FFF)) ++#define MCF_EDMA_TCD0_BITER_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD_CSR group */ ++#define MCF_EDMA_TCD_CSR_START (0x0001) ++#define MCF_EDMA_TCD_CSR_INT_MAJOR (0x0002) ++#define MCF_EDMA_TCD_CSR_INT_HALF (0x0004) ++#define MCF_EDMA_TCD_CSR_D_REQ (0x0008) ++#define MCF_EDMA_TCD_CSR_E_SG (0x0010) ++#define MCF_EDMA_TCD_CSR_E_LINK (0x0020) ++#define MCF_EDMA_TCD_CSR_ACTIVE (0x0040) ++#define MCF_EDMA_TCD_CSR_DONE (0x0080) ++#define MCF_EDMA_TCD_CSR_LINKCH(x) (((x)&0x003F)<<8) ++#define MCF_EDMA_TCD_CSR_BWC(x) (((x)&0x0003)<<14) ++#define MCF_EDMA_TCD_CSR_BWC_NO_STALL (0x0000) ++#define MCF_EDMA_TCD_CSR_BWC_4CYC_STALL (0x8000) ++#define MCF_EDMA_TCD_CSR_BWC_8CYC_STALL (0xC000) ++ ++/* Bit definitions and macros for TCD0_CSR */ ++#define MCF_EDMA_TCD0_CSR_START (0x0001) ++#define MCF_EDMA_TCD0_CSR_INT_MAJOR (0x0002) ++#define MCF_EDMA_TCD0_CSR_INT_HALF (0x0004) ++#define MCF_EDMA_TCD0_CSR_D_REQ (0x0008) ++#define MCF_EDMA_TCD0_CSR_E_SG (0x0010) ++#define MCF_EDMA_TCD0_CSR_E_LINK (0x0020) ++#define MCF_EDMA_TCD0_CSR_ACTIVE (0x0040) ++#define MCF_EDMA_TCD0_CSR_DONE (0x0080) ++#define MCF_EDMA_TCD0_CSR_LINKCH(x) (((x)&0x003F)<<8) ++#define MCF_EDMA_TCD0_CSR_BWC(x) (((x)&0x0003)<<14) ++#define MCF_EDMA_TCD0_CSR_BWC_NO_STALL (0x0000) ++#define MCF_EDMA_TCD0_CSR_BWC_4CYC_STALL (0x8000) ++#define MCF_EDMA_TCD0_CSR_BWC_8CYC_STALL (0xC000) ++ ++/* Bit definitions and macros for TCD1_SADDR */ ++#define MCF_EDMA_TCD1_SADDR_SADDR(x) (x) ++ ++/* Bit definitions and macros for TCD1_ATTR */ ++#define MCF_EDMA_TCD1_ATTR_DSIZE(x) (((x)&0x0007)) ++#define MCF_EDMA_TCD1_ATTR_DMOD(x) (((x)&0x001F)<<3) ++#define MCF_EDMA_TCD1_ATTR_SSIZE(x) (((x)&0x0007)<<8) ++#define MCF_EDMA_TCD1_ATTR_SMOD(x) (((x)&0x001F)<<11) ++ ++/* Bit definitions and macros for TCD1_SOFF */ ++#define MCF_EDMA_TCD1_SOFF_SOFF(x) (x) ++ ++/* Bit definitions and macros for TCD1_NBYTES */ ++#define MCF_EDMA_TCD1_NBYTES_NBYTES(x) (x) ++ ++/* Bit definitions and macros for TCD1_SLAST */ ++#define MCF_EDMA_TCD1_SLAST_SLAST(x) (x) ++ ++/* Bit definitions and macros for TCD1_DADDR */ ++#define MCF_EDMA_TCD1_DADDR_DADDR(x) (x) ++ ++/* Bit definitions and macros for TCD1_CITER_ELINK */ ++#define MCF_EDMA_TCD1_CITER_ELINK_CITER(x) (((x)&0x01FF)) ++#define MCF_EDMA_TCD1_CITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) ++#define MCF_EDMA_TCD1_CITER_ELINK_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD1_CITER */ ++#define MCF_EDMA_TCD1_CITER_CITER(x) (((x)&0x7FFF)) ++#define MCF_EDMA_TCD1_CITER_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD1_DOFF */ ++#define MCF_EDMA_TCD1_DOFF_DOFF(x) (x) ++ ++/* Bit definitions and macros for TCD1_DLAST_SGA */ ++#define MCF_EDMA_TCD1_DLAST_SGA_DLAST_SGA(x) (x) ++ ++/* Bit definitions and macros for TCD1_BITER */ ++#define MCF_EDMA_TCD1_BITER_BITER(x) (((x)&0x7FFF)) ++#define MCF_EDMA_TCD1_BITER_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD1_BITER_ELINK */ ++#define MCF_EDMA_TCD1_BITER_ELINK_BITER(x) (((x)&0x01FF)) ++#define MCF_EDMA_TCD1_BITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) ++#define MCF_EDMA_TCD1_BITER_ELINK_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD1_CSR */ ++#define MCF_EDMA_TCD1_CSR_START (0x0001) ++#define MCF_EDMA_TCD1_CSR_INT_MAJOR (0x0002) ++#define MCF_EDMA_TCD1_CSR_INT_HALF (0x0004) ++#define MCF_EDMA_TCD1_CSR_D_REQ (0x0008) ++#define MCF_EDMA_TCD1_CSR_E_SG (0x0010) ++#define MCF_EDMA_TCD1_CSR_E_LINK (0x0020) ++#define MCF_EDMA_TCD1_CSR_ACTIVE (0x0040) ++#define MCF_EDMA_TCD1_CSR_DONE (0x0080) ++#define MCF_EDMA_TCD1_CSR_LINKCH(x) (((x)&0x003F)<<8) ++#define MCF_EDMA_TCD1_CSR_BWC(x) (((x)&0x0003)<<14) ++ ++/* Bit definitions and macros for TCD2_SADDR */ ++#define MCF_EDMA_TCD2_SADDR_SADDR(x) (x) ++ ++/* Bit definitions and macros for TCD2_ATTR */ ++#define MCF_EDMA_TCD2_ATTR_DSIZE(x) (((x)&0x0007)) ++#define MCF_EDMA_TCD2_ATTR_DMOD(x) (((x)&0x001F)<<3) ++#define MCF_EDMA_TCD2_ATTR_SSIZE(x) (((x)&0x0007)<<8) ++#define MCF_EDMA_TCD2_ATTR_SMOD(x) (((x)&0x001F)<<11) ++ ++/* Bit definitions and macros for TCD2_SOFF */ ++#define MCF_EDMA_TCD2_SOFF_SOFF(x) (x) ++ ++/* Bit definitions and macros for TCD2_NBYTES */ ++#define MCF_EDMA_TCD2_NBYTES_NBYTES(x) (x) ++ ++/* Bit definitions and macros for TCD2_SLAST */ ++#define MCF_EDMA_TCD2_SLAST_SLAST(x) (x) ++ ++/* Bit definitions and macros for TCD2_DADDR */ ++#define MCF_EDMA_TCD2_DADDR_DADDR(x) (x) ++ ++/* Bit definitions and macros for TCD2_CITER */ ++#define MCF_EDMA_TCD2_CITER_CITER(x) (((x)&0x7FFF)) ++#define MCF_EDMA_TCD2_CITER_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD2_CITER_ELINK */ ++#define MCF_EDMA_TCD2_CITER_ELINK_CITER(x) (((x)&0x01FF)) ++#define MCF_EDMA_TCD2_CITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) ++#define MCF_EDMA_TCD2_CITER_ELINK_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD2_DOFF */ ++#define MCF_EDMA_TCD2_DOFF_DOFF(x) (x) ++ ++/* Bit definitions and macros for TCD2_DLAST_SGA */ ++#define MCF_EDMA_TCD2_DLAST_SGA_DLAST_SGA(x) (x) ++ ++/* Bit definitions and macros for TCD2_BITER_ELINK */ ++#define MCF_EDMA_TCD2_BITER_ELINK_BITER(x) (((x)&0x01FF)) ++#define MCF_EDMA_TCD2_BITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) ++#define MCF_EDMA_TCD2_BITER_ELINK_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD2_BITER */ ++#define MCF_EDMA_TCD2_BITER_BITER(x) (((x)&0x7FFF)) ++#define MCF_EDMA_TCD2_BITER_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD2_CSR */ ++#define MCF_EDMA_TCD2_CSR_START (0x0001) ++#define MCF_EDMA_TCD2_CSR_INT_MAJOR (0x0002) ++#define MCF_EDMA_TCD2_CSR_INT_HALF (0x0004) ++#define MCF_EDMA_TCD2_CSR_D_REQ (0x0008) ++#define MCF_EDMA_TCD2_CSR_E_SG (0x0010) ++#define MCF_EDMA_TCD2_CSR_E_LINK (0x0020) ++#define MCF_EDMA_TCD2_CSR_ACTIVE (0x0040) ++#define MCF_EDMA_TCD2_CSR_DONE (0x0080) ++#define MCF_EDMA_TCD2_CSR_LINKCH(x) (((x)&0x003F)<<8) ++#define MCF_EDMA_TCD2_CSR_BWC(x) (((x)&0x0003)<<14) ++ ++/* Bit definitions and macros for TCD3_SADDR */ ++#define MCF_EDMA_TCD3_SADDR_SADDR(x) (x) ++ ++/* Bit definitions and macros for TCD3_ATTR */ ++#define MCF_EDMA_TCD3_ATTR_DSIZE(x) (((x)&0x0007)) ++#define MCF_EDMA_TCD3_ATTR_DMOD(x) (((x)&0x001F)<<3) ++#define MCF_EDMA_TCD3_ATTR_SSIZE(x) (((x)&0x0007)<<8) ++#define MCF_EDMA_TCD3_ATTR_SMOD(x) (((x)&0x001F)<<11) ++ ++/* Bit definitions and macros for TCD3_SOFF */ ++#define MCF_EDMA_TCD3_SOFF_SOFF(x) (x) ++ ++/* Bit definitions and macros for TCD3_NBYTES */ ++#define MCF_EDMA_TCD3_NBYTES_NBYTES(x) (x) ++ ++/* Bit definitions and macros for TCD3_SLAST */ ++#define MCF_EDMA_TCD3_SLAST_SLAST(x) (x) ++ ++/* Bit definitions and macros for TCD3_DADDR */ ++#define MCF_EDMA_TCD3_DADDR_DADDR(x) (x) ++ ++/* Bit definitions and macros for TCD3_CITER */ ++#define MCF_EDMA_TCD3_CITER_CITER(x) (((x)&0x7FFF)) ++#define MCF_EDMA_TCD3_CITER_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD3_CITER_ELINK */ ++#define MCF_EDMA_TCD3_CITER_ELINK_CITER(x) (((x)&0x01FF)) ++#define MCF_EDMA_TCD3_CITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) ++#define MCF_EDMA_TCD3_CITER_ELINK_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD3_DOFF */ ++#define MCF_EDMA_TCD3_DOFF_DOFF(x) (x) ++ ++/* Bit definitions and macros for TCD3_DLAST_SGA */ ++#define MCF_EDMA_TCD3_DLAST_SGA_DLAST_SGA(x) (x) ++ ++/* Bit definitions and macros for TCD3_BITER_ELINK */ ++#define MCF_EDMA_TCD3_BITER_ELINK_BITER(x) (((x)&0x01FF)) ++#define MCF_EDMA_TCD3_BITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) ++#define MCF_EDMA_TCD3_BITER_ELINK_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD3_BITER */ ++#define MCF_EDMA_TCD3_BITER_BITER(x) (((x)&0x7FFF)) ++#define MCF_EDMA_TCD3_BITER_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD3_CSR */ ++#define MCF_EDMA_TCD3_CSR_START (0x0001) ++#define MCF_EDMA_TCD3_CSR_INT_MAJOR (0x0002) ++#define MCF_EDMA_TCD3_CSR_INT_HALF (0x0004) ++#define MCF_EDMA_TCD3_CSR_D_REQ (0x0008) ++#define MCF_EDMA_TCD3_CSR_E_SG (0x0010) ++#define MCF_EDMA_TCD3_CSR_E_LINK (0x0020) ++#define MCF_EDMA_TCD3_CSR_ACTIVE (0x0040) ++#define MCF_EDMA_TCD3_CSR_DONE (0x0080) ++#define MCF_EDMA_TCD3_CSR_LINKCH(x) (((x)&0x003F)<<8) ++#define MCF_EDMA_TCD3_CSR_BWC(x) (((x)&0x0003)<<14) ++ ++/* Bit definitions and macros for TCD4_SADDR */ ++#define MCF_EDMA_TCD4_SADDR_SADDR(x) (x) ++ ++/* Bit definitions and macros for TCD4_ATTR */ ++#define MCF_EDMA_TCD4_ATTR_DSIZE(x) (((x)&0x0007)) ++#define MCF_EDMA_TCD4_ATTR_DMOD(x) (((x)&0x001F)<<3) ++#define MCF_EDMA_TCD4_ATTR_SSIZE(x) (((x)&0x0007)<<8) ++#define MCF_EDMA_TCD4_ATTR_SMOD(x) (((x)&0x001F)<<11) ++ ++/* Bit definitions and macros for TCD4_SOFF */ ++#define MCF_EDMA_TCD4_SOFF_SOFF(x) (x) ++ ++/* Bit definitions and macros for TCD4_NBYTES */ ++#define MCF_EDMA_TCD4_NBYTES_NBYTES(x) (x) ++ ++/* Bit definitions and macros for TCD4_SLAST */ ++#define MCF_EDMA_TCD4_SLAST_SLAST(x) (x) ++ ++/* Bit definitions and macros for TCD4_DADDR */ ++#define MCF_EDMA_TCD4_DADDR_DADDR(x) (x) ++ ++/* Bit definitions and macros for TCD4_CITER */ ++#define MCF_EDMA_TCD4_CITER_CITER(x) (((x)&0x7FFF)) ++#define MCF_EDMA_TCD4_CITER_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD4_CITER_ELINK */ ++#define MCF_EDMA_TCD4_CITER_ELINK_CITER(x) (((x)&0x01FF)) ++#define MCF_EDMA_TCD4_CITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) ++#define MCF_EDMA_TCD4_CITER_ELINK_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD4_DOFF */ ++#define MCF_EDMA_TCD4_DOFF_DOFF(x) (x) ++ ++/* Bit definitions and macros for TCD4_DLAST_SGA */ ++#define MCF_EDMA_TCD4_DLAST_SGA_DLAST_SGA(x) (x) ++ ++/* Bit definitions and macros for TCD4_BITER */ ++#define MCF_EDMA_TCD4_BITER_BITER(x) (((x)&0x7FFF)) ++#define MCF_EDMA_TCD4_BITER_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD4_BITER_ELINK */ ++#define MCF_EDMA_TCD4_BITER_ELINK_BITER(x) (((x)&0x01FF)) ++#define MCF_EDMA_TCD4_BITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) ++#define MCF_EDMA_TCD4_BITER_ELINK_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD4_CSR */ ++#define MCF_EDMA_TCD4_CSR_START (0x0001) ++#define MCF_EDMA_TCD4_CSR_INT_MAJOR (0x0002) ++#define MCF_EDMA_TCD4_CSR_INT_HALF (0x0004) ++#define MCF_EDMA_TCD4_CSR_D_REQ (0x0008) ++#define MCF_EDMA_TCD4_CSR_E_SG (0x0010) ++#define MCF_EDMA_TCD4_CSR_E_LINK (0x0020) ++#define MCF_EDMA_TCD4_CSR_ACTIVE (0x0040) ++#define MCF_EDMA_TCD4_CSR_DONE (0x0080) ++#define MCF_EDMA_TCD4_CSR_LINKCH(x) (((x)&0x003F)<<8) ++#define MCF_EDMA_TCD4_CSR_BWC(x) (((x)&0x0003)<<14) ++ ++/* Bit definitions and macros for TCD5_SADDR */ ++#define MCF_EDMA_TCD5_SADDR_SADDR(x) (x) ++ ++/* Bit definitions and macros for TCD5_ATTR */ ++#define MCF_EDMA_TCD5_ATTR_DSIZE(x) (((x)&0x0007)) ++#define MCF_EDMA_TCD5_ATTR_DMOD(x) (((x)&0x001F)<<3) ++#define MCF_EDMA_TCD5_ATTR_SSIZE(x) (((x)&0x0007)<<8) ++#define MCF_EDMA_TCD5_ATTR_SMOD(x) (((x)&0x001F)<<11) ++ ++/* Bit definitions and macros for TCD5_SOFF */ ++#define MCF_EDMA_TCD5_SOFF_SOFF(x) (x) ++ ++/* Bit definitions and macros for TCD5_NBYTES */ ++#define MCF_EDMA_TCD5_NBYTES_NBYTES(x) (x) ++ ++/* Bit definitions and macros for TCD5_SLAST */ ++#define MCF_EDMA_TCD5_SLAST_SLAST(x) (x) ++ ++/* Bit definitions and macros for TCD5_DADDR */ ++#define MCF_EDMA_TCD5_DADDR_DADDR(x) (x) ++ ++/* Bit definitions and macros for TCD5_CITER */ ++#define MCF_EDMA_TCD5_CITER_CITER(x) (((x)&0x7FFF)) ++#define MCF_EDMA_TCD5_CITER_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD5_CITER_ELINK */ ++#define MCF_EDMA_TCD5_CITER_ELINK_CITER(x) (((x)&0x01FF)) ++#define MCF_EDMA_TCD5_CITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) ++#define MCF_EDMA_TCD5_CITER_ELINK_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD5_DOFF */ ++#define MCF_EDMA_TCD5_DOFF_DOFF(x) (x) ++ ++/* Bit definitions and macros for TCD5_DLAST_SGA */ ++#define MCF_EDMA_TCD5_DLAST_SGA_DLAST_SGA(x) (x) ++ ++/* Bit definitions and macros for TCD5_BITER_ELINK */ ++#define MCF_EDMA_TCD5_BITER_ELINK_BITER(x) (((x)&0x01FF)) ++#define MCF_EDMA_TCD5_BITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) ++#define MCF_EDMA_TCD5_BITER_ELINK_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD5_BITER */ ++#define MCF_EDMA_TCD5_BITER_BITER(x) (((x)&0x7FFF)) ++#define MCF_EDMA_TCD5_BITER_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD5_CSR */ ++#define MCF_EDMA_TCD5_CSR_START (0x0001) ++#define MCF_EDMA_TCD5_CSR_INT_MAJOR (0x0002) ++#define MCF_EDMA_TCD5_CSR_INT_HALF (0x0004) ++#define MCF_EDMA_TCD5_CSR_D_REQ (0x0008) ++#define MCF_EDMA_TCD5_CSR_E_SG (0x0010) ++#define MCF_EDMA_TCD5_CSR_E_LINK (0x0020) ++#define MCF_EDMA_TCD5_CSR_ACTIVE (0x0040) ++#define MCF_EDMA_TCD5_CSR_DONE (0x0080) ++#define MCF_EDMA_TCD5_CSR_LINKCH(x) (((x)&0x003F)<<8) ++#define MCF_EDMA_TCD5_CSR_BWC(x) (((x)&0x0003)<<14) ++ ++/* Bit definitions and macros for TCD6_SADDR */ ++#define MCF_EDMA_TCD6_SADDR_SADDR(x) (x) ++ ++/* Bit definitions and macros for TCD6_ATTR */ ++#define MCF_EDMA_TCD6_ATTR_DSIZE(x) (((x)&0x0007)) ++#define MCF_EDMA_TCD6_ATTR_DMOD(x) (((x)&0x001F)<<3) ++#define MCF_EDMA_TCD6_ATTR_SSIZE(x) (((x)&0x0007)<<8) ++#define MCF_EDMA_TCD6_ATTR_SMOD(x) (((x)&0x001F)<<11) ++ ++/* Bit definitions and macros for TCD6_SOFF */ ++#define MCF_EDMA_TCD6_SOFF_SOFF(x) (x) ++ ++/* Bit definitions and macros for TCD6_NBYTES */ ++#define MCF_EDMA_TCD6_NBYTES_NBYTES(x) (x) ++ ++/* Bit definitions and macros for TCD6_SLAST */ ++#define MCF_EDMA_TCD6_SLAST_SLAST(x) (x) ++ ++/* Bit definitions and macros for TCD6_DADDR */ ++#define MCF_EDMA_TCD6_DADDR_DADDR(x) (x) ++ ++/* Bit definitions and macros for TCD6_CITER */ ++#define MCF_EDMA_TCD6_CITER_CITER(x) (((x)&0x7FFF)) ++#define MCF_EDMA_TCD6_CITER_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD6_CITER_ELINK */ ++#define MCF_EDMA_TCD6_CITER_ELINK_CITER(x) (((x)&0x01FF)) ++#define MCF_EDMA_TCD6_CITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) ++#define MCF_EDMA_TCD6_CITER_ELINK_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD6_DOFF */ ++#define MCF_EDMA_TCD6_DOFF_DOFF(x) (x) ++ ++/* Bit definitions and macros for TCD6_DLAST_SGA */ ++#define MCF_EDMA_TCD6_DLAST_SGA_DLAST_SGA(x) (x) ++ ++/* Bit definitions and macros for TCD6_BITER_ELINK */ ++#define MCF_EDMA_TCD6_BITER_ELINK_BITER(x) (((x)&0x01FF)) ++#define MCF_EDMA_TCD6_BITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) ++#define MCF_EDMA_TCD6_BITER_ELINK_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD6_BITER */ ++#define MCF_EDMA_TCD6_BITER_BITER(x) (((x)&0x7FFF)) ++#define MCF_EDMA_TCD6_BITER_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD6_CSR */ ++#define MCF_EDMA_TCD6_CSR_START (0x0001) ++#define MCF_EDMA_TCD6_CSR_INT_MAJOR (0x0002) ++#define MCF_EDMA_TCD6_CSR_INT_HALF (0x0004) ++#define MCF_EDMA_TCD6_CSR_D_REQ (0x0008) ++#define MCF_EDMA_TCD6_CSR_E_SG (0x0010) ++#define MCF_EDMA_TCD6_CSR_E_LINK (0x0020) ++#define MCF_EDMA_TCD6_CSR_ACTIVE (0x0040) ++#define MCF_EDMA_TCD6_CSR_DONE (0x0080) ++#define MCF_EDMA_TCD6_CSR_LINKCH(x) (((x)&0x003F)<<8) ++#define MCF_EDMA_TCD6_CSR_BWC(x) (((x)&0x0003)<<14) ++ ++/* Bit definitions and macros for TCD7_SADDR */ ++#define MCF_EDMA_TCD7_SADDR_SADDR(x) (x) ++ ++/* Bit definitions and macros for TCD7_ATTR */ ++#define MCF_EDMA_TCD7_ATTR_DSIZE(x) (((x)&0x0007)) ++#define MCF_EDMA_TCD7_ATTR_DMOD(x) (((x)&0x001F)<<3) ++#define MCF_EDMA_TCD7_ATTR_SSIZE(x) (((x)&0x0007)<<8) ++#define MCF_EDMA_TCD7_ATTR_SMOD(x) (((x)&0x001F)<<11) ++ ++/* Bit definitions and macros for TCD7_SOFF */ ++#define MCF_EDMA_TCD7_SOFF_SOFF(x) (x) ++ ++/* Bit definitions and macros for TCD7_NBYTES */ ++#define MCF_EDMA_TCD7_NBYTES_NBYTES(x) (x) ++ ++/* Bit definitions and macros for TCD7_SLAST */ ++#define MCF_EDMA_TCD7_SLAST_SLAST(x) (x) ++ ++/* Bit definitions and macros for TCD7_DADDR */ ++#define MCF_EDMA_TCD7_DADDR_DADDR(x) (x) ++ ++/* Bit definitions and macros for TCD7_CITER */ ++#define MCF_EDMA_TCD7_CITER_CITER(x) (((x)&0x7FFF)) ++#define MCF_EDMA_TCD7_CITER_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD7_CITER_ELINK */ ++#define MCF_EDMA_TCD7_CITER_ELINK_CITER(x) (((x)&0x01FF)) ++#define MCF_EDMA_TCD7_CITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) ++#define MCF_EDMA_TCD7_CITER_ELINK_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD7_DOFF */ ++#define MCF_EDMA_TCD7_DOFF_DOFF(x) (x) ++ ++/* Bit definitions and macros for TCD7_DLAST_SGA */ ++#define MCF_EDMA_TCD7_DLAST_SGA_DLAST_SGA(x) (x) ++ ++/* Bit definitions and macros for TCD7_BITER_ELINK */ ++#define MCF_EDMA_TCD7_BITER_ELINK_BITER(x) (((x)&0x01FF)) ++#define MCF_EDMA_TCD7_BITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) ++#define MCF_EDMA_TCD7_BITER_ELINK_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD7_BITER */ ++#define MCF_EDMA_TCD7_BITER_BITER(x) (((x)&0x7FFF)) ++#define MCF_EDMA_TCD7_BITER_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD7_CSR */ ++#define MCF_EDMA_TCD7_CSR_START (0x0001) ++#define MCF_EDMA_TCD7_CSR_INT_MAJOR (0x0002) ++#define MCF_EDMA_TCD7_CSR_INT_HALF (0x0004) ++#define MCF_EDMA_TCD7_CSR_D_REQ (0x0008) ++#define MCF_EDMA_TCD7_CSR_E_SG (0x0010) ++#define MCF_EDMA_TCD7_CSR_E_LINK (0x0020) ++#define MCF_EDMA_TCD7_CSR_ACTIVE (0x0040) ++#define MCF_EDMA_TCD7_CSR_DONE (0x0080) ++#define MCF_EDMA_TCD7_CSR_LINKCH(x) (((x)&0x003F)<<8) ++#define MCF_EDMA_TCD7_CSR_BWC(x) (((x)&0x0003)<<14) ++ ++/* Bit definitions and macros for TCD8_SADDR */ ++#define MCF_EDMA_TCD8_SADDR_SADDR(x) (x) ++ ++/* Bit definitions and macros for TCD8_ATTR */ ++#define MCF_EDMA_TCD8_ATTR_DSIZE(x) (((x)&0x0007)) ++#define MCF_EDMA_TCD8_ATTR_DMOD(x) (((x)&0x001F)<<3) ++#define MCF_EDMA_TCD8_ATTR_SSIZE(x) (((x)&0x0007)<<8) ++#define MCF_EDMA_TCD8_ATTR_SMOD(x) (((x)&0x001F)<<11) ++ ++/* Bit definitions and macros for TCD8_SOFF */ ++#define MCF_EDMA_TCD8_SOFF_SOFF(x) (x) ++ ++/* Bit definitions and macros for TCD8_NBYTES */ ++#define MCF_EDMA_TCD8_NBYTES_NBYTES(x) (x) ++ ++/* Bit definitions and macros for TCD8_SLAST */ ++#define MCF_EDMA_TCD8_SLAST_SLAST(x) (x) ++ ++/* Bit definitions and macros for TCD8_DADDR */ ++#define MCF_EDMA_TCD8_DADDR_DADDR(x) (x) ++ ++/* Bit definitions and macros for TCD8_CITER */ ++#define MCF_EDMA_TCD8_CITER_CITER(x) (((x)&0x7FFF)) ++#define MCF_EDMA_TCD8_CITER_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD8_CITER_ELINK */ ++#define MCF_EDMA_TCD8_CITER_ELINK_CITER(x) (((x)&0x01FF)) ++#define MCF_EDMA_TCD8_CITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) ++#define MCF_EDMA_TCD8_CITER_ELINK_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD8_DOFF */ ++#define MCF_EDMA_TCD8_DOFF_DOFF(x) (x) ++ ++/* Bit definitions and macros for TCD8_DLAST_SGA */ ++#define MCF_EDMA_TCD8_DLAST_SGA_DLAST_SGA(x) (x) ++ ++/* Bit definitions and macros for TCD8_BITER_ELINK */ ++#define MCF_EDMA_TCD8_BITER_ELINK_BITER(x) (((x)&0x01FF)) ++#define MCF_EDMA_TCD8_BITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) ++#define MCF_EDMA_TCD8_BITER_ELINK_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD8_BITER */ ++#define MCF_EDMA_TCD8_BITER_BITER(x) (((x)&0x7FFF)) ++#define MCF_EDMA_TCD8_BITER_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD8_CSR */ ++#define MCF_EDMA_TCD8_CSR_START (0x0001) ++#define MCF_EDMA_TCD8_CSR_INT_MAJOR (0x0002) ++#define MCF_EDMA_TCD8_CSR_INT_HALF (0x0004) ++#define MCF_EDMA_TCD8_CSR_D_REQ (0x0008) ++#define MCF_EDMA_TCD8_CSR_E_SG (0x0010) ++#define MCF_EDMA_TCD8_CSR_E_LINK (0x0020) ++#define MCF_EDMA_TCD8_CSR_ACTIVE (0x0040) ++#define MCF_EDMA_TCD8_CSR_DONE (0x0080) ++#define MCF_EDMA_TCD8_CSR_LINKCH(x) (((x)&0x003F)<<8) ++#define MCF_EDMA_TCD8_CSR_BWC(x) (((x)&0x0003)<<14) ++ ++/* Bit definitions and macros for TCD9_SADDR */ ++#define MCF_EDMA_TCD9_SADDR_SADDR(x) (x) ++ ++/* Bit definitions and macros for TCD9_ATTR */ ++#define MCF_EDMA_TCD9_ATTR_DSIZE(x) (((x)&0x0007)) ++#define MCF_EDMA_TCD9_ATTR_DMOD(x) (((x)&0x001F)<<3) ++#define MCF_EDMA_TCD9_ATTR_SSIZE(x) (((x)&0x0007)<<8) ++#define MCF_EDMA_TCD9_ATTR_SMOD(x) (((x)&0x001F)<<11) ++ ++/* Bit definitions and macros for TCD9_SOFF */ ++#define MCF_EDMA_TCD9_SOFF_SOFF(x) (x) ++ ++/* Bit definitions and macros for TCD9_NBYTES */ ++#define MCF_EDMA_TCD9_NBYTES_NBYTES(x) (x) ++ ++/* Bit definitions and macros for TCD9_SLAST */ ++#define MCF_EDMA_TCD9_SLAST_SLAST(x) (x) ++ ++/* Bit definitions and macros for TCD9_DADDR */ ++#define MCF_EDMA_TCD9_DADDR_DADDR(x) (x) ++ ++/* Bit definitions and macros for TCD9_CITER_ELINK */ ++#define MCF_EDMA_TCD9_CITER_ELINK_CITER(x) (((x)&0x01FF)) ++#define MCF_EDMA_TCD9_CITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) ++#define MCF_EDMA_TCD9_CITER_ELINK_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD9_CITER */ ++#define MCF_EDMA_TCD9_CITER_CITER(x) (((x)&0x7FFF)) ++#define MCF_EDMA_TCD9_CITER_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD9_DOFF */ ++#define MCF_EDMA_TCD9_DOFF_DOFF(x) (x) ++ ++/* Bit definitions and macros for TCD9_DLAST_SGA */ ++#define MCF_EDMA_TCD9_DLAST_SGA_DLAST_SGA(x) (x) ++ ++/* Bit definitions and macros for TCD9_BITER_ELINK */ ++#define MCF_EDMA_TCD9_BITER_ELINK_BITER(x) (((x)&0x01FF)) ++#define MCF_EDMA_TCD9_BITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) ++#define MCF_EDMA_TCD9_BITER_ELINK_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD9_BITER */ ++#define MCF_EDMA_TCD9_BITER_BITER(x) (((x)&0x7FFF)) ++#define MCF_EDMA_TCD9_BITER_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD9_CSR */ ++#define MCF_EDMA_TCD9_CSR_START (0x0001) ++#define MCF_EDMA_TCD9_CSR_INT_MAJOR (0x0002) ++#define MCF_EDMA_TCD9_CSR_INT_HALF (0x0004) ++#define MCF_EDMA_TCD9_CSR_D_REQ (0x0008) ++#define MCF_EDMA_TCD9_CSR_E_SG (0x0010) ++#define MCF_EDMA_TCD9_CSR_E_LINK (0x0020) ++#define MCF_EDMA_TCD9_CSR_ACTIVE (0x0040) ++#define MCF_EDMA_TCD9_CSR_DONE (0x0080) ++#define MCF_EDMA_TCD9_CSR_LINKCH(x) (((x)&0x003F)<<8) ++#define MCF_EDMA_TCD9_CSR_BWC(x) (((x)&0x0003)<<14) ++ ++/* Bit definitions and macros for TCD10_SADDR */ ++#define MCF_EDMA_TCD10_SADDR_SADDR(x) (x) ++ ++/* Bit definitions and macros for TCD10_ATTR */ ++#define MCF_EDMA_TCD10_ATTR_DSIZE(x) (((x)&0x0007)) ++#define MCF_EDMA_TCD10_ATTR_DMOD(x) (((x)&0x001F)<<3) ++#define MCF_EDMA_TCD10_ATTR_SSIZE(x) (((x)&0x0007)<<8) ++#define MCF_EDMA_TCD10_ATTR_SMOD(x) (((x)&0x001F)<<11) ++ ++/* Bit definitions and macros for TCD10_SOFF */ ++#define MCF_EDMA_TCD10_SOFF_SOFF(x) (x) ++ ++/* Bit definitions and macros for TCD10_NBYTES */ ++#define MCF_EDMA_TCD10_NBYTES_NBYTES(x) (x) ++ ++/* Bit definitions and macros for TCD10_SLAST */ ++#define MCF_EDMA_TCD10_SLAST_SLAST(x) (x) ++ ++/* Bit definitions and macros for TCD10_DADDR */ ++#define MCF_EDMA_TCD10_DADDR_DADDR(x) (x) ++ ++/* Bit definitions and macros for TCD10_CITER_ELINK */ ++#define MCF_EDMA_TCD10_CITER_ELINK_CITER(x) (((x)&0x01FF)) ++#define MCF_EDMA_TCD10_CITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) ++#define MCF_EDMA_TCD10_CITER_ELINK_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD10_CITER */ ++#define MCF_EDMA_TCD10_CITER_CITER(x) (((x)&0x7FFF)) ++#define MCF_EDMA_TCD10_CITER_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD10_DOFF */ ++#define MCF_EDMA_TCD10_DOFF_DOFF(x) (x) ++ ++/* Bit definitions and macros for TCD10_DLAST_SGA */ ++#define MCF_EDMA_TCD10_DLAST_SGA_DLAST_SGA(x) (x) ++ ++/* Bit definitions and macros for TCD10_BITER */ ++#define MCF_EDMA_TCD10_BITER_BITER(x) (((x)&0x7FFF)) ++#define MCF_EDMA_TCD10_BITER_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD10_BITER_ELINK */ ++#define MCF_EDMA_TCD10_BITER_ELINK_BITER(x) (((x)&0x01FF)) ++#define MCF_EDMA_TCD10_BITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) ++#define MCF_EDMA_TCD10_BITER_ELINK_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD10_CSR */ ++#define MCF_EDMA_TCD10_CSR_START (0x0001) ++#define MCF_EDMA_TCD10_CSR_INT_MAJOR (0x0002) ++#define MCF_EDMA_TCD10_CSR_INT_HALF (0x0004) ++#define MCF_EDMA_TCD10_CSR_D_REQ (0x0008) ++#define MCF_EDMA_TCD10_CSR_E_SG (0x0010) ++#define MCF_EDMA_TCD10_CSR_E_LINK (0x0020) ++#define MCF_EDMA_TCD10_CSR_ACTIVE (0x0040) ++#define MCF_EDMA_TCD10_CSR_DONE (0x0080) ++#define MCF_EDMA_TCD10_CSR_LINKCH(x) (((x)&0x003F)<<8) ++#define MCF_EDMA_TCD10_CSR_BWC(x) (((x)&0x0003)<<14) ++ ++/* Bit definitions and macros for TCD11_SADDR */ ++#define MCF_EDMA_TCD11_SADDR_SADDR(x) (x) ++ ++/* Bit definitions and macros for TCD11_ATTR */ ++#define MCF_EDMA_TCD11_ATTR_DSIZE(x) (((x)&0x0007)) ++#define MCF_EDMA_TCD11_ATTR_DMOD(x) (((x)&0x001F)<<3) ++#define MCF_EDMA_TCD11_ATTR_SSIZE(x) (((x)&0x0007)<<8) ++#define MCF_EDMA_TCD11_ATTR_SMOD(x) (((x)&0x001F)<<11) ++ ++/* Bit definitions and macros for TCD11_SOFF */ ++#define MCF_EDMA_TCD11_SOFF_SOFF(x) (x) ++ ++/* Bit definitions and macros for TCD11_NBYTES */ ++#define MCF_EDMA_TCD11_NBYTES_NBYTES(x) (x) ++ ++/* Bit definitions and macros for TCD11_SLAST */ ++#define MCF_EDMA_TCD11_SLAST_SLAST(x) (x) ++ ++/* Bit definitions and macros for TCD11_DADDR */ ++#define MCF_EDMA_TCD11_DADDR_DADDR(x) (x) ++ ++/* Bit definitions and macros for TCD11_CITER */ ++#define MCF_EDMA_TCD11_CITER_CITER(x) (((x)&0x7FFF)) ++#define MCF_EDMA_TCD11_CITER_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD11_CITER_ELINK */ ++#define MCF_EDMA_TCD11_CITER_ELINK_CITER(x) (((x)&0x01FF)) ++#define MCF_EDMA_TCD11_CITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) ++#define MCF_EDMA_TCD11_CITER_ELINK_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD11_DOFF */ ++#define MCF_EDMA_TCD11_DOFF_DOFF(x) (x) ++ ++/* Bit definitions and macros for TCD11_DLAST_SGA */ ++#define MCF_EDMA_TCD11_DLAST_SGA_DLAST_SGA(x) (x) ++ ++/* Bit definitions and macros for TCD11_BITER */ ++#define MCF_EDMA_TCD11_BITER_BITER(x) (((x)&0x7FFF)) ++#define MCF_EDMA_TCD11_BITER_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD11_BITER_ELINK */ ++#define MCF_EDMA_TCD11_BITER_ELINK_BITER(x) (((x)&0x01FF)) ++#define MCF_EDMA_TCD11_BITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) ++#define MCF_EDMA_TCD11_BITER_ELINK_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD11_CSR */ ++#define MCF_EDMA_TCD11_CSR_START (0x0001) ++#define MCF_EDMA_TCD11_CSR_INT_MAJOR (0x0002) ++#define MCF_EDMA_TCD11_CSR_INT_HALF (0x0004) ++#define MCF_EDMA_TCD11_CSR_D_REQ (0x0008) ++#define MCF_EDMA_TCD11_CSR_E_SG (0x0010) ++#define MCF_EDMA_TCD11_CSR_E_LINK (0x0020) ++#define MCF_EDMA_TCD11_CSR_ACTIVE (0x0040) ++#define MCF_EDMA_TCD11_CSR_DONE (0x0080) ++#define MCF_EDMA_TCD11_CSR_LINKCH(x) (((x)&0x003F)<<8) ++#define MCF_EDMA_TCD11_CSR_BWC(x) (((x)&0x0003)<<14) ++ ++/* Bit definitions and macros for TCD12_SADDR */ ++#define MCF_EDMA_TCD12_SADDR_SADDR(x) (x) ++ ++/* Bit definitions and macros for TCD12_ATTR */ ++#define MCF_EDMA_TCD12_ATTR_DSIZE(x) (((x)&0x0007)) ++#define MCF_EDMA_TCD12_ATTR_DMOD(x) (((x)&0x001F)<<3) ++#define MCF_EDMA_TCD12_ATTR_SSIZE(x) (((x)&0x0007)<<8) ++#define MCF_EDMA_TCD12_ATTR_SMOD(x) (((x)&0x001F)<<11) ++ ++/* Bit definitions and macros for TCD12_SOFF */ ++#define MCF_EDMA_TCD12_SOFF_SOFF(x) (x) ++ ++/* Bit definitions and macros for TCD12_NBYTES */ ++#define MCF_EDMA_TCD12_NBYTES_NBYTES(x) (x) ++ ++/* Bit definitions and macros for TCD12_SLAST */ ++#define MCF_EDMA_TCD12_SLAST_SLAST(x) (x) ++ ++/* Bit definitions and macros for TCD12_DADDR */ ++#define MCF_EDMA_TCD12_DADDR_DADDR(x) (x) ++ ++/* Bit definitions and macros for TCD12_CITER */ ++#define MCF_EDMA_TCD12_CITER_CITER(x) (((x)&0x7FFF)) ++#define MCF_EDMA_TCD12_CITER_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD12_CITER_ELINK */ ++#define MCF_EDMA_TCD12_CITER_ELINK_CITER(x) (((x)&0x01FF)) ++#define MCF_EDMA_TCD12_CITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) ++#define MCF_EDMA_TCD12_CITER_ELINK_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD12_DOFF */ ++#define MCF_EDMA_TCD12_DOFF_DOFF(x) (x) ++ ++/* Bit definitions and macros for TCD12_DLAST_SGA */ ++#define MCF_EDMA_TCD12_DLAST_SGA_DLAST_SGA(x) (x) ++ ++/* Bit definitions and macros for TCD12_BITER */ ++#define MCF_EDMA_TCD12_BITER_BITER(x) (((x)&0x7FFF)) ++#define MCF_EDMA_TCD12_BITER_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD12_BITER_ELINK */ ++#define MCF_EDMA_TCD12_BITER_ELINK_BITER(x) (((x)&0x01FF)) ++#define MCF_EDMA_TCD12_BITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) ++#define MCF_EDMA_TCD12_BITER_ELINK_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD12_CSR */ ++#define MCF_EDMA_TCD12_CSR_START (0x0001) ++#define MCF_EDMA_TCD12_CSR_INT_MAJOR (0x0002) ++#define MCF_EDMA_TCD12_CSR_INT_HALF (0x0004) ++#define MCF_EDMA_TCD12_CSR_D_REQ (0x0008) ++#define MCF_EDMA_TCD12_CSR_E_SG (0x0010) ++#define MCF_EDMA_TCD12_CSR_E_LINK (0x0020) ++#define MCF_EDMA_TCD12_CSR_ACTIVE (0x0040) ++#define MCF_EDMA_TCD12_CSR_DONE (0x0080) ++#define MCF_EDMA_TCD12_CSR_LINKCH(x) (((x)&0x003F)<<8) ++#define MCF_EDMA_TCD12_CSR_BWC(x) (((x)&0x0003)<<14) ++ ++/* Bit definitions and macros for TCD13_SADDR */ ++#define MCF_EDMA_TCD13_SADDR_SADDR(x) (x) ++ ++/* Bit definitions and macros for TCD13_ATTR */ ++#define MCF_EDMA_TCD13_ATTR_DSIZE(x) (((x)&0x0007)) ++#define MCF_EDMA_TCD13_ATTR_DMOD(x) (((x)&0x001F)<<3) ++#define MCF_EDMA_TCD13_ATTR_SSIZE(x) (((x)&0x0007)<<8) ++#define MCF_EDMA_TCD13_ATTR_SMOD(x) (((x)&0x001F)<<11) ++ ++/* Bit definitions and macros for TCD13_SOFF */ ++#define MCF_EDMA_TCD13_SOFF_SOFF(x) (x) ++ ++/* Bit definitions and macros for TCD13_NBYTES */ ++#define MCF_EDMA_TCD13_NBYTES_NBYTES(x) (x) ++ ++/* Bit definitions and macros for TCD13_SLAST */ ++#define MCF_EDMA_TCD13_SLAST_SLAST(x) (x) ++ ++/* Bit definitions and macros for TCD13_DADDR */ ++#define MCF_EDMA_TCD13_DADDR_DADDR(x) (x) ++ ++/* Bit definitions and macros for TCD13_CITER_ELINK */ ++#define MCF_EDMA_TCD13_CITER_ELINK_CITER(x) (((x)&0x01FF)) ++#define MCF_EDMA_TCD13_CITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) ++#define MCF_EDMA_TCD13_CITER_ELINK_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD13_CITER */ ++#define MCF_EDMA_TCD13_CITER_CITER(x) (((x)&0x7FFF)) ++#define MCF_EDMA_TCD13_CITER_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD13_DOFF */ ++#define MCF_EDMA_TCD13_DOFF_DOFF(x) (x) ++ ++/* Bit definitions and macros for TCD13_DLAST_SGA */ ++#define MCF_EDMA_TCD13_DLAST_SGA_DLAST_SGA(x) (x) ++ ++/* Bit definitions and macros for TCD13_BITER_ELINK */ ++#define MCF_EDMA_TCD13_BITER_ELINK_BITER(x) (((x)&0x01FF)) ++#define MCF_EDMA_TCD13_BITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) ++#define MCF_EDMA_TCD13_BITER_ELINK_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD13_BITER */ ++#define MCF_EDMA_TCD13_BITER_BITER(x) (((x)&0x7FFF)) ++#define MCF_EDMA_TCD13_BITER_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD13_CSR */ ++#define MCF_EDMA_TCD13_CSR_START (0x0001) ++#define MCF_EDMA_TCD13_CSR_INT_MAJOR (0x0002) ++#define MCF_EDMA_TCD13_CSR_INT_HALF (0x0004) ++#define MCF_EDMA_TCD13_CSR_D_REQ (0x0008) ++#define MCF_EDMA_TCD13_CSR_E_SG (0x0010) ++#define MCF_EDMA_TCD13_CSR_E_LINK (0x0020) ++#define MCF_EDMA_TCD13_CSR_ACTIVE (0x0040) ++#define MCF_EDMA_TCD13_CSR_DONE (0x0080) ++#define MCF_EDMA_TCD13_CSR_LINKCH(x) (((x)&0x003F)<<8) ++#define MCF_EDMA_TCD13_CSR_BWC(x) (((x)&0x0003)<<14) ++ ++/* Bit definitions and macros for TCD14_SADDR */ ++#define MCF_EDMA_TCD14_SADDR_SADDR(x) (x) ++ ++/* Bit definitions and macros for TCD14_ATTR */ ++#define MCF_EDMA_TCD14_ATTR_DSIZE(x) (((x)&0x0007)) ++#define MCF_EDMA_TCD14_ATTR_DMOD(x) (((x)&0x001F)<<3) ++#define MCF_EDMA_TCD14_ATTR_SSIZE(x) (((x)&0x0007)<<8) ++#define MCF_EDMA_TCD14_ATTR_SMOD(x) (((x)&0x001F)<<11) ++ ++/* Bit definitions and macros for TCD14_SOFF */ ++#define MCF_EDMA_TCD14_SOFF_SOFF(x) (x) ++ ++/* Bit definitions and macros for TCD14_NBYTES */ ++#define MCF_EDMA_TCD14_NBYTES_NBYTES(x) (x) ++ ++/* Bit definitions and macros for TCD14_SLAST */ ++#define MCF_EDMA_TCD14_SLAST_SLAST(x) (x) ++ ++/* Bit definitions and macros for TCD14_DADDR */ ++#define MCF_EDMA_TCD14_DADDR_DADDR(x) (x) ++ ++/* Bit definitions and macros for TCD14_CITER */ ++#define MCF_EDMA_TCD14_CITER_CITER(x) (((x)&0x7FFF)) ++#define MCF_EDMA_TCD14_CITER_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD14_CITER_ELINK */ ++#define MCF_EDMA_TCD14_CITER_ELINK_CITER(x) (((x)&0x01FF)) ++#define MCF_EDMA_TCD14_CITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) ++#define MCF_EDMA_TCD14_CITER_ELINK_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD14_DOFF */ ++#define MCF_EDMA_TCD14_DOFF_DOFF(x) (x) ++ ++/* Bit definitions and macros for TCD14_DLAST_SGA */ ++#define MCF_EDMA_TCD14_DLAST_SGA_DLAST_SGA(x) (x) ++ ++/* Bit definitions and macros for TCD14_BITER_ELINK */ ++#define MCF_EDMA_TCD14_BITER_ELINK_BITER(x) (((x)&0x01FF)) ++#define MCF_EDMA_TCD14_BITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) ++#define MCF_EDMA_TCD14_BITER_ELINK_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD14_BITER */ ++#define MCF_EDMA_TCD14_BITER_BITER(x) (((x)&0x7FFF)) ++#define MCF_EDMA_TCD14_BITER_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD14_CSR */ ++#define MCF_EDMA_TCD14_CSR_START (0x0001) ++#define MCF_EDMA_TCD14_CSR_INT_MAJOR (0x0002) ++#define MCF_EDMA_TCD14_CSR_INT_HALF (0x0004) ++#define MCF_EDMA_TCD14_CSR_D_REQ (0x0008) ++#define MCF_EDMA_TCD14_CSR_E_SG (0x0010) ++#define MCF_EDMA_TCD14_CSR_E_LINK (0x0020) ++#define MCF_EDMA_TCD14_CSR_ACTIVE (0x0040) ++#define MCF_EDMA_TCD14_CSR_DONE (0x0080) ++#define MCF_EDMA_TCD14_CSR_LINKCH(x) (((x)&0x003F)<<8) ++#define MCF_EDMA_TCD14_CSR_BWC(x) (((x)&0x0003)<<14) ++ ++/* Bit definitions and macros for TCD15_SADDR */ ++#define MCF_EDMA_TCD15_SADDR_SADDR(x) (x) ++ ++/* Bit definitions and macros for TCD15_ATTR */ ++#define MCF_EDMA_TCD15_ATTR_DSIZE(x) (((x)&0x0007)) ++#define MCF_EDMA_TCD15_ATTR_DMOD(x) (((x)&0x001F)<<3) ++#define MCF_EDMA_TCD15_ATTR_SSIZE(x) (((x)&0x0007)<<8) ++#define MCF_EDMA_TCD15_ATTR_SMOD(x) (((x)&0x001F)<<11) ++ ++/* Bit definitions and macros for TCD15_SOFF */ ++#define MCF_EDMA_TCD15_SOFF_SOFF(x) (x) ++ ++/* Bit definitions and macros for TCD15_NBYTES */ ++#define MCF_EDMA_TCD15_NBYTES_NBYTES(x) (x) ++ ++/* Bit definitions and macros for TCD15_SLAST */ ++#define MCF_EDMA_TCD15_SLAST_SLAST(x) (x) ++ ++/* Bit definitions and macros for TCD15_DADDR */ ++#define MCF_EDMA_TCD15_DADDR_DADDR(x) (x) ++ ++/* Bit definitions and macros for TCD15_CITER_ELINK */ ++#define MCF_EDMA_TCD15_CITER_ELINK_CITER(x) (((x)&0x01FF)) ++#define MCF_EDMA_TCD15_CITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) ++#define MCF_EDMA_TCD15_CITER_ELINK_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD15_CITER */ ++#define MCF_EDMA_TCD15_CITER_CITER(x) (((x)&0x7FFF)) ++#define MCF_EDMA_TCD15_CITER_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD15_DOFF */ ++#define MCF_EDMA_TCD15_DOFF_DOFF(x) (x) ++ ++/* Bit definitions and macros for TCD15_DLAST_SGA */ ++#define MCF_EDMA_TCD15_DLAST_SGA_DLAST_SGA(x) (x) ++ ++/* Bit definitions and macros for TCD15_BITER */ ++#define MCF_EDMA_TCD15_BITER_BITER(x) (((x)&0x7FFF)) ++#define MCF_EDMA_TCD15_BITER_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD15_BITER_ELINK */ ++#define MCF_EDMA_TCD15_BITER_ELINK_BITER(x) (((x)&0x01FF)) ++#define MCF_EDMA_TCD15_BITER_ELINK_LINKCH(x) (((x)&0x003F)<<9) ++#define MCF_EDMA_TCD15_BITER_ELINK_E_LINK (0x8000) ++ ++/* Bit definitions and macros for TCD15_CSR */ ++#define MCF_EDMA_TCD15_CSR_START (0x0001) ++#define MCF_EDMA_TCD15_CSR_INT_MAJOR (0x0002) ++#define MCF_EDMA_TCD15_CSR_INT_HALF (0x0004) ++#define MCF_EDMA_TCD15_CSR_D_REQ (0x0008) ++#define MCF_EDMA_TCD15_CSR_E_SG (0x0010) ++#define MCF_EDMA_TCD15_CSR_E_LINK (0x0020) ++#define MCF_EDMA_TCD15_CSR_ACTIVE (0x0040) ++#define MCF_EDMA_TCD15_CSR_DONE (0x0080) ++#define MCF_EDMA_TCD15_CSR_LINKCH(x) (((x)&0x003F)<<8) ++#define MCF_EDMA_TCD15_CSR_BWC(x) (((x)&0x0003)<<14) ++ ++/********************************************************************/ ++ ++#endif /* __MCF5445X_EDMA_H__ */ +--- /dev/null ++++ b/include/asm-m68k/mcf5445x_eport.h +@@ -0,0 +1,117 @@ ++/* ++ * Kurt Mahan kmahan@freescale.com ++ * ++ * Copyright Freescale Semiconductor, Inc. 2007 ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ */ ++ ++#ifndef __MCF5445X_EPORT_H__ ++#define __MCF5445X_EPORT_H__ ++ ++/********************************************************************* ++* ++* Edge Port Module (EPORT) ++* ++*********************************************************************/ ++ ++/* Register read/write macros */ ++#define MCF_EPORT_EPPAR MCF_REG16(0xFC094000) ++#define MCF_EPORT_EPDDR MCF_REG08(0xFC094002) ++#define MCF_EPORT_EPIER MCF_REG08(0xFC094003) ++#define MCF_EPORT_EPDR MCF_REG08(0xFC094004) ++#define MCF_EPORT_EPPDR MCF_REG08(0xFC094005) ++#define MCF_EPORT_EPFR MCF_REG08(0xFC094006) ++ ++/* Bit definitions and macros for EPPAR */ ++#define MCF_EPORT_EPPAR_EPPA1(x) (((x)&0x0003)<<2) ++#define MCF_EPORT_EPPAR_EPPA2(x) (((x)&0x0003)<<4) ++#define MCF_EPORT_EPPAR_EPPA3(x) (((x)&0x0003)<<6) ++#define MCF_EPORT_EPPAR_EPPA4(x) (((x)&0x0003)<<8) ++#define MCF_EPORT_EPPAR_EPPA5(x) (((x)&0x0003)<<10) ++#define MCF_EPORT_EPPAR_EPPA6(x) (((x)&0x0003)<<12) ++#define MCF_EPORT_EPPAR_EPPA7(x) (((x)&0x0003)<<14) ++#define MCF_EPORT_EPPAR_LEVEL (0) ++#define MCF_EPORT_EPPAR_RISING (1) ++#define MCF_EPORT_EPPAR_FALLING (2) ++#define MCF_EPORT_EPPAR_BOTH (3) ++#define MCF_EPORT_EPPAR_EPPA7_LEVEL (0x0000) ++#define MCF_EPORT_EPPAR_EPPA7_RISING (0x4000) ++#define MCF_EPORT_EPPAR_EPPA7_FALLING (0x8000) ++#define MCF_EPORT_EPPAR_EPPA7_BOTH (0xC000) ++#define MCF_EPORT_EPPAR_EPPA6_LEVEL (0x0000) ++#define MCF_EPORT_EPPAR_EPPA6_RISING (0x1000) ++#define MCF_EPORT_EPPAR_EPPA6_FALLING (0x2000) ++#define MCF_EPORT_EPPAR_EPPA6_BOTH (0x3000) ++#define MCF_EPORT_EPPAR_EPPA5_LEVEL (0x0000) ++#define MCF_EPORT_EPPAR_EPPA5_RISING (0x0400) ++#define MCF_EPORT_EPPAR_EPPA5_FALLING (0x0800) ++#define MCF_EPORT_EPPAR_EPPA5_BOTH (0x0C00) ++#define MCF_EPORT_EPPAR_EPPA4_LEVEL (0x0000) ++#define MCF_EPORT_EPPAR_EPPA4_RISING (0x0100) ++#define MCF_EPORT_EPPAR_EPPA4_FALLING (0x0200) ++#define MCF_EPORT_EPPAR_EPPA4_BOTH (0x0300) ++#define MCF_EPORT_EPPAR_EPPA3_LEVEL (0x0000) ++#define MCF_EPORT_EPPAR_EPPA3_RISING (0x0040) ++#define MCF_EPORT_EPPAR_EPPA3_FALLING (0x0080) ++#define MCF_EPORT_EPPAR_EPPA3_BOTH (0x00C0) ++#define MCF_EPORT_EPPAR_EPPA2_LEVEL (0x0000) ++#define MCF_EPORT_EPPAR_EPPA2_RISING (0x0010) ++#define MCF_EPORT_EPPAR_EPPA2_FALLING (0x0020) ++#define MCF_EPORT_EPPAR_EPPA2_BOTH (0x0030) ++#define MCF_EPORT_EPPAR_EPPA1_LEVEL (0x0000) ++#define MCF_EPORT_EPPAR_EPPA1_RISING (0x0004) ++#define MCF_EPORT_EPPAR_EPPA1_FALLING (0x0008) ++#define MCF_EPORT_EPPAR_EPPA1_BOTH (0x000C) ++ ++/* Bit definitions and macros for EPDDR */ ++#define MCF_EPORT_EPDDR_EPDD1 (0x02) ++#define MCF_EPORT_EPDDR_EPDD2 (0x04) ++#define MCF_EPORT_EPDDR_EPDD3 (0x08) ++#define MCF_EPORT_EPDDR_EPDD4 (0x10) ++#define MCF_EPORT_EPDDR_EPDD5 (0x20) ++#define MCF_EPORT_EPDDR_EPDD6 (0x40) ++#define MCF_EPORT_EPDDR_EPDD7 (0x80) ++ ++/* Bit definitions and macros for EPIER */ ++#define MCF_EPORT_EPIER_EPIE1 (0x02) ++#define MCF_EPORT_EPIER_EPIE2 (0x04) ++#define MCF_EPORT_EPIER_EPIE3 (0x08) ++#define MCF_EPORT_EPIER_EPIE4 (0x10) ++#define MCF_EPORT_EPIER_EPIE5 (0x20) ++#define MCF_EPORT_EPIER_EPIE6 (0x40) ++#define MCF_EPORT_EPIER_EPIE7 (0x80) ++ ++/* Bit definitions and macros for EPDR */ ++#define MCF_EPORT_EPDR_EPD1 (0x02) ++#define MCF_EPORT_EPDR_EPD2 (0x04) ++#define MCF_EPORT_EPDR_EPD3 (0x08) ++#define MCF_EPORT_EPDR_EPD4 (0x10) ++#define MCF_EPORT_EPDR_EPD5 (0x20) ++#define MCF_EPORT_EPDR_EPD6 (0x40) ++#define MCF_EPORT_EPDR_EPD7 (0x80) ++ ++/* Bit definitions and macros for EPPDR */ ++#define MCF_EPORT_EPPDR_EPPD1 (0x02) ++#define MCF_EPORT_EPPDR_EPPD2 (0x04) ++#define MCF_EPORT_EPPDR_EPPD3 (0x08) ++#define MCF_EPORT_EPPDR_EPPD4 (0x10) ++#define MCF_EPORT_EPPDR_EPPD5 (0x20) ++#define MCF_EPORT_EPPDR_EPPD6 (0x40) ++#define MCF_EPORT_EPPDR_EPPD7 (0x80) ++ ++/* Bit definitions and macros for EPFR */ ++#define MCF_EPORT_EPFR_EPF1 (0x02) ++#define MCF_EPORT_EPFR_EPF2 (0x04) ++#define MCF_EPORT_EPFR_EPF3 (0x08) ++#define MCF_EPORT_EPFR_EPF4 (0x10) ++#define MCF_EPORT_EPFR_EPF5 (0x20) ++#define MCF_EPORT_EPFR_EPF6 (0x40) ++#define MCF_EPORT_EPFR_EPF7 (0x80) ++ ++/********************************************************************/ ++ ++#endif /* __MCF5445X_EPORT_H__ */ +--- /dev/null ++++ b/include/asm-m68k/mcf5445x_fbcs.h +@@ -0,0 +1,182 @@ ++/* ++ * Matt Waddel Matt.Waddel@freescale.com ++ * ++ * Copyright Freescale Semiconductor, Inc. 2007 ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ */ ++ ++#ifndef __MCF5445X_FBCS_H__ ++#define __MCF5445X_FBCS_H__ ++ ++/********************************************************************* ++* ++* FlexBus Chip Selects (FBCS) ++* ++*********************************************************************/ ++ ++/* Register read/write macros */ ++#define MCF_FBCS_CSAR0 MCF_REG32(0xFC008000) /* Chip-select Addr Register */ ++#define MCF_FBCS_CSMR0 MCF_REG32(0xFC008004) /* Chip-select Mask Register */ ++#define MCF_FBCS_CSCR0 MCF_REG32(0xFC008008) /* Chip-select Cntl Register */ ++#define MCF_FBCS_CSAR1 MCF_REG32(0xFC00800C) /* Chip-select Addr Register */ ++#define MCF_FBCS_CSMR1 MCF_REG32(0xFC008010) /* Chip-select Mask Register */ ++#define MCF_FBCS_CSCR1 MCF_REG32(0xFC008014) /* Chip-select Cntl Register */ ++#define MCF_FBCS_CSAR2 MCF_REG32(0xFC008018) /* Chip-select Addr Register */ ++#define MCF_FBCS_CSMR2 MCF_REG32(0xFC00801C) /* Chip-select Mask Register */ ++#define MCF_FBCS_CSCR2 MCF_REG32(0xFC008020) /* Chip-select Cntl Register */ ++#define MCF_FBCS_CSAR3 MCF_REG32(0xFC008024) /* Chip-select Addr Register */ ++#define MCF_FBCS_CSMR3 MCF_REG32(0xFC008028) /* Chip-select Mask Register */ ++#define MCF_FBCS_CSCR3 MCF_REG32(0xFC00802C) /* Chip-select Cntl Register */ ++ ++/* Parameterized register read/write macros for multiple registers */ ++#define MCF_FBCS_CSAR(x) MCF_REG32(0xFC008000+((x)*0x00C)) /* Chip-select Addr Register */ ++#define MCF_FBCS_CSMR(x) MCF_REG32(0xFC008004+((x)*0x00C)) /* Chip-select Mask Register */ ++#define MCF_FBCS_CSCR(x) MCF_REG32(0xFC008008+((x)*0x00C)) /* Chip-select Cntl Register */ ++ ++/* Bit definitions and macros for CSAR group */ ++#define MCF_FBCS_CSAR_BA(x) ((x)&0xFFFF0000) ++ ++/* Bit definitions and macros for CSAR0 */ ++#define MCF_FBCS_CSAR0_BA(x) ((x)&0xFFFF0000) ++ ++/* Bit definitions and macros for CSMR group */ ++#define MCF_FBCS_CSMR_V (0x00000001) /* Valid bit */ ++#define MCF_FBCS_CSMR_WP (0x00000100) /* Write protect */ ++#define MCF_FBCS_CSMR_BAM(x) (((x)&0x0000FFFF)<<16) /* Base addr mask */ ++#define MCF_FBCS_CSMR_BAM_4G (0xFFFF0000) ++#define MCF_FBCS_CSMR_BAM_2G (0x7FFF0000) ++#define MCF_FBCS_CSMR_BAM_1G (0x3FFF0000) ++#define MCF_FBCS_CSMR_BAM_1024M (0x3FFF0000) ++#define MCF_FBCS_CSMR_BAM_512M (0x1FFF0000) ++#define MCF_FBCS_CSMR_BAM_256M (0x0FFF0000) ++#define MCF_FBCS_CSMR_BAM_128M (0x07FF0000) ++#define MCF_FBCS_CSMR_BAM_64M (0x03FF0000) ++#define MCF_FBCS_CSMR_BAM_32M (0x01FF0000) ++#define MCF_FBCS_CSMR_BAM_16M (0x00FF0000) ++#define MCF_FBCS_CSMR_BAM_8M (0x007F0000) ++#define MCF_FBCS_CSMR_BAM_4M (0x003F0000) ++#define MCF_FBCS_CSMR_BAM_2M (0x001F0000) ++#define MCF_FBCS_CSMR_BAM_1M (0x000F0000) ++#define MCF_FBCS_CSMR_BAM_1024K (0x000F0000) ++#define MCF_FBCS_CSMR_BAM_512K (0x00070000) ++#define MCF_FBCS_CSMR_BAM_256K (0x00030000) ++#define MCF_FBCS_CSMR_BAM_128K (0x00010000) ++#define MCF_FBCS_CSMR_BAM_64K (0x00000000) ++ ++/* Bit definitions and macros for CSMR0 */ ++#define MCF_FBCS_CSMR0_V (0x00000001) /* Valid bit */ ++#define MCF_FBCS_CSMR0_WP (0x00000100) /* Write protect */ ++#define MCF_FBCS_CSMR0_BAM(x) (((x)&0x0000FFFF)<<16) /* Base addr mask */ ++#define MCF_FBCS_CSMR0_BAM_4G (0xFFFF0000) ++#define MCF_FBCS_CSMR0_BAM_2G (0x7FFF0000) ++#define MCF_FBCS_CSMR0_BAM_1G (0x3FFF0000) ++#define MCF_FBCS_CSMR0_BAM_1024M (0x3FFF0000) ++#define MCF_FBCS_CSMR0_BAM_512M (0x1FFF0000) ++#define MCF_FBCS_CSMR0_BAM_256M (0x0FFF0000) ++#define MCF_FBCS_CSMR0_BAM_128M (0x07FF0000) ++#define MCF_FBCS_CSMR0_BAM_64M (0x03FF0000) ++#define MCF_FBCS_CSMR0_BAM_32M (0x01FF0000) ++#define MCF_FBCS_CSMR0_BAM_16M (0x00FF0000) ++#define MCF_FBCS_CSMR0_BAM_8M (0x007F0000) ++#define MCF_FBCS_CSMR0_BAM_4M (0x003F0000) ++#define MCF_FBCS_CSMR0_BAM_2M (0x001F0000) ++#define MCF_FBCS_CSMR0_BAM_1M (0x000F0000) ++#define MCF_FBCS_CSMR0_BAM_1024K (0x000F0000) ++#define MCF_FBCS_CSMR0_BAM_512K (0x00070000) ++#define MCF_FBCS_CSMR0_BAM_256K (0x00030000) ++#define MCF_FBCS_CSMR0_BAM_128K (0x00010000) ++#define MCF_FBCS_CSMR0_BAM_64K (0x00000000) ++ ++/* Bit definitions and macros for CSCR group */ ++#define MCF_FBCS_CSCR_BSTW (0x00000008) /* Burst-write enable */ ++#define MCF_FBCS_CSCR_BSTR (0x00000010) /* Burst-read enable */ ++#define MCF_FBCS_CSCR_BEM (0x00000020) /* Byte-enable mode */ ++#define MCF_FBCS_CSCR_PS(x) (((x)&0x00000003)<<6) /* Port size */ ++#define MCF_FBCS_CSCR_AA (0x00000100) /* Auto-acknowledge */ ++#define MCF_FBCS_CSCR_WS(x) (((x)&0x0000003F)<<10) /* Wait states */ ++#define MCF_FBCS_CSCR_WRAH(x) (((x)&0x00000003)<<16) /* Write address hold or deselect */ ++#define MCF_FBCS_CSCR_RDAH(x) (((x)&0x00000003)<<18) /* Read address hold or deselect */ ++#define MCF_FBCS_CSCR_ASET(x) (((x)&0x00000003)<<20) /* Address setup */ ++#define MCF_FBCS_CSCR_SWSEN (0x00800000) /* Secondary wait state enable */ ++#define MCF_FBCS_CSCR_SWS(x) (((x)&0x0000003F)<<26) /* Secondary wait states */ ++#define MCF_FBCS_CSCR_PS_8 (0x00000040) ++#define MCF_FBCS_CSCR_PS_16 (0x00000080) ++#define MCF_FBCS_CSCR_PS_32 (0x00000000) ++ ++/* Bit definitions and macros for CSCR0 */ ++#define MCF_FBCS_CSCR0_BSTW (0x00000008) /* Burst-write enable */ ++#define MCF_FBCS_CSCR0_BSTR (0x00000010) /* Burst-read enable */ ++#define MCF_FBCS_CSCR0_BEM (0x00000020) /* Byte-enable mode */ ++#define MCF_FBCS_CSCR0_PS(x) (((x)&0x00000003)<<6) /* Port size */ ++#define MCF_FBCS_CSCR0_AA (0x00000100) /* Auto-acknowledge */ ++#define MCF_FBCS_CSCR0_WS(x) (((x)&0x0000003F)<<10) /* Wait states */ ++#define MCF_FBCS_CSCR0_WRAH(x) (((x)&0x00000003)<<16) /* Write address hold or deselect */ ++#define MCF_FBCS_CSCR0_RDAH(x) (((x)&0x00000003)<<18) /* Read address hold or deselect */ ++#define MCF_FBCS_CSCR0_ASET(x) (((x)&0x00000003)<<20) /* Address setup */ ++#define MCF_FBCS_CSCR0_SWSEN (0x00800000) /* Secondary wait state enable */ ++#define MCF_FBCS_CSCR0_SWS(x) (((x)&0x0000003F)<<26) /* Secondary wait states */ ++#define MCF_FBCS_CSCR0_PS_8 (0x00000040) ++#define MCF_FBCS_CSCR0_PS_16 (0x00000080) ++#define MCF_FBCS_CSCR0_PS_32 (0x00000000) ++ ++/* Bit definitions and macros for CSMR1 */ ++#define MCF_FBCS_CSMR1_V (0x00000001) /* Valid bit */ ++#define MCF_FBCS_CSMR1_WP (0x00000100) /* Write protect */ ++#define MCF_FBCS_CSMR1_BAM(x) (((x)&0x0000FFFF)<<16) /* Base address mask */ ++ ++/* Bit definitions and macros for CSCR1 */ ++#define MCF_FBCS_CSCR1_BSTW (0x00000008) /* Burst-write enable */ ++#define MCF_FBCS_CSCR1_BSTR (0x00000010) /* Burst-read enable */ ++#define MCF_FBCS_CSCR1_BEM (0x00000020) /* Byte-enable mode */ ++#define MCF_FBCS_CSCR1_PS(x) (((x)&0x00000003)<<6) /* Port size */ ++#define MCF_FBCS_CSCR1_AA (0x00000100) /* Auto-acknowledge */ ++#define MCF_FBCS_CSCR1_WS(x) (((x)&0x0000003F)<<10) /* Wait states */ ++#define MCF_FBCS_CSCR1_WRAH(x) (((x)&0x00000003)<<16) /* Write address hold or deselect */ ++#define MCF_FBCS_CSCR1_RDAH(x) (((x)&0x00000003)<<18) /* Read address hold or deselect */ ++#define MCF_FBCS_CSCR1_ASET(x) (((x)&0x00000003)<<20) /* Address setup */ ++#define MCF_FBCS_CSCR1_SWSEN (0x00800000) /* Secondary wait state enable */ ++#define MCF_FBCS_CSCR1_SWS(x) (((x)&0x0000003F)<<26) /* Secondary wait states */ ++ ++/* Bit definitions and macros for CSMR2 */ ++#define MCF_FBCS_CSMR2_V (0x00000001) /* Valid bit */ ++#define MCF_FBCS_CSMR2_WP (0x00000100) /* Write protect */ ++#define MCF_FBCS_CSMR2_BAM(x) (((x)&0x0000FFFF)<<16) /* Base address mask */ ++ ++/* Bit definitions and macros for CSCR2 */ ++#define MCF_FBCS_CSCR2_BSTW (0x00000008) /* Burst-write enable */ ++#define MCF_FBCS_CSCR2_BSTR (0x00000010) /* Burst-read enable */ ++#define MCF_FBCS_CSCR2_BEM (0x00000020) /* Byte-enable mode */ ++#define MCF_FBCS_CSCR2_PS(x) (((x)&0x00000003)<<6) /* Port size */ ++#define MCF_FBCS_CSCR2_AA (0x00000100) /* Auto-acknowledge */ ++#define MCF_FBCS_CSCR2_WS(x) (((x)&0x0000003F)<<10) /* Wait states */ ++#define MCF_FBCS_CSCR2_WRAH(x) (((x)&0x00000003)<<16) /* Write address hold or deselect */ ++#define MCF_FBCS_CSCR2_RDAH(x) (((x)&0x00000003)<<18) /* Read address hold or deselect */ ++#define MCF_FBCS_CSCR2_ASET(x) (((x)&0x00000003)<<20) /* Address setup */ ++#define MCF_FBCS_CSCR2_SWSEN (0x00800000) /* Secondary wait state enable */ ++#define MCF_FBCS_CSCR2_SWS(x) (((x)&0x0000003F)<<26) /* Secondary wait states */ ++ ++/* Bit definitions and macros for CSMR3 */ ++#define MCF_FBCS_CSMR3_V (0x00000001) /* Valid bit */ ++#define MCF_FBCS_CSMR3_WP (0x00000100) /* Write protect */ ++#define MCF_FBCS_CSMR3_BAM(x) (((x)&0x0000FFFF)<<16) /* Base address mask */ ++ ++/* Bit definitions and macros for CSCR3 */ ++#define MCF_FBCS_CSCR3_BSTW (0x00000008) /* Burst-write enable */ ++#define MCF_FBCS_CSCR3_BSTR (0x00000010) /* Burst-read enable */ ++#define MCF_FBCS_CSCR3_BEM (0x00000020) /* Byte-enable mode */ ++#define MCF_FBCS_CSCR3_PS(x) (((x)&0x00000003)<<6) /* Port size */ ++#define MCF_FBCS_CSCR3_AA (0x00000100) /* Auto-acknowledge */ ++#define MCF_FBCS_CSCR3_WS(x) (((x)&0x0000003F)<<10) /* Wait states */ ++#define MCF_FBCS_CSCR3_WRAH(x) (((x)&0x00000003)<<16) /* Write address hold or deselect */ ++#define MCF_FBCS_CSCR3_RDAH(x) (((x)&0x00000003)<<18) /* Read address hold or deselect */ ++#define MCF_FBCS_CSCR3_ASET(x) (((x)&0x00000003)<<20) /* Address setup */ ++#define MCF_FBCS_CSCR3_SWSEN (0x00800000) /* Secondary wait state enable */ ++#define MCF_FBCS_CSCR3_SWS(x) (((x)&0x0000003F)<<26) /* Secondary wait states */ ++ ++/********************************************************************/ ++ ++#endif /* __MCF5445X_FBCS_H__ */ +--- /dev/null ++++ b/include/asm-m68k/mcf5445x_gpio.h +@@ -0,0 +1,1257 @@ ++/* ++ * Matt Waddel Matt.Waddel@freescale.com ++ * ++ * Copyright Freescale Semiconductor, Inc. 2007 ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ */ ++ ++#ifndef __MCF5445X_GPIO_H__ ++#define __MCF5445X_GPIO_H__ ++ ++/********************************************************************* ++* ++* General Purpose I/O Module (GPIO) ++* ++*********************************************************************/ ++ ++/* Register read/write macros */ ++#define MCF_GPIO_PODR_FEC0H MCF_REG08(0xFC0A4000) /* FEC0 High Port Output Data Register */ ++#define MCF_GPIO_PODR_FEC0L MCF_REG08(0xFC0A4001) /* FEC0 Low Port Output Data Register */ ++#define MCF_GPIO_PODR_SSI MCF_REG08(0xFC0A4002) /* SSI Port Output Data Register */ ++#define MCF_GPIO_PODR_FBCTL MCF_REG08(0xFC0A4003) /* Flexbus Control Port Output Data Register */ ++#define MCF_GPIO_PODR_BE MCF_REG08(0xFC0A4004) /* Flexbus Byte Enable Port Output Data Register */ ++#define MCF_GPIO_PODR_CS MCF_REG08(0xFC0A4005) /* Flexbus Chip-Select Port Output Data Register */ ++#define MCF_GPIO_PODR_DMA MCF_REG08(0xFC0A4006) /* DMA Port Output Data Register */ ++#define MCF_GPIO_PODR_FECI2C MCF_REG08(0xFC0A4007) /* FEC1 / I2C Port Output Data Register */ ++#define MCF_GPIO_PODR_UART MCF_REG08(0xFC0A4009) /* UART Port Output Data Register */ ++#define MCF_GPIO_PODR_DSPI MCF_REG08(0xFC0A400A) /* DSPI Port Output Data Register */ ++#define MCF_GPIO_PODR_TIMER MCF_REG08(0xFC0A400B) /* Timer Port Output Data Register */ ++#define MCF_GPIO_PODR_PCI MCF_REG08(0xFC0A400C) /* PCI Port Output Data Register */ ++#define MCF_GPIO_PODR_USB MCF_REG08(0xFC0A400D) /* USB Port Output Data Register */ ++#define MCF_GPIO_PODR_ATAH MCF_REG08(0xFC0A400E) /* ATA High Port Output Data Register */ ++#define MCF_GPIO_PODR_ATAL MCF_REG08(0xFC0A400F) /* ATA Low Port Output Data Register */ ++#define MCF_GPIO_PODR_FEC1H MCF_REG08(0xFC0A4010) /* FEC1 High Port Output Data Register */ ++#define MCF_GPIO_PODR_FEC1L MCF_REG08(0xFC0A4011) /* FEC1 Low Port Output Data Register */ ++#define MCF_GPIO_PODR_FBADH MCF_REG08(0xFC0A4014) /* Flexbus AD High Port Output Data Register */ ++#define MCF_GPIO_PODR_FBADMH MCF_REG08(0xFC0A4015) /* Flexbus AD Med-High Port Output Data Register */ ++#define MCF_GPIO_PODR_FBADML MCF_REG08(0xFC0A4016) /* Flexbus AD Med-Low Port Output Data Register */ ++#define MCF_GPIO_PODR_FBADL MCF_REG08(0xFC0A4017) /* Flexbus AD Low Port Output Data Register */ ++#define MCF_GPIO_PDDR_FEC0H MCF_REG08(0xFC0A4018) /* FEC0 High Port Data Direction Register */ ++#define MCF_GPIO_PDDR_FEC0L MCF_REG08(0xFC0A4019) /* FEC0 Low Port Data Direction Register */ ++#define MCF_GPIO_PDDR_SSI MCF_REG08(0xFC0A401A) /* SSI Port Data Direction Register */ ++#define MCF_GPIO_PDDR_FBCTL MCF_REG08(0xFC0A401B) /* Flexbus Control Port Data Direction Register */ ++#define MCF_GPIO_PDDR_BE MCF_REG08(0xFC0A401C) /* Flexbus Byte Enable Port Data Direction Register */ ++#define MCF_GPIO_PDDR_CS MCF_REG08(0xFC0A401D) /* Flexbus Chip-Select Port Data Direction Register */ ++#define MCF_GPIO_PDDR_DMA MCF_REG08(0xFC0A401E) /* DMA Port Data Direction Register */ ++#define MCF_GPIO_PDDR_FECI2C MCF_REG08(0xFC0A401F) /* FEC1 / I2C Port Data Direction Register */ ++#define MCF_GPIO_PDDR_UART MCF_REG08(0xFC0A4021) /* UART Port Data Direction Register */ ++#define MCF_GPIO_PDDR_DSPI MCF_REG08(0xFC0A4022) /* DSPI Port Data Direction Register */ ++#define MCF_GPIO_PDDR_TIMER MCF_REG08(0xFC0A4023) /* Timer Port Data Direction Register */ ++#define MCF_GPIO_PDDR_PCI MCF_REG08(0xFC0A4024) /* PCI Port Data Direction Register */ ++#define MCF_GPIO_PDDR_USB MCF_REG08(0xFC0A4025) /* USB Port Data Direction Register */ ++#define MCF_GPIO_PDDR_ATAH MCF_REG08(0xFC0A4026) /* ATA High Port Data Direction Register */ ++#define MCF_GPIO_PDDR_ATAL MCF_REG08(0xFC0A4027) /* ATA Low Port Data Direction Register */ ++#define MCF_GPIO_PDDR_FEC1H MCF_REG08(0xFC0A4028) /* FEC1 High Port Data Direction Register */ ++#define MCF_GPIO_PDDR_FEC1L MCF_REG08(0xFC0A4029) /* FEC1 Low Port Data Direction Register */ ++#define MCF_GPIO_PDDR_FBADH MCF_REG08(0xFC0A402C) /* Flexbus AD High Port Data Direction Register */ ++#define MCF_GPIO_PDDR_FBADMH MCF_REG08(0xFC0A402D) /* Flexbus AD Med-High Port Data Direction Register */ ++#define MCF_GPIO_PDDR_FBADML MCF_REG08(0xFC0A402E) /* Flexbus AD Med-Low Port Data Direction Register */ ++#define MCF_GPIO_PDDR_FBADL MCF_REG08(0xFC0A402F) /* Flexbus AD Low Port Data Direction Register */ ++#define MCF_GPIO_PPDSDR_FEC0H MCF_REG08(0xFC0A4030) /* FEC0 High Port Pin Data/Set Data Register */ ++#define MCF_GPIO_PPDSDR_FEC0L MCF_REG08(0xFC0A4031) /* FEC0 Low Port Clear Output Data Register */ ++#define MCF_GPIO_PPDSDR_SSI MCF_REG08(0xFC0A4032) /* SSI Port Pin Data/Set Data Register */ ++#define MCF_GPIO_PPDSDR_FBCTL MCF_REG08(0xFC0A4033) /* Flexbus Control Port Pin Data/Set Data Register */ ++#define MCF_GPIO_PPDSDR_BE MCF_REG08(0xFC0A4034) /* Flexbus Byte Enable Port Pin Data/Set Data Register */ ++#define MCF_GPIO_PPDSDR_CS MCF_REG08(0xFC0A4035) /* Flexbus Chip-Select Port Pin Data/Set Data Register */ ++#define MCF_GPIO_PPDSDR_DMA MCF_REG08(0xFC0A4036) /* DMA Port Pin Data/Set Data Register */ ++#define MCF_GPIO_PPDSDR_FECI2C MCF_REG08(0xFC0A4037) /* FEC1 / I2C Port Pin Data/Set Data Register */ ++#define MCF_GPIO_PPDSDR_UART MCF_REG08(0xFC0A4039) /* UART Port Pin Data/Set Data Register */ ++#define MCF_GPIO_PPDSDR_DSPI MCF_REG08(0xFC0A403A) /* DSPI Port Pin Data/Set Data Register */ ++#define MCF_GPIO_PPDSDR_TIMER MCF_REG08(0xFC0A403B) /* FTimer Port Pin Data/Set Data Register */ ++#define MCF_GPIO_PPDSDR_PCI MCF_REG08(0xFC0A403C) /* PCI Port Pin Data/Set Data Register */ ++#define MCF_GPIO_PPDSDR_USB MCF_REG08(0xFC0A403D) /* USB Port Pin Data/Set Data Register */ ++#define MCF_GPIO_PPDSDR_ATAH MCF_REG08(0xFC0A403E) /* ATA High Port Pin Data/Set Data Register */ ++#define MCF_GPIO_PPDSDR_ATAL MCF_REG08(0xFC0A403F) /* ATA Low Port Pin Data/Set Data Register */ ++#define MCF_GPIO_PPDSDR_FEC1H MCF_REG08(0xFC0A4040) /* FEC1 High Port Pin Data/Set Data Register */ ++#define MCF_GPIO_PPDSDR_FEC1L MCF_REG08(0xFC0A4041) /* FEC1 Low Port Pin Data/Set Data Register */ ++#define MCF_GPIO_PPDSDR_FBADH MCF_REG08(0xFC0A4044) /* Flexbus AD High Port Pin Data/Set Data Register */ ++#define MCF_GPIO_PPDSDR_FBADMH MCF_REG08(0xFC0A4045) /* Flexbus AD Med-High Port Pin Data/Set Data Register */ ++#define MCF_GPIO_PPDSDR_FBADML MCF_REG08(0xFC0A4046) /* Flexbus AD Med-Low Port Pin Data/Set Data Register */ ++#define MCF_GPIO_PPDSDR_FBADL MCF_REG08(0xFC0A4047) /* Flexbus AD Low Port Pin Data/Set Data Register */ ++#define MCF_GPIO_PCLRR_FEC0H MCF_REG08(0xFC0A4048) /* FEC0 High Port Clear Output Data Register */ ++#define MCF_GPIO_PCLRR_FEC0L MCF_REG08(0xFC0A4049) /* FEC0 Low Port Pin Data/Set Data Register */ ++#define MCF_GPIO_PCLRR_SSI MCF_REG08(0xFC0A404A) /* SSI Port Clear Output Data Register */ ++#define MCF_GPIO_PCLRR_FBCTL MCF_REG08(0xFC0A404B) /* Flexbus Control Port Clear Output Data Register */ ++#define MCF_GPIO_PCLRR_BE MCF_REG08(0xFC0A404C) /* Flexbus Byte Enable Port Clear Output Data Register */ ++#define MCF_GPIO_PCLRR_CS MCF_REG08(0xFC0A404D) /* Flexbus Chip-Select Port Clear Output Data Register */ ++#define MCF_GPIO_PCLRR_DMA MCF_REG08(0xFC0A404E) /* DMA Port Clear Output Data Register */ ++#define MCF_GPIO_PCLRR_FECI2C MCF_REG08(0xFC0A404F) /* FEC1 / I2C Port Clear Output Data Register */ ++#define MCF_GPIO_PCLRR_UART MCF_REG08(0xFC0A4051) /* UART Port Clear Output Data Register */ ++#define MCF_GPIO_PCLRR_DSPI MCF_REG08(0xFC0A4052) /* DSPI Port Clear Output Data Register */ ++#define MCF_GPIO_PCLRR_TIMER MCF_REG08(0xFC0A4053) /* Timer Port Clear Output Data Register */ ++#define MCF_GPIO_PCLRR_PCI MCF_REG08(0xFC0A4054) /* PCI Port Clear Output Data Register */ ++#define MCF_GPIO_PCLRR_USB MCF_REG08(0xFC0A4055) /* USB Port Clear Output Data Register */ ++#define MCF_GPIO_PCLRR_ATAH MCF_REG08(0xFC0A4056) /* ATA High Port Clear Output Data Register */ ++#define MCF_GPIO_PCLRR_ATAL MCF_REG08(0xFC0A4057) /* ATA Low Port Clear Output Data Register */ ++#define MCF_GPIO_PCLRR_FEC1H MCF_REG08(0xFC0A4058) /* FEC1 High Port Clear Output Data Register */ ++#define MCF_GPIO_PCLRR_FEC1L MCF_REG08(0xFC0A4059) /* FEC1 Low Port Clear Output Data Register */ ++#define MCF_GPIO_PCLRR_FBADH MCF_REG08(0xFC0A405C) /* Flexbus AD High Port Clear Output Data Register */ ++#define MCF_GPIO_PCLRR_FBADMH MCF_REG08(0xFC0A405D) /* Flexbus AD Med-High Port Clear Output Data Register */ ++#define MCF_GPIO_PCLRR_FBADML MCF_REG08(0xFC0A405E) /* Flexbus AD Med-Low Port Clear Output Data Register */ ++#define MCF_GPIO_PCLRR_FBADL MCF_REG08(0xFC0A405F) /* Flexbus AD Low Port Clear Output Data Register */ ++#define MCF_GPIO_PAR_FEC MCF_REG08(0xFC0A4060) /* FEC Pin Assignment Register */ ++#define MCF_GPIO_PAR_DMA MCF_REG08(0xFC0A4061) /* DMA Pin Assignment Register */ ++#define MCF_GPIO_PAR_FBCTL MCF_REG08(0xFC0A4062) /* Flexbus Control Pin Assignment Register */ ++#define MCF_GPIO_PAR_DSPI MCF_REG08(0xFC0A4063) /* DSPI Pin Assignment Register */ ++#define MCF_GPIO_PAR_BE MCF_REG08(0xFC0A4064) /* Flexbus Byte-Enable Pin Assignment Register */ ++#define MCF_GPIO_PAR_CS MCF_REG08(0xFC0A4065) /* Flexbus Chip-Select Pin Assignment Register */ ++#define MCF_GPIO_PAR_TIMER MCF_REG08(0xFC0A4066) /* Time Pin Assignment Register */ ++#define MCF_GPIO_PAR_USB MCF_REG08(0xFC0A4067) /* USB Pin Assignment Register */ ++#define MCF_GPIO_PAR_UART MCF_REG08(0xFC0A4069) /* UART Pin Assignment Register */ ++#define MCF_GPIO_PAR_FECI2C MCF_REG16(0xFC0A406A) /* FEC / I2C Pin Assignment Register */ ++#define MCF_GPIO_PAR_SSI MCF_REG16(0xFC0A406C) /* SSI Pin Assignment Register */ ++#define MCF_GPIO_PAR_ATA MCF_REG16(0xFC0A406E) /* ATA Pin Assignment Register */ ++#define MCF_GPIO_PAR_IRQ MCF_REG08(0xFC0A4070) /* IRQ Pin Assignment Register */ ++#define MCF_GPIO_PAR_PCI MCF_REG16(0xFC0A4072) /* PCI Pin Assignment Register */ ++#define MCF_GPIO_MSCR_SDRAM MCF_REG08(0xFC0A4074) /* SDRAM Mode Select Control Register */ ++#define MCF_GPIO_MSCR_PCI MCF_REG08(0xFC0A4075) /* PCI Mode Select Control Register */ ++#define MCF_GPIO_DSCR_I2C MCF_REG08(0xFC0A4078) /* I2C Drive Strength Control Register */ ++#define MCF_GPIO_DSCR_FLEXBUS MCF_REG08(0xFC0A4079) /* FLEXBUS Drive Strength Control Register */ ++#define MCF_GPIO_DSCR_FEC MCF_REG08(0xFC0A407A) /* FEC Drive Strength Control Register */ ++#define MCF_GPIO_DSCR_UART MCF_REG08(0xFC0A407B) /* UART Drive Strength Control Register */ ++#define MCF_GPIO_DSCR_DSPI MCF_REG08(0xFC0A407C) /* DSPI Drive Strength Control Register */ ++#define MCF_GPIO_DSCR_TIMER MCF_REG08(0xFC0A407D) /* TIMER Drive Strength Control Register */ ++#define MCF_GPIO_DSCR_SSI MCF_REG08(0xFC0A407E) /* SSI Drive Strength Control Register */ ++#define MCF_GPIO_DSCR_DMA MCF_REG08(0xFC0A407F) /* DMA Drive Strength Control Register */ ++#define MCF_GPIO_DSCR_DEBUG MCF_REG08(0xFC0A4080) /* DEBUG Drive Strength Control Register */ ++#define MCF_GPIO_DSCR_RESET MCF_REG08(0xFC0A4081) /* RESET Drive Strength Control Register */ ++#define MCF_GPIO_DSCR_IRQ MCF_REG08(0xFC0A4082) /* IRQ Drive Strength Control Register */ ++#define MCF_GPIO_DSCR_USB MCF_REG08(0xFC0A4083) /* USB Drive Strength Control Register */ ++#define MCF_GPIO_DSCR_ATA MCF_REG08(0xFC0A4084) /* ATA Drive Strength Control Register */ ++ ++/* Bit definitions and macros for PODR_FEC0H */ ++#define MCF_GPIO_PODR_FEC0H_PODR0 (0x01) /* FEC0_CRS / ULPI_DATA6 */ ++#define MCF_GPIO_PODR_FEC0H_PODR1 (0x02) /* FEC0_RXD0 / FEC0_RMII_RXD0 */ ++#define MCF_GPIO_PODR_FEC0H_PODR2 (0x04) /* FEC0_RXDV/FEC0_RMII_CRS_DV */ ++#define MCF_GPIO_PODR_FEC0H_PODR3 (0x08) /* FEC0_RXCLK / ULPI_DATA1 */ ++#define MCF_GPIO_PODR_FEC0H_PODR4 (0x10) /* FEC0_COL / ULPI_DATA7 */ ++#define MCF_GPIO_PODR_FEC0H_PODR5 (0x20) /* FEC0_TXD0 / FEC0_RMII_TXD0 */ ++#define MCF_GPIO_PODR_FEC0H_PODR6 (0x40) /* FEC0_TXEN / FEC0_RMII_TXEN */ ++#define MCF_GPIO_PODR_FEC0H_PODR7 (0x80) /* FEC0_TXCLK / FEC0_RMII_REF_CLK */ ++ ++/* Bit definitions and macros for PODR_FEC0L */ ++#define MCF_GPIO_PODR_FEC0L_PODR0 (0x01) /* FEC0_RXER / FEC0_RMII_RXER */ ++#define MCF_GPIO_PODR_FEC0L_PODR1 (0x02) /* FEC0_RXD1 / FEC0_RMII_RXD1 */ ++#define MCF_GPIO_PODR_FEC0L_PODR2 (0x04) /* FEC0_RXD2 / ULPI_DATA4 */ ++#define MCF_GPIO_PODR_FEC0L_PODR3 (0x08) /* FEC0_RXD3 / ULPI_DATA5 */ ++#define MCF_GPIO_PODR_FEC0L_PODR4 (0x10) /* FEC0_TXER / ULPI_DATA0 */ ++#define MCF_GPIO_PODR_FEC0L_PODR5 (0x20) /* FEC0_TXD1 / FEC0_RMII_TXD1 */ ++#define MCF_GPIO_PODR_FEC0L_PODR6 (0x40) /* FEC0_TXD2 / ULPI_DATA2 */ ++#define MCF_GPIO_PODR_FEC0L_PODR7 (0x80) /* FEC0_TXD3 / ULPI_DATA3 */ ++ ++/* Bit definitions and macros for PODR_SSI */ ++#define MCF_GPIO_PODR_SSI_PODR0 (0x01) /* SSI_TXD / U1TXD */ ++#define MCF_GPIO_PODR_SSI_PODR1 (0x02) /* SSI_RXD / U1RXD */ ++#define MCF_GPIO_PODR_SSI_PODR2 (0x04) /* SSI_FS / U1RTS */ ++#define MCF_GPIO_PODR_SSI_PODR3 (0x08) /* SSI_BCLK / U1CTS */ ++#define MCF_GPIO_PODR_SSI_PODR4 (0x10) /* SSI_MCLK */ ++ ++/* Bit definitions and macros for PODR_FBCTL */ ++#define MCF_GPIO_PODR_FBCTL_PODR0 (0x01) /* FB_TS / FB_ALE / FB_TBST */ ++#define MCF_GPIO_PODR_FBCTL_PODR1 (0x02) /* FB_RW */ ++#define MCF_GPIO_PODR_FBCTL_PODR2 (0x04) /* FB_TA */ ++#define MCF_GPIO_PODR_FBCTL_PODR3 (0x08) /* FB_OE */ ++ ++/* Bit definitions and macros for PODR_BE */ ++#define MCF_GPIO_PODR_BE_PODR0 (0x01) /* FB_BE/BWE0 / FB_SIZ0 */ ++#define MCF_GPIO_PODR_BE_PODR1 (0x02) /* FB_BE/BWE1 / FB_SIZ1 */ ++#define MCF_GPIO_PODR_BE_PODR2 (0x04) /* FB_BE/BWE2 / FB_SIZ2 */ ++#define MCF_GPIO_PODR_BE_PODR3 (0x08) /* FB_BE/BWE3 / FB_SIZ3 */ ++ ++/* Bit definitions and macros for PODR_CS */ ++#define MCF_GPIO_PODR_CS_PODR1 (0x02) /* FB_CS1 */ ++#define MCF_GPIO_PODR_CS_PODR2 (0x04) /* FB_CS2 */ ++#define MCF_GPIO_PODR_CS_PODR3 (0x08) /* FB_CS3 */ ++ ++/* Bit definitions and macros for PODR_DMA */ ++#define MCF_GPIO_PODR_DMA_PODR0 (0x01) /* DREQ0 */ ++#define MCF_GPIO_PODR_DMA_PODR1 (0x02) /* DACK0 / DSPI_PCS3 */ ++#define MCF_GPIO_PODR_DMA_PODR2 (0x04) /* DREQ1 / USB_CLKIN */ ++#define MCF_GPIO_PODR_DMA_PODR3 (0x08) /* DACK1 / ULPI_DIR */ ++ ++/* Bit definitions and macros for PODR_FECI2C */ ++#define MCF_GPIO_PODR_FECI2C_PODR0 (0x01) /* I2C_SDA / U2RXD */ ++#define MCF_GPIO_PODR_FECI2C_PODR1 (0x02) /* I2C_SCL / U2TXD */ ++#define MCF_GPIO_PODR_FECI2C_PODR2 (0x04) /* FEC0_MDIO */ ++#define MCF_GPIO_PODR_FECI2C_PODR3 (0x08) /* FEC0_MDC */ ++#define MCF_GPIO_PODR_FECI2C_PODR4 (0x10) /* FEC1_MDIO / ATA_DIOW */ ++#define MCF_GPIO_PODR_FECI2C_PODR5 (0x20) /* FEC1_MDC / ATA_DIOR */ ++ ++/* Bit definitions and macros for PODR_UART */ ++#define MCF_GPIO_PODR_UART_PODR0 (0x01) /* U1TXD */ ++#define MCF_GPIO_PODR_UART_PODR1 (0x02) /* U1RXD */ ++#define MCF_GPIO_PODR_UART_PODR2 (0x04) /* U1RTS */ ++#define MCF_GPIO_PODR_UART_PODR3 (0x08) /* U0CTS */ ++#define MCF_GPIO_PODR_UART_PODR4 (0x10) /* U1TXD */ ++#define MCF_GPIO_PODR_UART_PODR5 (0x20) /* U1RXD */ ++#define MCF_GPIO_PODR_UART_PODR6 (0x40) /* U1RTS */ ++#define MCF_GPIO_PODR_UART_PODR7 (0x80) /* U1CTS */ ++ ++/* Bit definitions and macros for PODR_DSPI */ ++#define MCF_GPIO_PODR_DSPI_PODR0 (0x01) /* DSPI_SOUT / SBF_DO */ ++#define MCF_GPIO_PODR_DSPI_PODR1 (0x02) /* DSPI_SIN / SBF_DI */ ++#define MCF_GPIO_PODR_DSPI_PODR2 (0x04) /* DSPI_SCK / SBF_CK */ ++#define MCF_GPIO_PODR_DSPI_PODR3 (0x08) /* DSPI_PCS0/SS */ ++#define MCF_GPIO_PODR_DSPI_PODR4 (0x10) /* DSPI_PCS1 / SBF_CS */ ++#define MCF_GPIO_PODR_DSPI_PODR5 (0x20) /* DSPI_PCS2 */ ++#define MCF_GPIO_PODR_DSPI_PODR6 (0x40) /* DSPI_PCS5/SS */ ++ ++/* Bit definitions and macros for PODR_TIMER */ ++#define MCF_GPIO_PODR_TIMER_PODR0 (0x01) /* T0IN / T0OUT / U2RTS */ ++#define MCF_GPIO_PODR_TIMER_PODR1 (0x02) /* T1IN / T1OUT / U2CTS */ ++#define MCF_GPIO_PODR_TIMER_PODR2 (0x04) /* T2IN / T2OUT / U2TXD */ ++#define MCF_GPIO_PODR_TIMER_PODR3 (0x08) /* T3IN / T3OUT / U2RXD */ ++ ++/* Bit definitions and macros for PODR_PCI */ ++#define MCF_GPIO_PODR_PCI_PODR0 (0x01) /* PCI_REQ0/PCI_EXTGNT */ ++#define MCF_GPIO_PODR_PCI_PODR1 (0x02) /* PCI_REQ1 */ ++#define MCF_GPIO_PODR_PCI_PODR2 (0x04) /* PCI_REQ2 */ ++#define MCF_GPIO_PODR_PCI_PODR3 (0x08) /* PCI_REQ3 / ATA_INTR */ ++#define MCF_GPIO_PODR_PCI_PODR4 (0x10) /* PCI_GNT0/PCI_EXTREQ */ ++#define MCF_GPIO_PODR_PCI_PODR5 (0x20) /* PCI_GNT1 / */ ++#define MCF_GPIO_PODR_PCI_PODR6 (0x40) /* PCI_GNT2 / */ ++#define MCF_GPIO_PODR_PCI_PODR7 (0x80) /* PCI_GNT3 / ATA_DMACK */ ++ ++/* Bit definitions and macros for PODR_USB */ ++#define MCF_GPIO_PODR_USB_PODR0 (0x01) /* USB_VBUS_OC / ULPI_STP */ ++#define MCF_GPIO_PODR_USB_PODR1 (0x02) /* USB_VBUS_EN / USB_PULLUP / ULPI_NXT */ ++ ++/* Bit definitions and macros for PODR_ATAH */ ++#define MCF_GPIO_PODR_ATAH_PODR0 (0x01) /* ATA_DA0 */ ++#define MCF_GPIO_PODR_ATAH_PODR1 (0x02) /* ATA_DA1 */ ++#define MCF_GPIO_PODR_ATAH_PODR2 (0x04) /* ATA_DA2 */ ++#define MCF_GPIO_PODR_ATAH_PODR3 (0x08) /* ATA_CS0 */ ++#define MCF_GPIO_PODR_ATAH_PODR4 (0x10) /* ATA_CS1 */ ++#define MCF_GPIO_PODR_ATAH_PODR5 (0x20) /* ATA_BUFFER_EN */ ++ ++/* Bit definitions and macros for PODR_ATAL */ ++#define MCF_GPIO_PODR_ATAL_PODR0 (0x01) /* ATA_IORDY */ ++#define MCF_GPIO_PODR_ATAL_PODR1 (0x02) /* ATA_DMARQ */ ++#define MCF_GPIO_PODR_ATAL_PODR2 (0x04) /* ATA_RESET */ ++ ++/* Bit definitions and macros for PODR_FEC1H */ ++#define MCF_GPIO_PODR_FEC1H_PODR0 (0x01) /* FEC1_CRS / ATA_DATA6 */ ++#define MCF_GPIO_PODR_FEC1H_PODR1 (0x02) /* FEC1_RXD0 / FEC1_RMII_RXD0 / ATA_DATA13 */ ++#define MCF_GPIO_PODR_FEC1H_PODR2 (0x04) /* FEC1_RXDV / FEC1_RMII_CRS_DV / ATA_DATA15 */ ++#define MCF_GPIO_PODR_FEC1H_PODR3 (0x08) /* FEC1_RXCLK / ATA_DATA5 */ ++#define MCF_GPIO_PODR_FEC1H_PODR4 (0x10) /* FEC1_COL / ATA_DATA7 */ ++#define MCF_GPIO_PODR_FEC1H_PODR5 (0x20) /* FEC1_TXD0 / FEC1_RMII_TXD0 / ATA_DATA9 */ ++#define MCF_GPIO_PODR_FEC1H_PODR6 (0x40) /* FEC1_TXEN / FEC1_RMII_TXEN / ATA_DATA8 */ ++#define MCF_GPIO_PODR_FEC1H_PODR7 (0x80) /* FEC1_TXCLK / FEC1_RMII_REF_CLK / ATA_DATA11 */ ++ ++/* Bit definitions and macros for PODR_FEC1L */ ++#define MCF_GPIO_PODR_FEC1L_PODR0 (0x01) /* FEC1_RXER / FEC1_RMII_RXER / ATA_DATA12 */ ++#define MCF_GPIO_PODR_FEC1L_PODR1 (0x02) /* FEC1_RXD1 / FEC1_RMII_RXD1 / ATA_DATA14 */ ++#define MCF_GPIO_PODR_FEC1L_PODR2 (0x04) /* FEC1_RXD2 / ATA_DATA3 */ ++#define MCF_GPIO_PODR_FEC1L_PODR3 (0x08) /* FEC1_RXD3 / ATA_DATA4 */ ++#define MCF_GPIO_PODR_FEC1L_PODR4 (0x10) /* FEC1_TXER / ATA_DATA0 */ ++#define MCF_GPIO_PODR_FEC1L_PODR5 (0x20) /* FEC1_TXD1 / FEC1_RMII_TXD1 / ATA_DATA10 */ ++#define MCF_GPIO_PODR_FEC1L_PODR6 (0x40) /* FEC1_TXD2 / ATA_DATA1 */ ++#define MCF_GPIO_PODR_FEC1L_PODR7 (0x80) /* FEC1_TXD3 / ATA_DATA2 */ ++ ++/* Bit definitions and macros for PODR_FBADH */ ++#define MCF_GPIO_PODR_FBADH_PODR0 (0x01) /* FB_AD24 */ ++#define MCF_GPIO_PODR_FBADH_PODR1 (0x02) /* FB_AD25 */ ++#define MCF_GPIO_PODR_FBADH_PODR2 (0x04) /* FB_AD26 */ ++#define MCF_GPIO_PODR_FBADH_PODR3 (0x08) /* FB_AD27 */ ++#define MCF_GPIO_PODR_FBADH_PODR4 (0x10) /* FB_AD28 */ ++#define MCF_GPIO_PODR_FBADH_PODR5 (0x20) /* FB_AD29 */ ++#define MCF_GPIO_PODR_FBADH_PODR6 (0x40) /* FB_AD30 */ ++#define MCF_GPIO_PODR_FBADH_PODR7 (0x80) /* FB_AD31 */ ++ ++/* Bit definitions and macros for PODR_FBADMH */ ++#define MCF_GPIO_PODR_FBADMH_PODR0 (0x01) /* FB_AD16 */ ++#define MCF_GPIO_PODR_FBADMH_PODR1 (0x02) /* FB_AD17 */ ++#define MCF_GPIO_PODR_FBADMH_PODR2 (0x04) /* FB_AD18 */ ++#define MCF_GPIO_PODR_FBADMH_PODR3 (0x08) /* FB_AD19 */ ++#define MCF_GPIO_PODR_FBADMH_PODR4 (0x10) /* FB_AD20 */ ++#define MCF_GPIO_PODR_FBADMH_PODR5 (0x20) /* FB_AD21 */ ++#define MCF_GPIO_PODR_FBADMH_PODR6 (0x40) /* FB_AD22 */ ++#define MCF_GPIO_PODR_FBADMH_PODR7 (0x80) /* FB_AD23 */ ++ ++/* Bit definitions and macros for PODR_FBADML */ ++#define MCF_GPIO_PODR_FBADML_PODR0 (0x01) /* FB_AD8 */ ++#define MCF_GPIO_PODR_FBADML_PODR1 (0x02) /* FB_AD9 */ ++#define MCF_GPIO_PODR_FBADML_PODR2 (0x04) /* FB_AD10 */ ++#define MCF_GPIO_PODR_FBADML_PODR3 (0x08) /* FB_AD11 */ ++#define MCF_GPIO_PODR_FBADML_PODR4 (0x10) /* FB_AD12 */ ++#define MCF_GPIO_PODR_FBADML_PODR5 (0x20) /* FB_AD13 */ ++#define MCF_GPIO_PODR_FBADML_PODR6 (0x40) /* FB_AD14 */ ++#define MCF_GPIO_PODR_FBADML_PODR7 (0x80) /* FB_AD15 */ ++ ++/* Bit definitions and macros for PODR_FBADL */ ++#define MCF_GPIO_PODR_FBADL_PODR0 (0x01) /* FB_AD0 */ ++#define MCF_GPIO_PODR_FBADL_PODR1 (0x02) /* FB_AD1 */ ++#define MCF_GPIO_PODR_FBADL_PODR2 (0x04) /* FB_AD2 */ ++#define MCF_GPIO_PODR_FBADL_PODR3 (0x08) /* FB_AD3 */ ++#define MCF_GPIO_PODR_FBADL_PODR4 (0x10) /* FB_AD4 */ ++#define MCF_GPIO_PODR_FBADL_PODR5 (0x20) /* FB_AD5 */ ++#define MCF_GPIO_PODR_FBADL_PODR6 (0x40) /* FB_AD6 */ ++#define MCF_GPIO_PODR_FBADL_PODR7 (0x80) /* FB_AD7 */ ++ ++/* Bit definitions and macros for PDDR_FEC0H */ ++#define MCF_GPIO_PDDR_FEC0H_PDDR0 (0x01) /* FEC0_CRS / ULPI_DATA6 */ ++#define MCF_GPIO_PDDR_FEC0H_PDDR1 (0x02) /* FEC0_RXD0 / FEC0_RMII_RXD0 */ ++#define MCF_GPIO_PDDR_FEC0H_PDDR2 (0x04) /* FEC0_RXDV/FEC0_RMII_CRS_DV */ ++#define MCF_GPIO_PDDR_FEC0H_PDDR3 (0x08) /* FEC0_RXCLK / ULPI_DATA1 */ ++#define MCF_GPIO_PDDR_FEC0H_PDDR4 (0x10) /* FEC0_COL / ULPI_DATA7 */ ++#define MCF_GPIO_PDDR_FEC0H_PDDR5 (0x20) /* FEC0_TXD0 / FEC0_RMII_TXD0 */ ++#define MCF_GPIO_PDDR_FEC0H_PDDR6 (0x40) /* FEC0_TXEN / FEC0_RMII_TXEN */ ++#define MCF_GPIO_PDDR_FEC0H_PDDR7 (0x80) /* FEC0_TXCLK / FEC0_RMII_REF_CLK */ ++ ++/* Bit definitions and macros for PDDR_FEC0L */ ++#define MCF_GPIO_PDDR_FEC0L_PDDR0 (0x01) /* FEC0_RXER / FEC0_RMII_RXER */ ++#define MCF_GPIO_PDDR_FEC0L_PDDR1 (0x02) /* FEC0_RXD1 / FEC0_RMII_RXD1 */ ++#define MCF_GPIO_PDDR_FEC0L_PDDR2 (0x04) /* FEC0_RXD2 / ULPI_DATA4 */ ++#define MCF_GPIO_PDDR_FEC0L_PDDR3 (0x08) /* FEC0_RXD3 / ULPI_DATA5 */ ++#define MCF_GPIO_PDDR_FEC0L_PDDR4 (0x10) /* FEC0_TXER / ULPI_DATA0 */ ++#define MCF_GPIO_PDDR_FEC0L_PDDR5 (0x20) /* FEC0_TXD1 / FEC0_RMII_TXD1 */ ++#define MCF_GPIO_PDDR_FEC0L_PDDR6 (0x40) /* FEC0_TXD2 / ULPI_DATA2 */ ++#define MCF_GPIO_PDDR_FEC0L_PDDR7 (0x80) /* FEC0_TXD3 / ULPI_DATA3 */ ++ ++/* Bit definitions and macros for PDDR_SSI */ ++#define MCF_GPIO_PDDR_SSI_PDDR0 (0x01) /* SSI_TXD / U1TXD */ ++#define MCF_GPIO_PDDR_SSI_PDDR1 (0x02) /* SSI_RXD / U1RXD */ ++#define MCF_GPIO_PDDR_SSI_PDDR2 (0x04) /* SSI_FS / U1RTS */ ++#define MCF_GPIO_PDDR_SSI_PDDR3 (0x08) /* SSI_BCLK / U1CTS */ ++#define MCF_GPIO_PDDR_SSI_PDDR4 (0x10) /* SSI_MCLK */ ++ ++/* Bit definitions and macros for PDDR_FBCTL */ ++#define MCF_GPIO_PDDR_FBCTL_PDDR0 (0x01) /* FB_TS / FB_ALE / FB_TBST */ ++#define MCF_GPIO_PDDR_FBCTL_PDDR1 (0x02) /* FB_RW */ ++#define MCF_GPIO_PDDR_FBCTL_PDDR2 (0x04) /* FB_TA */ ++#define MCF_GPIO_PDDR_FBCTL_PDDR3 (0x08) /* FB_OE */ ++ ++/* Bit definitions and macros for PDDR_BE */ ++#define MCF_GPIO_PDDR_BE_PDDR0 (0x01) /* FB_BE/BWE0 / FB_SIZ0 */ ++#define MCF_GPIO_PDDR_BE_PDDR1 (0x02) /* FB_BE/BWE1 / FB_SIZ1 */ ++#define MCF_GPIO_PDDR_BE_PDDR2 (0x04) /* FB_BE/BWE2 / FB_SIZ2 */ ++#define MCF_GPIO_PDDR_BE_PDDR3 (0x08) /* FB_BE/BWE3 / FB_SIZ3 */ ++ ++/* Bit definitions and macros for PDDR_CS */ ++#define MCF_GPIO_PDDR_CS_PDDR1 (0x02) /* FB_CS1 */ ++#define MCF_GPIO_PDDR_CS_PDDR2 (0x04) /* FB_CS2 */ ++#define MCF_GPIO_PDDR_CS_PDDR3 (0x08) /* FB_CS3 */ ++ ++/* Bit definitions and macros for PDDR_DMA */ ++#define MCF_GPIO_PDDR_DMA_PDDR0 (0x01) /* DREQ0 */ ++#define MCF_GPIO_PDDR_DMA_PDDR1 (0x02) /* DACK0 / DSPI_PCS3 */ ++#define MCF_GPIO_PDDR_DMA_PDDR2 (0x04) /* DREQ1 / USB_CLKIN */ ++#define MCF_GPIO_PDDR_DMA_PDDR3 (0x08) /* DACK1 / ULPI_DIR */ ++ ++/* Bit definitions and macros for PDDR_FECI2C */ ++#define MCF_GPIO_PDDR_FECI2C_PDDR0 (0x01) /* I2C_SDA / U2RXD */ ++#define MCF_GPIO_PDDR_FECI2C_PDDR1 (0x02) /* I2C_SCL / U2TXD */ ++#define MCF_GPIO_PDDR_FECI2C_PDDR2 (0x04) /* FEC0_MDIO */ ++#define MCF_GPIO_PDDR_FECI2C_PDDR3 (0x08) /* FEC0_MDC */ ++#define MCF_GPIO_PDDR_FECI2C_PDDR4 (0x10) /* FEC1_MDIO / ATA_DIOW */ ++#define MCF_GPIO_PDDR_FECI2C_PDDR5 (0x20) /* FEC1_MDC / ATA_DIOR */ ++ ++/* Bit definitions and macros for PDDR_UART */ ++#define MCF_GPIO_PDDR_UART_PDDR0 (0x01) /* U1TXD */ ++#define MCF_GPIO_PDDR_UART_PDDR1 (0x02) /* U1RXD */ ++#define MCF_GPIO_PDDR_UART_PDDR2 (0x04) /* U1RTS */ ++#define MCF_GPIO_PDDR_UART_PDDR3 (0x08) /* U0CTS */ ++#define MCF_GPIO_PDDR_UART_PDDR4 (0x10) /* U1TXD */ ++#define MCF_GPIO_PDDR_UART_PDDR5 (0x20) /* U1RXD */ ++#define MCF_GPIO_PDDR_UART_PDDR6 (0x40) /* U1RTS */ ++#define MCF_GPIO_PDDR_UART_PDDR7 (0x80) /* U1CTS */ ++ ++/* Bit definitions and macros for PDDR_DSPI */ ++#define MCF_GPIO_PDDR_DSPI_PDDR0 (0x01) /* DSPI_SOUT / SBF_DO */ ++#define MCF_GPIO_PDDR_DSPI_PDDR1 (0x02) /* DSPI_SIN / SBF_DI */ ++#define MCF_GPIO_PDDR_DSPI_PDDR2 (0x04) /* DSPI_SCK / SBF_CK */ ++#define MCF_GPIO_PDDR_DSPI_PDDR3 (0x08) /* DSPI_PCS0/SS */ ++#define MCF_GPIO_PDDR_DSPI_PDDR4 (0x10) /* DSPI_PCS1 / SBF_CS */ ++#define MCF_GPIO_PDDR_DSPI_PDDR5 (0x20) /* DSPI_PCS2 */ ++#define MCF_GPIO_PDDR_DSPI_PDDR6 (0x40) /* DSPI_PCS5/SS */ ++ ++/* Bit definitions and macros for PDDR_TIMER */ ++#define MCF_GPIO_PDDR_TIMER_PDDR0 (0x01) /* T0IN / T0OUT / U2RTS */ ++#define MCF_GPIO_PDDR_TIMER_PDDR1 (0x02) /* T1IN / T1OUT / U2CTS */ ++#define MCF_GPIO_PDDR_TIMER_PDDR2 (0x04) /* T2IN / T2OUT / U2TXD */ ++#define MCF_GPIO_PDDR_TIMER_PDDR3 (0x08) /* T3IN / T3OUT / U2RXD */ ++ ++/* Bit definitions and macros for PDDR_PCI */ ++#define MCF_GPIO_PDDR_PCI_PDDR0 (0x01) /* PCI_REQ0/PCI_EXTGNT */ ++#define MCF_GPIO_PDDR_PCI_PDDR1 (0x02) /* PCI_REQ1 */ ++#define MCF_GPIO_PDDR_PCI_PDDR2 (0x04) /* PCI_REQ2 */ ++#define MCF_GPIO_PDDR_PCI_PDDR3 (0x08) /* PCI_REQ3 / ATA_INTR */ ++#define MCF_GPIO_PDDR_PCI_PDDR4 (0x10) /* PCI_GNT0/PCI_EXTREQ */ ++#define MCF_GPIO_PDDR_PCI_PDDR5 (0x20) /* PCI_GNT1 / */ ++#define MCF_GPIO_PDDR_PCI_PDDR6 (0x40) /* PCI_GNT2 / */ ++#define MCF_GPIO_PDDR_PCI_PDDR7 (0x80) /* PCI_GNT3 / ATA_DMACK */ ++ ++/* Bit definitions and macros for PDDR_USB */ ++#define MCF_GPIO_PDDR_USB_PDDR0 (0x01) /* USB_VBUS_OC / ULPI_STP */ ++#define MCF_GPIO_PDDR_USB_PDDR1 (0x02) /* USB_VBUS_EN / USB_PULLUP / ULPI_NXT */ ++ ++/* Bit definitions and macros for PDDR_ATAH */ ++#define MCF_GPIO_PDDR_ATAH_PDDR0 (0x01) /* ATA_DA0 */ ++#define MCF_GPIO_PDDR_ATAH_PDDR1 (0x02) /* ATA_DA1 */ ++#define MCF_GPIO_PDDR_ATAH_PDDR2 (0x04) /* ATA_DA2 */ ++#define MCF_GPIO_PDDR_ATAH_PDDR3 (0x08) /* ATA_CS0 */ ++#define MCF_GPIO_PDDR_ATAH_PDDR4 (0x10) /* ATA_CS1 */ ++#define MCF_GPIO_PDDR_ATAH_PDDR5 (0x20) /* ATA_BUFFER_EN */ ++ ++/* Bit definitions and macros for PDDR_ATAL */ ++#define MCF_GPIO_PDDR_ATAL_PDDR0 (0x01) /* ATA_IORDY */ ++#define MCF_GPIO_PDDR_ATAL_PDDR1 (0x02) /* ATA_DMARQ */ ++#define MCF_GPIO_PDDR_ATAL_PDDR2 (0x04) /* ATA_RESET */ ++ ++/* Bit definitions and macros for PDDR_FEC1H */ ++#define MCF_GPIO_PDDR_FEC1H_PDDR0 (0x01) /* FEC1_CRS / ATA_DATA6 */ ++#define MCF_GPIO_PDDR_FEC1H_PDDR1 (0x02) /* FEC1_RXD0 / FEC1_RMII_RXD0 / ATA_DATA13 */ ++#define MCF_GPIO_PDDR_FEC1H_PDDR2 (0x04) /* FEC1_RXDV / FEC1_RMII_CRS_DV / ATA_DATA15 */ ++#define MCF_GPIO_PDDR_FEC1H_PDDR3 (0x08) /* FEC1_RXCLK / ATA_DATA5 */ ++#define MCF_GPIO_PDDR_FEC1H_PDDR4 (0x10) /* FEC1_COL / ATA_DATA7 */ ++#define MCF_GPIO_PDDR_FEC1H_PDDR5 (0x20) /* FEC1_TXD0 / FEC1_RMII_TXD0 / ATA_DATA9 */ ++#define MCF_GPIO_PDDR_FEC1H_PDDR6 (0x40) /* FEC1_TXEN / FEC1_RMII_TXEN / ATA_DATA8 */ ++#define MCF_GPIO_PDDR_FEC1H_PDDR7 (0x80) /* FEC1_TXCLK / FEC1_RMII_REF_CLK / ATA_DATA11 */ ++ ++/* Bit definitions and macros for PDDR_FEC1L */ ++#define MCF_GPIO_PDDR_FEC1L_PDDR0 (0x01) /* FEC1_RXER / FEC1_RMII_RXER / ATA_DATA12 */ ++#define MCF_GPIO_PDDR_FEC1L_PDDR1 (0x02) /* FEC1_RXD1 / FEC1_RMII_RXD1 / ATA_DATA14 */ ++#define MCF_GPIO_PDDR_FEC1L_PDDR2 (0x04) /* FEC1_RXD2 / ATA_DATA3 */ ++#define MCF_GPIO_PDDR_FEC1L_PDDR3 (0x08) /* FEC1_RXD3 / ATA_DATA4 */ ++#define MCF_GPIO_PDDR_FEC1L_PDDR4 (0x10) /* FEC1_TXER / ATA_DATA0 */ ++#define MCF_GPIO_PDDR_FEC1L_PDDR5 (0x20) /* FEC1_TXD1 / FEC1_RMII_TXD1 / ATA_DATA10 */ ++#define MCF_GPIO_PDDR_FEC1L_PDDR6 (0x40) /* FEC1_TXD2 / ATA_DATA1 */ ++#define MCF_GPIO_PDDR_FEC1L_PDDR7 (0x80) /* FEC1_TXD3 / ATA_DATA2 */ ++ ++/* Bit definitions and macros for PDDR_FBADH */ ++#define MCF_GPIO_PDDR_FBADH_PDDR0 (0x01) /* FB_AD24 */ ++#define MCF_GPIO_PDDR_FBADH_PDDR1 (0x02) /* FB_AD25 */ ++#define MCF_GPIO_PDDR_FBADH_PDDR2 (0x04) /* FB_AD26 */ ++#define MCF_GPIO_PDDR_FBADH_PDDR3 (0x08) /* FB_AD27 */ ++#define MCF_GPIO_PDDR_FBADH_PDDR4 (0x10) /* FB_AD28 */ ++#define MCF_GPIO_PDDR_FBADH_PDDR5 (0x20) /* FB_AD29 */ ++#define MCF_GPIO_PDDR_FBADH_PDDR6 (0x40) /* FB_AD30 */ ++#define MCF_GPIO_PDDR_FBADH_PDDR7 (0x80) /* FB_AD31 */ ++ ++/* Bit definitions and macros for PDDR_FBADMH */ ++#define MCF_GPIO_PDDR_FBADMH_PDDR0 (0x01) /* FB_AD16 */ ++#define MCF_GPIO_PDDR_FBADMH_PDDR1 (0x02) /* FB_AD17 */ ++#define MCF_GPIO_PDDR_FBADMH_PDDR2 (0x04) /* FB_AD18 */ ++#define MCF_GPIO_PDDR_FBADMH_PDDR3 (0x08) /* FB_AD19 */ ++#define MCF_GPIO_PDDR_FBADMH_PDDR4 (0x10) /* FB_AD20 */ ++#define MCF_GPIO_PDDR_FBADMH_PDDR5 (0x20) /* FB_AD21 */ ++#define MCF_GPIO_PDDR_FBADMH_PDDR6 (0x40) /* FB_AD22 */ ++#define MCF_GPIO_PDDR_FBADMH_PDDR7 (0x80) /* FB_AD23 */ ++ ++/* Bit definitions and macros for PDDR_FBADML */ ++#define MCF_GPIO_PDDR_FBADML_PDDR0 (0x01) /* FB_AD8 */ ++#define MCF_GPIO_PDDR_FBADML_PDDR1 (0x02) /* FB_AD9 */ ++#define MCF_GPIO_PDDR_FBADML_PDDR2 (0x04) /* FB_AD10 */ ++#define MCF_GPIO_PDDR_FBADML_PDDR3 (0x08) /* FB_AD11 */ ++#define MCF_GPIO_PDDR_FBADML_PDDR4 (0x10) /* FB_AD12 */ ++#define MCF_GPIO_PDDR_FBADML_PDDR5 (0x20) /* FB_AD13 */ ++#define MCF_GPIO_PDDR_FBADML_PDDR6 (0x40) /* FB_AD14 */ ++#define MCF_GPIO_PDDR_FBADML_PDDR7 (0x80) /* FB_AD15 */ ++ ++/* Bit definitions and macros for PDDR_FBADL */ ++#define MCF_GPIO_PDDR_FBADL_PDDR0 (0x01) /* FB_AD0 */ ++#define MCF_GPIO_PDDR_FBADL_PDDR1 (0x02) /* FB_AD1 */ ++#define MCF_GPIO_PDDR_FBADL_PDDR2 (0x04) /* FB_AD2 */ ++#define MCF_GPIO_PDDR_FBADL_PDDR3 (0x08) /* FB_AD3 */ ++#define MCF_GPIO_PDDR_FBADL_PDDR4 (0x10) /* FB_AD4 */ ++#define MCF_GPIO_PDDR_FBADL_PDDR5 (0x20) /* FB_AD5 */ ++#define MCF_GPIO_PDDR_FBADL_PDDR6 (0x40) /* FB_AD6 */ ++#define MCF_GPIO_PDDR_FBADL_PDDR7 (0x80) /* FB_AD7 */ ++ ++/* Bit definitions and macros for PPDSDR_FEC0H */ ++#define MCF_GPIO_PPDSDR_FEC0H_PPDR0 (0x01) /* FEC0_CRS / ULPI_DATA6 */ ++#define MCF_GPIO_PPDSDR_FEC0H_PPDR1 (0x02) /* FEC0_RXD0 / FEC0_RMII_RXD0 */ ++#define MCF_GPIO_PPDSDR_FEC0H_PPDR2 (0x04) /* FEC0_RXDV / FEC0_RMII_CRS_DV */ ++#define MCF_GPIO_PPDSDR_FEC0H_PPDR3 (0x08) /* FEC0_RXCLK / ULPI_DATA1 */ ++#define MCF_GPIO_PPDSDR_FEC0H_PPDR4 (0x10) /* FEC0_COL / ULPI_DATA7 */ ++#define MCF_GPIO_PPDSDR_FEC0H_PPDR5 (0x20) /* FEC0_TXD0 / FEC0_RMII_TXD0 */ ++#define MCF_GPIO_PPDSDR_FEC0H_PPDR6 (0x40) /* FEC0_TXEN / FEC0_RMII_TXEN */ ++#define MCF_GPIO_PPDSDR_FEC0H_PPDR7 (0x80) /* FEC0_TXCLK / FEC0_RMII_REF_CLK */ ++ ++/* Bit definitions and macros for PPDSDR_FEC0L */ ++#define MCF_GPIO_PPDSDR_FEC0L_PCLRR0 (0x01) /* FEC0_RXER / FEC0_RMII_RXER */ ++#define MCF_GPIO_PPDSDR_FEC0L_PCLRR1 (0x02) /* FEC0_RXD1 / FEC0_RMII_RXD1 */ ++#define MCF_GPIO_PPDSDR_FEC0L_PCLRR2 (0x04) /* FEC0_RXD2 / ULPI_DATA4 */ ++#define MCF_GPIO_PPDSDR_FEC0L_PCLRR3 (0x08) /* FEC0_RXD3 / ULPI_DATA5 */ ++#define MCF_GPIO_PPDSDR_FEC0L_PCLRR4 (0x10) /* FEC0_TXER / ULPI_DATA0 */ ++#define MCF_GPIO_PPDSDR_FEC0L_PCLRR5 (0x20) /* FEC0_TXD1 / FEC0_RMII_TXD1 */ ++#define MCF_GPIO_PPDSDR_FEC0L_PCLRR6 (0x40) /* FEC0_TXD2 / ULPI_DATA2 */ ++#define MCF_GPIO_PPDSDR_FEC0L_PCLRR7 (0x80) /* FEC0_TXD3 / ULPI_DATA3 */ ++ ++/* Bit definitions and macros for PPDSDR_SSI */ ++#define MCF_GPIO_PPDSDR_SSI_PPDR0 (0x01) /* SSI_TXD / U1TXD */ ++#define MCF_GPIO_PPDSDR_SSI_PPDR1 (0x02) /* SSI_RXD / U1RXD */ ++#define MCF_GPIO_PPDSDR_SSI_PPDR2 (0x04) /* SSI_FS / U1RTS */ ++#define MCF_GPIO_PPDSDR_SSI_PPDR3 (0x08) /* SSI_BCLK / U1CTS */ ++#define MCF_GPIO_PPDSDR_SSI_PPDR4 (0x10) /* SSI_MCLK */ ++ ++/* Bit definitions and macros for PPDSDR_FBCTL */ ++#define MCF_GPIO_PPDSDR_FBCTL_PPDR0 (0x01) /* FB_TS / FB_ALE / FB_TBST */ ++#define MCF_GPIO_PPDSDR_FBCTL_PPDR1 (0x02) /* FB_RW */ ++#define MCF_GPIO_PPDSDR_FBCTL_PPDR2 (0x04) /* FB_TA */ ++#define MCF_GPIO_PPDSDR_FBCTL_PPDR3 (0x08) /* FB_OE */ ++ ++/* Bit definitions and macros for PPDSDR_BE */ ++#define MCF_GPIO_PPDSDR_BE_PPDR0 (0x01) /* FB_BE/BWE0 / FB_SIZ0 */ ++#define MCF_GPIO_PPDSDR_BE_PPDR1 (0x02) /* FB_BE/BWE1 / FB_SIZ1 */ ++#define MCF_GPIO_PPDSDR_BE_PPDR2 (0x04) /* FB_BE/BWE2 / FB_SIZ2 */ ++#define MCF_GPIO_PPDSDR_BE_PPDR3 (0x08) /* FB_BE/BWE3 / FB_SIZ3 */ ++ ++/* Bit definitions and macros for PPDSDR_CS */ ++#define MCF_GPIO_PPDSDR_CS_PPDR1 (0x02) /* FB_CS1 */ ++#define MCF_GPIO_PPDSDR_CS_PPDR2 (0x04) /* FB_CS2 */ ++#define MCF_GPIO_PPDSDR_CS_PPDR3 (0x08) /* FB_CS3 */ ++ ++/* Bit definitions and macros for PPDSDR_DMA */ ++#define MCF_GPIO_PPDSDR_DMA_PPDR0 (0x01) /* DREQ0 */ ++#define MCF_GPIO_PPDSDR_DMA_PPDR1 (0x02) /* DACK0 / DSPI_PCS3 */ ++#define MCF_GPIO_PPDSDR_DMA_PPDR2 (0x04) /* DREQ1 / USB_CLKIN */ ++#define MCF_GPIO_PPDSDR_DMA_PPDR3 (0x08) /* DACK1 / ULPI_DIR */ ++ ++/* Bit definitions and macros for PPDSDR_FECI2C */ ++#define MCF_GPIO_PPDSDR_FECI2C_PPDR0 (0x01) /* I2C_SDA / U2RXD */ ++#define MCF_GPIO_PPDSDR_FECI2C_PPDR1 (0x02) /* I2C_SCL / U2TXD */ ++#define MCF_GPIO_PPDSDR_FECI2C_PPDR2 (0x04) /* FEC0_MDIO */ ++#define MCF_GPIO_PPDSDR_FECI2C_PPDR3 (0x08) /* FEC0_MDC */ ++#define MCF_GPIO_PPDSDR_FECI2C_PPDR4 (0x10) /* FEC1_MDIO / ATA_DIOW */ ++#define MCF_GPIO_PPDSDR_FECI2C_PPDR5 (0x20) /* FEC1_MDC / ATA_DIOR */ ++ ++/* Bit definitions and macros for PPDSDR_UART */ ++#define MCF_GPIO_PPDSDR_UART_PPDR0 (0x01) /* U1TXD */ ++#define MCF_GPIO_PPDSDR_UART_PPDR1 (0x02) /* U1RXD */ ++#define MCF_GPIO_PPDSDR_UART_PPDR2 (0x04) /* U1RTS */ ++#define MCF_GPIO_PPDSDR_UART_PPDR3 (0x08) /* U0CTS */ ++#define MCF_GPIO_PPDSDR_UART_PPDR4 (0x10) /* U1TXD */ ++#define MCF_GPIO_PPDSDR_UART_PPDR5 (0x20) /* U1RXD */ ++#define MCF_GPIO_PPDSDR_UART_PPDR6 (0x40) /* U1RTS */ ++#define MCF_GPIO_PPDSDR_UART_PPDR7 (0x80) /* U1CTS */ ++ ++/* Bit definitions and macros for PPDSDR_DSPI */ ++#define MCF_GPIO_PPDSDR_DSPI_PPDR0 (0x01) /* DSPI_SOUT / SBF_DO */ ++#define MCF_GPIO_PPDSDR_DSPI_PPDR1 (0x02) /* DSPI_SIN / SBF_DI */ ++#define MCF_GPIO_PPDSDR_DSPI_PPDR2 (0x04) /* DSPI_SCK / SBF_CK */ ++#define MCF_GPIO_PPDSDR_DSPI_PPDR3 (0x08) /* DSPI_PCS0/SS */ ++#define MCF_GPIO_PPDSDR_DSPI_PPDR4 (0x10) /* DSPI_PCS1 / SBF_CS */ ++#define MCF_GPIO_PPDSDR_DSPI_PPDR5 (0x20) /* DSPI_PCS2 */ ++#define MCF_GPIO_PPDSDR_DSPI_PPDR6 (0x40) /* DSPI_PCS5/SS */ ++ ++/* Bit definitions and macros for PPDSDR_TIMER */ ++#define MCF_GPIO_PPDSDR_TIMER_PPDR0 (0x01) /* T0IN / T0OUT / U2RTS */ ++#define MCF_GPIO_PPDSDR_TIMER_PPDR1 (0x02) /* T1IN / T1OUT / U2CTS */ ++#define MCF_GPIO_PPDSDR_TIMER_PPDR2 (0x04) /* T2IN / T2OUT / U2TXD */ ++#define MCF_GPIO_PPDSDR_TIMER_PPDR3 (0x08) /* T3IN / T3OUT / U2RXD */ ++ ++/* Bit definitions and macros for PPDSDR_PCI */ ++#define MCF_GPIO_PPDSDR_PCI_PPDR0 (0x01) /* PCI_REQ0/PCI_EXTGNT */ ++#define MCF_GPIO_PPDSDR_PCI_PPDR1 (0x02) /* PCI_REQ1 */ ++#define MCF_GPIO_PPDSDR_PCI_PPDR2 (0x04) /* PCI_REQ2 */ ++#define MCF_GPIO_PPDSDR_PCI_PPDR3 (0x08) /* PCI_REQ3 / ATA_INTR */ ++#define MCF_GPIO_PPDSDR_PCI_PPDR4 (0x10) /* PCI_GNT0/PCI_EXTREQ */ ++#define MCF_GPIO_PPDSDR_PCI_PPDR5 (0x20) /* PCI_GNT1 / */ ++#define MCF_GPIO_PPDSDR_PCI_PPDR6 (0x40) /* PCI_GNT2 / */ ++#define MCF_GPIO_PPDSDR_PCI_PPDR7 (0x80) /* PCI_GNT3 / ATA_DMACK */ ++ ++/* Bit definitions and macros for PPDSDR_USB */ ++#define MCF_GPIO_PPDSDR_USB_PPDR0 (0x01) /* USB_VBUS_OC / ULPI_STP */ ++#define MCF_GPIO_PPDSDR_USB_PPDR1 (0x02) /* USB_VBUS_EN / USB_PULLUP / ULPI_NXT */ ++ ++/* Bit definitions and macros for PPDSDR_ATAH */ ++#define MCF_GPIO_PPDSDR_ATAH_PPDR0 (0x01) /* ATA_DA0 */ ++#define MCF_GPIO_PPDSDR_ATAH_PPDR1 (0x02) /* ATA_DA1 */ ++#define MCF_GPIO_PPDSDR_ATAH_PPDR2 (0x04) /* ATA_DA2 */ ++#define MCF_GPIO_PPDSDR_ATAH_PPDR3 (0x08) /* ATA_CS0 */ ++#define MCF_GPIO_PPDSDR_ATAH_PPDR4 (0x10) /* ATA_CS1 */ ++#define MCF_GPIO_PPDSDR_ATAH_PPDR5 (0x20) /* ATA_BUFFER_EN */ ++ ++/* Bit definitions and macros for PPDSDR_ATAL */ ++#define MCF_GPIO_PPDSDR_ATAL_PPDR0 (0x01) /* ATA_IORDY */ ++#define MCF_GPIO_PPDSDR_ATAL_PPDR1 (0x02) /* ATA_DMARQ */ ++#define MCF_GPIO_PPDSDR_ATAL_PPDR2 (0x04) /* ATA_RESET */ ++ ++/* Bit definitions and macros for PPDSDR_FEC1H */ ++#define MCF_GPIO_PPDSDR_FEC1H_PPDR0 (0x01) /* FEC1_CRS / ATA_DATA6 */ ++#define MCF_GPIO_PPDSDR_FEC1H_PPDR1 (0x02) /* FEC1_RXD0 / FEC1_RMII_RXD0 / ATA_DATA13 */ ++#define MCF_GPIO_PPDSDR_FEC1H_PPDR2 (0x04) /* FEC1_RXDV / FEC1_RMII_CRS_DV / ATA_DATA15 */ ++#define MCF_GPIO_PPDSDR_FEC1H_PPDR3 (0x08) /* FEC1_RXCLK / ATA_DATA5 */ ++#define MCF_GPIO_PPDSDR_FEC1H_PPDR4 (0x10) /* FEC1_COL / ATA_DATA7 */ ++#define MCF_GPIO_PPDSDR_FEC1H_PPDR5 (0x20) /* FEC1_TXD0 / FEC1_RMII_TXD0 / ATA_DATA9 */ ++#define MCF_GPIO_PPDSDR_FEC1H_PPDR6 (0x40) /* FEC1_TXEN / FEC1_RMII_TXEN / ATA_DATA8 */ ++#define MCF_GPIO_PPDSDR_FEC1H_PPDR7 (0x80) /* FEC1_TXCLK / FEC1_RMII_REF_CLK / ATA_DATA11 */ ++ ++/* Bit definitions and macros for PPDSDR_FEC1L */ ++#define MCF_GPIO_PPDSDR_FEC1L_PPDR0 (0x01) /* FEC1_RXER / FEC1_RMII_RXER / ATA_DATA12 */ ++#define MCF_GPIO_PPDSDR_FEC1L_PPDR1 (0x02) /* FEC1_RXD1 / FEC1_RMII_RXD1 / ATA_DATA14 */ ++#define MCF_GPIO_PPDSDR_FEC1L_PPDR2 (0x04) /* FEC1_RXD2 / ATA_DATA3 */ ++#define MCF_GPIO_PPDSDR_FEC1L_PPDR3 (0x08) /* FEC1_RXD3 / ATA_DATA4 */ ++#define MCF_GPIO_PPDSDR_FEC1L_PPDR4 (0x10) /* FEC1_TXER / ATA_DATA0 */ ++#define MCF_GPIO_PPDSDR_FEC1L_PPDR5 (0x20) /* FEC1_TXD1 / FEC1_RMII_TXD1 / ATA_DATA10 */ ++#define MCF_GPIO_PPDSDR_FEC1L_PPDR6 (0x40) /* FEC1_TXD2 / ATA_DATA1 */ ++#define MCF_GPIO_PPDSDR_FEC1L_PPDR7 (0x80) /* FEC1_TXD3 / ATA_DATA2 */ ++ ++/* Bit definitions and macros for PPDSDR_FBADH */ ++#define MCF_GPIO_PPDSDR_FBADH_PPDR0 (0x01) /* FB_AD24 */ ++#define MCF_GPIO_PPDSDR_FBADH_PPDR1 (0x02) /* FB_AD25 */ ++#define MCF_GPIO_PPDSDR_FBADH_PPDR2 (0x04) /* FB_AD26 */ ++#define MCF_GPIO_PPDSDR_FBADH_PPDR3 (0x08) /* FB_AD27 */ ++#define MCF_GPIO_PPDSDR_FBADH_PPDR4 (0x10) /* FB_AD28 */ ++#define MCF_GPIO_PPDSDR_FBADH_PPDR5 (0x20) /* FB_AD29 */ ++#define MCF_GPIO_PPDSDR_FBADH_PPDR6 (0x40) /* FB_AD30 */ ++#define MCF_GPIO_PPDSDR_FBADH_PPDR7 (0x80) /* FB_AD31 */ ++ ++/* Bit definitions and macros for PPDSDR_FBADMH */ ++#define MCF_GPIO_PPDSDR_FBADMH_PPDR0 (0x01) /* FB_AD16 */ ++#define MCF_GPIO_PPDSDR_FBADMH_PPDR1 (0x02) /* FB_AD17 */ ++#define MCF_GPIO_PPDSDR_FBADMH_PPDR2 (0x04) /* FB_AD18 */ ++#define MCF_GPIO_PPDSDR_FBADMH_PPDR3 (0x08) /* FB_AD19 */ ++#define MCF_GPIO_PPDSDR_FBADMH_PPDR4 (0x10) /* FB_AD20 */ ++#define MCF_GPIO_PPDSDR_FBADMH_PPDR5 (0x20) /* FB_AD21 */ ++#define MCF_GPIO_PPDSDR_FBADMH_PPDR6 (0x40) /* FB_AD22 */ ++#define MCF_GPIO_PPDSDR_FBADMH_PPDR7 (0x80) /* FB_AD23 */ ++ ++/* Bit definitions and macros for PPDSDR_FBADML */ ++#define MCF_GPIO_PPDSDR_FBADML_PPDR0 (0x01) /* FB_AD8 */ ++#define MCF_GPIO_PPDSDR_FBADML_PPDR1 (0x02) /* FB_AD9 */ ++#define MCF_GPIO_PPDSDR_FBADML_PPDR2 (0x04) /* FB_AD10 */ ++#define MCF_GPIO_PPDSDR_FBADML_PPDR3 (0x08) /* FB_AD11 */ ++#define MCF_GPIO_PPDSDR_FBADML_PPDR4 (0x10) /* FB_AD12 */ ++#define MCF_GPIO_PPDSDR_FBADML_PPDR5 (0x20) /* FB_AD13 */ ++#define MCF_GPIO_PPDSDR_FBADML_PPDR6 (0x40) /* FB_AD14 */ ++#define MCF_GPIO_PPDSDR_FBADML_PPDR7 (0x80) /* FB_AD15 */ ++ ++/* Bit definitions and macros for PPDSDR_FBADL */ ++#define MCF_GPIO_PPDSDR_FBADL_PPDR0 (0x01) /* FB_AD0 */ ++#define MCF_GPIO_PPDSDR_FBADL_PPDR1 (0x02) /* FB_AD1 */ ++#define MCF_GPIO_PPDSDR_FBADL_PPDR2 (0x04) /* FB_AD2 */ ++#define MCF_GPIO_PPDSDR_FBADL_PPDR3 (0x08) /* FB_AD3 */ ++#define MCF_GPIO_PPDSDR_FBADL_PPDR4 (0x10) /* FB_AD4 */ ++#define MCF_GPIO_PPDSDR_FBADL_PPDR5 (0x20) /* FB_AD5 */ ++#define MCF_GPIO_PPDSDR_FBADL_PPDR6 (0x40) /* FB_AD6 */ ++#define MCF_GPIO_PPDSDR_FBADL_PPDR7 (0x80) /* FB_AD7 */ ++ ++/* Bit definitions and macros for PCLRR_FEC0H */ ++#define MCF_GPIO_PCLRR_FEC0H_PCLRR0 (0x01) /* FEC0_CRS / ULPI_DATA6 */ ++#define MCF_GPIO_PCLRR_FEC0H_PCLRR1 (0x02) /* FEC0_RXD0 / FEC0_RMII_RXD0 */ ++#define MCF_GPIO_PCLRR_FEC0H_PCLRR2 (0x04) /* FEC0_RXDV/FEC0_RMII_CRS_DV */ ++#define MCF_GPIO_PCLRR_FEC0H_PCLRR3 (0x08) /* FEC0_RXCLK / ULPI_DATA1 */ ++#define MCF_GPIO_PCLRR_FEC0H_PCLRR4 (0x10) /* FEC0_COL / ULPI_DATA7 */ ++#define MCF_GPIO_PCLRR_FEC0H_PCLRR5 (0x20) /* FEC0_TXD0 / FEC0_RMII_TXD0 */ ++#define MCF_GPIO_PCLRR_FEC0H_PCLRR6 (0x40) /* FEC0_TXEN / FEC0_RMII_TXEN */ ++#define MCF_GPIO_PCLRR_FEC0H_PCLRR7 (0x80) /* FEC0_TXCLK / FEC0_RMII_REF_CLK */ ++ ++/* Bit definitions and macros for PCLRR_FEC0L */ ++#define MCF_GPIO_PCLRR_FEC0L_PPDR0 (0x01) /* FEC0_RXER / FEC0_RMII_RXER */ ++#define MCF_GPIO_PCLRR_FEC0L_PPDR1 (0x02) /* FEC0_RXD1 / FEC0_RMII_RXD1 */ ++#define MCF_GPIO_PCLRR_FEC0L_PPDR2 (0x04) /* FEC0_RXD2 / ULPI_DATA4 */ ++#define MCF_GPIO_PCLRR_FEC0L_PPDR3 (0x08) /* FEC0_RXD3 / ULPI_DATA5 */ ++#define MCF_GPIO_PCLRR_FEC0L_PPDR4 (0x10) /* FEC0_TXER / ULPI_DATA0 */ ++#define MCF_GPIO_PCLRR_FEC0L_PPDR5 (0x20) /* FEC0_TXD1 / FEC0_RMII_TXD1 */ ++#define MCF_GPIO_PCLRR_FEC0L_PPDR6 (0x40) /* FEC0_TXD2 / ULPI_DATA2 */ ++#define MCF_GPIO_PCLRR_FEC0L_PPDR7 (0x80) /* FEC0_TXD3 / ULPI_DATA3 */ ++ ++/* Bit definitions and macros for PCLRR_SSI */ ++#define MCF_GPIO_PCLRR_SSI_PCLRR0 (0x01) /* SSI_TXD / U1TXD */ ++#define MCF_GPIO_PCLRR_SSI_PCLRR1 (0x02) /* SSI_RXD / U1RXD */ ++#define MCF_GPIO_PCLRR_SSI_PCLRR2 (0x04) /* SSI_FS / U1RTS */ ++#define MCF_GPIO_PCLRR_SSI_PCLRR3 (0x08) /* SSI_BCLK / U1CTS */ ++#define MCF_GPIO_PCLRR_SSI_PCLRR4 (0x10) /* SSI_MCLK */ ++ ++/* Bit definitions and macros for PCLRR_FBCTL */ ++#define MCF_GPIO_PCLRR_FBCTL_PCLRR0 (0x01) /* FB_TS / FB_ALE / FB_TBST */ ++#define MCF_GPIO_PCLRR_FBCTL_PCLRR1 (0x02) /* FB_RW */ ++#define MCF_GPIO_PCLRR_FBCTL_PCLRR2 (0x04) /* FB_TA */ ++#define MCF_GPIO_PCLRR_FBCTL_PCLRR3 (0x08) /* FB_OE */ ++ ++/* Bit definitions and macros for PCLRR_BE */ ++#define MCF_GPIO_PCLRR_BE_PCLRR0 (0x01) /* FB_BE/BWE0 / FB_SIZ0 */ ++#define MCF_GPIO_PCLRR_BE_PCLRR1 (0x02) /* FB_BE/BWE1 / FB_SIZ1 */ ++#define MCF_GPIO_PCLRR_BE_PCLRR2 (0x04) /* FB_BE/BWE2 / FB_SIZ2 */ ++#define MCF_GPIO_PCLRR_BE_PCLRR3 (0x08) /* FB_BE/BWE3 / FB_SIZ3 */ ++ ++/* Bit definitions and macros for PCLRR_CS */ ++#define MCF_GPIO_PCLRR_CS_PCLRR1 (0x02) /* FB_CS1 */ ++#define MCF_GPIO_PCLRR_CS_PCLRR2 (0x04) /* FB_CS2 */ ++#define MCF_GPIO_PCLRR_CS_PCLRR3 (0x08) /* FB_CS3 */ ++ ++/* Bit definitions and macros for PCLRR_DMA */ ++#define MCF_GPIO_PCLRR_DMA_PCLRR0 (0x01) /* DREQ0 */ ++#define MCF_GPIO_PCLRR_DMA_PCLRR1 (0x02) /* DACK0 / DSPI_PCS3 */ ++#define MCF_GPIO_PCLRR_DMA_PCLRR2 (0x04) /* DREQ1 / USB_CLKIN */ ++#define MCF_GPIO_PCLRR_DMA_PCLRR3 (0x08) /* DACK1 / ULPI_DIR */ ++ ++/* Bit definitions and macros for PCLRR_FECI2C */ ++#define MCF_GPIO_PCLRR_FECI2C_PCLRR0 (0x01) /* I2C_SDA / U2RXD */ ++#define MCF_GPIO_PCLRR_FECI2C_PCLRR1 (0x02) /* I2C_SCL / U2TXD */ ++#define MCF_GPIO_PCLRR_FECI2C_PCLRR2 (0x04) /* FEC0_MDIO */ ++#define MCF_GPIO_PCLRR_FECI2C_PCLRR3 (0x08) /* FEC0_MDC */ ++#define MCF_GPIO_PCLRR_FECI2C_PCLRR4 (0x10) /* FEC1_MDIO / ATA_DIOW */ ++#define MCF_GPIO_PCLRR_FECI2C_PCLRR5 (0x20) /* FEC1_MDC / ATA_DIOR */ ++ ++/* Bit definitions and macros for PCLRR_UART */ ++#define MCF_GPIO_PCLRR_UART_PCLRR0 (0x01) /* U1TXD */ ++#define MCF_GPIO_PCLRR_UART_PCLRR1 (0x02) /* U1RXD */ ++#define MCF_GPIO_PCLRR_UART_PCLRR2 (0x04) /* U1RTS */ ++#define MCF_GPIO_PCLRR_UART_PCLRR3 (0x08) /* U0CTS */ ++#define MCF_GPIO_PCLRR_UART_PCLRR4 (0x10) /* U1TXD */ ++#define MCF_GPIO_PCLRR_UART_PCLRR5 (0x20) /* U1RXD */ ++#define MCF_GPIO_PCLRR_UART_PCLRR6 (0x40) /* U1RTS */ ++#define MCF_GPIO_PCLRR_UART_PCLRR7 (0x80) /* U1CTS */ ++ ++/* Bit definitions and macros for PCLRR_DSPI */ ++#define MCF_GPIO_PCLRR_DSPI_PCLRR0 (0x01) /* DSPI_SOUT / SBF_DO */ ++#define MCF_GPIO_PCLRR_DSPI_PCLRR1 (0x02) /* DSPI_SIN / SBF_DI */ ++#define MCF_GPIO_PCLRR_DSPI_PCLRR2 (0x04) /* DSPI_SCK / SBF_CK */ ++#define MCF_GPIO_PCLRR_DSPI_PCLRR3 (0x08) /* DSPI_PCS0/SS */ ++#define MCF_GPIO_PCLRR_DSPI_PCLRR4 (0x10) /* DSPI_PCS1 / SBF_CS */ ++#define MCF_GPIO_PCLRR_DSPI_PCLRR5 (0x20) /* DSPI_PCS2 */ ++#define MCF_GPIO_PCLRR_DSPI_PCLRR6 (0x40) /* DSPI_PCS5/SS */ ++ ++/* Bit definitions and macros for PCLRR_TIMER */ ++#define MCF_GPIO_PCLRR_TIMER_PCLRR0 (0x01) /* T0IN / T0OUT / U2RTS */ ++#define MCF_GPIO_PCLRR_TIMER_PCLRR1 (0x02) /* T1IN / T1OUT / U2CTS */ ++#define MCF_GPIO_PCLRR_TIMER_PCLRR2 (0x04) /* T2IN / T2OUT / U2TXD */ ++#define MCF_GPIO_PCLRR_TIMER_PCLRR3 (0x08) /* T3IN / T3OUT / U2RXD */ ++ ++/* Bit definitions and macros for PCLRR_PCI */ ++#define MCF_GPIO_PCLRR_PCI_PCLRR0 (0x01) /* PCI_REQ0/PCI_EXTGNT */ ++#define MCF_GPIO_PCLRR_PCI_PCLRR1 (0x02) /* PCI_REQ1 */ ++#define MCF_GPIO_PCLRR_PCI_PCLRR2 (0x04) /* PCI_REQ2 */ ++#define MCF_GPIO_PCLRR_PCI_PCLRR3 (0x08) /* PCI_REQ3 / ATA_INTR */ ++#define MCF_GPIO_PCLRR_PCI_PCLRR4 (0x10) /* PCI_GNT0/PCI_EXTREQ */ ++#define MCF_GPIO_PCLRR_PCI_PCLRR5 (0x20) /* PCI_GNT1 / */ ++#define MCF_GPIO_PCLRR_PCI_PCLRR6 (0x40) /* PCI_GNT2 / */ ++#define MCF_GPIO_PCLRR_PCI_PCLRR7 (0x80) /* PCI_GNT3 / ATA_DMACK */ ++ ++/* Bit definitions and macros for PCLRR_USB */ ++#define MCF_GPIO_PCLRR_USB_PCLRR0 (0x01) /* USB_VBUS_OC / ULPI_STP */ ++#define MCF_GPIO_PCLRR_USB_PCLRR1 (0x02) /* USB_VBUS_EN / USB_PULLUP / ULPI_NXT */ ++ ++/* Bit definitions and macros for PCLRR_ATAH */ ++#define MCF_GPIO_PCLRR_ATAH_PCLRR0 (0x01) /* ATA_DA0 */ ++#define MCF_GPIO_PCLRR_ATAH_PCLRR1 (0x02) /* ATA_DA1 */ ++#define MCF_GPIO_PCLRR_ATAH_PCLRR2 (0x04) /* ATA_DA2 */ ++#define MCF_GPIO_PCLRR_ATAH_PCLRR3 (0x08) /* ATA_CS0 */ ++#define MCF_GPIO_PCLRR_ATAH_PCLRR4 (0x10) /* ATA_CS1 */ ++#define MCF_GPIO_PCLRR_ATAH_PCLRR5 (0x20) /* ATA_BUFFER_EN */ ++ ++/* Bit definitions and macros for PCLRR_ATAL */ ++#define MCF_GPIO_PCLRR_ATAL_PCLRR0 (0x01) /* ATA_IORDY */ ++#define MCF_GPIO_PCLRR_ATAL_PCLRR1 (0x02) /* ATA_DMARQ */ ++#define MCF_GPIO_PCLRR_ATAL_PCLRR2 (0x04) /* ATA_RESET */ ++ ++/* Bit definitions and macros for PCLRR_FEC1H */ ++#define MCF_GPIO_PCLRR_FEC1H_PCLRR0 (0x01) /* FEC1_CRS / ATA_DATA6 */ ++#define MCF_GPIO_PCLRR_FEC1H_PCLRR1 (0x02) /* FEC1_RXD0 / FEC1_RMII_RXD0 / ATA_DATA13 */ ++#define MCF_GPIO_PCLRR_FEC1H_PCLRR2 (0x04) /* FEC1_RXDV / FEC1_RMII_CRS_DV / ATA_DATA15 */ ++#define MCF_GPIO_PCLRR_FEC1H_PCLRR3 (0x08) /* FEC1_RXCLK / ATA_DATA5 */ ++#define MCF_GPIO_PCLRR_FEC1H_PCLRR4 (0x10) /* FEC1_COL / ATA_DATA7 */ ++#define MCF_GPIO_PCLRR_FEC1H_PCLRR5 (0x20) /* FEC1_TXD0 / FEC1_RMII_TXD0 / ATA_DATA9 */ ++#define MCF_GPIO_PCLRR_FEC1H_PCLRR6 (0x40) /* FEC1_TXEN / FEC1_RMII_TXEN / ATA_DATA8 */ ++#define MCF_GPIO_PCLRR_FEC1H_PCLRR7 (0x80) /* FEC1_TXCLK / FEC1_RMII_REF_CLK / ATA_DATA11 */ ++ ++/* Bit definitions and macros for PCLRR_FEC1L */ ++#define MCF_GPIO_PCLRR_FEC1L_PCLRR0 (0x01) /* FEC1_RXER / FEC1_RMII_RXER / ATA_DATA12 */ ++#define MCF_GPIO_PCLRR_FEC1L_PCLRR1 (0x02) /* FEC1_RXD1 / FEC1_RMII_RXD1 / ATA_DATA14 */ ++#define MCF_GPIO_PCLRR_FEC1L_PCLRR2 (0x04) /* FEC1_RXD2 / ATA_DATA3 */ ++#define MCF_GPIO_PCLRR_FEC1L_PCLRR3 (0x08) /* FEC1_RXD3 / ATA_DATA4 */ ++#define MCF_GPIO_PCLRR_FEC1L_PCLRR4 (0x10) /* FEC1_TXER / ATA_DATA0 */ ++#define MCF_GPIO_PCLRR_FEC1L_PCLRR5 (0x20) /* FEC1_TXD1 / FEC1_RMII_TXD1 / ATA_DATA10 */ ++#define MCF_GPIO_PCLRR_FEC1L_PCLRR6 (0x40) /* FEC1_TXD2 / ATA_DATA1 */ ++#define MCF_GPIO_PCLRR_FEC1L_PCLRR7 (0x80) /* FEC1_TXD3 / ATA_DATA2 */ ++ ++/* Bit definitions and macros for PCLRR_FBADH */ ++#define MCF_GPIO_PCLRR_FBADH_PCLRR0 (0x01) /* FB_AD24 */ ++#define MCF_GPIO_PCLRR_FBADH_PCLRR1 (0x02) /* FB_AD25 */ ++#define MCF_GPIO_PCLRR_FBADH_PCLRR2 (0x04) /* FB_AD26 */ ++#define MCF_GPIO_PCLRR_FBADH_PCLRR3 (0x08) /* FB_AD27 */ ++#define MCF_GPIO_PCLRR_FBADH_PCLRR4 (0x10) /* FB_AD28 */ ++#define MCF_GPIO_PCLRR_FBADH_PCLRR5 (0x20) /* FB_AD29 */ ++#define MCF_GPIO_PCLRR_FBADH_PCLRR6 (0x40) /* FB_AD30 */ ++#define MCF_GPIO_PCLRR_FBADH_PCLRR7 (0x80) /* FB_AD31 */ ++ ++/* Bit definitions and macros for PCLRR_FBADMH */ ++#define MCF_GPIO_PCLRR_FBADMH_PCLRR0 (0x01) /* FB_AD16 */ ++#define MCF_GPIO_PCLRR_FBADMH_PCLRR1 (0x02) /* FB_AD17 */ ++#define MCF_GPIO_PCLRR_FBADMH_PCLRR2 (0x04) /* FB_AD18 */ ++#define MCF_GPIO_PCLRR_FBADMH_PCLRR3 (0x08) /* FB_AD19 */ ++#define MCF_GPIO_PCLRR_FBADMH_PCLRR4 (0x10) /* FB_AD20 */ ++#define MCF_GPIO_PCLRR_FBADMH_PCLRR5 (0x20) /* FB_AD21 */ ++#define MCF_GPIO_PCLRR_FBADMH_PCLRR6 (0x40) /* FB_AD22 */ ++#define MCF_GPIO_PCLRR_FBADMH_PCLRR7 (0x80) /* FB_AD23 */ ++ ++/* Bit definitions and macros for PCLRR_FBADML */ ++#define MCF_GPIO_PCLRR_FBADML_PCLRR0 (0x01) /* FB_AD8 */ ++#define MCF_GPIO_PCLRR_FBADML_PCLRR1 (0x02) /* FB_AD9 */ ++#define MCF_GPIO_PCLRR_FBADML_PCLRR2 (0x04) /* FB_AD10 */ ++#define MCF_GPIO_PCLRR_FBADML_PCLRR3 (0x08) /* FB_AD11 */ ++#define MCF_GPIO_PCLRR_FBADML_PCLRR4 (0x10) /* FB_AD12 */ ++#define MCF_GPIO_PCLRR_FBADML_PCLRR5 (0x20) /* FB_AD13 */ ++#define MCF_GPIO_PCLRR_FBADML_PCLRR6 (0x40) /* FB_AD14 */ ++#define MCF_GPIO_PCLRR_FBADML_PCLRR7 (0x80) /* FB_AD15 */ ++ ++/* Bit definitions and macros for PCLRR_FBADL */ ++#define MCF_GPIO_PCLRR_FBADL_PCLRR0 (0x01) /* FB_AD0 */ ++#define MCF_GPIO_PCLRR_FBADL_PCLRR1 (0x02) /* FB_AD1 */ ++#define MCF_GPIO_PCLRR_FBADL_PCLRR2 (0x04) /* FB_AD2 */ ++#define MCF_GPIO_PCLRR_FBADL_PCLRR3 (0x08) /* FB_AD3 */ ++#define MCF_GPIO_PCLRR_FBADL_PCLRR4 (0x10) /* FB_AD4 */ ++#define MCF_GPIO_PCLRR_FBADL_PCLRR5 (0x20) /* FB_AD5 */ ++#define MCF_GPIO_PCLRR_FBADL_PCLRR6 (0x40) /* FB_AD6 */ ++#define MCF_GPIO_PCLRR_FBADL_PCLRR7 (0x80) /* FB_AD7 */ ++ ++/* Bit definitions and macros for PAR_FEC */ ++#define MCF_GPIO_PAR_FEC_FEC0(x) (((x)&0x07)) ++#define MCF_GPIO_PAR_FEC_FEC1(x) (((x)&0x07)<<4) ++#define MCF_GPIO_PAR_FEC_FEC1_MASK (0x8F) ++#define MCF_GPIO_PAR_FEC_FEC1_MII (0x70) ++#define MCF_GPIO_PAR_FEC_FEC1_RMII_GPIO (0x30) ++#define MCF_GPIO_PAR_FEC_FEC1_RMII_ATA (0x20) ++#define MCF_GPIO_PAR_FEC_FEC1_ATA (0x10) ++#define MCF_GPIO_PAR_FEC_FEC1_GPIO (0x00) ++#define MCF_GPIO_PAR_FEC_FEC0_MASK (0xF8) ++#define MCF_GPIO_PAR_FEC_FEC0_MII (0x07) ++#define MCF_GPIO_PAR_FEC_FEC0_RMII_GPIO (0x03) ++#define MCF_GPIO_PAR_FEC_FEC0_RMII_ULPI (0x02) ++#define MCF_GPIO_PAR_FEC_FEC0_ULPI (0x01) ++#define MCF_GPIO_PAR_FEC_FEC0_GPIO (0x00) ++ ++/* Bit definitions and macros for PAR_DMA */ ++#define MCF_GPIO_PAR_DMA_DREQ0 (0x01) ++#define MCF_GPIO_PAR_DMA_DACK0(x) (((x)&0x03)<<2) ++#define MCF_GPIO_PAR_DMA_DREQ1(x) (((x)&0x03)<<4) ++#define MCF_GPIO_PAR_DMA_DACK1(x) (((x)&0x03)<<6) ++#define MCF_GPIO_PAR_DMA_DACK1_MASK (0x3F) ++#define MCF_GPIO_PAR_DMA_DACK1_DACK1 (0xC0) ++#define MCF_GPIO_PAR_DMA_DACK1_ULPI_DIR (0x40) ++#define MCF_GPIO_PAR_DMA_DACK1_GPIO (0x00) ++#define MCF_GPIO_PAR_DMA_DREQ1_MASK (0xCF) ++#define MCF_GPIO_PAR_DMA_DREQ1_DREQ1 (0x30) ++#define MCF_GPIO_PAR_DMA_DREQ1_USB_CLKIN (0x10) ++#define MCF_GPIO_PAR_DMA_DREQ1_GPIO (0x00) ++#define MCF_GPIO_PAR_DMA_DACK0_MASK (0xF3) ++#define MCF_GPIO_PAR_DMA_DACK0_DACK1 (0x0C) ++#define MCF_GPIO_PAR_DMA_DACK0_ULPI_DIR (0x04) ++#define MCF_GPIO_PAR_DMA_DACK0_GPIO (0x00) ++#define MCF_GPIO_PAR_DMA_DREQ0_DREQ0 (0x01) ++#define MCF_GPIO_PAR_DMA_DREQ0_GPIO (0x00) ++ ++/* Bit definitions and macros for PAR_FBCTL */ ++#define MCF_GPIO_PAR_FBCTL_TS(x) (((x)&0x03)<<3) ++#define MCF_GPIO_PAR_FBCTL_RW (0x20) ++#define MCF_GPIO_PAR_FBCTL_TA (0x40) ++#define MCF_GPIO_PAR_FBCTL_OE (0x80) ++#define MCF_GPIO_PAR_FBCTL_OE_OE (0x80) ++#define MCF_GPIO_PAR_FBCTL_OE_GPIO (0x00) ++#define MCF_GPIO_PAR_FBCTL_TA_TA (0x40) ++#define MCF_GPIO_PAR_FBCTL_TA_GPIO (0x00) ++#define MCF_GPIO_PAR_FBCTL_RW_RW (0x20) ++#define MCF_GPIO_PAR_FBCTL_RW_GPIO (0x00) ++#define MCF_GPIO_PAR_FBCTL_TS_MASK (0xE7) ++#define MCF_GPIO_PAR_FBCTL_TS_TS (0x18) ++#define MCF_GPIO_PAR_FBCTL_TS_ALE (0x10) ++#define MCF_GPIO_PAR_FBCTL_TS_TBST (0x08) ++#define MCF_GPIO_PAR_FBCTL_TS_GPIO (0x80) ++ ++/* Bit definitions and macros for PAR_DSPI */ ++#define MCF_GPIO_PAR_DSPI_SCK (0x01) ++#define MCF_GPIO_PAR_DSPI_SOUT (0x02) ++#define MCF_GPIO_PAR_DSPI_SIN (0x04) ++#define MCF_GPIO_PAR_DSPI_PCS0 (0x08) ++#define MCF_GPIO_PAR_DSPI_PCS1 (0x10) ++#define MCF_GPIO_PAR_DSPI_PCS2 (0x20) ++#define MCF_GPIO_PAR_DSPI_PCS5 (0x40) ++#define MCF_GPIO_PAR_DSPI_PCS5_PCS5 (0x40) ++#define MCF_GPIO_PAR_DSPI_PCS5_GPIO (0x00) ++#define MCF_GPIO_PAR_DSPI_PCS2_PCS2 (0x20) ++#define MCF_GPIO_PAR_DSPI_PCS2_GPIO (0x00) ++#define MCF_GPIO_PAR_DSPI_PCS1_PCS1 (0x10) ++#define MCF_GPIO_PAR_DSPI_PCS1_GPIO (0x00) ++#define MCF_GPIO_PAR_DSPI_PCS0_PCS0 (0x08) ++#define MCF_GPIO_PAR_DSPI_PCS0_GPIO (0x00) ++#define MCF_GPIO_PAR_DSPI_SIN_SIN (0x04) ++#define MCF_GPIO_PAR_DSPI_SIN_GPIO (0x00) ++#define MCF_GPIO_PAR_DSPI_SOUT_SOUT (0x02) ++#define MCF_GPIO_PAR_DSPI_SOUT_GPIO (0x00) ++#define MCF_GPIO_PAR_DSPI_SCK_SCK (0x01) ++#define MCF_GPIO_PAR_DSPI_SCK_GPIO (0x00) ++ ++/* Bit definitions and macros for PAR_BE */ ++#define MCF_GPIO_PAR_BE_BE0 (0x01) ++#define MCF_GPIO_PAR_BE_BE1 (0x04) ++#define MCF_GPIO_PAR_BE_BE2(x) (((x)&0x03)<<4) ++#define MCF_GPIO_PAR_BE_BE3(x) (((x)&0x03)<<6) ++#define MCF_GPIO_PAR_BE_BE3_MASK (0x3F) ++#define MCF_GPIO_PAR_BE_BE3_BE3 (0xC0) ++#define MCF_GPIO_PAR_BE_BE3_TSIZ1 (0x80) ++#define MCF_GPIO_PAR_BE_BE3_GPIO (0x00) ++#define MCF_GPIO_PAR_BE_BE2_MASK (0xCF) ++#define MCF_GPIO_PAR_BE_BE2_BE2 (0x30) ++#define MCF_GPIO_PAR_BE_BE2_TSIZ0 (0x20) ++#define MCF_GPIO_PAR_BE_BE2_GPIO (0x00) ++#define MCF_GPIO_PAR_BE_BE1_BE1 (0x04) ++#define MCF_GPIO_PAR_BE_BE1_GPIO (0x00) ++#define MCF_GPIO_PAR_BE_BE0_BE0 (0x01) ++#define MCF_GPIO_PAR_BE_BE0_GPIO (0x00) ++ ++/* Bit definitions and macros for PAR_CS */ ++#define MCF_GPIO_PAR_CS_CS1 (0x02) ++#define MCF_GPIO_PAR_CS_CS2 (0x04) ++#define MCF_GPIO_PAR_CS_CS3 (0x08) ++#define MCF_GPIO_PAR_CS_CS3_CS3 (0x08) ++#define MCF_GPIO_PAR_CS_CS3_GPIO (0x00) ++#define MCF_GPIO_PAR_CS_CS2_CS2 (0x04) ++#define MCF_GPIO_PAR_CS_CS2_GPIO (0x00) ++#define MCF_GPIO_PAR_CS_CS1_CS1 (0x02) ++#define MCF_GPIO_PAR_CS_CS1_GPIO (0x00) ++ ++/* Bit definitions and macros for PAR_TIMER */ ++#define MCF_GPIO_PAR_TIMER_T0IN(x) (((x)&0x03)) ++#define MCF_GPIO_PAR_TIMER_T1IN(x) (((x)&0x03)<<2) ++#define MCF_GPIO_PAR_TIMER_T2IN(x) (((x)&0x03)<<4) ++#define MCF_GPIO_PAR_TIMER_T3IN(x) (((x)&0x03)<<6) ++#define MCF_GPIO_PAR_TIMER_T3IN_MASK (0x3F) ++#define MCF_GPIO_PAR_TIMER_T3IN_T3IN (0xC0) ++#define MCF_GPIO_PAR_TIMER_T3IN_T3OUT (0x80) ++#define MCF_GPIO_PAR_TIMER_T3IN_U2RXD (0x40) ++#define MCF_GPIO_PAR_TIMER_T3IN_GPIO (0x00) ++#define MCF_GPIO_PAR_TIMER_T2IN_MASK (0xCF) ++#define MCF_GPIO_PAR_TIMER_T2IN_T2IN (0x30) ++#define MCF_GPIO_PAR_TIMER_T2IN_T2OUT (0x20) ++#define MCF_GPIO_PAR_TIMER_T2IN_U2TXD (0x10) ++#define MCF_GPIO_PAR_TIMER_T2IN_GPIO (0x00) ++#define MCF_GPIO_PAR_TIMER_T1IN_MASK (0xF3) ++#define MCF_GPIO_PAR_TIMER_T1IN_T1IN (0x0C) ++#define MCF_GPIO_PAR_TIMER_T1IN_T1OUT (0x08) ++#define MCF_GPIO_PAR_TIMER_T1IN_U2CTS (0x04) ++#define MCF_GPIO_PAR_TIMER_T1IN_GPIO (0x00) ++#define MCF_GPIO_PAR_TIMER_T0IN_MASK (0xFC) ++#define MCF_GPIO_PAR_TIMER_T0IN_T0IN (0x03) ++#define MCF_GPIO_PAR_TIMER_T0IN_T0OUT (0x02) ++#define MCF_GPIO_PAR_TIMER_T0IN_U2RTS (0x01) ++#define MCF_GPIO_PAR_TIMER_T0IN_GPIO (0x00) ++ ++/* Bit definitions and macros for PAR_USB */ ++#define MCF_GPIO_PAR_USB_VBUSOC(x) (((x)&0x03)) ++#define MCF_GPIO_PAR_USB_VBUSEN(x) (((x)&0x03)<<2) ++#define MCF_GPIO_PAR_USB_VBUSEN_MASK (0xF3) ++#define MCF_GPIO_PAR_USB_VBUSEN_VBUSEN (0x0C) ++#define MCF_GPIO_PAR_USB_VBUSEN_USBPULLUP (0x08) ++#define MCF_GPIO_PAR_USB_VBUSEN_ULPI_NXT (0x04) ++#define MCF_GPIO_PAR_USB_VBUSEN_GPIO (0x00) ++#define MCF_GPIO_PAR_USB_VBUSOC_MASK (0xFC) ++#define MCF_GPIO_PAR_USB_VBUSOC_VBUSOC (0x03) ++#define MCF_GPIO_PAR_USB_VBUSOC_ULPI_STP (0x01) ++#define MCF_GPIO_PAR_USB_VBUSOC_GPIO (0x00) ++ ++/* Bit definitions and macros for PAR_UART */ ++#define MCF_GPIO_PAR_UART_U0TXD (0x01) ++#define MCF_GPIO_PAR_UART_U0RXD (0x02) ++#define MCF_GPIO_PAR_UART_U0RTS (0x04) ++#define MCF_GPIO_PAR_UART_U0CTS (0x08) ++#define MCF_GPIO_PAR_UART_U1TXD (0x10) ++#define MCF_GPIO_PAR_UART_U1RXD (0x20) ++#define MCF_GPIO_PAR_UART_U1RTS (0x40) ++#define MCF_GPIO_PAR_UART_U1CTS (0x80) ++#define MCF_GPIO_PAR_UART_U1CTS_U1CTS (0x80) ++#define MCF_GPIO_PAR_UART_U1CTS_GPIO (0x00) ++#define MCF_GPIO_PAR_UART_U1RTS_U1RTS (0x40) ++#define MCF_GPIO_PAR_UART_U1RTS_GPIO (0x00) ++#define MCF_GPIO_PAR_UART_U1RXD_U1RXD (0x20) ++#define MCF_GPIO_PAR_UART_U1RXD_GPIO (0x00) ++#define MCF_GPIO_PAR_UART_U1TXD_U1TXD (0x10) ++#define MCF_GPIO_PAR_UART_U1TXD_GPIO (0x00) ++#define MCF_GPIO_PAR_UART_U0CTS_U0CTS (0x08) ++#define MCF_GPIO_PAR_UART_U0CTS_GPIO (0x00) ++#define MCF_GPIO_PAR_UART_U0RTS_U0RTS (0x04) ++#define MCF_GPIO_PAR_UART_U0RTS_GPIO (0x00) ++#define MCF_GPIO_PAR_UART_U0RXD_U0RXD (0x02) ++#define MCF_GPIO_PAR_UART_U0RXD_GPIO (0x00) ++#define MCF_GPIO_PAR_UART_U0TXD_U0TXD (0x01) ++#define MCF_GPIO_PAR_UART_U0TXD_GPIO (0x00) ++ ++/* Bit definitions and macros for PAR_FECI2C */ ++#define MCF_GPIO_PAR_FECI2C_SDA(x) (((x)&0x0003)) ++#define MCF_GPIO_PAR_FECI2C_SCL(x) (((x)&0x0003)<<2) ++#define MCF_GPIO_PAR_FECI2C_PAR_SDA(x) (((x)&0x0003)) ++#define MCF_GPIO_PAR_FECI2C_PAR_SCL(x) (((x)&0x0003)<<2) ++#define MCF_GPIO_PAR_FECI2C_MDIO0 (0x0010) ++#define MCF_GPIO_PAR_FECI2C_MDC0 (0x0040) ++#define MCF_GPIO_PAR_FECI2C_MDIO1(x) (((x)&0x0003)<<8) ++#define MCF_GPIO_PAR_FECI2C_MDC1(x) (((x)&0x0003)<<10) ++#define MCF_GPIO_PAR_FECI2C_MDC1_MASK (0xF3FF) ++#define MCF_GPIO_PAR_FECI2C_MDC1_MDC1 (0x0C00) ++#define MCF_GPIO_PAR_FECI2C_MDC1_ATA_DIOR (0x0800) ++#define MCF_GPIO_PAR_FECI2C_MDC1_GPIO (0x0000) ++#define MCF_GPIO_PAR_FECI2C_MDIO1_MASK (0xFCFF) ++#define MCF_GPIO_PAR_FECI2C_MDIO1_MDIO1 (0x0300) ++#define MCF_GPIO_PAR_FECI2C_MDIO1_ATA_DIOW (0x0200) ++#define MCF_GPIO_PAR_FECI2C_MDIO1_GPIO (0x0000) ++#define MCF_GPIO_PAR_FECI2C_MDC0_MDC0 (0x0040) ++#define MCF_GPIO_PAR_FECI2C_MDC0_GPIO (0x0000) ++#define MCF_GPIO_PAR_FECI2C_MDIO0_MDIO0 (0x0010) ++#define MCF_GPIO_PAR_FECI2C_MDIO0_GPIO (0x0000) ++#define MCF_GPIO_PAR_FECI2C_SCL_MASK (0xFFF3) ++#define MCF_GPIO_PAR_FECI2C_SCL_SCL (0x000C) ++#define MCF_GPIO_PAR_FECI2C_SCL_U2TXD (0x0004) ++#define MCF_GPIO_PAR_FECI2C_SCL_GPIO (0x0000) ++#define MCF_GPIO_PAR_FECI2C_SDA_MASK (0xFFFC) ++#define MCF_GPIO_PAR_FECI2C_SDA_SDA (0x0003) ++#define MCF_GPIO_PAR_FECI2C_SDA_U2RXD (0x0001) ++#define MCF_GPIO_PAR_FECI2C_SDA_GPIO (0x0000) ++ ++/* Bit definitions and macros for PAR_SSI */ ++#define MCF_GPIO_PAR_SSI_MCLK (0x0001) ++#define MCF_GPIO_PAR_SSI_STXD(x) (((x)&0x0003)<<2) ++#define MCF_GPIO_PAR_SSI_SRXD(x) (((x)&0x0003)<<4) ++#define MCF_GPIO_PAR_SSI_FS(x) (((x)&0x0003)<<6) ++#define MCF_GPIO_PAR_SSI_BCLK(x) (((x)&0x0003)<<8) ++#define MCF_GPIO_PAR_SSI_BCLK_MASK (0xFCFF) ++#define MCF_GPIO_PAR_SSI_BCLK_BCLK (0x0300) ++#define MCF_GPIO_PAR_SSI_BCLK_U1CTS (0x0200) ++#define MCF_GPIO_PAR_SSI_BCLK_GPIO (0x0000) ++#define MCF_GPIO_PAR_SSI_FS_MASK (0xFF3F) ++#define MCF_GPIO_PAR_SSI_FS_FS (0x00C0) ++#define MCF_GPIO_PAR_SSI_FS_U1RTS (0x0080) ++#define MCF_GPIO_PAR_SSI_FS_GPIO (0x0000) ++#define MCF_GPIO_PAR_SSI_SRXD_MASK (0xFFCF) ++#define MCF_GPIO_PAR_SSI_SRXD_SRXD (0x0030) ++#define MCF_GPIO_PAR_SSI_SRXD_U1RXD (0x0020) ++#define MCF_GPIO_PAR_SSI_SRXD_GPIO (0x0000) ++#define MCF_GPIO_PAR_SSI_STXD_MASK (0xFFF3) ++#define MCF_GPIO_PAR_SSI_STXD_STXD (0x000C) ++#define MCF_GPIO_PAR_SSI_STXD_U1TXD (0x0008) ++#define MCF_GPIO_PAR_SSI_STXD_GPIO (0x0000) ++#define MCF_GPIO_PAR_SSI_MCLK_MCLK (0x0001) ++#define MCF_GPIO_PAR_SSI_MCLK_GPIO (0x0000) ++ ++/* Bit definitions and macros for PAR_ATA */ ++#define MCF_GPIO_PAR_ATA_IORDY (0x0001) ++#define MCF_GPIO_PAR_ATA_DMARQ (0x0002) ++#define MCF_GPIO_PAR_ATA_RESET (0x0004) ++#define MCF_GPIO_PAR_ATA_DA0 (0x0020) ++#define MCF_GPIO_PAR_ATA_DA1 (0x0040) ++#define MCF_GPIO_PAR_ATA_DA2 (0x0080) ++#define MCF_GPIO_PAR_ATA_CS0 (0x0100) ++#define MCF_GPIO_PAR_ATA_CS1 (0x0200) ++#define MCF_GPIO_PAR_ATA_BUFEN (0x0400) ++#define MCF_GPIO_PAR_ATA_BUFEN_BUFEN (0x0400) ++#define MCF_GPIO_PAR_ATA_BUFEN_GPIO (0x0000) ++#define MCF_GPIO_PAR_ATA_CS1_CS1 (0x0200) ++#define MCF_GPIO_PAR_ATA_CS1_GPIO (0x0000) ++#define MCF_GPIO_PAR_ATA_CS0_CS0 (0x0100) ++#define MCF_GPIO_PAR_ATA_CS0_GPIO (0x0000) ++#define MCF_GPIO_PAR_ATA_DA2_DA2 (0x0080) ++#define MCF_GPIO_PAR_ATA_DA2_GPIO (0x0000) ++#define MCF_GPIO_PAR_ATA_DA1_DA1 (0x0040) ++#define MCF_GPIO_PAR_ATA_DA1_GPIO (0x0000) ++#define MCF_GPIO_PAR_ATA_DA0_DA0 (0x0020) ++#define MCF_GPIO_PAR_ATA_DA0_GPIO (0x0000) ++#define MCF_GPIO_PAR_ATA_RESET_RESET (0x0004) ++#define MCF_GPIO_PAR_ATA_RESET_GPIO (0x0000) ++#define MCF_GPIO_PAR_ATA_DMARQ_DMARQ (0x0002) ++#define MCF_GPIO_PAR_ATA_DMARQ_GPIO (0x0000) ++#define MCF_GPIO_PAR_ATA_IORDY_IORDY (0x0001) ++#define MCF_GPIO_PAR_ATA_IORDY_GPIO (0x0000) ++ ++/* Bit definitions and macros for PAR_IRQ */ ++#define MCF_GPIO_PAR_IRQ_IRQ1 (0x02) ++#define MCF_GPIO_PAR_IRQ_IRQ4 (0x10) ++#define MCF_GPIO_PAR_IRQ_IRQ4_IRQ4 (0x10) ++#define MCF_GPIO_PAR_IRQ_IRQ4_GPIO (0x00) ++#define MCF_GPIO_PAR_IRQ_IRQ1_IRQ1 (0x02) ++#define MCF_GPIO_PAR_IRQ_IRQ1_GPIO (0x00) ++ ++/* Bit definitions and macros for PAR_PCI */ ++#define MCF_GPIO_PAR_PCI_REQ0 (0x0001) ++#define MCF_GPIO_PAR_PCI_REQ1 (0x0004) ++#define MCF_GPIO_PAR_PCI_REQ2 (0x0010) ++#define MCF_GPIO_PAR_PCI_REQ3(x) (((x)&0x0003)<<6) ++#define MCF_GPIO_PAR_PCI_GNT0 (0x0100) ++#define MCF_GPIO_PAR_PCI_GNT1 (0x0400) ++#define MCF_GPIO_PAR_PCI_GNT2 (0x1000) ++#define MCF_GPIO_PAR_PCI_GNT3(x) (((x)&0x0003)<<14) ++#define MCF_GPIO_PAR_PCI_GNT3_MASK (0x3FFF) ++#define MCF_GPIO_PAR_PCI_GNT3_GNT3 (0xC000) ++#define MCF_GPIO_PAR_PCI_GNT3_ATA_DMACK (0x8000) ++#define MCF_GPIO_PAR_PCI_GNT3_GPIO (0x0000) ++#define MCF_GPIO_PAR_PCI_GNT2_GNT2 (0x1000) ++#define MCF_GPIO_PAR_PCI_GNT2_GPIO (0x0000) ++#define MCF_GPIO_PAR_PCI_GNT1_GNT1 (0x0400) ++#define MCF_GPIO_PAR_PCI_GNT1_GPIO (0x0000) ++#define MCF_GPIO_PAR_PCI_GNT0_GNT0 (0x0100) ++#define MCF_GPIO_PAR_PCI_GNT0_GPIO (0x0000) ++#define MCF_GPIO_PAR_PCI_REQ3_MASK (0xFF3F) ++#define MCF_GPIO_PAR_PCI_REQ3_REQ3 (0x00C0) ++#define MCF_GPIO_PAR_PCI_REQ3_ATA_INTRQ (0x0080) ++#define MCF_GPIO_PAR_PCI_REQ3_GPIO (0x0000) ++#define MCF_GPIO_PAR_PCI_REQ2_REQ2 (0x0010) ++#define MCF_GPIO_PAR_PCI_REQ2_GPIO (0x0000) ++#define MCF_GPIO_PAR_PCI_REQ1_REQ1 (0x0040) ++#define MCF_GPIO_PAR_PCI_REQ1_GPIO (0x0000) ++#define MCF_GPIO_PAR_PCI_REQ0_REQ0 (0x0001) ++#define MCF_GPIO_PAR_PCI_REQ0_GPIO (0x0000) ++ ++/* Bit definitions and macros for MSCR_SDRAM */ ++#define MCF_GPIO_MSCR_SDRAM_SDCTL(x) (((x)&0x03)) ++#define MCF_GPIO_MSCR_SDRAM_SDCLK(x) (((x)&0x03)<<2) ++#define MCF_GPIO_MSCR_SDRAM_SDDQS(x) (((x)&0x03)<<4) ++#define MCF_GPIO_MSCR_SDRAM_SDDATA(x) (((x)&0x03)<<6) ++#define MCF_GPIO_MSCR_SDRAM_SDDATA_MASK (0x3F) ++#define MCF_GPIO_MSCR_SDRAM_SDDATA_DDR1 (0xC0) ++#define MCF_GPIO_MSCR_SDRAM_SDDATA_DDR2 (0x80) ++#define MCF_GPIO_MSCR_SDRAM_SDDATA_FS_LPDDR (0x40) ++#define MCF_GPIO_MSCR_SDRAM_SDDATA_HS_LPDDR (0x00) ++#define MCF_GPIO_MSCR_SDRAM_SDDQS_MASK (0xCF) ++#define MCF_GPIO_MSCR_SDRAM_SDDQS_DDR1 (0x30) ++#define MCF_GPIO_MSCR_SDRAM_SDDQS_DDR2 (0x20) ++#define MCF_GPIO_MSCR_SDRAM_SDDQS_FS_LPDDR (0x10) ++#define MCF_GPIO_MSCR_SDRAM_SDDQS_HS_LPDDR (0x00) ++#define MCF_GPIO_MSCR_SDRAM_SDCLK_MASK (0xF3) ++#define MCF_GPIO_MSCR_SDRAM_SDCLK_DDR1 (0x0C) ++#define MCF_GPIO_MSCR_SDRAM_SDCLK_DDR2 (0x08) ++#define MCF_GPIO_MSCR_SDRAM_SDCLK_FS_LPDDR (0x04) ++#define MCF_GPIO_MSCR_SDRAM_SDCLK_HS_LPDDR (0x00) ++#define MCF_GPIO_MSCR_SDRAM_SDCTL_MASK (0xFC) ++#define MCF_GPIO_MSCR_SDRAM_SDCTL_DDR1 (0x03) ++#define MCF_GPIO_MSCR_SDRAM_SDCTL_DDR2 (0x02) ++#define MCF_GPIO_MSCR_SDRAM_SDCTL_FS_LPDDR (0x01) ++#define MCF_GPIO_MSCR_SDRAM_SDCTL_HS_LPDDR (0x00) ++ ++/* Bit definitions and macros for MSCR_PCI */ ++#define MCF_GPIO_MSCR_PCI_PCI (0x01) ++#define MCF_GPIO_MSCR_PCI_PCI_HI_66MHZ (0x01) ++#define MCF_GPIO_MSCR_PCI_PCI_LO_33MHZ (0x00) ++ ++/* Bit definitions and macros for DSCR_I2C */ ++#define MCF_GPIO_DSCR_I2C_I2C(x) (((x)&0x03)) ++#define MCF_GPIO_DSCR_I2C_I2C_LOAD_50PF (0x03) ++#define MCF_GPIO_DSCR_I2C_I2C_LOAD_30PF (0x02) ++#define MCF_GPIO_DSCR_I2C_I2C_LOAD_20PF (0x01) ++#define MCF_GPIO_DSCR_I2C_I2C_LOAD_10PF (0x00) ++ ++/* Bit definitions and macros for DSCR_FLEXBUS */ ++#define MCF_GPIO_DSCR_FLEXBUS_FBADL(x) (((x)&0x03)) ++#define MCF_GPIO_DSCR_FLEXBUS_FBADH(x) (((x)&0x03)<<2) ++#define MCF_GPIO_DSCR_FLEXBUS_FBCTL(x) (((x)&0x03)<<4) ++#define MCF_GPIO_DSCR_FLEXBUS_FBCLK(x) (((x)&0x03)<<6) ++#define MCF_GPIO_DSCR_FLEXBUS_FBCLK_LOAD_50PF (0xC0) ++#define MCF_GPIO_DSCR_FLEXBUS_FBCLK_LOAD_30P (0x80) ++#define MCF_GPIO_DSCR_FLEXBUS_FBCLK_LOAD_20PF (0x40) ++#define MCF_GPIO_DSCR_FLEXBUS_FBCLK_LOAD_10PF (0x00) ++#define MCF_GPIO_DSCR_FLEXBUS_FBCTL_LOAD_50PF (0x30) ++#define MCF_GPIO_DSCR_FLEXBUS_FBCTL_LOAD_30PF (0x20) ++#define MCF_GPIO_DSCR_FLEXBUS_FBCTL_LOAD_20PF (0x10) ++#define MCF_GPIO_DSCR_FLEXBUS_FBCTL_LOAD_10PF (0x00) ++#define MCF_GPIO_DSCR_FLEXBUS_FBADH_LOAD_50PF (0x0C) ++#define MCF_GPIO_DSCR_FLEXBUS_FBADH_LOAD_30PF (0x08) ++#define MCF_GPIO_DSCR_FLEXBUS_FBADH_LOAD_20PF (0x04) ++#define MCF_GPIO_DSCR_FLEXBUS_FBADH_LOAD_10PF (0x00) ++#define MCF_GPIO_DSCR_FLEXBUS_FBADL_LOAD_50PF (0x03) ++#define MCF_GPIO_DSCR_FLEXBUS_FBADL_LOAD_30PF (0x02) ++#define MCF_GPIO_DSCR_FLEXBUS_FBADL_LOAD_20PF (0x01) ++#define MCF_GPIO_DSCR_FLEXBUS_FBADL_LOAD_10PF (0x00) ++ ++/* Bit definitions and macros for DSCR_FEC */ ++#define MCF_GPIO_DSCR_FEC_FEC0(x) (((x)&0x03)) ++#define MCF_GPIO_DSCR_FEC_FEC1(x) (((x)&0x03)<<2) ++#define MCF_GPIO_DSCR_FEC_FEC1_LOAD_50PF (0x0C) ++#define MCF_GPIO_DSCR_FEC_FEC1_LOAD_30PF (0x08) ++#define MCF_GPIO_DSCR_FEC_FEC1_LOAD_20PF (0x04) ++#define MCF_GPIO_DSCR_FEC_FEC1_LOAD_10PF (0x00) ++#define MCF_GPIO_DSCR_FEC_FEC0_LOAD_50PF (0x03) ++#define MCF_GPIO_DSCR_FEC_FEC0_LOAD_30PF (0x02) ++#define MCF_GPIO_DSCR_FEC_FEC0_LOAD_20PF (0x01) ++#define MCF_GPIO_DSCR_FEC_FEC0_LOAD_10PF (0x00) ++ ++/* Bit definitions and macros for DSCR_UART */ ++#define MCF_GPIO_DSCR_UART_UART0(x) (((x)&0x03)) ++#define MCF_GPIO_DSCR_UART_UART1(x) (((x)&0x03)<<2) ++#define MCF_GPIO_DSCR_UART_UART1_LOAD_50PF (0x0C) ++#define MCF_GPIO_DSCR_UART_UART1_LOAD_30PF (0x08) ++#define MCF_GPIO_DSCR_UART_UART1_LOAD_20PF (0x04) ++#define MCF_GPIO_DSCR_UART_UART1_LOAD_10PF (0x00) ++#define MCF_GPIO_DSCR_UART_UART0_LOAD_50PF (0x03) ++#define MCF_GPIO_DSCR_UART_UART0_LOAD_30PF (0x02) ++#define MCF_GPIO_DSCR_UART_UART0_LOAD_20PF (0x01) ++#define MCF_GPIO_DSCR_UART_UART0_LOAD_10PF (0x00) ++ ++/* Bit definitions and macros for DSCR_DSPI */ ++#define MCF_GPIO_DSCR_DSPI_DSPI(x) (((x)&0x03)) ++#define MCF_GPIO_DSCR_DSPI_DSPI_LOAD_50PF (0x03) ++#define MCF_GPIO_DSCR_DSPI_DSPI_LOAD_30PF (0x02) ++#define MCF_GPIO_DSCR_DSPI_DSPI_LOAD_20PF (0x01) ++#define MCF_GPIO_DSCR_DSPI_DSPI_LOAD_10PF (0x00) ++ ++/* Bit definitions and macros for DSCR_TIMER */ ++#define MCF_GPIO_DSCR_TIMER_TIMER(x) (((x)&0x03)) ++#define MCF_GPIO_DSCR_TIMER_TIMER_LOAD_50PF (0x03) ++#define MCF_GPIO_DSCR_TIMER_TIMER_LOAD_30PF (0x02) ++#define MCF_GPIO_DSCR_TIMER_TIMER_LOAD_20PF (0x01) ++#define MCF_GPIO_DSCR_TIMER_TIMER_LOAD_10PF (0x00) ++ ++/* Bit definitions and macros for DSCR_SSI */ ++#define MCF_GPIO_DSCR_SSI_SSI(x) (((x)&0x03)) ++#define MCF_GPIO_DSCR_SSI_SSI_LOAD_50PF (0x03) ++#define MCF_GPIO_DSCR_SSI_SSI_LOAD_30PF (0x02) ++#define MCF_GPIO_DSCR_SSI_SSI_LOAD_20PF (0x01) ++#define MCF_GPIO_DSCR_SSI_SSI_LOAD_10PF (0x00) ++ ++/* Bit definitions and macros for DSCR_DMA */ ++#define MCF_GPIO_DSCR_DMA_DMA(x) (((x)&0x03)) ++#define MCF_GPIO_DSCR_DMA_DMA_LOAD_50PF (0x03) ++#define MCF_GPIO_DSCR_DMA_DMA_LOAD_30PF (0x02) ++#define MCF_GPIO_DSCR_DMA_DMA_LOAD_20PF (0x01) ++#define MCF_GPIO_DSCR_DMA_DMA_LOAD_10PF (0x00) ++ ++/* Bit definitions and macros for DSCR_DEBUG */ ++#define MCF_GPIO_DSCR_DEBUG_DEBUG(x) (((x)&0x03)) ++#define MCF_GPIO_DSCR_DEBUG_DEBUG_LOAD_50PF (0x03) ++#define MCF_GPIO_DSCR_DEBUG_DEBUG_LOAD_30PF (0x02) ++#define MCF_GPIO_DSCR_DEBUG_DEBUG_LOAD_20PF (0x01) ++#define MCF_GPIO_DSCR_DEBUG_DEBUG_LOAD_10PF (0x00) ++ ++/* Bit definitions and macros for DSCR_RESET */ ++#define MCF_GPIO_DSCR_RESET_RESET(x) (((x)&0x03)) ++#define MCF_GPIO_DSCR_RESET_RESET_LOAD_50PF (0x03) ++#define MCF_GPIO_DSCR_RESET_RESET_LOAD_30PF (0x02) ++#define MCF_GPIO_DSCR_RESET_RESET_LOAD_20PF (0x01) ++#define MCF_GPIO_DSCR_RESET_RESET_LOAD_10PF (0x00) ++ ++/* Bit definitions and macros for DSCR_IRQ */ ++#define MCF_GPIO_DSCR_IRQ_IRQ(x) (((x)&0x03)) ++#define MCF_GPIO_DSCR_IRQ_IRQ_LOAD_50PF (0x03) ++#define MCF_GPIO_DSCR_IRQ_IRQ_LOAD_30PF (0x02) ++#define MCF_GPIO_DSCR_IRQ_IRQ_LOAD_20PF (0x01) ++#define MCF_GPIO_DSCR_IRQ_IRQ_LOAD_10PF (0x00) ++ ++/* Bit definitions and macros for DSCR_USB */ ++#define MCF_GPIO_DSCR_USB_USB(x) (((x)&0x03)) ++#define MCF_GPIO_DSCR_USB_USB_LOAD_50PF (0x03) ++#define MCF_GPIO_DSCR_USB_USB_LOAD_30PF (0x02) ++#define MCF_GPIO_DSCR_USB_USB_LOAD_20PF (0x01) ++#define MCF_GPIO_DSCR_USB_USB_LOAD_10PF (0x00) ++ ++/* Bit definitions and macros for DSCR_ATA */ ++#define MCF_GPIO_DSCR_ATA_ATA(x) (((x)&0x03)) ++#define MCF_GPIO_DSCR_ATA_ATA_LOAD_50PF (0x03) ++#define MCF_GPIO_DSCR_ATA_ATA_LOAD_30PF (0x02) ++#define MCF_GPIO_DSCR_ATA_ATA_LOAD_20PF (0x01) ++#define MCF_GPIO_DSCR_ATA_ATA_LOAD_10PF (0x00) ++ ++/********************************************************************/ ++ ++#endif /* __MCF5445X_GPIO_H__ */ +--- /dev/null ++++ b/include/asm-m68k/mcf5445x_i2c.h +@@ -0,0 +1,39 @@ ++/* ++ * Matt Waddel Matt.Waddel@freescale.com ++ * ++ * Copyright Freescale Semiconductor, Inc. 2007 ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ */ ++ ++#ifndef __MCF5445X_I2C_H__ ++#define __MCF5445X_I2C_H__ ++ ++/********************************************************************* ++* ++* I2C Module (I2C) ++* ++*********************************************************************/ ++ ++/* Register read/write macros */ ++#define MCF_I2C_I2ADR (volatile u8 *)(0xFC058000) ++#define MCF_I2C_I2FDR (volatile u8 *)(0xFC058004) ++#define MCF_I2C_I2CR (volatile u8 *)(0xFC058008) ++#define MCF_I2C_I2SR (volatile u8 *)(0xFC05800C) ++#define MCF_I2C_I2DR (volatile u8 *)(0xFC058010) ++ ++/* Bit definitions and macros for I2AR */ ++#define MCF_I2C_I2AR_ADR(x) (((x)&0x7F)<<1) ++ ++/* Bit definitions and macros for I2FDR */ ++#define MCF_I2C_I2FDR_IC(x) (((x)&0x3F)) ++ ++/* Bit definitions and macros for I2DR */ ++#define MCF_I2C_I2DR_DATA(x) (x) ++ ++/********************************************************************/ ++ ++#endif /* __MCF5445X_I2C_H__ */ +--- /dev/null ++++ b/include/asm-m68k/mcf5445x_intc.h +@@ -0,0 +1,724 @@ ++/* ++ * Matt Waddel Matt.Waddel@freescale.com ++ * ++ * Copyright Freescale Semiconductor, Inc. 2007 ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ */ ++ ++#ifndef __MCF5445X_INTC_H__ ++#define __MCF5445X_INTC_H__ ++ ++/********************************************************************* ++* ++* Interrupt Controller (INTC) ++* ++*********************************************************************/ ++ ++/* Register read/write macros */ ++#define MCF_INTC0_IPRH MCF_REG32(0xFC048000) ++#define MCF_INTC0_IPRL MCF_REG32(0xFC048004) ++#define MCF_INTC0_IMRH MCF_REG32(0xFC048008) ++#define MCF_INTC0_IMRL MCF_REG32(0xFC04800C) ++#define MCF_INTC0_INTFRCH MCF_REG32(0xFC048010) ++#define MCF_INTC0_INTFRCL MCF_REG32(0xFC048014) ++#define MCF_INTC0_ICONFIG MCF_REG16(0xFC04801A) ++#define MCF_INTC0_SIMR MCF_REG08(0xFC04801C) ++#define MCF_INTC0_CIMR MCF_REG08(0xFC04801D) ++#define MCF_INTC0_CLMASK MCF_REG08(0xFC04801E) ++#define MCF_INTC0_SLMASK MCF_REG08(0xFC04801F) ++#define MCF_INTC0_ICR1 MCF_REG08(0xFC048041) ++#define MCF_INTC0_ICR2 MCF_REG08(0xFC048042) ++#define MCF_INTC0_ICR3 MCF_REG08(0xFC048043) ++#define MCF_INTC0_ICR4 MCF_REG08(0xFC048044) ++#define MCF_INTC0_ICR5 MCF_REG08(0xFC048045) ++#define MCF_INTC0_ICR6 MCF_REG08(0xFC048046) ++#define MCF_INTC0_ICR7 MCF_REG08(0xFC048047) ++#define MCF_INTC0_ICR8 MCF_REG08(0xFC048048) ++#define MCF_INTC0_ICR9 MCF_REG08(0xFC048049) ++#define MCF_INTC0_ICR10 MCF_REG08(0xFC04804A) ++#define MCF_INTC0_ICR11 MCF_REG08(0xFC04804B) ++#define MCF_INTC0_ICR12 MCF_REG08(0xFC04804C) ++#define MCF_INTC0_ICR13 MCF_REG08(0xFC04804D) ++#define MCF_INTC0_ICR14 MCF_REG08(0xFC04804E) ++#define MCF_INTC0_ICR15 MCF_REG08(0xFC04804F) ++#define MCF_INTC0_ICR16 MCF_REG08(0xFC048050) ++#define MCF_INTC0_ICR17 MCF_REG08(0xFC048051) ++#define MCF_INTC0_ICR18 MCF_REG08(0xFC048052) ++#define MCF_INTC0_ICR19 MCF_REG08(0xFC048053) ++#define MCF_INTC0_ICR20 MCF_REG08(0xFC048054) ++#define MCF_INTC0_ICR21 MCF_REG08(0xFC048055) ++#define MCF_INTC0_ICR22 MCF_REG08(0xFC048056) ++#define MCF_INTC0_ICR23 MCF_REG08(0xFC048057) ++#define MCF_INTC0_ICR24 MCF_REG08(0xFC048058) ++#define MCF_INTC0_ICR25 MCF_REG08(0xFC048059) ++#define MCF_INTC0_ICR26 MCF_REG08(0xFC04805A) ++#define MCF_INTC0_ICR27 MCF_REG08(0xFC04805B) ++#define MCF_INTC0_ICR28 MCF_REG08(0xFC04805C) ++#define MCF_INTC0_ICR29 MCF_REG08(0xFC04805D) ++#define MCF_INTC0_ICR30 MCF_REG08(0xFC04805E) ++#define MCF_INTC0_ICR31 MCF_REG08(0xFC04805F) ++#define MCF_INTC0_ICR32 MCF_REG08(0xFC048060) ++#define MCF_INTC0_ICR33 MCF_REG08(0xFC048061) ++#define MCF_INTC0_ICR34 MCF_REG08(0xFC048062) ++#define MCF_INTC0_ICR35 MCF_REG08(0xFC048063) ++#define MCF_INTC0_ICR36 MCF_REG08(0xFC048064) ++#define MCF_INTC0_ICR37 MCF_REG08(0xFC048065) ++#define MCF_INTC0_ICR38 MCF_REG08(0xFC048066) ++#define MCF_INTC0_ICR39 MCF_REG08(0xFC048067) ++#define MCF_INTC0_ICR40 MCF_REG08(0xFC048068) ++#define MCF_INTC0_ICR41 MCF_REG08(0xFC048069) ++#define MCF_INTC0_ICR42 MCF_REG08(0xFC04806A) ++#define MCF_INTC0_ICR43 MCF_REG08(0xFC04806B) ++#define MCF_INTC0_ICR44 MCF_REG08(0xFC04806C) ++#define MCF_INTC0_ICR45 MCF_REG08(0xFC04806D) ++#define MCF_INTC0_ICR46 MCF_REG08(0xFC04806E) ++#define MCF_INTC0_ICR47 MCF_REG08(0xFC04806F) ++#define MCF_INTC0_ICR48 MCF_REG08(0xFC048070) ++#define MCF_INTC0_ICR49 MCF_REG08(0xFC048071) ++#define MCF_INTC0_ICR50 MCF_REG08(0xFC048072) ++#define MCF_INTC0_ICR51 MCF_REG08(0xFC048073) ++#define MCF_INTC0_ICR52 MCF_REG08(0xFC048074) ++#define MCF_INTC0_ICR53 MCF_REG08(0xFC048075) ++#define MCF_INTC0_ICR54 MCF_REG08(0xFC048076) ++#define MCF_INTC0_ICR55 MCF_REG08(0xFC048077) ++#define MCF_INTC0_ICR56 MCF_REG08(0xFC048078) ++#define MCF_INTC0_ICR57 MCF_REG08(0xFC048079) ++#define MCF_INTC0_ICR58 MCF_REG08(0xFC04807A) ++#define MCF_INTC0_ICR59 MCF_REG08(0xFC04807B) ++#define MCF_INTC0_ICR60 MCF_REG08(0xFC04807C) ++#define MCF_INTC0_ICR61 MCF_REG08(0xFC04807D) ++#define MCF_INTC0_ICR62 MCF_REG08(0xFC04807E) ++#define MCF_INTC0_ICR63 MCF_REG08(0xFC04807F) ++#define MCF_INTC0_SWIACK MCF_REG08(0xFC0480E0) ++#define MCF_INTC0_L1IACK MCF_REG08(0xFC0480E4) ++#define MCF_INTC0_L2IACK MCF_REG08(0xFC0480E8) ++#define MCF_INTC0_L3IACK MCF_REG08(0xFC0480EC) ++#define MCF_INTC0_L4IACK MCF_REG08(0xFC0480F0) ++#define MCF_INTC0_L5IACK MCF_REG08(0xFC0480F4) ++#define MCF_INTC0_L6IACK MCF_REG08(0xFC0480F8) ++#define MCF_INTC0_L7IACK MCF_REG08(0xFC0480FC) ++#define MCF_INTC1_IPRH MCF_REG32(0xFC04C000) ++#define MCF_INTC1_IPRL MCF_REG32(0xFC04C004) ++#define MCF_INTC1_IMRH MCF_REG32(0xFC04C008) ++#define MCF_INTC1_IMRL MCF_REG32(0xFC04C00C) ++#define MCF_INTC1_INTFRCH MCF_REG32(0xFC04C010) ++#define MCF_INTC1_INTFRCL MCF_REG32(0xFC04C014) ++#define MCF_INTC1_ICONFIG MCF_REG16(0xFC04C01A) ++#define MCF_INTC1_SIMR MCF_REG08(0xFC04C01C) ++#define MCF_INTC1_CIMR MCF_REG08(0xFC04C01D) ++#define MCF_INTC1_CLMASK MCF_REG08(0xFC04C01E) ++#define MCF_INTC1_SLMASK MCF_REG08(0xFC04C01F) ++#define MCF_INTC1_ICR1 MCF_REG08(0xFC04C041) ++#define MCF_INTC1_ICR2 MCF_REG08(0xFC04C042) ++#define MCF_INTC1_ICR3 MCF_REG08(0xFC04C043) ++#define MCF_INTC1_ICR4 MCF_REG08(0xFC04C044) ++#define MCF_INTC1_ICR5 MCF_REG08(0xFC04C045) ++#define MCF_INTC1_ICR6 MCF_REG08(0xFC04C046) ++#define MCF_INTC1_ICR7 MCF_REG08(0xFC04C047) ++#define MCF_INTC1_ICR8 MCF_REG08(0xFC04C048) ++#define MCF_INTC1_ICR9 MCF_REG08(0xFC04C049) ++#define MCF_INTC1_ICR10 MCF_REG08(0xFC04C04A) ++#define MCF_INTC1_ICR11 MCF_REG08(0xFC04C04B) ++#define MCF_INTC1_ICR12 MCF_REG08(0xFC04C04C) ++#define MCF_INTC1_ICR13 MCF_REG08(0xFC04C04D) ++#define MCF_INTC1_ICR14 MCF_REG08(0xFC04C04E) ++#define MCF_INTC1_ICR15 MCF_REG08(0xFC04C04F) ++#define MCF_INTC1_ICR16 MCF_REG08(0xFC04C050) ++#define MCF_INTC1_ICR17 MCF_REG08(0xFC04C051) ++#define MCF_INTC1_ICR18 MCF_REG08(0xFC04C052) ++#define MCF_INTC1_ICR19 MCF_REG08(0xFC04C053) ++#define MCF_INTC1_ICR20 MCF_REG08(0xFC04C054) ++#define MCF_INTC1_ICR21 MCF_REG08(0xFC04C055) ++#define MCF_INTC1_ICR22 MCF_REG08(0xFC04C056) ++#define MCF_INTC1_ICR23 MCF_REG08(0xFC04C057) ++#define MCF_INTC1_ICR24 MCF_REG08(0xFC04C058) ++#define MCF_INTC1_ICR25 MCF_REG08(0xFC04C059) ++#define MCF_INTC1_ICR26 MCF_REG08(0xFC04C05A) ++#define MCF_INTC1_ICR27 MCF_REG08(0xFC04C05B) ++#define MCF_INTC1_ICR28 MCF_REG08(0xFC04C05C) ++#define MCF_INTC1_ICR29 MCF_REG08(0xFC04C05D) ++#define MCF_INTC1_ICR30 MCF_REG08(0xFC04C05E) ++#define MCF_INTC1_ICR31 MCF_REG08(0xFC04C05F) ++#define MCF_INTC1_ICR32 MCF_REG08(0xFC04C060) ++#define MCF_INTC1_ICR33 MCF_REG08(0xFC04C061) ++#define MCF_INTC1_ICR34 MCF_REG08(0xFC04C062) ++#define MCF_INTC1_ICR35 MCF_REG08(0xFC04C063) ++#define MCF_INTC1_ICR36 MCF_REG08(0xFC04C064) ++#define MCF_INTC1_ICR37 MCF_REG08(0xFC04C065) ++#define MCF_INTC1_ICR38 MCF_REG08(0xFC04C066) ++#define MCF_INTC1_ICR39 MCF_REG08(0xFC04C067) ++#define MCF_INTC1_ICR40 MCF_REG08(0xFC04C068) ++#define MCF_INTC1_ICR41 MCF_REG08(0xFC04C069) ++#define MCF_INTC1_ICR42 MCF_REG08(0xFC04C06A) ++#define MCF_INTC1_ICR43 MCF_REG08(0xFC04C06B) ++#define MCF_INTC1_ICR44 MCF_REG08(0xFC04C06C) ++#define MCF_INTC1_ICR45 MCF_REG08(0xFC04C06D) ++#define MCF_INTC1_ICR46 MCF_REG08(0xFC04C06E) ++#define MCF_INTC1_ICR47 MCF_REG08(0xFC04C06F) ++#define MCF_INTC1_ICR48 MCF_REG08(0xFC04C070) ++#define MCF_INTC1_ICR49 MCF_REG08(0xFC04C071) ++#define MCF_INTC1_ICR50 MCF_REG08(0xFC04C072) ++#define MCF_INTC1_ICR51 MCF_REG08(0xFC04C073) ++#define MCF_INTC1_ICR52 MCF_REG08(0xFC04C074) ++#define MCF_INTC1_ICR53 MCF_REG08(0xFC04C075) ++#define MCF_INTC1_ICR54 MCF_REG08(0xFC04C076) ++#define MCF_INTC1_ICR55 MCF_REG08(0xFC04C077) ++#define MCF_INTC1_ICR56 MCF_REG08(0xFC04C078) ++#define MCF_INTC1_ICR57 MCF_REG08(0xFC04C079) ++#define MCF_INTC1_ICR58 MCF_REG08(0xFC04C07A) ++#define MCF_INTC1_ICR59 MCF_REG08(0xFC04C07B) ++#define MCF_INTC1_ICR60 MCF_REG08(0xFC04C07C) ++#define MCF_INTC1_ICR61 MCF_REG08(0xFC04C07D) ++#define MCF_INTC1_ICR62 MCF_REG08(0xFC04C07E) ++#define MCF_INTC1_ICR63 MCF_REG08(0xFC04C07F) ++#define MCF_INTC1_SWIACK MCF_REG08(0xFC04C0E0) ++#define MCF_INTC1_L1IACK MCF_REG08(0xFC04C0E4) ++#define MCF_INTC1_L2IACK MCF_REG08(0xFC04C0E8) ++#define MCF_INTC1_L3IACK MCF_REG08(0xFC04C0EC) ++#define MCF_INTC1_L4IACK MCF_REG08(0xFC04C0F0) ++#define MCF_INTC1_L5IACK MCF_REG08(0xFC04C0F4) ++#define MCF_INTC1_L6IACK MCF_REG08(0xFC04C0F8 ++#define MCF_INTC1_L7IACK MCF_REG08(0xFC04C0FC) ++ ++/* Parameterized register read/write macros for multiple registers */ ++#define MCF_INTC0_ICR(x) MCF_REG08(0xFC048041+((x-1)*0x001)) ++#define MCF_INTC0_LIACK(x) MCF_REG08(0xFC0480E4+((x-1)*0x004)) ++#define MCF_INTC1_ICR(x) MCF_REG08(0xFC04C041+((x-1)*0x001)) ++#define MCF_INTC1_LIACK(x) MCF_REG08(0xFC04C0E4+((x-1)*0x004)) ++ ++/* Parameterized register read/write macros for multiple modules */ ++#define MCF_INTC_IPRH(x) MCF_REG32(0xFC048000+((x)*0x4000)) ++#define MCF_INTC_IPRL(x) MCF_REG32(0xFC048004+((x)*0x4000)) ++#define MCF_INTC_IMRH(x) MCF_REG32(0xFC048008+((x)*0x4000)) ++#define MCF_INTC_IMRL(x) MCF_REG32(0xFC04800C+((x)*0x4000)) ++#define MCF_INTC_INTFRCH(x) MCF_REG32(0xFC048010+((x)*0x4000)) ++#define MCF_INTC_INTFRCL(x) MCF_REG32(0xFC048014+((x)*0x4000)) ++#define MCF_INTC_ICONFIG(x) MCF_REG16(0xFC04801A+((x)*0x4000)) ++#define MCF_INTC_SIMR(x) MCF_REG08(0xFC04801C+((x)*0x4000)) ++#define MCF_INTC_CIMR(x) MCF_REG08(0xFC04801D+((x)*0x4000)) ++#define MCF_INTC_CLMASK(x) MCF_REG08(0xFC04801E+((x)*0x4000)) ++#define MCF_INTC_SLMASK(x) MCF_REG08(0xFC04801F+((x)*0x4000)) ++#define MCF_INTC_ICR1(x) MCF_REG08(0xFC048041+((x)*0x4000)) ++#define MCF_INTC_ICR2(x) MCF_REG08(0xFC048042+((x)*0x4000)) ++#define MCF_INTC_ICR3(x) MCF_REG08(0xFC048043+((x)*0x4000)) ++#define MCF_INTC_ICR4(x) MCF_REG08(0xFC048044+((x)*0x4000)) ++#define MCF_INTC_ICR5(x) MCF_REG08(0xFC048045+((x)*0x4000)) ++#define MCF_INTC_ICR6(x) MCF_REG08(0xFC048046+((x)*0x4000)) ++#define MCF_INTC_ICR7(x) MCF_REG08(0xFC048047+((x)*0x4000)) ++#define MCF_INTC_ICR8(x) MCF_REG08(0xFC048048+((x)*0x4000)) ++#define MCF_INTC_ICR9(x) MCF_REG08(0xFC048049+((x)*0x4000)) ++#define MCF_INTC_ICR10(x) MCF_REG08(0xFC04804A+((x)*0x4000)) ++#define MCF_INTC_ICR11(x) MCF_REG08(0xFC04804B+((x)*0x4000)) ++#define MCF_INTC_ICR12(x) MCF_REG08(0xFC04804C+((x)*0x4000)) ++#define MCF_INTC_ICR13(x) MCF_REG08(0xFC04804D+((x)*0x4000)) ++#define MCF_INTC_ICR14(x) MCF_REG08(0xFC04804E+((x)*0x4000)) ++#define MCF_INTC_ICR15(x) MCF_REG08(0xFC04804F+((x)*0x4000)) ++#define MCF_INTC_ICR16(x) MCF_REG08(0xFC048050+((x)*0x4000)) ++#define MCF_INTC_ICR17(x) MCF_REG08(0xFC048051+((x)*0x4000)) ++#define MCF_INTC_ICR18(x) MCF_REG08(0xFC048052+((x)*0x4000)) ++#define MCF_INTC_ICR19(x) MCF_REG08(0xFC048053+((x)*0x4000)) ++#define MCF_INTC_ICR20(x) MCF_REG08(0xFC048054+((x)*0x4000)) ++#define MCF_INTC_ICR21(x) MCF_REG08(0xFC048055+((x)*0x4000)) ++#define MCF_INTC_ICR22(x) MCF_REG08(0xFC048056+((x)*0x4000)) ++#define MCF_INTC_ICR23(x) MCF_REG08(0xFC048057+((x)*0x4000)) ++#define MCF_INTC_ICR24(x) MCF_REG08(0xFC048058+((x)*0x4000)) ++#define MCF_INTC_ICR25(x) MCF_REG08(0xFC048059+((x)*0x4000)) ++#define MCF_INTC_ICR26(x) MCF_REG08(0xFC04805A+((x)*0x4000)) ++#define MCF_INTC_ICR27(x) MCF_REG08(0xFC04805B+((x)*0x4000)) ++#define MCF_INTC_ICR28(x) MCF_REG08(0xFC04805C+((x)*0x4000)) ++#define MCF_INTC_ICR29(x) MCF_REG08(0xFC04805D+((x)*0x4000)) ++#define MCF_INTC_ICR30(x) MCF_REG08(0xFC04805E+((x)*0x4000)) ++#define MCF_INTC_ICR31(x) MCF_REG08(0xFC04805F+((x)*0x4000)) ++#define MCF_INTC_ICR32(x) MCF_REG08(0xFC048060+((x)*0x4000)) ++#define MCF_INTC_ICR33(x) MCF_REG08(0xFC048061+((x)*0x4000)) ++#define MCF_INTC_ICR34(x) MCF_REG08(0xFC048062+((x)*0x4000)) ++#define MCF_INTC_ICR35(x) MCF_REG08(0xFC048063+((x)*0x4000)) ++#define MCF_INTC_ICR36(x) MCF_REG08(0xFC048064+((x)*0x4000)) ++#define MCF_INTC_ICR37(x) MCF_REG08(0xFC048065+((x)*0x4000)) ++#define MCF_INTC_ICR38(x) MCF_REG08(0xFC048066+((x)*0x4000)) ++#define MCF_INTC_ICR39(x) MCF_REG08(0xFC048067+((x)*0x4000)) ++#define MCF_INTC_ICR40(x) MCF_REG08(0xFC048068+((x)*0x4000)) ++#define MCF_INTC_ICR41(x) MCF_REG08(0xFC048069+((x)*0x4000)) ++#define MCF_INTC_ICR42(x) MCF_REG08(0xFC04806A+((x)*0x4000)) ++#define MCF_INTC_ICR43(x) MCF_REG08(0xFC04806B+((x)*0x4000)) ++#define MCF_INTC_ICR44(x) MCF_REG08(0xFC04806C+((x)*0x4000)) ++#define MCF_INTC_ICR45(x) MCF_REG08(0xFC04806D+((x)*0x4000)) ++#define MCF_INTC_ICR46(x) MCF_REG08(0xFC04806E+((x)*0x4000)) ++#define MCF_INTC_ICR47(x) MCF_REG08(0xFC04806F+((x)*0x4000)) ++#define MCF_INTC_ICR48(x) MCF_REG08(0xFC048070+((x)*0x4000)) ++#define MCF_INTC_ICR49(x) MCF_REG08(0xFC048071+((x)*0x4000)) ++#define MCF_INTC_ICR50(x) MCF_REG08(0xFC048072+((x)*0x4000)) ++#define MCF_INTC_ICR51(x) MCF_REG08(0xFC048073+((x)*0x4000)) ++#define MCF_INTC_ICR52(x) MCF_REG08(0xFC048074+((x)*0x4000)) ++#define MCF_INTC_ICR53(x) MCF_REG08(0xFC048075+((x)*0x4000)) ++#define MCF_INTC_ICR54(x) MCF_REG08(0xFC048076+((x)*0x4000)) ++#define MCF_INTC_ICR55(x) MCF_REG08(0xFC048077+((x)*0x4000)) ++#define MCF_INTC_ICR56(x) MCF_REG08(0xFC048078+((x)*0x4000)) ++#define MCF_INTC_ICR57(x) MCF_REG08(0xFC048079+((x)*0x4000)) ++#define MCF_INTC_ICR58(x) MCF_REG08(0xFC04807A+((x)*0x4000)) ++#define MCF_INTC_ICR59(x) MCF_REG08(0xFC04807B+((x)*0x4000)) ++#define MCF_INTC_ICR60(x) MCF_REG08(0xFC04807C+((x)*0x4000)) ++#define MCF_INTC_ICR61(x) MCF_REG08(0xFC04807D+((x)*0x4000)) ++#define MCF_INTC_ICR62(x) MCF_REG08(0xFC04807E+((x)*0x4000)) ++#define MCF_INTC_ICR63(x) MCF_REG08(0xFC04807F+((x)*0x4000)) ++#define MCF_INTC_SWIACK(x) MCF_REG08(0xFC0480E0+((x)*0x4000)) ++#define MCF_INTC_L1IACK(x) MCF_REG08(0xFC0480E4+((x)*0x4000)) ++#define MCF_INTC_L2IACK(x) MCF_REG08(0xFC0480E8+((x)*0x4000)) ++#define MCF_INTC_L3IACK(x) MCF_REG08(0xFC0480EC+((x)*0x4000)) ++#define MCF_INTC_L4IACK(x) MCF_REG08(0xFC0480F0+((x)*0x4000)) ++#define MCF_INTC_L5IACK(x) MCF_REG08(0xFC0480F4+((x)*0x4000)) ++#define MCF_INTC_L6IACK(x) MCF_REG08(0xFC0480F8+((x)*0x4000)) ++#define MCF_INTC_L7IACK(x) MCF_REG08(0xFC0480FC+((x)*0x4000)) ++ ++/* Bit definitions and macros for IPRH */ ++#define MCF_INTC_IPRH_INT32 (0x00000001) ++#define MCF_INTC_IPRH_INT33 (0x00000002) ++#define MCF_INTC_IPRH_INT34 (0x00000004) ++#define MCF_INTC_IPRH_INT35 (0x00000008) ++#define MCF_INTC_IPRH_INT36 (0x00000010) ++#define MCF_INTC_IPRH_INT37 (0x00000020) ++#define MCF_INTC_IPRH_INT38 (0x00000040) ++#define MCF_INTC_IPRH_INT39 (0x00000080) ++#define MCF_INTC_IPRH_INT40 (0x00000100) ++#define MCF_INTC_IPRH_INT41 (0x00000200) ++#define MCF_INTC_IPRH_INT42 (0x00000400) ++#define MCF_INTC_IPRH_INT43 (0x00000800) ++#define MCF_INTC_IPRH_INT44 (0x00001000) ++#define MCF_INTC_IPRH_INT45 (0x00002000) ++#define MCF_INTC_IPRH_INT46 (0x00004000) ++#define MCF_INTC_IPRH_INT47 (0x00008000) ++#define MCF_INTC_IPRH_INT48 (0x00010000) ++#define MCF_INTC_IPRH_INT49 (0x00020000) ++#define MCF_INTC_IPRH_INT50 (0x00040000) ++#define MCF_INTC_IPRH_INT51 (0x00080000) ++#define MCF_INTC_IPRH_INT52 (0x00100000) ++#define MCF_INTC_IPRH_INT53 (0x00200000) ++#define MCF_INTC_IPRH_INT54 (0x00400000) ++#define MCF_INTC_IPRH_INT55 (0x00800000) ++#define MCF_INTC_IPRH_INT56 (0x01000000) ++#define MCF_INTC_IPRH_INT57 (0x02000000) ++#define MCF_INTC_IPRH_INT58 (0x04000000) ++#define MCF_INTC_IPRH_INT59 (0x08000000) ++#define MCF_INTC_IPRH_INT60 (0x10000000) ++#define MCF_INTC_IPRH_INT61 (0x20000000) ++#define MCF_INTC_IPRH_INT62 (0x40000000) ++#define MCF_INTC_IPRH_INT63 (0x80000000) ++ ++/* Bit definitions and macros for IPRL */ ++#define MCF_INTC_IPRL_INT0 (0x00000001) ++#define MCF_INTC_IPRL_INT1 (0x00000002) ++#define MCF_INTC_IPRL_INT2 (0x00000004) ++#define MCF_INTC_IPRL_INT3 (0x00000008) ++#define MCF_INTC_IPRL_INT4 (0x00000010) ++#define MCF_INTC_IPRL_INT5 (0x00000020) ++#define MCF_INTC_IPRL_INT6 (0x00000040) ++#define MCF_INTC_IPRL_INT7 (0x00000080) ++#define MCF_INTC_IPRL_INT8 (0x00000100) ++#define MCF_INTC_IPRL_INT9 (0x00000200) ++#define MCF_INTC_IPRL_INT10 (0x00000400) ++#define MCF_INTC_IPRL_INT11 (0x00000800) ++#define MCF_INTC_IPRL_INT12 (0x00001000) ++#define MCF_INTC_IPRL_INT13 (0x00002000) ++#define MCF_INTC_IPRL_INT14 (0x00004000) ++#define MCF_INTC_IPRL_INT15 (0x00008000) ++#define MCF_INTC_IPRL_INT16 (0x00010000) ++#define MCF_INTC_IPRL_INT17 (0x00020000) ++#define MCF_INTC_IPRL_INT18 (0x00040000) ++#define MCF_INTC_IPRL_INT19 (0x00080000) ++#define MCF_INTC_IPRL_INT20 (0x00100000) ++#define MCF_INTC_IPRL_INT21 (0x00200000) ++#define MCF_INTC_IPRL_INT22 (0x00400000) ++#define MCF_INTC_IPRL_INT23 (0x00800000) ++#define MCF_INTC_IPRL_INT24 (0x01000000) ++#define MCF_INTC_IPRL_INT25 (0x02000000) ++#define MCF_INTC_IPRL_INT26 (0x04000000) ++#define MCF_INTC_IPRL_INT27 (0x08000000) ++#define MCF_INTC_IPRL_INT28 (0x10000000) ++#define MCF_INTC_IPRL_INT29 (0x20000000) ++#define MCF_INTC_IPRL_INT30 (0x40000000) ++#define MCF_INTC_IPRL_INT31 (0x80000000) ++ ++/* Bit definitions and macros for IMRH */ ++#define MCF_INTC_IMRH_INT_MASK32 (0x00000001) ++#define MCF_INTC_IMRH_INT_MASK33 (0x00000002) ++#define MCF_INTC_IMRH_INT_MASK34 (0x00000004) ++#define MCF_INTC_IMRH_INT_MASK35 (0x00000008) ++#define MCF_INTC_IMRH_INT_MASK36 (0x00000010) ++#define MCF_INTC_IMRH_INT_MASK37 (0x00000020) ++#define MCF_INTC_IMRH_INT_MASK38 (0x00000040) ++#define MCF_INTC_IMRH_INT_MASK39 (0x00000080) ++#define MCF_INTC_IMRH_INT_MASK40 (0x00000100) ++#define MCF_INTC_IMRH_INT_MASK41 (0x00000200) ++#define MCF_INTC_IMRH_INT_MASK42 (0x00000400) ++#define MCF_INTC_IMRH_INT_MASK43 (0x00000800) ++#define MCF_INTC_IMRH_INT_MASK44 (0x00001000) ++#define MCF_INTC_IMRH_INT_MASK45 (0x00002000) ++#define MCF_INTC_IMRH_INT_MASK46 (0x00004000) ++#define MCF_INTC_IMRH_INT_MASK47 (0x00008000) ++#define MCF_INTC_IMRH_INT_MASK48 (0x00010000) ++#define MCF_INTC_IMRH_INT_MASK49 (0x00020000) ++#define MCF_INTC_IMRH_INT_MASK50 (0x00040000) ++#define MCF_INTC_IMRH_INT_MASK51 (0x00080000) ++#define MCF_INTC_IMRH_INT_MASK52 (0x00100000) ++#define MCF_INTC_IMRH_INT_MASK53 (0x00200000) ++#define MCF_INTC_IMRH_INT_MASK54 (0x00400000) ++#define MCF_INTC_IMRH_INT_MASK55 (0x00800000) ++#define MCF_INTC_IMRH_INT_MASK56 (0x01000000) ++#define MCF_INTC_IMRH_INT_MASK57 (0x02000000) ++#define MCF_INTC_IMRH_INT_MASK58 (0x04000000) ++#define MCF_INTC_IMRH_INT_MASK59 (0x08000000) ++#define MCF_INTC_IMRH_INT_MASK60 (0x10000000) ++#define MCF_INTC_IMRH_INT_MASK61 (0x20000000) ++#define MCF_INTC_IMRH_INT_MASK62 (0x40000000) ++#define MCF_INTC_IMRH_INT_MASK63 (0x80000000) ++ ++/* Bit definitions and macros for IMRL */ ++#define MCF_INTC_IMRL_INT_MASK0 (0x00000001) ++#define MCF_INTC_IMRL_INT_MASK1 (0x00000002) ++#define MCF_INTC_IMRL_INT_MASK2 (0x00000004) ++#define MCF_INTC_IMRL_INT_MASK3 (0x00000008) ++#define MCF_INTC_IMRL_INT_MASK4 (0x00000010) ++#define MCF_INTC_IMRL_INT_MASK5 (0x00000020) ++#define MCF_INTC_IMRL_INT_MASK6 (0x00000040) ++#define MCF_INTC_IMRL_INT_MASK7 (0x00000080) ++#define MCF_INTC_IMRL_INT_MASK8 (0x00000100) ++#define MCF_INTC_IMRL_INT_MASK9 (0x00000200) ++#define MCF_INTC_IMRL_INT_MASK10 (0x00000400) ++#define MCF_INTC_IMRL_INT_MASK11 (0x00000800) ++#define MCF_INTC_IMRL_INT_MASK12 (0x00001000) ++#define MCF_INTC_IMRL_INT_MASK13 (0x00002000) ++#define MCF_INTC_IMRL_INT_MASK14 (0x00004000) ++#define MCF_INTC_IMRL_INT_MASK15 (0x00008000) ++#define MCF_INTC_IMRL_INT_MASK16 (0x00010000) ++#define MCF_INTC_IMRL_INT_MASK17 (0x00020000) ++#define MCF_INTC_IMRL_INT_MASK18 (0x00040000) ++#define MCF_INTC_IMRL_INT_MASK19 (0x00080000) ++#define MCF_INTC_IMRL_INT_MASK20 (0x00100000) ++#define MCF_INTC_IMRL_INT_MASK21 (0x00200000) ++#define MCF_INTC_IMRL_INT_MASK22 (0x00400000) ++#define MCF_INTC_IMRL_INT_MASK23 (0x00800000) ++#define MCF_INTC_IMRL_INT_MASK24 (0x01000000) ++#define MCF_INTC_IMRL_INT_MASK25 (0x02000000) ++#define MCF_INTC_IMRL_INT_MASK26 (0x04000000) ++#define MCF_INTC_IMRL_INT_MASK27 (0x08000000) ++#define MCF_INTC_IMRL_INT_MASK28 (0x10000000) ++#define MCF_INTC_IMRL_INT_MASK29 (0x20000000) ++#define MCF_INTC_IMRL_INT_MASK30 (0x40000000) ++#define MCF_INTC_IMRL_INT_MASK31 (0x80000000) ++ ++/* Bit definitions and macros for INTFRCH */ ++#define MCF_INTC_INTFRCH_INTFRC32 (0x00000001) ++#define MCF_INTC_INTFRCH_INTFRC33 (0x00000002) ++#define MCF_INTC_INTFRCH_INTFRC34 (0x00000004) ++#define MCF_INTC_INTFRCH_INTFRC35 (0x00000008) ++#define MCF_INTC_INTFRCH_INTFRC36 (0x00000010) ++#define MCF_INTC_INTFRCH_INTFRC37 (0x00000020) ++#define MCF_INTC_INTFRCH_INTFRC38 (0x00000040) ++#define MCF_INTC_INTFRCH_INTFRC39 (0x00000080) ++#define MCF_INTC_INTFRCH_INTFRC40 (0x00000100) ++#define MCF_INTC_INTFRCH_INTFRC41 (0x00000200) ++#define MCF_INTC_INTFRCH_INTFRC42 (0x00000400) ++#define MCF_INTC_INTFRCH_INTFRC43 (0x00000800) ++#define MCF_INTC_INTFRCH_INTFRC44 (0x00001000) ++#define MCF_INTC_INTFRCH_INTFRC45 (0x00002000) ++#define MCF_INTC_INTFRCH_INTFRC46 (0x00004000) ++#define MCF_INTC_INTFRCH_INTFRC47 (0x00008000) ++#define MCF_INTC_INTFRCH_INTFRC48 (0x00010000) ++#define MCF_INTC_INTFRCH_INTFRC49 (0x00020000) ++#define MCF_INTC_INTFRCH_INTFRC50 (0x00040000) ++#define MCF_INTC_INTFRCH_INTFRC51 (0x00080000) ++#define MCF_INTC_INTFRCH_INTFRC52 (0x00100000) ++#define MCF_INTC_INTFRCH_INTFRC53 (0x00200000) ++#define MCF_INTC_INTFRCH_INTFRC54 (0x00400000) ++#define MCF_INTC_INTFRCH_INTFRC55 (0x00800000) ++#define MCF_INTC_INTFRCH_INTFRC56 (0x01000000) ++#define MCF_INTC_INTFRCH_INTFRC57 (0x02000000) ++#define MCF_INTC_INTFRCH_INTFRC58 (0x04000000) ++#define MCF_INTC_INTFRCH_INTFRC59 (0x08000000) ++#define MCF_INTC_INTFRCH_INTFRC60 (0x10000000) ++#define MCF_INTC_INTFRCH_INTFRC61 (0x20000000) ++#define MCF_INTC_INTFRCH_INTFRC62 (0x40000000) ++#define MCF_INTC_INTFRCH_INTFRC63 (0x80000000) ++ ++/* Bit definitions and macros for INTFRCL */ ++#define MCF_INTC_INTFRCL_INTFRC0 (0x00000001) ++#define MCF_INTC_INTFRCL_INTFRC1 (0x00000002) ++#define MCF_INTC_INTFRCL_INTFRC2 (0x00000004) ++#define MCF_INTC_INTFRCL_INTFRC3 (0x00000008) ++#define MCF_INTC_INTFRCL_INTFRC4 (0x00000010) ++#define MCF_INTC_INTFRCL_INTFRC5 (0x00000020) ++#define MCF_INTC_INTFRCL_INTFRC6 (0x00000040) ++#define MCF_INTC_INTFRCL_INTFRC7 (0x00000080) ++#define MCF_INTC_INTFRCL_INTFRC8 (0x00000100) ++#define MCF_INTC_INTFRCL_INTFRC9 (0x00000200) ++#define MCF_INTC_INTFRCL_INTFRC10 (0x00000400) ++#define MCF_INTC_INTFRCL_INTFRC11 (0x00000800) ++#define MCF_INTC_INTFRCL_INTFRC12 (0x00001000) ++#define MCF_INTC_INTFRCL_INTFRC13 (0x00002000) ++#define MCF_INTC_INTFRCL_INTFRC14 (0x00004000) ++#define MCF_INTC_INTFRCL_INTFRC15 (0x00008000) ++#define MCF_INTC_INTFRCL_INTFRC16 (0x00010000) ++#define MCF_INTC_INTFRCL_INTFRC17 (0x00020000) ++#define MCF_INTC_INTFRCL_INTFRC18 (0x00040000) ++#define MCF_INTC_INTFRCL_INTFRC19 (0x00080000) ++#define MCF_INTC_INTFRCL_INTFRC20 (0x00100000) ++#define MCF_INTC_INTFRCL_INTFRC21 (0x00200000) ++#define MCF_INTC_INTFRCL_INTFRC22 (0x00400000) ++#define MCF_INTC_INTFRCL_INTFRC23 (0x00800000) ++#define MCF_INTC_INTFRCL_INTFRC24 (0x01000000) ++#define MCF_INTC_INTFRCL_INTFRC25 (0x02000000) ++#define MCF_INTC_INTFRCL_INTFRC26 (0x04000000) ++#define MCF_INTC_INTFRCL_INTFRC27 (0x08000000) ++#define MCF_INTC_INTFRCL_INTFRC28 (0x10000000) ++#define MCF_INTC_INTFRCL_INTFRC29 (0x20000000) ++#define MCF_INTC_INTFRCL_INTFRC30 (0x40000000) ++#define MCF_INTC_INTFRCL_INTFRC31 (0x80000000) ++ ++/* Bit definitions and macros for ICONFIG */ ++#define MCF_INTC_ICONFIG_EMASK (0x0020) ++#define MCF_INTC_ICONFIG_ELVLPRI1 (0x0200) ++#define MCF_INTC_ICONFIG_ELVLPRI2 (0x0400) ++#define MCF_INTC_ICONFIG_ELVLPRI3 (0x0800) ++#define MCF_INTC_ICONFIG_ELVLPRI4 (0x1000) ++#define MCF_INTC_ICONFIG_ELVLPRI5 (0x2000) ++#define MCF_INTC_ICONFIG_ELVLPRI6 (0x4000) ++#define MCF_INTC_ICONFIG_ELVLPRI7 (0x8000) ++ ++/* Bit definitions and macros for SIMR */ ++#define MCF_INTC_SIMR_SIMR(x) (((x)&0x7F)) ++ ++/* Bit definitions and macros for CIMR */ ++#define MCF_INTC_CIMR_CIMR(x) (((x)&0x7F)) ++ ++/* Bit definitions and macros for CLMASK */ ++#define MCF_INTC_CLMASK_CLMASK(x) (((x)&0x0F)) ++ ++/* Bit definitions and macros for SLMASK */ ++#define MCF_INTC_SLMASK_SLMASK(x) (((x)&0x0F)) ++ ++/* Bit definitions and macros for ICR group */ ++#define MCF_INTC_ICR_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR1 */ ++#define MCF_INTC_ICR1_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR2 */ ++#define MCF_INTC_ICR2_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR3 */ ++#define MCF_INTC_ICR3_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR4 */ ++#define MCF_INTC_ICR4_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR5 */ ++#define MCF_INTC_ICR5_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR6 */ ++#define MCF_INTC_ICR6_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR7 */ ++#define MCF_INTC_ICR7_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR8 */ ++#define MCF_INTC_ICR8_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR9 */ ++#define MCF_INTC_ICR9_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR10 */ ++#define MCF_INTC_ICR10_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR11 */ ++#define MCF_INTC_ICR11_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR12 */ ++#define MCF_INTC_ICR12_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR13 */ ++#define MCF_INTC_ICR13_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR14 */ ++#define MCF_INTC_ICR14_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR15 */ ++#define MCF_INTC_ICR15_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR16 */ ++#define MCF_INTC_ICR16_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR17 */ ++#define MCF_INTC_ICR17_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR18 */ ++#define MCF_INTC_ICR18_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR19 */ ++#define MCF_INTC_ICR19_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR20 */ ++#define MCF_INTC_ICR20_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR21 */ ++#define MCF_INTC_ICR21_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR22 */ ++#define MCF_INTC_ICR22_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR23 */ ++#define MCF_INTC_ICR23_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR24 */ ++#define MCF_INTC_ICR24_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR25 */ ++#define MCF_INTC_ICR25_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR26 */ ++#define MCF_INTC_ICR26_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR27 */ ++#define MCF_INTC_ICR27_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR28 */ ++#define MCF_INTC_ICR28_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR29 */ ++#define MCF_INTC_ICR29_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR30 */ ++#define MCF_INTC_ICR30_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR31 */ ++#define MCF_INTC_ICR31_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR32 */ ++#define MCF_INTC_ICR32_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR33 */ ++#define MCF_INTC_ICR33_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR34 */ ++#define MCF_INTC_ICR34_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR35 */ ++#define MCF_INTC_ICR35_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR36 */ ++#define MCF_INTC_ICR36_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR37 */ ++#define MCF_INTC_ICR37_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR38 */ ++#define MCF_INTC_ICR38_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR39 */ ++#define MCF_INTC_ICR39_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR40 */ ++#define MCF_INTC_ICR40_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR41 */ ++#define MCF_INTC_ICR41_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR42 */ ++#define MCF_INTC_ICR42_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR43 */ ++#define MCF_INTC_ICR43_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR44 */ ++#define MCF_INTC_ICR44_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR45 */ ++#define MCF_INTC_ICR45_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR46 */ ++#define MCF_INTC_ICR46_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR47 */ ++#define MCF_INTC_ICR47_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR48 */ ++#define MCF_INTC_ICR48_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR49 */ ++#define MCF_INTC_ICR49_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR50 */ ++#define MCF_INTC_ICR50_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR51 */ ++#define MCF_INTC_ICR51_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR52 */ ++#define MCF_INTC_ICR52_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR53 */ ++#define MCF_INTC_ICR53_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR54 */ ++#define MCF_INTC_ICR54_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR55 */ ++#define MCF_INTC_ICR55_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR56 */ ++#define MCF_INTC_ICR56_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR57 */ ++#define MCF_INTC_ICR57_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR58 */ ++#define MCF_INTC_ICR58_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR59 */ ++#define MCF_INTC_ICR59_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR60 */ ++#define MCF_INTC_ICR60_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR61 */ ++#define MCF_INTC_ICR61_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR62 */ ++#define MCF_INTC_ICR62_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for ICR63 */ ++#define MCF_INTC_ICR63_IL(x) (((x)&0x07)) ++ ++/* Bit definitions and macros for SWIACK */ ++#define MCF_INTC_SWIACK_VECTOR(x) (x) ++ ++/* Bit definitions and macros for LIACK group */ ++#define MCF_INTC_LIACK_VECTOR(x) (x) ++ ++/* Bit definitions and macros for L1IACK */ ++#define MCF_INTC_L1IACK_VECTOR(x) (x) ++ ++/* Bit definitions and macros for L2IACK */ ++#define MCF_INTC_L2IACK_VECTOR(x) (x) ++ ++/* Bit definitions and macros for L3IACK */ ++#define MCF_INTC_L3IACK_VECTOR(x) (x) ++ ++/* Bit definitions and macros for L4IACK */ ++#define MCF_INTC_L4IACK_VECTOR(x) (x) ++ ++/* Bit definitions and macros for L5IACK */ ++#define MCF_INTC_L5IACK_VECTOR(x) (x) ++ ++/* Bit definitions and macros for L6IACK */ ++#define MCF_INTC_L6IACK_VECTOR(x) (x) ++ ++/* Bit definitions and macros for L7IACK */ ++#define MCF_INTC_L7IACK_VECTOR(x) (x) ++ ++/********************************************************************/ ++ ++#endif /* __MCF5445X_INTC_H__ */ +--- /dev/null ++++ b/include/asm-m68k/mcf5445x_pci.h +@@ -0,0 +1,238 @@ ++/* ++ * Kurt Mahan kmahan@freescale.com ++ * ++ * Copyright Freescale Semiconductor, Inc. 2007 ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ */ ++ ++#ifndef __MCF5445X_PCI_H__ ++#define __MCF5445X_PCI_H__ ++ ++/********************************************************************* ++* ++* PCI Bus Controller (PCI) ++* ++*********************************************************************/ ++ ++/* Register read/write macros */ ++#define MCF_PCI_PCIIDR MCF_REG32(0xFC0A8000) ++#define MCF_PCI_PCISCR MCF_REG32(0xFC0A8004) ++#define MCF_PCI_PCICCRIR MCF_REG32(0xFC0A8008) ++#define MCF_PCI_PCICR1 MCF_REG32(0xFC0A800C) ++#define MCF_PCI_PCIBAR0 MCF_REG32(0xFC0A8010) ++#define MCF_PCI_PCIBAR1 MCF_REG32(0xFC0A8014) ++#define MCF_PCI_PCIBAR2 MCF_REG32(0xFC0A8018) ++#define MCF_PCI_PCIBAR3 MCF_REG32(0xFC0A801C) ++#define MCF_PCI_PCIBAR4 MCF_REG32(0xFC0A8020) ++#define MCF_PCI_PCIBAR5 MCF_REG32(0xFC0A8024) ++#define MCF_PCI_PCISID MCF_REG32(0xFC0A802C) ++#define MCF_PCI_PCICR2 MCF_REG32(0xFC0A803C) ++#define MCF_PCI_PCIGSCR MCF_REG32(0xFC0A8060) ++#define MCF_PCI_PCITBATR0A MCF_REG32(0xFC0A8064) ++#define MCF_PCI_PCITBATR1A MCF_REG32(0xFC0A8068) ++#define MCF_PCI_PCITCR MCF_REG32(0xFC0A806C) ++#define MCF_PCI_PCIIW0BTAR MCF_REG32(0xFC0A8070) ++#define MCF_PCI_PCIIW1BTAR MCF_REG32(0xFC0A8074) ++#define MCF_PCI_PCIIW2BTAR MCF_REG32(0xFC0A8078) ++#define MCF_PCI_PCIIWCR MCF_REG32(0xFC0A8080) ++#define MCF_PCI_PCIICR MCF_REG32(0xFC0A8084) ++#define MCF_PCI_PCIISR MCF_REG32(0xFC0A8088) ++#define MCF_PCI_PCITCR2 MCF_REG32(0xFC0A808C) ++#define MCF_PCI_PCITBATR0 MCF_REG32(0xFC0A8090) ++#define MCF_PCI_PCITBATR1 MCF_REG32(0xFC0A8094) ++#define MCF_PCI_PCITBATR2 MCF_REG32(0xFC0A8098) ++#define MCF_PCI_PCITBATR3 MCF_REG32(0xFC0A809C) ++#define MCF_PCI_PCITBATR4 MCF_REG32(0xFC0A80A0) ++#define MCF_PCI_PCITBATR5 MCF_REG32(0xFC0A80A4) ++#define MCF_PCI_PCICAR MCF_REG32(0xFC0A80F8) ++ ++/* Parameterized register read/write macros for multiple registers */ ++#define MCF_PCI_PCIIWBTAR(x) MCF_REG32(0xFC0A8070+((x)*0x004)) ++ ++/* Bit definitions and macros for PCIIDR */ ++#define MCF_PCI_PCIIDR_VENDORID(x) (((x)&0x0000FFFF)) ++#define MCF_PCI_PCIIDR_DEVICEID(x) (((x)&0x0000FFFF)<<16) ++ ++/* Bit definitions and macros for PCISCR */ ++#define MCF_PCI_PCISCR_M (0x00000002) ++#define MCF_PCI_PCISCR_B (0x00000004) ++#define MCF_PCI_PCISCR_SP (0x00000008) ++#define MCF_PCI_PCISCR_MW (0x00000010) ++#define MCF_PCI_PCISCR_PER (0x00000040) ++#define MCF_PCI_PCISCR_S (0x00000100) ++#define MCF_PCI_PCISCR_F (0x00000200) ++#define MCF_PCI_PCISCR_C (0x00100000) ++#define MCF_PCI_PCISCR_66M (0x00200000) ++#define MCF_PCI_PCISCR_R (0x00400000) ++#define MCF_PCI_PCISCR_FC (0x00800000) ++#define MCF_PCI_PCISCR_DP (0x01000000) ++#define MCF_PCI_PCISCR_DT(x) (((x)&0x00000003)<<25) ++#define MCF_PCI_PCISCR_TS (0x08000000) ++#define MCF_PCI_PCISCR_TR (0x10000000) ++#define MCF_PCI_PCISCR_MA (0x20000000) ++#define MCF_PCI_PCISCR_SE (0x40000000) ++#define MCF_PCI_PCISCR_PE (0x80000000) ++ ++/* Bit definitions and macros for PCICCRIR */ ++#define MCF_PCI_PCICCRIR_REVID(x) (((x)&0x000000FF)) ++#define MCF_PCI_PCICCRIR_CLASSCODE(x) (((x)&0x00FFFFFF)<<8) ++ ++/* Bit definitions and macros for PCICR1 */ ++#define MCF_PCI_PCICR1_CACHELINESIZE(x) (((x)&0x0000000F)) ++#define MCF_PCI_PCICR1_LATTIMER(x) (((x)&0x000000FF)<<8) ++#define MCF_PCI_PCICR1_HEADERTYPE(x) (((x)&0x000000FF)<<16) ++#define MCF_PCI_PCICR1_BIST(x) (((x)&0x000000FF)<<24) ++ ++/* Bit definitions and macros for PCIBAR0 */ ++#define MCF_PCI_PCIBAR0_IO (0x00000001) ++#define MCF_PCI_PCIBAR0_RANGE(x) (((x)&0x00000003)<<1) ++#define MCF_PCI_PCIBAR0_PREF (0x00000008) ++#define MCF_PCI_PCIBAR0_BAR0(x) (((x)&0x00003FFF)<<18) ++ ++/* Bit definitions and macros for PCIBAR1 */ ++#define MCF_PCI_PCIBAR1_IO (0x00000001) ++#define MCF_PCI_PCIBAR1_PREF (0x00000008) ++#define MCF_PCI_PCIBAR1_BAR1(x) (((x)&0x00000FFF)<<20) ++ ++/* Bit definitions and macros for PCIBAR2 */ ++#define MCF_PCI_PCIBAR2_IO (0x00000001) ++#define MCF_PCI_PCIBAR2_RANGE(x) (((x)&0x00000003)<<1) ++#define MCF_PCI_PCIBAR2_PREF (0x00000008) ++#define MCF_PCI_PCIBAR2_BAR2(x) (((x)&0x000003FF)<<22) ++ ++/* Bit definitions and macros for PCIBAR3 */ ++#define MCF_PCI_PCIBAR3_IO (0x00000001) ++#define MCF_PCI_PCIBAR3_PREF (0x00000008) ++#define MCF_PCI_PCIBAR3_BAR3(x) (((x)&0x000000FF)<<24) ++ ++/* Bit definitions and macros for PCIBAR4 */ ++#define MCF_PCI_PCIBAR4_IO (0x00000001) ++#define MCF_PCI_PCIBAR4_RANGE(x) (((x)&0x00000003)<<1) ++#define MCF_PCI_PCIBAR4_PREF (0x00000008) ++#define MCF_PCI_PCIBAR4_BAR4(x) (((x)&0x0000001F)<<27) ++ ++/* Bit definitions and macros for PCIBAR5 */ ++#define MCF_PCI_PCIBAR5_IO (0x00000001) ++#define MCF_PCI_PCIBAR5_PREF (0x00000008) ++#define MCF_PCI_PCIBAR5_BAR5(x) (((x)&0x0000000F)<<28) ++ ++/* Bit definitions and macros for PCISID */ ++#define MCF_PCI_PCISID_VENDORID(x) (((x)&0x0000FFFF)) ++#define MCF_PCI_PCISID_ID(x) (((x)&0x0000FFFF)<<16) ++ ++/* Bit definitions and macros for PCICR2 */ ++#define MCF_PCI_PCICR2_INTLINE(x) (((x)&0x000000FF)) ++#define MCF_PCI_PCICR2_INTPIN(x) (((x)&0x000000FF)<<8) ++#define MCF_PCI_PCICR2_MINGNT(x) (((x)&0x000000FF)<<16) ++#define MCF_PCI_PCICR2_MAXLAT(x) (((x)&0x000000FF)<<24) ++ ++/* Bit definitions and macros for PCIGSCR */ ++#define MCF_PCI_PCIGSCR_PR (0x00000001) ++#define MCF_PCI_PCIGSCR_SEE (0x00001000) ++#define MCF_PCI_PCIGSCR_PEE (0x00002000) ++#define MCF_PCI_PCIGSCR_SE (0x10000000) ++#define MCF_PCI_PCIGSCR_PE (0x20000000) ++ ++/* Bit definitions and macros for PCITBATR0A */ ++#define MCF_PCI_PCITBATR0A_EN (0x00000001) ++#define MCF_PCI_PCITBATR0A_BAT0(x) (((x)&0x00003FFF)<<18) ++ ++/* Bit definitions and macros for PCITBATR1A */ ++#define MCF_PCI_PCITBATR1A_EN (0x00000001) ++#define MCF_PCI_PCITBATR1A_BAT1(x) (((x)&0x00000FFF)<<20) ++ ++/* Bit definitions and macros for PCITCR */ ++#define MCF_PCI_PCITCR_WCT(x) (((x)&0x000000FF)) ++#define MCF_PCI_PCITCR_WCD (0x00000100) ++#define MCF_PCI_PCITCR_P (0x00010000) ++#define MCF_PCI_PCITCR_PID (0x00020000) ++#define MCF_PCI_PCITCR_LD (0x01000000) ++ ++/* Bit definitions and macros for PCIIWBTAR group */ ++#define MCF_PCI_PCIIWBTAR_WBA(x) ((((x)&0xFF000000))) ++#define MCF_PCI_PCIIWBTAR_WAM(x) ((((x)&0xFF000000) ++#define MCF_PCI_PCIIWBTAR_WTA(x) ((((x)&0xFF000000) ++ ++/* Bit definitions and macros for PCIIW0BTAR */ ++#define MCF_PCI_PCIIW0BTAR_WBA(x) ((((x)&0xFF000000))) ++#define MCF_PCI_PCIIW0BTAR_WAM(x) ((((x)&0xFF000000) ++#define MCF_PCI_PCIIW0BTAR_WTA(x) ((((x)&0xFF000000) ++ ++/* Bit definitions and macros for PCIIWCR */ ++#define MCF_PCI_PCIIWCR_WINCTRL2(x) (((x)&0x0000000F)<<8) ++#define MCF_PCI_PCIIWCR_WINCTRL1(x) (((x)&0x0000000F)<<16) ++#define MCF_PCI_PCIIWCR_WINCTRL0(x) (((x)&0x0000000F)<<24) ++#define MCF_PCI_PCIIWCR_WINCTRL0_ENABLE (0x01000000) ++#define MCF_PCI_PCIIWCR_WINCTRL0_MEMREAD (0x01000000) ++#define MCF_PCI_PCIIWCR_WINCTRL0_MEMRDLINE (0x03000000) ++#define MCF_PCI_PCIIWCR_WINCTRL0_MEMRDMUL (0x05000000) ++#define MCF_PCI_PCIIWCR_WINCTRL0_IO (0x09000000) ++#define MCF_PCI_PCIIWCR_WINCTRL1_MEMREAD (0x00010000) ++#define MCF_PCI_PCIIWCR_WINCTRL1_ENABLE (0x00010000) ++#define MCF_PCI_PCIIWCR_WINCTRL1_MEMRDLINE (0x00030000) ++#define MCF_PCI_PCIIWCR_WINCTRL1_MEMRDMUL (0x00050000) ++#define MCF_PCI_PCIIWCR_WINCTRL1_IO (0x00090000) ++#define MCF_PCI_PCIIWCR_WINCTRL2_ENABLE (0x00000100) ++#define MCF_PCI_PCIIWCR_WINCTRL2_MEMREAD (0x00000100) ++#define MCF_PCI_PCIIWCR_WINCTRL2_MEMRDLINE (0x00000300) ++#define MCF_PCI_PCIIWCR_WINCTRL2_MEMRDMUL (0x00000500) ++#define MCF_PCI_PCIIWCR_WINCTRL2_IO (0x00000900) ++ ++/* Bit definitions and macros for PCIICR */ ++#define MCF_PCI_PCIICR_MAXRETRY(x) (((x)&0x000000FF)) ++#define MCF_PCI_PCIICR_TAE (0x01000000) ++#define MCF_PCI_PCIICR_IAE (0x02000000) ++#define MCF_PCI_PCIICR_REE (0x04000000) ++ ++/* Bit definitions and macros for PCIISR */ ++#define MCF_PCI_PCIISR_TA (0x01000000) ++#define MCF_PCI_PCIISR_IA (0x02000000) ++#define MCF_PCI_PCIISR_RE (0x04000000) ++ ++/* Bit definitions and macros for PCITCR2 */ ++#define MCF_PCI_PCITCR2_CR (0x00000001) ++#define MCF_PCI_PCITCR2_B0E (0x00000100) ++#define MCF_PCI_PCITCR2_B1E (0x00000200) ++#define MCF_PCI_PCITCR2_B2E (0x00000400) ++#define MCF_PCI_PCITCR2_B3E (0x00000800) ++#define MCF_PCI_PCITCR2_B4E (0x00001000) ++#define MCF_PCI_PCITCR2_B5E (0x00002000) ++ ++/* Bit definitions and macros for PCITBATR0 */ ++#define MCF_PCI_PCITBATR0_EN (0x00000001) ++#define MCF_PCI_PCITBATR0_BAT0(x) (((x)&0x00003FFF)<<18) ++ ++/* Bit definitions and macros for PCITBATR1 */ ++#define MCF_PCI_PCITBATR1_EN (0x00000001) ++#define MCF_PCI_PCITBATR1_BAT1(x) (((x)&0x00000FFF)<<20) ++ ++/* Bit definitions and macros for PCITBATR2 */ ++#define MCF_PCI_PCITBATR2_EN (0x00000001) ++#define MCF_PCI_PCITBATR2_BAT2(x) (((x)&0x000003FF)<<22) ++ ++/* Bit definitions and macros for PCITBATR3 */ ++#define MCF_PCI_PCITBATR3_EN (0x00000001) ++#define MCF_PCI_PCITBATR3_BAT3(x) (((x)&0x000000FF)<<24) ++ ++/* Bit definitions and macros for PCITBATR4 */ ++#define MCF_PCI_PCITBATR4_EN (0x00000001) ++#define MCF_PCI_PCITBATR4_BAT4(x) (((x)&0x0000001F)<<27) ++ ++/* Bit definitions and macros for PCITBATR5 */ ++#define MCF_PCI_PCITBATR5_EN (0x00000001) ++#define MCF_PCI_PCITBATR5_BAT5(x) (((x)&0x0000000F)<<28) ++ ++/* Bit definitions and macros for PCICAR */ ++#define MCF_PCI_PCICAR_DWORD(x) ((x)&0x000000FC) ++#define MCF_PCI_PCICAR_FUNCNUM(x) (((x)&0x00000007)<<8) ++#define MCF_PCI_PCICAR_DEVNUM(x) (((x)&0x0000001F)<<11) ++#define MCF_PCI_PCICAR_BUSNUM(x) (((x)&0x000000FF)<<16) ++#define MCF_PCI_PCICAR_E (0x80000000) ++ ++/********************************************************************/ ++ ++#endif /* __MCF5445X_PCI_H__ */ +--- /dev/null ++++ b/include/asm-m68k/mcf5445x_pciarb.h +@@ -0,0 +1,40 @@ ++/* ++ * Kurt Mahan kmahan@freescale.com ++ * ++ * Copyright Freescale Semiconductor, Inc. 2007 ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ */ ++ ++#ifndef __MCF5445X_PCIARB_H__ ++#define __MCF5445X_PCIARB_H__ ++ ++/********************************************************************* ++* ++* PCI Arbiter Module (PCIARB) ++* ++*********************************************************************/ ++ ++/* Register read/write macros */ ++#define MCF_PCIARB_PACR MCF_REG32(0xFC0AC000) ++#define MCF_PCIARB_PASR MCF_REG32(0xFC0AC004) ++ ++/* Bit definitions and macros for PACR */ ++#define MCF_PCIARB_PACR_INTMPRI (0x00000001) ++#define MCF_PCIARB_PACR_EXTMPRI(x) (((x)&0x0000001F)<<1) ++#define MCF_PCIARB_PACR_RA (0x00008000) ++#define MCF_PCIARB_PACR_INTMINTEN (0x00010000) ++#define MCF_PCIARB_PACR_EXTMINTEN(x) (((x)&0x0000001F)<<17) ++#define MCF_PCIARB_PACR_PKMD (0x40000000) ++#define MCF_PCIARB_PACR_DS (0x80000000) ++ ++/* Bit definitions and macros for PASR */ ++#define MCF_PCIARB_PASR_ITLMBK (0x00010000) ++#define MCF_PCIARB_PASR_EXTMBK(x) (((x)&0x0000001F)<<17) ++ ++/********************************************************************/ ++ ++#endif /* __MCF5445X_PCIARB_H__ */ +--- /dev/null ++++ b/include/asm-m68k/mcf5445x_sdramc.h +@@ -0,0 +1,115 @@ ++/* ++ * Matt Waddel Matt.Waddel@freescale.com ++ * ++ * Copyright Freescale Semiconductor, Inc. 2007 ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ */ ++ ++#ifndef __MCF5445X_SDRAMC_H__ ++#define __MCF5445X_SDRAMC_H__ ++ ++/********************************************************************* ++* ++* SDRAM Controller (SDRAMC) ++* ++*********************************************************************/ ++ ++/* Register read/write macros */ ++#define MCF_SDRAMC_SDMR (*(vuint32 *)(0xFC0B8000)) /* SDRAM Mode/Extended Mode Register */ ++#define MCF_SDRAMC_SDCR (*(vuint32 *)(0xFC0B8004)) /* SDRAM Control Register */ ++#define MCF_SDRAMC_SDCFG1 (*(vuint32 *)(0xFC0B8008)) /* SDRAM Configuration Register 1 */ ++#define MCF_SDRAMC_SDCFG2 (*(vuint32 *)(0xFC0B800C)) /* SDRAM Configuration Register 2 */ ++#define MCF_SDRAMC_SDCS0 (*(vuint32 *)(0xFC0B8110)) /* SDRAM Chip Select Register */ ++#define MCF_SDRAMC_SDCS1 (*(vuint32 *)(0xFC0B8114)) /* SDRAM Chip Select Register */ ++ ++/* Parameterized register read/write macros for multiple registers */ ++#define MCF_SDRAMC_SDCS(x) (*(vuint32 *)(0xFC0B8110+((x)*0x004))) /* SDRAM Chip Select Register */ ++ ++/* Bit definitions and macros for SDMR */ ++#define MCF_SDRAMC_SDMR_DDR2_AD(x) (((x)&0x00003FFF)) /* Address for DDR2 */ ++#define MCF_SDRAMC_SDMR_CMD (0x00010000) /* Command */ ++#define MCF_SDRAMC_SDMR_AD(x) (((x)&0x00000FFF)<<18) /* Address */ ++#define MCF_SDRAMC_SDMR_BK(x) (((x)&0x00000003)<<30) /* Bank Address */ ++#define MCF_SDRAMC_SDMR_BK_LMR (0x00000000) ++#define MCF_SDRAMC_SDMR_BK_LEMR (0x40000000) ++ ++/* Bit definitions and macros for SDCR */ ++#define MCF_SDRAMC_SDCR_DPD (0x00000001) /* Deep Power-Down Mode */ ++#define MCF_SDRAMC_SDCR_IPALL (0x00000002) /* Initiate Precharge All */ ++#define MCF_SDRAMC_SDCR_IREF (0x00000004) /* Initiate Refresh */ ++#define MCF_SDRAMC_SDCR_DQS_OE(x) (((x)&0x00000003)<<10) /* DQS Output Enable */ ++#define MCF_SDRAMC_SDCR_MEM_PS (0x00002000) /* Data Port Size */ ++#define MCF_SDRAMC_SDCR_REF_CNT(x) (((x)&0x0000003F)<<16) /* Periodic Refresh Counter */ ++#define MCF_SDRAMC_SDCR_OE_RULE (0x00400000) /* Drive Rule Selection */ ++#define MCF_SDRAMC_SDCR_ADDR_MUX(x) (((x)&0x00000003)<<24) /* Internal Address Mux Select */ ++#define MCF_SDRAMC_SDCR_DDR2_MODE (0x08000000) /* DDR2 Mode Select */ ++#define MCF_SDRAMC_SDCR_REF_EN (0x10000000) /* Refresh Enable */ ++#define MCF_SDRAMC_SDCR_DDR_MODE (0x20000000) /* DDR Mode Select */ ++#define MCF_SDRAMC_SDCR_CKE (0x40000000) /* Clock Enable */ ++#define MCF_SDRAMC_SDCR_MODE_EN (0x80000000) /* SDRAM Mode Register Programming Enable */ ++#define MCF_SDRAMC_SDCR_DQS_OE_BOTH (0x00000C00) ++ ++/* Bit definitions and macros for SDCFG1 */ ++#define MCF_SDRAMC_SDCFG1_WT_LAT(x) (((x)&0x00000007)<<4) /* Write Latency */ ++#define MCF_SDRAMC_SDCFG1_REF2ACT(x) (((x)&0x0000000F)<<8) /* Refresh to active delay */ ++#define MCF_SDRAMC_SDCFG1_PRE2ACT(x) (((x)&0x00000007)<<12) /* Precharge to active delay */ ++#define MCF_SDRAMC_SDCFG1_ACT2RW(x) (((x)&0x00000007)<<16) /* Active to read/write delay */ ++#define MCF_SDRAMC_SDCFG1_RD_LAT(x) (((x)&0x0000000F)<<20) /* Read CAS Latency */ ++#define MCF_SDRAMC_SDCFG1_SWT2RWP(x) (((x)&0x00000007)<<24) /* Single write to read/write/precharge delay */ ++#define MCF_SDRAMC_SDCFG1_SRD2RWP(x) (((x)&0x0000000F)<<28) /* Single read to read/write/precharge delay */ ++ ++/* Bit definitions and macros for SDCFG2 */ ++#define MCF_SDRAMC_SDCFG2_BL(x) (((x)&0x0000000F)<<16) /* Burst Length */ ++#define MCF_SDRAMC_SDCFG2_BRD2W(x) (((x)&0x0000000F)<<20) /* Burst read to write delay */ ++#define MCF_SDRAMC_SDCFG2_BWT2RWP(x) (((x)&0x0000000F)<<24) /* Burst write to read/write/precharge delay */ ++#define MCF_SDRAMC_SDCFG2_BRD2RP(x) (((x)&0x0000000F)<<28) /* Burst read to read/precharge delay */ ++ ++/* Bit definitions and macros for SDCS group */ ++#define MCF_SDRAMC_SDCS_CSSZ(x) (((x)&0x0000001F)) /* Chip-Select Size */ ++#define MCF_SDRAMC_SDCS_CSBA(x) (((x)&0x00000FFF)<<20) /* Chip-Select Base Address */ ++#define MCF_SDRAMC_SDCS_BA(x) ((x)&0xFFF00000) ++#define MCF_SDRAMC_SDCS_CSSZ_DISABLE (0x00000000) ++#define MCF_SDRAMC_SDCS_CSSZ_1MBYTE (0x00000013) ++#define MCF_SDRAMC_SDCS_CSSZ_2MBYTE (0x00000014) ++#define MCF_SDRAMC_SDCS_CSSZ_4MBYTE (0x00000015) ++#define MCF_SDRAMC_SDCS_CSSZ_8MBYTE (0x00000016) ++#define MCF_SDRAMC_SDCS_CSSZ_16MBYTE (0x00000017) ++#define MCF_SDRAMC_SDCS_CSSZ_32MBYTE (0x00000018) ++#define MCF_SDRAMC_SDCS_CSSZ_64MBYTE (0x00000019) ++#define MCF_SDRAMC_SDCS_CSSZ_128MBYTE (0x0000001A) ++#define MCF_SDRAMC_SDCS_CSSZ_256MBYTE (0x0000001B) ++#define MCF_SDRAMC_SDCS_CSSZ_512MBYTE (0x0000001C) ++#define MCF_SDRAMC_SDCS_CSSZ_1GBYTE (0x0000001D) ++#define MCF_SDRAMC_SDCS_CSSZ_2GBYTE (0x0000001E) ++#define MCF_SDRAMC_SDCS_CSSZ_4GBYTE (0x0000001F) ++ ++/* Bit definitions and macros for SDCS0 */ ++#define MCF_SDRAMC_SDCS0_CSSZ(x) (((x)&0x0000001F)) /* Chip-Select Size */ ++#define MCF_SDRAMC_SDCS0_CSBA(x) (((x)&0x00000FFF)<<20) /* Chip-Select Base Address */ ++#define MCF_SDRAMC_SDCS0_BA(x) ((x)&0xFFF00000) ++#define MCF_SDRAMC_SDCS0_CSSZ_DISABLE (0x00000000) ++#define MCF_SDRAMC_SDCS0_CSSZ_1MBYTE (0x00000013) ++#define MCF_SDRAMC_SDCS0_CSSZ_2MBYTE (0x00000014) ++#define MCF_SDRAMC_SDCS0_CSSZ_4MBYTE (0x00000015) ++#define MCF_SDRAMC_SDCS0_CSSZ_8MBYTE (0x00000016) ++#define MCF_SDRAMC_SDCS0_CSSZ_16MBYTE (0x00000017) ++#define MCF_SDRAMC_SDCS0_CSSZ_32MBYTE (0x00000018) ++#define MCF_SDRAMC_SDCS0_CSSZ_64MBYTE (0x00000019) ++#define MCF_SDRAMC_SDCS0_CSSZ_128MBYTE (0x0000001A) ++#define MCF_SDRAMC_SDCS0_CSSZ_256MBYTE (0x0000001B) ++#define MCF_SDRAMC_SDCS0_CSSZ_512MBYTE (0x0000001C) ++#define MCF_SDRAMC_SDCS0_CSSZ_1GBYTE (0x0000001D) ++#define MCF_SDRAMC_SDCS0_CSSZ_2GBYTE (0x0000001E) ++#define MCF_SDRAMC_SDCS0_CSSZ_4GBYTE (0x0000001F) ++ ++/* Bit definitions and macros for SDCS1 */ ++#define MCF_SDRAMC_SDCS1_CSSZ(x) (((x)&0x0000001F)) /* Chip-Select Size */ ++#define MCF_SDRAMC_SDCS1_CSBA(x) (((x)&0x00000FFF)<<20) /* Chip-Select Base Address */ ++ ++/********************************************************************/ ++ ++#endif /* __MCF5445X_SDRAMC_H__ */ +--- /dev/null ++++ b/include/asm-m68k/mcf5445x_ssi.h +@@ -0,0 +1,187 @@ ++/* ++ * Yaroslav Vinogradov yaroslav.vinogradov@freescale.com ++ * ++ * Copyright Freescale Semiconductor, Inc. 2007 ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ */ ++ ++#ifndef __MCF5445X_SSI_H__ ++#define __MCF5445X_SSI_H__ ++ ++/********************************************************************* ++* ++* Synchronous Serial Interface (SSI) ++* ++*********************************************************************/ ++ ++/* Register read/write macros */ ++#define MCF_SSI_TX0 MCF_REG32(0xFC0BC000) ++#define MCF_SSI_TX1 MCF_REG32(0xFC0BC004) ++#define MCF_SSI_RX0 MCF_REG32(0xFC0BC008) ++#define MCF_SSI_RX1 MCF_REG32(0xFC0BC00C) ++#define MCF_SSI_CR MCF_REG32(0xFC0BC010) ++#define MCF_SSI_ISR MCF_REG32(0xFC0BC014) ++#define MCF_SSI_IER MCF_REG32(0xFC0BC018) ++#define MCF_SSI_TCR MCF_REG32(0xFC0BC01C) ++#define MCF_SSI_RCR MCF_REG32(0xFC0BC020) ++#define MCF_SSI_CCR MCF_REG32(0xFC0BC024) ++#define MCF_SSI_FCSR MCF_REG32(0xFC0BC02C) ++#define MCF_SSI_ACR MCF_REG32(0xFC0BC038) ++#define MCF_SSI_ACADD MCF_REG32(0xFC0BC03C) ++#define MCF_SSI_ACDAT MCF_REG32(0xFC0BC040) ++#define MCF_SSI_ATAG MCF_REG32(0xFC0BC044) ++#define MCF_SSI_TMASK MCF_REG32(0xFC0BC048) ++#define MCF_SSI_RMASK MCF_REG32(0xFC0BC04C) ++ ++/* Parameterized register read/write macros for multiple registers */ ++#define MCF_SSI_TX(x) MCF_REG32(0xFC0BC000+((x)*0x004)) ++#define MCF_SSI_RX(x) MCF_REG32(0xFC0BC008+((x)*0x004)) ++ ++/* Bit definitions and macros for TX group */ ++#define MCF_SSI_TX_SSI_TX(x) (x) ++ ++/* Bit definitions and macros for TX0 */ ++#define MCF_SSI_TX0_SSI_TX(x) (x) ++ ++/* Bit definitions and macros for TX1 */ ++#define MCF_SSI_TX1_SSI_TX(x) (x) ++ ++/* Bit definitions and macros for RX group */ ++#define MCF_SSI_RX_SSI_RX(x) (x) ++ ++/* Bit definitions and macros for RX0 */ ++#define MCF_SSI_RX0_SSI_RX(x) (x) ++ ++/* Bit definitions and macros for RX1 */ ++#define MCF_SSI_RX1_SSI_RX(x) (x) ++ ++/* Bit definitions and macros for CR */ ++#define MCF_SSI_CR_SSI_EN (0x00000001) ++#define MCF_SSI_CR_TE (0x00000002) ++#define MCF_SSI_CR_RE (0x00000004) ++#define MCF_SSI_CR_NET (0x00000008) ++#define MCF_SSI_CR_SYN (0x00000010) ++#define MCF_SSI_CR_I2S(x) (((x)&0x00000003)<<5) ++#define MCF_SSI_CR_MCE (0x00000080) ++#define MCF_SSI_CR_TCH (0x00000100) ++#define MCF_SSI_CR_CIS (0x00000200) ++#define MCF_SSI_CR_I2S_NORMAL (0x00000000) ++#define MCF_SSI_CR_I2S_MASTER (0x00000020) ++#define MCF_SSI_CR_I2S_SLAVE (0x00000040) ++ ++/* Bit definitions and macros for ISR */ ++#define MCF_SSI_ISR_TFE0 (0x00000001) ++#define MCF_SSI_ISR_TFE1 (0x00000002) ++#define MCF_SSI_ISR_RFF0 (0x00000004) ++#define MCF_SSI_ISR_RFF1 (0x00000008) ++#define MCF_SSI_ISR_RLS (0x00000010) ++#define MCF_SSI_ISR_TLS (0x00000020) ++#define MCF_SSI_ISR_RFS (0x00000040) ++#define MCF_SSI_ISR_TFS (0x00000080) ++#define MCF_SSI_ISR_TUE0 (0x00000100) ++#define MCF_SSI_ISR_TUE1 (0x00000200) ++#define MCF_SSI_ISR_ROE0 (0x00000400) ++#define MCF_SSI_ISR_ROE1 (0x00000800) ++#define MCF_SSI_ISR_TDE0 (0x00001000) ++#define MCF_SSI_ISR_TDE1 (0x00002000) ++#define MCF_SSI_ISR_RDR0 (0x00004000) ++#define MCF_SSI_ISR_RDR1 (0x00008000) ++#define MCF_SSI_ISR_RXT (0x00010000) ++#define MCF_SSI_ISR_CMDDU (0x00020000) ++#define MCF_SSI_ISR_CMDAU (0x00040000) ++ ++/* Bit definitions and macros for IER */ ++#define MCF_SSI_IER_TFE0 (0x00000001) ++#define MCF_SSI_IER_TFE1 (0x00000002) ++#define MCF_SSI_IER_RFF0 (0x00000004) ++#define MCF_SSI_IER_RFF1 (0x00000008) ++#define MCF_SSI_IER_RLS (0x00000010) ++#define MCF_SSI_IER_TLS (0x00000020) ++#define MCF_SSI_IER_RFS (0x00000040) ++#define MCF_SSI_IER_TFS (0x00000080) ++#define MCF_SSI_IER_TUE0 (0x00000100) ++#define MCF_SSI_IER_TUE1 (0x00000200) ++#define MCF_SSI_IER_ROE0 (0x00000400) ++#define MCF_SSI_IER_ROE1 (0x00000800) ++#define MCF_SSI_IER_TDE0 (0x00001000) ++#define MCF_SSI_IER_TDE1 (0x00002000) ++#define MCF_SSI_IER_RDR0 (0x00004000) ++#define MCF_SSI_IER_RDR1 (0x00008000) ++#define MCF_SSI_IER_RXT (0x00010000) ++#define MCF_SSI_IER_CMDU (0x00020000) ++#define MCF_SSI_IER_CMDAU (0x00040000) ++#define MCF_SSI_IER_TIE (0x00080000) ++#define MCF_SSI_IER_TDMAE (0x00100000) ++#define MCF_SSI_IER_RIE (0x00200000) ++#define MCF_SSI_IER_RDMAE (0x00400000) ++ ++/* Bit definitions and macros for TCR */ ++#define MCF_SSI_TCR_TEFS (0x00000001) ++#define MCF_SSI_TCR_TFSL (0x00000002) ++#define MCF_SSI_TCR_TFSI (0x00000004) ++#define MCF_SSI_TCR_TSCKP (0x00000008) ++#define MCF_SSI_TCR_TSHFD (0x00000010) ++#define MCF_SSI_TCR_TXDIR (0x00000020) ++#define MCF_SSI_TCR_TFDIR (0x00000040) ++#define MCF_SSI_TCR_TFEN0 (0x00000080) ++#define MCF_SSI_TCR_TFEN1 (0x00000100) ++#define MCF_SSI_TCR_TXBIT0 (0x00000200) ++ ++/* Bit definitions and macros for RCR */ ++#define MCF_SSI_RCR_REFS (0x00000001) ++#define MCF_SSI_RCR_RFSL (0x00000002) ++#define MCF_SSI_RCR_RFSI (0x00000004) ++#define MCF_SSI_RCR_RSCKP (0x00000008) ++#define MCF_SSI_RCR_RSHFD (0x00000010) ++#define MCF_SSI_RCR_RFEN0 (0x00000080) ++#define MCF_SSI_RCR_RFEN1 (0x00000100) ++#define MCF_SSI_RCR_RXBIT0 (0x00000200) ++#define MCF_SSI_RCR_RXEXT (0x00000400) ++ ++/* Bit definitions and macros for CCR */ ++#define MCF_SSI_CCR_PM(x) (((x)&0x000000FF)) ++#define MCF_SSI_CCR_DC(x) (((x)&0x0000001F)<<8) ++#define MCF_SSI_CCR_WL(x) (((x)&0x0000000F)<<13) ++#define MCF_SSI_CCR_PSR (0x00020000) ++#define MCF_SSI_CCR_DIV2 (0x00040000) ++ ++/* Bit definitions and macros for FCSR */ ++#define MCF_SSI_FCSR_TFWM0(x) (((x)&0x0000000F)) ++#define MCF_SSI_FCSR_RFWM0(x) (((x)&0x0000000F)<<4) ++#define MCF_SSI_FCSR_TFCNT0(x) (((x)&0x0000000F)<<8) ++#define MCF_SSI_FCSR_RFCNT0(x) (((x)&0x0000000F)<<12) ++#define MCF_SSI_FCSR_TFWM1(x) (((x)&0x0000000F)<<16) ++#define MCF_SSI_FCSR_RFWM1(x) (((x)&0x0000000F)<<20) ++#define MCF_SSI_FCSR_TFCNT1(x) (((x)&0x0000000F)<<24) ++#define MCF_SSI_FCSR_RFCNT1(x) (((x)&0x0000000F)<<28) ++ ++/* Bit definitions and macros for ACR */ ++#define MCF_SSI_ACR_AC97EN (0x00000001) ++#define MCF_SSI_ACR_FV (0x00000002) ++#define MCF_SSI_ACR_TIF (0x00000004) ++#define MCF_SSI_ACR_RD (0x00000008) ++#define MCF_SSI_ACR_WR (0x00000010) ++#define MCF_SSI_ACR_FRDIV(x) (((x)&0x0000003F)<<5) ++ ++/* Bit definitions and macros for ACADD */ ++#define MCF_SSI_ACADD_SSI_ACADD(x) (((x)&0x0007FFFF)) ++ ++/* Bit definitions and macros for ACDAT */ ++#define MCF_SSI_ACDAT_SSI_ACDAT(x) (((x)&0x0007FFFF)) ++ ++/* Bit definitions and macros for ATAG */ ++#define MCF_SSI_ATAG_DDI_ATAG(x) (((x)&0x0000FFFF)) ++ ++/* Bit definitions and macros for TMASK */ ++#define MCF_SSI_TMASK_SSI_TMASK(x) (x) ++ ++/* Bit definitions and macros for RMASK */ ++#define MCF_SSI_RMASK_SSI_RMASK(x) (x) ++ ++/********************************************************************/ ++ ++#endif /* __MCF5445X_SSI_H__ */ +--- /dev/null ++++ b/include/asm-m68k/mcf5445x_usb.h +@@ -0,0 +1,49 @@ ++/* ++ * Duck Schmid duck@freescale.com ++ * ++ * Copyright 2005-2007 Freescale Semiconductor, Inc. All Rights Reserved. ++ */ ++ ++/* ++ * The code contained herein is licensed under the GNU General Public ++ * License. You may obtain a copy of the GNU General Public License ++ * Version 2 or later at the following locations: ++ * ++ * http://www.opensource.org/licenses/gpl-license.html ++ * http://www.gnu.org/copyleft/gpl.html ++ */ ++ ++#include <asm/mcfsim.h> ++ ++/* ehci_arc_hc_driver.flags value */ ++#define FSL_PLATFORM_HC_FLAGS (HCD_USB2 | HCD_MEMORY) ++ ++static inline int fsl_platform_verify(struct platform_device *pdev) ++{ ++ return 0; ++} ++ ++static inline void fsl_platform_usb_setup(struct usb_hcd *hcd) ++{ ++} ++ ++static inline void fsl_platform_set_host_mode(struct usb_hcd *hcd) ++{ ++ unsigned int temp; ++ struct fsl_usb2_platform_data *pdata; ++ struct fsl_usb_host_regs *regs; ++ ++ pdata = hcd->self.controller->platform_data; ++ regs = pdata->regs; ++ ++ if (pdata->xcvr_ops && pdata->xcvr_ops->set_host) ++ pdata->xcvr_ops->set_host(); ++ ++ /* set host mode and select "big endian" */ ++ temp = fsl_readl(®s->usbmode); ++ fsl_writel(temp | USBMODE_CM_HOST | USBMODE_ES, ®s->usbmode); ++ ++ pr_debug("%s: set usbmode to 0x%x\n\n", __FUNCTION__, ++ fsl_readl(®s->usbmode)); ++ ++} diff --git a/target/linux/coldfire/patches/005-mcfv4e_kernel_mods.patch b/target/linux/coldfire/patches/005-mcfv4e_kernel_mods.patch new file mode 100644 index 0000000000..05ffbd6480 --- /dev/null +++ b/target/linux/coldfire/patches/005-mcfv4e_kernel_mods.patch @@ -0,0 +1,571 @@ +From 823ad3e6e88353226ec28f48183a467181887a1b Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Wed, 31 Oct 2007 16:56:09 -0600 +Subject: [PATCH] Core Coldfire/MCF54455 kernel changes. + +LTIBName: mcfv4e-kernel-mods +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + arch/m68k/Kconfig | 65 ++++++++++++++++++++++++++++++++++++++- + arch/m68k/Kconfig.debug | 9 +++++ + arch/m68k/Makefile | 14 ++++++++ + arch/m68k/kernel/Makefile | 15 ++++++--- + arch/m68k/kernel/asm-offsets.c | 7 ++++ + arch/m68k/kernel/dma.c | 17 ++++++++++ + arch/m68k/kernel/process.c | 57 +++++++++++++++++++++++++++++++++++ + arch/m68k/kernel/setup.c | 49 ++++++++++++++++++++++++++---- + arch/m68k/kernel/time.c | 5 +++ + arch/m68k/kernel/vmlinux.lds.S | 2 + + 10 files changed, 227 insertions(+), 13 deletions(-) + +--- a/arch/m68k/Kconfig ++++ b/arch/m68k/Kconfig +@@ -119,6 +119,20 @@ config SUN3 + + If you don't want to compile a kernel exclusively for a Sun 3, say N. + ++config COLDFIRE ++ bool "ColdFire V4e support" ++ default y ++ select CFV4E ++ help ++ Say Y if you want to build a kernel to run on one of the ColdFire ++ V4e boards. ++ ++config CFV4E ++ bool ++ depends on COLDFIRE ++ select MMU_CFV4E if MMU ++ default y ++ + config AMIGA + bool "Amiga support" + depends on !MMU_SUN3 +@@ -294,14 +308,53 @@ config M68060 + If you anticipate running this kernel on a computer with a MC68060 + processor, say Y. Otherwise, say N. + ++config M54455 ++ bool "MCF54455 support" ++ depends on COLDFIRE ++ default y ++ help ++ This option will add support for the MCF54455 processor with mmu. ++ ++config MCFCLK ++ int "M54455EVB System Clock" ++ depends on M54455 ++ default 266666666 ++ help ++ System clock for EVB. Usually 266MHz for u-boot and 200MHz for dBUG. ++ ++config MCF_USER_HALT ++ bool "Coldfire User Halt Enable" ++ depends on M54455 ++ default n ++ help ++ Enables the HALT instruction in User Mode. ++ + config MMU_MOTOROLA + bool +- depends on MMU && !MMU_SUN3 ++ depends on MMU && !MMU_SUN3 && !COLDFIRE + default y + + config MMU_SUN3 + bool + ++config MMU_CFV4E ++ bool ++ ++config SDRAM_BASE ++ hex ++ depends on M54455 ++ default 0x40000000 ++ ++config SDRAM_SIZE ++ hex ++ depends on M54455 ++ default 0x0FFFFFFF ++ ++config NOR_FLASH_BASE ++ hex "NOR Flash Base Address" ++ depends on M54455 ++ default 0x00000000 ++ + config M68KFPU_EMU + bool "Math emulation support (EXPERIMENTAL)" + depends on EXPERIMENTAL +@@ -468,6 +521,14 @@ config ZONE_DMA + source "drivers/pci/Kconfig" + + source "drivers/zorro/Kconfig" ++endmenu ++ ++menu "Power management options" ++ ++config PM ++ bool "Power Management support" ++ help ++ Support processor power management modes + + endmenu + +@@ -647,7 +708,7 @@ config DN_SERIAL + + config SERIAL_CONSOLE + bool "Support for serial port console" +- depends on (AMIGA || ATARI || MAC || SUN3 || SUN3X || VME || APOLLO) && (ATARI_MFPSER=y || ATARI_SCC=y || ATARI_MIDI=y || MAC_SCC=y || AMIGA_BUILTIN_SERIAL=y || GVPIOEXT=y || MULTIFACE_III_TTY=y || SERIAL=y || MVME147_SCC || SERIAL167 || MVME162_SCC || BVME6000_SCC || DN_SERIAL) ++ depends on (AMIGA || ATARI || MAC || SUN3 || SUN3X || VME || APOLLO || COLDFIRE) && (ATARI_MFPSER=y || ATARI_SCC=y || ATARI_MIDI=y || MAC_SCC=y || AMIGA_BUILTIN_SERIAL=y || GVPIOEXT=y || MULTIFACE_III_TTY=y || SERIAL=y || MVME147_SCC || SERIAL167 || MVME162_SCC || BVME6000_SCC || DN_SERIAL || SERIAL_COLDFIRE) + ---help--- + If you say Y here, it will be possible to use a serial port as the + system console (the system console is the device which receives all +--- a/arch/m68k/Kconfig.debug ++++ b/arch/m68k/Kconfig.debug +@@ -2,4 +2,13 @@ menu "Kernel hacking" + + source "lib/Kconfig.debug" + ++config BOOTPARAM ++ bool 'Compiled-in Kernel Boot Parameter' ++ depends on COLDFIRE ++ ++config BOOTPARAM_STRING ++ string 'Kernel Boot Parameter' ++ default 'console=ttyS0,115200' ++ depends on BOOTPARAM ++ + endmenu +--- a/arch/m68k/Makefile ++++ b/arch/m68k/Makefile +@@ -16,7 +16,9 @@ + KBUILD_DEFCONFIG := amiga_defconfig + + # override top level makefile ++ifndef CONFIG_COLDFIRE + AS += -m68020 ++endif + LDFLAGS := -m m68kelf + LDFLAGS_MODULE += -T $(srctree)/arch/m68k/kernel/module.lds + ifneq ($(SUBARCH),$(ARCH)) +@@ -36,6 +38,7 @@ CHECKFLAGS += -D__mc68000__ + KBUILD_CFLAGS += -pipe -fno-strength-reduce -ffixed-a2 + + # enable processor switch if compiled only for a single cpu ++ifndef CONFIG_COLDFIRE + ifndef CONFIG_M68020 + ifndef CONFIG_M68030 + +@@ -49,6 +52,12 @@ endif + + endif + endif ++endif ++ ++ifdef CONFIG_M54455 ++CFLAGS := $(CFLAGS) -march=isac -mcpu=54455 -msoft-float -g ++AFLAGS := $(AFLAGS) -march=isac -mcpu=54455 -msoft-float ++endif + + ifdef CONFIG_KGDB + # If configured for kgdb support, include debugging infos and keep the +@@ -57,8 +66,12 @@ KBUILD_CFLAGS := $(subst -fomit-frame-po + endif + + ifndef CONFIG_SUN3 ++ifndef CONFIG_COLDFIRE + head-y := arch/m68k/kernel/head.o + else ++head-y := arch/m68k/coldfire/head.o ++endif ++else + head-y := arch/m68k/kernel/sun3-head.o + endif + +@@ -79,6 +92,7 @@ core-$(CONFIG_SUN3) += arch/m68k/sun3/ + core-$(CONFIG_M68040) += arch/m68k/fpsp040/ + core-$(CONFIG_M68060) += arch/m68k/ifpsp060/ + core-$(CONFIG_M68KFPU_EMU) += arch/m68k/math-emu/ ++core-$(CONFIG_COLDFIRE) += arch/m68k/coldfire/ + + all: zImage + +--- a/arch/m68k/kernel/Makefile ++++ b/arch/m68k/kernel/Makefile +@@ -2,14 +2,19 @@ + # Makefile for the linux kernel. + # + +-ifndef CONFIG_SUN3 +- extra-y := head.o ++ifdef CONFIG_SUN3 ++ extra-y := sun3-head.o vmlinux.lds ++ obj-y := entry.o signal.o ints.o + else +- extra-y := sun3-head.o ++ifndef CONFIG_COLDFIRE ++ extra-y := head.o vmlinux.lds ++ obj-y := entry.o signal.o traps.o ints.o ++else # CONFIG_COLDFIRE ++ extra-y := ../coldfire/head.o vmlinux.lds ++endif + endif +-extra-y += vmlinux.lds + +-obj-y := entry.o process.o traps.o ints.o signal.o ptrace.o module.o \ ++obj-y += process.o ptrace.o module.o \ + sys_m68k.o time.o semaphore.o setup.o m68k_ksyms.o devres.o + + devres-y = ../../../kernel/irq/devres.o +--- a/arch/m68k/kernel/asm-offsets.c ++++ b/arch/m68k/kernel/asm-offsets.c +@@ -58,8 +58,15 @@ int main(void) + DEFINE(PT_A2, offsetof(struct pt_regs, a2)); + DEFINE(PT_PC, offsetof(struct pt_regs, pc)); + DEFINE(PT_SR, offsetof(struct pt_regs, sr)); ++#ifdef CONFIG_COLDFIRE ++ /* Need to get the context out of struct mm for ASID setting */ ++ DEFINE(MM_CONTEXT, offsetof(struct mm_struct, context)); ++ /* Coldfire exception frame has vector *before* pc */ ++ DEFINE(PT_VECTOR, offsetof(struct pt_regs, pc) - 4); ++#else + /* bitfields are a bit difficult */ + DEFINE(PT_VECTOR, offsetof(struct pt_regs, pc) + 4); ++#endif + + /* offsets into the irq_handler struct */ + DEFINE(IRQ_HANDLER, offsetof(struct irq_node, handler)); +--- a/arch/m68k/kernel/dma.c ++++ b/arch/m68k/kernel/dma.c +@@ -17,6 +17,7 @@ + void *dma_alloc_coherent(struct device *dev, size_t size, + dma_addr_t *handle, gfp_t flag) + { ++#ifndef CONFIG_M54455 + struct page *page, **map; + pgprot_t pgprot; + void *addr; +@@ -55,6 +56,18 @@ void *dma_alloc_coherent(struct device * + kfree(map); + + return addr; ++#else ++ /* ++ * On the M5445x platform the memory allocated with GFP_DMA ++ * is guaranteed to be DMA'able. ++ */ ++ void *addr; ++ ++ size = PAGE_ALIGN(size); ++ addr = kmalloc(size, GFP_DMA); ++ *handle = virt_to_phys(addr); ++ return addr; ++#endif + } + EXPORT_SYMBOL(dma_alloc_coherent); + +@@ -62,7 +75,11 @@ void dma_free_coherent(struct device *de + void *addr, dma_addr_t handle) + { + pr_debug("dma_free_coherent: %p, %x\n", addr, handle); ++#ifndef CONFIG_M54455 + vfree(addr); ++#else ++ kfree(addr); ++#endif + } + EXPORT_SYMBOL(dma_free_coherent); + +--- a/arch/m68k/kernel/process.c ++++ b/arch/m68k/kernel/process.c +@@ -191,6 +191,7 @@ EXPORT_SYMBOL(kernel_thread); + + void flush_thread(void) + { ++#if !defined(CONFIG_COLDFIRE) + unsigned long zero = 0; + set_fs(USER_DS); + current->thread.fs = __USER_DS; +@@ -198,6 +199,14 @@ void flush_thread(void) + asm volatile (".chip 68k/68881\n\t" + "frestore %0@\n\t" + ".chip 68k" : : "a" (&zero)); ++#else ++ set_fs(USER_DS); ++ current->thread.fs = USER_DS; ++#if defined(CONFIG_FPU) ++ if (!FPU_IS_EMU) ++ asm volatile ("frestore %0@\n\t" : : "a" (&zero)); ++#endif ++#endif + } + + /* +@@ -261,6 +270,7 @@ int copy_thread(int nr, unsigned long cl + * Must save the current SFC/DFC value, NOT the value when + * the parent was last descheduled - RGH 10-08-96 + */ ++#if !defined(CONFIG_COLDFIRE) + p->thread.fs = get_fs().seg; + + if (!FPU_IS_EMU) { +@@ -272,9 +282,34 @@ int copy_thread(int nr, unsigned long cl + "fmoveml %/fpiar/%/fpcr/%/fpsr,%1" + : : "m" (p->thread.fp[0]), "m" (p->thread.fpcntl[0]) + : "memory"); ++#else ++ p->thread.fs = get_fs(); ++ ++#if defined(CONFIG_FPU) ++ if (!FPU_IS_EMU) { ++ /* Copy the current fpu state */ ++ asm volatile ("fsave %0" : : "m" (p->thread.fpstate[0]) ++ : "memory"); ++ ++ if (p->thread.fpstate[0]) { ++ asm volatile ("fmovemd %/fp0-%/fp7,%0" ++ : : "m" (p->thread.fp[0]) ++ : "memory"); ++ asm volatile ("fmovel %/fpiar,%0" ++ : : "m" (p->thread.fpcntl[0]) ++ : "memory"); ++ asm volatile ("fmovel %/fpcr,%0" ++ : : "m" (p->thread.fpcntl[1]) ++ : "memory"); ++ asm volatile ("fmovel %/fpsr,%0" ++ : : "m" (p->thread.fpcntl[2]) ++ : "memory"); ++ } + /* Restore the state in case the fpu was busy */ + asm volatile ("frestore %0" : : "m" (p->thread.fpstate[0])); + } ++#endif ++#endif + + return 0; + } +@@ -283,7 +318,9 @@ int copy_thread(int nr, unsigned long cl + + int dump_fpu (struct pt_regs *regs, struct user_m68kfp_struct *fpu) + { ++#if !defined(CONFIG_COLDFIRE) || defined(CONFIG_FPU) + char fpustate[216]; ++#endif + + if (FPU_IS_EMU) { + int i; +@@ -300,6 +337,7 @@ int dump_fpu (struct pt_regs *regs, stru + } + + /* First dump the fpu context to avoid protocol violation. */ ++#if !defined(CONFIG_COLDFIRE) + asm volatile ("fsave %0" :: "m" (fpustate[0]) : "memory"); + if (!CPU_IS_060 ? !fpustate[0] : !fpustate[2]) + return 0; +@@ -310,6 +348,25 @@ int dump_fpu (struct pt_regs *regs, stru + asm volatile ("fmovemx %/fp0-%/fp7,%0" + :: "m" (fpu->fpregs[0]) + : "memory"); ++#elif defined(CONFIG_FPU) ++ asm volatile ("fsave %0" :: "m" (fpustate[0]) : "memory"); ++ if (!CPU_IS_060 ? !fpustate[0] : !fpustate[2]) ++ return 0; ++ ++ asm volatile ("fmovel %/fpiar,%0" ++ : : "m" (fpu->fpcntl[0]) ++ : "memory"); ++ asm volatile ("fmovel %/fpcr,%0" ++ : : "m" (fpu->fpcntl[1]) ++ : "memory"); ++ asm volatile ("fmovel %/fpsr,%0" ++ : : "m" (fpu->fpcntl[2]) ++ : "memory"); ++ asm volatile ("fmovemd %/fp0-%/fp7,%0" ++ : : "m" (fpu->fpregs[0]) ++ : "memory"); ++#endif ++ + return 1; + } + EXPORT_SYMBOL(dump_fpu); +--- a/arch/m68k/kernel/setup.c ++++ b/arch/m68k/kernel/setup.c +@@ -67,13 +67,22 @@ EXPORT_SYMBOL(m68k_memory); + + struct mem_info m68k_ramdisk; + ++#if !defined(CONFIG_COLDFIRE) + static char m68k_command_line[CL_SIZE]; ++#else ++char m68k_command_line[CL_SIZE]; ++unsigned long uboot_info_stk; ++EXPORT_SYMBOL(uboot_info_stk); ++#endif + + void (*mach_sched_init) (irq_handler_t handler) __initdata = NULL; + /* machine dependent irq functions */ + void (*mach_init_IRQ) (void) __initdata = NULL; + void (*mach_get_model) (char *model); + int (*mach_get_hardware_list) (char *buffer); ++#ifdef CONFIG_COLDFIRE ++void (*mach_tick)(void); ++#endif + /* machine dependent timer functions */ + unsigned long (*mach_gettimeoffset) (void); + int (*mach_hwclk) (int, struct rtc_time*); +@@ -128,13 +137,17 @@ extern void config_hp300(void); + extern void config_q40(void); + extern void config_sun3x(void); + ++#ifdef CONFIG_COLDFIRE ++void coldfire_sort_memrec(void); ++#endif ++ + #define MASK_256K 0xfffc0000 + + extern void paging_init(void); + + static void __init m68k_parse_bootinfo(const struct bi_record *record) + { +- while (record->tag != BI_LAST) { ++ while ((record->tag != BI_LAST) && !(CONFIG_COLDFIRE)) { + int unknown = 0; + const unsigned long *data = record->data; + +@@ -192,7 +205,11 @@ static void __init m68k_parse_bootinfo(c + record->size); + } + +- m68k_realnum_memory = m68k_num_memory; ++#ifdef CONFIG_COLDFIRE ++ coldfire_sort_memrec(); ++#endif ++ ++ m68k_realnum_memory = m68k_num_memory; + #ifdef CONFIG_SINGLE_MEMORY_CHUNK + if (m68k_num_memory > 1) { + printk("Ignoring last %i chunks of physical memory\n", +@@ -205,7 +222,9 @@ static void __init m68k_parse_bootinfo(c + void __init setup_arch(char **cmdline_p) + { + extern int _etext, _edata, _end; ++#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE) + int i; ++#endif + + /* The bootinfo is located right after the kernel bss */ + m68k_parse_bootinfo((const struct bi_record *)&_end); +@@ -220,9 +239,10 @@ void __init setup_arch(char **cmdline_p) + * We should really do our own FPU check at startup. + * [what do we do with buggy 68LC040s? if we have problems + * with them, we should add a test to check_bugs() below] */ +-#ifndef CONFIG_M68KFPU_EMU_ONLY ++#if !defined(CONFIG_M68KFPU_EMU_ONLY) && defined(CONFIG_FPU) + /* clear the fpu if we have one */ +- if (m68k_fputype & (FPU_68881|FPU_68882|FPU_68040|FPU_68060)) { ++ if (m68k_fputype & (FPU_68881|FPU_68882|FPU_68040|FPU_68060| ++ FPU_CFV4E)) { + volatile int zero = 0; + asm volatile ("frestore %0" : : "m" (zero)); + } +@@ -310,13 +330,18 @@ void __init setup_arch(char **cmdline_p) + config_sun3x(); + break; + #endif ++#ifdef CONFIG_COLDFIRE ++ case MACH_CFMMU: ++ config_coldfire(); ++ break; ++#endif + default: + panic("No configuration setup"); + } + + paging_init(); + +-#ifndef CONFIG_SUN3 ++#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE) + for (i = 1; i < m68k_num_memory; i++) + free_bootmem_node(NODE_DATA(i), m68k_memory[i].addr, + m68k_memory[i].size); +@@ -343,6 +368,10 @@ void __init setup_arch(char **cmdline_p) + + #endif /* !CONFIG_SUN3 */ + ++#ifdef CONFIG_COLDFIRE ++ mmu_context_init(); ++#endif ++ + /* set ISA defs early as possible */ + #if defined(CONFIG_ISA) && defined(MULTI_ISA) + #if defined(CONFIG_Q40) +@@ -373,6 +402,7 @@ static int show_cpuinfo(struct seq_file + #define LOOP_CYCLES_68030 (8) + #define LOOP_CYCLES_68040 (3) + #define LOOP_CYCLES_68060 (1) ++#define LOOP_CYCLES_COLDFIRE (2) + + if (CPU_IS_020) { + cpu = "68020"; +@@ -386,6 +416,9 @@ static int show_cpuinfo(struct seq_file + } else if (CPU_IS_060) { + cpu = "68060"; + clockfactor = LOOP_CYCLES_68060; ++ } else if (CPU_IS_CFV4E) { ++ cpu = "ColdFire V4e"; ++ clockfactor = LOOP_CYCLES_COLDFIRE; + } else { + cpu = "680x0"; + clockfactor = 0; +@@ -404,6 +437,8 @@ static int show_cpuinfo(struct seq_file + fpu = "68060"; + else if (m68k_fputype & FPU_SUNFPA) + fpu = "Sun FPA"; ++ else if (m68k_fputype & FPU_CFV4E) ++ fpu = "ColdFire V4e"; + else + fpu = "none"; + #endif +@@ -420,6 +455,8 @@ static int show_cpuinfo(struct seq_file + mmu = "Sun-3"; + else if (m68k_mmutype & MMU_APOLLO) + mmu = "Apollo"; ++ else if (m68k_mmutype & MMU_CFV4E) ++ mmu = "ColdFire"; + else + mmu = "unknown"; + +@@ -482,7 +519,7 @@ int get_hardware_list(char *buffer) + + void check_bugs(void) + { +-#ifndef CONFIG_M68KFPU_EMU ++#if !defined(CONFIG_M68KFPU_EMU) && !defined(CONFIG_M54455) + if (m68k_fputype == 0) { + printk(KERN_EMERG "*** YOU DO NOT HAVE A FLOATING POINT UNIT, " + "WHICH IS REQUIRED BY LINUX/M68K ***\n"); +--- a/arch/m68k/kernel/time.c ++++ b/arch/m68k/kernel/time.c +@@ -40,6 +40,11 @@ static inline int set_rtc_mmss(unsigned + */ + static irqreturn_t timer_interrupt(int irq, void *dummy) + { ++#ifdef CONFIG_COLDFIRE ++ /* kick hardware timer if necessary */ ++ if (mach_tick) ++ mach_tick(); ++#endif + do_timer(1); + #ifndef CONFIG_SMP + update_process_times(user_mode(get_irq_regs())); +--- a/arch/m68k/kernel/vmlinux.lds.S ++++ b/arch/m68k/kernel/vmlinux.lds.S +@@ -5,6 +5,8 @@ PHDRS + } + #ifdef CONFIG_SUN3 + #include "vmlinux-sun3.lds" ++#elif CONFIG_COLDFIRE ++#include "../coldfire/vmlinux-cf.lds" + #else + #include "vmlinux-std.lds" + #endif diff --git a/target/linux/coldfire/patches/006-mcfv4e_arch_lib_mods.patch b/target/linux/coldfire/patches/006-mcfv4e_arch_lib_mods.patch new file mode 100644 index 0000000000..f699e5fb45 --- /dev/null +++ b/target/linux/coldfire/patches/006-mcfv4e_arch_lib_mods.patch @@ -0,0 +1,564 @@ +From a9faf34ba120d9d39ff0c7656ee3de12a110e22a Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Wed, 31 Oct 2007 16:57:05 -0600 +Subject: [PATCH] Core Coldfire/MCF5445x arch lib changes. + +LTIBName: mcfv4e-arch-lib-mods +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + arch/m68k/lib/checksum.c | 124 +++++++++++++++++++++++ + arch/m68k/lib/muldi3.c | 10 ++ + arch/m68k/lib/semaphore.S | 25 +++++ + arch/m68k/lib/string.c | 64 ++++++++++++ + arch/m68k/lib/uaccess.c | 242 +++++++++++++++++++++++++++++++++++++++++++++ + 5 files changed, 465 insertions(+), 0 deletions(-) + +--- a/arch/m68k/lib/checksum.c ++++ b/arch/m68k/lib/checksum.c +@@ -39,8 +39,131 @@ + * computes a partial checksum, e.g. for TCP/UDP fragments + */ + ++#ifdef CONFIG_COLDFIRE ++ ++static inline unsigned short from32to16(unsigned long x) ++{ ++ /* add up 16-bit and 16-bit for 16+c bit */ ++ x = (x & 0xffff) + (x >> 16); ++ /* add up carry.. */ ++ x = (x & 0xffff) + (x >> 16); ++ return x; ++} ++ ++static unsigned long do_csum(const unsigned char *buff, int len) ++{ ++ int odd, count; ++ unsigned long result = 0; ++ ++ if (len <= 0) ++ goto out; ++ odd = 1 & (unsigned long) buff; ++ if (odd) { ++ result = *buff; ++ len--; ++ buff++; ++ } ++ count = len >> 1; /* nr of 16-bit words.. */ ++ if (count) { ++ if (2 & (unsigned long) buff) { ++ result += *(unsigned short *) buff; ++ count--; ++ len -= 2; ++ buff += 2; ++ } ++ count >>= 1; /* nr of 32-bit words.. */ ++ if (count) { ++ unsigned long carry = 0; ++ do { ++ unsigned long w = *(unsigned long *) buff; ++ count--; ++ buff += 4; ++ result += carry; ++ result += w; ++ carry = (w > result); ++ } while (count); ++ result += carry; ++ result = (result & 0xffff) + (result >> 16); ++ } ++ if (len & 2) { ++ result += *(unsigned short *) buff; ++ buff += 2; ++ } ++ } ++ if (len & 1) ++ result += (*buff << 8); ++ result = from32to16(result); ++ if (odd) ++ result = ((result >> 8) & 0xff) | ((result & 0xff) << 8); ++out: ++ return result; ++} ++ ++/* ++ * This is a version of ip_compute_csum() optimized for IP headers, ++ * which always checksum on 4 octet boundaries. ++ */ ++__sum16 ip_fast_csum(const void *iph, unsigned int ihl) ++{ ++ return ~do_csum(iph, ihl*4); ++} ++EXPORT_SYMBOL(ip_fast_csum); ++ ++/* ++ * computes the checksum of a memory block at buff, length len, ++ * and adds in "sum" (32-bit) ++ * ++ * returns a 32-bit number suitable for feeding into itself ++ * or csum_tcpudp_magic ++ * ++ * this function must be called with even lengths, except ++ * for the last fragment, which may be odd ++ * ++ * it's best to have buff aligned on a 32-bit boundary ++ */ + __wsum csum_partial(const void *buff, int len, __wsum sum) + { ++ unsigned int result = do_csum(buff, len); ++ ++ /* add in old sum, and carry.. */ ++ result += sum; ++ if (sum > result) ++ result += 1; ++ return result; ++} ++EXPORT_SYMBOL(csum_partial); ++ ++/* ++ * copy from fs while checksumming, otherwise like csum_partial ++ */ ++ ++__wsum ++csum_partial_copy_from_user(const void __user *src, void *dst, int len, ++ __wsum sum, int *csum_err) ++{ ++ if (csum_err) *csum_err = 0; ++ memcpy(dst, src, len); ++ return csum_partial(dst, len, sum); ++} ++EXPORT_SYMBOL(csum_partial_copy_from_user); ++ ++/* ++ * copy from ds while checksumming, otherwise like csum_partial ++ */ ++ ++__wsum ++csum_partial_copy_nocheck(const void *src, void *dst, int len, __wsum sum) ++{ ++ memcpy(dst, src, len); ++ return csum_partial(dst, len, sum); ++} ++EXPORT_SYMBOL(csum_partial_copy_nocheck); ++ ++#else /* !CONFIG_COLDFIRE */ ++ ++unsigned int ++csum_partial(const unsigned char *buff, int len, unsigned int sum) ++{ + unsigned long tmp1, tmp2; + /* + * Experiments with ethernet and slip connections show that buff +@@ -423,3 +546,4 @@ csum_partial_copy_nocheck(const void *sr + return(sum); + } + EXPORT_SYMBOL(csum_partial_copy_nocheck); ++#endif /* CONFIG_COLDFIRE */ +--- a/arch/m68k/lib/muldi3.c ++++ b/arch/m68k/lib/muldi3.c +@@ -21,12 +21,22 @@ Boston, MA 02111-1307, USA. */ + + #define BITS_PER_UNIT 8 + ++#ifdef CONFIG_COLDFIRE ++#define umul_ppmm(w1, w0, u, v) \ ++ do { \ ++ unsigned long long x; \ ++ x = (unsigned long long)u * v; \ ++ w0 = (unsigned long)(x & 0x00000000ffffffff); \ ++ w1 = (unsigned long)(x & 0xffffffff00000000) >> 32; \ ++ } while (0) ++#else /* CONFIG_COLDFIRE */ + #define umul_ppmm(w1, w0, u, v) \ + __asm__ ("mulu%.l %3,%1:%0" \ + : "=d" ((USItype)(w0)), \ + "=d" ((USItype)(w1)) \ + : "%0" ((USItype)(u)), \ + "dmi" ((USItype)(v))) ++#endif /* CONFIG_COLDFIRE */ + + #define __umulsidi3(u, v) \ + ({DIunion __w; \ +--- a/arch/m68k/lib/semaphore.S ++++ b/arch/m68k/lib/semaphore.S +@@ -16,11 +16,24 @@ + * there is contention on the semaphore. + */ + ENTRY(__down_failed) ++#ifndef CONFIG_COLDFIRE + moveml %a0/%d0/%d1,-(%sp) ++#else ++ movel %a0,-(%sp) ++ movel %d0,-(%sp) ++ movel %d1,-(%sp) ++#endif + movel %a1,-(%sp) + jbsr __down + movel (%sp)+,%a1 ++#ifndef CONFIG_COLDFIRE + moveml (%sp)+,%a0/%d0/%d1 ++#else ++ movel (%sp)+,%d1 ++ movel (%sp)+,%d0 ++ movel (%sp)+,%a0 ++#endif ++ + rts + + ENTRY(__down_failed_interruptible) +@@ -44,10 +57,22 @@ ENTRY(__down_failed_trylock) + rts + + ENTRY(__up_wakeup) ++#ifndef CONFIG_COLDFIRE + moveml %a0/%d0/%d1,-(%sp) ++#else ++ movel %a0,-(%sp) ++ movel %d0,-(%sp) ++ movel %d1,-(%sp) ++#endif + movel %a1,-(%sp) + jbsr __up + movel (%sp)+,%a1 ++#ifndef CONFIG_COLDFIRE + moveml (%sp)+,%a0/%d0/%d1 ++#else ++ movel (%sp)+,%d1 ++ movel (%sp)+,%d0 ++ movel (%sp)+,%a0 ++#endif + rts + +--- a/arch/m68k/lib/string.c ++++ b/arch/m68k/lib/string.c +@@ -15,6 +15,7 @@ char *strcpy(char *dest, const char *src + } + EXPORT_SYMBOL(strcpy); + ++#ifndef CONFIG_COLDFIRE + void *memset(void *s, int c, size_t count) + { + void *xs = s; +@@ -143,6 +144,69 @@ void *memcpy(void *to, const void *from, + } + EXPORT_SYMBOL(memcpy); + ++#else /* CONFIG_COLDFIRE */ ++ ++void *memset(void *s, int c, size_t count) ++{ ++ unsigned long x; ++ void *originalTo; ++ ++ for (x = 0; x < count; x++) ++ *(unsigned char *)s++ = (unsigned char)c; ++ ++ return originalTo; ++} ++EXPORT_SYMBOL(memset); ++ ++void *memcpy(void *to, const void *from, size_t n) ++{ ++ void *xto = to; ++ size_t temp; ++ ++ if (!n) ++ return xto; ++ if ((long) to & 1) { ++ char *cto = to; ++ const char *cfrom = from; ++ *cto++ = *cfrom++; ++ to = cto; ++ from = cfrom; ++ n--; ++ } ++ if (n > 2 && (long) to & 2) { ++ short *sto = to; ++ const short *sfrom = from; ++ *sto++ = *sfrom++; ++ to = sto; ++ from = sfrom; ++ n -= 2; ++ } ++ temp = n >> 2; ++ if (temp) { ++ long *lto = to; ++ const long *lfrom = from; ++ for (; temp; temp--) ++ *lto++ = *lfrom++; ++ to = lto; ++ from = lfrom; ++ } ++ if (n & 2) { ++ short *sto = to; ++ const short *sfrom = from; ++ *sto++ = *sfrom++; ++ to = sto; ++ from = sfrom; ++ } ++ if (n & 1) { ++ char *cto = to; ++ const char *cfrom = from; ++ *cto = *cfrom; ++ } ++ return xto; ++} ++EXPORT_SYMBOL(memcpy); ++#endif /* CONFIG_COLDFIRE */ ++ + void *memmove(void *dest, const void *src, size_t n) + { + void *xdest = dest; +--- a/arch/m68k/lib/uaccess.c ++++ b/arch/m68k/lib/uaccess.c +@@ -5,6 +5,7 @@ + */ + + #include <linux/module.h> ++#ifndef CONFIG_COLDFIRE + #include <asm/uaccess.h> + + unsigned long __generic_copy_from_user(void *to, const void __user *from, +@@ -220,3 +221,244 @@ unsigned long __clear_user(void __user * + return res; + } + EXPORT_SYMBOL(__clear_user); ++ ++#else /* CONFIG_COLDFIRE */ ++ ++#include <asm/cf_uaccess.h> ++ ++unsigned long __generic_copy_from_user(void *to, const void *from, ++ unsigned long n) ++{ ++ unsigned long tmp; ++ __asm__ __volatile__ ++ (" tstl %2\n" ++ " jeq 2f\n" ++ "1: movel (%1)+,%3\n" ++ " movel %3,(%0)+\n" ++ " subql #1,%2\n" ++ " jne 1b\n" ++ "2: movel %4,%2\n" ++ " bclr #1,%2\n" ++ " jeq 4f\n" ++ "3: movew (%1)+,%3\n" ++ " movew %3,(%0)+\n" ++ "4: bclr #0,%2\n" ++ " jeq 6f\n" ++ "5: moveb (%1)+,%3\n" ++ " moveb %3,(%0)+\n" ++ "6:\n" ++ ".section .fixup,\"ax\"\n" ++ " .even\n" ++ "7: movel %2,%%d0\n" ++ "71:clrl (%0)+\n" ++ " subql #1,%%d0\n" ++ " jne 71b\n" ++ " lsll #2,%2\n" ++ " addl %4,%2\n" ++ " btst #1,%4\n" ++ " jne 81f\n" ++ " btst #0,%4\n" ++ " jne 91f\n" ++ " jra 6b\n" ++ "8: addql #2,%2\n" ++ "81:clrw (%0)+\n" ++ " btst #0,%4\n" ++ " jne 91f\n" ++ " jra 6b\n" ++ "9: addql #1,%2\n" ++ "91:clrb (%0)+\n" ++ " jra 6b\n" ++ ".previous\n" ++ ".section __ex_table,\"a\"\n" ++ " .align 4\n" ++ " .long 1b,7b\n" ++ " .long 3b,8b\n" ++ " .long 5b,9b\n" ++ ".previous" ++ : "=a"(to), "=a"(from), "=d"(n), "=&d"(tmp) ++ : "d"(n & 3), "0"(to), "1"(from), "2"(n/4) ++ : "d0", "memory"); ++ return n; ++} ++EXPORT_SYMBOL(__generic_copy_from_user); ++ ++ ++unsigned long __generic_copy_to_user(void *to, const void *from, ++ unsigned long n) ++{ ++ unsigned long tmp; ++ __asm__ __volatile__ ++ (" tstl %2\n" ++ " jeq 3f\n" ++ "1: movel (%1)+,%3\n" ++ "22:movel %3,(%0)+\n" ++ "2: subql #1,%2\n" ++ " jne 1b\n" ++ "3: movel %4,%2\n" ++ " bclr #1,%2\n" ++ " jeq 4f\n" ++ " movew (%1)+,%3\n" ++ "24:movew %3,(%0)+\n" ++ "4: bclr #0,%2\n" ++ " jeq 5f\n" ++ " moveb (%1)+,%3\n" ++ "25:moveb %3,(%0)+\n" ++ "5:\n" ++ ".section .fixup,\"ax\"\n" ++ " .even\n" ++ "60:addql #1,%2\n" ++ "6: lsll #2,%2\n" ++ " addl %4,%2\n" ++ " jra 5b\n" ++ "7: addql #2,%2\n" ++ " jra 5b\n" ++ "8: addql #1,%2\n" ++ " jra 5b\n" ++ ".previous\n" ++ ".section __ex_table,\"a\"\n" ++ " .align 4\n" ++ " .long 1b,60b\n" ++ " .long 22b,6b\n" ++ " .long 2b,6b\n" ++ " .long 24b,7b\n" ++ " .long 3b,60b\n" ++ " .long 4b,7b\n" ++ " .long 25b,8b\n" ++ " .long 5b,8b\n" ++ ".previous" ++ : "=a"(to), "=a"(from), "=d"(n), "=&d"(tmp) ++ : "r"(n & 3), "0"(to), "1"(from), "2"(n / 4) ++ : "memory"); ++ return n; ++} ++EXPORT_SYMBOL(__generic_copy_to_user); ++ ++/* ++ * Copy a null terminated string from userspace. ++ */ ++ ++long strncpy_from_user(char *dst, const char *src, long count) ++{ ++ long res = -EFAULT; ++ if (!(access_ok(VERIFY_READ, src, 1))) /* --tym-- */ ++ return res; ++ if (count == 0) return count; ++ __asm__ __volatile__ ++ ("1: moveb (%2)+,%%d0\n" ++ "12:moveb %%d0,(%1)+\n" ++ " jeq 2f\n" ++ " subql #1,%3\n" ++ " jne 1b\n" ++ "2: subl %3,%0\n" ++ "3:\n" ++ ".section .fixup,\"ax\"\n" ++ " .even\n" ++ "4: movel %4,%0\n" ++ " jra 3b\n" ++ ".previous\n" ++ ".section __ex_table,\"a\"\n" ++ " .align 4\n" ++ " .long 1b,4b\n" ++ " .long 12b,4b\n" ++ ".previous" ++ : "=d"(res), "=a"(dst), "=a"(src), "=d"(count) ++ : "i"(-EFAULT), "0"(count), "1"(dst), "2"(src), "3"(count) ++ : "d0", "memory"); ++ return res; ++} ++EXPORT_SYMBOL(strncpy_from_user); ++ ++/* ++ * Return the size of a string (including the ending 0) ++ * ++ * Return 0 on exception, a value greater than N if too long ++ */ ++long strnlen_user(const char *src, long n) ++{ ++ long res = -EFAULT; ++ if (!(access_ok(VERIFY_READ, src, 1))) /* --tym-- */ ++ return res; ++ ++ res = -(long)src; ++ __asm__ __volatile__ ++ ("1:\n" ++ " tstl %2\n" ++ " jeq 3f\n" ++ "2: moveb (%1)+,%%d0\n" ++ "22:\n" ++ " subql #1,%2\n" ++ " tstb %%d0\n" ++ " jne 1b\n" ++ " jra 4f\n" ++ "3:\n" ++ " addql #1,%0\n" ++ "4:\n" ++ " addl %1,%0\n" ++ "5:\n" ++ ".section .fixup,\"ax\"\n" ++ " .even\n" ++ "6: moveq %3,%0\n" ++ " jra 5b\n" ++ ".previous\n" ++ ".section __ex_table,\"a\"\n" ++ " .align 4\n" ++ " .long 2b,6b\n" ++ " .long 22b,6b\n" ++ ".previous" ++ : "=d"(res), "=a"(src), "=d"(n) ++ : "i"(0), "0"(res), "1"(src), "2"(n) ++ : "d0"); ++ return res; ++} ++EXPORT_SYMBOL(strnlen_user); ++ ++ ++/* ++ * Zero Userspace ++ */ ++ ++unsigned long __clear_user(void *to, unsigned long n) ++{ ++ __asm__ __volatile__ ++ (" tstl %1\n" ++ " jeq 3f\n" ++ "1: movel %3,(%0)+\n" ++ "2: subql #1,%1\n" ++ " jne 1b\n" ++ "3: movel %2,%1\n" ++ " bclr #1,%1\n" ++ " jeq 4f\n" ++ "24:movew %3,(%0)+\n" ++ "4: bclr #0,%1\n" ++ " jeq 5f\n" ++ "25:moveb %3,(%0)+\n" ++ "5:\n" ++ ".section .fixup,\"ax\"\n" ++ " .even\n" ++ "61:addql #1,%1\n" ++ "6: lsll #2,%1\n" ++ " addl %2,%1\n" ++ " jra 5b\n" ++ "7: addql #2,%1\n" ++ " jra 5b\n" ++ "8: addql #1,%1\n" ++ " jra 5b\n" ++ ".previous\n" ++ ".section __ex_table,\"a\"\n" ++ " .align 4\n" ++ " .long 1b,61b\n" ++ " .long 2b,6b\n" ++ " .long 3b,61b\n" ++ " .long 24b,7b\n" ++ " .long 4b,7b\n" ++ " .long 25b,8b\n" ++ " .long 5b,8b\n" ++ ".previous" ++ : "=a"(to), "=d"(n) ++ : "r"(n & 3), "d"(0), "0"(to), "1"(n/4)); ++ return n; ++} ++EXPORT_SYMBOL(__clear_user); ++ ++#endif /* CONFIG_COLDFIRE */ ++ diff --git a/target/linux/coldfire/patches/007-mcfv4e_arch_mm_mods_1.patch b/target/linux/coldfire/patches/007-mcfv4e_arch_mm_mods_1.patch new file mode 100644 index 0000000000..2abd477465 --- /dev/null +++ b/target/linux/coldfire/patches/007-mcfv4e_arch_mm_mods_1.patch @@ -0,0 +1,513 @@ +From 2bef1f8ce148cce9e782f75f9537767c1d8c0eea Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Wed, 31 Oct 2007 16:58:27 -0600 +Subject: [PATCH] Core Coldfire/MCF5445x arch/mm changes. + +LTIBName: mcfv4e-arch-mm-mods-1 +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + arch/m68k/mm/Makefile | 1 + + arch/m68k/mm/cache.c | 41 ++++++++ + arch/m68k/mm/cf-mmu.c | 251 +++++++++++++++++++++++++++++++++++++++++++++++++ + arch/m68k/mm/hwtest.c | 2 + + arch/m68k/mm/init.c | 3 +- + arch/m68k/mm/kmap.c | 13 +++ + arch/m68k/mm/memory.c | 66 +++++++++++++- + 7 files changed, 373 insertions(+), 4 deletions(-) + create mode 100644 arch/m68k/mm/cf-mmu.c + +--- a/arch/m68k/mm/Makefile ++++ b/arch/m68k/mm/Makefile +@@ -6,3 +6,4 @@ obj-y := cache.o init.o fault.o hwtest. + + obj-$(CONFIG_MMU_MOTOROLA) += kmap.o memory.o motorola.o + obj-$(CONFIG_MMU_SUN3) += sun3kmap.o sun3mmu.o ++obj-$(CONFIG_MMU_CFV4E) += cf-mmu.o kmap.o memory.o +--- a/arch/m68k/mm/cache.c ++++ b/arch/m68k/mm/cache.c +@@ -10,7 +10,11 @@ + #include <asm/pgalloc.h> + #include <asm/traps.h> + ++#ifdef CONFIG_COLDFIRE ++#include <asm/cfcache.h> ++#endif /* CONFIG_COLDFIRE */ + ++#ifndef CONFIG_COLDFIRE + static unsigned long virt_to_phys_slow(unsigned long vaddr) + { + if (CPU_IS_060) { +@@ -69,11 +73,45 @@ static unsigned long virt_to_phys_slow(u + } + return 0; + } ++#endif /* CONFIG_COLDFIRE */ ++ + + /* Push n pages at kernel virtual address and clear the icache */ + /* RZ: use cpush %bc instead of cpush %dc, cinv %ic */ + void flush_icache_range(unsigned long address, unsigned long endaddr) + { ++#ifdef CONFIG_COLDFIRE ++ unsigned long set; ++ unsigned long start_set; ++ unsigned long end_set; ++ ++ start_set = address & _ICACHE_SET_MASK; ++ end_set = endaddr & _ICACHE_SET_MASK; ++ ++ if (start_set > end_set) { ++ /* from the begining to the lowest address */ ++ for (set = 0; set <= end_set; set += (0x10 - 3)) ++ asm volatile ("cpushl %%ic,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%ic,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%ic,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%ic,(%0)" : : "a" (set)); ++ ++ /* next loop will finish the cache ie pass the hole */ ++ end_set = LAST_ICACHE_ADDR; ++ } ++ for (set = start_set; set <= end_set; set += (0x10 - 3)) ++ asm volatile ("cpushl %%ic,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%ic,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%ic,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%ic,(%0)" : : "a" (set)); ++ ++#else /* !CONFIG_COLDFIRE */ + + if (CPU_IS_040_OR_060) { + address &= PAGE_MASK; +@@ -94,9 +132,11 @@ void flush_icache_range(unsigned long ad + : "=&d" (tmp) + : "di" (FLUSH_I)); + } ++#endif /* CONFIG_COLDFIRE */ + } + EXPORT_SYMBOL(flush_icache_range); + ++#ifndef CONFIG_COLDFIRE + void flush_icache_user_range(struct vm_area_struct *vma, struct page *page, + unsigned long addr, int len) + { +@@ -115,4 +155,5 @@ void flush_icache_user_range(struct vm_a + : "di" (FLUSH_I)); + } + } ++#endif /* CONFIG_COLDFIRE */ + +--- /dev/null ++++ b/arch/m68k/mm/cf-mmu.c +@@ -0,0 +1,251 @@ ++/* ++ * linux/arch/m68k/mm/cf-mmu.c ++ * ++ * Based upon linux/arch/m68k/mm/sun3mmu.c ++ * Based upon linux/arch/ppc/mm/mmu_context.c ++ * ++ * Implementations of mm routines specific to the Coldfire MMU. ++ * ++ * Copyright (c) 2008 Freescale Semiconductor, Inc. ++ */ ++ ++#include <linux/signal.h> ++#include <linux/sched.h> ++#include <linux/mm.h> ++#include <linux/swap.h> ++#include <linux/kernel.h> ++#include <linux/string.h> ++#include <linux/types.h> ++#include <linux/init.h> ++#ifdef CONFIG_BLK_DEV_RAM ++#include <linux/blkdev.h> ++#endif ++#include <linux/bootmem.h> ++ ++#include <asm/setup.h> ++#include <asm/uaccess.h> ++#include <asm/page.h> ++#include <asm/pgtable.h> ++#include <asm/system.h> ++#include <asm/machdep.h> ++#include <asm/io.h> ++#include <asm/mmu_context.h> ++#include <asm/cf_pgalloc.h> ++ ++#include <asm/coldfire.h> ++#include <asm/tlbflush.h> ++ ++mm_context_t next_mmu_context; ++unsigned long context_map[LAST_CONTEXT / BITS_PER_LONG + 1]; ++ ++atomic_t nr_free_contexts; ++struct mm_struct *context_mm[LAST_CONTEXT+1]; ++void steal_context(void); ++ ++ ++const char bad_pmd_string[] = "Bad pmd in pte_alloc: %08lx\n"; ++ ++extern unsigned long empty_bad_page_table; ++extern unsigned long empty_bad_page; ++extern unsigned long num_pages; ++ ++extern char __init_begin, __init_end; ++ ++void free_initmem(void) ++{ ++ unsigned long addr; ++ unsigned long start = (unsigned long)&__init_begin; ++ unsigned long end = (unsigned long)&__init_end; ++ ++ printk(KERN_INFO "free_initmem: __init_begin = 0x%lx __init_end = 0x%lx\n", start, end); ++ ++ addr = (unsigned long)&__init_begin; ++ for (; addr < (unsigned long)&__init_end; addr += PAGE_SIZE) { ++ /* not currently used */ ++ virt_to_page(addr)->flags &= ~(1 << PG_reserved); ++ init_page_count(virt_to_page(addr)); ++ free_page(addr); ++ totalram_pages++; ++ } ++} ++ ++/* Coldfire paging_init derived from sun3 */ ++void __init paging_init(void) ++{ ++ pgd_t * pg_dir; ++ pte_t * pg_table; ++ int i; ++ unsigned long address; ++ unsigned long next_pgtable; ++ unsigned long bootmem_end; ++ unsigned long zones_size[MAX_NR_ZONES]; ++ unsigned long size; ++ enum zone_type zone; ++ ++ empty_zero_page = (void *)alloc_bootmem_pages(PAGE_SIZE); ++ memset((void *)empty_zero_page, 0, PAGE_SIZE); ++ ++ pg_dir = swapper_pg_dir; ++ memset(swapper_pg_dir, 0, sizeof (swapper_pg_dir)); ++ ++ size = num_pages * sizeof(pte_t); ++ size = (size + PAGE_SIZE) & ~(PAGE_SIZE-1); ++ next_pgtable = (unsigned long)alloc_bootmem_pages(size); ++ ++ bootmem_end = (next_pgtable + size + PAGE_SIZE) & PAGE_MASK; ++ pg_dir += PAGE_OFFSET >> PGDIR_SHIFT; ++ ++ address = PAGE_OFFSET; ++ while (address < (unsigned long)high_memory) ++ { ++ pg_table = (pte_t *)next_pgtable; ++ next_pgtable += PTRS_PER_PTE * sizeof (pte_t); ++ pgd_val(*pg_dir) = (unsigned long) pg_table; ++ pg_dir++; ++ ++ /* now change pg_table to kernel virtual addresses */ ++ for (i=0; i<PTRS_PER_PTE; ++i, ++pg_table) ++ { ++ pte_t pte = pfn_pte(virt_to_pfn(address), PAGE_INIT); ++ if (address >= (unsigned long)high_memory) ++ pte_val (pte) = 0; ++ ++ set_pte (pg_table, pte); ++ address += PAGE_SIZE; ++ } ++ } ++ ++ current->mm = NULL; ++ ++ /* clear zones */ ++ for (zone = 0; zone < MAX_NR_ZONES; zone++) ++ zones_size[zone] = 0x0; ++ ++ /* allocate the bottom 32M (0x40x 0x41x) to DMA - head.S marks them NO CACHE */ ++ /* JKM - this should be changed to allocate from the TOP (0x4f,0x4e) but the ++ * allocator is being a bit challenging */ ++ zones_size[ZONE_DMA] = (32*1024*1024) >> PAGE_SHIFT; ++ ++ /* allocate the rest to NORMAL - head.S marks them CACHE */ ++ zones_size[ZONE_NORMAL] = (((unsigned long)high_memory - PAGE_OFFSET) >> PAGE_SHIFT) - zones_size[0]; ++ ++ free_area_init(zones_size); ++} ++ ++ ++int cf_tlb_miss(struct pt_regs *regs, int write, int dtlb, int extension_word) ++{ ++ struct mm_struct *mm; ++ pgd_t *pgd; ++ pmd_t *pmd; ++ pte_t *pte; ++ unsigned long mmuar; ++ int asid; ++ int flags; ++ ++ local_save_flags(flags); ++ local_irq_disable(); ++ ++ mmuar = ( dtlb ) ? regs->mmuar ++ : regs->pc + (extension_word * sizeof(long)); ++ ++ mm = (!user_mode(regs) && (mmuar >= PAGE_OFFSET)) ? &init_mm ++ : current->mm; ++ if (!mm) { ++ local_irq_restore(flags); ++ return (-1); ++ } ++ ++ pgd = pgd_offset(mm, mmuar); ++ if (pgd_none(*pgd)) { ++ local_irq_restore(flags); ++ return (-1); ++ } ++ ++ pmd = pmd_offset(pgd, mmuar); ++ if (pmd_none(*pmd)) { ++ local_irq_restore(flags); ++ return (-1); ++ } ++ ++ pte = (mmuar >= PAGE_OFFSET) ? pte_offset_kernel(pmd, mmuar) ++ : pte_offset_map(pmd, mmuar); ++ if (pte_none(*pte) || !pte_present(*pte)) { ++ local_irq_restore(flags); ++ return (-1); ++ } ++ ++ if (write) { ++ if (!pte_write(*pte)) { ++ local_irq_restore(flags); ++ return (-1); ++ } ++ set_pte(pte, pte_mkdirty(*pte)); ++ } ++ ++ set_pte(pte, pte_mkyoung(*pte)); ++ asid = mm->context & 0xff; ++ if (!pte_dirty(*pte) && mmuar<=PAGE_OFFSET) ++ set_pte(pte, pte_wrprotect(*pte)); ++ ++ *MMUTR = (mmuar & PAGE_MASK) | (asid << CF_ASID_MMU_SHIFT) ++ | (((int)(pte->pte) & (int)CF_PAGE_MMUTR_MASK ) >> CF_PAGE_MMUTR_SHIFT) ++ | MMUTR_V; ++ ++ *MMUDR = (pte_val(*pte) & PAGE_MASK) ++ | ((pte->pte) & CF_PAGE_MMUDR_MASK) ++ | MMUDR_SZ8K | MMUDR_X; ++ ++ if ( dtlb ) ++ *MMUOR = MMUOR_ACC | MMUOR_UAA; ++ else ++ *MMUOR = MMUOR_ITLB | MMUOR_ACC | MMUOR_UAA; ++ ++ asm ("nop"); ++ /*printk("cf_tlb_miss: va=%lx, pa=%lx\n", (mmuar & PAGE_MASK), ++ (pte_val(*pte) & PAGE_MASK));*/ ++ local_irq_restore(flags); ++ return (0); ++} ++ ++ ++/* The following was taken from arch/ppc/mmu_context.c ++ * ++ * Initialize the context management stuff. ++ */ ++void __init mmu_context_init(void) ++{ ++ /* ++ * Some processors have too few contexts to reserve one for ++ * init_mm, and require using context 0 for a normal task. ++ * Other processors reserve the use of context zero for the kernel. ++ * This code assumes FIRST_CONTEXT < 32. ++ */ ++ context_map[0] = (1 << FIRST_CONTEXT) - 1; ++ next_mmu_context = FIRST_CONTEXT; ++ atomic_set(&nr_free_contexts, LAST_CONTEXT - FIRST_CONTEXT + 1); ++} ++ ++/* ++ * Steal a context from a task that has one at the moment. ++ * This is only used on 8xx and 4xx and we presently assume that ++ * they don't do SMP. If they do then thicfpgalloc.hs will have to check ++ * whether the MM we steal is in use. ++ * We also assume that this is only used on systems that don't ++ * use an MMU hash table - this is true for 8xx and 4xx. ++ * This isn't an LRU system, it just frees up each context in ++ * turn (sort-of pseudo-random replacement :). This would be the ++ * place to implement an LRU scheme if anyone was motivated to do it. ++ * -- paulus ++ */ ++void steal_context(void) ++{ ++ struct mm_struct *mm; ++ /* free up context `next_mmu_context' */ ++ /* if we shouldn't free context 0, don't... */ ++ if (next_mmu_context < FIRST_CONTEXT) ++ next_mmu_context = FIRST_CONTEXT; ++ mm = context_mm[next_mmu_context]; ++ flush_tlb_mm(mm); ++ destroy_context(mm); ++} +--- a/arch/m68k/mm/hwtest.c ++++ b/arch/m68k/mm/hwtest.c +@@ -25,6 +25,7 @@ + + #include <linux/module.h> + ++#ifndef CONFIG_COLDFIRE + int hwreg_present( volatile void *regp ) + { + int ret = 0; +@@ -82,4 +83,5 @@ int hwreg_write( volatile void *regp, un + return( ret ); + } + EXPORT_SYMBOL(hwreg_write); ++#endif + +--- a/arch/m68k/mm/init.c ++++ b/arch/m68k/mm/init.c +@@ -122,7 +122,6 @@ void __init mem_init(void) + if (MACH_IS_ATARI) + atari_stram_mem_init_hook(); + #endif +- + /* this will put all memory onto the freelists */ + totalram_pages = num_physpages = 0; + for_each_online_pgdat(pgdat) { +@@ -146,7 +145,7 @@ void __init mem_init(void) + } + } + +-#ifndef CONFIG_SUN3 ++#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE) + /* insert pointer tables allocated so far into the tablelist */ + init_pointer_table((unsigned long)kernel_pg_dir); + for (i = 0; i < PTRS_PER_PGD; i++) { +--- a/arch/m68k/mm/kmap.c ++++ b/arch/m68k/mm/kmap.c +@@ -24,7 +24,11 @@ + + #undef DEBUG + ++#ifndef CONFIG_COLDFIRE + #define PTRTREESIZE (256*1024) ++#else ++#define PTRTREESIZE PAGE_SIZE ++#endif + + /* + * For 040/060 we can use the virtual memory area like other architectures, +@@ -50,7 +54,11 @@ static inline void free_io_area(void *ad + + #else + ++#ifdef CONFIG_COLDFIRE ++#define IO_SIZE PAGE_SIZE ++#else + #define IO_SIZE (256*1024) ++#endif + + static struct vm_struct *iolist; + +@@ -170,7 +178,12 @@ void __iomem *__ioremap(unsigned long ph + break; + } + } else { ++#ifndef CONFIG_COLDFIRE + physaddr |= (_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_DIRTY); ++#else ++ physaddr |= (_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_DIRTY | \ ++ _PAGE_READWRITE); ++#endif + switch (cacheflag) { + case IOMAP_NOCACHE_SER: + case IOMAP_NOCACHE_NONSER: +--- a/arch/m68k/mm/memory.c ++++ b/arch/m68k/mm/memory.c +@@ -203,7 +203,38 @@ static inline void pushcl040(unsigned lo + + void cache_clear (unsigned long paddr, int len) + { +- if (CPU_IS_040_OR_060) { ++ if (CPU_IS_CFV4E) { ++ unsigned long set; ++ unsigned long start_set; ++ unsigned long end_set; ++ ++ start_set = paddr & _ICACHE_SET_MASK; ++ end_set = (paddr+len-1) & _ICACHE_SET_MASK; ++ ++ if (start_set > end_set) { ++ /* from the begining to the lowest address */ ++ for (set = 0; set <= end_set; set += (0x10 - 3)) ++ asm volatile("cpushl %%bc,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%bc,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%bc,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%bc,(%0)" : : "a" (set)); ++ ++ /* next loop will finish the cache ie pass the hole */ ++ end_set = LAST_ICACHE_ADDR; ++ } ++ for (set = start_set; set <= end_set; set += (0x10 - 3)) ++ asm volatile("cpushl %%bc,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%bc,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%bc,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%bc,(%0)" : : "a" (set)); ++ ++ } else if (CPU_IS_040_OR_060) { + int tmp; + + /* +@@ -250,7 +281,38 @@ EXPORT_SYMBOL(cache_clear); + + void cache_push (unsigned long paddr, int len) + { +- if (CPU_IS_040_OR_060) { ++ if (CPU_IS_CFV4E) { ++ unsigned long set; ++ unsigned long start_set; ++ unsigned long end_set; ++ ++ start_set = paddr & _ICACHE_SET_MASK; ++ end_set = (paddr+len-1) & _ICACHE_SET_MASK; ++ ++ if (start_set > end_set) { ++ /* from the begining to the lowest address */ ++ for (set = 0; set <= end_set; set += (0x10 - 3)) ++ asm volatile("cpushl %%bc,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%bc,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%bc,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%bc,(%0)" : : "a" (set)); ++ ++ /* next loop will finish the cache ie pass the hole */ ++ end_set = LAST_ICACHE_ADDR; ++ } ++ for (set = start_set; set <= end_set; set += (0x10 - 3)) ++ asm volatile("cpushl %%bc,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%bc,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%bc,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%bc,(%0)" : : "a" (set)); ++ ++ } else if (CPU_IS_040_OR_060) { + int tmp = PAGE_SIZE; + + /* diff --git a/target/linux/coldfire/patches/008-mcfv4e_coldfire_code.patch b/target/linux/coldfire/patches/008-mcfv4e_coldfire_code.patch new file mode 100644 index 0000000000..9da89c802b --- /dev/null +++ b/target/linux/coldfire/patches/008-mcfv4e_coldfire_code.patch @@ -0,0 +1,4484 @@ +From 70b2bd01829b38a1a79caeda05d436b2e5fecf82 Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Wed, 31 Oct 2007 17:00:18 -0600 +Subject: [PATCH] Core Coldfire/MCF5445x specific code. + +LTIBName: mcfv4e-coldfire-code +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + arch/m68k/coldfire/Makefile | 11 + + arch/m68k/coldfire/cache.c | 215 +++++++++ + arch/m68k/coldfire/config.c | 420 ++++++++++++++++++ + arch/m68k/coldfire/entry.S | 701 ++++++++++++++++++++++++++++++ + arch/m68k/coldfire/head.S | 474 ++++++++++++++++++++ + arch/m68k/coldfire/ints.c | 384 ++++++++++++++++ + arch/m68k/coldfire/iomap.c | 54 +++ + arch/m68k/coldfire/mcf5445x-pci.c | 427 ++++++++++++++++++ + arch/m68k/coldfire/muldi3.S | 64 +++ + arch/m68k/coldfire/pci.c | 245 +++++++++++ + arch/m68k/coldfire/signal.c | 868 +++++++++++++++++++++++++++++++++++++ + arch/m68k/coldfire/traps.c | 454 +++++++++++++++++++ + arch/m68k/coldfire/vmlinux-cf.lds | 92 ++++ + 13 files changed, 4409 insertions(+), 0 deletions(-) + create mode 100644 arch/m68k/coldfire/Makefile + create mode 100644 arch/m68k/coldfire/cache.c + create mode 100644 arch/m68k/coldfire/config.c + create mode 100644 arch/m68k/coldfire/entry.S + create mode 100644 arch/m68k/coldfire/head.S + create mode 100644 arch/m68k/coldfire/ints.c + create mode 100644 arch/m68k/coldfire/iomap.c + create mode 100644 arch/m68k/coldfire/mcf5445x-pci.c + create mode 100644 arch/m68k/coldfire/muldi3.S + create mode 100644 arch/m68k/coldfire/pci.c + create mode 100644 arch/m68k/coldfire/signal.c + create mode 100644 arch/m68k/coldfire/traps.c + create mode 100644 arch/m68k/coldfire/vmlinux-cf.lds + +--- /dev/null ++++ b/arch/m68k/coldfire/Makefile +@@ -0,0 +1,11 @@ ++# ++# Makefile for Linux arch/m68k/coldfire source directory ++# ++ ++obj-y:= entry.o config.o cache.o signal.o muldi3.o traps.o ints.o ++ ++ifneq ($(strip $(CONFIG_USB) $(CONFIG_USB_GADGET_MCF5445X)),) ++ obj-y += usb.o usb/ ++endif ++ ++obj-$(CONFIG_PCI) += pci.o mcf5445x-pci.o iomap.o +--- /dev/null ++++ b/arch/m68k/coldfire/cache.c +@@ -0,0 +1,215 @@ ++/* ++ * linux/arch/m68k/coldifre/cache.c ++ * ++ * Matt Waddel Matt.Waddel@freescale.com ++ * Copyright Freescale Semiconductor, Inc. 2007 ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ */ ++ ++#include <linux/interrupt.h> ++#include <asm/cfcache.h> ++#include <asm/coldfire.h> ++#include <asm/system.h> ++ ++#define _DCACHE_SIZE (2*16384) ++#define _ICACHE_SIZE (2*16384) ++ ++#define _SET_SHIFT 4 ++ ++/* ++ * Masks for cache sizes. Programming note: because the set size is a ++ * power of two, the mask is also the last address in the set. ++ */ ++ ++#define _DCACHE_SET_MASK ((_DCACHE_SIZE/64-1)<<_SET_SHIFT) ++#define _ICACHE_SET_MASK ((_ICACHE_SIZE/64-1)<<_SET_SHIFT) ++#define LAST_DCACHE_ADDR _DCACHE_SET_MASK ++#define LAST_ICACHE_ADDR _ICACHE_SET_MASK ++ ++/************************************************************ ++ * Routine to cleanly flush the cache, pushing all lines and ++ * invalidating them. ++ * ++ * The is the flash-resident version, used after copying the .text ++ * segment from flash to ram. ++ *************************************************************/ ++void FLASHDcacheFlushInvalidate(void) ++ __attribute__ ((section (".text_loader"))); ++ ++void FLASHDcacheFlushInvalidate() ++{ ++ unsigned long set; ++ unsigned long start_set; ++ unsigned long end_set; ++ ++ start_set = 0; ++ end_set = (unsigned long)LAST_DCACHE_ADDR; ++ ++ for (set = start_set; set < end_set; set += (0x10 - 3)) ++ asm volatile("cpushl %%dc,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%dc,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%dc,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%dc,(%0)" : : "a" (set)); ++} ++ ++/************************************************************ ++ * Routine to cleanly flush the cache, pushing all lines and ++ * invalidating them. ++ * ++ *************************************************************/ ++void DcacheFlushInvalidate() ++{ ++ unsigned long set; ++ unsigned long start_set; ++ unsigned long end_set; ++ ++ start_set = 0; ++ end_set = (unsigned long)LAST_DCACHE_ADDR; ++ ++ for (set = start_set; set < end_set; set += (0x10 - 3)) ++ asm volatile("cpushl %%dc,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%dc,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%dc,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%dc,(%0)" : : "a" (set)); ++} ++ ++ ++ ++/****************************************************************************** ++ * Routine to cleanly flush the a block of cache, pushing all relevant lines ++ * and invalidating them. ++ * ++ ******************************************************************************/ ++void DcacheFlushInvalidateCacheBlock(void *start, unsigned long size) ++{ ++ unsigned long set; ++ unsigned long start_set; ++ unsigned long end_set; ++ ++ /* if size is bigger than the cache can store ++ * set the size to the maximum amount ++ */ ++ ++ if (size > LAST_DCACHE_ADDR) ++ size = LAST_DCACHE_ADDR; ++ ++ start_set = ((unsigned long)start) & _DCACHE_SET_MASK; ++ end_set = ((unsigned long)(start+size-1)) & _DCACHE_SET_MASK; ++ ++ if (start_set > end_set) { ++ /* from the begining to the lowest address */ ++ for (set = 0; set <= end_set; set += (0x10 - 3)) ++ asm volatile("cpushl %%dc,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%dc,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%dc,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%dc,(%0)" : : "a" (set)); ++ ++ /* next loop will finish the cache ie pass the hole */ ++ end_set = LAST_DCACHE_ADDR; ++ } ++ for (set = start_set; set <= end_set; set += (0x10 - 3)) ++ asm volatile("cpushl %%dc,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%dc,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%dc,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%dc,(%0)" : : "a" (set)); ++} ++ ++ ++void IcacheInvalidateCacheBlock(void *start, unsigned long size) ++{ ++ unsigned long set; ++ unsigned long start_set; ++ unsigned long end_set; ++ ++ /* if size is bigger than the cache can store ++ * set the size to the maximum ammount ++ */ ++ ++ if (size > LAST_ICACHE_ADDR) ++ size = LAST_ICACHE_ADDR; ++ ++ start_set = ((unsigned long)start) & _ICACHE_SET_MASK; ++ end_set = ((unsigned long)(start+size-1)) & _ICACHE_SET_MASK; ++ ++ if (start_set > end_set) { ++ /* from the begining to the lowest address */ ++ for (set = 0; set <= end_set; set += (0x10 - 3)) ++ asm volatile("cpushl %%ic,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%ic,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%ic,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%ic,(%0)" : : "a" (set)); ++ ++ /* next loop will finish the cache ie pass the hole */ ++ end_set = LAST_ICACHE_ADDR; ++ } ++ for (set = start_set; set <= end_set; set += (0x10 - 3)) ++ asm volatile("cpushl %%ic,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%ic,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%ic,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%ic,(%0)" : : "a" (set)); ++} ++ ++ ++/******************************************************************** ++ * Disable the data cache completely ++ ********************************************************************/ ++void DcacheDisable(void) ++{ ++ int newValue; ++ unsigned long flags; ++ ++ local_save_flags(flags); ++ local_irq_disable(); ++ ++ DcacheFlushInvalidate(); /* begin by flushing the cache */ ++ newValue = CACHE_DISABLE_MODE; /* disable it */ ++ cacr_set(newValue); ++ local_irq_restore(flags); ++} ++ ++/******************************************************************** ++ * Unconditionally enable the data cache ++ ********************************************************************/ ++void DcacheEnable(void) ++{ ++ cacr_set(CACHE_INITIAL_MODE); ++} ++ ++ ++unsigned long shadow_cacr; ++ ++void cacr_set(unsigned long x) ++{ ++ shadow_cacr = x; ++ ++ __asm__ __volatile__ ("movec %0, %%cacr" ++ : /* no outputs */ ++ : "r" (shadow_cacr)); ++} ++ ++unsigned long cacr_get(void) ++{ ++ return shadow_cacr; ++} +--- /dev/null ++++ b/arch/m68k/coldfire/config.c +@@ -0,0 +1,420 @@ ++/* ++ * linux/arch/m68k/coldifre/config.c ++ * ++ * Matt Waddel Matt.Waddel@freescale.com ++ * Copyright Freescale Semiconductor, Inc. 2007 ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ */ ++ ++#include <linux/module.h> ++#include <linux/init.h> ++#include <linux/string.h> ++#include <linux/kernel.h> ++#include <linux/console.h> ++#include <linux/bootmem.h> ++#include <linux/mm.h> ++#include <asm/bootinfo.h> ++#include <asm/machdep.h> ++#include <asm/coldfire.h> ++#include <asm/cfcache.h> ++#include <asm/bootinfo.h> ++#include <asm/io.h> ++#include <asm/cfmmu.h> ++#include <asm/setup.h> ++#include <asm/irq.h> ++#include <asm/traps.h> ++#include <asm/movs.h> ++#include <asm/movs.h> ++#include <asm/page.h> ++#include <asm/pgalloc.h> ++#include <asm/mcf5445x_intc.h> ++#include <asm/mcf5445x_sdramc.h> ++#include <asm/mcf5445x_fbcs.h> ++#include <asm/mcf5445x_dtim.h> ++ ++/* JKM -- testing */ ++#include <linux/pfn.h> ++/* JKM */ ++ ++extern int get_irq_list(struct seq_file *p, void *v); ++extern char _text, _end; ++extern char _etext, _edata, __init_begin, __init_end; ++extern struct console mcfrs_console; ++extern char m68k_command_line[CL_SIZE]; ++extern unsigned long availmem; ++ ++static int irq_enable[NR_IRQS]; ++unsigned long num_pages; ++ ++void coldfire_sort_memrec(void) ++{ ++ int i, j; ++ ++ /* Sort the m68k_memory records by address */ ++ for (i = 0; i < m68k_num_memory; ++i) { ++ for (j = i + 1; j < m68k_num_memory; ++j) { ++ if (m68k_memory[i].addr > m68k_memory[j].addr) { ++ struct mem_info tmp; ++ tmp = m68k_memory[i]; ++ m68k_memory[i] = m68k_memory[j]; ++ m68k_memory[j] = tmp; ++ } ++ } ++ } ++ /* Trim off discontiguous bits */ ++ for (i = 1; i < m68k_num_memory; ++i) { ++ if ((m68k_memory[i-1].addr + m68k_memory[i-1].size) != ++ m68k_memory[i].addr) { ++ printk(KERN_DEBUG "m68k_parse_bootinfo: addr gap between \ ++ 0x%lx & 0x%lx\n", ++ m68k_memory[i-1].addr+m68k_memory[i-1].size, ++ m68k_memory[i].addr); ++ m68k_num_memory = i; ++ break; ++ } ++ } ++} ++ ++int __init uboot_commandline(char *bootargs) ++{ ++ int len = 0, cmd_line_len; ++ static struct uboot_record uboot_info; ++ ++ extern unsigned long uboot_info_stk; ++ ++ /* Add 0x80000000 to get post-remapped kernel memory location */ ++ uboot_info.bd_info = (*(u32 *)(uboot_info_stk)) + 0x80000000; ++ uboot_info.initrd_start = (*(u32 *)(uboot_info_stk+4)) + 0x80000000; ++ uboot_info.initrd_end = (*(u32 *)(uboot_info_stk+8)) + 0x80000000; ++ uboot_info.cmd_line_start = (*(u32 *)(uboot_info_stk+12)) + 0x80000000; ++ uboot_info.cmd_line_stop = (*(u32 *)(uboot_info_stk+16)) + 0x80000000; ++ ++ cmd_line_len = uboot_info.cmd_line_stop - uboot_info.cmd_line_start; ++ if ((cmd_line_len > 0) && (cmd_line_len < CL_SIZE-1)) ++ len = (int)strncpy(bootargs, (char *)uboot_info.cmd_line_start,\ ++ cmd_line_len); ++ ++ return len; ++} ++ ++/* ++ * This routine does things not done in the bootloader. ++ */ ++#define DEFAULT_COMMAND_LINE "root=/dev/mtdblock1 rw rootfstype=jffs2 ip=none mtdparts=physmap-flash.0:5M(kernel)ro,-(jffs2)" ++asmlinkage void __init cf_early_init(void) ++{ ++ struct bi_record *record = (struct bi_record *) &_end; ++ ++ extern char _end; ++ ++ SET_VBR((void *)MCF_RAMBAR1); ++ ++ /* Mask all interrupts */ ++ MCF_INTC0_IMRL = 0xFFFFFFFF; ++ MCF_INTC0_IMRH = 0xFFFFFFFF; ++ MCF_INTC1_IMRL = 0xFFFFFFFF; ++ MCF_INTC1_IMRH = 0xFFFFFFFF; ++ ++#if defined(CONFIG_NOR_FLASH_BASE) ++ MCF_FBCS_CSAR(1) = CONFIG_NOR_FLASH_BASE; ++#else ++ MCF_FBCS_CSAR(1) = 0x00000000; ++#endif ++ ++#if CONFIG_SDRAM_SIZE > (256*1024*1024) ++ /* Init optional SDRAM chip select */ ++ MCF_SDRAMC_SDCS(1) = (256*1024*1024) | 0x1B; ++#endif ++ ++ m68k_machtype = MACH_CFMMU; ++ m68k_fputype = FPU_CFV4E; ++ m68k_mmutype = MMU_CFV4E; ++ m68k_cputype = CPU_CFV4E; ++ ++ m68k_num_memory = 0; ++ m68k_memory[m68k_num_memory].addr = CONFIG_SDRAM_BASE; ++ m68k_memory[m68k_num_memory++].size = CONFIG_SDRAM_SIZE; ++ ++ if (!uboot_commandline(m68k_command_line)) { ++#if defined(CONFIG_BOOTPARAM) ++ strncpy(m68k_command_line, CONFIG_BOOTPARAM_STRING, CL_SIZE-1); ++#else ++ strcpy(m68k_command_line, DEFAULT_COMMAND_LINE); ++#endif ++ } ++ ++ ++#if defined(CONFIG_BLK_DEV_INITRD) ++ /* add initrd image */ ++ record = (struct bi_record *) ((void *)record + record->size); ++ record->tag = BI_RAMDISK; ++ record->size = sizeof(record->tag) + sizeof(record->size) ++ + sizeof(record->data[0]) + sizeof(record->data[1]); ++#endif ++ ++ /* Mark end of tags. */ ++ record = (struct bi_record *) ((void *) record + record->size); ++ record->tag = 0; ++ record->data[0] = 0; ++ record->data[1] = 0; ++ record->size = sizeof(record->tag) + sizeof(record->size) ++ + sizeof(record->data[0]) + sizeof(record->data[1]); ++ ++ /* Invalidate caches via CACR */ ++ cacr_set(CACHE_DISABLE_MODE); ++ ++ /* Turn on caches via CACR, enable EUSP */ ++ cacr_set(CACHE_INITIAL_MODE); ++} ++ ++void settimericr(unsigned int timer, unsigned int level) ++{ ++ volatile unsigned char *icrp; ++ unsigned int icr; ++ unsigned char irq; ++ ++ if (timer <= 2) { ++ switch (timer) { ++ case 2: irq = 33; icr = MCFSIM_ICR_TIMER2; break; ++ default: irq = 32; icr = MCFSIM_ICR_TIMER1; break; ++ } ++ ++ icrp = (volatile unsigned char *) (icr); ++ *icrp = level; ++ coldfire_enable_irq0(irq); ++ } ++} ++ ++/* Assembler routines */ ++asmlinkage void buserr(void); ++asmlinkage void trap(void); ++asmlinkage void system_call(void); ++asmlinkage void inthandler(void); ++ ++void __init coldfire_trap_init(void) ++{ ++ int i = 0; ++ e_vector *vectors; ++ ++ vectors = (e_vector *)MCF_RAMBAR1; ++ /* ++ * There is a common trap handler and common interrupt ++ * handler that handle almost every vector. We treat ++ * the system call and bus error special, they get their ++ * own first level handlers. ++ */ ++ for (i = 3; (i <= 23); i++) ++ vectors[i] = trap; ++ for (i = 33; (i <= 63); i++) ++ vectors[i] = trap; ++ for (i = 24; (i <= 31); i++) ++ vectors[i] = inthandler; ++ for (i = 64; (i < 255); i++) ++ vectors[i] = inthandler; ++ ++ vectors[255] = 0; ++ vectors[2] = buserr; ++ vectors[32] = system_call; ++} ++ ++void coldfire_tick(void) ++{ ++ /* Reset the ColdFire timer */ ++ __raw_writeb(MCF_DTIM_DTER_CAP | MCF_DTIM_DTER_REF, MCF_DTIM0_DTER); ++} ++ ++void __init coldfire_sched_init(irq_handler_t handler) ++{ ++ unsigned int mcf_timerlevel = 5; ++ unsigned int mcf_timervector = 64+32; ++ ++ __raw_writew(MCF_DTIM_DTMR_RST_RST, MCF_DTIM0_DTMR); ++ __raw_writel(((MCF_BUSCLK / 16) / HZ), MCF_DTIM0_DTRR); ++ __raw_writew(MCF_DTIM_DTMR_ORRI | MCF_DTIM_DTMR_CLK_DIV16 | ++ MCF_DTIM_DTMR_FRR | MCF_DTIM_DTMR_RST_EN, \ ++ MCF_DTIM0_DTMR); ++ ++ request_irq(mcf_timervector, handler, SA_INTERRUPT, \ ++ "timer", (void *)MCF_DTIM0_DTMR); ++ ++ settimericr(1, mcf_timerlevel); ++} ++ ++int timerirqpending(int timer) ++{ ++ unsigned int imr = 0; ++ ++ switch (timer) { ++ case 1: imr = 0x1; break; ++ case 2: imr = 0x2; break; ++ default: break; ++ } ++ ++ return (getiprh() & imr); ++} ++ ++unsigned long coldfire_gettimeoffset(void) ++{ ++ volatile unsigned long trr, tcn, offset; ++ ++ tcn = __raw_readw(MCF_DTIM0_DTCN); ++ trr = __raw_readl(MCF_DTIM0_DTRR); ++ offset = (tcn * (1000000 / HZ)) / trr; ++ ++ /* Check if we just wrapped the counters and maybe missed a tick */ ++ if ((offset < (1000000 / HZ / 2)) && timerirqpending(1)) ++ offset += 1000000 / HZ; ++ return offset; ++} ++ ++void coldfire_reboot(void) ++{ ++ /* disable interrupts and do a software reset */ ++ asm("movew #0x2700, %%sr\n\t" ++ "moveb #0x80, %%d0\n\t" ++ "moveb %%d0, 0xfc0a0000\n\t" ++ : : : "%d0"); ++} ++ ++/* int coldfire_hwclk(int i, struct rtc_time *t) ++{ ++ printk ("Real time clock needs porting.\n"); ++ return 0; ++}*/ ++ ++static void coldfire_get_model(char *model) ++{ ++ sprintf(model, "Version 4 ColdFire"); ++} ++ ++void coldfire_enable_irq(unsigned int vec) ++{ ++ unsigned long flags; ++ ++ vec -= 64; ++ ++ if (((int)vec < 0) || (vec > 63)) { ++ printk(KERN_WARNING "enable_irq %d failed\n", vec); ++ return; ++ } ++ ++ local_irq_save(flags); ++ irq_enable[vec]++; ++ if (vec < 32) ++ MCF_INTC0_IMRL &= ~(1 << vec); ++ else ++ MCF_INTC0_IMRH &= ~(1 << (vec - 32)); ++ local_irq_restore(flags); ++} ++ ++void coldfire_disable_irq(unsigned int vec) ++{ ++ unsigned long flags; ++ ++ vec -= 64; ++ ++ if (((int)vec < 0) || (vec > 63)) { ++ printk(KERN_WARNING "disable_irq %d failed\n", vec); ++ return; ++ } ++ ++ local_irq_save(flags); ++ if (--irq_enable[vec] == 0) { ++ if (vec < 32) ++ MCF_INTC0_IMRL |= (1 << vec); ++ else ++ MCF_INTC0_IMRH |= (1 << (vec - 32)); ++ ++ } ++ local_irq_restore(flags); ++} ++ ++static void __init ++coldfire_bootmem_alloc(unsigned long memory_start, unsigned long memory_end) ++{ ++ unsigned long base_pfn; ++ ++ /* compute total pages in system */ ++ num_pages = PAGE_ALIGN(memory_end - PAGE_OFFSET) >> PAGE_SHIFT; ++ ++ /* align start/end to page boundries */ ++ memory_start = PAGE_ALIGN(memory_start); ++ memory_end = memory_end & PAGE_MASK; ++ ++ /* page numbers */ ++ base_pfn = __pa(PAGE_OFFSET) >> PAGE_SHIFT; ++ min_low_pfn = __pa(memory_start) >> PAGE_SHIFT; ++ max_low_pfn = __pa(memory_end) >> PAGE_SHIFT; ++ ++ high_memory = (void *)memory_end; ++ availmem = memory_start; ++ ++ /* setup bootmem data */ ++ m68k_setup_node(0); ++ availmem += init_bootmem_node(NODE_DATA(0), min_low_pfn, ++ base_pfn, max_low_pfn); ++ availmem = PAGE_ALIGN(availmem); ++ free_bootmem(__pa(availmem), memory_end - (availmem)); ++} ++ ++void __init config_coldfire(void) ++{ ++ unsigned long endmem, startmem; ++ int i; ++ ++ /* ++ * Calculate endmem from m68k_memory, assume all are contiguous ++ */ ++ startmem = ((((int) &_end) + (PAGE_SIZE - 1)) & PAGE_MASK); ++ endmem = PAGE_OFFSET; ++ for (i = 0; i < m68k_num_memory; ++i) ++ endmem += m68k_memory[i].size; ++ ++ printk(KERN_INFO "starting up linux startmem 0x%lx, endmem 0x%lx, \ ++ size %luMB\n", startmem, endmem, (endmem - startmem) >> 20); ++ ++ memset(irq_enable, 0, sizeof(irq_enable)); ++ ++ /* ++ * Setup coldfire mach-specific handlers ++ */ ++ mach_max_dma_address = 0xffffffff; ++ mach_sched_init = coldfire_sched_init; ++ mach_tick = coldfire_tick; ++ mach_gettimeoffset = coldfire_gettimeoffset; ++ mach_reset = coldfire_reboot; ++/* mach_hwclk = coldfire_hwclk; to be done */ ++ mach_get_model = coldfire_get_model; ++ ++ coldfire_bootmem_alloc(startmem, endmem); ++ ++ /* ++ * initrd setup ++ */ ++/* #ifdef CONFIG_BLK_DEV_INITRD ++ if (m68k_ramdisk.size) { ++ reserve_bootmem (__pa(m68k_ramdisk.addr), m68k_ramdisk.size); ++ initrd_start = (unsigned long) m68k_ramdisk.addr; ++ initrd_end = initrd_start + m68k_ramdisk.size; ++ printk (KERN_DEBUG "initrd: %08lx - %08lx\n", initrd_start, ++ initrd_end); ++ } ++#endif */ ++ ++#if defined(CONFIG_DUMMY_CONSOLE) || defined(CONFIG_FRAMEBUFFER_CONSOLE) ++ conswitchp = &dummy_con; ++#endif ++ ++#if defined(CONFIG_SERIAL_COLDFIRE) ++ /* ++ * This causes trouble when it is re-registered later. ++ * Currently this is fixed by conditionally commenting ++ * out the register_console in mcf_serial.c ++ */ ++ register_console(&mcfrs_console); ++#endif ++} +--- /dev/null ++++ b/arch/m68k/coldfire/entry.S +@@ -0,0 +1,701 @@ ++/* ++ * arch/m68k/coldfire/entry.S ++ * ++ * Copyright (C) 1999-2002, Greg Ungerer (gerg@snapgear.com) ++ * Copyright (C) 1998 D. Jeff Dionne <jeff@lineo.ca>, ++ * Kenneth Albanowski <kjahds@kjahds.com>, ++ * Copyright (C) 2000 Lineo Inc. (www.lineo.com) ++ * Copyright (C) 2004-2006 Macq Electronique SA. (www.macqel.com) ++ * Matt Waddel Matt.Waddel@freescale.com ++ * Kurt Mahan kmahan@freescale.com ++ * Copyright Freescale Semiconductor, Inc. 2007 ++ * ++ * Based on: ++ * ++ * arch/m68knommu/platform/5307/entry.S & ++ * arch/m68k/kernel/entry.S ++ * ++ * Copyright (C) 1991, 1992 Linus Torvalds ++ * ++ * This file is subject to the terms and conditions of the GNU General Public ++ * License. See the file README.legal in the main directory of this archive ++ * for more details. ++ * ++ * Linux/m68k support by Hamish Macdonald ++ * ++ * ColdFire support by Greg Ungerer (gerg@snapgear.com) ++ * 5307 fixes by David W. Miller ++ * linux 2.4 support David McCullough <davidm@snapgear.com> ++ * Bug, speed and maintainability fixes by Philippe De Muyter <phdm@macqel.be> ++ * Ported to mmu Coldfire by Matt Waddel ++ */ ++ ++#include <linux/sys.h> ++#include <linux/linkage.h> ++#include <asm/cf_entry.h> ++#include <asm/errno.h> ++#include <asm/setup.h> ++#include <asm/segment.h> ++#include <asm/traps.h> ++#include <asm/unistd.h> ++ ++/* ++ * TASK_INFO: ++ * ++ * - TINFO_PREEMPT (struct thread_info / preempt_count) ++ * Used to keep track of preemptability ++ * - TINFO_FLAGS (struct thread_info / flags - include/asm-m68k/thread_info.h) ++ * Various bit flags that are checked for scheduling/tracing ++ * Bits 0-7 are checked every exception exit ++ * 8-15 are checked every syscall exit ++ * ++ * TIF_SIGPENDING 6 ++ * TIF_NEED_RESCHED 7 ++ * TIF_DELAYED_TRACE 14 ++ * TIF_SYSCALL_TRACE 15 ++ * TIF_MEMDIE 16 (never checked here) ++ */ ++ ++.bss ++ ++sw_ksp: ++.long 0 ++ ++sw_usp: ++.long 0 ++ ++.text ++ ++.globl system_call ++.globl buserr ++.globl trap ++.globl resume ++.globl ret_from_exception ++.globl ret_from_signal ++.globl sys_call_table ++.globl ret_from_interrupt ++.globl inthandler ++ ++ENTRY(buserr) ++ SAVE_ALL_INT ++ GET_CURRENT(%d0) ++ movel %sp,%sp@- /* stack frame pointer argument */ ++ jsr buserr_c ++ addql #4,%sp ++ jra .Lret_from_exception ++ ++ENTRY(trap) ++ SAVE_ALL_INT ++ GET_CURRENT(%d0) ++ movel %sp,%sp@- /* stack frame pointer argument */ ++ jsr trap_c ++ addql #4,%sp ++ jra .Lret_from_exception ++ ++ /* After a fork we jump here directly from resume, ++ %d1 contains the previous task schedule_tail */ ++ENTRY(ret_from_fork) ++ movel %d1,%sp@- ++ jsr schedule_tail ++ addql #4,%sp ++ jra .Lret_from_exception ++ ++do_trace_entry: ++ movel #-ENOSYS,%d1 /* needed for strace */ ++ movel %d1,%sp@(PT_D0) ++ subql #4,%sp ++ SAVE_SWITCH_STACK ++ jbsr syscall_trace ++ RESTORE_SWITCH_STACK ++ addql #4,%sp ++ movel %sp@(PT_ORIG_D0),%d0 ++ cmpl #NR_syscalls,%d0 ++ jcs syscall ++badsys: ++ movel #-ENOSYS,%d1 ++ movel %d1,%sp@(PT_D0) ++ jra ret_from_exception ++ ++do_trace_exit: ++ subql #4,%sp ++ SAVE_SWITCH_STACK ++ jbsr syscall_trace ++ RESTORE_SWITCH_STACK ++ addql #4,%sp ++ jra .Lret_from_exception ++ ++ENTRY(ret_from_signal) ++ RESTORE_SWITCH_STACK ++ addql #4,%sp ++ jra .Lret_from_exception ++ ++ENTRY(system_call) ++ SAVE_ALL_SYS ++ ++ GET_CURRENT(%d1) ++ /* save top of frame */ ++ movel %sp,%curptr@(TASK_THREAD+THREAD_ESP0) ++ ++ /* syscall trace */ ++ tstb %curptr@(TASK_INFO+TINFO_FLAGS+2) ++ jmi do_trace_entry /* SYSCALL_TRACE is set */ ++ cmpl #NR_syscalls,%d0 ++ jcc badsys ++syscall: ++ movel #sys_call_table,%a0 ++ asll #2,%d0 ++ addl %d0,%a0 ++ movel %a0@,%a0 ++ jsr %a0@ ++ movel %d0,%sp@(PT_D0) /* save the return value */ ++ret_from_syscall: ++ movew %curptr@(TASK_INFO+TINFO_FLAGS+2),%d0 ++ jne syscall_exit_work /* flags set so process */ ++1: RESTORE_ALL ++ ++syscall_exit_work: ++ btst #5,%sp@(PT_SR) /* check if returning to kernel */ ++ bnes 1b /* if so, skip resched, signals */ ++ ++ btstl #15,%d0 /* check if SYSCALL_TRACE */ ++ jne do_trace_exit ++ btstl #14,%d0 /* check if DELAYED_TRACE */ ++ jne do_delayed_trace ++ btstl #6,%d0 /* check if SIGPENDING */ ++ jne do_signal_return ++ pea resume_userspace ++ jra schedule ++ ++ENTRY(ret_from_exception) ++.Lret_from_exception: ++ btst #5,%sp@(PT_SR) /* check if returning to kernel */ ++ bnes 1f /* if so, skip resched, signals */ ++ movel %d0,%sp@- /* Only allow interrupts when we are */ ++ move %sr,%d0 /* last one on the kernel stack, */ ++ andl #ALLOWINT,%d0 /* otherwise stack overflow can occur */ ++ move %d0,%sr /* during heavy interrupt load. */ ++ movel %sp@+,%d0 ++ ++resume_userspace: ++ moveb %curptr@(TASK_INFO+TINFO_FLAGS+3),%d0 ++ jne exit_work /* SIGPENDING and/or NEED_RESCHED set */ ++1: RESTORE_ALL ++ ++exit_work: ++ /* save top of frame */ ++ movel %sp,%curptr@(TASK_THREAD+THREAD_ESP0) ++ btstl #6,%d0 /* check for SIGPENDING in flags */ ++ jne do_signal_return ++ pea resume_userspace ++ jra schedule ++ ++do_signal_return: ++ subql #4,%sp /* dummy return address */ ++ SAVE_SWITCH_STACK ++ pea %sp@(SWITCH_STACK_SIZE) ++ clrl %sp@- ++ bsrl do_signal ++ addql #8,%sp ++ RESTORE_SWITCH_STACK ++ addql #4,%sp ++ jbra resume_userspace ++ ++do_delayed_trace: ++ bclr #7,%sp@(PT_SR) /* clear trace bit in SR */ ++ pea 1 /* send SIGTRAP */ ++ movel %curptr,%sp@- ++ pea LSIGTRAP ++ jbsr send_sig ++ addql #8,%sp ++ addql #4,%sp ++ jbra resume_userspace ++ ++/* ++ * This is the interrupt handler (for all hardware interrupt ++ * sources). It figures out the vector number and calls the appropriate ++ * interrupt service routine directly. ++ */ ++ENTRY(inthandler) ++ SAVE_ALL_INT ++ GET_CURRENT(%d0) ++ addql #1,%curptr@(TASK_INFO+TINFO_PREEMPT) ++ /* put exception # in d0 */ ++ movel %sp@(PT_VECTOR),%d0 ++ swap %d0 /* extract bits 25:18 */ ++ lsrl #2,%d0 ++ andl #0x0ff,%d0 ++ ++ movel %sp,%sp@- ++ movel %d0,%sp@- /* put vector # on stack */ ++auto_irqhandler_fixup = . + 2 ++ jbsr process_int /* process the IRQ */ ++ addql #8,%sp /* pop parameters off stack */ ++ ++ENTRY(ret_from_interrupt) ++ret_from_interrupt: ++ ++ subql #1,%curptr@(TASK_INFO+TINFO_PREEMPT) ++ jeq ret_from_last_interrupt ++2: RESTORE_ALL ++ ++ ALIGN ++ret_from_last_interrupt: ++ moveb %sp@(PT_SR),%d0 ++ andl #(~ALLOWINT>>8)&0xff,%d0 ++ jne 2b ++ ++ /* check if we need to do software interrupts */ ++ tstl irq_stat+CPUSTAT_SOFTIRQ_PENDING ++ jeq .Lret_from_exception ++ pea ret_from_exception ++ jra do_softirq ++ ++ENTRY(user_inthandler) ++ SAVE_ALL_INT ++ GET_CURRENT(%d0) ++ addql #1,%curptr@(TASK_INFO+TINFO_PREEMPT) ++ /* put exception # in d0 */ ++ movel %sp@(PT_VECTOR),%d0 ++user_irqvec_fixup = . + 2 ++ swap %d0 /* extract bits 25:18 */ ++ lsrl #2,%d0 ++ andl #0x0ff,%d0 ++ ++ movel %sp,%sp@- ++ movel %d0,%sp@- /* put vector # on stack */ ++user_irqhandler_fixup = . + 2 ++ jbsr process_int /* process the IRQ */ ++ addql #8,%sp /* pop parameters off stack */ ++ ++ subql #1,%curptr@(TASK_INFO+TINFO_PREEMPT) ++ jeq ret_from_last_interrupt ++ RESTORE_ALL ++ ++/* Handler for uninitialized and spurious interrupts */ ++ ++ENTRY(bad_inthandler) ++ SAVE_ALL_INT ++ GET_CURRENT(%d0) ++ addql #1,%curptr@(TASK_INFO+TINFO_PREEMPT) ++ ++ movel %sp,%sp@- ++ jsr handle_badint ++ addql #4,%sp ++ ++ subql #1,%curptr@(TASK_INFO+TINFO_PREEMPT) ++ jeq ret_from_last_interrupt ++ RESTORE_ALL ++ ++ENTRY(sys_fork) ++ SAVE_SWITCH_STACK ++ pea %sp@(SWITCH_STACK_SIZE) ++ jbsr m68k_fork ++ addql #4,%sp ++ RESTORE_SWITCH_STACK ++ rts ++ ++ENTRY(sys_clone) ++ SAVE_SWITCH_STACK ++ pea %sp@(SWITCH_STACK_SIZE) ++ jbsr m68k_clone ++ addql #4,%sp ++ RESTORE_SWITCH_STACK ++ rts ++ ++ENTRY(sys_vfork) ++ SAVE_SWITCH_STACK ++ pea %sp@(SWITCH_STACK_SIZE) ++ jbsr m68k_vfork ++ addql #4,%sp ++ RESTORE_SWITCH_STACK ++ rts ++ ++ENTRY(sys_sigsuspend) ++ SAVE_SWITCH_STACK ++ pea %sp@(SWITCH_STACK_SIZE) ++ jbsr do_sigsuspend ++ addql #4,%sp ++ RESTORE_SWITCH_STACK ++ rts ++ ++ENTRY(sys_rt_sigsuspend) ++ SAVE_SWITCH_STACK ++ pea %sp@(SWITCH_STACK_SIZE) ++ jbsr do_rt_sigsuspend ++ addql #4,%sp ++ RESTORE_SWITCH_STACK ++ rts ++ ++ENTRY(sys_sigreturn) ++ SAVE_SWITCH_STACK ++ jbsr do_sigreturn ++ RESTORE_SWITCH_STACK ++ rts ++ ++ENTRY(sys_rt_sigreturn) ++ SAVE_SWITCH_STACK ++ jbsr do_rt_sigreturn ++ RESTORE_SWITCH_STACK ++ rts ++ ++resume: ++ /* ++ * Beware - when entering resume, prev (the current task) is ++ * in a0, next (the new task) is in a1,so don't change these ++ * registers until their contents are no longer needed. ++ */ ++ ++ /* save sr */ ++ movew %sr,%d0 ++ movew %d0,%a0@(TASK_THREAD+THREAD_SR) ++ ++ /* save usp */ ++ /* Save USP via %a1 (which is saved/restored from %d0) */ ++ movel %a1,%d0 ++ movel %usp,%a1 ++ movel %a1,%a0@(TASK_THREAD+THREAD_USP) ++ movel %d0,%a1 ++ ++ /* save non-scratch registers on stack */ ++ SAVE_SWITCH_STACK ++ ++ /* save current kernel stack pointer */ ++ movel %sp,%a0@(TASK_THREAD+THREAD_KSP) ++ ++ /* Return previous task in %d1 */ ++ movel %curptr,%d1 ++ ++ /* switch to new task (a1 contains new task) */ ++ movel %a1,%curptr ++ ++ /* restore the kernel stack pointer */ ++ movel %a1@(TASK_THREAD+THREAD_KSP),%sp ++ ++ /* restore non-scratch registers */ ++ RESTORE_SWITCH_STACK ++ ++ /* restore user stack pointer */ ++ movel %a1@(TASK_THREAD+THREAD_USP),%a0 ++ movel %a0,%usp ++ ++ /* restore status register */ ++ movew %a1@(TASK_THREAD+THREAD_SR),%d0 ++ movew %d0,%sr ++ ++ rts ++ ++.data ++ALIGN ++sys_call_table: ++ .long sys_ni_syscall /* 0 - old "setup()" system call*/ ++ .long sys_exit ++ .long sys_fork ++ .long sys_read ++ .long sys_write ++ .long sys_open /* 5 */ ++ .long sys_close ++ .long sys_waitpid ++ .long sys_creat ++ .long sys_link ++ .long sys_unlink /* 10 */ ++ .long sys_execve ++ .long sys_chdir ++ .long sys_time ++ .long sys_mknod ++ .long sys_chmod /* 15 */ ++ .long sys_chown16 ++ .long sys_ni_syscall /* old break syscall holder */ ++ .long sys_stat ++ .long sys_lseek ++ .long sys_getpid /* 20 */ ++ .long sys_mount ++ .long sys_oldumount ++ .long sys_setuid16 ++ .long sys_getuid16 ++ .long sys_stime /* 25 */ ++ .long sys_ptrace ++ .long sys_alarm ++ .long sys_fstat ++ .long sys_pause ++ .long sys_utime /* 30 */ ++ .long sys_ni_syscall /* old stty syscall holder */ ++ .long sys_ni_syscall /* old gtty syscall holder */ ++ .long sys_access ++ .long sys_nice ++ .long sys_ni_syscall /* 35 */ /* old ftime syscall holder */ ++ .long sys_sync ++ .long sys_kill ++ .long sys_rename ++ .long sys_mkdir ++ .long sys_rmdir /* 40 */ ++ .long sys_dup ++ .long sys_pipe ++ .long sys_times ++ .long sys_ni_syscall /* old prof syscall holder */ ++ .long sys_brk /* 45 */ ++ .long sys_setgid16 ++ .long sys_getgid16 ++ .long sys_signal ++ .long sys_geteuid16 ++ .long sys_getegid16 /* 50 */ ++ .long sys_acct ++ .long sys_umount /* recycled never used phys() */ ++ .long sys_ni_syscall /* old lock syscall holder */ ++ .long sys_ioctl ++ .long sys_fcntl /* 55 */ ++ .long sys_ni_syscall /* old mpx syscall holder */ ++ .long sys_setpgid ++ .long sys_ni_syscall /* old ulimit syscall holder */ ++ .long sys_ni_syscall ++ .long sys_umask /* 60 */ ++ .long sys_chroot ++ .long sys_ustat ++ .long sys_dup2 ++ .long sys_getppid ++ .long sys_getpgrp /* 65 */ ++ .long sys_setsid ++ .long sys_sigaction ++ .long sys_sgetmask ++ .long sys_ssetmask ++ .long sys_setreuid16 /* 70 */ ++ .long sys_setregid16 ++ .long sys_sigsuspend ++ .long sys_sigpending ++ .long sys_sethostname ++ .long sys_setrlimit /* 75 */ ++ .long sys_old_getrlimit ++ .long sys_getrusage ++ .long sys_gettimeofday ++ .long sys_settimeofday ++ .long sys_getgroups16 /* 80 */ ++ .long sys_setgroups16 ++ .long old_select ++ .long sys_symlink ++ .long sys_lstat ++ .long sys_readlink /* 85 */ ++ .long sys_uselib ++ .long sys_swapon ++ .long sys_reboot ++ .long old_readdir ++ .long old_mmap /* 90 */ ++ .long sys_munmap ++ .long sys_truncate ++ .long sys_ftruncate ++ .long sys_fchmod ++ .long sys_fchown16 /* 95 */ ++ .long sys_getpriority ++ .long sys_setpriority ++ .long sys_ni_syscall /* old profil syscall holder */ ++ .long sys_statfs ++ .long sys_fstatfs /* 100 */ ++ .long sys_ni_syscall /* ioperm for i386 */ ++ .long sys_socketcall ++ .long sys_syslog ++ .long sys_setitimer ++ .long sys_getitimer /* 105 */ ++ .long sys_newstat ++ .long sys_newlstat ++ .long sys_newfstat ++ .long sys_ni_syscall ++ .long sys_ni_syscall /* 110 */ /* iopl for i386 */ ++ .long sys_vhangup ++ .long sys_ni_syscall /* obsolete idle() syscall */ ++ .long sys_ni_syscall /* vm86old for i386 */ ++ .long sys_wait4 ++ .long sys_swapoff /* 115 */ ++ .long sys_sysinfo ++ .long sys_ipc ++ .long sys_fsync ++ .long sys_sigreturn ++ .long sys_clone /* 120 */ ++ .long sys_setdomainname ++ .long sys_newuname ++ .long sys_cacheflush /* modify_ldt for i386 */ ++ .long sys_adjtimex ++ .long sys_mprotect /* 125 */ ++ .long sys_sigprocmask ++ .long sys_ni_syscall /* old "create_module" */ ++ .long sys_init_module ++ .long sys_delete_module ++ .long sys_ni_syscall /* 130 - old "get_kernel_syms" */ ++ .long sys_quotactl ++ .long sys_getpgid ++ .long sys_fchdir ++ .long sys_bdflush ++ .long sys_sysfs /* 135 */ ++ .long sys_personality ++ .long sys_ni_syscall /* for afs_syscall */ ++ .long sys_setfsuid16 ++ .long sys_setfsgid16 ++ .long sys_llseek /* 140 */ ++ .long sys_getdents ++ .long sys_select ++ .long sys_flock ++ .long sys_msync ++ .long sys_readv /* 145 */ ++ .long sys_writev ++ .long sys_getsid ++ .long sys_fdatasync ++ .long sys_sysctl ++ .long sys_mlock /* 150 */ ++ .long sys_munlock ++ .long sys_mlockall ++ .long sys_munlockall ++ .long sys_sched_setparam ++ .long sys_sched_getparam /* 155 */ ++ .long sys_sched_setscheduler ++ .long sys_sched_getscheduler ++ .long sys_sched_yield ++ .long sys_sched_get_priority_max ++ .long sys_sched_get_priority_min /* 160 */ ++ .long sys_sched_rr_get_interval ++ .long sys_nanosleep ++ .long sys_mremap ++ .long sys_setresuid16 ++ .long sys_getresuid16 /* 165 */ ++ .long sys_getpagesize ++ .long sys_ni_syscall /* old sys_query_module */ ++ .long sys_poll ++ .long sys_nfsservctl ++ .long sys_setresgid16 /* 170 */ ++ .long sys_getresgid16 ++ .long sys_prctl ++ .long sys_rt_sigreturn ++ .long sys_rt_sigaction ++ .long sys_rt_sigprocmask /* 175 */ ++ .long sys_rt_sigpending ++ .long sys_rt_sigtimedwait ++ .long sys_rt_sigqueueinfo ++ .long sys_rt_sigsuspend ++ .long sys_pread64 /* 180 */ ++ .long sys_pwrite64 ++ .long sys_lchown16; ++ .long sys_getcwd ++ .long sys_capget ++ .long sys_capset /* 185 */ ++ .long sys_sigaltstack ++ .long sys_sendfile ++ .long sys_ni_syscall /* streams1 */ ++ .long sys_ni_syscall /* streams2 */ ++ .long sys_vfork /* 190 */ ++ .long sys_getrlimit ++ .long sys_mmap2 ++ .long sys_truncate64 ++ .long sys_ftruncate64 ++ .long sys_stat64 /* 195 */ ++ .long sys_lstat64 ++ .long sys_fstat64 ++ .long sys_chown ++ .long sys_getuid ++ .long sys_getgid /* 200 */ ++ .long sys_geteuid ++ .long sys_getegid ++ .long sys_setreuid ++ .long sys_setregid ++ .long sys_getgroups /* 205 */ ++ .long sys_setgroups ++ .long sys_fchown ++ .long sys_setresuid ++ .long sys_getresuid ++ .long sys_setresgid /* 210 */ ++ .long sys_getresgid ++ .long sys_lchown ++ .long sys_setuid ++ .long sys_setgid ++ .long sys_setfsuid /* 215 */ ++ .long sys_setfsgid ++ .long sys_pivot_root ++ .long sys_ni_syscall ++ .long sys_ni_syscall ++ .long sys_getdents64 /* 220 */ ++ .long sys_gettid ++ .long sys_tkill ++ .long sys_setxattr ++ .long sys_lsetxattr ++ .long sys_fsetxattr /* 225 */ ++ .long sys_getxattr ++ .long sys_lgetxattr ++ .long sys_fgetxattr ++ .long sys_listxattr ++ .long sys_llistxattr /* 230 */ ++ .long sys_flistxattr ++ .long sys_removexattr ++ .long sys_lremovexattr ++ .long sys_fremovexattr ++ .long sys_futex /* 235 */ ++ .long sys_sendfile64 ++ .long sys_mincore ++ .long sys_madvise ++ .long sys_fcntl64 ++ .long sys_readahead /* 240 */ ++ .long sys_io_setup ++ .long sys_io_destroy ++ .long sys_io_getevents ++ .long sys_io_submit ++ .long sys_io_cancel /* 245 */ ++ .long sys_fadvise64 ++ .long sys_exit_group ++ .long sys_lookup_dcookie ++ .long sys_epoll_create ++ .long sys_epoll_ctl /* 250 */ ++ .long sys_epoll_wait ++ .long sys_remap_file_pages ++ .long sys_set_tid_address ++ .long sys_timer_create ++ .long sys_timer_settime /* 255 */ ++ .long sys_timer_gettime ++ .long sys_timer_getoverrun ++ .long sys_timer_delete ++ .long sys_clock_settime ++ .long sys_clock_gettime /* 260 */ ++ .long sys_clock_getres ++ .long sys_clock_nanosleep ++ .long sys_statfs64 ++ .long sys_fstatfs64 ++ .long sys_tgkill /* 265 */ ++ .long sys_utimes ++ .long sys_fadvise64_64 ++ .long sys_mbind ++ .long sys_get_mempolicy ++ .long sys_set_mempolicy /* 270 */ ++ .long sys_mq_open ++ .long sys_mq_unlink ++ .long sys_mq_timedsend ++ .long sys_mq_timedreceive ++ .long sys_mq_notify /* 275 */ ++ .long sys_mq_getsetattr ++ .long sys_waitid ++ .long sys_ni_syscall /* for sys_vserver */ ++ .long sys_add_key ++ .long sys_request_key /* 280 */ ++ .long sys_keyctl ++ .long sys_ioprio_set ++ .long sys_ioprio_get ++ .long sys_inotify_init ++ .long sys_inotify_add_watch /* 285 */ ++ .long sys_inotify_rm_watch ++ .long sys_migrate_pages ++ .long sys_openat ++ .long sys_mkdirat ++ .long sys_mknodat /* 290 */ ++ .long sys_fchownat ++ .long sys_futimesat ++ .long sys_fstatat64 ++ .long sys_unlinkat ++ .long sys_renameat /* 295 */ ++ .long sys_linkat ++ .long sys_symlinkat ++ .long sys_readlinkat ++ .long sys_fchmodat ++ .long sys_faccessat /* 300 */ ++ .long sys_ni_syscall /* Reserved for pselect6 */ ++ .long sys_ni_syscall /* Reserved for ppoll */ ++ .long sys_unshare ++ .long sys_set_robust_list ++ .long sys_get_robust_list /* 305 */ ++ .long sys_splice ++ .long sys_sync_file_range ++ .long sys_tee ++ .long sys_vmsplice ++ .long sys_move_pages /* 310 */ ++ +--- /dev/null ++++ b/arch/m68k/coldfire/head.S +@@ -0,0 +1,474 @@ ++/* ++ * head.S is the MMU enabled ColdFire specific initial boot code ++ * ++ * Ported to ColdFire by ++ * Matt Waddel Matt.Waddel@freescale.com ++ * Kurt Mahan kmahan@freescale.com ++ * Copyright Freescale Semiconductor, Inc. 2007 ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * Parts of this code came from arch/m68k/kernel/head.S ++ */ ++#include <linux/linkage.h> ++#include <linux/init.h> ++#include <asm/bootinfo.h> ++#include <asm/setup.h> ++#include <asm/entry.h> ++#include <asm/pgtable.h> ++#include <asm/page.h> ++#include <asm/coldfire.h> ++#include <asm/mcfuart.h> ++#include <asm/cfcache.h> ++ ++#define DEBUG ++ ++.globl kernel_pg_dir ++.globl availmem ++.globl set_context ++.globl set_fpga ++ ++#ifdef DEBUG ++/* When debugging use readable names for labels */ ++#ifdef __STDC__ ++#define L(name) .head.S.##name ++#else ++#define L(name) .head.S./**/name ++#endif ++#else ++#ifdef __STDC__ ++#define L(name) .L##name ++#else ++#define L(name) .L/**/name ++#endif ++#endif ++ ++/* The __INITDATA stuff is a no-op when ftrace or kgdb are turned on */ ++#ifndef __INITDATA ++#define __INITDATA .data ++#define __FINIT .previous ++#endif ++ ++/* ++ * Setup ACR mappings to provide the following memory map: ++ * Data ++ * 0xA0000000 -> 0xAFFFFFFF [0] NO CACHE / PRECISE / SUPER ONLY ++ * 0xFC000000 -> 0xFCFFFFFF [1] NO CACHE / PRECISE / SUPER ONLY ++ * Code ++ * None currently (mapped via TLBs) ++ */ ++ ++#define ACR0_DEFAULT #0xA00FA048 /* ACR0 default value */ ++#define ACR1_DEFAULT #0xFC00A040 /* ACR1 default value */ ++#define ACR2_DEFAULT #0x00000000 /* ACR2 default value */ ++#define ACR3_DEFAULT #0x00000000 /* ACR3 default value */ ++ ++/* ACR mapping for FPGA (maps 0) */ ++#define ACR0_FPGA #0x000FA048 /* ACR0 enable FPGA */ ++ ++/* Several macros to make the writing of subroutines easier: ++ * - func_start marks the beginning of the routine which setups the frame ++ * register and saves the registers, it also defines another macro ++ * to automatically restore the registers again. ++ * - func_return marks the end of the routine and simply calls the prepared ++ * macro to restore registers and jump back to the caller. ++ * - func_define generates another macro to automatically put arguments ++ * onto the stack call the subroutine and cleanup the stack again. ++ */ ++ ++.macro load_symbol_address symbol,register ++ movel #\symbol,\register ++.endm ++ ++.macro func_start name,saveregs,savesize,stack=0 ++L(\name): ++ linkw %a6,#-\stack ++ subal #(\savesize),%sp ++ moveml \saveregs,%sp@ ++.set stackstart,-\stack ++ ++.macro func_return_\name ++ moveml %sp@,\saveregs ++ addal #(\savesize),%sp ++ unlk %a6 ++ rts ++.endm ++.endm ++ ++.macro func_return name ++ func_return_\name ++.endm ++ ++.macro func_call name ++ jbsr L(\name) ++.endm ++ ++.macro move_stack nr,arg1,arg2,arg3,arg4 ++.if \nr ++ move_stack "(\nr-1)",\arg2,\arg3,\arg4 ++ movel \arg1,%sp@- ++.endif ++.endm ++ ++.macro func_define name,nr=0 ++.macro \name arg1,arg2,arg3,arg4 ++ move_stack \nr,\arg1,\arg2,\arg3,\arg4 ++ func_call \name ++.if \nr ++ lea %sp@(\nr*4),%sp ++.endif ++.endm ++.endm ++ ++func_define serial_putc,1 ++ ++.macro putc ch ++ pea \ch ++ func_call serial_putc ++ addql #4,%sp ++.endm ++ ++.macro dputc ch ++#ifdef DEBUG ++ putc \ch ++#endif ++.endm ++ ++func_define putn,1 ++ ++.macro dputn nr ++#ifdef DEBUG ++ putn \nr ++#endif ++.endm ++ ++/* ++ mmu_map - creates a new TLB entry ++ ++ virt_addr Must be on proper boundary ++ phys_addr Must be on proper boundary ++ itlb MMUOR_ITLB if instruction TLB or 0 ++ asid address space ID ++ shared_global MMUTR_SG if shared between different ASIDs or 0 ++ size_code MMUDR_SZ1M 1 MB ++ MMUDR_SZ4K 4 KB ++ MMUDR_SZ8K 8 KB ++ MMUDR_SZ16M 16 MB ++ cache_mode MMUDR_INC instruction non-cacheable ++ MMUDR_IC instruction cacheable ++ MMUDR_DWT data writethrough ++ MMUDR_DCB data copyback ++ MMUDR_DNCP data non-cacheable, precise ++ MMUDR_DNCIP data non-cacheable, imprecise ++ super_prot MMUDR_SP if user mode generates exception or 0 ++ readable MMUDR_R if permits read access (data TLB) or 0 ++ writable MMUDR_W if permits write access (data TLB) or 0 ++ executable MMUDR_X if permits execute access (instruction TLB) or 0 ++ locked MMUDR_LK prevents TLB entry from being replaced or 0 ++ temp_data_reg a data register to use for temporary values ++*/ ++.macro mmu_map virt_addr,phys_addr,itlb,asid,shared_global,size_code,cache_mode,super_prot,readable,writable,executable,locked,temp_data_reg ++ /* Set up search of TLB. */ ++ movel #(\virt_addr+1), \temp_data_reg ++ movel \temp_data_reg, MMUAR ++ /* Search. */ ++ movel #(MMUOR_STLB + MMUOR_ADR +\itlb), \temp_data_reg ++ movew \temp_data_reg, (MMUOR) ++ /* Set up tag value. */ ++ movel #(\virt_addr + \asid + \shared_global + MMUTR_V), \temp_data_reg ++ movel \temp_data_reg, MMUTR ++ /* Set up data value. */ ++ movel #(\phys_addr + \size_code + \cache_mode + \super_prot + \readable + \writable + \executable + \locked), \temp_data_reg ++ movel \temp_data_reg, MMUDR ++ /* Save it. */ ++ movel #(MMUOR_ACC + MMUOR_UAA + \itlb), \temp_data_reg ++ movew \temp_data_reg, (MMUOR) ++.endm /* mmu_map */ ++ ++.macro mmu_unmap virt_addr,itlb,temp_data_reg ++ /* Set up search of TLB. */ ++ movel #(\virt_addr+1), \temp_data_reg ++ movel \temp_data_reg, MMUAR ++ /* Search. */ ++ movel #(MMUOR_STLB + MMUOR_ADR +\itlb), \temp_data_reg ++ movew \temp_data_reg, (MMUOR) ++ /* Test for hit. */ ++ movel MMUSR,\temp_data_reg ++ btst #MMUSR_HITN,\temp_data_reg ++ beq 1f ++ /* Read the TLB. */ ++ movel #(MMUOR_RW + MMUOR_ACC +\itlb), \temp_data_reg ++ movew \temp_data_reg, (MMUOR) ++ movel MMUSR,\temp_data_reg ++ /* Set up tag value. */ ++ movel #0, \temp_data_reg ++ movel \temp_data_reg, MMUTR ++ /* Set up data value. */ ++ movel #0, \temp_data_reg ++ movel \temp_data_reg, MMUDR ++ /* Save it. */ ++ movel #(MMUOR_ACC + MMUOR_UAA + \itlb), \temp_data_reg ++ movew \temp_data_reg, (MMUOR) ++1: ++.endm /* mmu_unmap */ ++ ++/* .text */ ++.section ".text.head","ax" ++ENTRY(_stext) ++/* Version numbers of the bootinfo interface -- if we later pass info ++ * from boot ROM we might want to put something real here. ++ * ++ * The area from _stext to _start will later be used as kernel pointer table ++ */ ++ bras 1f /* Jump over bootinfo version numbers */ ++ ++ .long BOOTINFOV_MAGIC ++ .long 0 ++1: jmp __start-0x80000000 ++ ++.equ kernel_pg_dir,_stext ++.equ .,_stext+0x1000 ++ ++ENTRY(_start) ++ jra __start ++__INIT ++ENTRY(__start) ++ ++/* Save the location of u-boot info - cmd line, bd_info, etc. */ ++ movel %a7,%a4 /* Don't use %a4 before cf_early_init */ ++ addl #0x80000004,%a4 /* 0x80000004= 1 stack push + high mem offset */ ++ ++/* Setup initial stack pointer */ ++ movel #0x40001000,%sp ++ ++/* Clear usp */ ++ subl %a0,%a0 ++ movel %a0,%usp ++ ++ movel #(MCF_RAMBAR1 + 0x221), %d0 ++ movec %d0, %rambar1 ++ movew #0x2700,%sr ++ ++ movel #(MMU_BASE+1),%d0 ++ movecl %d0,%mmubar ++ movel #MMUOR_CA,%a0 /* Clear tlb entries */ ++ movew %a0,(MMUOR) ++ movel #(MMUOR_CA + MMUOR_ITLB),%a0 /* Use ITLB for searches */ ++ movew %a0,(MMUOR) ++ movel #0,%a0 /* Clear Addr Space User ID */ ++ movecl %a0,%asid ++ ++/* setup ACRs */ ++ movel ACR0_DEFAULT, %d0 /* ACR0 (DATA) setup */ ++ movec %d0, %acr0 ++ movel ACR1_DEFAULT, %d0 /* ACR1 (DATA) setup */ ++ movec %d0, %acr1 ++ movel ACR2_DEFAULT, %d0 /* ACR2 (CODE) setup */ ++ movec %d0, %acr2 ++ movel ACR3_DEFAULT, %d0 /* ACR3 (CODE) setup */ ++ movec %d0, %acr3 ++ ++ /* If you change the memory size to another value make a matching ++ change in paging_init(cf-mmu.c) to zones_size[]. */ ++ ++ /* Map 256MB as code */ ++ mmu_map (PAGE_OFFSET+0*0x1000000), (PHYS_OFFSET+0*0x1000000), \ ++ MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC, MMUDR_SP, \ ++ 0, 0, MMUDR_X, MMUDR_LK, %d0 ++ mmu_map (PAGE_OFFSET+1*0x1000000), (PHYS_OFFSET+1*0x1000000), \ ++ MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC, MMUDR_SP, \ ++ 0, 0, MMUDR_X, MMUDR_LK, %d0 ++ mmu_map (PAGE_OFFSET+2*0x1000000), (PHYS_OFFSET+2*0x1000000), \ ++ MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC, MMUDR_SP, \ ++ 0, 0, MMUDR_X, MMUDR_LK, %d0 ++ mmu_map (PAGE_OFFSET+3*0x1000000), (PHYS_OFFSET+3*0x1000000), \ ++ MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC, MMUDR_SP, \ ++ 0, 0, MMUDR_X, MMUDR_LK, %d0 ++ mmu_map (PAGE_OFFSET+4*0x1000000), (PHYS_OFFSET+4*0x1000000), \ ++ MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC, MMUDR_SP, \ ++ 0, 0, MMUDR_X, MMUDR_LK, %d0 ++ mmu_map (PAGE_OFFSET+5*0x1000000), (PHYS_OFFSET+5*0x1000000), \ ++ MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC, MMUDR_SP, \ ++ 0, 0, MMUDR_X, MMUDR_LK, %d0 ++ mmu_map (PAGE_OFFSET+6*0x1000000), (PHYS_OFFSET+6*0x1000000), \ ++ MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC, MMUDR_SP, \ ++ 0, 0, MMUDR_X, MMUDR_LK, %d0 ++ mmu_map (PAGE_OFFSET+7*0x1000000), (PHYS_OFFSET+7*0x1000000), \ ++ MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC, MMUDR_SP, \ ++ 0, 0, MMUDR_X, MMUDR_LK, %d0 ++ mmu_map (PAGE_OFFSET+8*0x1000000), (PHYS_OFFSET+8*0x1000000), \ ++ MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC, MMUDR_SP, \ ++ 0, 0, MMUDR_X, MMUDR_LK, %d0 ++ mmu_map (PAGE_OFFSET+9*0x1000000), (PHYS_OFFSET+9*0x1000000), \ ++ MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC, MMUDR_SP, \ ++ 0, 0, MMUDR_X, MMUDR_LK, %d0 ++ mmu_map (PAGE_OFFSET+10*0x1000000), (PHYS_OFFSET+10*0x1000000), \ ++ MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC, MMUDR_SP, \ ++ 0, 0, MMUDR_X, MMUDR_LK, %d0 ++ mmu_map (PAGE_OFFSET+11*0x1000000), (PHYS_OFFSET+11*0x1000000), \ ++ MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC, MMUDR_SP, \ ++ 0, 0, MMUDR_X, MMUDR_LK, %d0 ++ mmu_map (PAGE_OFFSET+12*0x1000000), (PHYS_OFFSET+12*0x1000000), \ ++ MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC, MMUDR_SP, \ ++ 0, 0, MMUDR_X, MMUDR_LK, %d0 ++ mmu_map (PAGE_OFFSET+13*0x1000000), (PHYS_OFFSET+13*0x1000000), \ ++ MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC, MMUDR_SP, \ ++ 0, 0, MMUDR_X, MMUDR_LK, %d0 ++ mmu_map (PAGE_OFFSET+14*0x1000000), (PHYS_OFFSET+14*0x1000000), \ ++ MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC, MMUDR_SP, \ ++ 0, 0, MMUDR_X, MMUDR_LK, %d0 ++ mmu_map (PAGE_OFFSET+15*0x1000000), (PHYS_OFFSET+15*0x1000000), \ ++ MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC, MMUDR_SP, \ ++ 0, 0, MMUDR_X, MMUDR_LK, %d0 ++ ++ /* Map 256MB as data also */ ++ mmu_map (PAGE_OFFSET+0*0x1000000), (PHYS_OFFSET+0*0x1000000), 0, 0, \ ++ MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \ ++ 0, MMUDR_LK, %d0 ++ mmu_map (PAGE_OFFSET+1*0x1000000), (PHYS_OFFSET+1*0x1000000), 0, 0, \ ++ MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \ ++ 0, MMUDR_LK, %d0 ++ mmu_map (PAGE_OFFSET+2*0x1000000), (PHYS_OFFSET+2*0x1000000), 0, 0, \ ++ MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \ ++ 0, MMUDR_LK, %d0 ++ mmu_map (PAGE_OFFSET+3*0x1000000), (PHYS_OFFSET+3*0x1000000), 0, 0, \ ++ MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \ ++ 0, MMUDR_LK, %d0 ++ mmu_map (PAGE_OFFSET+4*0x1000000), (PHYS_OFFSET+4*0x1000000), 0, 0, \ ++ MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \ ++ 0, MMUDR_LK, %d0 ++ mmu_map (PAGE_OFFSET+5*0x1000000), (PHYS_OFFSET+5*0x1000000), 0, 0, \ ++ MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \ ++ 0, MMUDR_LK, %d0 ++ mmu_map (PAGE_OFFSET+6*0x1000000), (PHYS_OFFSET+6*0x1000000), 0, 0, \ ++ MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \ ++ 0, MMUDR_LK, %d0 ++ mmu_map (PAGE_OFFSET+7*0x1000000), (PHYS_OFFSET+7*0x1000000), 0, 0, \ ++ MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \ ++ 0, MMUDR_LK, %d0 ++ mmu_map (PAGE_OFFSET+8*0x1000000), (PHYS_OFFSET+8*0x1000000), 0, 0, \ ++ MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \ ++ 0, MMUDR_LK, %d0 ++ mmu_map (PAGE_OFFSET+9*0x1000000), (PHYS_OFFSET+9*0x1000000), 0, 0, \ ++ MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \ ++ 0, MMUDR_LK, %d0 ++ mmu_map (PAGE_OFFSET+10*0x1000000), (PHYS_OFFSET+10*0x1000000), 0, 0, \ ++ MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \ ++ 0, MMUDR_LK, %d0 ++ mmu_map (PAGE_OFFSET+11*0x1000000), (PHYS_OFFSET+11*0x1000000), 0, 0, \ ++ MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \ ++ 0, MMUDR_LK, %d0 ++ mmu_map (PAGE_OFFSET+12*0x1000000), (PHYS_OFFSET+12*0x1000000), 0, 0, \ ++ MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \ ++ 0, MMUDR_LK, %d0 ++ mmu_map (PAGE_OFFSET+13*0x1000000), (PHYS_OFFSET+13*0x1000000), 0, 0, \ ++ MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \ ++ 0, MMUDR_LK, %d0 ++ mmu_map (PAGE_OFFSET+14*0x1000000), (PHYS_OFFSET+14*0x1000000), 0, 0, \ ++ MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \ ++ 0, MMUDR_LK, %d0 ++ mmu_map (PAGE_OFFSET+15*0x1000000), (PHYS_OFFSET+15*0x1000000), 0, 0, \ ++ MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \ ++ 0, MMUDR_LK, %d0 ++ ++ /* Do unity mapping to enable the MMU. Map first 16 MB in place as ++ code (delete TLBs after MMU is enabled and we are executing in high ++ memory). */ ++ mmu_map (PHYS_OFFSET+0*0x1000000), (PHYS_OFFSET+0*0x1000000), \ ++ MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_INC, MMUDR_SP, 0, \ ++ 0, MMUDR_X, 0, %d0 ++ /* Map first 16 MB as data too. */ ++ mmu_map (PHYS_OFFSET+0*0x1000000), (PHYS_OFFSET+0*0x1000000), 0, 0, \ ++ MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \ ++ 0, 0, %d0 ++ ++ /* Turn on MMU */ ++ movel #(MMUCR_EN),%a0 ++ movel %a0,MMUCR ++ nop /* This synchs the pipeline after a write to MMUCR */ ++ ++ movel #__running_high,%a0 /* Get around PC-relative addressing. */ ++ jmp %a0@ ++ ++ENTRY(__running_high) ++ load_symbol_address _stext,%sp ++ movel L(memory_start),%a0 ++ movel %a0,availmem ++ load_symbol_address L(phys_kernel_start),%a0 ++ load_symbol_address _stext,%a1 ++ subl #_stext,%a1 ++ addl #PAGE_OFFSET,%a1 ++ movel %a1,%a0@ ++ ++ /* Unmap first 16 MB, code and data. */ ++ mmu_unmap (PHYS_OFFSET+0*0x1000000), MMUOR_ITLB, %d0 ++ mmu_unmap (PHYS_OFFSET+0*0x1000000), 0, %d0 ++ ++/* Setup initial stack pointer */ ++ lea init_task,%a2 ++ lea init_thread_union+THREAD_SIZE,%sp ++ subl %a6,%a6 /* clear a6 for gdb */ ++ ++#ifdef CONFIG_MCF_USER_HALT ++/* Setup debug control reg to allow halts from user space */ ++ lea wdbg_uhe,%a0 ++ wdebug (%a0) ++#endif ++ ++ movel %a4,uboot_info_stk /* save uboot info to variable */ ++ jsr cf_early_init ++ jmp start_kernel ++ ++.section ".text.head","ax" ++set_context: ++func_start set_context,%d0,(1*4) ++ movel 12(%sp),%d0 ++ movec %d0,%asid ++func_return set_context ++ ++/* ++ * set_fpga(addr,val) ++ * ++ * Map in 0x00000000 -> 0x0fffffff and then do the write. ++ */ ++set_fpga: ++ movew %sr,%d1 ++ movew #0x2700,%sr ++ movel ACR0_FPGA, %d0 ++ movec %d0, %acr0 ++ nop ++ moveal 4(%sp),%a0 ++ movel 8(%sp),%a0@ ++ movel ACR0_DEFAULT, %d0 ++ movec %d0, %acr0 ++ nop ++ movew %d1,%sr ++ rts ++ ++ .data ++ .align 4 ++ ++availmem: ++ .long 0 ++L(phys_kernel_start): ++ .long PAGE_OFFSET ++L(kernel_end): ++ .long 0 ++L(memory_start): ++ .long PAGE_OFFSET_RAW ++ ++#ifdef CONFIG_MCF_USER_HALT ++/* ++ * Enable User Halt Enable in the debug control register. ++ */ ++wdbg_uhe: ++ .word 0x2c80 /* DR0 */ ++ .word 0x00b0 /* 31:16 */ ++ .word 0x0400 /* 15:0 -- enable UHE */ ++ .word 0x0000 /* unused */ ++#endif ++ ++ +--- /dev/null ++++ b/arch/m68k/coldfire/ints.c +@@ -0,0 +1,384 @@ ++/* ++ * linux/arch/m68k/coldfire/ints.c -- General interrupt handling code ++ * ++ * Copyright (C) 1999-2002 Greg Ungerer (gerg@snapgear.com) ++ * Copyright (C) 1998 D. Jeff Dionne <jeff@lineo.ca>, ++ * Kenneth Albanowski <kjahds@kjahds.com>, ++ * Copyright (C) 2000 Lineo Inc. (www.lineo.com) ++ * Matt Waddel Matt.Waddel@freescale.com ++ * Copyright Freescale Semiconductor, Inc. 2007 ++ * Kurt Mahan kmahan@freescale.com ++ * ++ * Based on: ++ * linux/arch/m68k/kernel/ints.c & ++ * linux/arch/m68knommu/5307/ints.c ++ * ++ * This file is subject to the terms and conditions of the GNU General Public ++ * License. See the file COPYING in the main directory of this archive ++ * for more details. ++ */ ++ ++#include <linux/module.h> ++#include <linux/types.h> ++#include <linux/init.h> ++#include <linux/sched.h> ++#include <linux/kernel_stat.h> ++#include <linux/errno.h> ++#include <linux/seq_file.h> ++#include <linux/interrupt.h> ++ ++#include <asm/system.h> ++#include <asm/irq.h> ++#include <asm/traps.h> ++#include <asm/page.h> ++#include <asm/machdep.h> ++#include <asm/irq_regs.h> ++ ++#include <asm/mcfsim.h> ++ ++/* ++ * IRQ Handler lists. ++ */ ++static struct irq_node *irq_list[SYS_IRQS]; ++static struct irq_controller *irq_controller[SYS_IRQS]; ++static int irq_depth[SYS_IRQS]; ++ ++/* ++ * IRQ Controller ++ */ ++#ifdef CONFIG_M54455 ++void m5445x_irq_enable(unsigned int irq); ++void m5445x_irq_disable(unsigned int irq); ++static struct irq_controller m5445x_irq_controller = { ++ .name = "M5445X", ++ .lock = SPIN_LOCK_UNLOCKED, ++ .enable = m5445x_irq_enable, ++ .disable = m5445x_irq_disable, ++}; ++#endif ++ ++#define POOL_SIZE SYS_IRQS ++static struct irq_node pool[POOL_SIZE]; ++static struct irq_node *get_irq_node(void); ++ ++/* The number of spurious interrupts */ ++unsigned int num_spurious; ++asmlinkage void handle_badint(struct pt_regs *regs); ++ ++/* ++ * void init_IRQ(void) ++ * ++ * This function should be called during kernel startup to initialize ++ * the IRQ handling routines. ++ */ ++void __init init_IRQ(void) ++{ ++ int i; ++ ++#ifdef CONFIG_M54455 ++ for (i = 0; i < SYS_IRQS; i++) ++ irq_controller[i] = &m5445x_irq_controller; ++#endif ++} ++ ++/* ++ * process_int(unsigned long vec, struct pt_regs *fp) ++ * ++ * Process an interrupt. Called from entry.S. ++ */ ++asmlinkage void process_int(unsigned long vec, struct pt_regs *fp) ++{ ++ struct pt_regs *old_regs; ++ struct irq_node *node; ++ old_regs = set_irq_regs(fp); ++ kstat_cpu(0).irqs[vec]++; ++ ++ node = irq_list[vec]; ++ if (!node) ++ handle_badint(fp); ++ else { ++ do { ++ node->handler(vec, node->dev_id); ++ node = node->next; ++ } while (node); ++ } ++ ++ set_irq_regs(old_regs); ++} ++ ++/* ++ * show_interrupts( struct seq_file *p, void *v) ++ * ++ * Called to show all the current interrupt information. ++ */ ++int show_interrupts(struct seq_file *p, void *v) ++{ ++ struct irq_controller *contr; ++ struct irq_node *node; ++ int i = *(loff_t *) v; ++ ++ if ((i < NR_IRQS) && (irq_list[i])) { ++ contr = irq_controller[i]; ++ node = irq_list[i]; ++ seq_printf(p, "%-8s %3u: %10u %s", contr->name, i, ++ kstat_cpu(0).irqs[i], node->devname); ++ while ((node = node->next)) ++ seq_printf(p, ", %s", node->devname); ++ ++ seq_printf(p, "\n"); ++ } ++ ++ return 0; ++} ++ ++/* ++ * get_irq_node(void) ++ * ++ * Get an irq node from the pool. ++ */ ++struct irq_node *get_irq_node(void) ++{ ++ struct irq_node *p = pool; ++ int i; ++ ++ for (i = 0; i < POOL_SIZE; i++, p++) { ++ if (!p->handler) { ++ memset(p, 0, sizeof(struct irq_node)); ++ return p; ++ } ++ } ++ printk(KERN_INFO "%s(%s:%d): No more irq nodes, I suggest you \ ++ increase POOL_SIZE", __FUNCTION__, __FILE__, __LINE__); ++ return NULL; ++} ++ ++void init_irq_proc(void) ++{ ++ /* Insert /proc/irq driver here */ ++} ++ ++int setup_irq(unsigned int irq, struct irq_node *node) ++{ ++ struct irq_controller *contr; ++ struct irq_node **prev; ++ unsigned long flags; ++ ++ if (irq >= NR_IRQS || !irq_controller[irq]) { ++ printk("%s: Incorrect IRQ %d from %s\n", ++ __FUNCTION__, irq, node->devname); ++ return -ENXIO; ++ } ++ ++ contr = irq_controller[irq]; ++ spin_lock_irqsave(&contr->lock, flags); ++ ++ prev = irq_list + irq; ++ if (*prev) { ++ /* Can't share interrupts unless both agree to */ ++ if (!((*prev)->flags & node->flags & IRQF_SHARED)) { ++ spin_unlock_irqrestore(&contr->lock, flags); ++ return -EBUSY; ++ } ++ while (*prev) ++ prev = &(*prev)->next; ++ } ++ ++ if (!irq_list[irq]) { ++ if (contr->startup) ++ contr->startup(irq); ++ else ++ contr->enable(irq); ++ } ++ node->next = NULL; ++ *prev = node; ++ ++ spin_unlock_irqrestore(&contr->lock, flags); ++ ++ return 0; ++} ++ ++int request_irq(unsigned int irq, ++ irq_handler_t handler, ++ unsigned long flags, const char *devname, void *dev_id) ++{ ++ struct irq_node *node = get_irq_node(); ++ int res; ++ ++ if (!node) ++ return -ENOMEM; ++ ++ node->handler = handler; ++ node->flags = flags; ++ node->dev_id = dev_id; ++ node->devname = devname; ++ ++ res = setup_irq(irq, node); ++ if (res) ++ node->handler = NULL; ++ ++ return res; ++} ++EXPORT_SYMBOL(request_irq); ++ ++void free_irq(unsigned int irq, void *dev_id) ++{ ++ struct irq_controller *contr; ++ struct irq_node **p, *node; ++ unsigned long flags; ++ ++ if (irq >= NR_IRQS || !irq_controller[irq]) { ++ printk(KERN_DEBUG "%s: Incorrect IRQ %d\n", __FUNCTION__, irq); ++ return; ++ } ++ ++ contr = irq_controller[irq]; ++ spin_lock_irqsave(&contr->lock, flags); ++ ++ p = irq_list + irq; ++ while ((node = *p)) { ++ if (node->dev_id == dev_id) ++ break; ++ p = &node->next; ++ } ++ ++ if (node) { ++ *p = node->next; ++ node->handler = NULL; ++ } else ++ printk(KERN_DEBUG "%s: Removing probably wrong IRQ %d\n", ++ __FUNCTION__, irq); ++ ++ if (!irq_list[irq]) { ++ if (contr->shutdown) ++ contr->shutdown(irq); ++ else ++ contr->disable(irq); ++ } ++ ++ spin_unlock_irqrestore(&contr->lock, flags); ++} ++EXPORT_SYMBOL(free_irq); ++ ++void enable_irq(unsigned int irq) ++{ ++ struct irq_controller *contr; ++ unsigned long flags; ++ ++ if (irq >= NR_IRQS || !irq_controller[irq]) { ++ printk(KERN_DEBUG "%s: Incorrect IRQ %d\n", __FUNCTION__, irq); ++ return; ++ } ++ ++ contr = irq_controller[irq]; ++ spin_lock_irqsave(&contr->lock, flags); ++ if (irq_depth[irq]) { ++ if (!--irq_depth[irq]) { ++ if (contr->enable) ++ contr->enable(irq); ++ } ++ } else ++ WARN_ON(1); ++ spin_unlock_irqrestore(&contr->lock, flags); ++} ++EXPORT_SYMBOL(enable_irq); ++ ++void disable_irq(unsigned int irq) ++{ ++ struct irq_controller *contr; ++ unsigned long flags; ++ ++ if (irq >= NR_IRQS || !irq_controller[irq]) { ++ printk(KERN_DEBUG "%s: Incorrect IRQ %d\n", __FUNCTION__, irq); ++ return; ++ } ++ ++ contr = irq_controller[irq]; ++ spin_lock_irqsave(&contr->lock, flags); ++ if (!irq_depth[irq]++) { ++ if (contr->disable) ++ contr->disable(irq); ++ } ++ spin_unlock_irqrestore(&contr->lock, flags); ++} ++EXPORT_SYMBOL(disable_irq); ++ ++unsigned long probe_irq_on(void) ++{ ++ return 0; ++} ++EXPORT_SYMBOL(probe_irq_on); ++ ++int probe_irq_off(unsigned long irqs) ++{ ++ return 0; ++} ++EXPORT_SYMBOL(probe_irq_off); ++ ++asmlinkage void handle_badint(struct pt_regs *regs) ++{ ++ kstat_cpu(0).irqs[0]++; ++ num_spurious++; ++ printk(KERN_DEBUG "unexpected interrupt from %u\n", regs->vector); ++} ++EXPORT_SYMBOL(handle_badint); ++ ++#ifdef CONFIG_M54455 ++/* ++ * M5445X Implementation ++ */ ++void m5445x_irq_enable(unsigned int irq) ++{ ++ /* enable the interrupt hardware */ ++ if (irq < 64) ++ return; ++ ++ /* adjust past non-hardware ints */ ++ irq -= 64; ++ ++ /* check for eport */ ++ if ((irq > 0) && (irq < 8)) { ++ /* enable eport */ ++ MCF_EPORT_EPPAR &= ~(3 << (irq*2)); /* level */ ++ MCF_EPORT_EPDDR &= ~(1 << irq); /* input */ ++ MCF_EPORT_EPIER |= 1 << irq; /* irq enabled */ ++ } ++ ++ if (irq < 64) { ++ /* controller 0 */ ++ MCF_INTC0_ICR(irq) = 0x02; ++ MCF_INTC0_CIMR = irq; ++ } else { ++ /* controller 1 */ ++ irq -= 64; ++ MCF_INTC1_ICR(irq) = 0x02; ++ MCF_INTC1_CIMR = irq; ++ } ++} ++ ++void m5445x_irq_disable(unsigned int irq) ++{ ++ /* disable the interrupt hardware */ ++ if (irq < 64) ++ return; ++ ++ /* adjust past non-hardware ints */ ++ irq -= 64; ++ ++ /* check for eport */ ++ if ((irq > 0) && (irq < 8)) { ++ /* disable eport */ ++ MCF_EPORT_EPIER &= ~(1 << irq); ++ } ++ ++ if (irq < 64) { ++ /* controller 0 */ ++ MCF_INTC0_ICR(irq) = 0x00; ++ MCF_INTC0_SIMR = irq; ++ } else { ++ /* controller 1 */ ++ irq -= 64; ++ MCF_INTC1_ICR(irq) = 0x00; ++ MCF_INTC1_SIMR = irq; ++ } ++} ++#endif +--- /dev/null ++++ b/arch/m68k/coldfire/iomap.c +@@ -0,0 +1,54 @@ ++/* ++ * arch/m68k/coldfire/iomap.c ++ * ++ * Generic coldfire iomap interface ++ * ++ * Based on the sh64 iomap.c by Paul Mundt. ++ * ++ * This file is subject to the terms and conditions of the GNU General Public ++ * License. See the file "COPYING" in the main directory of this archive ++ * for more details. ++ */ ++#include <linux/pci.h> ++#include <asm/io.h> ++ ++void __iomem *__attribute__ ((weak)) ++ioport_map(unsigned long port, unsigned int len) ++{ ++ return (void __iomem *)port; ++} ++EXPORT_SYMBOL(pci_iomap); ++ ++void ioport_unmap(void __iomem *addr) ++{ ++ /* Nothing .. */ ++} ++EXPORT_SYMBOL(pci_iounmap); ++ ++void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long max) ++{ ++ unsigned long start = pci_resource_start(dev, bar); ++ unsigned long len = pci_resource_len(dev, bar); ++ unsigned long flags = pci_resource_flags(dev, bar); ++printk(KERN_INFO "PCI_IOMAP: BAR=%d START=0x%lx LEN=0x%lx FLAGS=0x%lx\n", ++ bar, start, len, flags); ++ ++ if (!len) ++ return NULL; ++ if (max && len > max) ++ len = max; ++ if (flags & IORESOURCE_IO) ++ return ioport_map(start, len); ++ if (flags & IORESOURCE_MEM) ++ return (void __iomem *)start; ++ ++ /* What? */ ++ return NULL; ++} ++EXPORT_SYMBOL(ioport_map); ++ ++void pci_iounmap(struct pci_dev *dev, void __iomem *addr) ++{ ++ /* Nothing .. */ ++} ++EXPORT_SYMBOL(ioport_unmap); +--- /dev/null ++++ b/arch/m68k/coldfire/mcf5445x-pci.c +@@ -0,0 +1,427 @@ ++/* ++ * arch/m68k/coldfire/mcf5445x-pci.c ++ * ++ * Coldfire M5445x specific PCI implementation. ++ * ++ * Copyright (c) 2007 Freescale Semiconductor, Inc. ++ * Kurt Mahan <kmahan@freescale.com> ++ */ ++ ++#include <linux/delay.h> ++#include <linux/pci.h> ++ ++#include <asm/mcfsim.h> ++#include <asm/pci.h> ++#include <asm/irq.h> ++ ++/* ++ * Layout MCF5445x to PCI memory mappings: ++ * ++ * WIN MCF5445x PCI TYPE ++ * --- -------- --- ---- ++ * [0] 0xA0000000 -> 0xA7FFFFFF 0xA0000000 -> 0xA7FFFFFF MEM ++ * [1] 0xA8000000 -> 0xABFFFFFF 0xA8000000 -> 0xABFFFFFF MEM ++ * [2] 0xAC000000 -> 0xAFFFFFFF 0xAC000000 -> 0xAFFFFFFF IO ++ */ ++ ++#define MCF5445X_PCI_MEM_BASE 0xA0000000 ++#define MCF5445X_PCI_MEM_SIZE 0x0C000000 ++ ++#define MCF5445X_PCI_CONFIG_BASE 0xAC000000 ++#define MCF5445X_PCI_CONFIG_SIZE 0x04000000 ++ ++#define MCF5445X_PCI_IO_BASE 0xAC000000 ++#define MCF5445X_PCI_IO_SIZE 0x04000000 ++ ++/* PCI Bus memory resource block */ ++struct resource pci_iomem_resource = { ++ .name = "PCI memory space", ++ .start = MCF5445X_PCI_MEM_BASE, ++ .flags = IORESOURCE_MEM, ++ .end = MCF5445X_PCI_MEM_BASE + MCF5445X_PCI_MEM_SIZE - 1 ++}; ++ ++/* PCI Bus ioport resource block */ ++struct resource pci_ioport_resource = { ++ .name = "PCI I/O space", ++ .start = MCF5445X_PCI_IO_BASE, ++ .flags = IORESOURCE_IO, ++ .end = MCF5445X_PCI_IO_BASE + MCF5445X_PCI_IO_SIZE - 1 ++}; ++ ++/* ++ * The M54455EVB multiplexes all the PCI interrupts via ++ * the FPGA and routes them to a single interrupt. The ++ * PCI spec requires all PCI interrupt routines be smart ++ * enough to sort out their own interrupts. ++ * The interrupt source from the FPGA is configured ++ * to EPORT 3. ++ */ ++#define MCF5445X_PCI_IRQ 0x43 ++ ++#define PCI_SLOTS 4 ++ ++/* ++ * FPGA Info ++ */ ++#define FPGA_PCI_IRQ_ENABLE (u32 *)0x09000000 ++#define FPGA_PCI_IRQ_STATUS (u32 *)0x09000004 ++#define FPGA_PCI_IRQ_ROUTE (u32 *)0x0900000c ++#define FPGA_SEVEN_LED (u32 *)0x09000014 ++ ++extern void set_fpga(u32 *addr, u32 val); ++ ++#ifdef DEBUG ++void mcf5445x_pci_dumpregs(void); ++#endif ++ ++/* ++ * static void mcf5445x_conf_device(struct pci_dev *dev) ++ * ++ * Machine dependent Configure the given device. ++ * ++ * Parameters: ++ * ++ * dev - the pci device. ++ */ ++void __init ++mcf5445x_conf_device(struct pci_dev *dev) ++{ ++ set_fpga(FPGA_PCI_IRQ_ENABLE, 0x0f); ++} ++ ++/* ++ * int mcf5445x_pci_config_read(unsigned int seg, unsigned int bus, ++ * unsigned int devfn, int reg, ++ * u32 *value) ++ * ++ * Read from PCI configuration space. ++ * ++ */ ++int mcf5445x_pci_config_read(unsigned int seg, unsigned int bus, ++ unsigned int devfn, int reg, int len, u32 *value) ++{ ++ u32 addr = MCF_PCI_PCICAR_BUSNUM(bus) | ++ MCF_PCI_PCICAR_DEVNUM(PCI_SLOT(devfn)) | ++ MCF_PCI_PCICAR_FUNCNUM(PCI_FUNC(devfn)) | ++ MCF_PCI_PCICAR_DWORD(reg) | ++ MCF_PCI_PCICAR_E; ++ ++ if ((bus > 255) || (devfn > 255) || (reg > 255)) { ++ *value = -1; ++ return -EINVAL; ++ } ++ ++ /* setup for config mode */ ++ MCF_PCI_PCICAR = addr; ++ __asm__ __volatile__("nop"); ++ ++ switch (len) { ++ case 1: ++ *value = *(volatile u8 *)(MCF5445X_PCI_CONFIG_BASE+(reg&3)); ++ break; ++ case 2: ++ *value = le16_to_cpu(*(volatile u16 *) ++ (MCF5445X_PCI_CONFIG_BASE + (reg&2))); ++ break; ++ case 4: ++ *value = le32_to_cpu(*(volatile u32 *) ++ (MCF5445X_PCI_CONFIG_BASE)); ++ break; ++ } ++ ++ /* clear config mode */ ++ MCF_PCI_PCICAR = ~MCF_PCI_PCICAR_E; ++ __asm__ __volatile__("nop"); ++ ++ return 0; ++} ++ ++/* ++ * int mcf5445x_pci_config_write(unsigned int seg, unsigned int bus, ++ * unsigned int devfn, int reg, ++ * u32 *value) ++ * ++ * Write to PCI configuration space ++ */ ++int mcf5445x_pci_config_write(unsigned int seg, unsigned int bus, ++ unsigned int devfn, int reg, int len, u32 value) ++{ ++ u32 addr = MCF_PCI_PCICAR_BUSNUM(bus) | ++ MCF_PCI_PCICAR_DEVNUM(PCI_SLOT(devfn)) | ++ MCF_PCI_PCICAR_FUNCNUM(PCI_FUNC(devfn)) | ++ MCF_PCI_PCICAR_DWORD(reg) | ++ MCF_PCI_PCICAR_E; ++ ++ if ((bus > 255) || (devfn > 255) || (reg > 255)) ++ return -EINVAL; ++ ++ /* setup for config mode */ ++ MCF_PCI_PCICAR = addr; ++ __asm__ __volatile__("nop"); ++ ++ switch (len) { ++ case 1: ++ *(volatile u8 *)(MCF5445X_PCI_CONFIG_BASE+(reg&3)) = (u8)value; ++ break; ++ case 2: ++ *(volatile u16 *)(MCF5445X_PCI_CONFIG_BASE+(reg&2)) = ++ cpu_to_le16((u16)value); ++ break; ++ case 4: ++ *(volatile u32 *)(MCF5445X_PCI_CONFIG_BASE) = ++ cpu_to_le32(value); ++ break; ++ } ++ ++ /* clear config mode */ ++ MCF_PCI_PCICAR = ~MCF_PCI_PCICAR_E; ++ __asm__ __volatile__("nop"); ++ ++ return 0; ++} ++ ++/* hardware operations */ ++static struct pci_raw_ops mcf5445x_pci_ops = { ++ .read = mcf5445x_pci_config_read, ++ .write = mcf5445x_pci_config_write, ++}; ++ ++/* ++ * irqreturn_t mcf5445x_pci_interrupt( int irq, void *dev) ++ * ++ * PCI controller interrupt handler. ++ */ ++static irqreturn_t ++mcf5445x_pci_interrupt(int irq, void *dev) ++{ ++ u32 status = MCF_PCI_PCIGSCR; ++#ifdef DEBUG ++ printk(KERN_INFO "PCI: Controller irq status=0x%08x\n", status); ++#endif ++ /* clear */ ++ MCF_PCI_PCIGSCR = status; ++ ++ return IRQ_HANDLED; ++} ++ ++/* ++ * irqreturn_t mcf5445x_pci_arb_interrupt( int irq, void *dev) ++ * ++ * PCI Arbiter interrupt handler. ++ */ ++static irqreturn_t ++mcf5445x_pci_arb_interrupt(int irq, void *dev) ++{ ++ u32 status = MCF_PCIARB_PASR; ++#ifdef DEBUG ++ printk(KERN_INFO "PCI: Arbiter irq status=0x%08x\n", status); ++#endif ++ /* clear */ ++ MCF_PCIARB_PASR = status; ++ return IRQ_HANDLED; ++} ++ ++/* ++ * struct pci_bus_info *init_mcf5445x_pci(void) ++ * ++ * Machine specific initialisation: ++ * ++ * - Allocate and initialise a 'pci_bus_info' structure ++ * - Initialize hardware ++ * ++ * Result: pointer to 'pci_bus_info' structure. ++ */ ++int __init ++init_mcf5445x_pci(void) ++{ ++ /* ++ * Initialize the PCI core ++ */ ++ ++ /* arbitration controller */ ++ MCF_PCIARB_PACR = MCF_PCIARB_PACR_INTMPRI | ++ MCF_PCIARB_PACR_EXTMPRI(0x0f) | ++ MCF_PCIARB_PACR_INTMINTEN | ++ MCF_PCIARB_PACR_EXTMINTEN(0x0f); ++ ++ /* pci pin assignment regs */ ++ MCF_GPIO_PAR_PCI = MCF_GPIO_PAR_PCI_GNT0 | ++ MCF_GPIO_PAR_PCI_GNT1 | ++ MCF_GPIO_PAR_PCI_GNT2 | ++ MCF_GPIO_PAR_PCI_GNT3_GNT3 | ++ MCF_GPIO_PAR_PCI_REQ0 | ++ MCF_GPIO_PAR_PCI_REQ1 | ++ MCF_GPIO_PAR_PCI_REQ2 | ++ MCF_GPIO_PAR_PCI_REQ3_REQ3; ++ ++ /* target control reg */ ++ MCF_PCI_PCITCR = MCF_PCI_PCITCR_P | ++ MCF_PCI_PCITCR_WCT(8); ++ ++ /* PCI MEM address */ ++ MCF_PCI_PCIIW0BTAR = 0xA007A000; ++ ++ /* PCI MEM address */ ++ MCF_PCI_PCIIW1BTAR = 0xA803A800; ++ ++ /* PCI IO address */ ++ MCF_PCI_PCIIW2BTAR = 0xAC03AC00; ++ ++ /* window control */ ++ MCF_PCI_PCIIWCR = MCF_PCI_PCIIWCR_WINCTRL0_ENABLE | ++ MCF_PCI_PCIIWCR_WINCTRL0_MEMREAD | ++ MCF_PCI_PCIIWCR_WINCTRL1_ENABLE | ++ MCF_PCI_PCIIWCR_WINCTRL1_MEMREAD | ++ MCF_PCI_PCIIWCR_WINCTRL2_ENABLE | ++ MCF_PCI_PCIIWCR_WINCTRL2_IO; ++ ++ /* initiator control reg */ ++ MCF_PCI_PCIICR = 0x00ff; ++ ++ /* type 0 - command */ ++ MCF_PCI_PCISCR = MCF_PCI_PCISCR_MW | /* mem write/inval */ ++ MCF_PCI_PCISCR_B | /* bus master enable */ ++ MCF_PCI_PCISCR_M; /* mem access enable */ ++ ++ /* type 0 - config reg */ ++ MCF_PCI_PCICR1 = MCF_PCI_PCICR1_CACHELINESIZE(8) | ++ MCF_PCI_PCICR1_LATTIMER(0xff); ++ ++ /* type 0 - config 2 reg */ ++ MCF_PCI_PCICR2 = 0; ++ ++ /* target control reg */ ++ MCF_PCI_PCITCR2 = MCF_PCI_PCITCR2_B0E | ++ MCF_PCI_PCITCR2_B4E; ++ ++ /* translate addresses from PCI[0] to CF[SDRAM] */ ++ MCF_PCI_PCITBATR0 = MCF_RAMBAR1 | MCF_PCI_PCITBATR0_EN; ++ MCF_PCI_PCITBATR4 = MCF_RAMBAR1 | MCF_PCI_PCITBATR4_EN; ++ ++ /* setup controller interrupt handlers */ ++ if (request_irq(55+128, mcf5445x_pci_interrupt, IRQF_SHARED, ++ "PCI Controller", NULL)) ++ printk(KERN_ERR "PCI: Unable to register controller irq\n"); ++ ++ if (request_irq (56+128, mcf5445x_pci_arb_interrupt, IRQF_SHARED, "PCI Arbiter", NULL)) ++ printk(KERN_ERR "PCI: Unable to register arbiter irq\n"); ++ ++ /* global control - clear reset bit */ ++ MCF_PCI_PCIGSCR = MCF_PCI_PCIGSCR_SEE | ++ MCF_PCI_PCIGSCR_PEE; ++ ++ /* let everything settle */ ++ udelay(1000); ++ ++ /* allocate bus ioport resource */ ++ if (request_resource(&ioport_resource, &pci_ioport_resource) < 0) ++ printk(KERN_ERR "PCI: Unable to alloc ioport resource\n"); ++ ++ /* allocate bus iomem resource */ ++ if (request_resource(&iomem_resource, &pci_iomem_resource) < 0) ++ printk(KERN_ERR "PCI: Unable to alloc iomem resource\n"); ++ ++ /* setup FPGA to route PCI to IRQ3(67), SW7 to IRQ7, SW6 to IRQ4 */ ++ set_fpga(FPGA_PCI_IRQ_ENABLE, 0x00000000); ++ set_fpga(FPGA_PCI_IRQ_ROUTE, 0x00000039); ++ set_fpga(FPGA_SEVEN_LED, 0x000000FF); ++ ++ raw_pci_ops = &mcf5445x_pci_ops; ++ ++ return 0; ++} ++ ++/* ++ * DEBUGGING ++ */ ++ ++#ifdef DEBUG ++struct regdump { ++ u32 addr; ++ char regname[16]; ++}; ++ ++struct regdump type0regs[] = { ++ { 0xfc0a8000, "PCIIDR" }, ++ { 0xfc0a8004, "PCISCR" }, ++ { 0xfc0a8008, "PCICCRIR" }, ++ { 0xfc0a800c, "PCICR1" }, ++ { 0xfc0a8010, "PCIBAR0" }, ++ { 0xfc0a8014, "PCIBAR1" }, ++ { 0xfc0a8018, "PCIBAR2" }, ++ { 0xfc0a801c, "PCIBAR3" }, ++ { 0xfc0a8020, "PCIBAR4" }, ++ { 0xfc0a8024, "PCIBAR5" }, ++ { 0xfc0a8028, "PCICCPR" }, ++ { 0xfc0a802c, "PCISID" }, ++ { 0xfc0a8030, "PCIERBAR" }, ++ { 0xfc0a8034, "PCICPR" }, ++ { 0xfc0a803c, "PCICR2" }, ++ { 0, "" } ++}; ++ ++struct regdump genregs[] = { ++ { 0xfc0a8060, "PCIGSCR" }, ++ { 0xfc0a8064, "PCITBATR0" }, ++ { 0xfc0a8068, "PCITBATR1" }, ++ { 0xfc0a806c, "PCITCR1" }, ++ { 0xfc0a8070, "PCIIW0BTAR" }, ++ { 0xfc0a8074, "PCIIW1BTAR" }, ++ { 0xfc0a8078, "PCIIW2BTAR" }, ++ { 0xfc0a8080, "PCIIWCR" }, ++ { 0xfc0a8084, "PCIICR" }, ++ { 0xfc0a8088, "PCIISR" }, ++ { 0xfc0a808c, "PCITCR2" }, ++ { 0xfc0a8090, "PCITBATR0" }, ++ { 0xfc0a8094, "PCITBATR1" }, ++ { 0xfc0a8098, "PCITBATR2" }, ++ { 0xfc0a809c, "PCITBATR3" }, ++ { 0xfc0a80a0, "PCITBATR4" }, ++ { 0xfc0a80a4, "PCITBATR5" }, ++ { 0xfc0a80a8, "PCIINTR" }, ++ { 0xfc0a80f8, "PCICAR" }, ++ { 0, "" } ++}; ++ ++struct regdump arbregs[] = { ++ { 0xfc0ac000, "PACR" }, ++ { 0xfc0ac004, "PASR" }, /* documentation error */ ++ { 0, "" } ++}; ++ ++/* ++ * void mcf5445x_pci_dumpregs() ++ * ++ * Dump out all the PCI registers ++ */ ++void ++mcf5445x_pci_dumpregs(void) ++{ ++ struct regdump *reg; ++ ++ printk(KERN_INFO "*** MCF5445x PCI TARGET 0 REGISTERS ***\n"); ++ ++ reg = type0regs; ++ while (reg->addr) { ++ printk(KERN_INFO "0x%08x 0x%08x %s\n", reg->addr, ++ *((u32 *)reg->addr), reg->regname); ++ reg++; ++ } ++ ++ printk(KERN_INFO "\n*** MCF5445x PCI GENERAL REGISTERS ***\n"); ++ reg = genregs; ++ while (reg->addr) { ++ printk(KERN_INFO "0x%08x 0x%08x %s\n", reg->addr, ++ *((u32 *)reg->addr), reg->regname); ++ reg++; ++ } ++ printk(KERN_INFO "\n*** MCF5445x PCI ARBITER REGISTERS ***\n"); ++ reg = arbregs; ++ while (reg->addr) { ++ printk(KERN_INFO "0x%08x 0x%08x %s\n", reg->addr, ++ *((u32 *)reg->addr), reg->regname); ++ reg++; ++ } ++} ++#endif /* DEBUG */ +--- /dev/null ++++ b/arch/m68k/coldfire/muldi3.S +@@ -0,0 +1,64 @@ ++/* ++ * Coldfire muldi3 assembly verion ++ */ ++ ++#include <linux/linkage.h> ++.globl __muldi3 ++ ++ENTRY(__muldi3) ++ linkw %fp,#0 ++ lea %sp@(-32),%sp ++ moveml %d2-%d7/%a2-%a3,%sp@ ++ moveal %fp@(8), %a2 ++ moveal %fp@(12), %a3 ++ moveal %fp@(16), %a0 ++ moveal %fp@(20),%a1 ++ movel %a3,%d2 ++ andil #65535,%d2 ++ movel %a3,%d3 ++ clrw %d3 ++ swap %d3 ++ movel %a1,%d0 ++ andil #65535,%d0 ++ movel %a1,%d1 ++ clrw %d1 ++ swap %d1 ++ movel %d2,%d7 ++ mulsl %d0,%d7 ++ movel %d2,%d4 ++ mulsl %d1,%d4 ++ movel %d3,%d2 ++ mulsl %d0,%d2 ++ mulsl %d1,%d3 ++ movel %d7,%d0 ++ clrw %d0 ++ swap %d0 ++ addl %d0,%d4 ++ addl %d2,%d4 ++ cmpl %d4,%d2 ++ blss 1f ++ addil #65536,%d3 ++1: ++ movel %d4,%d0 ++ clrw %d0 ++ swap %d0 ++ movel %d3,%d5 ++ addl %d0,%d5 ++ movew %d4,%d6 ++ swap %d6 ++ movew %d7,%d6 ++ movel %d5,%d0 ++ movel %d6,%d1 ++ movel %a3,%d2 ++ movel %a0,%d3 ++ mulsl %d3,%d2 ++ movel %a2,%d3 ++ movel %a1,%d4 ++ mulsl %d4,%d3 ++ addl %d3,%d2 ++ movel %d2,%d0 ++ addl %d5,%d0 ++ moveml %sp@, %d2-%d7/%a2-%a3 ++ lea %sp@(32),%sp ++ unlk %fp ++ rts +--- /dev/null ++++ b/arch/m68k/coldfire/pci.c +@@ -0,0 +1,245 @@ ++/* ++ * linux/arch/m68k/coldfire/pci.c ++ * ++ * PCI initialization for Coldfire architectures. ++ * ++ * Currently Supported: ++ * M5445x ++ * ++ * Copyright (c) 2007 Freescale Semiconductor, Inc. ++ * Kurt Mahan <kmahan@freescale.com> ++ */ ++ ++#include <linux/kernel.h> ++#include <linux/init.h> ++#include <linux/pci.h> ++ ++#include <asm/mcfsim.h> ++#include <asm/pci.h> ++ ++/* pci ops for reading/writing config */ ++struct pci_raw_ops *raw_pci_ops; ++ ++/* pci debug flag */ ++static int debug_pci; ++ ++#ifdef CONFIG_M54455 ++extern int init_mcf5445x_pci(void); ++extern void mcf5445x_conf_device(struct pci_dev *dev); ++extern void mcf5445x_pci_dumpregs(void); ++ ++extern struct resource pci_ioport_resource; ++extern struct resource pci_iomem_resource; ++#endif ++ ++static int ++pci_read(struct pci_bus *bus, unsigned int devfn, int where, ++ int size, u32 *value) ++{ ++ return raw_pci_ops->read(0, bus->number, devfn, where, size, value); ++} ++ ++static int ++pci_write(struct pci_bus *bus, unsigned int devfn, int where, ++ int size, u32 value) ++{ ++ return raw_pci_ops->write(0, bus->number, devfn, where, size, value); ++} ++ ++struct pci_ops pci_root_ops = { ++ .read = pci_read, ++ .write = pci_write, ++}; ++ ++/* ++ * pcibios_setup(char *) ++ * ++ * Initialize the pcibios based on cmd line params. ++ */ ++char * __init ++pcibios_setup(char *str) ++{ ++ if (!strcmp(str, "debug")) { ++ debug_pci = 1; ++ return NULL; ++ } ++ return str; ++} ++ ++/* ++ * We need to avoid collisions with `mirrored' VGA ports ++ * and other strange ISA hardware, so we always want the ++ * addresses to be allocated in the 0x000-0x0ff region ++ * modulo 0x400. ++ * ++ * Why? Because some silly external IO cards only decode ++ * the low 10 bits of the IO address. The 0x00-0xff region ++ * is reserved for motherboard devices that decode all 16 ++ * bits, so it's ok to allocate at, say, 0x2800-0x28ff, ++ * but we want to try to avoid allocating at 0x2900-0x2bff ++ * which might have be mirrored at 0x0100-0x03ff.. ++ */ ++void ++pcibios_align_resource(void *data, struct resource *res, resource_size_t size, ++ resource_size_t align) ++{ ++ struct pci_dev *dev = data; ++ ++ if (res->flags & IORESOURCE_IO) { ++ resource_size_t start = res->start; ++ ++ if (size > 0x100) ++ printk(KERN_ERR "PCI: I/O Region %s/%d too large" ++ " (%ld bytes)\n", pci_name(dev), ++ dev->resource - res, (long int)size); ++ ++ if (start & 0x300) { ++ start = (start + 0x3ff) & ~0x3ff; ++ res->start = start; ++ } ++ } ++} ++ ++/* ++ * Swizzle the device pin each time we cross a bridge ++ * and return the slot number. ++ */ ++static u8 __devinit ++pcibios_swizzle(struct pci_dev *dev, u8 *pin) ++{ ++ return 0; ++} ++ ++/* ++ * Map a slot/pin to an IRQ. ++ */ ++static int ++pcibios_map_irq(struct pci_dev *dev, u8 slot, u8 pin) ++{ ++ return 0x43; ++} ++ ++/* ++ * pcibios_update_irq(struct pci_dev *dev, int irq) ++ * ++ * Update a PCI interrupt. ++ */ ++void __init ++pcibios_update_irq(struct pci_dev *dev, int irq) ++{ ++ pci_write_config_byte(dev, PCI_INTERRUPT_LINE, irq); ++} ++ ++/* ++ * pcibios_enable_device(struct pci_dev *dev, int mask) ++ * ++ * Enable a device on the PCI bus. ++ */ ++int ++pcibios_enable_device(struct pci_dev *dev, int mask) ++{ ++ u16 cmd, old_cmd; ++ int idx; ++ struct resource *r; ++ ++ pci_read_config_word(dev, PCI_COMMAND, &cmd); ++ old_cmd = cmd; ++ for (idx = 0; idx < 6; idx++) { ++ r = &dev->resource[idx]; ++ if (!r->start && r->end) { ++ printk(KERN_ERR "PCI: Device %s not available because " ++ "of resource collisions\n", pci_name(dev)); ++ return -EINVAL; ++ } ++ if (r->flags & IORESOURCE_IO) ++ cmd |= PCI_COMMAND_IO; ++ if (r->flags & IORESOURCE_MEM) ++ cmd |= PCI_COMMAND_MEMORY; ++ } ++ if (cmd != old_cmd) { ++ printk("PCI: Enabling device %s (%04x -> %04x)\n", ++ pci_name(dev), old_cmd, cmd); ++ pci_write_config_word(dev, PCI_COMMAND, cmd); ++#ifdef CONFIG_M54455 ++ mcf5445x_conf_device(dev); ++#endif ++ } ++ ++ return 0; ++} ++ ++/* ++ * pcibios_fixup_bus(struct pci_bus *bus) ++ */ ++void __init ++pcibios_fixup_bus(struct pci_bus *bus) ++{ ++ struct pci_dev *dev = bus->self; ++ ++ if (!dev) { ++ /* Root bus. */ ++#ifdef CONFIG_M54455 ++ bus->resource[0] = &pci_ioport_resource; ++ bus->resource[1] = &pci_iomem_resource; ++#endif ++ } ++} ++ ++/* ++ * pcibios_init(void) ++ * ++ * Allocate/initialize low level pci bus/devices. ++ */ ++static int __init ++pcibios_init(void) ++{ ++ struct pci_bus *bus; ++ ++ if (!raw_pci_ops) { ++ printk(KERN_WARNING "PCIBIOS: FATAL: NO PCI Hardware found\n"); ++ return 0; ++ } ++ ++ /* allocate and scan the (only) bus */ ++ bus = pci_scan_bus_parented(NULL, 0, &pci_root_ops, NULL); ++ ++ /* setup everything */ ++ if (bus) { ++ /* compute the bridge window sizes */ ++ pci_bus_size_bridges(bus); ++ ++ /* (re)assign device resources */ ++ pci_bus_assign_resources(bus); ++ ++ /* add the bus to the system */ ++ pci_bus_add_devices(bus); ++ ++ /* fixup irqs */ ++ pci_fixup_irqs(pcibios_swizzle, pcibios_map_irq); ++ } ++ ++ return 0; ++} ++ ++/* ++ * pci_init(void) ++ * ++ * Initialize the PCI Hardware. ++ */ ++static int __init ++pci_init(void) ++{ ++#if defined(CONFIG_M54455) ++ init_mcf5445x_pci(); ++#endif ++ if (!raw_pci_ops) ++ printk(KERN_ERR "PCI: FATAL: NO PCI Detected\n"); ++ ++ return 0; ++} ++ ++/* low level hardware (first) */ ++arch_initcall(pci_init); ++ ++/* basic bios init (second) */ ++subsys_initcall(pcibios_init); +--- /dev/null ++++ b/arch/m68k/coldfire/signal.c +@@ -0,0 +1,868 @@ ++/* ++ * linux/arch/m68k/kernel/signal.c ++ * ++ * Copyright (C) 1991, 1992 Linus Torvalds ++ * ++ * This file is subject to the terms and conditions of the GNU General Public ++ * License. See the file COPYING in the main directory of this archive ++ * for more details. ++ */ ++ ++/* ++ * Derived from m68k/kernel/signal.c and the original authors are credited ++ * there. ++ * ++ * Coldfire support by: ++ * Matt Waddel Matt.Waddel@freescale.com ++ * Copyright Freescale Semiconductor, Inc 2007 ++ */ ++ ++#include <linux/sched.h> ++#include <linux/mm.h> ++#include <linux/kernel.h> ++#include <linux/signal.h> ++#include <linux/syscalls.h> ++#include <linux/errno.h> ++#include <linux/wait.h> ++#include <linux/ptrace.h> ++#include <linux/unistd.h> ++#include <linux/stddef.h> ++#include <linux/highuid.h> ++#include <linux/personality.h> ++#include <linux/tty.h> ++#include <linux/binfmts.h> ++ ++#include <asm/setup.h> ++#include <asm/cf_uaccess.h> ++#include <asm/cf_pgtable.h> ++#include <asm/traps.h> ++#include <asm/ucontext.h> ++ ++#define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) ++ ++asmlinkage int do_signal(sigset_t *oldset, struct pt_regs *regs); ++ ++const int frame_extra_sizes[16] = { ++ [1] = -1, ++ [2] = sizeof(((struct frame *)0)->un.fmt2), ++ [3] = sizeof(((struct frame *)0)->un.fmt3), ++ [4] = 0, ++ [5] = -1, ++ [6] = -1, ++ [7] = sizeof(((struct frame *)0)->un.fmt7), ++ [8] = -1, ++ [9] = sizeof(((struct frame *)0)->un.fmt9), ++ [10] = sizeof(((struct frame *)0)->un.fmta), ++ [11] = sizeof(((struct frame *)0)->un.fmtb), ++ [12] = -1, ++ [13] = -1, ++ [14] = -1, ++ [15] = -1, ++}; ++ ++/* ++ * Atomically swap in the new signal mask, and wait for a signal. ++ */ ++asmlinkage int do_sigsuspend(struct pt_regs *regs) ++{ ++ old_sigset_t mask = regs->d3; ++ sigset_t saveset; ++ ++ mask &= _BLOCKABLE; ++ spin_lock_irq(¤t->sighand->siglock); ++ saveset = current->blocked; ++ siginitset(¤t->blocked, mask); ++ recalc_sigpending(); ++ spin_unlock_irq(¤t->sighand->siglock); ++ ++ regs->d0 = -EINTR; ++ while (1) { ++ current->state = TASK_INTERRUPTIBLE; ++ schedule(); ++ if (do_signal(&saveset, regs)) ++ return -EINTR; ++ } ++} ++ ++asmlinkage int ++do_rt_sigsuspend(struct pt_regs *regs) ++{ ++ sigset_t __user *unewset = (sigset_t __user *)regs->d1; ++ size_t sigsetsize = (size_t)regs->d2; ++ sigset_t saveset, newset; ++ ++ /* XXX: Don't preclude handling different sized sigset_t's. */ ++ if (sigsetsize != sizeof(sigset_t)) ++ return -EINVAL; ++ ++ if (copy_from_user(&newset, unewset, sizeof(newset))) ++ return -EFAULT; ++ sigdelsetmask(&newset, ~_BLOCKABLE); ++ ++ spin_lock_irq(¤t->sighand->siglock); ++ saveset = current->blocked; ++ current->blocked = newset; ++ recalc_sigpending(); ++ spin_unlock_irq(¤t->sighand->siglock); ++ ++ regs->d0 = -EINTR; ++ while (1) { ++ current->state = TASK_INTERRUPTIBLE; ++ schedule(); ++ if (do_signal(&saveset, regs)) ++ return -EINTR; ++ } ++} ++ ++asmlinkage int ++sys_sigaction(int sig, const struct old_sigaction __user *act, ++ struct old_sigaction __user *oact) ++{ ++ struct k_sigaction new_ka, old_ka; ++ int ret; ++ ++ if (act) { ++ old_sigset_t mask; ++ if (!access_ok(VERIFY_READ, act, sizeof(*act)) || ++ __get_user(new_ka.sa.sa_handler, &act->sa_handler) || ++ __get_user(new_ka.sa.sa_restorer, &act->sa_restorer)) ++ return -EFAULT; ++ __get_user(new_ka.sa.sa_flags, &act->sa_flags); ++ __get_user(mask, &act->sa_mask); ++ siginitset(&new_ka.sa.sa_mask, mask); ++ } ++ ++ ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL); ++ ++ if (!ret && oact) { ++ if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) || ++ __put_user(old_ka.sa.sa_handler, &oact->sa_handler) || ++ __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer)) ++ return -EFAULT; ++ __put_user(old_ka.sa.sa_flags, &oact->sa_flags); ++ __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask); ++ } ++ ++ return ret; ++} ++ ++asmlinkage int ++sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss) ++{ ++ return do_sigaltstack(uss, uoss, rdusp()); ++} ++ ++ ++/* ++ * Do a signal return; undo the signal stack. ++ * ++ * Keep the return code on the stack quadword aligned! ++ * That makes the cache flush below easier. ++ */ ++ ++struct sigframe ++{ ++ char __user *pretcode; ++ int sig; ++ int code; ++ struct sigcontext __user *psc; ++ char retcode[16]; ++ unsigned long extramask[_NSIG_WORDS-1]; ++ struct sigcontext sc; ++}; ++ ++struct rt_sigframe ++{ ++ char __user *pretcode; ++ int sig; ++ struct siginfo __user *pinfo; ++ void __user *puc; ++ char retcode[16]; ++ struct siginfo info; ++ struct ucontext uc; ++}; ++ ++#define FPCONTEXT_SIZE 216 ++#define uc_fpstate uc_filler[0] ++#define uc_formatvec uc_filler[FPCONTEXT_SIZE/4] ++#define uc_extra uc_filler[FPCONTEXT_SIZE/4+1] ++ ++#ifdef CONFIG_FPU ++static unsigned char fpu_version; /* version num of fpu, set by setup_frame */ ++ ++static inline int restore_fpu_state(struct sigcontext *sc) ++{ ++ int err = 1; ++ ++ if (FPU_IS_EMU) { ++ /* restore registers */ ++ memcpy(current->thread.fpcntl, sc->sc_fpcntl, 12); ++ memcpy(current->thread.fp, sc->sc_fpregs, 24); ++ return 0; ++ } ++ ++ if (CPU_IS_060 ? sc->sc_fpstate[2] : sc->sc_fpstate[0]) { ++ /* Verify the frame format. */ ++ if (!CPU_IS_060 && (sc->sc_fpstate[0] != fpu_version)) ++ goto out; ++ if (CPU_IS_020_OR_030) { ++ if (m68k_fputype & FPU_68881 && ++ !(sc->sc_fpstate[1] == 0x18 || sc->sc_fpstate[1] == 0xb4)) ++ goto out; ++ if (m68k_fputype & FPU_68882 && ++ !(sc->sc_fpstate[1] == 0x38 || sc->sc_fpstate[1] == 0xd4)) ++ goto out; ++ } else if (CPU_IS_040) { ++ if (!(sc->sc_fpstate[1] == 0x00 || ++ sc->sc_fpstate[1] == 0x28 || ++ sc->sc_fpstate[1] == 0x60)) ++ goto out; ++ } else if (CPU_IS_060) { ++ if (!(sc->sc_fpstate[3] == 0x00 || ++ sc->sc_fpstate[3] == 0x60 || ++ sc->sc_fpstate[3] == 0xe0)) ++ goto out; ++ } else ++ goto out; ++ ++ } ++ err = 0; ++ ++out: ++ return err; ++} ++ ++static inline int rt_restore_fpu_state(struct ucontext __user *uc) ++{ ++ unsigned char fpstate[FPCONTEXT_SIZE]; ++ int context_size = CPU_IS_060 ? 8 : 0; ++ fpregset_t fpregs; ++ int err = 1; ++ ++ if (FPU_IS_EMU) { ++ /* restore fpu control register */ ++ if (__copy_from_user(current->thread.fpcntl, ++ uc->uc_mcontext.fpregs.f_fpcntl, 12)) ++ goto out; ++ /* restore all other fpu register */ ++ if (__copy_from_user(current->thread.fp, ++ uc->uc_mcontext.fpregs.f_fpregs, 96)) ++ goto out; ++ return 0; ++ } ++ ++ if (__get_user(*(long *)fpstate, (long __user *)&uc->uc_fpstate)) ++ goto out; ++ if (CPU_IS_060 ? fpstate[2] : fpstate[0]) { ++ if (!CPU_IS_060) ++ context_size = fpstate[1]; ++ /* Verify the frame format. */ ++ if (!CPU_IS_060 && (fpstate[0] != fpu_version)) ++ goto out; ++ if (CPU_IS_020_OR_030) { ++ if (m68k_fputype & FPU_68881 && ++ !(context_size == 0x18 || context_size == 0xb4)) ++ goto out; ++ if (m68k_fputype & FPU_68882 && ++ !(context_size == 0x38 || context_size == 0xd4)) ++ goto out; ++ } else if (CPU_IS_040) { ++ if (!(context_size == 0x00 || ++ context_size == 0x28 || ++ context_size == 0x60)) ++ goto out; ++ } else if (CPU_IS_060) { ++ if (!(fpstate[3] == 0x00 || ++ fpstate[3] == 0x60 || ++ fpstate[3] == 0xe0)) ++ goto out; ++ } else ++ goto out; ++ if (__copy_from_user(&fpregs, &uc->uc_mcontext.fpregs, ++ sizeof(fpregs))) ++ goto out; ++ } ++ if (context_size && ++ __copy_from_user(fpstate + 4, (long __user *)&uc->uc_fpstate + 1, ++ context_size)) ++ goto out; ++ err = 0; ++ ++out: ++ return err; ++} ++#endif ++ ++static inline int ++restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *usc, ++ void __user *fp, int *pd0) ++{ ++ int fsize, formatvec; ++ struct sigcontext context; ++ int err = 0; ++ ++ /* get previous context */ ++ if (copy_from_user(&context, usc, sizeof(context))) ++ goto badframe; ++ ++ /* restore passed registers */ ++ regs->d1 = context.sc_d1; ++ regs->a0 = context.sc_a0; ++ regs->a1 = context.sc_a1; ++ regs->sr = (regs->sr & 0xff00) | (context.sc_sr & 0xff); ++ regs->pc = context.sc_pc; ++ regs->orig_d0 = -1; /* disable syscall checks */ ++ wrusp(context.sc_usp); ++ formatvec = context.sc_formatvec; ++ regs->format = formatvec >> 12; ++ regs->vector = formatvec & 0xfff; ++ ++#ifdef CONFIG_FPU ++ err = restore_fpu_state(&context); ++#endif ++ ++ fsize = frame_extra_sizes[regs->format]; ++ if (fsize < 0) { ++ /* ++ * user process trying to return with weird frame format ++ */ ++#ifdef DEBUG ++ printk(KERN_DEBUG "user process returning with weird \ ++ frame format\n"); ++#endif ++ goto badframe; ++ } ++ ++ /* OK. Make room on the supervisor stack for the extra junk, ++ * if necessary. ++ */ ++ ++ { ++ struct switch_stack *sw = (struct switch_stack *)regs - 1; ++ regs->d0 = context.sc_d0; ++#define frame_offset (sizeof(struct pt_regs)+sizeof(struct switch_stack)) ++ __asm__ __volatile__ ++ (" movel %0,%/sp\n\t" ++ " bra ret_from_signal\n" ++ "4:\n" ++ ".section __ex_table,\"a\"\n" ++ " .align 4\n" ++ " .long 2b,4b\n" ++ ".previous" ++ : /* no outputs, it doesn't ever return */ ++ : "a" (sw), "d" (fsize), "d" (frame_offset/4-1), ++ "n" (frame_offset), "a" (fp) ++ : "a0"); ++#undef frame_offset ++ /* ++ * If we ever get here an exception occurred while ++ * building the above stack-frame. ++ */ ++ goto badframe; ++ } ++ ++ *pd0 = context.sc_d0; ++ return err; ++ ++badframe: ++ return 1; ++} ++ ++static inline int ++rt_restore_ucontext(struct pt_regs *regs, struct switch_stack *sw, ++ struct ucontext __user *uc, int *pd0) ++{ ++ int fsize, temp; ++ greg_t __user *gregs = uc->uc_mcontext.gregs; ++ unsigned long usp; ++ int err; ++ ++ err = __get_user(temp, &uc->uc_mcontext.version); ++ if (temp != MCONTEXT_VERSION) ++ goto badframe; ++ /* restore passed registers */ ++ err |= __get_user(regs->d0, &gregs[0]); ++ err |= __get_user(regs->d1, &gregs[1]); ++ err |= __get_user(regs->d2, &gregs[2]); ++ err |= __get_user(regs->d3, &gregs[3]); ++ err |= __get_user(regs->d4, &gregs[4]); ++ err |= __get_user(regs->d5, &gregs[5]); ++ err |= __get_user(sw->d6, &gregs[6]); ++ err |= __get_user(sw->d7, &gregs[7]); ++ err |= __get_user(regs->a0, &gregs[8]); ++ err |= __get_user(regs->a1, &gregs[9]); ++ err |= __get_user(regs->a2, &gregs[10]); ++ err |= __get_user(sw->a3, &gregs[11]); ++ err |= __get_user(sw->a4, &gregs[12]); ++ err |= __get_user(sw->a5, &gregs[13]); ++ err |= __get_user(sw->a6, &gregs[14]); ++ err |= __get_user(usp, &gregs[15]); ++ wrusp(usp); ++ err |= __get_user(regs->pc, &gregs[16]); ++ err |= __get_user(temp, &gregs[17]); ++ regs->sr = (regs->sr & 0xff00) | (temp & 0xff); ++ regs->orig_d0 = -1; /* disable syscall checks */ ++ err |= __get_user(temp, &uc->uc_formatvec); ++ regs->format = temp >> 12; ++ regs->vector = temp & 0xfff; ++ ++#ifdef CONFIG_FPU ++ err |= rt_restore_fpu_state(uc); ++#endif ++ ++ if (do_sigaltstack(&uc->uc_stack, NULL, usp) == -EFAULT) ++ goto badframe; ++ ++ fsize = frame_extra_sizes[regs->format]; ++ if (fsize < 0) { ++ /* ++ * user process trying to return with weird frame format ++ */ ++#ifdef DEBUG ++ printk(KERN_DEBUG "user process returning with weird \ ++ frame format\n"); ++#endif ++ goto badframe; ++ } ++ ++ /* OK. Make room on the supervisor stack for the extra junk, ++ * if necessary. ++ */ ++ ++ { ++#define frame_offset (sizeof(struct pt_regs)+sizeof(struct switch_stack)) ++ __asm__ __volatile__ ++ (" movel %0,%/sp\n\t" ++ " bra ret_from_signal\n" ++ "4:\n" ++ ".section __ex_table,\"a\"\n" ++ " .align 4\n" ++ " .long 2b,4b\n" ++ ".previous" ++ : /* no outputs, it doesn't ever return */ ++ : "a" (sw), "d" (fsize), "d" (frame_offset/4-1), ++ "n" (frame_offset), "a" (&uc->uc_extra) ++ : "a0"); ++#undef frame_offset ++ /* ++ * If we ever get here an exception occurred while ++ * building the above stack-frame. ++ */ ++ goto badframe; ++ } ++ ++ *pd0 = regs->d0; ++ return err; ++ ++badframe: ++ return 1; ++} ++ ++asmlinkage int do_sigreturn(unsigned long __unused) ++{ ++ struct switch_stack *sw = (struct switch_stack *) &__unused; ++ struct pt_regs *regs = (struct pt_regs *) (sw + 1); ++ unsigned long usp = rdusp(); ++ struct sigframe __user *frame = (struct sigframe __user *)(usp - 4); ++ sigset_t set; ++ int d0; ++ ++ if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) ++ goto badframe; ++ if (__get_user(set.sig[0], &frame->sc.sc_mask) || ++ (_NSIG_WORDS > 1 && ++ __copy_from_user(&set.sig[1], &frame->extramask, ++ sizeof(frame->extramask)))) ++ goto badframe; ++ ++ sigdelsetmask(&set, ~_BLOCKABLE); ++ spin_lock_irq(¤t->sighand->siglock); ++ current->blocked = set; ++ recalc_sigpending(); ++ spin_unlock_irq(¤t->sighand->siglock); ++ ++ if (restore_sigcontext(regs, &frame->sc, frame + 1, &d0)) ++ goto badframe; ++ return d0; ++ ++badframe: ++ force_sig(SIGSEGV, current); ++ return 0; ++} ++ ++asmlinkage int do_rt_sigreturn(unsigned long __unused) ++{ ++ struct switch_stack *sw = (struct switch_stack *) &__unused; ++ struct pt_regs *regs = (struct pt_regs *) (sw + 1); ++ unsigned long usp = rdusp(); ++ struct rt_sigframe __user *frame = ++ (struct rt_sigframe __user *)(usp - 4); ++ sigset_t set; ++ int d0; ++ ++ if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) ++ goto badframe; ++ if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set))) ++ goto badframe; ++ ++ sigdelsetmask(&set, ~_BLOCKABLE); ++ spin_lock_irq(¤t->sighand->siglock); ++ current->blocked = set; ++ recalc_sigpending(); ++ spin_unlock_irq(¤t->sighand->siglock); ++ ++ if (rt_restore_ucontext(regs, sw, &frame->uc, &d0)) ++ goto badframe; ++ return d0; ++ ++badframe: ++ force_sig(SIGSEGV, current); ++ return 0; ++} ++ ++#ifdef CONFIG_FPU ++/* ++ * Set up a signal frame. ++ */ ++ ++static inline void save_fpu_state(struct sigcontext *sc, struct pt_regs *regs) ++{ ++ if (FPU_IS_EMU) { ++ /* save registers */ ++ memcpy(sc->sc_fpcntl, current->thread.fpcntl, 12); ++ memcpy(sc->sc_fpregs, current->thread.fp, 24); ++ return; ++ } ++} ++ ++static inline int rt_save_fpu_state(struct ucontext __user *uc, ++ struct pt_regs *regs) ++{ ++ int err = 0; ++ ++ if (FPU_IS_EMU) { ++ /* save fpu control register */ ++ err |= copy_to_user(uc->uc_mcontext.fpregs.f_fpcntl, ++ current->thread.fpcntl, 12); ++ /* save all other fpu register */ ++ err |= copy_to_user(uc->uc_mcontext.fpregs.f_fpregs, ++ current->thread.fp, 96); ++ return err; ++ } ++ ++ return err; ++} ++#endif ++ ++static void setup_sigcontext(struct sigcontext *sc, struct pt_regs *regs, ++ unsigned long mask) ++{ ++ sc->sc_mask = mask; ++ sc->sc_usp = rdusp(); ++ sc->sc_d0 = regs->d0; ++ sc->sc_d1 = regs->d1; ++ sc->sc_a0 = regs->a0; ++ sc->sc_a1 = regs->a1; ++ sc->sc_sr = regs->sr; ++ sc->sc_pc = regs->pc; ++ sc->sc_formatvec = regs->format << 12 | regs->vector; ++#ifdef CONFIG_FPU ++ save_fpu_state(sc, regs); ++#endif ++} ++ ++static inline int rt_setup_ucontext(struct ucontext __user *uc, ++ struct pt_regs *regs) ++{ ++ struct switch_stack *sw = (struct switch_stack *)regs - 1; ++ greg_t __user *gregs = uc->uc_mcontext.gregs; ++ int err = 0; ++ ++ err |= __put_user(MCONTEXT_VERSION, &uc->uc_mcontext.version); ++ err |= __put_user(regs->d0, &gregs[0]); ++ err |= __put_user(regs->d1, &gregs[1]); ++ err |= __put_user(regs->d2, &gregs[2]); ++ err |= __put_user(regs->d3, &gregs[3]); ++ err |= __put_user(regs->d4, &gregs[4]); ++ err |= __put_user(regs->d5, &gregs[5]); ++ err |= __put_user(sw->d6, &gregs[6]); ++ err |= __put_user(sw->d7, &gregs[7]); ++ err |= __put_user(regs->a0, &gregs[8]); ++ err |= __put_user(regs->a1, &gregs[9]); ++ err |= __put_user(regs->a2, &gregs[10]); ++ err |= __put_user(sw->a3, &gregs[11]); ++ err |= __put_user(sw->a4, &gregs[12]); ++ err |= __put_user(sw->a5, &gregs[13]); ++ err |= __put_user(sw->a6, &gregs[14]); ++ err |= __put_user(rdusp(), &gregs[15]); ++ err |= __put_user(regs->pc, &gregs[16]); ++ err |= __put_user(regs->sr, &gregs[17]); ++ err |= __put_user((regs->format << 12) | regs->vector, ++ &uc->uc_formatvec); ++#ifdef CONFIG_FPU ++ err |= rt_save_fpu_state(uc, regs); ++#endif ++ return err; ++} ++ ++extern void IcacheInvalidateCacheBlock(void *, unsigned long); ++static inline void push_cache(unsigned long vaddr) ++{ ++ IcacheInvalidateCacheBlock((void *)vaddr, 8); ++} ++ ++static inline void __user * ++get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size) ++{ ++ unsigned long usp; ++ ++ /* Default to using normal stack. */ ++ usp = rdusp(); ++ ++ /* This is the X/Open sanctioned signal stack switching. */ ++ if (ka->sa.sa_flags & SA_ONSTACK) { ++ if (!sas_ss_flags(usp)) ++ usp = current->sas_ss_sp + current->sas_ss_size; ++ } ++ return (void __user *)((usp - frame_size) & -8UL); ++} ++ ++static void setup_frame(int sig, struct k_sigaction *ka, ++ sigset_t *set, struct pt_regs *regs) ++{ ++ struct sigframe __user *frame; ++ int fsize = frame_extra_sizes[regs->format]; ++ struct sigcontext context; ++ int err = 0; ++ ++ if (fsize < 0) { ++#ifdef DEBUG ++ printk(KERN_DEBUG "setup_frame: Unknown frame format %#x\n", ++ regs->format); ++#endif ++ goto give_sigsegv; ++ } ++ ++ frame = get_sigframe(ka, regs, sizeof(*frame)); ++ ++ err |= __put_user((current_thread_info()->exec_domain ++ && current_thread_info()->exec_domain->signal_invmap ++ && sig < 32 ++ ? current_thread_info()->exec_domain->signal_invmap[sig] ++ : sig), ++ &frame->sig); ++ ++ err |= __put_user(regs->vector, &frame->code); ++ err |= __put_user(&frame->sc, &frame->psc); ++ ++ if (_NSIG_WORDS > 1) ++ err |= copy_to_user(frame->extramask, &set->sig[1], ++ sizeof(frame->extramask)); ++ ++ setup_sigcontext(&context, regs, set->sig[0]); ++ err |= copy_to_user(&frame->sc, &context, sizeof(context)); ++ ++ /* Set up to return from userspace. */ ++ err |= __put_user(frame->retcode, &frame->pretcode); ++ /* moveq #,d0; trap #0 */ ++ err |= __put_user(0x70004e40 + (__NR_sigreturn << 16), ++ (long __user *)(frame->retcode)); ++ ++ if (err) ++ goto give_sigsegv; ++ ++ push_cache((unsigned long) &frame->retcode); ++ ++ /* Set up registers for signal handler */ ++ wrusp((unsigned long) frame); ++ regs->pc = (unsigned long) ka->sa.sa_handler; ++ ++adjust_stack: ++ /* Prepare to skip over the extra stuff in the exception frame. */ ++ if (regs->stkadj) { ++ struct pt_regs *tregs = ++ (struct pt_regs *)((ulong)regs + regs->stkadj); ++#ifdef DEBUG ++ printk(KERN_DEBUG "Performing stackadjust=%04x\n", ++ regs->stkadj); ++#endif ++ /* This must be copied with decreasing addresses to ++ handle overlaps. */ ++ tregs->vector = 0; ++ tregs->format = 0; ++ tregs->pc = regs->pc; ++ tregs->sr = regs->sr; ++ } ++ return; ++ ++give_sigsegv: ++ force_sigsegv(sig, current); ++ goto adjust_stack; ++} ++ ++static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, ++ sigset_t *set, struct pt_regs *regs) ++{ ++ struct rt_sigframe __user *frame; ++ int fsize = frame_extra_sizes[regs->format]; ++ int err = 0; ++ ++ if (fsize < 0) { ++#ifdef DEBUG ++ printk(KERN_DEBUG "setup_frame: Unknown frame format %#x\n", ++ regs->format); ++#endif ++ goto give_sigsegv; ++ } ++ ++ frame = get_sigframe(ka, regs, sizeof(*frame)); ++ ++ if (fsize) { ++ err |= copy_to_user(&frame->uc.uc_extra, regs + 1, fsize); ++ regs->stkadj = fsize; ++ } ++ ++ err |= __put_user((current_thread_info()->exec_domain ++ && current_thread_info()->exec_domain->signal_invmap ++ && sig < 32 ++ ? current_thread_info()->exec_domain->signal_invmap[sig] ++ : sig), ++ &frame->sig); ++ err |= __put_user(&frame->info, &frame->pinfo); ++ err |= __put_user(&frame->uc, &frame->puc); ++ err |= copy_siginfo_to_user(&frame->info, info); ++ ++ /* Create the ucontext. */ ++ err |= __put_user(0, &frame->uc.uc_flags); ++ err |= __put_user(NULL, &frame->uc.uc_link); ++ err |= __put_user((void __user *)current->sas_ss_sp, ++ &frame->uc.uc_stack.ss_sp); ++ err |= __put_user(sas_ss_flags(rdusp()), ++ &frame->uc.uc_stack.ss_flags); ++ err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size); ++ err |= rt_setup_ucontext(&frame->uc, regs); ++ err |= copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); ++ ++ /* Set up to return from userspace. */ ++ err |= __put_user(frame->retcode, &frame->pretcode); ++ ++ /* moveq #,d0; andi.l #,D0; trap #0 */ ++ err |= __put_user(0x70AD0280, (long *)(frame->retcode + 0)); ++ err |= __put_user(0x000000ff, (long *)(frame->retcode + 4)); ++ err |= __put_user(0x4e400000, (long *)(frame->retcode + 8)); ++ ++ if (err) ++ goto give_sigsegv; ++ ++ push_cache((unsigned long) &frame->retcode); ++ ++ /* Set up registers for signal handler */ ++ wrusp((unsigned long) frame); ++ regs->pc = (unsigned long) ka->sa.sa_handler; ++ ++adjust_stack: ++ /* Prepare to skip over the extra stuff in the exception frame. */ ++ if (regs->stkadj) { ++ struct pt_regs *tregs = ++ (struct pt_regs *)((ulong)regs + regs->stkadj); ++#ifdef DEBUG ++ printk(KERN_DEBUG "Performing stackadjust=%04x\n", ++ regs->stkadj); ++#endif ++ /* This must be copied with decreasing addresses to ++ handle overlaps. */ ++ tregs->vector = 0; ++ tregs->format = 0; ++ tregs->pc = regs->pc; ++ tregs->sr = regs->sr; ++ } ++ return; ++ ++give_sigsegv: ++ force_sigsegv(sig, current); ++ goto adjust_stack; ++} ++ ++static inline void ++handle_restart(struct pt_regs *regs, struct k_sigaction *ka, int has_handler) ++{ ++ switch (regs->d0) { ++ case -ERESTARTNOHAND: ++ if (!has_handler) ++ goto do_restart; ++ regs->d0 = -EINTR; ++ break; ++ ++ case -ERESTARTSYS: ++ if (has_handler && !(ka->sa.sa_flags & SA_RESTART)) { ++ regs->d0 = -EINTR; ++ break; ++ } ++ /* fallthrough */ ++ case -ERESTARTNOINTR: ++do_restart: ++ regs->d0 = regs->orig_d0; ++ regs->pc -= 2; ++ break; ++ } ++} ++ ++/* ++ * OK, we're invoking a handler ++ */ ++static void ++handle_signal(int sig, struct k_sigaction *ka, siginfo_t *info, ++ sigset_t *oldset, struct pt_regs *regs) ++{ ++ /* are we from a system call? */ ++ if (regs->orig_d0 >= 0) ++ /* If so, check system call restarting.. */ ++ handle_restart(regs, ka, 1); ++ ++ /* set up the stack frame */ ++ if (ka->sa.sa_flags & SA_SIGINFO) ++ setup_rt_frame(sig, ka, info, oldset, regs); ++ else ++ setup_frame(sig, ka, oldset, regs); ++ ++ if (ka->sa.sa_flags & SA_ONESHOT) ++ ka->sa.sa_handler = SIG_DFL; ++ ++ spin_lock_irq(¤t->sighand->siglock); ++ sigorsets(¤t->blocked, ¤t->blocked, &ka->sa.sa_mask); ++ if (!(ka->sa.sa_flags & SA_NODEFER)) ++ sigaddset(¤t->blocked, sig); ++ recalc_sigpending(); ++ spin_unlock_irq(¤t->sighand->siglock); ++} ++ ++/* ++ * Note that 'init' is a special process: it doesn't get signals it doesn't ++ * want to handle. Thus you cannot kill init even with a SIGKILL even by ++ * mistake. ++ */ ++asmlinkage int do_signal(sigset_t *oldset, struct pt_regs *regs) ++{ ++ siginfo_t info; ++ struct k_sigaction ka; ++ int signr; ++ ++ current->thread.esp0 = (unsigned long) regs; ++ ++ if (!oldset) ++ oldset = ¤t->blocked; ++ ++ signr = get_signal_to_deliver(&info, &ka, regs, NULL); ++ if (signr > 0) { ++ /* Whee! Actually deliver the signal. */ ++ handle_signal(signr, &ka, &info, oldset, regs); ++ return 1; ++ } ++ ++ /* Did we come from a system call? */ ++ if (regs->orig_d0 >= 0) ++ /* Restart the system call - no handlers present */ ++ handle_restart(regs, NULL, 0); ++ ++ return 0; ++} +--- /dev/null ++++ b/arch/m68k/coldfire/traps.c +@@ -0,0 +1,454 @@ ++/* ++ * linux/arch/m68knommu/kernel/traps.c ++ * ++ * Copyright (C) 1993, 1994 by Hamish Macdonald ++ * ++ * 68040 fixes by Michael Rausch ++ * 68040 fixes by Martin Apel ++ * 68060 fixes by Roman Hodek ++ * 68060 fixes by Jesper Skov ++ * ++ * This file is subject to the terms and conditions of the GNU General Public ++ * License. See the file COPYING in the main directory of this archive ++ * for more details. ++ */ ++ ++/* ++ * Sets up all exception vectors ++ */ ++#include <linux/sched.h> ++#include <linux/signal.h> ++#include <linux/kernel.h> ++#include <linux/mm.h> ++#include <linux/module.h> ++#include <linux/types.h> ++#include <linux/a.out.h> ++#include <linux/user.h> ++#include <linux/string.h> ++#include <linux/linkage.h> ++#include <linux/init.h> ++#include <linux/ptrace.h> ++#include <linux/kallsyms.h> ++ ++#include <asm/setup.h> ++#include <asm/fpu.h> ++#include <asm/system.h> ++#include <asm/uaccess.h> ++#include <asm/traps.h> ++#include <asm/pgtable.h> ++#include <asm/machdep.h> ++#include <asm/siginfo.h> ++ ++static char const * const vec_names[] = { ++ "RESET SP", "RESET PC", "BUS ERROR", "ADDRESS ERROR", ++ "ILLEGAL INSTRUCTION", "ZERO DIVIDE", "CHK", "TRAPcc", ++ "PRIVILEGE VIOLATION", "TRACE", "LINE 1010", "LINE 1111", ++ "UNASSIGNED RESERVED 12", "COPROCESSOR PROTOCOL VIOLATION", ++ "FORMAT ERROR", "UNINITIALIZED INTERRUPT", ++ "UNASSIGNED RESERVED 16", "UNASSIGNED RESERVED 17", ++ "UNASSIGNED RESERVED 18", "UNASSIGNED RESERVED 19", ++ "UNASSIGNED RESERVED 20", "UNASSIGNED RESERVED 21", ++ "UNASSIGNED RESERVED 22", "UNASSIGNED RESERVED 23", ++ "SPURIOUS INTERRUPT", "LEVEL 1 INT", "LEVEL 2 INT", "LEVEL 3 INT", ++ "LEVEL 4 INT", "LEVEL 5 INT", "LEVEL 6 INT", "LEVEL 7 INT", ++ "SYSCALL", "TRAP #1", "TRAP #2", "TRAP #3", ++ "TRAP #4", "TRAP #5", "TRAP #6", "TRAP #7", ++ "TRAP #8", "TRAP #9", "TRAP #10", "TRAP #11", ++ "TRAP #12", "TRAP #13", "TRAP #14", "TRAP #15", ++ "FPCP BSUN", "FPCP INEXACT", "FPCP DIV BY 0", "FPCP UNDERFLOW", ++ "FPCP OPERAND ERROR", "FPCP OVERFLOW", "FPCP SNAN", ++ "FPCP UNSUPPORTED OPERATION", ++ "MMU CONFIGURATION ERROR" ++}; ++ ++asmlinkage int do_page_fault(struct pt_regs *regs, unsigned long address, ++ unsigned long error_code); ++asmlinkage void trap_c(struct frame *fp); ++extern void __init coldfire_trap_init(void); ++ ++void __init trap_init(void) ++{ ++ coldfire_trap_init(); ++} ++ ++/* The following table converts the FS encoding of a ColdFire ++ exception stack frame into the error_code value needed by ++ do_fault. */ ++ ++static const unsigned char fs_err_code[] = { ++ 0, /* 0000 */ ++ 0, /* 0001 */ ++ 0, /* 0010 */ ++ 0, /* 0011 */ ++ 1, /* 0100 */ ++ 0, /* 0101 */ ++ 0, /* 0110 */ ++ 0, /* 0111 */ ++ 2, /* 1000 */ ++ 3, /* 1001 */ ++ 2, /* 1010 */ ++ 0, /* 1011 */ ++ 1, /* 1100 */ ++ 1, /* 1101 */ ++ 0, /* 1110 */ ++ 0 /* 1111 */ ++}; ++ ++#ifdef DEBUG ++static const char *fs_err_msg[16] = { ++ "Normal", ++ "Reserved", ++ "Interrupt during debug service routine", ++ "Reserved", ++ "X Protection", ++ "TLB X miss (opword)", ++ "TLB X miss (ext. word)", ++ "IFP in emulator mode", ++ "W Protection", ++ "Write error", ++ "TLB W miss", ++ "Reserved", ++ "R Protection", ++ "R/RMW Protection", ++ "TLB R miss", ++ "OEP in emulator mode", ++}; ++#endif ++ ++static inline void access_errorCF(struct frame *fp) ++{ ++ unsigned long int mmusr, complainingAddress; ++ unsigned int err_code, fs; ++ int need_page_fault; ++ ++ mmusr = fp->ptregs.mmusr; ++ complainingAddress = fp->ptregs.mmuar; ++#ifdef DEBUG ++ printk(KERN_DEBUG "pc %#lx, mmusr %#lx, complainingAddress %#lx\n", \ ++ fp->ptregs.pc, mmusr, complainingAddress); ++#endif ++ ++ /* ++ * error_code: ++ * bit 0 == 0 means no page found, 1 means protection fault ++ * bit 1 == 0 means read, 1 means write ++ */ ++ ++ fs = (fp->ptregs.fs2 << 2) | fp->ptregs.fs1; ++ switch (fs) { ++ case 5: /* 0101 TLB opword X miss */ ++ need_page_fault = cf_tlb_miss(&fp->ptregs, 0, 0, 0); ++ complainingAddress = fp->ptregs.pc; ++ break; ++ case 6: /* 0110 TLB extension word X miss */ ++ need_page_fault = cf_tlb_miss(&fp->ptregs, 0, 0, 1); ++ complainingAddress = fp->ptregs.pc + sizeof(long); ++ break; ++ case 10: /* 1010 TLB W miss */ ++ need_page_fault = cf_tlb_miss(&fp->ptregs, 1, 1, 0); ++ break; ++ case 14: /* 1110 TLB R miss */ ++ need_page_fault = cf_tlb_miss(&fp->ptregs, 0, 1, 0); ++ break; ++ default: ++ /* 0000 Normal */ ++ /* 0001 Reserved */ ++ /* 0010 Interrupt during debug service routine */ ++ /* 0011 Reserved */ ++ /* 0100 X Protection */ ++ /* 0111 IFP in emulator mode */ ++ /* 1000 W Protection*/ ++ /* 1001 Write error*/ ++ /* 1011 Reserved*/ ++ /* 1100 R Protection*/ ++ /* 1101 R Protection*/ ++ /* 1111 OEP in emulator mode*/ ++ need_page_fault = 1; ++ break; ++ } ++ ++ if (need_page_fault) { ++ err_code = fs_err_code[fs]; ++ if ((fs == 13) && (mmusr & MMUSR_WF)) /* rd-mod-wr access */ ++ err_code |= 2; /* bit1 - write, bit0 - protection */ ++ do_page_fault(&fp->ptregs, complainingAddress, err_code); ++ } ++} ++ ++void die_if_kernel(char *str, struct pt_regs *fp, int nr) ++{ ++ if (!(fp->sr & PS_S)) ++ return; ++ ++ console_verbose(); ++ printk(KERN_EMERG "%s: %08x\n", str, nr); ++ printk(KERN_EMERG "PC: [<%08lx>]", fp->pc); ++ print_symbol(" %s", fp->pc); ++ printk(KERN_EMERG "\nSR: %04x SP: %p a2: %08lx\n", ++ fp->sr, fp, fp->a2); ++ printk(KERN_EMERG "d0: %08lx d1: %08lx d2: %08lx d3: %08lx\n", ++ fp->d0, fp->d1, fp->d2, fp->d3); ++ printk(KERN_EMERG "d4: %08lx d5: %08lx a0: %08lx a1: %08lx\n", ++ fp->d4, fp->d5, fp->a0, fp->a1); ++ ++ printk(KERN_EMERG "Process %s (pid: %d, stackpage=%08lx)\n", ++ current->comm, current->pid, PAGE_SIZE+(unsigned long)current); ++ show_stack(NULL, (unsigned long *)fp); ++ do_exit(SIGSEGV); ++} ++ ++asmlinkage void buserr_c(struct frame *fp) ++{ ++ unsigned int fs; ++ ++ /* Only set esp0 if coming from user mode */ ++ if (user_mode(&fp->ptregs)) ++ current->thread.esp0 = (unsigned long) fp; ++ ++ fs = (fp->ptregs.fs2 << 2) | fp->ptregs.fs1; ++#if defined(DEBUG) ++ printk(KERN_DEBUG "*** Bus Error *** (%x)%s\n", fs, ++ fs_err_msg[fs & 0xf]); ++#endif ++ switch (fs) { ++ case 0x5: ++ case 0x6: ++ case 0x7: ++ case 0x9: ++ case 0xa: ++ case 0xd: ++ case 0xe: ++ case 0xf: ++ access_errorCF(fp); ++ break; ++ default: ++ die_if_kernel("bad frame format", &fp->ptregs, 0); ++#if defined(DEBUG) ++ printk(KERN_DEBUG "Unknown SIGSEGV - 4\n"); ++#endif ++ force_sig(SIGSEGV, current); ++ } ++} ++ ++ ++int kstack_depth_to_print = 48; ++ ++void show_stack(struct task_struct *task, unsigned long *stack) ++{ ++ unsigned long *endstack, addr, symaddr; ++ extern char _start, _etext; ++ int i; ++ ++ if (!stack) { ++ if (task) ++ stack = (unsigned long *)task->thread.ksp; ++ else ++ stack = (unsigned long *)&stack; ++ } ++ ++ addr = (unsigned long) stack; ++ endstack = (unsigned long *) PAGE_ALIGN(addr); ++ ++ printk(KERN_EMERG "Stack from %08lx:", (unsigned long)stack); ++ for (i = 0; i < kstack_depth_to_print; i++) { ++ if (stack + 1 > endstack) ++ break; ++ if (i % 8 == 0) ++ printk("\n" KERN_EMERG " "); ++ symaddr = *stack; ++ printk(KERN_EMERG " %08lx", *stack++); ++ if ((symaddr >= 0xc0000000) && (symaddr < 0xc1000000)) ++ print_symbol("(%s)", symaddr); ++ } ++ printk("\n"); ++ ++ printk(KERN_EMERG "Call Trace:"); ++ i = 0; ++ while (stack + 1 <= endstack) { ++ addr = *stack++; ++ /* ++ * If the address is either in the text segment of the ++ * kernel, or in the region which contains vmalloc'ed ++ * memory, it *may* be the address of a calling ++ * routine; if so, print it so that someone tracing ++ * down the cause of the crash will be able to figure ++ * out the call path that was taken. ++ */ ++ if (((addr >= (unsigned long) &_start) && ++ (addr <= (unsigned long) &_etext))) { ++ if (i % 4 == 0) ++ printk("\n" KERN_EMERG " "); ++ printk(KERN_EMERG " [<%08lx>]", addr); ++ i++; ++ } ++ } ++ printk("\n"); ++} ++ ++void bad_super_trap(struct frame *fp) ++{ ++ console_verbose(); ++ if (fp->ptregs.vector < 4*sizeof(vec_names)/sizeof(vec_names[0])) ++ printk(KERN_WARNING "*** %s *** FORMAT=%X\n", ++ vec_names[(fp->ptregs.vector) >> 2], ++ fp->ptregs.format); ++ else ++ printk(KERN_WARNING "*** Exception %d *** FORMAT=%X\n", ++ (fp->ptregs.vector) >> 2, ++ fp->ptregs.format); ++ printk(KERN_WARNING "Current process id is %d\n", current->pid); ++ die_if_kernel("BAD KERNEL TRAP", &fp->ptregs, 0); ++} ++ ++asmlinkage void trap_c(struct frame *fp) ++{ ++ int sig; ++ siginfo_t info; ++ ++ if (fp->ptregs.sr & PS_S) { ++ if ((fp->ptregs.vector >> 2) == VEC_TRACE) { ++ /* traced a trapping instruction */ ++ current->ptrace |= PT_DTRACE; ++ } else ++ bad_super_trap(fp); ++ return; ++ } ++ ++ /* send the appropriate signal to the user program */ ++ switch ((fp->ptregs.vector) >> 2) { ++ case VEC_ADDRERR: ++ info.si_code = BUS_ADRALN; ++ sig = SIGBUS; ++ break; ++ case VEC_ILLEGAL: ++ case VEC_LINE10: ++ case VEC_LINE11: ++ info.si_code = ILL_ILLOPC; ++ sig = SIGILL; ++ break; ++ case VEC_PRIV: ++ info.si_code = ILL_PRVOPC; ++ sig = SIGILL; ++ break; ++ case VEC_COPROC: ++ info.si_code = ILL_COPROC; ++ sig = SIGILL; ++ break; ++ case VEC_TRAP1: /* gdbserver breakpoint */ ++ fp->ptregs.pc -= 2; ++ info.si_code = TRAP_TRACE; ++ sig = SIGTRAP; ++ break; ++ case VEC_TRAP2: ++ case VEC_TRAP3: ++ case VEC_TRAP4: ++ case VEC_TRAP5: ++ case VEC_TRAP6: ++ case VEC_TRAP7: ++ case VEC_TRAP8: ++ case VEC_TRAP9: ++ case VEC_TRAP10: ++ case VEC_TRAP11: ++ case VEC_TRAP12: ++ case VEC_TRAP13: ++ case VEC_TRAP14: ++ info.si_code = ILL_ILLTRP; ++ sig = SIGILL; ++ break; ++ case VEC_FPBRUC: ++ case VEC_FPOE: ++ case VEC_FPNAN: ++ info.si_code = FPE_FLTINV; ++ sig = SIGFPE; ++ break; ++ case VEC_FPIR: ++ info.si_code = FPE_FLTRES; ++ sig = SIGFPE; ++ break; ++ case VEC_FPDIVZ: ++ info.si_code = FPE_FLTDIV; ++ sig = SIGFPE; ++ break; ++ case VEC_FPUNDER: ++ info.si_code = FPE_FLTUND; ++ sig = SIGFPE; ++ break; ++ case VEC_FPOVER: ++ info.si_code = FPE_FLTOVF; ++ sig = SIGFPE; ++ break; ++ case VEC_ZERODIV: ++ info.si_code = FPE_INTDIV; ++ sig = SIGFPE; ++ break; ++ case VEC_CHK: ++ case VEC_TRAP: ++ info.si_code = FPE_INTOVF; ++ sig = SIGFPE; ++ break; ++ case VEC_TRACE: /* ptrace single step */ ++ info.si_code = TRAP_TRACE; ++ sig = SIGTRAP; ++ break; ++ case VEC_TRAP15: /* breakpoint */ ++ info.si_code = TRAP_BRKPT; ++ sig = SIGTRAP; ++ break; ++ default: ++ info.si_code = ILL_ILLOPC; ++ sig = SIGILL; ++ break; ++ } ++ info.si_signo = sig; ++ info.si_errno = 0; ++ switch (fp->ptregs.format) { ++ default: ++ info.si_addr = (void *) fp->ptregs.pc; ++ break; ++ case 2: ++ info.si_addr = (void *) fp->un.fmt2.iaddr; ++ break; ++ case 7: ++ info.si_addr = (void *) fp->un.fmt7.effaddr; ++ break; ++ case 9: ++ info.si_addr = (void *) fp->un.fmt9.iaddr; ++ break; ++ case 10: ++ info.si_addr = (void *) fp->un.fmta.daddr; ++ break; ++ case 11: ++ info.si_addr = (void *) fp->un.fmtb.daddr; ++ break; ++ } ++ force_sig_info(sig, &info, current); ++} ++ ++asmlinkage void set_esp0(unsigned long ssp) ++{ ++ current->thread.esp0 = ssp; ++} ++ ++/* ++ * The architecture-independent backtrace generator ++ */ ++void dump_stack(void) ++{ ++ unsigned long stack; ++ ++ show_stack(current, &stack); ++} ++EXPORT_SYMBOL(dump_stack); ++ ++#ifdef CONFIG_M68KFPU_EMU ++asmlinkage void fpemu_signal(int signal, int code, void *addr) ++{ ++ siginfo_t info; ++ ++ info.si_signo = signal; ++ info.si_errno = 0; ++ info.si_code = code; ++ info.si_addr = addr; ++ force_sig_info(signal, &info, current); ++} ++#endif +--- /dev/null ++++ b/arch/m68k/coldfire/vmlinux-cf.lds +@@ -0,0 +1,92 @@ ++/* ld script to make m68k Coldfire Linux kernel */ ++ ++#include <asm-generic/vmlinux.lds.h> ++ ++OUTPUT_FORMAT("elf32-m68k", "elf32-m68k", "elf32-m68k") ++OUTPUT_ARCH(m68k) ++ENTRY(_start) ++jiffies = jiffies_64 + 4; ++SECTIONS ++{ ++ . = 0xC0020000; ++ _text = .; /* Text and read-only data */ ++ .text : { ++ *(.text.head) ++ TEXT_TEXT ++ SCHED_TEXT ++ LOCK_TEXT ++ *(.fixup) ++ *(.gnu.warning) ++ } :text = 0x4e75 ++ ++ _etext = .; /* End of text section */ ++ ++ . = ALIGN(16); ++ __start___ex_table = .; ++ __ex_table : { *(__ex_table) } ++ __stop___ex_table = .; ++ ++ RODATA ++ ++ .data : { /* Data */ ++ DATA_DATA ++ CONSTRUCTORS ++ } ++ ++ .bss : { *(.bss) } /* BSS */ ++ ++ . = ALIGN(16); ++ .data.cacheline_aligned : { *(.data.cacheline_aligned) } :data ++ ++ _edata = .; /* End of data section */ ++ ++ . = ALIGN(8192); /* Initrd */ ++ __init_begin = .; ++ .init.text : { ++ _sinittext = .; ++ *(.init.text) ++ _einittext = .; ++ } ++ .init.data : { *(.init.data) } ++ . = ALIGN(16); ++ __setup_start = .; ++ .init.setup : { *(.init.setup) } ++ __setup_end = .; ++ __initcall_start = .; ++ .initcall.init : { ++ INITCALLS ++ } ++ __initcall_end = .; ++ __con_initcall_start = .; ++ .con_initcall.init : { *(.con_initcall.init) } ++ __con_initcall_end = .; ++ SECURITY_INIT ++#ifdef CONFIG_BLK_DEV_INITRD ++ . = ALIGN(8192); ++ __initramfs_start = .; ++ .init.ramfs : { *(.init.ramfs) } ++ __initramfs_end = .; ++#endif ++ . = ALIGN(8192); ++ __init_end = .; ++ ++ .data.init_task : { *(.data.init_task) } /* The initial task and kernel stack */ ++ ++ _end = . ; ++ ++ /* Sections to be discarded */ ++ /DISCARD/ : { ++ *(.exit.text) ++ *(.exit.data) ++ *(.exitcall.exit) ++ } ++ ++ /* Stabs debugging sections. */ ++ .stab 0 : { *(.stab) } ++ .stabstr 0 : { *(.stabstr) } ++ .stab.excl 0 : { *(.stab.excl) } ++ .stab.exclstr 0 : { *(.stab.exclstr) } ++ .stab.index 0 : { *(.stab.index) } ++ .stab.indexstr 0 : { *(.stab.indexstr) } ++ .comment 0 : { *(.comment) } ++} diff --git a/target/linux/coldfire/patches/009-m5445x_serial.patch b/target/linux/coldfire/patches/009-m5445x_serial.patch new file mode 100644 index 0000000000..351ea8a12d --- /dev/null +++ b/target/linux/coldfire/patches/009-m5445x_serial.patch @@ -0,0 +1,73 @@ +From 4b5a534c16325217c05a87938885c0ee1fe69a34 Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Wed, 31 Oct 2007 17:01:41 -0600 +Subject: [PATCH] MCF5445x core serial support. + +LTIBName: m5445x-serial +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + drivers/serial/mcfserial.c | 23 +++++++++++++++++++++-- + 1 files changed, 21 insertions(+), 2 deletions(-) + +--- a/drivers/serial/mcfserial.c ++++ b/drivers/serial/mcfserial.c +@@ -45,7 +45,9 @@ + #include <asm/coldfire.h> + #include <asm/mcfsim.h> + #include <asm/mcfuart.h> ++#ifdef CONFIG_NETtel + #include <asm/nettel.h> ++#endif + #include <asm/uaccess.h> + #include "mcfserial.h" + +@@ -61,7 +63,8 @@ struct timer_list mcfrs_timer_struct; + #define CONSOLE_BAUD_RATE 38400 + #define DEFAULT_CBAUD B38400 + #elif defined(CONFIG_MOD5272) || defined(CONFIG_M5208EVB) || \ +- defined(CONFIG_M5329EVB) || defined(CONFIG_GILBARCO) ++ defined(CONFIG_M5329EVB) || defined(CONFIG_GILBARCO) || \ ++ defined(CONFIG_M54455) + #define CONSOLE_BAUD_RATE 115200 + #define DEFAULT_CBAUD B115200 + #elif defined(CONFIG_ARNEWSH) || defined(CONFIG_FREESCALE) || \ +@@ -94,7 +97,7 @@ static struct tty_driver *mcfrs_serial_d + #undef SERIAL_DEBUG_FLOW + + #if defined(CONFIG_M523x) || defined(CONFIG_M527x) || defined(CONFIG_M528x) || \ +- defined(CONFIG_M520x) || defined(CONFIG_M532x) ++ defined(CONFIG_M520x) || defined(CONFIG_M532x) || defined(CONFIG_M54455) + #define IRQBASE (MCFINT_VECBASE+MCFINT_UART0) + #else + #define IRQBASE 73 +@@ -1604,6 +1607,20 @@ static void mcfrs_irqinit(struct mcf_ser + /* GPIOs also must be initalized, depends on board */ + break; + } ++#elif defined(CONFIG_M54455) ++ volatile unsigned char *uartp; ++ uartp = info->addr; ++ switch (info->line) { ++ case 0: ++ MCF_GPIO_PAR_UART |= 0x000F; ++ break; ++ case 1: ++ MCF_GPIO_PAR_UART |= 0x0FF0; ++ break; ++ case 2: ++ /* GPIOs also must be initalized, depends on board */ ++ break; ++ } + #else + volatile unsigned char *icrp, *uartp; + +@@ -1966,7 +1983,9 @@ struct console mcfrs_console = { + + static int __init mcfrs_console_init(void) + { ++#ifndef CONFIG_M54455 + register_console(&mcfrs_console); ++#endif + return 0; + } + diff --git a/target/linux/coldfire/patches/010-m5445x_fec.patch b/target/linux/coldfire/patches/010-m5445x_fec.patch new file mode 100644 index 0000000000..0a87bd4cde --- /dev/null +++ b/target/linux/coldfire/patches/010-m5445x_fec.patch @@ -0,0 +1,392 @@ +From c562ab80fe383e6fa49dbe38257421cf37f0e4b3 Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Wed, 31 Oct 2007 17:07:25 -0600 +Subject: [PATCH] MCF5445x FEC support. + +LTIBName: m5445x-fec +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + drivers/net/Kconfig | 8 ++- + drivers/net/fec.c | 207 ++++++++++++++++++++++++++++++++++++++++++++++---- + drivers/net/fec.h | 2 +- + 3 files changed, 198 insertions(+), 19 deletions(-) + +--- a/drivers/net/Kconfig ++++ b/drivers/net/Kconfig +@@ -1973,7 +1973,7 @@ config 68360_ENET + + config FEC + bool "FEC ethernet controller (of ColdFire CPUs)" +- depends on M523x || M527x || M5272 || M528x || M520x ++ depends on M523x || M527x || M5272 || M528x || M520x || M54455 + help + Say Y here if you want to use the built-in 10/100 Fast ethernet + controller on some Motorola ColdFire processors. +@@ -1985,6 +1985,12 @@ config FEC2 + Say Y here if you want to use the second built-in 10/100 Fast + ethernet controller on some Motorola ColdFire processors. + ++config FEC_SHARED_PHY ++ bool "Shared PHY interface(on some ColdFire designs)" ++ depends on FEC2 ++ help ++ Say Y here if both PHYs are controlled via a single channel. ++ + config FEC_MPC52xx + tristate "MPC52xx FEC driver" + depends on PPC_MERGE && PPC_MPC52xx && PPC_BESTCOMM_FEC +--- a/drivers/net/fec.c ++++ b/drivers/net/fec.c +@@ -51,7 +51,9 @@ + + #if defined(CONFIG_M523x) || defined(CONFIG_M527x) || \ + defined(CONFIG_M5272) || defined(CONFIG_M528x) || \ +- defined(CONFIG_M520x) || defined(CONFIG_M532x) ++ defined(CONFIG_M520x) || defined(CONFIG_M532x) || \ ++ defined(CONFIG_M54455) ++ + #include <asm/coldfire.h> + #include <asm/mcfsim.h> + #include "fec.h" +@@ -82,6 +84,11 @@ static unsigned int fec_hw[] = { + (MCF_MBAR+0x30000), + #elif defined(CONFIG_M532x) + (MCF_MBAR+0xfc030000), ++#elif defined(CONFIG_M54455) ++ (MCF_MBAR+0xfc030000), ++#if defined(CONFIG_FEC2) ++ (MCF_MBAR+0xfc034000), ++#endif + #else + &(((immap_t *)IMAP_ADDR)->im_cpm.cp_fec), + #endif +@@ -172,7 +179,7 @@ typedef struct { + * account when setting it. + */ + #if defined(CONFIG_M523x) || defined(CONFIG_M527x) || defined(CONFIG_M528x) || \ +- defined(CONFIG_M520x) || defined(CONFIG_M532x) ++ defined(CONFIG_M520x) || defined(CONFIG_M532x) || defined(CONFIG_M54455) + #define OPT_FRAME_SIZE (PKT_MAXBUF_SIZE << 16) + #else + #define OPT_FRAME_SIZE 0 +@@ -213,6 +220,7 @@ struct fec_enet_private { + uint phy_speed; + phy_info_t const *phy; + struct work_struct phy_task; ++ volatile fec_t *phy_hwp; + + uint sequence_done; + uint mii_phy_task_queued; +@@ -349,7 +357,8 @@ fec_enet_start_xmit(struct sk_buff *skb, + if (bdp->cbd_bufaddr & 0x3) { + unsigned int index; + index = bdp - fep->tx_bd_base; +- memcpy(fep->tx_bounce[index], (void *) bdp->cbd_bufaddr, bdp->cbd_datlen); ++ memcpy(fep->tx_bounce[index], ++ (void *)skb->data, bdp->cbd_datlen); + bdp->cbd_bufaddr = __pa(fep->tx_bounce[index]); + } + +@@ -702,7 +711,7 @@ fec_enet_mii(struct net_device *dev) + uint mii_reg; + + fep = netdev_priv(dev); +- ep = fep->hwp; ++ ep = fep->phy_hwp; + mii_reg = ep->fec_mii_data; + + spin_lock(&fep->lock); +@@ -753,7 +762,7 @@ mii_queue(struct net_device *dev, int re + mii_tail = mip; + } else { + mii_head = mii_tail = mip; +- fep->hwp->fec_mii_data = regval; ++ fep->phy_hwp->fec_mii_data = regval; + } + } else { + retval = 1; +@@ -1151,8 +1160,7 @@ static phy_info_t const phy_info_ks8721b + }; + + /* ------------------------------------------------------------------------- */ +-/* register definitions for the DP83848 */ +- ++/* register definitions for the DP83848 and DP83849 */ + #define MII_DP8384X_PHYSTST 16 /* PHY Status Register */ + + static void mii_parse_dp8384x_sr2(uint mii_reg, struct net_device *dev) +@@ -1186,27 +1194,50 @@ static void mii_parse_dp8384x_sr2(uint m + *s |= PHY_STAT_FAULT; + } + ++static phy_cmd_t const phy_cmd_dp8384x_ack_int[] = { ++ { mk_mii_end, } ++ }; ++ ++static phy_cmd_t const phy_cmd_dp8384x_shutdown[] = { ++ { mk_mii_end, } ++ }; ++ + static phy_info_t phy_info_dp83848= { +- 0x020005c9, +- "DP83848", ++ .id = 0x020005c9, ++ .name = "DP83848", + +- (const phy_cmd_t []) { /* config */ ++ .config = (const phy_cmd_t []) { /* config */ + { mk_mii_read(MII_REG_CR), mii_parse_cr }, + { mk_mii_read(MII_REG_ANAR), mii_parse_anar }, + { mk_mii_read(MII_DP8384X_PHYSTST), mii_parse_dp8384x_sr2 }, + { mk_mii_end, } + }, +- (const phy_cmd_t []) { /* startup - enable interrupts */ ++ .startup = (const phy_cmd_t []) { /* startup - enable interrupts */ + { mk_mii_write(MII_REG_CR, 0x1200), NULL }, /* autonegotiate */ + { mk_mii_read(MII_REG_SR), mii_parse_sr }, + { mk_mii_end, } + }, +- (const phy_cmd_t []) { /* ack_int - never happens, no interrupt */ ++ .ack_int = phy_cmd_dp8384x_ack_int, ++ .shutdown = phy_cmd_dp8384x_shutdown, ++}; ++ ++static phy_info_t phy_info_dp83849 = { ++ .id = 0x020005ca, ++ .name = "DP83849", ++ ++ .config = (const phy_cmd_t []) { /* config */ ++ { mk_mii_read(MII_REG_CR), mii_parse_cr }, ++ { mk_mii_read(MII_REG_ANAR), mii_parse_anar }, ++ { mk_mii_read(MII_DP8384X_PHYSTST), mii_parse_dp8384x_sr2 }, + { mk_mii_end, } + }, +- (const phy_cmd_t []) { /* shutdown */ ++ .startup = (const phy_cmd_t []) { /* startup - enable interrupts */ ++ { mk_mii_write(MII_REG_CR, 0x1200), NULL }, /* autonegotiate */ ++ { mk_mii_read(MII_REG_SR), mii_parse_sr }, + { mk_mii_end, } + }, ++ .ack_int = phy_cmd_dp8384x_ack_int, ++ .shutdown = phy_cmd_dp8384x_shutdown, + }; + + /* ------------------------------------------------------------------------- */ +@@ -1218,6 +1249,7 @@ static phy_info_t const * const phy_info + &phy_info_am79c874, + &phy_info_ks8721bl, + &phy_info_dp83848, ++ &phy_info_dp83849, + NULL + }; + +@@ -1799,6 +1831,138 @@ static void __inline__ fec_uncache(unsig + + /* ------------------------------------------------------------------------- */ + ++#elif defined(CONFIG_M54455) ++/* ++ * Code specific for M54455 ++ */ ++ ++static void __inline__ fec_request_intrs(struct net_device *dev) ++{ ++ struct fec_enet_private *fep; ++ int b; ++ static const struct idesc { ++ char *name; ++ unsigned short irq; ++ } *idp, id[] = { ++ { "fec(TXF)", 36 }, ++ { "fec(TXB)", 37 }, ++ { "fec(TXFIFO)", 38 }, ++ { "fec(TXCR)", 39 }, ++ { "fec(RXF)", 40 }, ++ { "fec(RXB)", 41 }, ++ { "fec(MII)", 42 }, ++ { "fec(LC)", 43 }, ++ { "fec(HBERR)", 44 }, ++ { "fec(GRA)", 45 }, ++ { "fec(EBERR)", 46 }, ++ { "fec(BABT)", 47 }, ++ { "fec(BABR)", 48 }, ++ { NULL }, ++ }; ++ ++ fep = netdev_priv(dev); ++ b = (fep->index) ? 77 : 64; ++ ++ /* Setup interrupt handlers. */ ++ for (idp = id; idp->name; idp++) { ++ if (request_irq(b+idp->irq, fec_enet_interrupt, 0, ++ idp->name, dev) != 0) ++ printk(KERN_ERR "FEC: Could not alloc %s IRQ(%d)!\n", ++ idp->name, b+idp->irq); ++ } ++ ++ if (fep->index) { ++ /* Configure RMII */ ++ MCF_GPIO_PAR_FEC = (MCF_GPIO_PAR_FEC & ++ MCF_GPIO_PAR_FEC_FEC1_MASK) | ++ MCF_GPIO_PAR_FEC_FEC1_RMII_GPIO; ++ } else { ++ /* Configure RMII */ ++ MCF_GPIO_PAR_FEC = (MCF_GPIO_PAR_FEC & ++ MCF_GPIO_PAR_FEC_FEC0_MASK) | ++ MCF_GPIO_PAR_FEC_FEC0_RMII_GPIO; ++ } ++ ++ /* Set up gpio outputs for MII lines on FEC0 */ ++ MCF_GPIO_PAR_FECI2C |= (0 | ++ MCF_GPIO_PAR_FECI2C_MDIO0_MDIO0 | ++ MCF_GPIO_PAR_FECI2C_MDC0_MDC0); ++} ++ ++static void __inline__ fec_set_mii(struct net_device *dev, ++ struct fec_enet_private *fep) ++{ ++ volatile fec_t *fecp; ++ ++ fecp = fep->hwp; ++ fecp->fec_r_cntrl = OPT_FRAME_SIZE | 0x04; ++ fecp->fec_x_cntrl = 0x00; ++ ++ /* ++ * Set MII speed to 2.5 MHz ++ */ ++ fep->phy_speed = ((((MCF_CLK / 2) / (2500000 / 10)) + 5) / 10) * 2; ++ fecp->fec_mii_speed = fep->phy_speed; ++ ++ fec_restart(dev, 0); ++} ++ ++static void __inline__ fec_get_mac(struct net_device *dev) ++{ ++ struct fec_enet_private *fep = netdev_priv(dev); ++ volatile fec_t *fecp; ++ unsigned char *iap, tmpaddr[ETH_ALEN]; ++ ++ fecp = fep->hwp; ++ ++ if (FEC_FLASHMAC) { ++ /* ++ * Get MAC address from FLASH. ++ * If it is all 1's or 0's, use the default. ++ */ ++ iap = FEC_FLASHMAC; ++ if ((iap[0] == 0) && (iap[1] == 0) && (iap[2] == 0) && ++ (iap[3] == 0) && (iap[4] == 0) && (iap[5] == 0)) ++ iap = fec_mac_default; ++ if ((iap[0] == 0xff) && (iap[1] == 0xff) && (iap[2] == 0xff) && ++ (iap[3] == 0xff) && (iap[4] == 0xff) && (iap[5] == 0xff)) ++ iap = fec_mac_default; ++ } else { ++ *((unsigned long *) &tmpaddr[0]) = fecp->fec_addr_low; ++ *((unsigned short *) &tmpaddr[4]) = (fecp->fec_addr_high >> 16); ++ iap = &tmpaddr[0]; ++ } ++ ++ memcpy(dev->dev_addr, iap, ETH_ALEN); ++ ++ /* Adjust MAC if using default MAC address */ ++ if (iap == fec_mac_default) ++ dev->dev_addr[ETH_ALEN-1] = fec_mac_default[ETH_ALEN-1] + ++ fep->index; ++} ++ ++static void __inline__ fec_enable_phy_intr(void) ++{ ++} ++ ++static void __inline__ fec_disable_phy_intr(void) ++{ ++} ++ ++static void __inline__ fec_phy_ack_intr(void) ++{ ++} ++ ++static void __inline__ fec_localhw_setup(void) ++{ ++} ++ ++static void __inline__ fec_uncache(unsigned long addr) ++{ ++} ++ ++/* ------------------------------------------------------------------------- */ ++ + + #else + +@@ -2305,7 +2469,7 @@ fec_set_mac_address(struct net_device *d + + } + +-/* Initialize the FEC Ethernet on 860T (or ColdFire 5272). ++/* Initialize the FEC Ethernet. + */ + /* + * XXX: We need to clean up on failure exits here. +@@ -2326,7 +2490,7 @@ int __init fec_enet_init(struct net_devi + + /* Allocate memory for buffer descriptors. + */ +- mem_addr = __get_free_page(GFP_KERNEL); ++ mem_addr = __get_free_page(GFP_DMA); + if (mem_addr == 0) { + printk("FEC: allocate descriptor memory failed?\n"); + return -ENOMEM; +@@ -2339,6 +2503,11 @@ int __init fec_enet_init(struct net_devi + fep->index = index; + fep->hwp = fecp; + fep->netdev = dev; ++#ifdef CONFIG_FEC_SHARED_PHY ++ fep->phy_hwp = (volatile fec_t *) fec_hw[index & ~1]; ++#else ++ fep->phy_hwp = fecp; ++#endif + + /* Whack a reset. We should wait for this. + */ +@@ -2375,7 +2544,7 @@ int __init fec_enet_init(struct net_devi + + /* Allocate a page. + */ +- mem_addr = __get_free_page(GFP_KERNEL); ++ mem_addr = __get_free_page(GFP_DMA); + /* XXX: missing check for allocation failure */ + + fec_uncache(mem_addr); +@@ -2400,7 +2569,7 @@ int __init fec_enet_init(struct net_devi + bdp = fep->tx_bd_base; + for (i=0, j=FEC_ENET_TX_FRPPG; i<TX_RING_SIZE; i++) { + if (j >= FEC_ENET_TX_FRPPG) { +- mem_addr = __get_free_page(GFP_KERNEL); ++ mem_addr = __get_free_page(GFP_DMA); + j = 1; + } else { + mem_addr += FEC_ENET_TX_FRSIZE; +@@ -2462,7 +2631,11 @@ int __init fec_enet_init(struct net_devi + * remainder of the interface. + */ + fep->phy_id_done = 0; ++#ifndef CONFIG_FEC_SHARED_PHY + fep->phy_addr = 0; ++#else ++ fep->phy_addr = fep->index; ++#endif + mii_queue(dev, mk_mii_read(MII_REG_PHYIR1), mii_discover_phy); + + index++; +--- a/drivers/net/fec.h ++++ b/drivers/net/fec.h +@@ -14,7 +14,7 @@ + /****************************************************************************/ + + #if defined(CONFIG_M523x) || defined(CONFIG_M527x) || defined(CONFIG_M528x) || \ +- defined(CONFIG_M520x) || defined(CONFIG_M532x) ++ defined(CONFIG_M520x) || defined(CONFIG_M532x) || defined(CONFIG_M54455) + /* + * Just figures, Motorola would have to change the offsets for + * registers in the same peripheral device on different models diff --git a/target/linux/coldfire/patches/011-mcfv4e_namespace_align.patch b/target/linux/coldfire/patches/011-mcfv4e_namespace_align.patch new file mode 100644 index 0000000000..6bdac88458 --- /dev/null +++ b/target/linux/coldfire/patches/011-mcfv4e_namespace_align.patch @@ -0,0 +1,25 @@ +From a51f4e9bff26cc43b53938169f98c27183ec63ea Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Wed, 31 Oct 2007 17:08:59 -0600 +Subject: [PATCH] Change to align on page size for COLDFIRE. + +LTIBName: mcfv4e-namespace-align +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + fs/namespace.c | 4 ++++ + 1 files changed, 4 insertions(+), 0 deletions(-) + +--- a/fs/namespace.c ++++ b/fs/namespace.c +@@ -1364,7 +1364,11 @@ int copy_mount_options(const void __user + /* copy_from_user cannot cross TASK_SIZE ! */ + size = TASK_SIZE - (unsigned long)data; + if (size > PAGE_SIZE) ++#ifndef CONFIG_COLDFIRE + size = PAGE_SIZE; ++#else ++ size = PAGE_SIZE - ((unsigned long)data & ~PAGE_MASK); ++#endif + + i = size - exact_copy_from_user((void *)page, data, size); + if (!i) { diff --git a/target/linux/coldfire/patches/012-m5445x_defconfig_base.patch b/target/linux/coldfire/patches/012-m5445x_defconfig_base.patch new file mode 100644 index 0000000000..32e4b0df1b --- /dev/null +++ b/target/linux/coldfire/patches/012-m5445x_defconfig_base.patch @@ -0,0 +1,877 @@ +From d0910067712299dc63cf58447b5dd83513fcbdb4 Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Wed, 31 Oct 2007 17:12:03 -0600 +Subject: [PATCH] MCF54455 EVB default configuration. + +LTIBName: m5445x-defconfig-base +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + arch/m68k/configs/m54455evb_defconfig | 862 +++++++++++++++++++++++++++++++++ + 1 files changed, 862 insertions(+), 0 deletions(-) + create mode 100644 arch/m68k/configs/m54455evb_defconfig + +--- /dev/null ++++ b/arch/m68k/configs/m54455evb_defconfig +@@ -0,0 +1,862 @@ ++# ++# Automatically generated make config: don't edit ++# Linux kernel version: 2.6.23 ++# Tue Nov 27 23:42:38 2007 ++# ++CONFIG_M68K=y ++CONFIG_MMU=y ++CONFIG_RWSEM_GENERIC_SPINLOCK=y ++# CONFIG_ARCH_HAS_ILOG2_U32 is not set ++# CONFIG_ARCH_HAS_ILOG2_U64 is not set ++CONFIG_GENERIC_HWEIGHT=y ++CONFIG_GENERIC_CALIBRATE_DELAY=y ++CONFIG_TIME_LOW_RES=y ++CONFIG_GENERIC_IOMAP=y ++CONFIG_NO_IOPORT=y ++# CONFIG_NO_DMA is not set ++CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" ++ ++# ++# General setup ++# ++CONFIG_EXPERIMENTAL=y ++CONFIG_BROKEN_ON_SMP=y ++CONFIG_INIT_ENV_ARG_LIMIT=32 ++CONFIG_LOCALVERSION="" ++CONFIG_LOCALVERSION_AUTO=y ++CONFIG_SWAP=y ++CONFIG_SYSVIPC=y ++CONFIG_SYSVIPC_SYSCTL=y ++# CONFIG_POSIX_MQUEUE is not set ++# CONFIG_BSD_PROCESS_ACCT is not set ++# CONFIG_TASKSTATS is not set ++# CONFIG_USER_NS is not set ++# CONFIG_AUDIT is not set ++CONFIG_IKCONFIG=y ++CONFIG_IKCONFIG_PROC=y ++CONFIG_LOG_BUF_SHIFT=17 ++CONFIG_SYSFS_DEPRECATED=y ++# CONFIG_RELAY is not set ++# CONFIG_BLK_DEV_INITRD is not set ++# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set ++CONFIG_SYSCTL=y ++# CONFIG_EMBEDDED is not set ++CONFIG_UID16=y ++CONFIG_SYSCTL_SYSCALL=y ++CONFIG_KALLSYMS=y ++# CONFIG_KALLSYMS_ALL is not set ++# CONFIG_KALLSYMS_EXTRA_PASS is not set ++CONFIG_HOTPLUG=y ++CONFIG_PRINTK=y ++CONFIG_BUG=y ++CONFIG_ELF_CORE=y ++CONFIG_BASE_FULL=y ++CONFIG_FUTEX=y ++CONFIG_ANON_INODES=y ++CONFIG_EPOLL=y ++CONFIG_SIGNALFD=y ++CONFIG_EVENTFD=y ++CONFIG_SHMEM=y ++CONFIG_VM_EVENT_COUNTERS=y ++CONFIG_SLAB=y ++# CONFIG_SLUB is not set ++# CONFIG_SLOB is not set ++CONFIG_RT_MUTEXES=y ++# CONFIG_TINY_SHMEM is not set ++CONFIG_BASE_SMALL=0 ++CONFIG_MODULES=y ++CONFIG_MODULE_UNLOAD=y ++CONFIG_MODULE_FORCE_UNLOAD=y ++# CONFIG_MODVERSIONS is not set ++# CONFIG_MODULE_SRCVERSION_ALL is not set ++# CONFIG_KMOD is not set ++CONFIG_BLOCK=y ++CONFIG_LBD=y ++# CONFIG_BLK_DEV_IO_TRACE is not set ++# CONFIG_LSF is not set ++# CONFIG_BLK_DEV_BSG is not set ++ ++# ++# IO Schedulers ++# ++CONFIG_IOSCHED_NOOP=y ++CONFIG_IOSCHED_AS=y ++CONFIG_IOSCHED_DEADLINE=y ++CONFIG_IOSCHED_CFQ=y ++# CONFIG_DEFAULT_AS is not set ++# CONFIG_DEFAULT_DEADLINE is not set ++CONFIG_DEFAULT_CFQ=y ++# CONFIG_DEFAULT_NOOP is not set ++CONFIG_DEFAULT_IOSCHED="cfq" ++ ++# ++# Platform dependent setup ++# ++# CONFIG_SUN3 is not set ++CONFIG_COLDFIRE=y ++CONFIG_CFV4E=y ++# CONFIG_AMIGA is not set ++# CONFIG_ATARI is not set ++# CONFIG_MAC is not set ++# CONFIG_APOLLO is not set ++# CONFIG_VME is not set ++# CONFIG_HP300 is not set ++# CONFIG_SUN3X is not set ++# CONFIG_Q40 is not set ++ ++# ++# Processor type ++# ++# CONFIG_M68020 is not set ++# CONFIG_M68030 is not set ++# CONFIG_M68040 is not set ++# CONFIG_M68060 is not set ++CONFIG_M54455=y ++CONFIG_MCFCLK=266666666 ++# CONFIG_MCF_USER_HALT is not set ++CONFIG_MMU_CFV4E=y ++CONFIG_SDRAM_BASE=0x40000000 ++CONFIG_SDRAM_SIZE=0x0FFFFFFF ++CONFIG_NOR_FLASH_BASE=0x00000000 ++# CONFIG_M68KFPU_EMU is not set ++CONFIG_ADVANCED=y ++# CONFIG_RMW_INSNS is not set ++CONFIG_SINGLE_MEMORY_CHUNK=y ++# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set ++CONFIG_SELECT_MEMORY_MODEL=y ++CONFIG_FLATMEM_MANUAL=y ++# CONFIG_DISCONTIGMEM_MANUAL is not set ++# CONFIG_SPARSEMEM_MANUAL is not set ++CONFIG_FLATMEM=y ++CONFIG_FLAT_NODE_MEM_MAP=y ++CONFIG_NEED_MULTIPLE_NODES=y ++# CONFIG_SPARSEMEM_STATIC is not set ++CONFIG_SPLIT_PTLOCK_CPUS=4 ++# CONFIG_RESOURCES_64BIT is not set ++CONFIG_ZONE_DMA_FLAG=1 ++CONFIG_BOUNCE=y ++CONFIG_VIRT_TO_BUS=y ++ ++# ++# General setup ++# ++CONFIG_BINFMT_ELF=y ++# CONFIG_BINFMT_AOUT is not set ++# CONFIG_BINFMT_MISC is not set ++CONFIG_PROC_HARDWARE=y ++CONFIG_ZONE_DMA=y ++# CONFIG_ARCH_SUPPORTS_MSI is not set ++ ++# ++# Power management options ++# ++# CONFIG_PM is not set ++ ++# ++# Networking ++# ++CONFIG_NET=y ++ ++# ++# Networking options ++# ++CONFIG_PACKET=y ++# CONFIG_PACKET_MMAP is not set ++CONFIG_UNIX=y ++CONFIG_XFRM=y ++# CONFIG_XFRM_USER is not set ++# CONFIG_XFRM_SUB_POLICY is not set ++# CONFIG_XFRM_MIGRATE is not set ++CONFIG_NET_KEY=y ++# CONFIG_NET_KEY_MIGRATE is not set ++CONFIG_INET=y ++# CONFIG_IP_MULTICAST is not set ++CONFIG_IP_ADVANCED_ROUTER=y ++CONFIG_ASK_IP_FIB_HASH=y ++# CONFIG_IP_FIB_TRIE is not set ++CONFIG_IP_FIB_HASH=y ++# CONFIG_IP_MULTIPLE_TABLES is not set ++# CONFIG_IP_ROUTE_MULTIPATH is not set ++# CONFIG_IP_ROUTE_VERBOSE is not set ++CONFIG_IP_PNP=y ++# CONFIG_IP_PNP_DHCP is not set ++# CONFIG_IP_PNP_BOOTP is not set ++# CONFIG_IP_PNP_RARP is not set ++# CONFIG_NET_IPIP is not set ++# CONFIG_NET_IPGRE is not set ++# CONFIG_ARPD is not set ++# CONFIG_SYN_COOKIES is not set ++CONFIG_INET_AH=y ++CONFIG_INET_ESP=y ++# CONFIG_INET_IPCOMP is not set ++# CONFIG_INET_XFRM_TUNNEL is not set ++# CONFIG_INET_TUNNEL is not set ++# CONFIG_INET_XFRM_MODE_TRANSPORT is not set ++# CONFIG_INET_XFRM_MODE_TUNNEL is not set ++# CONFIG_INET_XFRM_MODE_BEET is not set ++CONFIG_INET_DIAG=y ++CONFIG_INET_TCP_DIAG=y ++# CONFIG_TCP_CONG_ADVANCED is not set ++CONFIG_TCP_CONG_CUBIC=y ++CONFIG_DEFAULT_TCP_CONG="cubic" ++# CONFIG_TCP_MD5SIG is not set ++# CONFIG_IPV6 is not set ++# CONFIG_INET6_XFRM_TUNNEL is not set ++# CONFIG_INET6_TUNNEL is not set ++# CONFIG_NETWORK_SECMARK is not set ++# CONFIG_NETFILTER is not set ++# CONFIG_IP_DCCP is not set ++# CONFIG_IP_SCTP is not set ++# CONFIG_TIPC is not set ++# CONFIG_ATM is not set ++# CONFIG_BRIDGE is not set ++# CONFIG_VLAN_8021Q is not set ++# CONFIG_DECNET is not set ++# CONFIG_LLC2 is not set ++# CONFIG_IPX is not set ++# CONFIG_ATALK is not set ++# CONFIG_X25 is not set ++# CONFIG_LAPB is not set ++# CONFIG_ECONET is not set ++# CONFIG_WAN_ROUTER is not set ++ ++# ++# QoS and/or fair queueing ++# ++# CONFIG_NET_SCHED is not set ++ ++# ++# Network testing ++# ++# CONFIG_NET_PKTGEN is not set ++# CONFIG_HAMRADIO is not set ++# CONFIG_IRDA is not set ++# CONFIG_BT is not set ++# CONFIG_AF_RXRPC is not set ++ ++# ++# Wireless ++# ++# CONFIG_CFG80211 is not set ++# CONFIG_WIRELESS_EXT is not set ++# CONFIG_MAC80211 is not set ++# CONFIG_IEEE80211 is not set ++# CONFIG_RFKILL is not set ++# CONFIG_NET_9P is not set ++ ++# ++# Device Drivers ++# ++ ++# ++# Generic Driver Options ++# ++# CONFIG_STANDALONE is not set ++CONFIG_PREVENT_FIRMWARE_BUILD=y ++CONFIG_FW_LOADER=y ++# CONFIG_DEBUG_DRIVER is not set ++# CONFIG_DEBUG_DEVRES is not set ++# CONFIG_SYS_HYPERVISOR is not set ++# CONFIG_CONNECTOR is not set ++CONFIG_MTD=y ++CONFIG_MTD_DEBUG=y ++CONFIG_MTD_DEBUG_VERBOSE=0 ++CONFIG_MTD_CONCAT=y ++CONFIG_MTD_PARTITIONS=y ++# CONFIG_MTD_REDBOOT_PARTS is not set ++CONFIG_MTD_CMDLINE_PARTS=y ++ ++# ++# User Modules And Translation Layers ++# ++CONFIG_MTD_CHAR=y ++CONFIG_MTD_BLKDEVS=y ++CONFIG_MTD_BLOCK=y ++# CONFIG_FTL is not set ++# CONFIG_NFTL is not set ++# CONFIG_INFTL is not set ++# CONFIG_RFD_FTL is not set ++# CONFIG_SSFDC is not set ++ ++# ++# RAM/ROM/Flash chip drivers ++# ++CONFIG_MTD_CFI=y ++# CONFIG_MTD_JEDECPROBE is not set ++CONFIG_MTD_GEN_PROBE=y ++CONFIG_MTD_CFI_ADV_OPTIONS=y ++CONFIG_MTD_CFI_NOSWAP=y ++# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set ++# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set ++CONFIG_MTD_CFI_GEOMETRY=y ++CONFIG_MTD_MAP_BANK_WIDTH_1=y ++# CONFIG_MTD_MAP_BANK_WIDTH_2 is not set ++# CONFIG_MTD_MAP_BANK_WIDTH_4 is not set ++# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set ++# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set ++# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set ++CONFIG_MTD_CFI_I1=y ++# CONFIG_MTD_CFI_I2 is not set ++# CONFIG_MTD_CFI_I4 is not set ++# CONFIG_MTD_CFI_I8 is not set ++# CONFIG_MTD_OTP is not set ++CONFIG_MTD_CFI_INTELEXT=y ++# CONFIG_MTD_CFI_AMDSTD is not set ++# CONFIG_MTD_CFI_STAA is not set ++CONFIG_MTD_CFI_UTIL=y ++# CONFIG_MTD_RAM is not set ++# CONFIG_MTD_ROM is not set ++# CONFIG_MTD_ABSENT is not set ++ ++# ++# Mapping drivers for chip access ++# ++# CONFIG_MTD_COMPLEX_MAPPINGS is not set ++CONFIG_MTD_PHYSMAP=y ++CONFIG_MTD_PHYSMAP_START=0x00000000 ++CONFIG_MTD_PHYSMAP_LEN=0x1000000 ++CONFIG_MTD_PHYSMAP_BANKWIDTH=1 ++# CONFIG_MTD_PLATRAM is not set ++ ++# ++# Self-contained MTD device drivers ++# ++# CONFIG_MTD_SLRAM is not set ++# CONFIG_MTD_PHRAM is not set ++# CONFIG_MTD_MTDRAM is not set ++# CONFIG_MTD_BLOCK2MTD is not set ++ ++# ++# Disk-On-Chip Device Drivers ++# ++# CONFIG_MTD_DOC2000 is not set ++# CONFIG_MTD_DOC2001 is not set ++# CONFIG_MTD_DOC2001PLUS is not set ++# CONFIG_MTD_NAND is not set ++# CONFIG_MTD_ONENAND is not set ++ ++# ++# UBI - Unsorted block images ++# ++# CONFIG_MTD_UBI is not set ++# CONFIG_PARPORT is not set ++CONFIG_BLK_DEV=y ++# CONFIG_BLK_DEV_COW_COMMON is not set ++CONFIG_BLK_DEV_LOOP=y ++# CONFIG_BLK_DEV_CRYPTOLOOP is not set ++# CONFIG_BLK_DEV_NBD is not set ++CONFIG_BLK_DEV_RAM=y ++CONFIG_BLK_DEV_RAM_COUNT=16 ++CONFIG_BLK_DEV_RAM_SIZE=64000 ++CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 ++# CONFIG_CDROM_PKTCDVD is not set ++# CONFIG_ATA_OVER_ETH is not set ++CONFIG_MISC_DEVICES=y ++# CONFIG_EEPROM_93CX6 is not set ++# CONFIG_IDE is not set ++ ++# ++# SCSI device support ++# ++# CONFIG_RAID_ATTRS is not set ++CONFIG_SCSI=m ++CONFIG_SCSI_DMA=y ++# CONFIG_SCSI_TGT is not set ++# CONFIG_SCSI_NETLINK is not set ++CONFIG_SCSI_PROC_FS=y ++ ++# ++# SCSI support type (disk, tape, CD-ROM) ++# ++CONFIG_BLK_DEV_SD=m ++# CONFIG_CHR_DEV_ST is not set ++# CONFIG_CHR_DEV_OSST is not set ++# CONFIG_BLK_DEV_SR is not set ++# CONFIG_CHR_DEV_SG is not set ++# CONFIG_CHR_DEV_SCH is not set ++ ++# ++# Some SCSI devices (e.g. CD jukebox) support multiple LUNs ++# ++# CONFIG_SCSI_MULTI_LUN is not set ++# CONFIG_SCSI_CONSTANTS is not set ++# CONFIG_SCSI_LOGGING is not set ++# CONFIG_SCSI_SCAN_ASYNC is not set ++CONFIG_SCSI_WAIT_SCAN=m ++ ++# ++# SCSI Transports ++# ++# CONFIG_SCSI_SPI_ATTRS is not set ++# CONFIG_SCSI_FC_ATTRS is not set ++# CONFIG_SCSI_ISCSI_ATTRS is not set ++# CONFIG_SCSI_SAS_LIBSAS is not set ++CONFIG_SCSI_LOWLEVEL=y ++# CONFIG_ISCSI_TCP is not set ++# CONFIG_SCSI_DEBUG is not set ++CONFIG_ATA=m ++# CONFIG_ATA_NONSTANDARD is not set ++CONFIG_PATA_FSL=m ++# CONFIG_MD is not set ++CONFIG_NETDEVICES=y ++# CONFIG_NETDEVICES_MULTIQUEUE is not set ++# CONFIG_DUMMY is not set ++# CONFIG_BONDING is not set ++# CONFIG_MACVLAN is not set ++# CONFIG_EQUALIZER is not set ++# CONFIG_TUN is not set ++# CONFIG_PHYLIB is not set ++CONFIG_NET_ETHERNET=y ++CONFIG_MII=y ++CONFIG_FEC=y ++# CONFIG_FEC2 is not set ++CONFIG_NETDEV_1000=y ++CONFIG_NETDEV_10000=y ++ ++# ++# Wireless LAN ++# ++# CONFIG_WLAN_PRE80211 is not set ++# CONFIG_WLAN_80211 is not set ++# CONFIG_WAN is not set ++# CONFIG_PPP is not set ++# CONFIG_SLIP is not set ++# CONFIG_SHAPER is not set ++# CONFIG_NETCONSOLE is not set ++# CONFIG_NETPOLL is not set ++# CONFIG_NET_POLL_CONTROLLER is not set ++# CONFIG_ISDN is not set ++# CONFIG_PHONE is not set ++ ++# ++# Input device support ++# ++CONFIG_INPUT=y ++# CONFIG_INPUT_FF_MEMLESS is not set ++# CONFIG_INPUT_POLLDEV is not set ++ ++# ++# Userland interfaces ++# ++CONFIG_INPUT_MOUSEDEV=y ++# CONFIG_INPUT_MOUSEDEV_PSAUX is not set ++CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 ++CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 ++# CONFIG_INPUT_JOYDEV is not set ++# CONFIG_INPUT_TSDEV is not set ++# CONFIG_INPUT_EVDEV is not set ++# CONFIG_INPUT_EVBUG is not set ++ ++# ++# Input Device Drivers ++# ++# CONFIG_INPUT_KEYBOARD is not set ++# CONFIG_INPUT_MOUSE is not set ++# CONFIG_INPUT_JOYSTICK is not set ++# CONFIG_INPUT_TABLET is not set ++# CONFIG_INPUT_TOUCHSCREEN is not set ++# CONFIG_INPUT_MISC is not set ++ ++# ++# Hardware I/O ports ++# ++CONFIG_SERIO=y ++CONFIG_SERIO_SERPORT=y ++# CONFIG_SERIO_RAW is not set ++# CONFIG_GAMEPORT is not set ++ ++# ++# Character devices ++# ++CONFIG_VT=y ++CONFIG_VT_CONSOLE=y ++CONFIG_HW_CONSOLE=y ++# CONFIG_VT_HW_CONSOLE_BINDING is not set ++# CONFIG_SERIAL_NONSTANDARD is not set ++ ++# ++# Serial drivers ++# ++# CONFIG_SERIAL_8250 is not set ++ ++# ++# Non-8250 serial port support ++# ++CONFIG_SERIAL_COLDFIRE=y ++CONFIG_UNIX98_PTYS=y ++# CONFIG_LEGACY_PTYS is not set ++# CONFIG_IPMI_HANDLER is not set ++# CONFIG_WATCHDOG is not set ++# CONFIG_HW_RANDOM is not set ++# CONFIG_GEN_RTC is not set ++# CONFIG_R3964 is not set ++# CONFIG_RAW_DRIVER is not set ++# CONFIG_TCG_TPM is not set ++# CONFIG_I2C is not set ++ ++# ++# SPI support ++# ++# CONFIG_SPI is not set ++# CONFIG_SPI_MASTER is not set ++# CONFIG_W1 is not set ++# CONFIG_POWER_SUPPLY is not set ++# CONFIG_HWMON is not set ++ ++# ++# Multifunction device drivers ++# ++# CONFIG_MFD_SM501 is not set ++ ++# ++# Multimedia devices ++# ++# CONFIG_VIDEO_DEV is not set ++# CONFIG_DVB_CORE is not set ++CONFIG_DAB=y ++ ++# ++# Graphics support ++# ++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set ++ ++# ++# Display device support ++# ++# CONFIG_DISPLAY_SUPPORT is not set ++# CONFIG_VGASTATE is not set ++CONFIG_VIDEO_OUTPUT_CONTROL=m ++# CONFIG_FB is not set ++ ++# ++# Console display driver support ++# ++CONFIG_DUMMY_CONSOLE=y ++ ++# ++# Sound ++# ++# CONFIG_SOUND is not set ++CONFIG_HID_SUPPORT=y ++CONFIG_HID=y ++CONFIG_HID_DEBUG=y ++CONFIG_USB_SUPPORT=y ++# CONFIG_USB_ARCH_HAS_HCD is not set ++# CONFIG_USB_ARCH_HAS_OHCI is not set ++# CONFIG_USB_ARCH_HAS_EHCI is not set ++ ++# ++# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' ++# ++ ++# ++# USB Gadget Support ++# ++# CONFIG_USB_GADGET is not set ++# CONFIG_MMC is not set ++# CONFIG_NEW_LEDS is not set ++# CONFIG_RTC_CLASS is not set ++ ++# ++# DMA Engine support ++# ++# CONFIG_DMA_ENGINE is not set ++ ++# ++# DMA Clients ++# ++ ++# ++# DMA Devices ++# ++ ++# ++# Userspace I/O ++# ++# CONFIG_UIO is not set ++ ++# ++# Character devices ++# ++# CONFIG_SERIAL_CONSOLE is not set ++ ++# ++# File systems ++# ++# CONFIG_EXT2_FS is not set ++CONFIG_EXT3_FS=y ++CONFIG_EXT3_FS_XATTR=y ++# CONFIG_EXT3_FS_POSIX_ACL is not set ++# CONFIG_EXT3_FS_SECURITY is not set ++# CONFIG_EXT4DEV_FS is not set ++CONFIG_JBD=y ++# CONFIG_JBD_DEBUG is not set ++CONFIG_FS_MBCACHE=y ++# CONFIG_REISERFS_FS is not set ++# CONFIG_JFS_FS is not set ++# CONFIG_FS_POSIX_ACL is not set ++# CONFIG_XFS_FS is not set ++# CONFIG_GFS2_FS is not set ++# CONFIG_OCFS2_FS is not set ++CONFIG_MINIX_FS=y ++# CONFIG_ROMFS_FS is not set ++# CONFIG_INOTIFY is not set ++# CONFIG_QUOTA is not set ++CONFIG_DNOTIFY=y ++# CONFIG_AUTOFS_FS is not set ++# CONFIG_AUTOFS4_FS is not set ++# CONFIG_FUSE_FS is not set ++ ++# ++# CD-ROM/DVD Filesystems ++# ++# CONFIG_ISO9660_FS is not set ++# CONFIG_UDF_FS is not set ++ ++# ++# DOS/FAT/NT Filesystems ++# ++CONFIG_FAT_FS=y ++CONFIG_MSDOS_FS=y ++CONFIG_VFAT_FS=y ++CONFIG_FAT_DEFAULT_CODEPAGE=437 ++CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" ++CONFIG_NTFS_FS=y ++# CONFIG_NTFS_DEBUG is not set ++CONFIG_NTFS_RW=y ++ ++# ++# Pseudo filesystems ++# ++CONFIG_PROC_FS=y ++# CONFIG_PROC_KCORE is not set ++CONFIG_PROC_SYSCTL=y ++CONFIG_SYSFS=y ++CONFIG_TMPFS=y ++# CONFIG_TMPFS_POSIX_ACL is not set ++# CONFIG_HUGETLB_PAGE is not set ++CONFIG_RAMFS=y ++# CONFIG_CONFIGFS_FS is not set ++ ++# ++# Miscellaneous filesystems ++# ++# CONFIG_ADFS_FS is not set ++# CONFIG_AFFS_FS is not set ++# CONFIG_HFS_FS is not set ++# CONFIG_HFSPLUS_FS is not set ++# CONFIG_BEFS_FS is not set ++# CONFIG_BFS_FS is not set ++# CONFIG_EFS_FS is not set ++CONFIG_JFFS2_FS=y ++CONFIG_JFFS2_FS_DEBUG=0 ++CONFIG_JFFS2_FS_WRITEBUFFER=y ++# CONFIG_JFFS2_SUMMARY is not set ++# CONFIG_JFFS2_FS_XATTR is not set ++# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set ++CONFIG_JFFS2_ZLIB=y ++CONFIG_JFFS2_RTIME=y ++# CONFIG_JFFS2_RUBIN is not set ++# CONFIG_CRAMFS is not set ++# CONFIG_VXFS_FS is not set ++# CONFIG_HPFS_FS is not set ++# CONFIG_QNX4FS_FS is not set ++# CONFIG_SYSV_FS is not set ++# CONFIG_UFS_FS is not set ++ ++# ++# Network File Systems ++# ++CONFIG_NFS_FS=y ++# CONFIG_NFS_V3 is not set ++# CONFIG_NFS_V4 is not set ++# CONFIG_NFS_DIRECTIO is not set ++# CONFIG_NFSD is not set ++CONFIG_ROOT_NFS=y ++CONFIG_LOCKD=y ++CONFIG_NFS_COMMON=y ++CONFIG_SUNRPC=y ++# CONFIG_SUNRPC_BIND34 is not set ++# CONFIG_RPCSEC_GSS_KRB5 is not set ++# CONFIG_RPCSEC_GSS_SPKM3 is not set ++# CONFIG_SMB_FS is not set ++# CONFIG_CIFS is not set ++# CONFIG_NCP_FS is not set ++# CONFIG_CODA_FS is not set ++# CONFIG_AFS_FS is not set ++ ++# ++# Partition Types ++# ++CONFIG_PARTITION_ADVANCED=y ++# CONFIG_ACORN_PARTITION is not set ++# CONFIG_OSF_PARTITION is not set ++# CONFIG_AMIGA_PARTITION is not set ++# CONFIG_ATARI_PARTITION is not set ++# CONFIG_MAC_PARTITION is not set ++CONFIG_MSDOS_PARTITION=y ++# CONFIG_BSD_DISKLABEL is not set ++# CONFIG_MINIX_SUBPARTITION is not set ++# CONFIG_SOLARIS_X86_PARTITION is not set ++# CONFIG_UNIXWARE_DISKLABEL is not set ++# CONFIG_LDM_PARTITION is not set ++# CONFIG_SGI_PARTITION is not set ++# CONFIG_ULTRIX_PARTITION is not set ++# CONFIG_SUN_PARTITION is not set ++# CONFIG_KARMA_PARTITION is not set ++# CONFIG_EFI_PARTITION is not set ++# CONFIG_SYSV68_PARTITION is not set ++ ++# ++# Native Language Support ++# ++CONFIG_NLS=y ++CONFIG_NLS_DEFAULT="iso8859-1" ++CONFIG_NLS_CODEPAGE_437=y ++# CONFIG_NLS_CODEPAGE_737 is not set ++# CONFIG_NLS_CODEPAGE_775 is not set ++# CONFIG_NLS_CODEPAGE_850 is not set ++# CONFIG_NLS_CODEPAGE_852 is not set ++# CONFIG_NLS_CODEPAGE_855 is not set ++# CONFIG_NLS_CODEPAGE_857 is not set ++# CONFIG_NLS_CODEPAGE_860 is not set ++# CONFIG_NLS_CODEPAGE_861 is not set ++# CONFIG_NLS_CODEPAGE_862 is not set ++# CONFIG_NLS_CODEPAGE_863 is not set ++# CONFIG_NLS_CODEPAGE_864 is not set ++# CONFIG_NLS_CODEPAGE_865 is not set ++# CONFIG_NLS_CODEPAGE_866 is not set ++# CONFIG_NLS_CODEPAGE_869 is not set ++# CONFIG_NLS_CODEPAGE_936 is not set ++# CONFIG_NLS_CODEPAGE_950 is not set ++# CONFIG_NLS_CODEPAGE_932 is not set ++# CONFIG_NLS_CODEPAGE_949 is not set ++# CONFIG_NLS_CODEPAGE_874 is not set ++# CONFIG_NLS_ISO8859_8 is not set ++# CONFIG_NLS_CODEPAGE_1250 is not set ++# CONFIG_NLS_CODEPAGE_1251 is not set ++# CONFIG_NLS_ASCII is not set ++CONFIG_NLS_ISO8859_1=y ++# CONFIG_NLS_ISO8859_2 is not set ++# CONFIG_NLS_ISO8859_3 is not set ++# CONFIG_NLS_ISO8859_4 is not set ++# CONFIG_NLS_ISO8859_5 is not set ++# CONFIG_NLS_ISO8859_6 is not set ++# CONFIG_NLS_ISO8859_7 is not set ++# CONFIG_NLS_ISO8859_9 is not set ++# CONFIG_NLS_ISO8859_13 is not set ++# CONFIG_NLS_ISO8859_14 is not set ++# CONFIG_NLS_ISO8859_15 is not set ++# CONFIG_NLS_KOI8_R is not set ++# CONFIG_NLS_KOI8_U is not set ++CONFIG_NLS_UTF8=y ++ ++# ++# Distributed Lock Manager ++# ++# CONFIG_DLM is not set ++ ++# ++# Kernel hacking ++# ++# CONFIG_PRINTK_TIME is not set ++# CONFIG_ENABLE_MUST_CHECK is not set ++# CONFIG_MAGIC_SYSRQ is not set ++# CONFIG_UNUSED_SYMBOLS is not set ++# CONFIG_DEBUG_FS is not set ++# CONFIG_HEADERS_CHECK is not set ++CONFIG_DEBUG_KERNEL=y ++CONFIG_DETECT_SOFTLOCKUP=y ++CONFIG_SCHED_DEBUG=y ++# CONFIG_SCHEDSTATS is not set ++# CONFIG_TIMER_STATS is not set ++CONFIG_DEBUG_SLAB=y ++# CONFIG_DEBUG_SLAB_LEAK is not set ++# CONFIG_DEBUG_RT_MUTEXES is not set ++# CONFIG_RT_MUTEX_TESTER is not set ++# CONFIG_DEBUG_SPINLOCK is not set ++# CONFIG_DEBUG_MUTEXES is not set ++# CONFIG_DEBUG_SPINLOCK_SLEEP is not set ++# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set ++# CONFIG_DEBUG_KOBJECT is not set ++CONFIG_DEBUG_BUGVERBOSE=y ++CONFIG_DEBUG_INFO=y ++# CONFIG_DEBUG_VM is not set ++# CONFIG_DEBUG_LIST is not set ++# CONFIG_FRAME_POINTER is not set ++CONFIG_FORCED_INLINING=y ++# CONFIG_RCU_TORTURE_TEST is not set ++# CONFIG_FAULT_INJECTION is not set ++CONFIG_BOOTPARAM=y ++CONFIG_BOOTPARAM_STRING="root=/dev/nfs rw nfsroot=172.27.163.2:/tftpboot/ltib ip=172.27.163.3:172.27.163.2:172.27.255.254:255.255.0.0::eth0:off mtdparts=phys_mapped_flash:16m(User)" ++ ++# ++# CodeTEST Setup ++# ++# CONFIG_CODETEST is not set ++ ++# ++# Security options ++# ++# CONFIG_KEYS is not set ++# CONFIG_SECURITY is not set ++CONFIG_CRYPTO=y ++CONFIG_CRYPTO_ALGAPI=y ++CONFIG_CRYPTO_BLKCIPHER=y ++CONFIG_CRYPTO_HASH=y ++CONFIG_CRYPTO_MANAGER=y ++CONFIG_CRYPTO_HMAC=y ++# CONFIG_CRYPTO_XCBC is not set ++# CONFIG_CRYPTO_NULL is not set ++# CONFIG_CRYPTO_MD4 is not set ++CONFIG_CRYPTO_MD5=y ++CONFIG_CRYPTO_SHA1=y ++# CONFIG_CRYPTO_SHA256 is not set ++# CONFIG_CRYPTO_SHA512 is not set ++# CONFIG_CRYPTO_WP512 is not set ++# CONFIG_CRYPTO_TGR192 is not set ++# CONFIG_CRYPTO_GF128MUL is not set ++CONFIG_CRYPTO_ECB=y ++CONFIG_CRYPTO_CBC=y ++CONFIG_CRYPTO_PCBC=m ++# CONFIG_CRYPTO_LRW is not set ++# CONFIG_CRYPTO_CRYPTD is not set ++CONFIG_CRYPTO_DES=y ++# CONFIG_CRYPTO_FCRYPT is not set ++# CONFIG_CRYPTO_BLOWFISH is not set ++# CONFIG_CRYPTO_TWOFISH is not set ++# CONFIG_CRYPTO_SERPENT is not set ++# CONFIG_CRYPTO_AES is not set ++# CONFIG_CRYPTO_CAST5 is not set ++# CONFIG_CRYPTO_CAST6 is not set ++# CONFIG_CRYPTO_TEA is not set ++# CONFIG_CRYPTO_ARC4 is not set ++# CONFIG_CRYPTO_KHAZAD is not set ++# CONFIG_CRYPTO_ANUBIS is not set ++# CONFIG_CRYPTO_DEFLATE is not set ++# CONFIG_CRYPTO_MICHAEL_MIC is not set ++# CONFIG_CRYPTO_CRC32C is not set ++# CONFIG_CRYPTO_CAMELLIA is not set ++CONFIG_CRYPTO_TEST=m ++CONFIG_CRYPTO_HW=y ++CONFIG_CRYPTO_DEV_MCFCAU=y ++CONFIG_CRYPTO_DEV_MCFCAU_DES=y ++CONFIG_CRYPTO_DEV_MCFCAU_AES=y ++CONFIG_CRYPTO_DEV_MCFCAU_MD5=y ++CONFIG_CRYPTO_DEV_MCFCAU_SHA1=y ++ ++# ++# Library routines ++# ++CONFIG_BITREVERSE=y ++CONFIG_CRC_CCITT=y ++CONFIG_CRC16=y ++# CONFIG_CRC_ITU_T is not set ++CONFIG_CRC32=y ++# CONFIG_CRC7 is not set ++CONFIG_LIBCRC32C=y ++CONFIG_ZLIB_INFLATE=y ++CONFIG_ZLIB_DEFLATE=y ++CONFIG_PLIST=y ++CONFIG_HAS_IOMEM=y ++CONFIG_HAS_DMA=y diff --git a/target/linux/coldfire/patches/013-m5445x_ata.patch b/target/linux/coldfire/patches/013-m5445x_ata.patch new file mode 100644 index 0000000000..0f269c15ec --- /dev/null +++ b/target/linux/coldfire/patches/013-m5445x_ata.patch @@ -0,0 +1,1079 @@ +From c9e68ea1a541b9762ec0b656509aef3cdd75e035 Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Mon, 19 Nov 2007 12:01:34 -0700 +Subject: [PATCH] Add support for the M5445x ATA controller. + +LTIBName: m5445x-ata +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + arch/m68k/coldfire/Makefile | 1 + + arch/m68k/coldfire/head.S | 5 + + arch/m68k/coldfire/mcf5445x-devices.c | 125 +++++ + drivers/ata/Kconfig | 11 +- + drivers/ata/Makefile | 2 +- + drivers/ata/pata_fsl.c | 829 +++++++++++++++++++++++++++++++++ + include/asm-m68k/pci.h | 10 +- + include/linux/fsl_devices.h | 11 + + 8 files changed, 990 insertions(+), 4 deletions(-) + create mode 100644 arch/m68k/coldfire/mcf5445x-devices.c + create mode 100644 drivers/ata/pata_fsl.c + +--- a/arch/m68k/coldfire/Makefile ++++ b/arch/m68k/coldfire/Makefile +@@ -9,3 +9,4 @@ ifneq ($(strip $(CONFIG_USB) $(CONFIG_US + endif + + obj-$(CONFIG_PCI) += pci.o mcf5445x-pci.o iomap.o ++obj-$(CONFIG_M54455) += mcf5445x-devices.o +--- a/arch/m68k/coldfire/head.S ++++ b/arch/m68k/coldfire/head.S +@@ -374,6 +374,11 @@ ENTRY(__start) + MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \ + 0, MMUDR_LK, %d0 + ++ /* Map ATA registers -- sacrifice a data TLB due to the hw design */ ++ mmu_map (0x90000000), (0x90000000), 0, 0, \ ++ MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \ ++ 0, MMUDR_LK, %d0 ++ + /* Do unity mapping to enable the MMU. Map first 16 MB in place as + code (delete TLBs after MMU is enabled and we are executing in high + memory). */ +--- /dev/null ++++ b/arch/m68k/coldfire/mcf5445x-devices.c +@@ -0,0 +1,125 @@ ++/* ++ * arch/m68k/coldfire/mcf5445x-devices.c ++ * ++ * Coldfire M5445x Platform Device Configuration ++ * ++ * Based on the Freescale MXC devices.c ++ * ++ * Copyright (c) 2007 Freescale Semiconductor, Inc. ++ * Kurt Mahan <kmahan@freescale.com> ++ */ ++#include <linux/module.h> ++#include <linux/kernel.h> ++#include <linux/init.h> ++#include <linux/platform_device.h> ++#include <linux/fsl_devices.h> ++ ++#include <asm/coldfire.h> ++#include <asm/mcfsim.h> ++ ++/* ATA Interrupt */ ++#define IRQ_ATA (64 + 64 + 54) ++ ++/* ATA Base */ ++#define BASE_IO_ATA 0x90000000 ++ ++#define ATA_IER MCF_REG08(BASE_IO_ATA+0x2c) /* int enable reg */ ++#define ATA_ICR MCF_REG08(BASE_IO_ATA+0x30) /* int clear reg */ ++ ++/* ++ * On-chip PATA ++ */ ++#if defined(CONFIG_PATA_FSL) || defined(CONFIG_PATA_FSL_MODULE) ++static int ata_init(struct platform_device *pdev) ++{ ++ /* clear ints */ ++ ATA_IER = 0x00; ++ ATA_ICR = 0xff; ++ ++ /* setup shared pins */ ++ MCF_GPIO_PAR_FEC = (MCF_GPIO_PAR_FEC & MCF_GPIO_PAR_FEC_FEC1_MASK) | ++ MCF_GPIO_PAR_FEC_FEC1_ATA; ++ ++ MCF_GPIO_PAR_FECI2C = (MCF_GPIO_PAR_FECI2C & ++ (MCF_GPIO_PAR_FECI2C_MDC1_MASK & ++ MCF_GPIO_PAR_FECI2C_MDIO1_MASK)) | ++ MCF_GPIO_PAR_FECI2C_MDC1_ATA_DIOR | ++ MCF_GPIO_PAR_FECI2C_MDIO1_ATA_DIOW; ++ ++ MCF_GPIO_PAR_ATA = MCF_GPIO_PAR_ATA_BUFEN | ++ MCF_GPIO_PAR_ATA_CS1 | ++ MCF_GPIO_PAR_ATA_CS0 | ++ MCF_GPIO_PAR_ATA_DA2 | ++ MCF_GPIO_PAR_ATA_DA1 | ++ MCF_GPIO_PAR_ATA_DA0 | ++ MCF_GPIO_PAR_ATA_RESET_RESET | ++ MCF_GPIO_PAR_ATA_DMARQ_DMARQ | ++ MCF_GPIO_PAR_ATA_IORDY_IORDY; ++ ++ MCF_GPIO_PAR_PCI = (MCF_GPIO_PAR_PCI & ++ (MCF_GPIO_PAR_PCI_GNT3_MASK & ++ MCF_GPIO_PAR_PCI_REQ3_MASK)) | ++ MCF_GPIO_PAR_PCI_GNT3_ATA_DMACK | ++ MCF_GPIO_PAR_PCI_REQ3_ATA_INTRQ; ++ ++ return 0; ++} ++ ++static void ata_exit(void) ++{ ++ printk(KERN_INFO "** ata_exit\n"); ++} ++ ++static int ata_get_clk_rate(void) ++{ ++ return MCF_BUSCLK; ++} ++ ++static struct fsl_ata_platform_data ata_data = { ++ .init = ata_init, ++ .exit = ata_exit, ++ .get_clk_rate = ata_get_clk_rate, ++}; ++ ++static struct resource pata_fsl_resources[] = { ++ [0] = { /* I/O */ ++ .start = BASE_IO_ATA, ++ .end = BASE_IO_ATA + 0x000000d8, ++ .flags = IORESOURCE_MEM, ++ }, ++ [2] = { /* IRQ */ ++ .start = IRQ_ATA, ++ .end = IRQ_ATA, ++ .flags = IORESOURCE_IRQ, ++ }, ++}; ++ ++static struct platform_device pata_fsl_device = { ++ .name = "pata_fsl", ++ .id = -1, ++ .num_resources = ARRAY_SIZE(pata_fsl_resources), ++ .resource = pata_fsl_resources, ++ .dev = { ++ .platform_data = &ata_data, ++ .coherent_dma_mask = ~0, /* $$$ REVISIT */ ++ }, ++}; ++ ++static inline void mcf5445x_init_pata(void) ++{ ++ (void)platform_device_register(&pata_fsl_device); ++} ++#else ++static inline void mcf5445x_init_pata(void) ++{ ++} ++#endif ++ ++static int __init mcf5445x_init_devices(void) ++{ ++ printk(KERN_INFO "MCF5445x INIT_DEVICES\n"); ++ mcf5445x_init_pata(); ++ ++ return 0; ++} ++arch_initcall(mcf5445x_init_devices); +--- a/drivers/ata/Kconfig ++++ b/drivers/ata/Kconfig +@@ -6,7 +6,7 @@ menuconfig ATA + tristate "Serial ATA (prod) and Parallel ATA (experimental) drivers" + depends on HAS_IOMEM + depends on BLOCK +- depends on !(M32R || M68K) || BROKEN ++ depends on !M32R || BROKEN + depends on !SUN4 || BROKEN + select SCSI + ---help--- +@@ -679,4 +679,13 @@ config PATA_BF54X + + If unsure, say N. + ++config PATA_FSL ++ tristate "Freescale on-chip PATA support" ++ depends on (ARCH_MX3 || ARCH_MX27 || PPC_512x || M54455) ++ help ++ On Freescale processors, say Y here if you wish to use the on-chip ++ ATA interface. ++ ++ If you are unsure, say N to this. ++ + endif # ATA +--- a/drivers/ata/Makefile ++++ b/drivers/ata/Makefile +@@ -1,4 +1,3 @@ +- + obj-$(CONFIG_ATA) += libata.o + + obj-$(CONFIG_SATA_AHCI) += ahci.o +@@ -71,6 +70,7 @@ obj-$(CONFIG_PATA_BF54X) += pata_bf54x.o + obj-$(CONFIG_PATA_PLATFORM) += pata_platform.o + obj-$(CONFIG_PATA_OF_PLATFORM) += pata_of_platform.o + obj-$(CONFIG_PATA_ICSIDE) += pata_icside.o ++obj-$(CONFIG_PATA_FSL) += pata_fsl.o + # Should be last but two libata driver + obj-$(CONFIG_PATA_ACPI) += pata_acpi.o + # Should be last but one libata driver +--- /dev/null ++++ b/drivers/ata/pata_fsl.c +@@ -0,0 +1,829 @@ ++/* ++ * Freescale integrated PATA driver ++ */ ++ ++/* ++ * Copyright 2007 Freescale Semiconductor, Inc. All Rights Reserved. ++ */ ++ ++/* ++ * The code contained herein is licensed under the GNU General Public ++ * License. You may obtain a copy of the GNU General Public License ++ * Version 2 or later at the following locations: ++ * ++ * http://www.opensource.org/licenses/gpl-license.html ++ * http://www.gnu.org/copyleft/gpl.html ++ */ ++ ++#include <linux/kernel.h> ++#include <linux/module.h> ++#include <linux/init.h> ++#include <linux/blkdev.h> ++#include <scsi/scsi_host.h> ++#include <linux/ata.h> ++#include <linux/libata.h> ++#include <linux/platform_device.h> ++#include <linux/fsl_devices.h> ++#ifdef CONFIG_FSL_PATA_USE_DMA ++#include <asm/dma.h> ++#endif ++ ++#define DRV_NAME "pata_fsl" ++#define DRV_VERSION "1.0" ++ ++#ifdef CONFIG_M54455 ++#define WRITE_ATA8(val, reg) \ ++ __raw_writeb(val, (ata_regs + reg)); ++#define WRITE_ATA16(val, reg) \ ++ __raw_writew(val, (ata_regs + reg)); ++#else ++#define WRITE_ATA8(val, reg) \ ++ __raw_writel(val, (ata_regs + reg)); ++#define WRITE_ATA16(val, reg) \ ++ __raw_writel(val, (ata_regs + reg)); ++#endif ++ ++struct pata_fsl_priv { ++#ifdef CONFIG_FSL_PATA_USE_DMA ++ int ultra; ++#endif ++ u8 *fsl_ata_regs; ++#ifdef CONFIG_FSL_PATA_USE_DMA ++ int dma_rchan; ++ int dma_wchan; ++ int dma_done; ++ int dma_dir; ++#endif ++}; ++ ++enum { ++ /* various constants */ ++ ++#ifdef CONFIG_FSL_PATA_USE_DMA ++ FSL_ATA_MAX_SG_LEN = 65534, ++#endif ++ ++ /* offsets to registers */ ++ ++ FSL_ATA_TIMING_REGS = 0x00, ++ FSL_ATA_FIFO_FILL = 0x20, ++ FSL_ATA_CONTROL = 0x24, ++ FSL_ATA_INT_PEND = 0x28, ++ FSL_ATA_INT_EN = 0x2C, ++ FSL_ATA_INT_CLEAR = 0x30, ++ FSL_ATA_FIFO_ALARM = 0x34, ++ FSL_ATA_DRIVE_DATA = 0xA0, ++ FSL_ATA_DRIVE_CONTROL = 0xD8, ++ ++ /* bits within FSL_ATA_CONTROL */ ++ ++ FSL_ATA_CTRL_FIFO_RST_B = 0x80, ++ FSL_ATA_CTRL_ATA_RST_B = 0x40, ++ FSL_ATA_CTRL_FIFO_TX_EN = 0x20, ++ FSL_ATA_CTRL_FIFO_RCV_EN = 0x10, ++ FSL_ATA_CTRL_DMA_PENDING = 0x08, ++ FSL_ATA_CTRL_DMA_ULTRA = 0x04, ++ FSL_ATA_CTRL_DMA_WRITE = 0x02, ++ FSL_ATA_CTRL_IORDY_EN = 0x01, ++ ++ /* bits within the interrupt control registers */ ++ ++ FSL_ATA_INTR_ATA_INTRQ1 = 0x80, ++ FSL_ATA_INTR_FIFO_UNDERFLOW = 0x40, ++ FSL_ATA_INTR_FIFO_OVERFLOW = 0x20, ++ FSL_ATA_INTR_CTRL_IDLE = 0x10, ++ FSL_ATA_INTR_ATA_INTRQ2 = 0x08, ++}; ++ ++/* ++ * This structure contains the timing parameters for ++ * ATA bus timing in the 5 PIO modes. The timings ++ * are in nanoseconds, and are converted to clock ++ * cycles before being stored in the ATA controller ++ * timing registers. ++ */ ++static struct { ++ short t0, t1, t2_8, t2_16, t2i, t4, t9, tA; ++} pio_specs[] = { ++ [0] = { ++ .t0 = 600, .t1 = 70, .t2_8 = 290, .t2_16 = 165, .t2i = 0, ++ .t4 = 30,.t9 = 20,.tA = 50 ++ }, ++ [1] = { ++ .t0 = 383, .t1 = 50, .t2_8 = 290, .t2_16 = 125, .t2i = 0, ++ .t4 = 20, .t9 = 15, .tA = 50 ++ }, ++ [2] = { ++ .t0 = 240, .t1 = 30, .t2_8 = 290, .t2_16 = 100, .t2i = 0, ++ .t4 = 15, .t9 = 10, .tA = 50 ++ }, ++ [3] = { ++ .t0 = 180, .t1 = 30, .t2_8 = 80, .t2_16 = 80, .t2i = 0, ++ .t4 = 10, .t9 = 10, .tA = 50 ++ }, ++ [4] = { ++ .t0 = 120, .t1 = 25, .t2_8 = 70, .t2_16 = 70, .t2i = 0, ++ .t4 = 10, .t9 = 10, .tA = 50 ++ }, ++}; ++ ++#define NR_PIO_SPECS (sizeof pio_specs / sizeof pio_specs[0]) ++ ++/* ++ * This structure contains the timing parameters for ++ * ATA bus timing in the 3 MDMA modes. The timings ++ * are in nanoseconds, and are converted to clock ++ * cycles before being stored in the ATA controller ++ * timing registers. ++ */ ++static struct { ++ short t0M, tD, tH, tJ, tKW, tM, tN, tJNH; ++} mdma_specs[] = { ++ [0] = { ++ .t0M = 480, .tD = 215, .tH = 20, .tJ = 20, .tKW = 215, ++ .tM = 50, .tN = 15, .tJNH = 20 ++ }, ++ [1] = { ++ .t0M = 150, .tD = 80, .tH = 15, .tJ = 5, .tKW = 50, ++ .tM = 30, .tN = 10, .tJNH = 15 ++ }, ++ [2] = { ++ .t0M = 120, .tD = 70, .tH = 10, .tJ = 5, .tKW = 25, ++ .tM = 25, .tN = 10, .tJNH = 10 ++ }, ++}; ++ ++#define NR_MDMA_SPECS (sizeof mdma_specs / sizeof mdma_specs[0]) ++ ++/* ++ * This structure contains the timing parameters for ++ * ATA bus timing in the 6 UDMA modes. The timings ++ * are in nanoseconds, and are converted to clock ++ * cycles before being stored in the ATA controller ++ * timing registers. ++ */ ++static struct { ++ short t2CYC, tCYC, tDS, tDH, tDVS, tDVH, tCVS, tCVH, tFS_min, tLI_max, ++ tMLI, tAZ, tZAH, tENV_min, tSR, tRFS, tRP, tACK, tSS, tDZFS; ++} udma_specs[] = { ++ [0] = { ++ .t2CYC = 235, .tCYC = 114, .tDS = 15, .tDH = 5, .tDVS = 70, ++ .tDVH = 6, .tCVS = 70, .tCVH = 6, .tFS_min = 0, ++ .tLI_max = 100, .tMLI = 20, .tAZ = 10, .tZAH = 20, ++ .tENV_min = 20, .tSR = 50, .tRFS = 75, .tRP = 160, ++ .tACK = 20, .tSS = 50, .tDZFS = 80 ++ }, ++ [1] = { ++ .t2CYC = 156, .tCYC = 75, .tDS = 10, .tDH = 5, .tDVS = 48, ++ .tDVH = 6, .tCVS = 48, .tCVH = 6, .tFS_min = 0, ++ .tLI_max = 100, .tMLI = 20, .tAZ = 10, .tZAH = 20, ++ .tENV_min = 20, .tSR = 30, .tRFS = 70, .tRP = 125, ++ .tACK = 20, .tSS = 50, .tDZFS = 63 ++ }, ++ [2] = { ++ .t2CYC = 117, .tCYC = 55, .tDS = 7, .tDH = 5, .tDVS = 34, ++ .tDVH = 6, .tCVS = 34, .tCVH = 6, .tFS_min = 0, ++ .tLI_max = 100, .tMLI = 20, .tAZ = 10, .tZAH = 20, ++ .tENV_min = 20, .tSR = 20, .tRFS = 60, .tRP = 100, ++ .tACK = 20, .tSS = 50, .tDZFS = 47 ++ }, ++ [3] = { ++ .t2CYC = 86, .tCYC = 39, .tDS = 7, .tDH = 5, .tDVS = 20, ++ .tDVH = 6, .tCVS = 20, .tCVH = 6, .tFS_min = 0, ++ .tLI_max = 100, .tMLI = 20, .tAZ = 10, .tZAH = 20, ++ .tENV_min = 20, .tSR = 20, .tRFS = 60, .tRP = 100, ++ .tACK = 20, .tSS = 50, .tDZFS = 35 ++ }, ++ [4] = { ++ .t2CYC = 57, .tCYC = 25, .tDS = 5, .tDH = 5, .tDVS = 7, ++ .tDVH = 6, .tCVS = 7, .tCVH = 6, .tFS_min = 0, ++ .tLI_max = 100, .tMLI = 20, .tAZ = 10, .tZAH = 20, ++ .tENV_min = 20, .tSR = 50, .tRFS = 60, .tRP = 100, ++ .tACK = 20, .tSS = 50, .tDZFS = 25 ++ }, ++ [5] = { ++ .t2CYC = 38, .tCYC = 17, .tDS = 4, .tDH = 5, .tDVS = 5, ++ .tDVH = 6, .tCVS = 10, .tCVH = 10, .tFS_min = 0, ++ .tLI_max = 75, .tMLI = 20, .tAZ = 10, .tZAH = 20, ++ .tENV_min = 20, .tSR = 20, .tRFS = 50, .tRP = 85, ++ .tACK = 20, .tSS = 50, .tDZFS = 40 ++ }, ++}; ++ ++#define NR_UDMA_SPECS (sizeof udma_specs / sizeof udma_specs[0]) ++ ++struct fsl_ata_time_regs { ++ u8 time_off, time_on, time_1, time_2w; ++ u8 time_2r, time_ax, time_pio_rdx, time_4; ++ u8 time_9, time_m, time_jn, time_d; ++ u8 time_k, time_ack, time_env, time_rpx; ++ u8 time_zah, time_mlix, time_dvh, time_dzfs; ++ u8 time_dvs, time_cvh, time_ss, time_cyc; ++}; ++ ++static void update_timing_config(struct fsl_ata_time_regs *tp, struct ata_host *host) ++{ ++ u32 *lp = (u32 *)tp; ++ struct pata_fsl_priv *priv = host->private_data; ++ u32 *ctlp = (u32 *)priv->fsl_ata_regs; ++ int i; ++ ++ /* ++ * JKM - this could have endianess issues on BE depending ++ * on how the controller is glued to the bus -- probably ++ * should rewrite this to write byte at a time. ++ */ ++ for (i = 0; i < 5; i++) { ++ __raw_writel(*lp, ctlp); ++ lp++; ++ ctlp++; ++ } ++ mb(); ++} ++ ++/*! ++ * Calculate values for the ATA bus timing registers and store ++ * them into the hardware. ++ * ++ * @param xfer_mode specifies XFER xfer_mode ++ * @param pdev specifies platform_device ++ * ++ * @return EINVAL speed out of range, or illegal mode ++ */ ++static int set_ata_bus_timing(u8 xfer_mode, struct platform_device *pdev) ++{ ++ struct fsl_ata_platform_data *plat = (struct fsl_ata_platform_data *) ++ pdev->dev.platform_data; ++ struct ata_host *host = dev_get_drvdata(&pdev->dev); ++ ++ /* get the bus clock cycle time, in ns */ ++ int T = 1 * 1000 * 1000 * 1000 / plat->get_clk_rate(); ++ struct fsl_ata_time_regs tr = {0}; ++ DPRINTK("clk_rate = %d T = %d\n",plat->get_clk_rate(), T); ++ ++ /* ++ * every mode gets the same t_off and t_on ++ */ ++ tr.time_off = 3; ++ tr.time_on = 3; ++ ++ if (xfer_mode >= XFER_UDMA_0) { ++ int speed = xfer_mode - XFER_UDMA_0; ++ if (speed >= NR_UDMA_SPECS) { ++ return -EINVAL; ++ } ++ tr.time_ack = (udma_specs[speed].tACK + T) / T; ++ tr.time_env = (udma_specs[speed].tENV_min + T) / T; ++ tr.time_rpx = (udma_specs[speed].tRP + T) / T + 2; ++ ++ tr.time_zah = (udma_specs[speed].tZAH + T) / T; ++ tr.time_mlix = (udma_specs[speed].tMLI + T) / T; ++ tr.time_dvh = (udma_specs[speed].tDVH + T) / T + 1; ++ tr.time_dzfs = (udma_specs[speed].tDZFS + T) / T; ++ ++ tr.time_dvs = (udma_specs[speed].tDVS + T) / T; ++ tr.time_cvh = (udma_specs[speed].tCVH + T) / T; ++ tr.time_ss = (udma_specs[speed].tSS + T) / T; ++ tr.time_cyc = (udma_specs[speed].tCYC + T) / T; ++ } else if (xfer_mode >= XFER_MW_DMA_0) { ++ int speed = xfer_mode - XFER_MW_DMA_0; ++ if (speed >= NR_MDMA_SPECS) { ++ return -EINVAL; ++ } ++ tr.time_m = (mdma_specs[speed].tM + T) / T; ++ tr.time_jn = (mdma_specs[speed].tJNH + T) / T; ++ tr.time_d = (mdma_specs[speed].tD + T) / T; ++ ++ tr.time_k = (mdma_specs[speed].tKW + T) / T; ++ } else { ++ int speed = xfer_mode - XFER_PIO_0; ++ if (speed >= NR_PIO_SPECS) { ++ return -EINVAL; ++ } ++ tr.time_1 = (pio_specs[speed].t1 + T) / T; ++ tr.time_2w = (pio_specs[speed].t2_8 + T) / T; ++ ++ tr.time_2r = (pio_specs[speed].t2_8 + T) / T; ++ tr.time_ax = (pio_specs[speed].tA + T) / T + 2; ++ tr.time_pio_rdx = 1; ++ tr.time_4 = (pio_specs[speed].t4 + T) / T; ++ ++ tr.time_9 = (pio_specs[speed].t9 + T) / T; ++ } ++ ++ update_timing_config(&tr, host); ++ ++ return 0; ++} ++ ++static void pata_fsl_set_piomode(struct ata_port *ap, struct ata_device *adev) ++{ ++ set_ata_bus_timing(adev->pio_mode, to_platform_device(ap->dev)); ++} ++ ++#ifdef CONFIG_FSL_PATA_USE_DMA ++static void pata_fsl_set_dmamode(struct ata_port *ap, struct ata_device *adev) ++{ ++ struct pata_fsl_priv *priv = ap->host->private_data; ++ ++ priv->ultra = adev->dma_mode >= XFER_UDMA_0; ++ ++ set_ata_bus_timing(adev->dma_mode, to_platform_device(ap->dev)); ++} ++#endif ++ ++static int pata_fsl_port_start(struct ata_port *ap) ++{ ++ return 0; ++} ++ ++#ifdef CONFIG_FSL_PATA_USE_DMA ++static void dma_callback(void *arg, int error_status, unsigned int count) ++{ ++ struct ata_port *ap = arg; ++ struct pata_fsl_priv *priv = ap->host->private_data; ++ u8 *ata_regs = priv->fsl_ata_regs; ++ ++ priv->dma_done = 1; ++ /* ++ * DMA is finished, so unmask INTRQ from the drive to allow the ++ * normal ISR to fire. ++ */ ++#if 0 ++ __raw_writel(FSL_ATA_INTR_ATA_INTRQ2, ata_regs + FSL_ATA_INT_EN); ++#else ++ WRITE_ATA8(FSL_ATA_INTR_ATA_INTRQ2, FSL_ATA_INT_EN); ++#endif ++ mb(); ++} ++ ++static void pata_fsl_bmdma_setup(struct ata_queued_cmd *qc) ++{ ++ int nr_sg = 0; ++ int chan; ++ int dma_mode = 0, dma_ultra; ++ u8 ata_control; ++ struct ata_port *ap = qc->ap; ++ struct pata_fsl_priv *priv = ap->host->private_data; ++ u8 *ata_regs = priv->fsl_ata_regs; ++ struct fsl_ata_platform_data *plat = ap->dev->platform_data; ++ struct scatterlist tmp[plat->max_sg], *tsg, *sg; ++ int err; ++ ++ DPRINTK("ENTER\n"); ++ ++ priv->dma_dir = qc->dma_dir; ++ ++ /* ++ * Configure the on-chip ATA interface hardware. ++ */ ++ dma_ultra = priv->ultra ? ++ FSL_ATA_CTRL_DMA_ULTRA : 0; ++ ++ ata_control = FSL_ATA_CTRL_FIFO_RST_B | ++ FSL_ATA_CTRL_ATA_RST_B | ++ FSL_ATA_CTRL_DMA_PENDING | ++ dma_ultra; ++ ++ if (qc->dma_dir == DMA_TO_DEVICE) { ++ chan = priv->dma_wchan; ++ ata_control |= FSL_ATA_CTRL_FIFO_TX_EN | ++ FSL_ATA_CTRL_DMA_WRITE; ++ dma_mode = DMA_MODE_WRITE; ++ } else { ++ chan = priv->dma_rchan; ++ ata_control |= FSL_ATA_CTRL_FIFO_RCV_EN; ++ dma_mode = DMA_MODE_READ; ++ } ++#if 0 ++ __raw_writel(ata_control, ata_regs + FSL_ATA_CONTROL); ++ __raw_writel(plat->fifo_alarm, ata_regs + FSL_ATA_FIFO_ALARM); ++ __raw_writel(FSL_ATA_INTR_ATA_INTRQ1, ata_regs + FSL_ATA_INT_EN); ++#else ++ WRITE_ATA8(ata_control, FSL_ATA_CONTROL); ++ WRITE_ATA8(plat->fifo_alarm, FSL_ATA_FIFO_ALARM); ++ WRITE_ATA8(FSL_ATA_INTR_ATA_INTRQ1, FSL_ATA_INT_EN); ++#endif ++ mb(); ++ ++ /* ++ * Set up the DMA completion callback. ++ */ ++ mxc_dma_callback_set(chan, dma_callback, (void *)ap); ++ ++ /* ++ * Copy the sg list to an array. ++ */ ++ tsg = tmp; ++ ata_for_each_sg(sg, qc) { ++ memcpy(tsg, sg, sizeof *sg); ++ tsg++; ++ nr_sg++; ++ } ++ ++ err = mxc_dma_sg_config(chan, tmp, nr_sg, 0, dma_mode); ++ if (err) { ++ printk(KERN_ERR "pata_fsl_bmdma_setup: error %d\n", err); ++ } ++ DPRINTK("EXIT\n"); ++} ++ ++static void pata_fsl_bmdma_start(struct ata_queued_cmd *qc) ++{ ++ struct ata_port *ap = qc->ap; ++ struct pata_fsl_priv *priv = ap->host->private_data; ++ int chan; ++ int err; ++ ++ /* ++ * Start the channel. ++ */ ++ chan = qc->dma_dir == DMA_TO_DEVICE ? priv->dma_wchan : priv->dma_rchan; ++ ++ priv->dma_done = 0; ++ ++ err = mxc_dma_enable(chan); ++ if (err) { ++ printk(KERN_ERR "%s: : error %d\n", __func__, err); ++ } ++ ++ ap->ops->exec_command(ap, &qc->tf); ++} ++ ++static void pata_fsl_bmdma_stop(struct ata_queued_cmd *qc) ++{ ++ struct ata_port *ap = qc->ap; ++ ++ /* do a dummy read as in ata_bmdma_stop */ ++ ata_altstatus(ap); ++} ++ ++static u8 pata_fsl_bmdma_status(struct ata_port *ap) ++{ ++ struct pata_fsl_priv *priv = ap->host->private_data; ++ ++ return priv->dma_done ? ATA_DMA_INTR : 0; ++} ++ ++static void pata_fsl_dma_init(struct ata_port *ap) ++{ ++ struct pata_fsl_priv *priv = ap->host->private_data; ++ ++ priv->dma_rchan = -1; ++ priv->dma_wchan = -1; ++ ++ priv->dma_rchan = mxc_dma_request(MXC_DMA_ATA_RX, "MXC ATA RX"); ++ if (priv->dma_rchan < 0) { ++ dev_printk(KERN_ERR, ap->dev, "couldn't get RX DMA channel\n"); ++ goto err_out; ++ } ++ ++ priv->dma_wchan = mxc_dma_request(MXC_DMA_ATA_TX, "MXC ATA TX"); ++ if (priv->dma_wchan < 0) { ++ dev_printk(KERN_ERR, ap->dev, "couldn't get TX DMA channel\n"); ++ goto err_out; ++ } ++ ++ dev_printk(KERN_ERR, ap->dev, "rchan=%d wchan=%d\n", priv->dma_rchan, ++ priv->dma_wchan); ++ return; ++ ++err_out: ++ ap->mwdma_mask = 0; ++ ap->udma_mask = 0; ++ mxc_dma_free(priv->dma_rchan); ++ mxc_dma_free(priv->dma_wchan); ++ kfree(priv); ++} ++#endif /* CONFIG_FSL_PATA_USE_DMA */ ++ ++static u8 pata_fsl_irq_ack(struct ata_port *ap, unsigned int chk_drq) ++{ ++ unsigned int bits = chk_drq ? ATA_BUSY | ATA_DRQ : ATA_BUSY; ++ u8 status; ++ ++ status = ata_busy_wait(ap, bits, 1000); ++ if (status & bits) ++ if (ata_msg_err(ap)) ++ printk(KERN_ERR "abnormal status 0x%X\n", status); ++ ++ return status; ++} ++ ++static void ata_dummy_noret(struct ata_port *ap) { return; } ++ ++static struct scsi_host_template pata_fsl_sht = { ++ .module = THIS_MODULE, ++ .name = DRV_NAME, ++ .ioctl = ata_scsi_ioctl, ++ .queuecommand = ata_scsi_queuecmd, ++ .can_queue = ATA_DEF_QUEUE, ++ .this_id = ATA_SHT_THIS_ID, ++ .sg_tablesize = LIBATA_MAX_PRD, ++ .cmd_per_lun = ATA_SHT_CMD_PER_LUN, ++ .emulated = ATA_SHT_EMULATED, ++ .use_clustering = ATA_SHT_USE_CLUSTERING, ++ .proc_name = DRV_NAME, ++#ifdef CONFIG_FSL_PATA_USE_DMA ++ .dma_boundary = FSL_ATA_MAX_SG_LEN, ++#endif ++ .slave_configure = ata_scsi_slave_config, ++ .slave_destroy = ata_scsi_slave_destroy, ++ .bios_param = ata_std_bios_param, ++}; ++ ++static struct ata_port_operations pata_fsl_port_ops = { ++ .set_piomode = pata_fsl_set_piomode, ++#ifdef CONFIG_FSL_PATA_USE_DMA ++ .set_dmamode = pata_fsl_set_dmamode, ++#endif ++ ++ .port_disable = ata_port_disable, ++ .tf_load = ata_tf_load, ++ .tf_read = ata_tf_read, ++ .check_status = ata_check_status, ++ .exec_command = ata_exec_command, ++ .dev_select = ata_std_dev_select, ++ ++ .freeze = ata_bmdma_freeze, ++ .thaw = ata_bmdma_thaw, ++ .error_handler = ata_bmdma_error_handler, ++ .post_internal_cmd = ata_bmdma_post_internal_cmd, ++ .cable_detect = ata_cable_unknown, ++ ++#ifdef CONFIG_FSL_PATA_USE_DMA ++ .bmdma_setup = pata_fsl_bmdma_setup, ++ .bmdma_start = pata_fsl_bmdma_start, ++#endif ++ ++ .qc_prep = ata_noop_qc_prep, ++ .qc_issue = ata_qc_issue_prot, ++ ++ .data_xfer = ata_data_xfer_noirq, ++ ++ .irq_clear = ata_dummy_noret, ++ .irq_on = ata_irq_on, ++ .irq_ack = pata_fsl_irq_ack, ++ ++ .port_start = pata_fsl_port_start, ++ ++#ifdef CONFIG_FSL_PATA_USE_DMA ++ .bmdma_stop = pata_fsl_bmdma_stop, ++ .bmdma_status = pata_fsl_bmdma_status, ++#endif ++}; ++ ++static void fsl_setup_port(struct ata_ioports *ioaddr) ++{ ++ unsigned int shift = 2; ++ ++ ioaddr->data_addr = ioaddr->cmd_addr + (ATA_REG_DATA << shift); ++ ioaddr->error_addr = ioaddr->cmd_addr + (ATA_REG_ERR << shift); ++ ioaddr->feature_addr = ioaddr->cmd_addr + (ATA_REG_FEATURE << shift); ++ ioaddr->nsect_addr = ioaddr->cmd_addr + (ATA_REG_NSECT << shift); ++ ioaddr->lbal_addr = ioaddr->cmd_addr + (ATA_REG_LBAL << shift); ++ ioaddr->lbam_addr = ioaddr->cmd_addr + (ATA_REG_LBAM << shift); ++ ioaddr->lbah_addr = ioaddr->cmd_addr + (ATA_REG_LBAH << shift); ++ ioaddr->device_addr = ioaddr->cmd_addr + (ATA_REG_DEVICE << shift); ++ ioaddr->status_addr = ioaddr->cmd_addr + (ATA_REG_STATUS << shift); ++ ioaddr->command_addr = ioaddr->cmd_addr + (ATA_REG_CMD << shift); ++} ++ ++/** ++ * pata_fsl_probe - attach a platform interface ++ * @pdev: platform device ++ * ++ * Register a platform bus integrated ATA host controller ++ * ++ * The 3 platform device resources are used as follows: ++ * ++ * - I/O Base (IORESOURCE_MEM) virt. addr. of ATA controller regs ++ * - CTL Base (IORESOURCE_MEM) unused ++ * - IRQ (IORESOURCE_IRQ) platform IRQ assigned to ATA ++ * ++ */ ++static int __devinit pata_fsl_probe(struct platform_device *pdev) ++{ ++ struct resource *io_res; ++ struct ata_host *host; ++ struct ata_port *ap; ++ struct fsl_ata_platform_data *plat = (struct fsl_ata_platform_data *) ++ pdev->dev.platform_data; ++ struct pata_fsl_priv *priv; ++ u8 *ata_regs; ++ int ret; ++ ++ DPRINTK("ENTER\n"); ++ /* ++ * Get an ata_host structure for this device ++ */ ++ host = ata_host_alloc(&pdev->dev, 1); ++ if (!host) ++ return -ENOMEM; ++ ap = host->ports[0]; ++ ++ /* ++ * Allocate private data ++ */ ++ priv = kzalloc(sizeof (struct pata_fsl_priv), GFP_KERNEL); ++ if(priv == NULL) { ++ /* free(host); */ ++ return -ENOMEM; ++ } ++ host->private_data = priv; ++ ++ /* ++ * Set up resources ++ */ ++ if (unlikely(pdev->num_resources != 3)) { ++ dev_err(&pdev->dev, "invalid number of resources\n"); ++ return -EINVAL; ++ } ++ ++ io_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); ++ ata_regs = (u8 *)io_res->start; ++ priv->fsl_ata_regs = ata_regs; ++ ap->ioaddr.cmd_addr = (void *)(ata_regs + FSL_ATA_DRIVE_DATA); ++ ap->ioaddr.ctl_addr = (void *)(ata_regs + FSL_ATA_DRIVE_CONTROL); ++ ap->ioaddr.altstatus_addr = ap->ioaddr.ctl_addr; ++ ap->ops = &pata_fsl_port_ops; ++ ap->pio_mask = 0x7F; ++#ifdef CONFIG_FSL_PATA_USE_DMA ++ ap->mwdma_mask = 0x7F; ++ ap->udma_mask = plat->udma_mask; ++ pata_fsl_sht.sg_tablesize = plat->max_sg; ++#else ++ ap->mwdma_mask = 0x00; ++ ap->udma_mask = 0x00; ++#endif ++ fsl_setup_port(&ap->ioaddr); ++ ++ /* ++ * Do platform-specific initialization (e.g. allocate pins, ++ * turn on clock). After this call it is assumed that ++ * plat->get_clk_rate() can be called to calculate ++ * timing. ++ */ ++ if (plat->init && plat->init(pdev)) { ++ /* REVISIT: don't leak what ata_host_alloc() allocated */ ++ return -ENODEV; ++ } ++ ++ /* Deassert the reset bit to enable the interface */ ++ WRITE_ATA8(FSL_ATA_CTRL_ATA_RST_B, FSL_ATA_CONTROL); ++ mb(); ++ ++ /* Set initial timing and mode */ ++ set_ata_bus_timing(XFER_PIO_4, pdev); ++ ++#ifdef CONFIG_FSL_PATA_USE_DMA ++ /* get DMA ready */ ++ pata_fsl_dma_init(ap); ++#endif ++ ++ /* ++ * Enable the ATA INTRQ interrupt from the bus, but ++ * only allow the CPU to see it (INTRQ2) at this point. ++ * INTRQ1, which goes to the DMA, will be enabled later. ++ */ ++#if 0 ++ __raw_writel(FSL_ATA_INTR_ATA_INTRQ2, ata_regs + FSL_ATA_INT_EN); ++#else ++ WRITE_ATA8(FSL_ATA_INTR_ATA_INTRQ2, FSL_ATA_INT_EN); ++#endif ++ mb(); ++ ++ /* activate */ ++ ret = ata_host_activate(host, platform_get_irq(pdev, 0), ata_interrupt, ++ 0, &pata_fsl_sht); ++ DPRINTK("EXIT ret=%d\n", ret); ++ return ret; ++} ++ ++/** ++ * pata_fsl_remove - unplug a platform interface ++ * @pdev: platform device ++ * ++ * A platform bus ATA device has been unplugged. Perform the needed ++ * cleanup. Also called on module unload for any active devices. ++ */ ++static int __devexit pata_fsl_remove(struct platform_device *pdev) ++{ ++ struct device *dev = &pdev->dev; ++ struct ata_host *host = dev_get_drvdata(dev); ++ struct pata_fsl_priv *priv = host->private_data; ++ struct fsl_ata_platform_data *plat = (struct fsl_ata_platform_data *) ++ pdev->dev.platform_data; ++ u8 *ata_regs = priv->fsl_ata_regs; ++ ++#if 0 ++ __raw_writel(0, ata_regs + FSL_ATA_INT_EN); /* Disable interrupts */ ++#else ++ WRITE_ATA8(0, FSL_ATA_INT_EN); /* Disable interrupts */ ++#endif ++ mb(); ++ ++ ata_host_detach(host); ++ ++ if (plat->exit) ++ plat->exit(); ++ ++ kfree(priv); ++ ++ return 0; ++} ++ ++#ifdef CONFIG_PM ++static int pata_fsl_suspend(struct platform_device *pdev, pm_message_t state) ++{ ++ struct ata_host *host = dev_get_drvdata(&pdev->dev); ++ struct pata_fsl_priv *priv = host->private_data; ++ struct fsl_ata_platform_data *plat = (struct fsl_ata_platform_data *) ++ pdev->dev.platform_data; ++ u8 *ata_regs = priv->fsl_ata_regs; ++ ++ /* Disable interrupts. */ ++#if 0 ++ __raw_writel(0, ata_regs + FSL_ATA_INT_EN); ++#else ++ WRITE_ATA8(0, FSL_ATA_INT_EN); ++#endif ++ mb(); ++ ++ if (plat->exit) ++ plat->exit(); ++ ++ return 0; ++} ++ ++static int pata_fsl_resume(struct platform_device *pdev) ++{ ++ struct ata_host *host = dev_get_drvdata(&pdev->dev); ++ struct pata_fsl_priv *priv = host->private_data; ++ struct fsl_ata_platform_data *plat = (struct fsl_ata_platform_data *) ++ pdev->dev.platform_data; ++ u8 *ata_regs = priv->fsl_ata_regs; ++ ++ if (plat->init && plat->init(pdev)) { ++ return -ENODEV; ++ } ++ ++ /* Deassert the reset bit to enable the interface */ ++#if 0 ++ __raw_writel(FSL_ATA_CTRL_ATA_RST_B, ata_regs + FSL_ATA_CONTROL); ++#else ++ WRITE_ATA8(FSL_ATA_CTRL_ATA_RST_B, FSL_ATA_CONTROL); ++#endif ++ mb(); ++ ++ /* Set initial timing and mode */ ++ set_ata_bus_timing(XFER_PIO_4, pdev); ++ ++ /* ++ * Enable hardware interrupts. ++ */ ++#if 0 ++ __raw_writel(FSL_ATA_INTR_ATA_INTRQ2, ata_regs + FSL_ATA_INT_EN); ++#else ++ WRITE_ATA8(FSL_ATA_INTR_ATA_INTRQ2, FSL_ATA_INT_EN); ++#endif ++ mb(); ++ ++ return 0; ++} ++#endif ++ ++static struct platform_driver pata_fsl_driver = { ++ .probe = pata_fsl_probe, ++ .remove = __devexit_p(pata_fsl_remove), ++#ifdef CONFIG_PM ++ .suspend = pata_fsl_suspend, ++ .resume = pata_fsl_resume, ++#endif ++ .driver = { ++ .name = DRV_NAME, ++ .owner = THIS_MODULE, ++ }, ++}; ++ ++static int __init pata_fsl_init(void) ++{ ++ int ret; ++ ++ DPRINTK("ENTER\n"); ++ ret = platform_driver_register(&pata_fsl_driver); ++ DPRINTK("EXIT ret=%d\n", ret); ++ return ret; ++} ++ ++static void __exit pata_fsl_exit(void) ++{ ++ platform_driver_unregister(&pata_fsl_driver); ++} ++module_init(pata_fsl_init); ++module_exit(pata_fsl_exit); ++ ++MODULE_AUTHOR("Freescale Semiconductor, Inc."); ++MODULE_DESCRIPTION("low-level driver for Freescale ATA"); ++MODULE_LICENSE("GPL"); ++MODULE_VERSION(DRV_VERSION); +--- a/include/asm-m68k/pci.h ++++ b/include/asm-m68k/pci.h +@@ -7,8 +7,14 @@ + #ifndef _ASM_M68K_PCI_H + #define _ASM_M68K_PCI_H + +-#ifdef CONFIG_PCI +- ++#ifndef CONFIG_PCI ++/* ++ * The PCI address space does equal the physical memory ++ * address space. The networking and block device layers use ++ * this boolean for bounce buffer decisions. ++ */ ++#define PCI_DMA_BUS_IS_PHYS (1) ++#else + #include <asm-generic/pci-dma-compat.h> + + /* +--- a/include/linux/fsl_devices.h ++++ b/include/linux/fsl_devices.h +@@ -126,5 +126,16 @@ struct mpc8xx_pcmcia_ops { + int(*voltage_set)(int slot, int vcc, int vpp); + }; + ++struct fsl_ata_platform_data { ++#ifdef CONFIG_FSL_PATA_USE_DMA ++ int udma_mask; /* UDMA modes h/w can handle */ ++ int fifo_alarm; /* value for fifo_alarm reg */ ++ int max_sg; /* longest sglist h/w can handle */ ++#endif ++ int (*init)(struct platform_device *pdev); ++ void (*exit)(void); ++ int (*get_clk_rate)(void); ++}; ++ + #endif /* _FSL_DEVICE_H_ */ + #endif /* __KERNEL__ */ diff --git a/target/linux/coldfire/patches/014-m5445x_ioremap_xf0000000.patch b/target/linux/coldfire/patches/014-m5445x_ioremap_xf0000000.patch new file mode 100644 index 0000000000..11bbbe2473 --- /dev/null +++ b/target/linux/coldfire/patches/014-m5445x_ioremap_xf0000000.patch @@ -0,0 +1,61 @@ +From ed9d4b88136173a4e17701d9c1162ddfecf902e4 Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Mon, 19 Nov 2007 15:24:30 -0700 +Subject: [PATCH] Short circuit IOREMAP calls in the 0xF0000000 range. + +LTIBName: m5445x-ioremap-xf0000000 +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + arch/m68k/coldfire/head.S | 4 ++-- + arch/m68k/mm/kmap.c | 14 ++++++++++++-- + 2 files changed, 14 insertions(+), 4 deletions(-) + +--- a/arch/m68k/coldfire/head.S ++++ b/arch/m68k/coldfire/head.S +@@ -56,13 +56,13 @@ + * Setup ACR mappings to provide the following memory map: + * Data + * 0xA0000000 -> 0xAFFFFFFF [0] NO CACHE / PRECISE / SUPER ONLY +- * 0xFC000000 -> 0xFCFFFFFF [1] NO CACHE / PRECISE / SUPER ONLY ++ * 0xF0000000 -> 0xFFFFFFFF [1] NO CACHE / PRECISE / SUPER ONLY + * Code + * None currently (mapped via TLBs) + */ + + #define ACR0_DEFAULT #0xA00FA048 /* ACR0 default value */ +-#define ACR1_DEFAULT #0xFC00A040 /* ACR1 default value */ ++#define ACR1_DEFAULT #0xF00FA040 /* ACR1 default value */ + #define ACR2_DEFAULT #0x00000000 /* ACR2 default value */ + #define ACR3_DEFAULT #0x00000000 /* ACR3 default value */ + +--- a/arch/m68k/mm/kmap.c ++++ b/arch/m68k/mm/kmap.c +@@ -133,8 +133,18 @@ void __iomem *__ioremap(unsigned long ph + } + #endif + ++#ifdef CONFIG_M54455 ++ if (physaddr >= 0xf0000000) { ++ /* short circuit mappings for xf0000000 */ + #ifdef DEBUG +- printk("ioremap: 0x%lx,0x%lx(%d) - ", physaddr, size, cacheflag); ++ printk(KERN_INFO "ioremap: short circuiting 0x%lx mapping\n", physaddr); ++#endif ++ return (void __iomem *)physaddr; ++ } ++#endif ++ ++#ifdef DEBUG ++ printk("ioremap: paddr=0x%lx,size=0x%lx(%d) - ", physaddr, size, cacheflag); + #endif + /* + * Mappings have to be aligned +@@ -153,7 +163,7 @@ void __iomem *__ioremap(unsigned long ph + virtaddr = (unsigned long)area->addr; + retaddr = virtaddr + offset; + #ifdef DEBUG +- printk("0x%lx,0x%lx,0x%lx", physaddr, virtaddr, retaddr); ++ printk(" paddr=0x%lx,vaddr=0x%lx,retaddr=0x%lx", physaddr, virtaddr, retaddr); + #endif + + /* diff --git a/target/linux/coldfire/patches/015-m5445x_cau_crypto.patch b/target/linux/coldfire/patches/015-m5445x_cau_crypto.patch new file mode 100644 index 0000000000..dac62e2857 --- /dev/null +++ b/target/linux/coldfire/patches/015-m5445x_cau_crypto.patch @@ -0,0 +1,1937 @@ +From 67e24d4008a39fa02a4748a3abf54410b15262b3 Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Tue, 20 Nov 2007 10:02:16 -0700 +Subject: [PATCH] Add Coldfire CAU crypto support for DES/3DES/AES/MD5/AES. + +LTIBName: m5445x-cau-crypto +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + drivers/crypto/Kconfig | 63 ++++ + drivers/crypto/Makefile | 5 + + drivers/crypto/mcfcau-aes.c | 311 ++++++++++++++++++++ + drivers/crypto/mcfcau-des.c | 437 ++++++++++++++++++++++++++++ + drivers/crypto/mcfcau-md5.c | 654 ++++++++++++++++++++++++++++++++++++++++++ + drivers/crypto/mcfcau-sha1.c | 280 ++++++++++++++++++ + drivers/crypto/mcfcau.c | 32 ++ + drivers/crypto/mcfcau.h | 98 +++++++ + 8 files changed, 1880 insertions(+), 0 deletions(-) + create mode 100644 drivers/crypto/mcfcau-aes.c + create mode 100644 drivers/crypto/mcfcau-des.c + create mode 100644 drivers/crypto/mcfcau-md5.c + create mode 100644 drivers/crypto/mcfcau-sha1.c + create mode 100644 drivers/crypto/mcfcau.c + create mode 100644 drivers/crypto/mcfcau.h + +--- a/drivers/crypto/Kconfig ++++ b/drivers/crypto/Kconfig +@@ -60,6 +60,69 @@ config CRYPTO_DEV_GEODE + To compile this driver as a module, choose M here: the module + will be called geode-aes. + ++config CRYPTO_DEV_MCFCAU ++ bool "Support for Freescale Coldfire Cryptographic Acceleration Unit (CAU)" ++ depends on M54455 ++ select CRYPTO_ALGAPI ++ help ++ The cryptographic acceleration unit (CAU) is a ColdFire coprocessor ++ implementing a set of specialized operations in hardware. For example, you can ++ find it on MCF54455. ++ ++config CRYPTO_DEV_MCFCAU_DES ++ tristate "DES and Triple DES cipher algorithms (MCF54455)" ++ depends on CRYPTO_DEV_MCFCAU ++ select CRYPTO_ALGAPI ++ select CRYPTO_BLKCIPHER ++ help ++ DES cipher algorithm (FIPS 46-2), and Triple DES EDE (FIPS 46-3). ++ ++ Say 'Y' here to use the CAU coprocessor for ++ the CryptoAPI DES and 3DES alogrithms. ++ ++ To compile this driver as a module, choose M here: the module ++ will be called mcfcau-des. ++ ++config CRYPTO_DEV_MCFCAU_AES ++ tristate "AES cipher algorithm (MCF54455)" ++ depends on CRYPTO_DEV_MCFCAU ++ select CRYPTO_ALGAPI ++ select CRYPTO_BLKCIPHER ++ help ++ AES cipher algorithm (FIPS 197). ++ ++ Say 'Y' here to use the CAU coprocessor for ++ the CryptoAPI AES alogrithm. ++ ++ To compile this driver as a module, choose M here: the module ++ will be called mcfcau-aes. ++ ++config CRYPTO_DEV_MCFCAU_MD5 ++ tristate "MD5 digest algorithm (MCF54455)" ++ depends on CRYPTO_DEV_MCFCAU ++ select CRYPTO_ALGAPI ++ help ++ MD5 message digest algorithm (RFC1321). ++ ++ Say 'Y' here to use the CAU coprocessor for ++ the CryptoAPI MD5 alogrithm. ++ ++ To compile this driver as a module, choose M here: the module ++ will be called mcfcau-md5. ++ ++config CRYPTO_DEV_MCFCAU_SHA1 ++ tristate "SHA1 digest algorithm (MCF54455)" ++ depends on CRYPTO_DEV_MCFCAU ++ select CRYPTO_ALGAPI ++ help ++ SHA-1 secure hash standard (FIPS 180-1/DFIPS 180-2). ++ ++ Say 'Y' here to use the CAU coprocessor for ++ the CryptoAPI SHA1 alogrithm. ++ ++ To compile this driver as a module, choose M here: the module ++ will be called mcfcau-sha1. ++ + config ZCRYPT + tristate "Support for PCI-attached cryptographic adapters" + depends on S390 +--- a/drivers/crypto/Makefile ++++ b/drivers/crypto/Makefile +@@ -2,3 +2,8 @@ obj-$(CONFIG_CRYPTO_DEV_PADLOCK_AES) += + obj-$(CONFIG_CRYPTO_DEV_PADLOCK_SHA) += padlock-sha.o + obj-$(CONFIG_CRYPTO_DEV_GEODE) += geode-aes.o + obj-$(CONFIG_CRYPTO_DEV_HIFN_795X) += hifn_795x.o ++obj-$(CONFIG_CRYPTO_DEV_MCFCAU) += mcfcau.o ++obj-$(CONFIG_CRYPTO_DEV_MCFCAU_DES) += mcfcau-des.o ++obj-$(CONFIG_CRYPTO_DEV_MCFCAU_AES) += mcfcau-aes.o ++obj-$(CONFIG_CRYPTO_DEV_MCFCAU_MD5) += mcfcau-md5.o ++obj-$(CONFIG_CRYPTO_DEV_MCFCAU_SHA1) += mcfcau-sha1.o +--- /dev/null ++++ b/drivers/crypto/mcfcau-aes.c +@@ -0,0 +1,311 @@ ++ /*************************************************************************** ++ * mcfcau-aes.c - Implementation of AES Cipher Algorithm ++ * for Freescale ColdFire Cryptographic Acceleration Unit (CAU). ++ * ++ * Author: Andrey Butok ++ * Copyright Freescale Semiconductor Inc. 2007 ++ * ++ * NOTE: You can find the ColdFire CAU module on MCF54455 and MCF52235. ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ++ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software Foundation, ++ * Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ * ++ *************************************************************************** ++ * Changes: ++ * v0.01 17 September 2007 Andrey Butok ++ * Initial Release - developed on 2.6.20 Linux kernel. ++ */ ++ ++#include <linux/module.h> ++#include <linux/init.h> ++#include <linux/types.h> ++#include <linux/errno.h> ++#include <linux/crypto.h> ++ ++/* ++#undef DEBUG ++#define DEBUG 1 ++*/ ++ ++#include "mcfcau.h" ++ ++#define MCFCAU_AES_MIN_KEY_SIZE (16) ++#define MCFCAU_AES_MAX_KEY_SIZE (32) ++#define MCFCAU_AES_BLOCK_SIZE (16) ++ ++#define MCFCAU_AES_DRIVER_DESC "AES ColdFire CAU driver" ++#define MCFCAU_AES_DRIVER_VERSION "v0.01" ++ ++struct mcfcau_aes_ctx { ++ int Nr_1; ++ u32 buf[120]; ++ u32 buf_tmp[16]; ++}; ++ ++static u32 mcfcau_rco_tab[10]={ 0x01000000, 0x02000000, 0x04000000, 0x08000000, ++ 0x10000000, 0x20000000, 0x40000000, 0x80000000, ++ 0x1b000000, 0x36000000}; ++ ++int mcfcau_aes_setkey(struct crypto_tfm *tfm, const u8 *in_key, ++ unsigned int key_len) ++{ ++ struct mcfcau_aes_ctx *ctx = crypto_tfm_ctx(tfm); ++ const u32 * key = (const u32 *)in_key; ++ u32 *flags = &tfm->crt_flags; ++ u32 i; ++ u32* key_sch = (&ctx->buf[0]); ++ u32 * temp_p, * rcon_p; ++ u32 Nx; ++ u32 Nk; ++ unsigned long iflags; ++ ++ DBG("\n"); ++ ++ if (key_len % 8) { ++ *flags |= CRYPTO_TFM_RES_BAD_KEY_LEN; ++ return -EINVAL; ++ } ++ ++ Nk = key_len>>2; ++ ++ for(i=0;i<Nk;i++){ ++ key_sch[i] = key[i]; ++ } ++ ++ ctx->Nr_1 = Nk+5; ++ ++ /* Key Expansion */ ++ temp_p=&key_sch[Nk-1]; ++ rcon_p=&mcfcau_rco_tab[0]; ++ ++ spin_lock_irqsave(&mcfcau_lock, iflags); ++ ++ asm volatile ("move.l %0, %%a1"::"m"(temp_p):"a1"); ++ asm volatile ("move.l %0, %%a3"::"m"(rcon_p):"a3"); ++ asm volatile ("move.l %0, %%a4"::"m"(key_sch):"a4"); ++ ++ Nx=(Nk+7)<<2; /* (Nr+1)*Nb */ ++ ++ for(i=Nk; i<Nx; i++) ++ { ++ /* temp = key_sch[Nk-1] */ ++ asm volatile ("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CAA):"a1"); ++ ++ if(i%Nk==0){ ++ asm volatile ("moveq #8, %%d0":::"d0"); ++ /* CAA=RotWord(temp) */ ++ asm volatile ("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA):"d0"); ++ /* SubWord(CAA) */ ++ asm volatile ("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_AESS+MCFCAU_CAA)); ++ /* ACC xor rcon[i/Nk] */ ++ asm volatile ("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_XOR+MCFCAU_CAA):"a3"); ++ ++ }else if((Nk>6) && (i%Nk ==4)){ ++ /* SubWord(ACC) */ ++ asm volatile ("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_AESS+MCFCAU_CAA)); ++ } ++ ++ /* key_sch[i]^=key_sch[i-Nk]; store ACC to key_sch[i] */ ++ asm volatile ("cp0ld.l (%%a4)+,%%d0,#1,%0" ::"n"(MCFCAU_XOR+MCFCAU_CAA):"a4"); ++ asm volatile ("cp0st.l %%d0,(%%a1),#1,%0" ::"n"(MCFCAU_STR+MCFCAU_CAA)); ++ } ++ spin_unlock_irqrestore(&mcfcau_lock, iflags); ++ ++ return 0; ++} ++ ++ ++/* encrypt a block of text */ ++static void mcfcau_aes_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in) ++{ ++ struct mcfcau_aes_ctx *ctx = crypto_tfm_ctx(tfm); ++ const int Nr_1 = ctx->Nr_1; ++ ++ u32* key_sch = &(ctx->buf[0]); ++ u32 i; ++ unsigned long iflags; ++ ++ DBG("\n"); ++ ++ spin_lock_irqsave(&mcfcau_lock, iflags); ++ asm("move.l %0, %%a1"::"m"(in):"a1"); ++ asm("move.l %0, %%a0"::"m"(key_sch):"a0"); ++ /* state=in */ ++ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA0):"a1"); ++ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA1):"a1"); ++ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA2):"a1"); ++ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA3):"a1"); ++ /* AddRoundKey() */ ++ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_XOR+MCFCAU_CA0):"a0"); ++ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_XOR+MCFCAU_CA1):"a0"); ++ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_XOR+MCFCAU_CA2):"a0"); ++ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_XOR+MCFCAU_CA3):"a0"); ++ ++ for(i=Nr_1;i>0;i--){ ++ /* SubBytes(state) */ ++ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESS+MCFCAU_CA0)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESS+MCFCAU_CA1)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESS+MCFCAU_CA2)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESS+MCFCAU_CA3)); ++ /* ShiftRows(state) */ ++ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESR)); ++ /* MixColumns(state); AddRoundKey() */ ++ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_AESC+MCFCAU_CA0):"a0"); ++ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_AESC+MCFCAU_CA1):"a0"); ++ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_AESC+MCFCAU_CA2):"a0"); ++ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_AESC+MCFCAU_CA3):"a0"); ++ } ++ /* SubBytes(state)*/ ++ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESS+MCFCAU_CA0)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESS+MCFCAU_CA1)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESS+MCFCAU_CA2)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESS+MCFCAU_CA3)); ++ /* ShiftRows(state) */ ++ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESR)); ++ /* AddRoundKey() */ ++ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_XOR+MCFCAU_CA0):"a0"); ++ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_XOR+MCFCAU_CA1):"a0"); ++ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_XOR+MCFCAU_CA2):"a0"); ++ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_XOR+MCFCAU_CA3):"a0"); ++ /* out = state */ ++ asm("move.l %0, %%a1" ::"m"(out):"a1"); ++ asm("cp0st.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_STR+MCFCAU_CA0):"d0"); ++ asm("cp0st.l %%d0,%%d1,#1,%0" ::"n"(MCFCAU_STR+MCFCAU_CA1):"d1"); ++ ++ asm("move.l %%d0,(%%a1)+":::"a1"); ++ asm("move.l %%d1,(%%a1)+":::"a1"); ++ ++ asm("cp0st.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_STR+MCFCAU_CA2):"d0"); ++ asm("cp0st.l %%d0,%%d1,#1,%0" ::"n"(MCFCAU_STR+MCFCAU_CA3):"d1"); ++ ++ asm("move.l %%d0,(%%a1)+":::"a1"); ++ asm("move.l %%d1,(%%a1)+":::"a1"); ++ spin_unlock_irqrestore(&mcfcau_lock, iflags); ++} ++ ++ ++/* decrypt a block of text */ ++static void mcfcau_aes_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in) ++{ ++ struct mcfcau_aes_ctx *ctx = crypto_tfm_ctx(tfm); ++ u32* key_sch = &(ctx->buf[0]); ++ u32 i; ++ unsigned long iflags; ++ const int Nr_1 = ctx->Nr_1; ++ key_sch=&key_sch[(Nr_1+2)*4]; ++ ++ DBG("\n"); ++ ++ spin_lock_irqsave(&mcfcau_lock, iflags); ++ ++ asm("move.l %0, %%a1"::"m"(in):"a1"); ++ asm("move.l %0, %%a0"::"m"(key_sch):"a0"); ++ /* state=in */ ++ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA0):"a1"); ++ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA1):"a1"); ++ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA2):"a1"); ++ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA3):"a1"); ++ /* AddRoundKey() */ ++ asm("cp0ld.l -(%%a0),%%d0,#1,%0" ::"n"(MCFCAU_XOR+MCFCAU_CA3):"a0"); ++ asm("cp0ld.l -(%%a0),%%d0,#1,%0" ::"n"(MCFCAU_XOR+MCFCAU_CA2):"a0"); ++ asm("cp0ld.l -(%%a0),%%d0,#1,%0" ::"n"(MCFCAU_XOR+MCFCAU_CA1):"a0"); ++ asm("cp0ld.l -(%%a0),%%d0,#1,%0" ::"n"(MCFCAU_XOR+MCFCAU_CA0):"a0"); ++ ++ for(i=Nr_1;i>0;i--){ ++ /* InvShiftRows(state) */ ++ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESIR)); ++ /* InvSubBytes(state) */ ++ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESIS+MCFCAU_CA3)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESIS+MCFCAU_CA2)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESIS+MCFCAU_CA1)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESIS+MCFCAU_CA0)); ++ /* InvMixColumns(state); AddRoundKey() */ ++ asm("cp0ld.l -(%%a0),%%d0,#1,%0" ::"n"(MCFCAU_AESIC+MCFCAU_CA3):"a0"); ++ asm("cp0ld.l -(%%a0),%%d0,#1,%0" ::"n"(MCFCAU_AESIC+MCFCAU_CA2):"a0"); ++ asm("cp0ld.l -(%%a0),%%d0,#1,%0" ::"n"(MCFCAU_AESIC+MCFCAU_CA1):"a0"); ++ asm("cp0ld.l -(%%a0),%%d0,#1,%0" ::"n"(MCFCAU_AESIC+MCFCAU_CA0):"a0"); ++ } ++ /* InvShiftRows(state) */ ++ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESIR)); ++ /* InvSubBytes(state)*/ ++ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESIS+MCFCAU_CA3)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESIS+MCFCAU_CA2)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESIS+MCFCAU_CA1)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESIS+MCFCAU_CA0)); ++ /* AddRoundKey() */ ++ asm("cp0ld.l -(%%a0),%%d0,#1,%0" ::"n"(MCFCAU_XOR+MCFCAU_CA3):"a0"); ++ asm("cp0ld.l -(%%a0),%%d0,#1,%0" ::"n"(MCFCAU_XOR+MCFCAU_CA2):"a0"); ++ asm("cp0ld.l -(%%a0),%%d0,#1,%0" ::"n"(MCFCAU_XOR+MCFCAU_CA1):"a0"); ++ asm("cp0ld.l -(%%a0),%%d0,#1,%0" ::"n"(MCFCAU_XOR+MCFCAU_CA0):"a0"); ++ /* out = state */ ++ asm("move.l %0, %%a1" ::"m"(out):"a1"); ++ asm("cp0st.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_STR+MCFCAU_CA0):"d0"); ++ asm("cp0st.l %%d0,%%d1,#1,%0" ::"n"(MCFCAU_STR+MCFCAU_CA1):"d1"); ++ ++ asm("move.l %%d0,(%%a1)+":::"a1"); ++ asm("move.l %%d1,(%%a1)+":::"a1"); ++ ++ asm("cp0st.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_STR+MCFCAU_CA2):"d0"); ++ asm("cp0st.l %%d0,%%d1,#1,%0" ::"n"(MCFCAU_STR+MCFCAU_CA3):"d1"); ++ ++ asm("move.l %%d0,(%%a1)+":::"a1"); ++ asm("move.l %%d1,(%%a1)+":::"a1"); ++ spin_unlock_irqrestore(&mcfcau_lock, iflags); ++ ++} ++ ++ ++static struct crypto_alg mcfcau_aes_alg = { ++ .cra_name = "aes", ++ .cra_driver_name = "aes-mcfcau", ++ .cra_priority = MCFCAU_CRA_PRIORITY, ++ .cra_flags = CRYPTO_ALG_TYPE_CIPHER, ++ .cra_blocksize = MCFCAU_AES_BLOCK_SIZE, ++ .cra_ctxsize = sizeof(struct mcfcau_aes_ctx), ++ .cra_alignmask = 3, ++ .cra_module = THIS_MODULE, ++ .cra_list = LIST_HEAD_INIT(mcfcau_aes_alg.cra_list), ++ .cra_u = { ++ .cipher = { ++ .cia_min_keysize = MCFCAU_AES_MIN_KEY_SIZE, ++ .cia_max_keysize = MCFCAU_AES_MAX_KEY_SIZE, ++ .cia_setkey = mcfcau_aes_setkey, ++ .cia_encrypt = mcfcau_aes_encrypt, ++ .cia_decrypt = mcfcau_aes_decrypt ++ } ++ } ++}; ++ ++static int __init mcfcau_aes_init(void) ++{ ++ int ret = crypto_register_alg(&mcfcau_aes_alg); ++ ++ printk(KERN_INFO MCFCAU_AES_DRIVER_DESC " " ++ MCFCAU_AES_DRIVER_VERSION " %s.\n",ret?"failed":"registered"); ++ return ret; ++} ++ ++static void __exit mcfcau_aes_fini(void) ++{ ++ crypto_unregister_alg(&mcfcau_aes_alg); ++ printk(KERN_INFO MCFCAU_AES_DRIVER_DESC " " ++ MCFCAU_AES_DRIVER_VERSION " unregistered.\n"); ++} ++ ++module_init(mcfcau_aes_init); ++module_exit(mcfcau_aes_fini); ++ ++MODULE_DESCRIPTION(MCFCAU_AES_DRIVER_DESC); ++MODULE_LICENSE("Dual BSD/GPL"); ++MODULE_AUTHOR("Andrey Butok"); +--- /dev/null ++++ b/drivers/crypto/mcfcau-des.c +@@ -0,0 +1,437 @@ ++/*************************************************************************** ++ * mcfcau-des.c - Implementation of DES & Triple DES EDE Cipher Algorithms ++ * for Freescale ColdFire Cryptographic Acceleration Unit (CAU). ++ * ++ * Author: Andrey Butok ++ * Copyright Freescale Semiconductor Inc. 2007 ++ * ++ * NOTE: You can find the ColdFire CAU module on MCF54455 and MCF52235. ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ++ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software Foundation, ++ * Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ * ++ *************************************************************************** ++ * Changes: ++ * v0.01 14 August 2007 Andrey Butok ++ * Initial Release - developed on 2.6.20 Linux kernel. ++ */ ++ ++#include <linux/init.h> ++#include <linux/module.h> ++#include <linux/errno.h> ++#include <linux/crypto.h> ++#include <linux/types.h> ++ ++/* ++#undef DEBUG ++#define DEBUG 1 ++*/ ++ ++#include "mcfcau.h" ++ ++#define MCFCAU_DES_KEY_SIZE (8) ++#define MCFCAU_DES_EXPKEY_WORDS (32) ++#define MCFCAU_DES_BLOCK_SIZE (8) ++ ++#define MCFCAU_DES3_EDE_KEY_SIZE (3 * MCFCAU_DES_KEY_SIZE) ++#define MCFCAU_DES3_EDE_EXPKEY_WORDS (3 * MCFCAU_DES_EXPKEY_WORDS) ++#define MCFCAU_DES3_EDE_BLOCK_SIZE (MCFCAU_DES_BLOCK_SIZE) ++ ++#define MCFCAU_DES_DRIVER_DESC "DES & 3DES ColdFire CAU driver" ++#define MCFCAU_DES_DRIVER_VERSION "v0.01" ++ ++struct mcfcau_des_ctx { ++ u32 expkey[MCFCAU_DES_EXPKEY_WORDS]; ++}; ++ ++struct mcfcau_des3_ede_ctx { ++ u32 expkey[MCFCAU_DES3_EDE_EXPKEY_WORDS]; ++}; ++ ++/* DES round operations */ ++static inline void mcfcau_des_encipher(void) ++{ ++ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESK)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_IP+MCFCAU_KSL1)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSL2)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSL2)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSL2)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSL2)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSL2)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSL2)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSL1)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSL2)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSL2)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSL2)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSL2)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSL2)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSL2)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSL1)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_FP+MCFCAU_KSL1)); ++} ++ ++static inline void mcfcau_des_decipher(void) ++{ ++ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESK+MCFCAU_DC)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_IP+MCFCAU_KSR1)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSR2)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSR2)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSR2)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSR2)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSR2)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSR2)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSR1)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSR2)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSR2)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSR2)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSR2)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSR2)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSR2)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSR1)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_FP+MCFCAU_KSL1)); ++} ++ ++ ++static int mcfcau_des_setkey(struct crypto_tfm *tfm, const u8 *key_p, ++ unsigned int keylen) ++{ ++ struct mcfcau_des_ctx *dctx = crypto_tfm_ctx(tfm); ++ u32 *flags = &tfm->crt_flags; ++ u32 * key = (u32 *) key_p; ++ ++ DBG("\n"); ++ ++ /* ++ * RFC2451: Weak key checks SHOULD be performed. ++ * ++ * FIPS 74: ++ * Keys having duals are keys which produce all zeros, all ones, or ++ * alternating zero-one patterns in the C and D registers after Permuted ++ * Choice 1 has operated on the key. ++ * ++ */ ++ if(*flags & CRYPTO_TFM_REQ_WEAK_KEY){ /* FIPS 74 */ ++ if(key[0]<0xE001E00l){ ++ if(key[0]<0x1FE01FE0){ ++ if(key[0]<0x01E001E0){ ++ if(((key[0]==0x01010101)&&(key[1]==0x01010101))|| ++ ((key[0]==0x011F011F)&&(key[1]==0x010E010E)) ) ++ goto WEAK_KEY; ++ } ++ else{ ++ if(((key[0]==0x01E001E0)&&(key[1]==0x01F101F1))|| ++ ((key[0]==0x01FE01FE)&&(key[1]==0x01FE01FE)) ) ++ goto WEAK_KEY; ++ } ++ } ++ else{ ++ if(key[0]<0x1F1F1F1F){ ++ if(((key[0]==0x1FE01FE0)&&(key[1]==0x0EF10EF1))|| ++ ((key[0]==0x1F011F0l)&&(key[1]==0x0E010E01)) ) ++ goto WEAK_KEY; ++ } ++ else{ ++ if(((key[0]==0x1F1F1F1F)&&(key[1]==0x0E0E0E0E))|| ++ ((key[0]==0x1FFE1FFE)&&(key[1]==0x0EFE0EFE)) ) ++ goto WEAK_KEY; ++ } ++ } ++ } else { ++ if(key[0]<0xFE01FE01){ ++ if(key[0]<0xE0E0E0E0){ ++ if(((key[0]==0xE001E00l)&&(key[1]==0xF101F101))|| ++ ((key[0]==0xE01FE01F)&&(key[1]==0xF10EF10E)) ) ++ goto WEAK_KEY; ++ } ++ else{ ++ if(((key[0]==0xE0E0E0E0)&&(key[1]==0xF1F1F1F1))|| ++ ((key[0]==0xE0FEE0FE)&&(key[1]==0xF1FEF1FE)) ) ++ goto WEAK_KEY; ++ } ++ } ++ else{ ++ if(key[0]<0xFEE0FEE0){ ++ if(((key[0]==0xFE01FE01)&&(key[1]==0xFE01FE01))|| ++ ((key[0]==0xFE1FFE1F)&&(key[1]==0xFE0EFE0E)) ) ++ goto WEAK_KEY; ++ } ++ else{ ++ if(((key[0]==0xFEE0FEE0)&&(key[1]==0xFEF1FEF1))|| ++ ((key[0]==0xFEFEFEFE)&&(key[1]==0xFEFEFEFE)) ) ++ goto WEAK_KEY; ++ } ++ } ++ } ++ } ++ memcpy(dctx->expkey, key_p, keylen); ++ return 0; ++WEAK_KEY: ++ *flags |= CRYPTO_TFM_RES_WEAK_KEY; ++ return -EINVAL; ++} ++ ++ ++void mcfcau_des_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src) ++{ ++ struct mcfcau_des_ctx *ctx = crypto_tfm_ctx(tfm); ++ u32 * des_key_tmp = ctx->expkey; ++ unsigned long iflags; ++ ++ DBG("\n"); ++ ++ spin_lock_irqsave(&mcfcau_lock, iflags); ++ ++ asm("move.l %0, %%a0"::"m"(src):"a0"); ++ asm("move.l %0, %%a1"::"m"(des_key_tmp):"a1"); ++ ++ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA2):"a0"); ++ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA3)); ++ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA0):"a1"); ++ asm("cp0ld.l (%%a1),%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA1)); ++ ++ mcfcau_des_encipher(); ++ ++ asm("cp0st.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_STR+MCFCAU_CA2):"d0"); ++ asm("cp0st.l %%d0,%%d1,#1,%0" ::"n"(MCFCAU_STR+MCFCAU_CA3):"d1"); ++ asm("move.l %0, %%a1" ::"m"(dst):"a1"); ++ asm("move.l %d0,(%a1)+"); ++ asm("move.l %d1,(%a1)"); ++ ++ spin_unlock_irqrestore(&mcfcau_lock, iflags); ++} ++ ++ ++void mcfcau_des_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src) ++{ ++ struct mcfcau_des_ctx *ctx = crypto_tfm_ctx(tfm); ++ u32 * des_key_tmp = ctx->expkey; ++ unsigned long iflags; ++ ++ DBG("\n"); ++ ++ spin_lock_irqsave(&mcfcau_lock, iflags); ++ ++ asm("move.l %0, %%a0"::"m"(src):"a0"); ++ asm("move.l %0, %%a1"::"m"(des_key_tmp):"a1"); ++ ++ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA2):"a0"); ++ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA3)); ++ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA0):"a1"); ++ asm("cp0ld.l (%%a1),%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA1)); ++ ++ mcfcau_des_decipher(); ++ ++ asm("move.l %0, %%a1" ::"m"(dst):"a1"); ++ asm("cp0st.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_STR+MCFCAU_CA2):"d0"); ++ asm("cp0st.l %%d0,%%d1,#1,%0" ::"n"(MCFCAU_STR+MCFCAU_CA3):"d1"); ++ asm("move.l %d0,(%a1)+"); ++ asm("move.l %d1,(%a1)"); ++ ++ spin_unlock_irqrestore(&mcfcau_lock, iflags); ++} ++ ++ ++/* ++ * RFC2451: ++ * ++ * For DES-EDE3, there is no known need to reject weak or ++ * complementation keys. Any weakness is obviated by the use of ++ * multiple keys. ++ * ++ * However, if the first two or last two independent 64-bit keys are ++ * equal (k1 == k2 or k2 == k3), then the DES3 operation is simply the ++ * same as DES. Implementers MUST reject keys that exhibit this ++ * property. ++ * ++ */ ++ ++static int mcfcau_des3_ede_setkey(struct crypto_tfm *tfm, const u8 *key_p, unsigned int keylen) ++{ ++ const u32 *key = (const u32 *)key_p; ++ struct mcfcau_des3_ede_ctx *dctx = crypto_tfm_ctx(tfm); ++ u32 *flags = &tfm->crt_flags; ++ ++DBG("\n"); ++ ++ if (unlikely(!((key[0] ^ key[2]) | (key[1] ^ key[3])) || ++ !((key[2] ^ key[4]) | (key[3] ^ key[5])))) ++ { ++ *flags |= CRYPTO_TFM_RES_BAD_KEY_SCHED; ++ return -EINVAL; ++ } ++ ++ memcpy(dctx->expkey,key_p,keylen); ++ ++ return 0; ++} ++ ++static void mcfcau_des3_ede_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src) ++{ ++ struct mcfcau_des3_ede_ctx *dctx = crypto_tfm_ctx(tfm); ++ const u32 * des_key_tmp = dctx->expkey; ++ unsigned long iflags; ++ ++ DBG("\n"); ++ ++ spin_lock_irqsave(&mcfcau_lock, iflags); ++ ++ /*EK1*/ ++ asm("move.l %0, %%a0"::"m"(src):"a0"); ++ asm("move.l %0, %%a1"::"m"(des_key_tmp):"a1"); ++ ++ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA2):"a0"); ++ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA3)); ++ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA0):"a1"); ++ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA1):"a1"); ++ ++ mcfcau_des_encipher(); ++ ++ /*DK2*/ ++ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA0):"a1"); ++ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA1):"a1"); ++ ++ mcfcau_des_decipher(); ++ ++ /*EK3*/ ++ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA0):"a1"); ++ asm("cp0ld.l (%%a1),%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA1)); ++ ++ mcfcau_des_encipher(); ++ ++ asm("move.l %0, %%a1" ::"m"(dst):"a1"); ++ asm("cp0st.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_STR+MCFCAU_CA2):"d0"); ++ asm("cp0st.l %%d0,%%d1,#1,%0" ::"n"(MCFCAU_STR+MCFCAU_CA3):"d1"); ++ asm("move.l %d0,(%a1)+"); ++ asm("move.l %d1,(%a1)"); ++ ++ spin_unlock_irqrestore(&mcfcau_lock, iflags); ++} ++ ++static void mcfcau_des3_ede_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src) ++{ ++ struct mcfcau_des3_ede_ctx *dctx = crypto_tfm_ctx(tfm); ++ const u32 * des_key_tmp = dctx->expkey + 6 - 2; ++ unsigned long iflags; ++ ++ DBG("\n"); ++ ++ spin_lock_irqsave(&mcfcau_lock, iflags); ++ ++ /*DK3*/ ++ asm("move.l %0, %%a0"::"m"(src):"a0"); ++ asm("move.l %0, %%a1"::"m"(des_key_tmp):"a1"); ++ ++ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA2):"a0"); ++ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA3)); ++ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA0):"a1"); ++ asm("cp0ld.l (%%a1),%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA1)); ++ ++ mcfcau_des_decipher(); ++ ++ /*EK2*/ ++ asm("suba.l #12,%a1"); /*dec key pointer*/ ++ ++ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA0):"a1"); ++ asm("cp0ld.l (%%a1),%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA1)); ++ ++ mcfcau_des_encipher(); ++ ++ /*DK1*/ ++ asm("suba.l #12,%a1"); /*dec key pointer*/ ++ ++ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA0):"a1"); ++ asm("cp0ld.l (%%a1),%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA1)); ++ ++ mcfcau_des_decipher(); ++ ++ asm("move.l %0, %%a1" ::"m"(dst):"a1"); ++ asm("cp0st.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_STR+MCFCAU_CA2):"d0"); ++ asm("cp0st.l %%d0,%%d1,#1,%0" ::"n"(MCFCAU_STR+MCFCAU_CA3):"d1"); ++ asm("move.l %d0,(%a1)+"); ++ asm("move.l %d1,(%a1)"); ++ ++ spin_unlock_irqrestore(&mcfcau_lock, iflags); ++} ++ ++ ++static struct crypto_alg mcfcau_des_alg = { ++ .cra_name = "des", ++ .cra_driver_name = "des-mcfcau", ++ .cra_priority = MCFCAU_CRA_PRIORITY, ++ .cra_flags = CRYPTO_ALG_TYPE_CIPHER, ++ .cra_blocksize = MCFCAU_DES_BLOCK_SIZE, ++ .cra_ctxsize = sizeof(struct mcfcau_des_ctx), ++ .cra_module = THIS_MODULE, ++ .cra_alignmask = 3, ++ .cra_list = LIST_HEAD_INIT(mcfcau_des_alg.cra_list), ++ .cra_u = { .cipher = { ++ .cia_min_keysize = MCFCAU_DES_KEY_SIZE, ++ .cia_max_keysize = MCFCAU_DES_KEY_SIZE, ++ .cia_setkey = mcfcau_des_setkey, ++ .cia_encrypt = mcfcau_des_encrypt, ++ .cia_decrypt = mcfcau_des_decrypt } } ++}; ++ ++static struct crypto_alg mcfcau_des3_ede_alg = { ++ .cra_name = "des3_ede", ++ .cra_driver_name = "des3_ede-mcfcau", ++ .cra_priority = MCFCAU_CRA_PRIORITY, ++ .cra_flags = CRYPTO_ALG_TYPE_CIPHER, ++ .cra_blocksize = MCFCAU_DES3_EDE_BLOCK_SIZE, ++ .cra_ctxsize = sizeof(struct mcfcau_des3_ede_ctx), ++ .cra_module = THIS_MODULE, ++ .cra_alignmask = 3, ++ .cra_list = LIST_HEAD_INIT(mcfcau_des3_ede_alg.cra_list), ++ .cra_u = { .cipher = { ++ .cia_min_keysize = MCFCAU_DES3_EDE_KEY_SIZE, ++ .cia_max_keysize = MCFCAU_DES3_EDE_KEY_SIZE, ++ .cia_setkey = mcfcau_des3_ede_setkey, ++ .cia_encrypt = mcfcau_des3_ede_encrypt, ++ .cia_decrypt = mcfcau_des3_ede_decrypt } } ++}; ++ ++MODULE_ALIAS("mcfcau_des3_ede"); ++ ++static int __init mcfcau_des_init(void) ++{ ++ int ret; ++ ++ ret = crypto_register_alg(&mcfcau_des_alg); ++ if (ret < 0) ++ goto out; ++ ++ ret = crypto_register_alg(&mcfcau_des3_ede_alg); ++ if (ret < 0) ++ crypto_unregister_alg(&mcfcau_des_alg); ++out: ++ printk(KERN_INFO MCFCAU_DES_DRIVER_DESC " " ++ MCFCAU_DES_DRIVER_VERSION " %s.\n",ret?"failed":"registered"); ++ return ret; ++} ++ ++static void __exit mcfcau_des_exit(void) ++{ ++ crypto_unregister_alg(&mcfcau_des3_ede_alg); ++ crypto_unregister_alg(&mcfcau_des_alg); ++ ++ printk(KERN_INFO MCFCAU_DES_DRIVER_DESC " " ++ MCFCAU_DES_DRIVER_VERSION " unregistered.\n"); ++} ++ ++module_init(mcfcau_des_init); ++module_exit(mcfcau_des_exit); ++ ++MODULE_LICENSE("GPL"); ++MODULE_DESCRIPTION("DES & Triple DES EDE Cipher Algorithms for ColdFire CAU"); ++MODULE_AUTHOR("Andrey Butok"); +--- /dev/null ++++ b/drivers/crypto/mcfcau-md5.c +@@ -0,0 +1,654 @@ ++ /*************************************************************************** ++ * mcfcau-md5.c - Implementation of MD5 Message Digest Algorithm (RFC1321) ++ * for Freescale ColdFire Cryptographic Acceleration Unit (CAU). ++ * ++ * Author: Andrey Butok ++ * Copyright Freescale Semiconductor Inc. 2007 ++ * ++ * NOTE: You can find the ColdFire CAU module on MCF54455 and MCF52235. ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ++ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software Foundation, ++ * Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ * ++ *************************************************************************** ++ * Changes: ++ * v0.01 30 September 2007 Andrey Butok ++ * Initial Release - developed on 2.6.20 Linux kernel. ++ */ ++#include <linux/init.h> ++#include <linux/module.h> ++#include <linux/string.h> ++#include <linux/crypto.h> ++#include <linux/types.h> ++#include <asm/byteorder.h> ++ ++/* ++#undef DEBUG ++#define DEBUG 1 ++*/ ++ ++#include "mcfcau.h" ++ ++ ++#define MCFCAU_MD5_DIGEST_SIZE (16) ++#define MCFCAU_MD5_HMAC_BLOCK_SIZE (64) ++#define MCFCAU_MD5_BLOCK_WORDS (16) ++#define MCFCAU_MD5_HASH_WORDS (4) ++ ++#define MCFCAU_MD5_DRIVER_DESC "MD5 ColdFire CAU driver" ++#define MCFCAU_MD5_DRIVER_VERSION "v0.01" ++ ++ ++struct mcfcau_md5_ctx { ++ u32 hash[MCFCAU_MD5_HASH_WORDS]; ++ u32 block[MCFCAU_MD5_BLOCK_WORDS]; ++ u64 byte_count; ++}; ++ ++u32 mcfcau_md5_t[64]={0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, ++ 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, ++ 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, ++ 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, ++ 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, ++ 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, ++ 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, ++ 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, ++ 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, ++ 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, ++ 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, ++ 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, ++ 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, ++ 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, ++ 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, ++ 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391}; ++ ++ ++ ++static void mcfcau_md5_transform(u32 *hash, u32 const *in) ++{ ++ int i; ++ u32 * md5_t_p=&mcfcau_md5_t[0]; ++ unsigned long iflags; ++ ++ spin_lock_irqsave(&mcfcau_lock, iflags); ++ asm("move.l %0, %%a1"::"m"(hash):"a1"); ++ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CAA):"a1");/*a*/ ++ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA1):"a1");/*b*/ ++ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA2):"a1");/*c*/ ++ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA3):"a1");/*d*/ ++ asm("move.l %0, %%a0"::"m"(in):"a0"); /* X[] */ ++ asm("move.l %0, %%a3"::"m"(md5_t_p):"a3"); /* T[] */ ++ ++ ++ /* Round 1 */ ++ asm("moveq.l #7, %%d4":::"d4"); /* for rotating by 7 */ ++ asm("moveq.l #12, %%d5":::"d5"); /* for rotating by 12 */ ++ asm("moveq.l #17, %%d6":::"d6"); /* for rotating by 17 */ ++ asm("moveq.l #22, %%d7":::"d7"); /* for rotating by 22 */ ++ ++ for(i=0; i<4;i++){ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFF)); /* a+F(b,c,d) */ ++ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); /* add byterev x[i] */ ++ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); /* add t[i] */ ++ asm("cp0ld.l %%d4,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); /* rotate by 7 */ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); /* add b */ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); /* register to register shift */ ++ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFF)); ++ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); ++ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); ++ asm("cp0ld.l %%d5,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); ++ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFF)); ++ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); ++ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); ++ asm("cp0ld.l %%d6,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); ++ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFF)); ++ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); ++ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); ++ asm("cp0ld.l %%d7,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); ++ }; ++ ++ ++ /* Round 2 */ ++ asm("moveq.l #5, %%d4":::"d4"); /* for rotating by 5 */ ++ asm("moveq.l #9, %%d5":::"d5"); /* for rotating by 9 */ ++ asm("moveq.l #14, %%d6":::"d6"); /* for rotating by 14 */ ++ asm("moveq.l #20, %%d7":::"d7"); /* for rotating by 20 */ ++ ++ asm("lea -60(%%a0),%%a0":::"a0"); ++ ++ for(i=0; i<2;i++){ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFG)); ++ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); ++ asm("lea 20(%%a0),%%a0" :::"a0"); ++ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); ++ asm("cp0ld.l %%d4,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); ++ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFG)); ++ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); ++ asm("lea 20(%%a0),%%a0" :::"a0"); ++ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); ++ asm("cp0ld.l %%d5,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); ++ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFG)); ++ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); ++ asm("lea -44(%%a0),%%a0" :::"a0"); ++ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); ++ asm("cp0ld.l %%d6,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); ++ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFG)); ++ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); ++ asm("lea 20(%%a0),%%a0" :::"a0"); ++ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); ++ asm("cp0ld.l %%d7,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); ++ }; ++ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFG)); ++ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); ++ asm("lea 20(%%a0),%%a0" :::"a0"); ++ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); ++ asm("cp0ld.l %%d4,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); ++ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFG)); ++ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); ++ asm("lea -44(%%a0),%%a0" :::"a0"); ++ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); ++ asm("cp0ld.l %%d5,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); ++ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFG)); ++ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); ++ asm("lea 20(%%a0),%%a0" :::"a0"); ++ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); ++ asm("cp0ld.l %%d6,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); ++ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFG)); ++ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); ++ asm("lea 20(%%a0),%%a0" :::"a0"); ++ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); ++ asm("cp0ld.l %%d7,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); ++ ++ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFG)); ++ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); ++ asm("lea -44(%%a0),%%a0" :::"a0"); ++ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); ++ asm("cp0ld.l %%d4,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); ++ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFG)); ++ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); ++ asm("lea 20(%%a0),%%a0" :::"a0"); ++ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); ++ asm("cp0ld.l %%d5,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); ++ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFG)); ++ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); ++ asm("lea 20(%%a0),%%a0" :::"a0"); ++ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); ++ asm("cp0ld.l %%d6,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); ++ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFG)); ++ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); ++ asm("lea -28(%%a0),%%a0" :::"a0"); ++ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); ++ asm("cp0ld.l %%d7,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); ++ ++ ++ /* Round 3 */ ++ asm("moveq.l #4, %%d4":::"d4"); /* for rotating by 5 */ ++ asm("moveq.l #11, %%d5":::"d5"); /* for rotating by 9 */ ++ asm("moveq.l #16, %%d6":::"d6"); /* for rotating by 14 */ ++ asm("moveq.l #23, %%d7":::"d7"); /* for rotating by 20 */ ++ ++ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFH)); ++ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); ++ asm("lea 12(%%a0),%%a0" :::"a0"); ++ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); ++ asm("cp0ld.l %%d4,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); ++ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFH)); ++ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); ++ asm("lea 12(%%a0),%%a0" :::"a0"); ++ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); ++ asm("cp0ld.l %%d5,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); ++ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFH)); ++ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); ++ asm("lea 12(%%a0),%%a0" :::"a0"); ++ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); ++ asm("cp0ld.l %%d6,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); ++ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFH)); ++ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); ++ asm("lea -52(%%a0),%%a0" :::"a0"); ++ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); ++ asm("cp0ld.l %%d7,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); ++ ++ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFH)); ++ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); ++ asm("lea 12(%%a0),%%a0" :::"a0"); ++ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); ++ asm("cp0ld.l %%d4,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); ++ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFH)); ++ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); ++ asm("lea 12(%%a0),%%a0" :::"a0"); ++ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); ++ asm("cp0ld.l %%d5,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); ++ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFH)); ++ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); ++ asm("lea 12(%%a0),%%a0" :::"a0"); ++ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); ++ asm("cp0ld.l %%d6,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); ++ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFH)); ++ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); ++ asm("lea 12(%%a0),%%a0" :::"a0"); ++ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); ++ asm("cp0ld.l %%d7,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); ++ ++ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFH)); ++ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); ++ asm("lea -52(%%a0),%%a0" :::"a0"); ++ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); ++ asm("cp0ld.l %%d4,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); ++ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFH)); ++ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); ++ asm("lea 12(%%a0),%%a0" :::"a0"); ++ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); ++ asm("cp0ld.l %%d5,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); ++ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFH)); ++ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); ++ asm("lea 12(%%a0),%%a0" :::"a0"); ++ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); ++ asm("cp0ld.l %%d6,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); ++ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFH)); ++ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); ++ asm("lea 12(%%a0),%%a0" :::"a0"); ++ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); ++ asm("cp0ld.l %%d7,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); ++ ++ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFH)); ++ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); ++ asm("lea 12(%%a0),%%a0" :::"a0"); ++ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); ++ asm("cp0ld.l %%d4,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); ++ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFH)); ++ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); ++ asm("lea 12(%%a0),%%a0" :::"a0"); ++ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); ++ asm("cp0ld.l %%d5,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); ++ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFH)); ++ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); ++ asm("lea -52(%%a0),%%a0" :::"a0"); ++ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); ++ asm("cp0ld.l %%d6,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); ++ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFH)); ++ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); ++ asm("lea -8(%%a0),%%a0" :::"a0"); ++ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); ++ asm("cp0ld.l %%d7,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); ++ ++ ++ /* Round 4 */ ++ asm("moveq.l #6, %%d4":::"d4"); /* for rotating by 6 */ ++ asm("moveq.l #10, %%d5":::"d5"); /* for rotating by 10 */ ++ asm("moveq.l #15, %%d6":::"d6"); /* for rotating by 15 */ ++ asm("moveq.l #21, %%d7":::"d7"); /* for rotating by 21 */ ++ ++ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFI)); ++ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); ++ asm("lea 28(%%a0),%%a0" :::"a0"); ++ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); ++ asm("cp0ld.l %%d4,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); ++ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFI)); ++ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); ++ asm("lea 28(%%a0),%%a0" :::"a0"); ++ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); ++ asm("cp0ld.l %%d5,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); ++ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFI)); ++ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); ++ asm("lea -36(%%a0),%%a0" :::"a0"); ++ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); ++ asm("cp0ld.l %%d6,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); ++ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFI)); ++ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); ++ asm("lea 28(%%a0),%%a0" :::"a0"); ++ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); ++ asm("cp0ld.l %%d7,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); ++ ++ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFI)); ++ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); ++ asm("lea -36(%%a0),%%a0" :::"a0"); ++ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); ++ asm("cp0ld.l %%d4,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); ++ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFI)); ++ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); ++ asm("lea 28(%%a0),%%a0" :::"a0"); ++ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); ++ asm("cp0ld.l %%d5,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); ++ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFI)); ++ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); ++ asm("lea -36(%%a0),%%a0" :::"a0"); ++ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); ++ asm("cp0ld.l %%d6,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); ++ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFI)); ++ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); ++ asm("lea 28(%%a0),%%a0" :::"a0"); ++ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); ++ asm("cp0ld.l %%d7,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); ++ ++ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFI)); ++ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); ++ asm("lea 28(%%a0),%%a0" :::"a0"); ++ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); ++ asm("cp0ld.l %%d4,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); ++ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFI)); ++ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); ++ asm("lea -36(%%a0),%%a0" :::"a0"); ++ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); ++ asm("cp0ld.l %%d5,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); ++ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFI)); ++ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); ++ asm("lea 28(%%a0),%%a0" :::"a0"); ++ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); ++ asm("cp0ld.l %%d6,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); ++ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFI)); ++ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); ++ asm("lea -36(%%a0),%%a0" :::"a0"); ++ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); ++ asm("cp0ld.l %%d7,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); ++ ++ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFI)); ++ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); ++ asm("lea 28(%%a0),%%a0" :::"a0"); ++ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); ++ asm("cp0ld.l %%d4,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); ++ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFI)); ++ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); ++ asm("lea -36(%%a0),%%a0" :::"a0"); ++ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); ++ asm("cp0ld.l %%d5,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); ++ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFI)); ++ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); ++ asm("lea 28(%%a0),%%a0" :::"a0"); ++ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); ++ asm("cp0ld.l %%d6,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); ++ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFI)); ++ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0"); ++ asm("lea 28(%%a0),%%a0" :::"a0"); ++ asm("cp0ld.l (%%a3)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3"); ++ asm("cp0ld.l %%d7,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA1)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MDS)); ++ ++ ++ asm("move.l %0, %%a1"::"m"(hash):"a1"); ++ ++ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a1");/*a*/ ++ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CA1):"a1");/*b*/ ++ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CA2):"a1");/*c*/ ++ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CA3):"a1");/*d*/ ++ ++ asm("cp0st.l %%d0,-(%%a1),#1,%0" ::"n"(MCFCAU_STR+MCFCAU_CA3):"a1");/*d*/ ++ asm("cp0st.l %%d0,-(%%a1),#1,%0" ::"n"(MCFCAU_STR+MCFCAU_CA2):"a1");/*c*/ ++ asm("cp0st.l %%d0,-(%%a1),#1,%0" ::"n"(MCFCAU_STR+MCFCAU_CA1):"a1");/*b*/ ++ asm("cp0st.l %%d0,-(%%a1),#1,%0" ::"n"(MCFCAU_STR+MCFCAU_CAA):"a1");/*a*/ ++ spin_unlock_irqrestore(&mcfcau_lock, iflags); ++} ++ ++static inline void le32_to_cpu_array(u32 *buf, unsigned int words) ++{ ++ while (words--) { ++ __le32_to_cpus(buf); ++ buf++; ++ } ++} ++ ++static inline void cpu_to_le32_array(u32 *buf, unsigned int words) ++{ ++ while (words--) { ++ __cpu_to_le32s(buf); ++ buf++; ++ } ++} ++ ++static void mcfcau_md5_initialization(struct crypto_tfm *tfm) ++{ ++ struct mcfcau_md5_ctx *mctx = crypto_tfm_ctx(tfm); ++ ++ DBG("\n"); ++ mctx->hash[0] = 0x67452301; ++ mctx->hash[1] = 0xefcdab89; ++ mctx->hash[2] = 0x98badcfe; ++ mctx->hash[3] = 0x10325476; ++ mctx->byte_count = 0; ++} ++ ++static void mcfcau_md5_update(struct crypto_tfm *tfm, const u8 *data, unsigned int len) ++{ ++ struct mcfcau_md5_ctx *mctx = crypto_tfm_ctx(tfm); ++ const u32 avail = sizeof(mctx->block) - (mctx->byte_count & 0x3f); ++ ++ DBG("\n"); ++ mctx->byte_count += len; ++ ++ if (avail > len) { ++ memcpy((char *)mctx->block + (sizeof(mctx->block) - avail), ++ data, len); ++ } ++ else { ++ memcpy((char *)mctx->block + (sizeof(mctx->block) - avail), data, avail); ++ ++ mcfcau_md5_transform(mctx->hash, mctx->block); ++ data += avail; ++ len -= avail; ++ ++ while (len >= sizeof(mctx->block)) { ++ memcpy(mctx->block, data, sizeof(mctx->block)); ++ mcfcau_md5_transform(mctx->hash, mctx->block); ++ data += sizeof(mctx->block); ++ len -= sizeof(mctx->block); ++ } ++ ++ memcpy(mctx->block, data, len); ++ } ++} ++ ++static void mcfcau_md5_final(struct crypto_tfm *tfm, u8 *out) ++{ ++ struct mcfcau_md5_ctx *mctx = crypto_tfm_ctx(tfm); ++ const unsigned int offset = mctx->byte_count & 0x3f; ++ char *p = (char *)mctx->block + offset; ++ int padding = 56 - (offset + 1); ++ ++ DBG("\n"); ++ ++ *p++ = 0x80; ++ if (padding < 0) { ++ memset(p, 0x00, padding + sizeof (u64)); ++ mcfcau_md5_transform(mctx->hash, mctx->block); ++ p = (char *)mctx->block; ++ padding = 56; ++ } ++ ++ memset(p, 0, padding); ++ mctx->block[14] = mctx->byte_count << 3; ++ mctx->block[15] = mctx->byte_count >> 29; ++ le32_to_cpu_array(&mctx->block[14], 2); ++ ++ mcfcau_md5_transform(mctx->hash, mctx->block); ++ ++ cpu_to_le32_array(mctx->hash, sizeof(mctx->hash) / sizeof(u32)); ++ memcpy(out, mctx->hash, sizeof(mctx->hash)); ++ memset(mctx, 0, sizeof(*mctx)); ++} ++ ++static struct crypto_alg mcfcau_md5_alg = { ++ .cra_name = "md5", ++ .cra_driver_name = "md5-mcfcau", ++ .cra_priority = MCFCAU_CRA_PRIORITY, ++ .cra_flags = CRYPTO_ALG_TYPE_DIGEST, ++ .cra_blocksize = MCFCAU_MD5_HMAC_BLOCK_SIZE, ++ .cra_ctxsize = sizeof(struct mcfcau_md5_ctx), ++ .cra_module = THIS_MODULE, ++ .cra_list = LIST_HEAD_INIT(mcfcau_md5_alg.cra_list), ++ .cra_u = { .digest = { ++ .dia_digestsize = MCFCAU_MD5_DIGEST_SIZE, ++ .dia_init = mcfcau_md5_initialization, ++ .dia_update = mcfcau_md5_update, ++ .dia_final = mcfcau_md5_final } } ++}; ++ ++static int __init mcfcau_md5_init(void) ++{ ++ int ret = crypto_register_alg(&mcfcau_md5_alg); ++ printk(KERN_INFO MCFCAU_MD5_DRIVER_DESC " " ++ MCFCAU_MD5_DRIVER_VERSION " %s.\n",ret?"failed":"registered"); ++ return ret; ++} ++ ++static void __exit mcfcau_md5_exit(void) ++{ ++ crypto_unregister_alg(&mcfcau_md5_alg); ++ printk(KERN_INFO MCFCAU_MD5_DRIVER_DESC " " ++ MCFCAU_MD5_DRIVER_VERSION " unregistered.\n"); ++} ++ ++module_init(mcfcau_md5_init); ++module_exit(mcfcau_md5_exit); ++ ++MODULE_LICENSE("GPL"); ++MODULE_DESCRIPTION(MCFCAU_MD5_DRIVER_DESC); ++MODULE_AUTHOR("Andrey Butok"); +--- /dev/null ++++ b/drivers/crypto/mcfcau-sha1.c +@@ -0,0 +1,280 @@ ++ /*************************************************************************** ++ * mcfcau-sha1.c - Implementation of SHA1 Secure Hash Algorithm ++ * for Freescale ColdFire Cryptographic Acceleration Unit (CAU). ++ * ++ * Author: Andrey Butok ++ * Copyright Freescale Semiconductor Inc. 2007 ++ * ++ * NOTE: You can find the ColdFire CAU module on MCF54455 and MCF52235. ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ++ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software Foundation, ++ * Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ * ++ *************************************************************************** ++ * Changes: ++ * v0.01 15 October 2007 Andrey Butok ++ * Initial Release - developed on 2.6.20 Linux kernel. ++ */ ++ ++#include <linux/init.h> ++#include <linux/module.h> ++#include <linux/mm.h> ++#include <linux/crypto.h> ++#include <linux/types.h> ++ ++ ++/* ++#undef DEBUG ++#define DEBUG 1 ++*/ ++ ++#include "mcfcau.h" ++ ++#define MCFCAU_SHA1_DIGEST_WORDS (5) ++#define MCFCAU_SHA1_WORKSPACE_WORDS (80) ++ ++#define MCFCAU_SHA1_DIGEST_SIZE (20) ++#define MCFCAU_SHA1_HMAC_BLOCK_SIZE (64) ++ ++#define MCFCAU_SHA1_DRIVER_DESC "SHA1 ColdFire CAU driver" ++#define MCFCAU_SHA1_DRIVER_VERSION "v0.01" ++ ++struct mcfcau_sha1_ctx { ++ u64 count; ++ u32 state[5]; ++ u8 buffer[64]; ++}; ++ ++const static u32 K[4]={0x5A827999L, /* Rounds 0-19: sqrt(2) * 2^30 */ ++ 0x6ED9EBA1L, /* Rounds 20-39: sqrt(3) * 2^30 */ ++ 0x8F1BBCDCL, /* Rounds 40-59: sqrt(5) * 2^30 */ ++ 0xCA62C1D6L}; /* Rounds 60-79: sqrt(10) * 2^30 */ ++ ++static void noinline mcfcau_sha1_transform(__u32 *digest, const char *in, __u32 *W) ++{ ++ int i; ++ u32 * tmp_p; ++ unsigned long iflags; ++ ++ /* (a) Devide M(i) into 16 words W */ ++ for (i = 0; i < 16; i++) ++ W[i] = ((const u32 *)in)[i]; ++ ++ /* (b) W[i+16] = S^1(W[i+13] ^ W[i+8] ^ W[i+2] ^ W[i]) */ ++ tmp_p=&W[16]; ++ ++ spin_lock_irqsave(&mcfcau_lock, iflags); ++ asm("move.l %0, %%a0"::"m"(tmp_p):"a0"); ++ asm("moveq.l #1, %%d3":::"d3"); ++ ++ for (i = 0; i < 64; i++){ ++ asm("cp0ld.l -64(%%a0),%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA0)); ++ asm("cp0ld.l -56(%%a0),%%d0,#1,%0" ::"n"(MCFCAU_XOR+MCFCAU_CA0)); ++ asm("cp0ld.l -32(%%a0),%%d0,#1,%0" ::"n"(MCFCAU_XOR+MCFCAU_CA0)); ++ asm("cp0ld.l -12(%%a0),%%d0,#1,%0" ::"n"(MCFCAU_XOR+MCFCAU_CA0)); ++ asm("cp0ld.l %%d3,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CA0):"d3"); ++ asm("cp0st.l %%d0,(%%a0)+,#1,%0" ::"n"(MCFCAU_STR+MCFCAU_CA0)); ++ } ++ ++ /* (c) */ ++ asm("move.l %0, %%a0"::"m"(digest):"a0"); ++ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA0):"a0"); /* a */ ++ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA1):"a0"); /* b */ ++ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA2):"a0"); /* c */ ++ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA3):"a0"); /* d */ ++ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_LDR+MCFCAU_CA4):"a0"); /* e */ ++ ++ /* (d) */ ++ asm("moveq.l #5, %%d0":::"d0"); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_MVRA+MCFCAU_CA0)); ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); /*S^5(A)*/ ++ ++ tmp_p=(u32*)K; ++ asm("move.l %0, %%a0"::"m"(tmp_p):"a0"); ++ asm("move.l %0, %%a1"::"m"(W):"a1"); ++ ++ for (i = 0; i < 20; i++) { ++ /* t = f1(b, c, d) + K1 + rol32(a, 5) + e + W[i]; */ ++ /* e = d; d = c; c = rol32(b, 30); b = a; a = t; */ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFC)); /*f(b,c,d)*/ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA4)); /*+e*/ ++ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA)); /*+K*/ ++ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a1"); /*+W*/ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_SHS)); ++ } ++ ++ asm("add.l #4,%%a0" :::"a0"); /* update K */ ++ ++ for (; i < 40; i ++) { ++ /* t = f2(b, c, d) + K2 + rol32(a, 5) + e + W[i]; */ ++ /* e = d; d = c; c = rol32(b, 30); b = a; a = t; */ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFH)); /*f(b,c,d)*/ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA4)); /*+e*/ ++ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA)); /*+K*/ ++ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a1"); /*+W*/ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_SHS)); ++ } ++ ++ asm("add.l #4,%%a0" :::"a0"); /* update K */ ++ ++ for (; i < 60; i ++) { ++ /* t = f3(b, c, d) + K3 + rol32(a, 5) + e + W[i]; */ ++ /* e = d; d = c; c = rol32(b, 30); b = a; a = t; */ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFM)); /*f(b,c,d)*/ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA4)); /*+e*/ ++ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA)); /*+K*/ ++ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a1"); /*+W*/ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_SHS)); ++ } ++ ++ asm("add.l #4,%%a0" :::"a0"); /* update K */ ++ ++ for (; i < 80; i ++) { ++ /* t = f2(b, c, d) + K4 + rol32(a, 5) + e + W[i]; */ ++ /* e = d; d = c; c = rol32(b, 30); b = a; a = t; */ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_HASH+MCFCAU_HFH)); /*f(b,c,d)*/ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_ADRA+MCFCAU_CA4)); /*+e*/ ++ asm("cp0ld.l (%%a0),%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA)); /*+K*/ ++ asm("cp0ld.l (%%a1)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a1"); /*+W*/ ++ asm("cp0ld.l %%d0,%%d0,#1,%0" ::"n"(MCFCAU_SHS)); ++ } ++ ++ /* (e) */ ++ asm("move.l %0, %%a0"::"m"(digest):"a0"); ++ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CA0):"a0"); /* +a */ ++ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CA1):"a0"); /* +b */ ++ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CA2):"a0"); /* +c */ ++ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CA3):"a0"); /* +d */ ++ asm("cp0ld.l (%%a0)+,%%d0,#1,%0" ::"n"(MCFCAU_ADR+MCFCAU_CA4):"a0"); /* +e */ ++ ++ asm("cp0st.l %%d0,-(%%a0),#1,%0" ::"n"(MCFCAU_STR+MCFCAU_CA4):"a0"); ++ asm("cp0st.l %%d0,-(%%a0),#1,%0" ::"n"(MCFCAU_STR+MCFCAU_CA3):"a0"); ++ asm("cp0st.l %%d0,-(%%a0),#1,%0" ::"n"(MCFCAU_STR+MCFCAU_CA2):"a0"); ++ asm("cp0st.l %%d0,-(%%a0),#1,%0" ::"n"(MCFCAU_STR+MCFCAU_CA1):"a0"); ++ asm("cp0st.l %%d0,-(%%a0),#1,%0" ::"n"(MCFCAU_STR+MCFCAU_CA0):"a0"); ++ spin_unlock_irqrestore(&mcfcau_lock, iflags); ++} ++ ++static void mcfcau_sha1_init(struct crypto_tfm *tfm) ++{ ++ struct mcfcau_sha1_ctx *sctx = crypto_tfm_ctx(tfm); ++ static const struct mcfcau_sha1_ctx initstate = { ++ 0, ++ { 0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0 }, ++ { 0, } ++ }; ++ ++ *sctx = initstate; ++} ++ ++static void mcfcau_sha1_update(struct crypto_tfm *tfm, const u8 *data, ++ unsigned int len) ++{ ++ struct mcfcau_sha1_ctx *sctx = crypto_tfm_ctx(tfm); ++ unsigned int partial, done; ++ const u8 *src; ++ ++ partial = sctx->count & 0x3f; ++ sctx->count += len; ++ done = 0; ++ src = data; ++ ++ if ((partial + len) > 63) { ++ u32 temp[MCFCAU_SHA1_WORKSPACE_WORDS]; ++ ++ if (partial) { ++ done = -partial; ++ memcpy(sctx->buffer + partial, data, done + 64); ++ src = sctx->buffer; ++ } ++ ++ do { ++ mcfcau_sha1_transform(sctx->state, src, temp); ++ done += 64; ++ src = data + done; ++ } while (done + 63 < len); ++ ++ memset(temp, 0, sizeof(temp)); ++ partial = 0; ++ } ++ memcpy(sctx->buffer + partial, src, len - done); ++} ++ ++ ++/* Add padding and return the message digest. */ ++static void mcfcau_sha1_final(struct crypto_tfm *tfm, u8 *out) ++{ ++ struct mcfcau_sha1_ctx *sctx = crypto_tfm_ctx(tfm); ++ u32 *dst = (u32 *)out; ++ u32 i, index, padlen; ++ u64 bits; ++ static const u8 padding[64] = { 0x80, }; ++ ++ bits = sctx->count << 3; ++ ++ /* Pad out to 56 mod 64 */ ++ index = sctx->count & 0x3f; ++ padlen = (index < 56) ? (56 - index) : ((64+56) - index); ++ mcfcau_sha1_update(tfm, padding, padlen); ++ ++ /* Append length */ ++ mcfcau_sha1_update(tfm, (const u8 *)&bits, sizeof(bits)); ++ ++ /* Store state in digest */ ++ for (i = 0; i < 5; i++) ++ dst[i] = sctx->state[i]; ++ ++ ++ /* Wipe context */ ++ memset(sctx, 0, sizeof *sctx); ++} ++ ++static struct crypto_alg mcfcau_sha1_alg = { ++ .cra_name = "sha1", ++ .cra_driver_name= "sha1-mcfcau", ++ .cra_priority = MCFCAU_CRA_PRIORITY, ++ .cra_flags = CRYPTO_ALG_TYPE_DIGEST, ++ .cra_blocksize = MCFCAU_SHA1_HMAC_BLOCK_SIZE, ++ .cra_ctxsize = sizeof(struct mcfcau_sha1_ctx), ++ .cra_module = THIS_MODULE, ++ .cra_alignmask = 3, ++ .cra_list = LIST_HEAD_INIT(mcfcau_sha1_alg.cra_list), ++ .cra_u = { .digest = { ++ .dia_digestsize = MCFCAU_SHA1_DIGEST_SIZE, ++ .dia_init = mcfcau_sha1_init, ++ .dia_update = mcfcau_sha1_update, ++ .dia_final = mcfcau_sha1_final } } ++}; ++ ++static int __init init(void) ++{ ++ int ret = crypto_register_alg(&mcfcau_sha1_alg); ++ printk(KERN_INFO MCFCAU_SHA1_DRIVER_DESC " " ++ MCFCAU_SHA1_DRIVER_VERSION " %s.\n",ret?"failed":"registered"); ++ return ret; ++} ++ ++static void __exit fini(void) ++{ ++ crypto_unregister_alg(&mcfcau_sha1_alg); ++ printk(KERN_INFO MCFCAU_SHA1_DRIVER_DESC " " ++ MCFCAU_SHA1_DRIVER_VERSION " unregistered.\n"); ++} ++ ++module_init(init); ++module_exit(fini); ++ ++MODULE_LICENSE("GPL"); ++MODULE_DESCRIPTION(MCFCAU_SHA1_DRIVER_DESC); ++MODULE_AUTHOR("Andrey Butok"); +--- /dev/null ++++ b/drivers/crypto/mcfcau.c +@@ -0,0 +1,32 @@ ++/*************************************************************************** ++ * mcfcau.c - Implementation of DES & Triple DES EDE Cipher Algorithms ++ * for Freescale ColdFire Cryptographic Acceleration Unit (CAU). ++ * ++ * Author: Andrey Butok ++ * Copyright Freescale Semiconductor Inc. 2007 ++ * ++ * NOTE: You can find the ColdFire CAU module on MCF54455 and MCF52235. ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ++ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software Foundation, ++ * Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ * ++ *************************************************************************** ++ * Changes: ++ * v0.01 28 September 2006 Andrey Butok ++ * Initial Release - developed on 2.6.20 Linux kernel. ++ */ ++#include <linux/module.h> ++ ++DEFINE_SPINLOCK(mcfcau_lock); ++EXPORT_SYMBOL(mcfcau_lock); +--- /dev/null ++++ b/drivers/crypto/mcfcau.h +@@ -0,0 +1,98 @@ ++/*************************************************************************** ++ * mcfcau.h - Common header file for Freescale ColdFire ++ * Cryptographic Acceleration Unit (CAU) drivers. ++ * ++ * Author: Andrey Butok ++ * Copyright Freescale Semiconductor Inc. 2007 ++ * ++ * NOTE: You can find the ColdFire CAU module on MCF54455 and MCF52235. ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ++ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software Foundation, ++ * Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ * ++ *************************************************************************** ++ * Changes: ++ * v0.01 14 August 2007 Andrey Butok ++ */ ++ ++#ifndef MCFCAU_H ++#define MCFCAU_H ++ ++#include <linux/spinlock.h> ++ ++/* CAU Registers (CAx) */ ++#define MCFCAU_CASR (0x0) ++#define MCFCAU_CAA (0x1) ++#define MCFCAU_CA0 (0x2) ++#define MCFCAU_CA1 (0x3) ++#define MCFCAU_CA2 (0x4) ++#define MCFCAU_CA3 (0x5) ++#define MCFCAU_CA4 (0x6) ++#define MCFCAU_CA5 (0x7) ++ ++ /* CAU Commands */ ++#define MCFCAU_CNOP (0x000) ++#define MCFCAU_LDR (0x010) ++#define MCFCAU_STR (0x020) ++#define MCFCAU_ADR (0x030) ++#define MCFCAU_RADR (0x040) ++#define MCFCAU_ADRA (0x050) ++#define MCFCAU_XOR (0x060) ++#define MCFCAU_ROTL (0x070) ++#define MCFCAU_MVRA (0x080) ++#define MCFCAU_MVAR (0x090) ++#define MCFCAU_AESS (0x0A0) ++#define MCFCAU_AESIS (0x0B0) ++#define MCFCAU_AESC (0x0C0) ++#define MCFCAU_AESIC (0x0D0) ++#define MCFCAU_AESR (0x0E0) ++#define MCFCAU_AESIR (0x0F0) ++#define MCFCAU_DESR (0x100) ++#define MCFCAU_DESK (0x110) ++#define MCFCAU_HASH (0x120) ++#define MCFCAU_SHS (0x130) ++#define MCFCAU_MDS (0x140) ++#define MCFCAU_ILL (0x1F0) ++ ++/* DESR Fields */ ++#define MCFCAU_IP (0x08) /* initial permutation */ ++#define MCFCAU_FP (0x04) /* final permutation */ ++#define MCFCAU_KSL1 (0x00) /* key schedule left 1 bit */ ++#define MCFCAU_KSL2 (0x01) /* key schedule left 2 bits */ ++#define MCFCAU_KSR1 (0x02) /* key schedule right 1 bit */ ++#define MCFCAU_KSR2 (0x03) /* key schedule right 2 bits */ ++ ++/* DESK Field */ ++#define MCFCAU_DC (0x01) /* decrypt key schedule */ ++#define MCFCAU_CP (0x02) /* check parity */ ++ ++/* HASH Functions Codes */ ++#define MCFCAU_HFF (0x0) /* MD5 F() CA1&CA2 | ~CA1&CA3 */ ++#define MCFCAU_HFG (0x1) /* MD5 G() CA1&CA3 | CA2&~CA3 */ ++#define MCFCAU_HFH (0x2) /* MD5 H(), SHA Parity() CA1^CA2^CA3 */ ++#define MCFCAU_HFI (0x3) /* MD5 I() CA2^(CA1|~CA3) */ ++#define MCFCAU_HFC (0x4) /* SHA Ch() CA1&CA2 ^ ~CA1&CA3 */ ++#define MCFCAU_HFM (0x5) /* SHA Maj() CA1&CA2 ^ CA1&CA3 ^ CA2&CA3 */ ++ ++#define MCFCAU_CRA_PRIORITY (300) ++ ++extern spinlock_t mcfcau_lock; ++ ++#ifdef DEBUG ++#define DBG(fmt, args...) printk( "[%s] " fmt , __FUNCTION__, ## args) ++#else ++#define DBG(fmt, args...) do{}while(0) ++#endif ++ ++#endif diff --git a/target/linux/coldfire/patches/016-m5445x_usb_initial_port.patch b/target/linux/coldfire/patches/016-m5445x_usb_initial_port.patch new file mode 100644 index 0000000000..4321794413 --- /dev/null +++ b/target/linux/coldfire/patches/016-m5445x_usb_initial_port.patch @@ -0,0 +1,7360 @@ +From 6694c72448723499ce8a8603b4830bbd9d2fa0df Mon Sep 17 00:00:00 2001 +From: Bruce Schmid <duck@freescale.com> +Date: Tue, 20 Nov 2007 11:06:14 -0700 +Subject: [PATCH] USB: initial port + +LTIBName: m5445x-usb-initial-port +Signed-off-by: Duck <duck@freescale.com> +--- + arch/m68k/coldfire/usb.c | 182 +++ + arch/m68k/coldfire/usb/Makefile | 28 + + arch/m68k/coldfire/usb/otg_cmn.c | 106 ++ + arch/m68k/coldfire/usb/otg_device.c | 89 ++ + arch/m68k/coldfire/usb/otg_host.c | 68 + + arch/m68k/coldfire/usb/otg_otg.c | 96 ++ + arch/m68k/coldfire/usb/xcvr.c | 156 ++ + drivers/usb/Kconfig | 1 + + drivers/usb/Makefile | 2 + + drivers/usb/core/usb.c | 2 +- + drivers/usb/gadget/Kconfig | 43 +- + drivers/usb/gadget/Makefile | 1 + + drivers/usb/gadget/ether.c | 3 + + drivers/usb/gadget/fsl_usb2_udc.h | 194 +--- + drivers/usb/gadget/gadget_chips.h | 7 + + drivers/usb/gadget/mcf5445x_udc.c | 2758 +++++++++++++++++++++++++++++++++++ + drivers/usb/host/Kconfig | 21 +- + drivers/usb/host/ehci-arc.c | 431 ++++++ + drivers/usb/host/ehci-fsl.h | 28 +- + drivers/usb/host/ehci-hcd.c | 5 + + drivers/usb/host/ehci-mem.c | 9 +- + drivers/usb/host/ehci.h | 22 + + drivers/usb/otg/Makefile | 5 + + drivers/usb/otg/fsl_otg.c | 1515 +++++++++++++++++++ + drivers/usb/otg/fsl_otg.h | 139 ++ + drivers/usb/otg/otg_fsm.c | 381 +++++ + drivers/usb/otg/otg_fsm.h | 170 +++ + include/asm-m68k/mcf5445x_usb.h | 3 +- + include/linux/fsl_devices.h | 42 +- + include/linux/usb/fsl_usb2.h | 464 ++++++ + include/linux/usb/fsl_xcvr.h | 42 + + 31 files changed, 6809 insertions(+), 204 deletions(-) + create mode 100644 arch/m68k/coldfire/usb.c + create mode 100644 arch/m68k/coldfire/usb/Makefile + create mode 100644 arch/m68k/coldfire/usb/otg_cmn.c + create mode 100644 arch/m68k/coldfire/usb/otg_device.c + create mode 100644 arch/m68k/coldfire/usb/otg_host.c + create mode 100644 arch/m68k/coldfire/usb/otg_otg.c + create mode 100644 arch/m68k/coldfire/usb/xcvr.c + create mode 100644 drivers/usb/gadget/mcf5445x_udc.c + create mode 100644 drivers/usb/host/ehci-arc.c + create mode 100644 drivers/usb/otg/Makefile + create mode 100644 drivers/usb/otg/fsl_otg.c + create mode 100644 drivers/usb/otg/fsl_otg.h + create mode 100644 drivers/usb/otg/otg_fsm.c + create mode 100644 drivers/usb/otg/otg_fsm.h + create mode 100644 include/linux/usb/fsl_usb2.h + create mode 100644 include/linux/usb/fsl_xcvr.h + +--- /dev/null ++++ b/arch/m68k/coldfire/usb.c +@@ -0,0 +1,182 @@ ++/* ++ * ++ * Copyright 2004-2007 Freescale Semiconductor, Inc. All Rights Reserved. ++ * ++ * otg_{get,set}_transceiver() are from arm/plat-omap/usb.c. ++ * which is Copyright (C) 2004 Texas Instruments, Inc. ++ */ ++ ++/* ++ * The code contained herein is licensed under the GNU General Public ++ * License. You may obtain a copy of the GNU General Public License ++ * Version 2 or later at the following locations: ++ * ++ * http://www.opensource.org/licenses/gpl-license.html ++ * http://www.gnu.org/copyleft/gpl.html ++ */ ++ ++#include <linux/module.h> ++#include <linux/kernel.h> ++#include <linux/types.h> ++#include <linux/errno.h> ++#include <linux/init.h> ++#include <linux/io.h> ++#include <linux/err.h> ++#include <linux/platform_device.h> ++#include <linux/usb/otg.h> ++#include <linux/delay.h> ++#include <linux/fsl_devices.h> ++#include <linux/usb/fsl_xcvr.h> ++ ++ ++/* The dmamask must be set for EHCI to work */ ++static u64 ehci_dmamask = ~(u32) 0; ++ ++struct fsl_xcvr_ops *xc_ops[3] = { NULL }; ++ ++void fsl_usb_enable_clk(void) ++{ ++} ++EXPORT_SYMBOL(fsl_usb_enable_clk); ++ ++void fsl_usb_disable_clk(void) ++{ ++} ++EXPORT_SYMBOL(fsl_usb_disable_clk); ++ ++void fsl_usb_xcvr_register(struct fsl_xcvr_ops *xcvr_ops) ++{ ++ pr_debug("%s ctrlr=%d\n", __FUNCTION__, xcvr_ops->ctrlr); ++ xc_ops[xcvr_ops->ctrlr] = xcvr_ops; ++ ++} ++EXPORT_SYMBOL(fsl_usb_xcvr_register); ++ ++void fsl_usb_xcvr_unregister(enum fsl_usb_ctrlr ctrlr) ++{ ++ pr_debug("%s ctrlr=%d\n", __FUNCTION__, ctrlr); ++ xc_ops[ctrlr] = NULL; ++} ++EXPORT_SYMBOL(fsl_usb_xcvr_unregister); ++ ++/*! ++ * Register an instance of a USB host platform device. ++ * ++ * @param res: resource pointer ++ * @param n_res: number of resources ++ * @param config: config pointer ++ * ++ * @return newly-registered platform_device ++ * ++ * DDD fix this comment: ++ * The USB controller supports 3 host interfaces, and the ++ * kernel can be configured to support some number of them. ++ * Each supported host interface is registered as an instance ++ * of the "fsl-ehci" device. Call this function multiple times ++ * to register each host interface. ++ */ ++static int instance_id; ++struct platform_device *host_pdev_register(struct resource *res, int n_res, ++ struct fsl_usb2_platform_data *config) ++{ ++ struct platform_device *pdev; ++ ++ pr_debug("register host res=0x%p, size=%d\n", res, n_res); ++ ++ pdev = platform_device_register_simple("fsl-ehci", ++ instance_id, res, n_res); ++ if (IS_ERR(pdev)) { ++ printk(KERN_ERR "usb: can't register %s Host, %ld\n", ++ config->name, PTR_ERR(pdev)); ++ return NULL; ++ } ++ ++ pdev->dev.coherent_dma_mask = 0xffffffff; ++ pdev->dev.dma_mask = &ehci_dmamask; ++ ++ /* ++ * platform_device_add_data() makes a copy of ++ * the platform_data passed in. That makes it ++ * impossible to share the same config struct for ++ * all OTG devices (host,gadget,otg). So, just ++ * set the platform_data pointer ourselves. ++ */ ++ pdev->dev.platform_data = config; ++ ++ printk(KERN_INFO "usb: %s Host registered\n", config->name); ++ pr_debug("pdev=0x%p dev=0x%p resources=0x%p pdata=0x%p\n", ++ pdev, &pdev->dev, pdev->resource, pdev->dev.platform_data); ++ ++ instance_id++; ++ ++ return pdev; ++} ++ ++ ++int fsl_usb_mem_init(struct platform_device *pdev) ++{ ++ struct resource *res; ++ struct fsl_usb2_platform_data *pdata; ++ ++ pdata = (struct fsl_usb2_platform_data *)pdev->dev.platform_data; ++ ++ pr_debug("%s: pdev=0x%p pdata=0x%p\n", __FUNCTION__, pdev, pdata); ++ ++ res = platform_get_resource(pdev, IORESOURCE_MEM, 0); ++ if (!res) { ++ dev_err(&pdev->dev, "no MEM resource.\n"); ++ return -ENODEV; ++ } ++ ++ pdata->r_start = res->start; ++ pdata->r_len = res->end - res->start + 1; ++ pr_debug("%s: MEM resource start=0x%x len=0x%x\n", pdata->name, ++ res->start, pdata->r_len); ++ ++ if (!request_mem_region(pdata->r_start, pdata->r_len, "OTG")) { ++ dev_err(&pdev->dev, "request_mem_region failed\n"); ++ return -EBUSY; ++ } ++ pdata->regs = ioremap(pdata->r_start, pdata->r_len); ++ pr_debug("ioremapped to 0x%p\n", pdata->regs); ++ ++ if (pdata->regs == NULL) { ++ dev_err(&pdev->dev, "ioremap failed\n"); ++ release_mem_region(pdata->r_start, pdata->r_len); ++ return -EFAULT; ++ } ++ ++ pr_debug("%s: success\n", __FUNCTION__); ++ return 0; ++} ++ ++ ++#if defined(CONFIG_USB_OTG) ++static struct otg_transceiver *xceiv; ++ ++/** ++ * otg_get_transceiver - find the (single) OTG transceiver driver ++ * ++ * Returns the transceiver driver, after getting a refcount to it; or ++ * null if there is no such transceiver. The caller is responsible for ++ * releasing that count. ++ */ ++struct otg_transceiver *otg_get_transceiver(void) ++{ ++ pr_debug("%s xceiv=0x%p\n", __FUNCTION__, xceiv); ++ if (xceiv) ++ get_device(xceiv->dev); ++ return xceiv; ++} ++EXPORT_SYMBOL(otg_get_transceiver); ++ ++int otg_set_transceiver(struct otg_transceiver *x) ++{ ++ pr_debug("%s xceiv=0x%p x=0x%p\n", __FUNCTION__, xceiv, x); ++ if (xceiv && x) ++ return -EBUSY; ++ xceiv = x; ++ return 0; ++} ++EXPORT_SYMBOL(otg_set_transceiver); ++#endif +--- /dev/null ++++ b/arch/m68k/coldfire/usb/Makefile +@@ -0,0 +1,28 @@ ++# ++# Makefile for the linux kernel. ++# ++ ++# Object file lists. ++ ++ifneq ($(CONFIG_USB_EHCI_HCD),) ++ obj-y += otg_host.o ++endif ++ ++ifneq ($(CONFIG_USB_GADGET_MCF5445X),) ++ obj-y += otg_device.o ++endif ++ ++ifneq ($(strip $(CONFIG_USB_GADGET_MCF5445X) $(CONFIG_USB_EHCI_HCD)),) ++ obj-y += otg_cmn.o ++endif ++ ++ifneq ($(CONFIG_USB_OTG),) ++ obj-y += otg_otg.o ++endif ++ ++ ++# USB Transceiver driver: ++ifneq ($(strip $(CONFIG_USB) $(CONFIG_USB_GADGET_MCF5445X)),) ++ obj-y += xcvr.o ++endif ++ +--- /dev/null ++++ b/arch/m68k/coldfire/usb/otg_cmn.c +@@ -0,0 +1,106 @@ ++/* ++ * Copyright 2004-2007 Freescale Semiconductor, Inc. All Rights Reserved. ++ */ ++ ++/* ++ * The code contained herein is licensed under the GNU General Public ++ * License. You may obtain a copy of the GNU General Public License ++ * Version 2 or later at the following locations: ++ * ++ * http://www.opensource.org/licenses/gpl-license.html ++ * http://www.gnu.org/copyleft/gpl.html ++ */ ++ ++#include <linux/module.h> ++#include <linux/kernel.h> ++#include <linux/types.h> ++#include <linux/err.h> ++#include <linux/errno.h> ++#include <linux/init.h> ++#include <linux/io.h> ++#include <linux/irq.h> ++#include <linux/platform_device.h> ++#include <linux/delay.h> ++#include <linux/fsl_devices.h> ++#include <linux/usb/fsl_xcvr.h> ++ ++#include <asm/system.h> ++#include <asm/coldfire.h> ++ ++extern void fsl_usb_enable_clk(void); ++extern void fsl_usb_disable_clk(void); ++extern int fsl_usb_mem_init(struct platform_device *pdev); ++ ++extern struct fsl_xcvr_ops *xc_ops[]; ++ ++static int otg_used; ++ ++int usbotg_init(struct platform_device *pdev) ++{ ++ struct fsl_usb2_platform_data *pdata; ++ struct fsl_xcvr_ops *xops = xc_ops[USB_CTRLR_OTG]; ++ int rc; ++ ++ pdata = (struct fsl_usb2_platform_data *)pdev->dev.platform_data; ++ ++ pr_debug("%s: pdev=0x%p pdata=0x%p\n", __FUNCTION__, pdev, pdata); ++ ++ if (!xops) { ++ printk(KERN_ERR "OTG transceiver ops missing\n"); ++ return -EINVAL; ++ } ++ pdata->xcvr_ops = xops; ++ pdata->xcvr_type = xops->xcvr_type; ++ ++ if (!otg_used) { ++ /* request_mem_region and ioremap registers */ ++ rc = fsl_usb_mem_init(pdev); ++ if (rc) ++ return rc; ++ ++ fsl_usb_enable_clk(); ++ ++ if (xops->init) ++ xops->init(pdev); ++ } ++ ++ otg_used++; ++ pr_debug("%s: success\n", __FUNCTION__); ++ return 0; ++} ++ ++void usbotg_uninit(struct platform_device *pdev) ++{ ++ struct fsl_usb2_platform_data *pdata; ++ pdata = (struct fsl_usb2_platform_data *)pdev->dev.platform_data; ++ ++ pr_debug("%s\n", __FUNCTION__); ++ ++ otg_used--; ++ if (!otg_used) { ++ if (pdata->xcvr_ops && pdata->xcvr_ops->uninit) ++ pdata->xcvr_ops->uninit(pdev); ++ ++ iounmap(pdata->regs); ++ release_mem_region(pdata->r_start, pdata->r_len); ++ ++ pdata->regs = NULL; ++ pdata->r_start = pdata->r_len = 0; ++ ++ fsl_usb_disable_clk(); ++ } ++} ++ ++struct fsl_usb2_platform_data mxc_otg_config = { ++ .name = "OTG", ++ .platform_init = usbotg_init, ++ .platform_uninit = usbotg_uninit, ++ .es = 1, ++ .big_endian_mmio = 1, ++ .big_endian_desc = 1, ++ .le_setup_buf = 1, ++ .does_otg = 1, ++ .power_budget = 500, /* 500 mA max power */ ++ .max_ep_nr = 4, /* DDD read from a register ? */ ++ .phy_mode = FSL_USB2_PHY_ULPI, /* DDD redundant with xcvr_type */ ++}; +--- /dev/null ++++ b/arch/m68k/coldfire/usb/otg_device.c +@@ -0,0 +1,89 @@ ++/* ++ * Copyright 2004-2007 Freescale Semiconductor, Inc. All Rights Reserved. ++ */ ++ ++/* ++ * The code contained herein is licensed under the GNU General Public ++ * License. You may obtain a copy of the GNU General Public License ++ * Version 2 or later at the following locations: ++ * ++ * http://www.opensource.org/licenses/gpl-license.html ++ * http://www.gnu.org/copyleft/gpl.html ++ */ ++ ++#include <linux/module.h> ++#include <linux/kernel.h> ++#include <linux/types.h> ++#include <linux/errno.h> ++#include <linux/init.h> ++#include <linux/io.h> ++#include <linux/irq.h> ++#include <linux/err.h> ++#include <linux/platform_device.h> ++#include <linux/usb/otg.h> ++#include <linux/delay.h> ++#include <linux/fsl_devices.h> ++#include <linux/usb/fsl_xcvr.h> ++ ++#include <asm/system.h> ++#include <asm/coldfire.h> ++ ++#define USB_OTGREGS_BASE MCF_REG32(0xFC0B0000) ++#define INT_USB (64 + 64 + 47) /* INTC1:47 16.2.9.1 */ ++#define INT_UOCSR (64 + 64 + 53) /* INTC1:53 16.2.9.1 */ ++ ++extern int usbotg_init(struct platform_device *pdev); ++extern void usbotg_uninit(struct fsl_usb2_platform_data *pdata); ++extern struct fsl_usb2_platform_data mxc_otg_config; ++ ++struct platform_device otg_udc_device; ++ ++/*! ++ * OTG Gadget device ++ */ ++ ++static void usb_release(struct device *dev) ++{ ++ /* normally not freed */ ++} ++ ++static u64 udc_dmamask = ~(u32) 0; ++static struct resource otg_udc_resources[] = { ++ [0] = { ++ .start = (u32) (&USB_OTGREGS_BASE), ++ .end = (u32) (&USB_OTGREGS_BASE + 0x1ff), ++ .flags = IORESOURCE_MEM, ++ }, ++ [1] = { ++ .start = INT_USB, ++ .flags = IORESOURCE_IRQ, ++ }, ++}; ++ ++ ++struct platform_device otg_udc_device = { ++ .name = "fsl-usb2-udc", ++ .id = -1, ++ .dev = { ++ .release = usb_release, ++ .dma_mask = &udc_dmamask, ++ .coherent_dma_mask = 0xffffffff, ++ .platform_data = &mxc_otg_config, ++ }, ++ .resource = otg_udc_resources, ++ .num_resources = ARRAY_SIZE(otg_udc_resources), ++}; ++ ++static int __init udc_init(void) ++{ ++ int rc __attribute((unused)); ++ ++ rc = platform_device_register(&otg_udc_device); ++ if (rc) ++ printk(KERN_ERR "usb: can't register OTG Gadget, rc=%d\n", rc); ++ else ++ printk(KERN_INFO "usb: OTG Gadget registered\n"); ++ return rc; ++} ++ ++subsys_initcall(udc_init); +--- /dev/null ++++ b/arch/m68k/coldfire/usb/otg_host.c +@@ -0,0 +1,68 @@ ++/* ++ * Copyright 2004-2007 Freescale Semiconductor, Inc. All Rights Reserved. ++ */ ++ ++/* ++ * The code contained herein is licensed under the GNU General Public ++ * License. You may obtain a copy of the GNU General Public License ++ * Version 2 or later at the following locations: ++ * ++ * http://www.opensource.org/licenses/gpl-license.html ++ * http://www.gnu.org/copyleft/gpl.html ++ */ ++ ++#include <linux/module.h> ++#include <linux/kernel.h> ++#include <linux/types.h> ++#include <linux/errno.h> ++#include <linux/init.h> ++#include <linux/io.h> ++#include <linux/irq.h> ++#include <linux/err.h> ++#include <linux/platform_device.h> ++#include <linux/delay.h> ++#include <linux/fsl_devices.h> ++#include <linux/usb/fsl_xcvr.h> ++ ++#include <asm/system.h> ++#include <asm/mcfsim.h> ++ ++#define USB_OTGREGS_BASE MCF_REG32(0xFC0B0000) ++#define INT_USB (64 + 64 + 47) /* INTC1:47 16.2.9.1 */ ++#define INT_UOCSR (64 + 64 + 53) /* INTC1:53 16.2.9.1 */ ++ ++struct platform_device *otg_host_device; ++ ++extern struct platform_device *host_pdev_register(struct resource *res, ++ int n_res, ++ struct fsl_usb2_platform_data ++ *config); ++ ++extern int usbotg_init(struct platform_device *pdev); ++extern void usbotg_uninit(struct fsl_usb2_platform_data *pdata); ++extern struct fsl_usb2_platform_data mxc_otg_config; ++ ++/*! ++ * OTG host config ++ */ ++static struct resource otg_host_resources[] = { ++ [0] = { ++ .start = (u32) (&USB_OTGREGS_BASE), ++ .end = (u32) (&USB_OTGREGS_BASE + 0x1ff), ++ .flags = IORESOURCE_MEM, ++ }, ++ [1] = { ++ .start = INT_USB, ++ .flags = IORESOURCE_IRQ, ++ }, ++}; ++ ++static int __init otg_host_init(void) ++{ ++ otg_host_device = host_pdev_register(otg_host_resources, ++ ARRAY_SIZE(otg_host_resources), ++ &mxc_otg_config); ++ return 0; ++} ++ ++subsys_initcall(otg_host_init); +--- /dev/null ++++ b/arch/m68k/coldfire/usb/otg_otg.c +@@ -0,0 +1,96 @@ ++/* ++ * Copyright 2005-2007 Freescale Semiconductor, Inc. All Rights Reserved. ++ */ ++ ++/* ++ * The code contained herein is licensed under the GNU General Public ++ * License. You may obtain a copy of the GNU General Public License ++ * Version 2 or later at the following locations: ++ * ++ * http://www.opensource.org/licenses/gpl-license.html ++ * http://www.gnu.org/copyleft/gpl.html ++ */ ++ ++/* ++ * platform_device registration for ULPI OTG device ++ */ ++ ++#include <linux/module.h> ++#include <linux/kernel.h> ++#include <linux/types.h> ++#include <linux/errno.h> ++#include <linux/init.h> ++#include <linux/err.h> ++#include <linux/platform_device.h> ++#include <linux/fsl_devices.h> ++ ++#include <asm/mcfsim.h> ++ ++#define USB_OTGREGS_BASE MCF_REG32(0xFC0B0000) ++#define INT_USB (64 + 64 + 47) /* INTC1:47 16.2.9.1 */ ++#define INT_UOCSR (64 + 64 + 53) /* INTC1:53 16.2.9.1 */ ++ ++extern int usbotg_init(struct platform_device *pdev); ++extern void usbotg_uninit(struct fsl_usb2_platform_data *pdata); ++extern struct fsl_usb2_platform_data mxc_otg_config; ++ ++static void otg_otg_release(struct device *dev) ++{ ++ /* normally not freed */ ++} ++ ++/* *INDENT-OFF* */ ++static struct resource otg_otg_resources[] = { ++ [0] = { ++ .start = (u32) (&USB_OTGREGS_BASE), ++ .end = (u32) (&USB_OTGREGS_BASE + 0x1ff), ++ .flags = IORESOURCE_MEM, ++ }, ++ [1] = { ++ .start = INT_USB, ++ .flags = IORESOURCE_IRQ, ++ }, ++}; ++ ++/*! ++ * OTG device ++ */ ++static u64 otg_otg_dmamask = ~(u32) 0; ++static struct platform_device otg_otg_device = { ++ .name = "fsl-usb2-otg", ++ .id = -1, ++ .dev = { ++ .release = otg_otg_release, ++ .dma_mask = &otg_otg_dmamask, ++ .coherent_dma_mask = 0xffffffff, ++ .platform_data = &mxc_otg_config, ++ }, ++ .resource = otg_otg_resources, ++ .num_resources = ARRAY_SIZE(otg_otg_resources), ++}; ++/* *INDENT-ON* */ ++ ++static int __init mx31_otg_otg_init(void) ++{ ++ int rc = 0; ++ ++ pr_debug("register OTG otg res=0x%p, size=%d\n", ++ otg_otg_device.resource, otg_otg_device.num_resources); ++ ++ rc = platform_device_register(&otg_otg_device); ++ if (rc) { ++ pr_debug("can't register ULPI OTG dvc, %d\n", rc); ++ } else { ++ printk(KERN_INFO "usb: OTG ULPI transceiver registered\n"); ++ pr_debug("otg_otg_device=0x%p resources=0x%p.\n", ++ &otg_otg_device, otg_otg_device.resource); ++ } ++ ++ return rc; ++} ++ ++subsys_initcall(mx31_otg_otg_init); ++ ++MODULE_AUTHOR("Freescale Semiconductor, Inc."); ++MODULE_DESCRIPTION("ULPI OTG device registration"); ++MODULE_LICENSE("GPL"); +--- /dev/null ++++ b/arch/m68k/coldfire/usb/xcvr.c +@@ -0,0 +1,156 @@ ++/* ++ * Copyright 2005-2007 Freescale Semiconductor, Inc. All Rights Reserved. ++ */ ++ ++/* ++ * The code contained herein is licensed under the GNU General Public ++ * License. You may obtain a copy of the GNU General Public License ++ * Version 2 or later at the following locations: ++ * ++ * http://www.opensource.org/licenses/gpl-license.html ++ * http://www.gnu.org/copyleft/gpl.html ++ */ ++ ++#include <linux/module.h> ++#include <linux/kernel.h> ++#include <linux/types.h> ++#include <linux/errno.h> ++#include <linux/init.h> ++#include <linux/err.h> ++#include <linux/platform_device.h> ++#include <linux/delay.h> ++#include <linux/fsl_devices.h> ++#include <linux/usb/fsl_xcvr.h> ++#include <linux/usb/fsl_usb2.h> ++ ++#include <asm/mcfsim.h> ++ ++extern void fsl_usb_xcvr_register(struct fsl_xcvr_ops *xcvr_ops); ++extern void fsl_usb_xcvr_unregister(enum fsl_usb_ctrlr ctrlr); ++ ++#define MCF_SCM_BCR MCF_REG32(0xFC040024) ++#define MCF_SCM_BCR_GBR (1 << 9) /* global bursts for read */ ++#define MCF_SCM_BCR_GBW (1 << 8) /* global bursts for write */ ++#define MCF_SCM_BCR_SBE_ALL (0xff << 0) /* slave burst enable */ ++ ++ ++#ifdef ULPI_DEBUG ++void print_ulpi_regs(void) ++{ ++ pr_debug("MCF_SCM_BCR=0x%08lx MCF_CCM_MISCCR=0x%08x " ++ "MCF_GPIO_PAR_DMA=0x%08x MCF_GPIO_PAR_USB=08%08x " ++ "MCF_GPIO_PAR_FEC=08%08x\n", ++ MCF_SCM_BCR, MCF_CCM_MISCCR, MCF_GPIO_PAR_DMA, ++ MCF_GPIO_PAR_USB, MCF_GPIO_PAR_FEC); ++} ++EXPORT_SYMBOL(print_ulpi_regs); ++#endif ++ ++ ++static void xcvr_init(struct platform_device *pdev) ++{ ++ struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data; ++ struct fsl_xcvr_ops *this = pdata->xcvr_ops; ++ struct fsl_usb_host_regs *regs = pdata->regs; ++ ++ pr_debug("%s: ctrlr=%d pdata=0x%p regs=0x%p\n", __FUNCTION__, ++ this->ctrlr, pdata, pdata->regs); ++ ++ /* enable USB read, write and slave bursts */ ++ MCF_SCM_BCR = MCF_SCM_BCR_GBR | MCF_SCM_BCR_GBW | MCF_SCM_BCR_SBE_ALL; ++ ++ /* Use external clock source if PLL isn't a multiple of 60MHz */ ++ MCF_CCM_MISCCR &= ~MCF_CCM_MISCCR_USBSRC; ++ ++ /* Initialize the USB Clock: use USB input clock */ ++ MCF_GPIO_PAR_DMA = (MCF_GPIO_PAR_DMA & MCF_GPIO_PAR_DMA_DREQ1_MASK) | ++ MCF_GPIO_PAR_DMA_DREQ1_USB_CLKIN; ++ ++ switch (this->xcvr_type) { ++ case PORTSCX_PTS_ULPI: ++ /* Enable the required ULPI signals */ ++ MCF_GPIO_PAR_DMA = (MCF_GPIO_PAR_DMA & ++ MCF_GPIO_PAR_DMA_DACK1_MASK) | ++ MCF_GPIO_PAR_DMA_DACK1_ULPI_DIR; ++ ++ MCF_GPIO_PAR_USB = MCF_GPIO_PAR_USB_VBUSEN_ULPI_NXT | ++ MCF_GPIO_PAR_USB_VBUSOC_ULPI_STP; ++ ++ MCF_GPIO_PAR_FEC = (MCF_GPIO_PAR_FEC & ++ MCF_GPIO_PAR_FEC_FEC0_MASK) | ++ MCF_GPIO_PAR_FEC_FEC0_RMII_ULPI; ++ break; ++ case PORTSCX_PTS_ONCHIP: ++ /* Enable VBUS_EN and VBUS_OC signals */ ++ MCF_GPIO_PAR_USB = MCF_GPIO_PAR_USB_VBUSEN_VBUSEN | ++ MCF_GPIO_PAR_USB_VBUSOC_VBUSOC; ++ ++ /* Setup USB_VBUS_OC signal to be active-low */ ++ MCF_CCM_MISCCR |= MCF_CCM_MISCCR_USBOC; ++ ++ break; ++ } ++ ++ pr_debug("®s->portsc1=0x%p old portsc1=0x%x \n", ®s->portsc1, ++ regs->portsc1); ++ ++ regs->portsc1 &= ~PORTSCX_PTS_MASK; ++ regs->portsc1 |= this->xcvr_type; ++ ++ /* ++ * need to reset the controller here so that the ID pin ++ * is correctly detected. ++ */ ++ regs->usbcmd |= USB_CMD_CTRL_RESET; ++ ++ /* ++ * allow controller to reset, and leave time for ++ * the ULPI transceiver to reset too. ++ */ ++ mdelay(10); ++ ++ pr_debug("DDD %s: done. portsc1=0x%x\n", __FUNCTION__, regs->portsc1); ++} ++ ++static void xcvr_uninit(struct platform_device *pdev) ++{ ++ pr_debug("%s: pdev=0x%p\n", __FUNCTION__, pdev); ++} ++ ++ ++struct fsl_xcvr_ops xcvr_ops_otg = { ++ .ctrlr = USB_CTRLR_OTG, ++ .init = xcvr_init, ++ .uninit = xcvr_uninit, ++ ++#ifdef CONFIG_USB_M5445X_ULPI ++ .xcvr_type = PORTSCX_PTS_ULPI, ++#elif defined CONFIG_USB_M5445X_FSLS ++ .xcvr_type = PORTSCX_PTS_ONCHIP, ++#else ++#error "Invalid USB transceiver selection." ++#endif ++}; ++ ++static int __init usb_xcvr_init(void) ++{ ++ pr_debug("%s\n", __FUNCTION__); ++ ++ fsl_usb_xcvr_register(&xcvr_ops_otg); ++ ++ pr_debug("%s done\n", __FUNCTION__); ++ return 0; ++} ++ ++static void __exit usb_xcvr_exit(void) ++{ ++ fsl_usb_xcvr_unregister(USB_CTRLR_OTG); ++} ++ ++module_init(usb_xcvr_init); ++module_exit(usb_xcvr_exit); ++ ++MODULE_AUTHOR("Freescale Semiconductor, Inc."); ++MODULE_DESCRIPTION("External ULPI xcvr driver"); ++MODULE_LICENSE("GPL"); ++ +--- a/drivers/usb/Kconfig ++++ b/drivers/usb/Kconfig +@@ -55,6 +55,7 @@ config USB_ARCH_HAS_EHCI + default y if PPC_83xx + default y if SOC_AU1200 + default y if ARCH_IXP4XX ++ default y if M54455 + default PCI + + # ARM SA1111 chips have a non-PCI based "OHCI-compatible" USB host interface. +--- a/drivers/usb/Makefile ++++ b/drivers/usb/Makefile +@@ -32,3 +32,5 @@ obj-$(CONFIG_USB) += misc/ + + obj-$(CONFIG_USB_ATM) += atm/ + obj-$(CONFIG_USB_SPEEDTOUCH) += atm/ ++ ++obj-$(CONFIG_USB_OTG) += otg/ +--- a/drivers/usb/core/usb.c ++++ b/drivers/usb/core/usb.c +@@ -52,7 +52,7 @@ static int nousb; /* Disable USB when bu + struct workqueue_struct *ksuspend_usb_wq; + + #ifdef CONFIG_USB_SUSPEND +-static int usb_autosuspend_delay = 2; /* Default delay value, ++static int usb_autosuspend_delay = -1; /* Default delay value, + * in seconds */ + module_param_named(autosuspend, usb_autosuspend_delay, int, 0644); + MODULE_PARM_DESC(autosuspend, "default autosuspend delay"); +--- a/drivers/usb/gadget/Kconfig ++++ b/drivers/usb/gadget/Kconfig +@@ -231,6 +231,26 @@ config SUPERH_BUILT_IN_M66592 + However, this problem is improved if change a value of + NET_IP_ALIGN to 4. + ++config USB_GADGET_MCF5445X ++ boolean "MCF5445X USB Device Controller" ++ depends on M54455 && USB_M5445X_ULPI ++ select USB_GADGET_DUALSPEED ++ help ++ Freescale's MCF5445X processors include ++ an integrated device controller (as part of the OTG module). ++ It has four programmable, bidirectional endpoints, ++ including endpoint 0. ++ ++ Say "y" to link the driver statically, or "m" to build a ++ dynamically linked module called "mcf5445_udc" and force all ++ gadget drivers to also be dynamically linked. ++ ++config USB_MCF5445X ++ tristate ++ depends on USB_GADGET_MCF5445X ++ default USB_GADGET ++ select USB_GADGET_SELECTED ++ + config USB_GADGET_GOKU + boolean "Toshiba TC86C001 'Goku-S'" + depends on PCI +@@ -285,17 +305,6 @@ config USB_OMAP + default USB_GADGET + select USB_GADGET_SELECTED + +-config USB_OTG +- boolean "OTG Support" +- depends on USB_GADGET_OMAP && ARCH_OMAP_OTG && USB_OHCI_HCD +- help +- The most notable feature of USB OTG is support for a +- "Dual-Role" device, which can act as either a device +- or a host. The initial role choice can be changed +- later, when two dual-role devices talk to each other. +- +- Select this only if your OMAP board has a Mini-AB connector. +- + config USB_GADGET_S3C2410 + boolean "S3C2410 USB Device Controller" + depends on ARCH_S3C2410 +@@ -369,6 +378,18 @@ config USB_DUMMY_HCD + + endchoice + ++config USB_OTG ++ boolean "OTG Support" ++ depends on (USB_GADGET_OMAP && ARCH_OMAP_OTG && USB_OHCI_HCD) || \ ++ (USB_GADGET_MCF5445X && USB_M5445X_ULPI) ++ help ++ The most notable feature of USB OTG is support for a ++ "Dual-Role" device, which can act as either a device ++ or a host. The initial role choice can be changed ++ later, when two dual-role devices talk to each other. ++ ++ Select this only if your OMAP board has a Mini-AB connector. ++ + config USB_GADGET_DUALSPEED + bool + depends on USB_GADGET +--- a/drivers/usb/gadget/Makefile ++++ b/drivers/usb/gadget/Makefile +@@ -17,6 +17,7 @@ obj-$(CONFIG_USB_AT91) += at91_udc.o + obj-$(CONFIG_USB_ATMEL_USBA) += atmel_usba_udc.o + obj-$(CONFIG_USB_FSL_USB2) += fsl_usb2_udc.o + obj-$(CONFIG_USB_M66592) += m66592-udc.o ++obj-$(CONFIG_USB_MCF5445X) += mcf5445x_udc.o + + # + # USB gadget drivers +--- a/drivers/usb/gadget/ether.c ++++ b/drivers/usb/gadget/ether.c +@@ -287,6 +287,9 @@ MODULE_PARM_DESC(host_addr, "Host Ethern + #define DEV_CONFIG_CDC + #endif + ++#ifdef CONFIG_USB_GADGET_MCF5445X ++#define DEV_CONFIG_CDC ++#endif + + /*-------------------------------------------------------------------------*/ + +--- a/drivers/usb/gadget/fsl_usb2_udc.h ++++ b/drivers/usb/gadget/fsl_usb2_udc.h +@@ -83,16 +83,6 @@ struct usb_dr_host { + u32 endptctrl[6]; /* Endpoint Control Registers */ + }; + +- /* non-EHCI USB system interface registers (Big Endian) */ +-struct usb_sys_interface { +- u32 snoop1; +- u32 snoop2; +- u32 age_cnt_thresh; /* Age Count Threshold Register */ +- u32 pri_ctrl; /* Priority Control Register */ +- u32 si_ctrl; /* System Interface Control Register */ +- u8 res[236]; +- u32 control; /* General Purpose Control Register */ +-}; + + /* ep0 transfer state */ + #define WAIT_FOR_SETUP 0 +@@ -101,10 +91,6 @@ struct usb_sys_interface { + #define WAIT_FOR_OUT_STATUS 3 + #define DATA_STATE_RECV 4 + +-/* Device Controller Capability Parameter register */ +-#define DCCPARAMS_DC 0x00000080 +-#define DCCPARAMS_DEN_MASK 0x0000001f +- + /* Frame Index Register Bit Masks */ + #define USB_FRINDEX_MASKS 0x3fff + /* USB CMD Register Bit Masks */ +@@ -180,172 +166,6 @@ struct usb_sys_interface { + /* endpoint list address bit masks */ + #define USB_EP_LIST_ADDRESS_MASK 0xfffff800 + +-/* PORTSCX Register Bit Masks */ +-#define PORTSCX_CURRENT_CONNECT_STATUS 0x00000001 +-#define PORTSCX_CONNECT_STATUS_CHANGE 0x00000002 +-#define PORTSCX_PORT_ENABLE 0x00000004 +-#define PORTSCX_PORT_EN_DIS_CHANGE 0x00000008 +-#define PORTSCX_OVER_CURRENT_ACT 0x00000010 +-#define PORTSCX_OVER_CURRENT_CHG 0x00000020 +-#define PORTSCX_PORT_FORCE_RESUME 0x00000040 +-#define PORTSCX_PORT_SUSPEND 0x00000080 +-#define PORTSCX_PORT_RESET 0x00000100 +-#define PORTSCX_LINE_STATUS_BITS 0x00000C00 +-#define PORTSCX_PORT_POWER 0x00001000 +-#define PORTSCX_PORT_INDICTOR_CTRL 0x0000C000 +-#define PORTSCX_PORT_TEST_CTRL 0x000F0000 +-#define PORTSCX_WAKE_ON_CONNECT_EN 0x00100000 +-#define PORTSCX_WAKE_ON_CONNECT_DIS 0x00200000 +-#define PORTSCX_WAKE_ON_OVER_CURRENT 0x00400000 +-#define PORTSCX_PHY_LOW_POWER_SPD 0x00800000 +-#define PORTSCX_PORT_FORCE_FULL_SPEED 0x01000000 +-#define PORTSCX_PORT_SPEED_MASK 0x0C000000 +-#define PORTSCX_PORT_WIDTH 0x10000000 +-#define PORTSCX_PHY_TYPE_SEL 0xC0000000 +- +-/* bit 11-10 are line status */ +-#define PORTSCX_LINE_STATUS_SE0 0x00000000 +-#define PORTSCX_LINE_STATUS_JSTATE 0x00000400 +-#define PORTSCX_LINE_STATUS_KSTATE 0x00000800 +-#define PORTSCX_LINE_STATUS_UNDEF 0x00000C00 +-#define PORTSCX_LINE_STATUS_BIT_POS 10 +- +-/* bit 15-14 are port indicator control */ +-#define PORTSCX_PIC_OFF 0x00000000 +-#define PORTSCX_PIC_AMBER 0x00004000 +-#define PORTSCX_PIC_GREEN 0x00008000 +-#define PORTSCX_PIC_UNDEF 0x0000C000 +-#define PORTSCX_PIC_BIT_POS 14 +- +-/* bit 19-16 are port test control */ +-#define PORTSCX_PTC_DISABLE 0x00000000 +-#define PORTSCX_PTC_JSTATE 0x00010000 +-#define PORTSCX_PTC_KSTATE 0x00020000 +-#define PORTSCX_PTC_SEQNAK 0x00030000 +-#define PORTSCX_PTC_PACKET 0x00040000 +-#define PORTSCX_PTC_FORCE_EN 0x00050000 +-#define PORTSCX_PTC_BIT_POS 16 +- +-/* bit 27-26 are port speed */ +-#define PORTSCX_PORT_SPEED_FULL 0x00000000 +-#define PORTSCX_PORT_SPEED_LOW 0x04000000 +-#define PORTSCX_PORT_SPEED_HIGH 0x08000000 +-#define PORTSCX_PORT_SPEED_UNDEF 0x0C000000 +-#define PORTSCX_SPEED_BIT_POS 26 +- +-/* bit 28 is parallel transceiver width for UTMI interface */ +-#define PORTSCX_PTW 0x10000000 +-#define PORTSCX_PTW_8BIT 0x00000000 +-#define PORTSCX_PTW_16BIT 0x10000000 +- +-/* bit 31-30 are port transceiver select */ +-#define PORTSCX_PTS_UTMI 0x00000000 +-#define PORTSCX_PTS_ULPI 0x80000000 +-#define PORTSCX_PTS_FSLS 0xC0000000 +-#define PORTSCX_PTS_BIT_POS 30 +- +-/* otgsc Register Bit Masks */ +-#define OTGSC_CTRL_VUSB_DISCHARGE 0x00000001 +-#define OTGSC_CTRL_VUSB_CHARGE 0x00000002 +-#define OTGSC_CTRL_OTG_TERM 0x00000008 +-#define OTGSC_CTRL_DATA_PULSING 0x00000010 +-#define OTGSC_STS_USB_ID 0x00000100 +-#define OTGSC_STS_A_VBUS_VALID 0x00000200 +-#define OTGSC_STS_A_SESSION_VALID 0x00000400 +-#define OTGSC_STS_B_SESSION_VALID 0x00000800 +-#define OTGSC_STS_B_SESSION_END 0x00001000 +-#define OTGSC_STS_1MS_TOGGLE 0x00002000 +-#define OTGSC_STS_DATA_PULSING 0x00004000 +-#define OTGSC_INTSTS_USB_ID 0x00010000 +-#define OTGSC_INTSTS_A_VBUS_VALID 0x00020000 +-#define OTGSC_INTSTS_A_SESSION_VALID 0x00040000 +-#define OTGSC_INTSTS_B_SESSION_VALID 0x00080000 +-#define OTGSC_INTSTS_B_SESSION_END 0x00100000 +-#define OTGSC_INTSTS_1MS 0x00200000 +-#define OTGSC_INTSTS_DATA_PULSING 0x00400000 +-#define OTGSC_INTR_USB_ID 0x01000000 +-#define OTGSC_INTR_A_VBUS_VALID 0x02000000 +-#define OTGSC_INTR_A_SESSION_VALID 0x04000000 +-#define OTGSC_INTR_B_SESSION_VALID 0x08000000 +-#define OTGSC_INTR_B_SESSION_END 0x10000000 +-#define OTGSC_INTR_1MS_TIMER 0x20000000 +-#define OTGSC_INTR_DATA_PULSING 0x40000000 +- +-/* USB MODE Register Bit Masks */ +-#define USB_MODE_CTRL_MODE_IDLE 0x00000000 +-#define USB_MODE_CTRL_MODE_DEVICE 0x00000002 +-#define USB_MODE_CTRL_MODE_HOST 0x00000003 +-#define USB_MODE_CTRL_MODE_RSV 0x00000001 +-#define USB_MODE_SETUP_LOCK_OFF 0x00000008 +-#define USB_MODE_STREAM_DISABLE 0x00000010 +-/* Endpoint Flush Register */ +-#define EPFLUSH_TX_OFFSET 0x00010000 +-#define EPFLUSH_RX_OFFSET 0x00000000 +- +-/* Endpoint Setup Status bit masks */ +-#define EP_SETUP_STATUS_MASK 0x0000003F +-#define EP_SETUP_STATUS_EP0 0x00000001 +- +-/* ENDPOINTCTRLx Register Bit Masks */ +-#define EPCTRL_TX_ENABLE 0x00800000 +-#define EPCTRL_TX_DATA_TOGGLE_RST 0x00400000 /* Not EP0 */ +-#define EPCTRL_TX_DATA_TOGGLE_INH 0x00200000 /* Not EP0 */ +-#define EPCTRL_TX_TYPE 0x000C0000 +-#define EPCTRL_TX_DATA_SOURCE 0x00020000 /* Not EP0 */ +-#define EPCTRL_TX_EP_STALL 0x00010000 +-#define EPCTRL_RX_ENABLE 0x00000080 +-#define EPCTRL_RX_DATA_TOGGLE_RST 0x00000040 /* Not EP0 */ +-#define EPCTRL_RX_DATA_TOGGLE_INH 0x00000020 /* Not EP0 */ +-#define EPCTRL_RX_TYPE 0x0000000C +-#define EPCTRL_RX_DATA_SINK 0x00000002 /* Not EP0 */ +-#define EPCTRL_RX_EP_STALL 0x00000001 +- +-/* bit 19-18 and 3-2 are endpoint type */ +-#define EPCTRL_EP_TYPE_CONTROL 0 +-#define EPCTRL_EP_TYPE_ISO 1 +-#define EPCTRL_EP_TYPE_BULK 2 +-#define EPCTRL_EP_TYPE_INTERRUPT 3 +-#define EPCTRL_TX_EP_TYPE_SHIFT 18 +-#define EPCTRL_RX_EP_TYPE_SHIFT 2 +- +-/* SNOOPn Register Bit Masks */ +-#define SNOOP_ADDRESS_MASK 0xFFFFF000 +-#define SNOOP_SIZE_ZERO 0x00 /* snooping disable */ +-#define SNOOP_SIZE_4KB 0x0B /* 4KB snoop size */ +-#define SNOOP_SIZE_8KB 0x0C +-#define SNOOP_SIZE_16KB 0x0D +-#define SNOOP_SIZE_32KB 0x0E +-#define SNOOP_SIZE_64KB 0x0F +-#define SNOOP_SIZE_128KB 0x10 +-#define SNOOP_SIZE_256KB 0x11 +-#define SNOOP_SIZE_512KB 0x12 +-#define SNOOP_SIZE_1MB 0x13 +-#define SNOOP_SIZE_2MB 0x14 +-#define SNOOP_SIZE_4MB 0x15 +-#define SNOOP_SIZE_8MB 0x16 +-#define SNOOP_SIZE_16MB 0x17 +-#define SNOOP_SIZE_32MB 0x18 +-#define SNOOP_SIZE_64MB 0x19 +-#define SNOOP_SIZE_128MB 0x1A +-#define SNOOP_SIZE_256MB 0x1B +-#define SNOOP_SIZE_512MB 0x1C +-#define SNOOP_SIZE_1GB 0x1D +-#define SNOOP_SIZE_2GB 0x1E /* 2GB snoop size */ +- +-/* pri_ctrl Register Bit Masks */ +-#define PRI_CTRL_PRI_LVL1 0x0000000C +-#define PRI_CTRL_PRI_LVL0 0x00000003 +- +-/* si_ctrl Register Bit Masks */ +-#define SI_CTRL_ERR_DISABLE 0x00000010 +-#define SI_CTRL_IDRC_DISABLE 0x00000008 +-#define SI_CTRL_RD_SAFE_EN 0x00000004 +-#define SI_CTRL_RD_PREFETCH_DISABLE 0x00000002 +-#define SI_CTRL_RD_PREFEFETCH_VAL 0x00000001 +- +-/* control Register Bit Masks */ +-#define USB_CTRL_IOENB 0x00000004 +-#define USB_CTRL_ULPI_INT0EN 0x00000001 + + /* Endpoint Queue Head data struct + * Rem: all the variables of qh are LittleEndian Mode +@@ -477,7 +297,10 @@ struct fsl_udc { + unsigned int irq; + + struct usb_ctrlrequest local_setup_buff; +- spinlock_t lock; ++ spinlock_t lock; /* udc lock */ ++ struct fsl_usb2_platform_data *pdata; ++ u32 xcvr_type; ++ + struct otg_transceiver *transceiver; + unsigned softconnect:1; + unsigned vbus_active:1; +@@ -514,7 +337,7 @@ struct fsl_udc { + #define DBG(fmt, args...) printk(KERN_DEBUG "[%s] " fmt "\n", \ + __FUNCTION__, ## args) + #else +-#define DBG(fmt, args...) do{}while(0) ++#define DBG(fmt, args...) do {} while (0) + #endif + + #if 0 +@@ -548,7 +371,7 @@ static void dump_msg(const char *label, + #ifdef VERBOSE + #define VDBG DBG + #else +-#define VDBG(stuff...) do{}while(0) ++#define VDBG(stuff...) do {} while (0) + #endif + + #define ERR(stuff...) pr_err("udc: " stuff) +@@ -573,11 +396,14 @@ static void dump_msg(const char *label, + #define ep_maxpacket(EP) ((EP)->ep.maxpacket) + #define ep_is_in(EP) ( (ep_index(EP) == 0) ? (EP->udc->ep0_dir == \ + USB_DIR_IN ):((EP)->desc->bEndpointAddress \ +- & USB_DIR_IN)==USB_DIR_IN) ++ & USB_DIR_IN) == USB_DIR_IN) + #define get_ep_by_pipe(udc, pipe) ((pipe == 1)? &udc->eps[0]: \ + &udc->eps[pipe]) + #define get_pipe_by_windex(windex) ((windex & USB_ENDPOINT_NUMBER_MASK) \ + * 2 + ((windex & USB_DIR_IN) ? 1 : 0)) + #define get_pipe_by_ep(EP) (ep_index(EP) * 2 + ep_is_in(EP)) + ++/* Bulk only class request */ ++#define USB_BULK_RESET_REQUEST 0xff ++ + #endif +--- a/drivers/usb/gadget/gadget_chips.h ++++ b/drivers/usb/gadget/gadget_chips.h +@@ -147,6 +147,11 @@ + #define gadget_is_m66592(g) 0 + #endif + ++#ifdef CONFIG_USB_GADGET_MCF5445X ++#define gadget_is_mcf5445x(g) !strcmp("fsl-usb2-udc", (g)->name) ++#else ++#define gadget_is_mcf5445x(g) 0 ++#endif + + // CONFIG_USB_GADGET_SX2 + // CONFIG_USB_GADGET_AU1X00 +@@ -212,5 +217,7 @@ static inline int usb_gadget_controller_ + return 0x20; + else if (gadget_is_m66592(gadget)) + return 0x21; ++ else if (gadget_is_mcf5445x(gadget)) ++ return 0x22; + return -ENOENT; + } +--- /dev/null ++++ b/drivers/usb/gadget/mcf5445x_udc.c +@@ -0,0 +1,2758 @@ ++/* ++ * Copyright Freescale Semiconductor, Inc. 2006-2007 ++ * ++ * Based on mpc_udc.c code ++ * of Li Yang and Jiang Bo (Freescale Semiconductor, Inc.) ++ * ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ++ * ++ *************************************************************************** ++ * Changes: ++ * v0.004 30 July 2007 Duck ++ * mcf5445x port ++ * v0.003 27 October 2006 Andrey Butok ++ * Added M5329EVB support (without external transceiver). ++ * v0.002 29 September 2006 Andrey Butok ++ * Some little changes. Added OTG support. ++ * v0.001 12 July 2006 Andrey Butok ++ * Initial Release - developed on uClinux with 2.6.17.1 kernel. ++ * Based on mpc_udc.c code ++ * of Li Yang and Jiang Bo (Freescale Semiconductor, Inc.) ++ * ++ */ ++ ++#define DEBUG ++#undef VERBOSE ++ ++#include <linux/module.h> ++#include <linux/kernel.h> ++#include <linux/ioport.h> ++#include <linux/types.h> ++#include <linux/errno.h> ++#include <linux/delay.h> ++#include <linux/sched.h> ++#include <linux/slab.h> ++#include <linux/init.h> ++#include <linux/io.h> ++#include <linux/irq.h> ++#include <linux/timer.h> ++#include <linux/list.h> ++#include <linux/interrupt.h> ++#include <linux/proc_fs.h> ++#include <linux/mm.h> ++#include <linux/platform_device.h> ++#include <linux/moduleparam.h> ++#include <linux/device.h> ++#include <linux/usb/ch9.h> ++#include <linux/usb_gadget.h> ++#include <linux/usb/otg.h> ++#include <linux/dma-mapping.h> ++#include <linux/dmapool.h> ++#include <linux/fsl_devices.h> ++#include <linux/usb/fsl_xcvr.h> ++#include <linux/usb/fsl_usb2.h> ++#include <linux/pm.h> ++ ++#include <asm/byteorder.h> ++#include <asm/system.h> ++#include <asm/unaligned.h> ++#include <asm/dma.h> ++ ++#include <asm/mcfsim.h> ++#include <asm/cacheflush.h> ++ ++#include "fsl_usb2_udc.h" ++ ++#define DRIVER_DESC "Freescale High-Speed USB SoC Device Controller driver" ++#define DRIVER_AUTHOR "Freescale Semiconductor Inc." ++#define DRIVER_VERSION "30 July 2007" ++ ++#define cpu_to_hc32(x) (x) ++#define hc32_to_cpu(x) (x) ++ ++static int udc_suspend(struct fsl_udc *udc); ++ ++#define DMA_ADDR_INVALID (~(dma_addr_t)0) ++ ++static const char driver_name[] = "fsl-usb2-udc"; ++static const char driver_desc[] = DRIVER_DESC; ++ ++volatile static struct fsl_usb_device_regs *dr_regs; ++volatile static struct usb_sys_interface *usb_sys_regs; ++ ++/* it is initialized in probe() */ ++static struct fsl_udc *udc_controller; ++ ++static const struct usb_endpoint_descriptor ++fsl_ep0_desc = { ++ .bLength = USB_DT_ENDPOINT_SIZE, ++ .bDescriptorType = USB_DT_ENDPOINT, ++ .bEndpointAddress = 0, ++ .bmAttributes = USB_ENDPOINT_XFER_CONTROL, ++ .wMaxPacketSize = USB_MAX_CTRL_PAYLOAD, ++}; ++ ++static int fsl_udc_suspend(struct device *dev, pm_message_t state); ++static int fsl_udc_resume(struct device *dev); ++static void fsl_ep_fifo_flush(struct usb_ep *_ep); ++ ++/******************************************************************** ++ * Internal Used Function ++********************************************************************/ ++/*----------------------------------------------------------------- ++ * done() - retire a request; caller blocked irqs ++ * @status : request status to be set, only works when ++ * request is still in progress. ++ *--------------------------------------------------------------*/ ++static void done(struct fsl_ep *ep, struct fsl_req *req, int status) ++{ ++ struct fsl_udc *udc = NULL; ++ unsigned char stopped = ep->stopped; ++ ++ udc = (struct fsl_udc *)ep->udc; ++ ++ pr_debug("udc: req=0x%p\n", req); ++ if (req->head) { ++ pr_debug("udc: freeing head=0x%p\n", req->head); ++ dma_pool_free(udc->td_pool, req->head, req->head->td_dma); ++ } ++ ++ /* the req->queue pointer is used by ep_queue() func, in which ++ * the request will be added into a udc_ep->queue 'd tail ++ * so here the req will be dropped from the ep->queue ++ */ ++ list_del_init(&req->queue); ++ ++ /* req.status should be set as -EINPROGRESS in ep_queue() */ ++ if (req->req.status == -EINPROGRESS) ++ req->req.status = status; ++ else ++ status = req->req.status; ++ ++ pr_debug("udc: req=0x%p mapped=%x\n", req, req->mapped); ++ ++ if (req->mapped) { ++ pr_debug("udc: calling dma_unmap_single(buf,%s) req=0x%p " ++ "a=0x%x len=%d\n", ++ ep_is_in(ep) ? "to_dvc" : "from_dvc", ++ req, req->req.dma, req->req.length); ++ ++ dma_unmap_single(ep->udc->gadget.dev.parent, ++ req->req.dma, req->req.length, ep_is_in(ep) ? ++ DMA_TO_DEVICE : DMA_FROM_DEVICE); ++ ++ req->req.dma = DMA_ADDR_INVALID; ++ req->mapped = 0; ++ pr_debug("udc: req=0x%p set req.dma=0x%x\n", req, req->req.dma); ++ } else { ++ if ((req->req.length != 0) ++ && (req->req.dma != DMA_ADDR_INVALID)) { ++ pr_debug("udc: calling dma_sync_single_for_cpu(buf,%s) " ++ "req=0x%p dma=0x%x len=%d\n", ++ ep_is_in(ep) ? "to_dvc" : "from_dvc", req, ++ req->req.dma, req->req.length); ++ ++ dma_sync_single_for_cpu(ep->udc->gadget.dev.parent, ++ req->req.dma, req->req.length, ++ ep_is_in(ep) ? DMA_TO_DEVICE : ++ DMA_FROM_DEVICE); ++ } ++ } ++ ++ if (status && (status != -ESHUTDOWN)) { ++ pr_debug("udc: complete %s req 0c%p stat %d len %u/%u\n", ++ ep->ep.name, &req->req, status, ++ req->req.actual, req->req.length); ++ } ++ ++ /* don't modify queue heads during completion callback */ ++ ep->stopped = 1; ++ ++ spin_unlock(&ep->udc->lock); ++ ++ /* this complete() should a func implemented by gadget layer, ++ * eg fsg->bulk_in_complete() */ ++ if (req->req.complete) { ++ pr_debug("udc: calling gadget's complete() req=0x%p\n", req); ++ req->req.complete(&ep->ep, &req->req); ++ pr_debug("udc: back from gadget's complete()\n"); ++ } ++ ++ spin_lock(&ep->udc->lock); ++ ep->stopped = stopped; ++} ++ ++/* ++ * nuke(): delete all requests related to this ep ++ * called with spinlock held ++ *--------------------------------------------------------------*/ ++static void nuke(struct fsl_ep *ep, int status) ++{ ++ ep->stopped = 1; ++ ++ /* Flush fifo */ ++ fsl_ep_fifo_flush(&ep->ep); ++ ++ /* Whether this eq has request linked */ ++ while (!list_empty(&ep->queue)) { ++ struct fsl_req *req = NULL; ++ ++ req = list_entry(ep->queue.next, struct fsl_req, queue); ++ done(ep, req, status); ++ } ++} ++ ++/*------------------------------------------------------------------ ++ Internal Hardware related function ++ ------------------------------------------------------------------*/ ++ ++static int dr_controller_setup(struct fsl_udc *udc) ++{ ++ unsigned int tmp; ++ unsigned int __attribute((unused)) ctrl = 0; ++ unsigned long timeout; ++ struct fsl_usb2_platform_data *pdata; ++ ++#define FSL_UDC_RESET_TIMEOUT 1000 ++ ++ /* before here, make sure dr_regs has been initialized */ ++ if (!udc) ++ return -EINVAL; ++ pdata = udc->pdata; ++ ++ /* Stop and reset the usb controller */ ++ tmp = fsl_readl(&dr_regs->usbcmd); ++ tmp &= ~USB_CMD_RUN_STOP; ++ fsl_writel(tmp, &dr_regs->usbcmd); ++ ++ tmp = fsl_readl(&dr_regs->usbcmd); ++ tmp |= USB_CMD_CTRL_RESET; ++ fsl_writel(tmp, &dr_regs->usbcmd); ++ ++ /* Wait for reset to complete */ ++ timeout = jiffies + FSL_UDC_RESET_TIMEOUT; ++ while (fsl_readl(&dr_regs->usbcmd) & USB_CMD_CTRL_RESET) { ++ if (time_after(jiffies, timeout)) { ++ ERR("udc reset timeout! \n"); ++ return -ETIMEDOUT; ++ } ++ cpu_relax(); ++ } ++ ++ tmp = fsl_readl(&dr_regs->usbmode); ++ tmp &= ~0x3; /* clear mode bits */ ++ tmp |= USB_MODE_CTRL_MODE_DEVICE; ++ /* Disable Setup Lockout */ ++ tmp |= USB_MODE_SETUP_LOCK_OFF; ++ if (pdata->es) ++ tmp |= USBMODE_ES; ++ fsl_writel(tmp, &dr_regs->usbmode); ++ ++ if (pdata->xcvr_ops && pdata->xcvr_ops->set_device) ++ pdata->xcvr_ops->set_device(); ++ ++ /* Clear the setup status */ ++ fsl_writel(0, &dr_regs->usbsts); ++ ++ tmp = udc->ep_qh_dma; ++ tmp &= USB_EP_LIST_ADDRESS_MASK; ++ fsl_writel(tmp, &dr_regs->endpointlistaddr); ++ ++ /* ++ VDBG("vir[qh_base] is %p phy[qh_base] is 0x%8x reg is 0x%8x", ++ (int)udc->ep_qh, (int)tmp, ++ fsl_readl(&dr_regs->endpointlistaddr)); ++ */ ++ ++ ++ if (pdata->have_sysif_regs) { ++ /* Config control enable i/o output, cpu endian register */ ++ ctrl = __raw_readl(&usb_sys_regs->control); ++ ctrl |= USB_CTRL_IOENB; ++ __raw_writel(ctrl, &usb_sys_regs->control); ++ } ++ ++#if defined(CONFIG_PPC32) && !defined(CONFIG_NOT_COHERENT_CACHE) ++ /* Turn on cache snooping hardware, since some PowerPC platforms ++ * wholly rely on hardware to deal with cache coherent. */ ++ ++ if (pdata->have_sysif_regs) { ++ /* Setup Snooping for all the 4GB space */ ++ tmp = SNOOP_SIZE_2GB; /* starts from 0x0, size 2G */ ++ __raw_writel(tmp, &usb_sys_regs->snoop1); ++ tmp |= 0x80000000; /* starts from 0x8000000, size 2G */ ++ __raw_writel(tmp, &usb_sys_regs->snoop2); ++ } ++#endif ++ ++ return 0; ++} ++ ++static void pullup_enable(struct fsl_udc *udc) ++{ ++ u32 temp; ++ ++ unsigned short ccm = fsl_readw(&MCF_CCM_UOCSR); ++ ccm |= MCF_CCM_UOCSR_BVLD; ++ ccm &= ~MCF_CCM_UOCSR_SEND; ++ fsl_writew(ccm, &MCF_CCM_UOCSR); ++ ++ /* Enable DR irq reg */ ++ temp = USB_INTR_INT_EN | USB_INTR_ERR_INT_EN ++ | USB_INTR_PTC_DETECT_EN | USB_INTR_RESET_EN ++ | USB_INTR_DEVICE_SUSPEND | USB_INTR_SYS_ERR_EN; ++ ++ fsl_writel(temp, &dr_regs->usbintr); ++ ++ /* Set controller to Run */ ++ temp = fsl_readl(&dr_regs->usbcmd); ++ temp |= USB_CMD_RUN_STOP; ++ fsl_writel(temp, &dr_regs->usbcmd); ++ ++#ifdef NEVER /* DDD FIXME: we want this? */ ++ if (!udc->transceiver) ++ *((u16 *)(MCF_FBCS1_CSAR)) &= ~0x1; /* Enable pullup register */ ++#endif ++} ++ ++static void pullup_disable(struct fsl_udc *udc) ++{ ++ unsigned int tmp; ++ unsigned short ccm; ++ ++ VDBG(); ++ /* disable all INTRs */ ++ fsl_writel(0, &dr_regs->usbintr); ++ ++ ccm = fsl_readw(&MCF_CCM_UOCSR); ++ ccm &= ~MCF_CCM_UOCSR_BVLD; ++ fsl_writew(ccm, &MCF_CCM_UOCSR); ++ ++ /* set controller to Stop */ ++ tmp = fsl_readl(&dr_regs->usbcmd); ++ tmp &= ~USB_CMD_RUN_STOP; ++ fsl_writel(tmp, &dr_regs->usbcmd); ++ ++#ifdef NEVER /* DDD FIXME: we want this? */ ++ if (!udc->transceiver) ++ *((u16 *)(MCF_FBCS1_CSAR)) |= 0x1; /* Disable pullup register */ ++#endif ++ ++} ++ ++static void dr_controller_run(struct fsl_udc *udc) ++{ ++ VDBG(); ++ pullup_enable(udc); ++ udc->stopped = 0; ++} ++ ++static void dr_controller_stop(struct fsl_udc *udc) ++{ ++ pullup_disable(udc); ++ udc->stopped = 1; ++ udc->gadget.b_hnp_enable = 0; ++ udc->gadget.a_hnp_support = 0; ++ udc->gadget.a_alt_hnp_support = 0; ++} ++ ++void dr_ep_setup(unsigned char ep_num, unsigned char dir, unsigned char ep_type) ++{ ++ unsigned int tmp_epctrl = 0; ++ ++ tmp_epctrl = fsl_readl(&dr_regs->endptctrl[ep_num]); ++ if (dir) { ++ if (ep_num) ++ tmp_epctrl |= EPCTRL_TX_DATA_TOGGLE_RST; ++ tmp_epctrl |= EPCTRL_TX_ENABLE; ++ tmp_epctrl |= ((unsigned int)(ep_type) ++ << EPCTRL_TX_EP_TYPE_SHIFT); ++ } else { ++ if (ep_num) ++ tmp_epctrl |= EPCTRL_RX_DATA_TOGGLE_RST; ++ tmp_epctrl |= EPCTRL_RX_ENABLE; ++ tmp_epctrl |= ((unsigned int)(ep_type) ++ << EPCTRL_RX_EP_TYPE_SHIFT); ++ } ++ ++ fsl_writel(tmp_epctrl, &dr_regs->endptctrl[ep_num]); ++} ++ ++static void dr_ep_change_stall(unsigned char ep_num, unsigned char dir, ++ int value) ++{ ++ u32 tmp_epctrl = 0; ++ ++ tmp_epctrl = fsl_readl(&dr_regs->endptctrl[ep_num]); ++ ++ if (value) { ++ /* set the stall bit */ ++ if (dir) ++ tmp_epctrl |= EPCTRL_TX_EP_STALL; ++ else ++ tmp_epctrl |= EPCTRL_RX_EP_STALL; ++ } else { ++ /* clear the stall bit and reset data toggle */ ++ if (dir) { ++ tmp_epctrl &= ~EPCTRL_TX_EP_STALL; ++ tmp_epctrl |= EPCTRL_TX_DATA_TOGGLE_RST; ++ } else { ++ tmp_epctrl &= ~EPCTRL_RX_EP_STALL; ++ tmp_epctrl |= EPCTRL_RX_DATA_TOGGLE_RST; ++ } ++ } ++ fsl_writel(tmp_epctrl, &dr_regs->endptctrl[ep_num]); ++} ++ ++/* Get stall status of a specific ep ++ Return: 0: not stalled; 1:stalled */ ++static int dr_ep_get_stall(unsigned char ep_num, unsigned char dir) ++{ ++ u32 epctrl; ++ ++ epctrl = fsl_readl(&dr_regs->endptctrl[ep_num]); ++ if (dir) ++ return (epctrl & EPCTRL_TX_EP_STALL) ? 1 : 0; ++ else ++ return (epctrl & EPCTRL_RX_EP_STALL) ? 1 : 0; ++} ++ ++/******************************************************************** ++ Internal Structure Build up functions ++********************************************************************/ ++ ++/*------------------------------------------------------------------ ++* struct_ep_qh_setup(): set the Endpoint Capabilites field of QH ++ * @zlt: Zero Length Termination Select (1: disable; 0: enable) ++ * @mult: Mult field ++ ------------------------------------------------------------------*/ ++static void struct_ep_qh_setup(struct fsl_udc *udc, unsigned char ep_num, ++ unsigned char dir, unsigned char ep_type, ++ unsigned int max_pkt_len, ++ unsigned int zlt, unsigned char mult) ++{ ++ struct ep_queue_head *p_QH = &udc->ep_qh[2 * ep_num + dir]; ++ unsigned int tmp = 0; ++ ++ /* set the Endpoint Capabilites in QH */ ++ switch (ep_type) { ++ case USB_ENDPOINT_XFER_CONTROL: ++ /* Interrupt On Setup (IOS). for control ep */ ++ tmp = (max_pkt_len << EP_QUEUE_HEAD_MAX_PKT_LEN_POS) ++ | EP_QUEUE_HEAD_IOS; ++ break; ++ case USB_ENDPOINT_XFER_ISOC: ++ tmp = (max_pkt_len << EP_QUEUE_HEAD_MAX_PKT_LEN_POS) ++ | (mult << EP_QUEUE_HEAD_MULT_POS); ++ break; ++ case USB_ENDPOINT_XFER_BULK: ++ case USB_ENDPOINT_XFER_INT: ++ tmp = max_pkt_len << EP_QUEUE_HEAD_MAX_PKT_LEN_POS; ++ break; ++ default: ++ VDBG("error ep type is %d", ep_type); ++ return; ++ } ++ if (zlt) ++ tmp |= EP_QUEUE_HEAD_ZLT_SEL; ++ p_QH->max_pkt_length = cpu_to_hc32(tmp); ++ ++ return; ++} ++ ++/* Setup qh structure and ep register for ep0. */ ++static void ep0_setup(struct fsl_udc *udc) ++{ ++ /* the intialization of an ep includes: fields in QH, Regs, ++ * fsl_ep struct */ ++ struct_ep_qh_setup(udc, 0, USB_RECV, USB_ENDPOINT_XFER_CONTROL, ++ USB_MAX_CTRL_PAYLOAD, 0, 0); ++ struct_ep_qh_setup(udc, 0, USB_SEND, USB_ENDPOINT_XFER_CONTROL, ++ USB_MAX_CTRL_PAYLOAD, 0, 0); ++ dr_ep_setup(0, USB_RECV, USB_ENDPOINT_XFER_CONTROL); ++ dr_ep_setup(0, USB_SEND, USB_ENDPOINT_XFER_CONTROL); ++ ++ return; ++ ++} ++ ++/*********************************************************************** ++ Endpoint Management Functions ++***********************************************************************/ ++ ++/*------------------------------------------------------------------------- ++ * when configurations are set, or when interface settings change ++ * for example the do_set_interface() in gadget layer, ++ * the driver will enable or disable the relevant endpoints ++ * ep0 doesn't use this routine. It is always enabled. ++-------------------------------------------------------------------------*/ ++static int fsl_ep_enable(struct usb_ep *_ep, ++ const struct usb_endpoint_descriptor *desc) ++{ ++ struct fsl_udc *udc = NULL; ++ struct fsl_ep *ep = NULL; ++ unsigned short max = 0; ++ unsigned char mult = 0, zlt; ++ int retval = -EINVAL; ++ unsigned long flags = 0; ++ ++ ep = container_of(_ep, struct fsl_ep, ep); ++ ++ /* catch various bogus parameters */ ++ if (!_ep || !desc || ep->desc ++ || (desc->bDescriptorType != USB_DT_ENDPOINT)) ++ return -EINVAL; ++ ++ udc = ep->udc; ++ ++ if (!udc->driver || (udc->gadget.speed == USB_SPEED_UNKNOWN)) ++ return -ESHUTDOWN; ++ ++ max = le16_to_cpu(desc->wMaxPacketSize); ++ ++ /* Disable automatic zlp generation. Driver is reponsible to indicate ++ * explicitly through req->req.zero. This is needed to enable multi-td ++ * request. */ ++ zlt = 1; ++ ++ /* Assume the max packet size from gadget is always correct */ ++ switch (desc->bmAttributes & 0x03) { ++ case USB_ENDPOINT_XFER_CONTROL: ++ case USB_ENDPOINT_XFER_BULK: ++ case USB_ENDPOINT_XFER_INT: ++ /* mult = 0. Execute N Transactions as demonstrated by ++ * the USB variable length packet protocol where N is ++ * computed using the Maximum Packet Length (dQH) and ++ * the Total Bytes field (dTD) */ ++ mult = 0; ++ break; ++ case USB_ENDPOINT_XFER_ISOC: ++ /* Calculate transactions needed for high bandwidth iso */ ++ mult = (unsigned char)(1 + ((max >> 11) & 0x03)); ++ max = max & 0x8ff; /* bit 0~10 */ ++ /* 3 transactions at most */ ++ if (mult > 3) ++ goto en_done; ++ break; ++ default: ++ goto en_done; ++ } ++ ++ spin_lock_irqsave(&udc->lock, flags); ++ ep->ep.maxpacket = max; ++ ep->desc = desc; ++ ep->stopped = 0; ++ ++ /* Controller related setup */ ++ /* Init EPx Queue Head (Ep Capabilites field in QH ++ * according to max, zlt, mult) */ ++ struct_ep_qh_setup(udc, (unsigned char) ep_index(ep), ++ (unsigned char) ((desc->bEndpointAddress & USB_DIR_IN) ++ ? USB_SEND : USB_RECV), ++ (unsigned char) (desc->bmAttributes ++ & USB_ENDPOINT_XFERTYPE_MASK), ++ max, zlt, mult); ++ ++ /* Init endpoint ctrl register */ ++ dr_ep_setup((unsigned char) ep_index(ep), ++ (unsigned char) ((desc->bEndpointAddress & USB_DIR_IN) ++ ? USB_SEND : USB_RECV), ++ (unsigned char) (desc->bmAttributes ++ & USB_ENDPOINT_XFERTYPE_MASK)); ++ ++ spin_unlock_irqrestore(&udc->lock, flags); ++ retval = 0; ++ ++ VDBG("enabled %s (ep%d%s) maxpacket %d", ep->ep.name, ++ ep->desc->bEndpointAddress & 0x0f, ++ (desc->bEndpointAddress & USB_DIR_IN) ++ ? "in" : "out", max); ++en_done: ++ return retval; ++} ++ ++/*--------------------------------------------------------------------- ++ * @ep : the ep being unconfigured. May not be ep0 ++ * Any pending and uncomplete req will complete with status (-ESHUTDOWN) ++*---------------------------------------------------------------------*/ ++static int fsl_ep_disable(struct usb_ep *_ep) ++{ ++ struct fsl_udc *udc = NULL; ++ struct fsl_ep *ep = NULL; ++ unsigned long flags = 0; ++ u32 epctrl; ++ int ep_num; ++ ++ ep = container_of(_ep, struct fsl_ep, ep); ++ if (!_ep || !ep->desc) { ++ pr_debug("udc: %s not enabled\n", _ep ? ep->ep.name : NULL); ++ return -EINVAL; ++ } ++ ++ /* disable ep on controller */ ++ ep_num = ep_index(ep); ++ epctrl = fsl_readl(&dr_regs->endptctrl[ep_num]); ++ if (ep_is_in(ep)) ++ epctrl &= ~EPCTRL_TX_ENABLE; ++ else ++ epctrl &= ~EPCTRL_RX_ENABLE; ++ fsl_writel(epctrl, &dr_regs->endptctrl[ep_num]); ++ ++ udc = (struct fsl_udc *)ep->udc; ++ spin_lock_irqsave(&udc->lock, flags); ++ ++ /* nuke all pending requests (does flush) */ ++ nuke(ep, -ESHUTDOWN); ++ ++ ep->desc = 0; ++ ep->stopped = 1; ++ spin_unlock_irqrestore(&udc->lock, flags); ++ ++ pr_debug("udc: disabled %s OK\n", _ep->name); ++ return 0; ++} ++ ++/*--------------------------------------------------------------------- ++ * allocate a request object used by this endpoint ++ * the main operation is to insert the req->queue to the eq->queue ++ * Returns the request, or null if one could not be allocated ++*---------------------------------------------------------------------*/ ++static struct usb_request * ++fsl_alloc_request(struct usb_ep *_ep, gfp_t gfp_flags) ++{ ++ struct fsl_req *req = NULL; ++ ++ req = kzalloc(sizeof *req, gfp_flags); ++ if (!req) ++ return NULL; ++ ++ req->req.dma = DMA_ADDR_INVALID; ++ pr_debug("udc: req=0x%p set req.dma=0x%x\n", req, req->req.dma); ++ INIT_LIST_HEAD(&req->queue); ++ ++ return &req->req; ++} ++ ++static void fsl_free_request(struct usb_ep *_ep, struct usb_request *_req) ++{ ++ struct fsl_req *req; ++ ++ req = container_of(_req, struct fsl_req, req); ++ pr_debug("udc: req=0x%p\n", req); ++ ++ if (_req) ++ kfree(req); ++} ++ ++/*-------------------------------------------------------------------------*/ ++static int fsl_queue_td(struct fsl_ep *ep, struct fsl_req *req) ++{ ++ int i = ep_index(ep) * 2 + ep_is_in(ep); ++ u32 temp, bitmask, tmp_stat; ++ struct ep_queue_head *dQH = &ep->udc->ep_qh[i]; ++ ++ pr_debug("udc: queue req=0x%p to ep index %d\n", req, i); ++ ++ bitmask = ep_is_in(ep) ++ ? (1 << (ep_index(ep) + 16)) ++ : (1 << (ep_index(ep))); ++ ++ /* check if the pipe is empty */ ++ if (!(list_empty(&ep->queue))) { ++ /* Add td to the end */ ++ struct fsl_req *lastreq; ++ lastreq = list_entry(ep->queue.prev, struct fsl_req, queue); ++ lastreq->tail->next_td_ptr = ++ cpu_to_hc32(req->head->td_dma & DTD_ADDR_MASK); ++ /* Read prime bit, if 1 goto done */ ++ if (fsl_readl(&dr_regs->endpointprime) & bitmask) ++ goto out; ++ ++ do { ++ /* Set ATDTW bit in USBCMD */ ++ temp = fsl_readl(&dr_regs->usbcmd); ++ fsl_writel(temp | USB_CMD_ATDTW, &dr_regs->usbcmd); ++ ++ /* Read correct status bit */ ++ tmp_stat = fsl_readl(&dr_regs->endptstatus) & bitmask; ++ ++ } while (!(fsl_readl(&dr_regs->usbcmd) & USB_CMD_ATDTW)); ++ ++ /* Write ATDTW bit to 0 */ ++ temp = fsl_readl(&dr_regs->usbcmd); ++ fsl_writel(temp & ~USB_CMD_ATDTW, &dr_regs->usbcmd); ++ ++ if (tmp_stat) ++ goto out; ++ } ++ ++ /* Write dQH next pointer and terminate bit to 0 */ ++ temp = req->head->td_dma & EP_QUEUE_HEAD_NEXT_POINTER_MASK; ++ dQH->next_dtd_ptr = cpu_to_hc32(temp); ++ ++ /* Clear active and halt bit */ ++ temp = cpu_to_hc32(~(EP_QUEUE_HEAD_STATUS_ACTIVE ++ | EP_QUEUE_HEAD_STATUS_HALT)); ++ dQH->size_ioc_int_sts &= temp; ++ ++ /* Prime endpoint by writing 1 to ENDPTPRIME */ ++ temp = ep_is_in(ep) ++ ? (1 << (ep_index(ep) + 16)) ++ : (1 << (ep_index(ep))); ++ fsl_writel(temp, &dr_regs->endpointprime); ++out: ++ return 0; ++} ++ ++/* Fill in the dTD structure ++ * @req: request that the transfer belongs to ++ * @length: return actually data length of the dTD ++ * @dma: return dma address of the dTD ++ * @is_last: return flag if it is the last dTD of the request ++ * return: pointer to the built dTD */ ++static struct ep_td_struct *fsl_build_dtd(struct fsl_req *req, unsigned *length, ++ dma_addr_t *dma, int *is_last) ++{ ++ u32 swap_temp; ++ struct ep_td_struct *dtd; ++ ++ /* how big will this transfer be? */ ++ *length = min(req->req.length - req->req.actual, ++ (unsigned)EP_MAX_LENGTH_TRANSFER); ++ ++ dtd = dma_pool_alloc(udc_controller->td_pool, GFP_KERNEL, dma); ++ if (dtd == NULL) ++ return dtd; ++ ++ dtd->td_dma = *dma; ++ /* Clear reserved field */ ++ swap_temp = hc32_to_cpu(dtd->size_ioc_sts); ++ swap_temp &= ~DTD_RESERVED_FIELDS; ++ dtd->size_ioc_sts = cpu_to_hc32(swap_temp); ++ ++ /* Init all of buffer page pointers */ ++ swap_temp = (u32) (req->req.dma + req->req.actual); ++ dtd->buff_ptr0 = cpu_to_hc32(swap_temp); ++ dtd->buff_ptr1 = cpu_to_hc32(swap_temp + 0x1000); ++ dtd->buff_ptr2 = cpu_to_hc32(swap_temp + 0x2000); ++ dtd->buff_ptr3 = cpu_to_hc32(swap_temp + 0x3000); ++ dtd->buff_ptr4 = cpu_to_hc32(swap_temp + 0x4000); ++ ++ req->req.actual += *length; ++ ++ /* zlp is needed if req->req.zero is set */ ++ if (req->req.zero) { ++ if (*length == 0 || (*length % req->ep->ep.maxpacket) != 0) ++ *is_last = 1; ++ else ++ *is_last = 0; ++ } else if (req->req.length == req->req.actual) ++ *is_last = 1; ++ else ++ *is_last = 0; ++ ++ if ((*is_last) == 0) ++ VDBG("multi-dtd request!\n"); ++ /* Fill in the transfer size; set active bit */ ++ swap_temp = ((*length << DTD_LENGTH_BIT_POS) | DTD_STATUS_ACTIVE); ++ ++ /* Enable interrupt for the last dtd of a request */ ++ if (*is_last && !req->req.no_interrupt) ++ swap_temp |= DTD_IOC; ++ ++ dtd->size_ioc_sts = cpu_to_hc32(swap_temp); ++ ++ mb(); ++ ++ VDBG("length = %d address= 0x%x", *length, (int)*dma); ++ ++ return dtd; ++} ++ ++/* Generate dtd chain for a request */ ++static int fsl_req_to_dtd(struct fsl_req *req) ++{ ++ unsigned count; ++ int is_last; ++ int is_first = 1; ++ struct ep_td_struct *last_dtd = NULL, *dtd; ++ dma_addr_t dma; ++ ++ do { ++ dtd = fsl_build_dtd(req, &count, &dma, &is_last); ++ if (dtd == NULL) ++ return -ENOMEM; ++ ++ if (is_first) { ++ is_first = 0; ++ req->head = dtd; ++ } else { ++ last_dtd->next_td_ptr = hc32_to_cpu(dma); ++ last_dtd->next_td_virt = dtd; ++ } ++ last_dtd = dtd; ++ ++ req->dtd_count++; ++ } while (!is_last); ++ ++ dtd->next_td_ptr = cpu_to_hc32(DTD_NEXT_TERMINATE); ++ ++ req->tail = dtd; ++ ++ return 0; ++} ++ ++/* queues (submits) an I/O request to an endpoint */ ++static int ++fsl_ep_queue(struct usb_ep *_ep, struct usb_request *_req, gfp_t gfp_flags) ++{ ++ struct fsl_ep *ep = container_of(_ep, struct fsl_ep, ep); ++ struct fsl_req *req = container_of(_req, struct fsl_req, req); ++ struct fsl_udc *udc; ++ unsigned long flags; ++ int is_iso = 0; ++ ++ /* catch various bogus parameters */ ++ if (!_req || !req->req.complete || !req->req.buf ++ || !list_empty(&req->queue)) { ++ VDBG("%s, bad params\n", __FUNCTION__); ++ return -EINVAL; ++ } ++ if (!_ep || (!ep->desc && ep_index(ep))) { ++ VDBG("%s, bad ep\n", __FUNCTION__); ++ return -EINVAL; ++ } ++ if (ep->desc->bmAttributes == USB_ENDPOINT_XFER_ISOC) { ++ if (req->req.length > ep->ep.maxpacket) ++ return -EMSGSIZE; ++ is_iso = 1; ++ } ++ ++ udc = ep->udc; ++ if (!udc->driver || udc->gadget.speed == USB_SPEED_UNKNOWN) ++ return -ESHUTDOWN; ++ ++ req->ep = ep; ++ ++ /* map virtual address to hardware */ ++ if (req->req.dma == DMA_ADDR_INVALID) { ++ req->req.dma = dma_map_single(ep->udc->gadget.dev.parent, ++ req->req.buf, ++ req->req.length, ep_is_in(ep) ++ ? DMA_TO_DEVICE ++ : DMA_FROM_DEVICE); ++ req->mapped = 1; ++ } else { ++ dma_sync_single_for_device(ep->udc->gadget.dev.parent, ++ req->req.dma, req->req.length, ++ ep_is_in(ep) ++ ? DMA_TO_DEVICE ++ : DMA_FROM_DEVICE); ++ req->mapped = 0; ++ } ++ ++ req->req.status = -EINPROGRESS; ++ req->req.actual = 0; ++ req->dtd_count = 0; ++ ++ spin_lock_irqsave(&udc->lock, flags); ++ ++ /* build dtds and push them to device queue */ ++ if (!fsl_req_to_dtd(req)) { ++ fsl_queue_td(ep, req); ++ } else { ++ spin_unlock_irqrestore(&udc->lock, flags); ++ return -ENOMEM; ++ } ++ ++ /* Update ep0 state */ ++ if ((ep_index(ep) == 0)) ++ udc->ep0_state = DATA_STATE_XMIT; ++ ++ /* irq handler advances the queue */ ++ if (req != NULL) ++ list_add_tail(&req->queue, &ep->queue); ++ spin_unlock_irqrestore(&udc->lock, flags); ++ ++ return 0; ++} ++ ++/* dequeues (cancels, unlinks) an I/O request from an endpoint */ ++static int fsl_ep_dequeue(struct usb_ep *_ep, struct usb_request *_req) ++{ ++ struct fsl_ep *ep = container_of(_ep, struct fsl_ep, ep); ++ struct fsl_req *req; ++ unsigned long flags; ++ int ep_num, stopped, ret = 0; ++ u32 epctrl; ++ ++ if (!_ep || !_req) ++ return -EINVAL; ++ ++ spin_lock_irqsave(&ep->udc->lock, flags); ++ stopped = ep->stopped; ++ ++ /* Stop the ep before we deal with the queue */ ++ ep->stopped = 1; ++ ep_num = ep_index(ep); ++ epctrl = fsl_readl(&dr_regs->endptctrl[ep_num]); ++ if (ep_is_in(ep)) ++ epctrl &= ~EPCTRL_TX_ENABLE; ++ else ++ epctrl &= ~EPCTRL_RX_ENABLE; ++ fsl_writel(epctrl, &dr_regs->endptctrl[ep_num]); ++ ++ /* make sure it's actually queued on this endpoint */ ++ list_for_each_entry(req, &ep->queue, queue) { ++ if (&req->req == _req) ++ break; ++ } ++ if (&req->req != _req) { ++ ret = -EINVAL; ++ goto out; ++ } ++ ++ /* The request is in progress, or completed but not dequeued */ ++ if (ep->queue.next == &req->queue) { ++ _req->status = -ECONNRESET; ++ fsl_ep_fifo_flush(_ep); /* flush current transfer */ ++ ++ /* The request isn't the last request in this ep queue */ ++ if (req->queue.next != &ep->queue) { ++ struct ep_queue_head *qh; ++ struct fsl_req *next_req; ++ ++ qh = ep->qh; ++ next_req = list_entry(req->queue.next, struct fsl_req, ++ queue); ++ ++ /* Point the QH to the first TD of next request */ ++ fsl_writel((u32) next_req->head, &qh->curr_dtd_ptr); ++ } ++ ++ /* The request hasn't been processed, patch up the TD chain */ ++ } else { ++ struct fsl_req *prev_req; ++ ++ prev_req = list_entry(req->queue.prev, struct fsl_req, queue); ++ fsl_writel(fsl_readl(&req->tail->next_td_ptr), ++ &prev_req->tail->next_td_ptr); ++ ++ } ++ ++ done(ep, req, -ECONNRESET); ++ ++ /* Enable EP */ ++out: epctrl = fsl_readl(&dr_regs->endptctrl[ep_num]); ++ if (ep_is_in(ep)) ++ epctrl |= EPCTRL_TX_ENABLE; ++ else ++ epctrl |= EPCTRL_RX_ENABLE; ++ fsl_writel(epctrl, &dr_regs->endptctrl[ep_num]); ++ ep->stopped = stopped; ++ ++ spin_unlock_irqrestore(&ep->udc->lock, flags); ++ return ret; ++} ++ ++/*-------------------------------------------------------------------------*/ ++ ++/*----------------------------------------------------------------- ++ * modify the endpoint halt feature ++ * @ep: the non-isochronous endpoint being stalled ++ * @value: 1--set halt 0--clear halt ++ * Returns zero, or a negative error code. ++*----------------------------------------------------------------*/ ++static int fsl_ep_set_halt(struct usb_ep *_ep, int value) ++{ ++ struct fsl_ep *ep = NULL; ++ unsigned long flags = 0; ++ int status = -EOPNOTSUPP; /* operation not supported */ ++ unsigned char ep_dir = 0, ep_num = 0; ++ struct fsl_udc *udc = NULL; ++ ++ ep = container_of(_ep, struct fsl_ep, ep); ++ udc = ep->udc; ++ if (!_ep || !ep->desc) { ++ status = -EINVAL; ++ goto out; ++ } ++ ++ if (ep->desc->bmAttributes == USB_ENDPOINT_XFER_ISOC) { ++ status = -EOPNOTSUPP; ++ goto out; ++ } ++ ++ /* Attempt to halt IN ep will fail if any transfer requests ++ * are still queue */ ++ if (value && ep_is_in(ep) && !list_empty(&ep->queue)) { ++ status = -EAGAIN; ++ goto out; ++ } ++ ++ status = 0; ++ ep_dir = ep_is_in(ep) ? USB_SEND : USB_RECV; ++ ep_num = (unsigned char)(ep_index(ep)); ++ spin_lock_irqsave(&ep->udc->lock, flags); ++ dr_ep_change_stall(ep_num, ep_dir, value); ++ spin_unlock_irqrestore(&ep->udc->lock, flags); ++ ++ if (ep_index(ep) == 0) { ++ udc->ep0_state = WAIT_FOR_SETUP; ++ udc->ep0_dir = 0; ++ } ++out: ++ VDBG(" %s %s halt stat %d", ep->ep.name, ++ value ? "set" : "clear", status); ++ ++ return status; ++} ++ ++static void fsl_ep_fifo_flush(struct usb_ep *_ep) ++{ ++ struct fsl_ep *ep; ++ int ep_num, ep_dir; ++ u32 bits; ++ unsigned long timeout; ++#define FSL_UDC_FLUSH_TIMEOUT 1000 ++ ++ if (!_ep) { ++ return; ++ } else { ++ ep = container_of(_ep, struct fsl_ep, ep); ++ if (!ep->desc) ++ return; ++ } ++ ep_num = ep_index(ep); ++ ep_dir = ep_is_in(ep) ? USB_SEND : USB_RECV; ++ ++ if (ep_num == 0) ++ bits = (1 << 16) | 1; ++ else if (ep_dir == USB_SEND) ++ bits = 1 << (16 + ep_num); ++ else ++ bits = 1 << ep_num; ++ ++ timeout = jiffies + FSL_UDC_FLUSH_TIMEOUT; ++ do { ++ fsl_writel(bits, &dr_regs->endptflush); ++ ++ /* Wait until flush complete */ ++ while (fsl_readl(&dr_regs->endptflush)) { ++ if (time_after(jiffies, timeout)) { ++ ERR("ep flush timeout\n"); ++ return; ++ } ++ cpu_relax(); ++ } ++ /* See if we need to flush again */ ++ } while (fsl_readl(&dr_regs->endptstatus) & bits); ++} ++ ++static struct usb_ep_ops fsl_ep_ops = { ++ .enable = fsl_ep_enable, ++ .disable = fsl_ep_disable, ++ ++ .alloc_request = fsl_alloc_request, ++ .free_request = fsl_free_request, ++ ++ .queue = fsl_ep_queue, ++ .dequeue = fsl_ep_dequeue, ++ ++ .set_halt = fsl_ep_set_halt, ++ .fifo_flush = fsl_ep_fifo_flush, /* flush fifo */ ++}; ++ ++/*------------------------------------------------------------------------- ++ Gadget Driver Layer Operations ++-------------------------------------------------------------------------*/ ++ ++/*---------------------------------------------------------------------- ++ * Get the current frame number (from DR frame_index Reg ) ++ *----------------------------------------------------------------------*/ ++static int fsl_get_frame(struct usb_gadget *gadget) ++{ ++ return (int)(fsl_readl(&dr_regs->frindex) & USB_FRINDEX_MASKS); ++} ++ ++/*----------------------------------------------------------------------- ++ * Tries to wake up the host connected to this gadget ++ -----------------------------------------------------------------------*/ ++static int fsl_wakeup(struct usb_gadget *gadget) ++{ ++ struct fsl_udc *udc = container_of(gadget, struct fsl_udc, gadget); ++ u32 portsc; ++ ++ /* Remote wakeup feature not enabled by host */ ++ if (!udc->remote_wakeup) ++ return -ENOTSUPP; ++ ++ portsc = fsl_readl(&dr_regs->portsc1); ++ /* not suspended? */ ++ if (!(portsc & PORTSCX_PORT_SUSPEND)) ++ return 0; ++ /* trigger force resume */ ++ portsc |= PORTSCX_PORT_FORCE_RESUME; ++ fsl_writel(portsc, &dr_regs->portsc1); ++ return 0; ++} ++ ++static int can_pullup(struct fsl_udc *udc) ++{ ++ return udc->driver && udc->softconnect && udc->vbus_active; ++} ++ ++/* ++ * Notify controller that VBUS is powered, Called by whatever ++ * detects VBUS sessions ++ * @param gadger gadger pointer ++ * @param is_active is active? ++ * @return Returns zero on success , or a negative error code ++ */ ++static int fsl_vbus_session(struct usb_gadget *gadget, int is_active) ++{ ++ struct fsl_udc *udc; ++ unsigned long flags; ++ ++ udc = container_of(gadget, struct fsl_udc, gadget); ++ spin_lock_irqsave(&udc->lock, flags); ++ ++ pr_debug("udc: VBUS %s\n", is_active ? "on" : "off"); ++ udc->vbus_active = (is_active != 0); ++ ++ if (can_pullup(udc)) { ++ pullup_enable(udc); ++ udc_controller->usb_state = USB_STATE_ATTACHED; ++ } else { ++ pullup_disable(udc); ++ udc_controller->usb_state = USB_STATE_NOTATTACHED; ++ } ++ udc_controller->ep0_state = WAIT_FOR_SETUP; ++ udc_controller->ep0_dir = 0; ++ ++ spin_unlock_irqrestore(&udc->lock, flags); ++ return 0; ++} ++ ++/* constrain controller's VBUS power usage ++ * This call is used by gadget drivers during SET_CONFIGURATION calls, ++ * reporting how much power the device may consume. For example, this ++ * could affect how quickly batteries are recharged. ++ * ++ * Returns zero on success, else negative errno. ++ */ ++static int fsl_vbus_draw(struct usb_gadget *gadget, unsigned mA) ++{ ++#ifdef CONFIG_USB_OTG ++ struct fsl_udc *udc; ++ ++ udc = container_of(gadget, struct fsl_udc, gadget); ++ ++ if (udc->transceiver) ++ return otg_set_power(udc->transceiver, mA); ++#endif ++ return -ENOTSUPP; ++} ++ ++/* ++ * Change Data+ pullup status ++ * this func is used by usb_gadget_connect/disconnet ++ */ ++static int fsl_pullup(struct usb_gadget *gadget, int is_on) ++{ ++ struct fsl_udc *udc; ++ ++ udc = container_of(gadget, struct fsl_udc, gadget); ++ udc->softconnect = (is_on != 0); ++ if (can_pullup(udc)) ++ fsl_writel((fsl_readl(&dr_regs->usbcmd) | USB_CMD_RUN_STOP), ++ &dr_regs->usbcmd); ++ else ++ fsl_writel((fsl_readl(&dr_regs->usbcmd) & ~USB_CMD_RUN_STOP), ++ &dr_regs->usbcmd); ++ ++ return 0; ++} ++ ++/* defined in usb_gadget.h */ ++static struct usb_gadget_ops fsl_gadget_ops = { ++ .get_frame = fsl_get_frame, ++ .wakeup = fsl_wakeup, ++ .vbus_session = fsl_vbus_session, ++ .vbus_draw = fsl_vbus_draw, ++ .pullup = fsl_pullup, ++}; ++ ++/* Set protocol stall on ep0, protocol stall will automatically be cleared ++ on new transaction */ ++static void ep0stall(struct fsl_udc *udc) ++{ ++ u32 tmp; ++ ++ /* must set tx and rx to stall at the same time */ ++ tmp = fsl_readl(&dr_regs->endptctrl[0]); ++ tmp |= EPCTRL_TX_EP_STALL | EPCTRL_RX_EP_STALL; ++ fsl_writel(tmp, &dr_regs->endptctrl[0]); ++ udc->ep0_state = WAIT_FOR_SETUP; ++ udc->ep0_dir = 0; ++} ++ ++/* Prime a status phase for ep0 */ ++static int ep0_prime_status(struct fsl_udc *udc, int direction) ++{ ++ struct fsl_req *req = udc->status_req; ++ struct fsl_ep *ep; ++ int status = 0; ++ ++ if (direction == EP_DIR_IN) ++ udc->ep0_dir = USB_DIR_IN; ++ else ++ udc->ep0_dir = USB_DIR_OUT; ++ ++ ep = &udc->eps[0]; ++ udc->ep0_state = WAIT_FOR_OUT_STATUS; ++ ++ req->ep = ep; ++ req->req.length = 0; ++ req->req.status = -EINPROGRESS; ++ req->req.actual = 0; ++ req->req.complete = NULL; ++ req->dtd_count = 0; ++ ++ if (fsl_req_to_dtd(req) == 0) ++ status = fsl_queue_td(ep, req); ++ else ++ return -ENOMEM; ++ ++ if (status) ++ ERR("Can't queue ep0 status request \n"); ++ list_add_tail(&req->queue, &ep->queue); ++ ++ return status; ++} ++ ++static inline int udc_reset_ep_queue(struct fsl_udc *udc, u8 pipe) ++{ ++ struct fsl_ep *ep = get_ep_by_pipe(udc, pipe); ++ ++ if (!ep->name) ++ return 0; ++ ++ nuke(ep, -ESHUTDOWN); ++ ++ return 0; ++} ++ ++/* ++ * ch9 Set address ++ */ ++static void ch9setaddress(struct fsl_udc *udc, u16 value, u16 index, u16 length) ++{ ++ /* Save the new address to device struct */ ++ udc->device_address = (u8) value; ++ /* Update usb state */ ++ udc->usb_state = USB_STATE_ADDRESS; ++ /* Status phase */ ++ if (ep0_prime_status(udc, EP_DIR_IN)) ++ ep0stall(udc); ++} ++ ++/* ++ * ch9 Get status ++ */ ++static void ch9getstatus(struct fsl_udc *udc, u8 request_type, u16 value, ++ u16 index, u16 length) ++{ ++ u16 tmp = 0; /* Status, cpu endian */ ++ ++ struct fsl_req *req; ++ struct fsl_ep *ep; ++ int status = 0; ++ ++ ep = &udc->eps[0]; ++ ++ if ((request_type & USB_RECIP_MASK) == USB_RECIP_DEVICE) { ++ /* Get device status */ ++ tmp = 1 << USB_DEVICE_SELF_POWERED; ++ tmp |= udc->remote_wakeup << USB_DEVICE_REMOTE_WAKEUP; ++ } else if ((request_type & USB_RECIP_MASK) == USB_RECIP_INTERFACE) { ++ /* Get interface status */ ++ /* We don't have interface information in udc driver */ ++ tmp = 0; ++ } else if ((request_type & USB_RECIP_MASK) == USB_RECIP_ENDPOINT) { ++ /* Get endpoint status */ ++ struct fsl_ep *target_ep; ++ ++ target_ep = get_ep_by_pipe(udc, get_pipe_by_windex(index)); ++ ++ /* stall if endpoint doesn't exist */ ++ if (!target_ep->desc) ++ goto stall; ++ tmp = dr_ep_get_stall(ep_index(target_ep), ep_is_in(target_ep)) ++ << USB_ENDPOINT_HALT; ++ } ++ ++ udc->ep0_dir = USB_DIR_IN; ++ /* Borrow the per device status_req */ ++ req = udc->status_req; ++ /* Fill in the reqest structure */ ++ *((u16 *) req->req.buf) = cpu_to_le16(tmp); ++ req->ep = ep; ++ req->req.length = 2; ++ req->req.status = -EINPROGRESS; ++ req->req.actual = 0; ++ req->req.complete = NULL; ++ req->dtd_count = 0; ++ ++ /* prime the data phase */ ++ if ((fsl_req_to_dtd(req) == 0)) ++ status = fsl_queue_td(ep, req); ++ else /* no mem */ ++ goto stall; ++ ++ if (status) { ++ ERR("Can't respond to getstatus request \n"); ++ goto stall; ++ } ++ list_add_tail(&req->queue, &ep->queue); ++ udc->ep0_state = DATA_STATE_XMIT; ++ return; ++stall: ++ ep0stall(udc); ++} ++ ++static void ch9setconfig(struct fsl_udc *udc, u16 value, u16 index, ++ u16 length) ++{ ++ pr_debug("udc: 1 calling gadget driver->setup\n"); ++ udc->ep0_dir = USB_DIR_IN; ++ if (udc->driver->setup(&udc->gadget, &udc->local_setup_buff) >= 0) { ++ /* gadget layer deal with the status phase */ ++ udc->usb_state = USB_STATE_CONFIGURED; ++ udc->ep0_state = WAIT_FOR_OUT_STATUS; ++ pr_debug("udc: ep0_state now WAIT_FOR_OUT_STATUS\n"); ++ } ++} ++ ++static void setup_received_irq(struct fsl_udc *udc, ++ struct usb_ctrlrequest *setup) ++{ ++ u32 tmp; ++ u16 ptc = 0; /* port test control */ ++ int handled = 1; /* set to zero if we do not handle the message, ++ and should pass it to the gadget driver */ ++ ++ /* ++ * gadget drivers expect the setup pkt to be in wire format, ++ * so leave it alone and make local copies of stuff we need. ++ */ ++ u16 wValue = le16_to_cpu(setup->wValue); ++ u16 wIndex = le16_to_cpu(setup->wIndex); ++ u16 wLength = le16_to_cpu(setup->wLength); ++ ++ ++ pr_debug("udc: request=0x%x\n", setup->bRequest); ++ ++ udc_reset_ep_queue(udc, 0); ++ ++ /* We asume setup only occurs on EP0 */ ++ if (setup->bRequestType & USB_DIR_IN) ++ udc->ep0_dir = USB_DIR_IN; ++ else ++ udc->ep0_dir = USB_DIR_OUT; ++ ++ if ((setup->bRequestType & USB_TYPE_MASK) == USB_TYPE_CLASS) { ++ /* handle class requests */ ++ switch (setup->bRequest) { ++ ++ case USB_BULK_RESET_REQUEST: ++ udc->ep0_dir = USB_DIR_IN; ++ if (udc->driver->setup(&udc->gadget, ++ &udc->local_setup_buff) >= 0) { ++ udc->ep0_state = WAIT_FOR_SETUP; ++ pr_debug("udc: ep0_state now WAIT_FOR_SETUP\n"); ++ } ++ break; ++ ++ default: ++ handled = 0; ++ break; ++ } ++ } else if ((setup->bRequestType & USB_TYPE_MASK) == USB_TYPE_STANDARD) { ++ /* handle standard requests */ ++ switch (setup->bRequest) { ++ ++ case USB_REQ_GET_STATUS: ++ if ((setup-> ++ bRequestType & (USB_DIR_IN | USB_TYPE_STANDARD)) ++ != (USB_DIR_IN | USB_TYPE_STANDARD)) ++ break; ++ ch9getstatus(udc, setup->bRequestType, wValue, wIndex, ++ wLength); ++ break; ++ ++ case USB_REQ_SET_ADDRESS: ++ if (setup->bRequestType != ++ (USB_DIR_OUT | USB_TYPE_STANDARD | ++ USB_RECIP_DEVICE)) ++ break; ++ ch9setaddress(udc, wValue, wIndex, wLength); ++ break; ++ ++ case USB_REQ_SET_CONFIGURATION: ++ if (setup->bRequestType != ++ (USB_DIR_OUT | USB_TYPE_STANDARD | ++ USB_RECIP_DEVICE)) ++ break; ++ /* gadget layer take over the status phase */ ++ ch9setconfig(udc, wValue, wIndex, wLength); ++ break; ++ case USB_REQ_SET_INTERFACE: ++ if (setup->bRequestType != ++ (USB_DIR_OUT | USB_TYPE_STANDARD | ++ USB_RECIP_INTERFACE)) ++ break; ++ udc->ep0_dir = USB_DIR_IN; ++ if (udc->driver->setup(&udc->gadget, ++ &udc->local_setup_buff) >= 0) ++ /* gadget layer take over the status phase */ ++ break; ++ /* Requests with no data phase */ ++ case USB_REQ_CLEAR_FEATURE: ++ case USB_REQ_SET_FEATURE: ++ { /* status transaction */ ++ int rc = -EOPNOTSUPP; ++ ++ if ((setup->bRequestType & USB_TYPE_MASK) != ++ USB_TYPE_STANDARD) ++ break; ++ ++ /* we only support set/clear feature for ++ * endpoint */ ++ if (setup->bRequestType == USB_RECIP_ENDPOINT) { ++ int dir = (wIndex & 0x0080) ? ++ EP_DIR_IN : EP_DIR_OUT; ++ int num = (wIndex & 0x000f); ++ struct fsl_ep *ep; ++ ++ if (wValue != 0 ++ || wLength != 0 ++ || (num * 2 + dir) > udc->max_ep) ++ break; ++ ep = &udc->eps[num * 2 + dir]; ++ ++ if (setup->bRequest == ++ USB_REQ_SET_FEATURE) { ++ pr_debug("udc: udc: SET_FEATURE" ++ " doing set_halt\n"); ++ rc = fsl_ep_set_halt(&ep-> ep, ++ 1); ++ } else { ++ pr_debug("udc: CLEAR_FEATURE" ++ " doing clear_halt\n"); ++ rc = fsl_ep_set_halt(&ep-> ep, ++ 0); ++ } ++ ++ } else if (setup->bRequestType == ++ USB_RECIP_DEVICE) { ++ if (setup->bRequest == ++ USB_REQ_SET_FEATURE) { ++ ptc = wIndex >> 8; ++ rc = 0; ++ } ++ if (!udc->gadget.is_otg) ++ break; ++ else if (setup->bRequest == ++ USB_DEVICE_B_HNP_ENABLE) ++ udc->gadget.b_hnp_enable = 1; ++ else if (setup->bRequest == ++ USB_DEVICE_A_HNP_SUPPORT) ++ udc->gadget.a_hnp_support = 1; ++ else if (setup->bRequest == ++ USB_DEVICE_A_ALT_HNP_SUPPORT) ++ udc->gadget.a_alt_hnp_support = ++ 1; ++ rc = 0; ++ } ++ if (rc == 0) { ++ /* send status only if ++ * fsl_ep_set_halt success */ ++ if (ep0_prime_status(udc, EP_DIR_IN)) ++ ep0stall(udc); ++ } ++ break; ++ } ++ default: ++ handled = 0; ++ break; ++ } ++ } else { ++ /* vendor requests */ ++ handled = 0; ++ } ++ ++ if (!handled) { ++ if (udc->driver->setup(&udc->gadget, &udc->local_setup_buff) ++ != 0) { ++ ep0stall(udc); ++ } else if (setup->bRequestType & USB_DIR_IN) { ++ udc->ep0_state = DATA_STATE_XMIT; ++ pr_debug("udc: ep0_state now DATA_STATE_XMIT\n"); ++ } else { ++ udc->ep0_state = DATA_STATE_RECV; ++ pr_debug("udc: ep0_state now DATA_STATE_RECV\n"); ++ } ++ } ++ ++ if (ptc) { ++ tmp =fsl_readl(&dr_regs->portsc1) | ptc << 16; ++ fsl_writel(tmp, &dr_regs->portsc1); ++ pr_debug("udc: switch to test mode.\n"); ++ } ++} ++ ++/* Process request for Data or Status phase of ep0 ++ * prime status phase if needed */ ++static void ep0_req_complete(struct fsl_udc *udc, struct fsl_ep *ep0, ++ struct fsl_req *req) ++{ ++ if (udc->usb_state == USB_STATE_ADDRESS) { ++ /* Set the new address */ ++ u32 new_address = (u32) udc->device_address; ++ fsl_writel(new_address << USB_DEVICE_ADDRESS_BIT_POS, ++ &dr_regs->deviceaddr); ++ } ++ ++ done(ep0, req, 0); ++ ++ switch (udc->ep0_state) { ++ case DATA_STATE_XMIT: ++ /* receive status phase */ ++ if (ep0_prime_status(udc, EP_DIR_OUT)) ++ ep0stall(udc); ++ break; ++ case DATA_STATE_RECV: ++ /* send status phase */ ++ if (ep0_prime_status(udc, EP_DIR_IN)) ++ ep0stall(udc); ++ break; ++ case WAIT_FOR_OUT_STATUS: ++ udc->ep0_state = WAIT_FOR_SETUP; ++ break; ++ case WAIT_FOR_SETUP: ++ ERR("Unexpect ep0 packets \n"); ++ break; ++ default: ++ ep0stall(udc); ++ break; ++ } ++} ++ ++/* Tripwire mechanism to ensure a setup packet payload is extracted without ++ * being corrupted by another incoming setup packet */ ++static void tripwire_handler(struct fsl_udc *udc, u8 ep_num, u8 *buffer_ptr) ++{ ++ u32 temp; ++ struct ep_queue_head *qh; ++ struct fsl_usb2_platform_data *pdata = udc->pdata; ++ ++ qh = &udc->ep_qh[ep_num * 2 + EP_DIR_OUT]; ++ ++ /* Clear bit in ENDPTSETUPSTAT */ ++ temp = fsl_readl(&dr_regs->endptsetupstat); ++ fsl_writel(temp | (1 << ep_num), &dr_regs->endptsetupstat); ++ ++ /* while a hazard exists when setup package arrives */ ++ do { ++ /* Set Setup Tripwire */ ++ temp = fsl_readl(&dr_regs->usbcmd); ++ fsl_writel(temp | USB_CMD_SUTW, &dr_regs->usbcmd); ++ ++ /* Copy the setup packet to local buffer */ ++ if (pdata->le_setup_buf) { ++ u32 *p = (u32 *)buffer_ptr; ++ u32 *s = (u32 *)qh->setup_buffer; ++ ++ /* Convert little endian setup buffer to CPU endian */ ++ *p++ = le32_to_cpu(*s++); ++ *p = le32_to_cpu(*s); ++ } else { ++ memcpy(buffer_ptr, (u8 *) qh->setup_buffer, 8); ++ } ++ } while (!(fsl_readl(&dr_regs->usbcmd) & USB_CMD_SUTW)); ++ ++ /* Clear Setup Tripwire */ ++ temp = fsl_readl(&dr_regs->usbcmd); ++ fsl_writel(temp & ~USB_CMD_SUTW, &dr_regs->usbcmd); ++} ++ ++/* process-ep_req(): free the completed Tds for this req */ ++static int process_ep_req(struct fsl_udc *udc, int pipe, ++ struct fsl_req *curr_req) ++{ ++ struct ep_td_struct *curr_td; ++ int td_complete, actual, remaining_length, j, tmp; ++ int status = 0; ++ int errors = 0; ++ struct ep_queue_head *curr_qh = &udc->ep_qh[pipe]; ++ int direction = pipe % 2; ++ ++ curr_td = curr_req->head; ++ td_complete = 0; ++ actual = curr_req->req.length; ++ ++ for (j = 0; j < curr_req->dtd_count; j++) { ++ remaining_length = (hc32_to_cpu(curr_td->size_ioc_sts) ++ & DTD_PACKET_SIZE) ++ >> DTD_LENGTH_BIT_POS; ++ actual -= remaining_length; ++ ++ (errors = hc32_to_cpu(curr_td->size_ioc_sts) & DTD_ERROR_MASK); ++ if (errors) { ++ if (errors & DTD_STATUS_HALTED) { ++ ERR("dTD error %08x QH=%d\n", errors, pipe); ++ /* Clear the errors and Halt condition */ ++ tmp = hc32_to_cpu(curr_qh->size_ioc_int_sts); ++ tmp &= ~errors; ++ curr_qh->size_ioc_int_sts = cpu_to_hc32(tmp); ++ status = -EPIPE; ++ /* FIXME: continue with next queued TD? */ ++ ++ break; ++ } ++ if (errors & DTD_STATUS_DATA_BUFF_ERR) { ++ VDBG("Transfer overflow"); ++ status = -EPROTO; ++ break; ++ } else if (errors & DTD_STATUS_TRANSACTION_ERR) { ++ VDBG("ISO error"); ++ status = -EILSEQ; ++ break; ++ } else ++ ERR("Unknown error has occured (0x%x)!\r\n", ++ errors); ++ ++ } else if (hc32_to_cpu(curr_td->size_ioc_sts) & ++ DTD_STATUS_ACTIVE) { ++ VDBG("Request not complete"); ++ status = REQ_UNCOMPLETE; ++ return status; ++ } else if (remaining_length) { ++ if (direction) { ++ VDBG("Transmit dTD remaining length not zero"); ++ status = -EPROTO; ++ break; ++ } else { ++ td_complete++; ++ break; ++ } ++ } else { ++ td_complete++; ++ VDBG("dTD transmitted successful "); ++ } ++ ++ if (j != curr_req->dtd_count - 1) ++ curr_td = curr_td->next_td_virt; ++ } ++ ++ if (status) ++ return status; ++ ++ curr_req->req.actual = actual; ++ ++ return 0; ++} ++ ++/* Process a DTD completion interrupt */ ++static void dtd_complete_irq(struct fsl_udc *udc) ++{ ++ u32 bit_pos; ++ int i, ep_num, direction, bit_mask, status; ++ struct fsl_ep *curr_ep; ++ struct fsl_req *curr_req, *temp_req; ++ ++ /* Clear the bits in the register */ ++ bit_pos = fsl_readl(&dr_regs->endptcomplete); ++ fsl_writel(bit_pos, &dr_regs->endptcomplete); ++ ++ if (!bit_pos) ++ return; ++ ++ for (i = 0; i < udc->max_ep * 2; i++) { ++ ep_num = i >> 1; ++ direction = i % 2; ++ ++ bit_mask = 1 << (ep_num + 16 * direction); ++ ++ if (!(bit_pos & bit_mask)) ++ continue; ++ ++ curr_ep = get_ep_by_pipe(udc, i); ++ ++ /* If the ep is configured */ ++ if (curr_ep->name == NULL) { ++ WARN("Invalid EP?"); ++ continue; ++ } ++ ++ /* process the req queue until an uncomplete request */ ++ list_for_each_entry_safe(curr_req, temp_req, &curr_ep->queue, ++ queue) { ++ status = process_ep_req(udc, i, curr_req); ++ ++ VDBG("status of process_ep_req= %d, ep = %d", ++ status, ep_num); ++ if (status == REQ_UNCOMPLETE) ++ break; ++ /* write back status to req */ ++ curr_req->req.status = status; ++ ++ if (ep_num == 0) { ++ ep0_req_complete(udc, curr_ep, curr_req); ++ break; ++ } else { ++ done(curr_ep, curr_req, status); ++ } ++ } ++ } ++} ++ ++/* Process a port change interrupt */ ++static void port_change_irq(struct fsl_udc *udc) ++{ ++ u32 speed; ++ ++ VDBG("portsc=0x%x", fsl_readl(&dr_regs->portsc1) ); ++ if (udc->bus_reset) ++ udc->bus_reset = 0; ++ ++ /* Bus resetting is finished */ ++ if (!(fsl_readl(&dr_regs->portsc1) & PORTSCX_PORT_RESET)) { ++ /* Get the speed */ ++ speed = fsl_readl(&dr_regs->portsc1) & PORTSCX_PORT_SPEED_MASK; ++ switch (speed) { ++ case PORTSCX_PORT_SPEED_HIGH: ++ udc->gadget.speed = USB_SPEED_HIGH; ++ break; ++ case PORTSCX_PORT_SPEED_FULL: ++ udc->gadget.speed = USB_SPEED_FULL; ++ break; ++ case PORTSCX_PORT_SPEED_LOW: ++ udc->gadget.speed = USB_SPEED_LOW; ++ break; ++ default: ++ udc->gadget.speed = USB_SPEED_UNKNOWN; ++ break; ++ } ++ } ++ ++ /* Update USB state */ ++ if (!udc->resume_state) ++ udc->usb_state = USB_STATE_DEFAULT; ++} ++ ++/* Process suspend interrupt */ ++static void suspend_irq(struct fsl_udc *udc) ++{ ++ udc->resume_state = udc->usb_state; ++ udc->usb_state = USB_STATE_SUSPENDED; ++ ++ /* report suspend to the driver, serial.c does not support this */ ++ if (udc->driver->suspend) ++ udc->driver->suspend(&udc->gadget); ++} ++ ++static void bus_resume(struct fsl_udc *udc) ++{ ++ udc->usb_state = udc->resume_state; ++ udc->resume_state = 0; ++ ++ /* report resume to the driver, serial.c does not support this */ ++ if (udc->driver->resume) ++ udc->driver->resume(&udc->gadget); ++} ++ ++/* Clear up all ep queues */ ++static int reset_queues(struct fsl_udc *udc) ++{ ++ u8 pipe; ++ ++ for (pipe = 0; pipe < udc->max_pipes; pipe++) ++ udc_reset_ep_queue(udc, pipe); ++ ++ /* report disconnect; the driver is already quiesced */ ++ udc->driver->disconnect(&udc->gadget); ++ ++ return 0; ++} ++ ++/* Process reset interrupt */ ++static void reset_irq(struct fsl_udc *udc) ++{ ++ u32 temp; ++ unsigned long timeout; ++ ++ /* Clear the device address */ ++ temp = fsl_readl(&dr_regs->deviceaddr); ++ fsl_writel(temp & ~USB_DEVICE_ADDRESS_MASK, &dr_regs->deviceaddr); ++ ++ udc->device_address = 0; ++ ++ /* Clear usb state */ ++ udc->resume_state = 0; ++ udc->ep0_dir = 0; ++ udc->ep0_state = WAIT_FOR_SETUP; ++ udc->remote_wakeup = 0; /* default to 0 on reset */ ++ udc->gadget.b_hnp_enable = 0; ++ udc->gadget.a_hnp_support = 0; ++ udc->gadget.a_alt_hnp_support = 0; ++ ++ /* Clear all the setup token semaphores */ ++ temp = fsl_readl(&dr_regs->endptsetupstat); ++ fsl_writel(temp, &dr_regs->endptsetupstat); ++ ++ /* Clear all the endpoint complete status bits */ ++ temp = fsl_readl(&dr_regs->endptcomplete); ++ fsl_writel(temp, &dr_regs->endptcomplete); ++ ++ timeout = jiffies + 100; ++ while (fsl_readl(&dr_regs->endpointprime)) { ++ /* Wait until all endptprime bits cleared */ ++ if (time_after(jiffies, timeout)) { ++ ERR("Timeout for reset\n"); ++ break; ++ } ++ cpu_relax(); ++ } ++ ++ /* Write 1s to the flush register */ ++ fsl_writel(0xffffffff, &dr_regs->endptflush); ++ ++ if (fsl_readl(&dr_regs->portsc1) & PORTSCX_PORT_RESET) { ++ VDBG("Bus reset"); ++ /* Bus is reseting */ ++ udc->bus_reset = 1; ++ /* Reset all the queues, include XD, dTD, EP queue ++ * head and TR Queue */ ++ reset_queues(udc); ++ udc->usb_state = USB_STATE_DEFAULT; ++ } else { ++ VDBG("Controller reset"); ++ /* initialize usb hw reg except for regs for EP, not ++ * touch usbintr reg */ ++ dr_controller_setup(udc); ++ ++ /* Reset all internal used Queues */ ++ reset_queues(udc); ++ ++ ep0_setup(udc); ++ ++ /* Enable DR IRQ reg, Set Run bit, change udc state */ ++ dr_controller_run(udc); ++ udc->usb_state = USB_STATE_ATTACHED; ++ } ++} ++ ++/* ++ * USB device controller interrupt handler ++ */ ++static irqreturn_t fsl_udc_irq(int irq, void *_udc) ++{ ++ struct fsl_udc *udc = _udc; ++ u32 irq_src; ++ irqreturn_t status = IRQ_NONE; ++ unsigned long flags; ++ ++ /* Disable ISR for OTG host mode */ ++ if (udc->stopped) ++ return IRQ_NONE; ++ spin_lock_irqsave(&udc->lock, flags); ++ irq_src = fsl_readl(&dr_regs->usbsts) & fsl_readl(&dr_regs->usbintr); ++ /* Clear notification bits */ ++ fsl_writel(irq_src, &dr_regs->usbsts); ++ ++ VDBG("irq_src [0x%8x] portsc=0x%x", irq_src, ++ fsl_readl(&dr_regs->portsc1)); ++ ++ /* Need to resume? */ ++ if (udc->usb_state == USB_STATE_SUSPENDED) ++ if ((fsl_readl(&dr_regs->portsc1) & PORTSCX_PORT_SUSPEND) == 0) ++ bus_resume(udc); ++ ++ /* USB Interrupt */ ++ if (irq_src & USB_STS_INT) { ++ VDBG("Packet int"); ++ /* Setup package, we only support ep0 as control ep */ ++ if (fsl_readl(&dr_regs->endptsetupstat) & EP_SETUP_STATUS_EP0) { ++ tripwire_handler(udc, 0, ++ (u8 *) (&udc->local_setup_buff)); ++ setup_received_irq(udc, &udc->local_setup_buff); ++ status = IRQ_HANDLED; ++ } ++ ++ /* completion of dtd */ ++ if (fsl_readl(&dr_regs->endptcomplete)) { ++ dtd_complete_irq(udc); ++ status = IRQ_HANDLED; ++ } ++ } ++ ++ /* SOF (for ISO transfer) */ ++ if (irq_src & USB_STS_SOF) { ++ status = IRQ_HANDLED; ++ } ++ ++ /* Port Change */ ++ if (irq_src & USB_STS_PORT_CHANGE) { ++ port_change_irq(udc); ++ status = IRQ_HANDLED; ++ } ++ ++ /* Reset Received */ ++ if (irq_src & USB_STS_RESET) { ++ reset_irq(udc); ++ status = IRQ_HANDLED; ++ } ++ ++ /* Sleep Enable (Suspend) */ ++ if (irq_src & USB_STS_SUSPEND) { ++ suspend_irq(udc); ++ status = IRQ_HANDLED; ++ } ++ ++ if (irq_src & (USB_STS_ERR | USB_STS_SYS_ERR)) { ++ VDBG("Error IRQ %x ", irq_src); ++ } ++ ++ spin_unlock_irqrestore(&udc->lock, flags); ++ return status; ++} ++ ++/*----------------------------------------------------------------* ++ * Hook to gadget drivers ++ * Called by initialization code of gadget drivers ++*----------------------------------------------------------------*/ ++int usb_gadget_register_driver(struct usb_gadget_driver *driver) ++{ ++ int retval = -ENODEV; ++ unsigned long flags = 0; ++ struct fsl_udc *udc = udc_controller; ++ ++ pr_debug("udc: udc=0x%p\n", udc); ++ ++ if (!udc) ++ return -ENODEV; ++ ++ if (!driver || (driver->speed != USB_SPEED_FULL ++ && driver->speed != USB_SPEED_HIGH) ++ || !driver->bind || !driver->disconnect ++ || !driver->setup) ++ return -EINVAL; ++ ++ if (udc->driver) ++ return -EBUSY; ++ ++ /* lock is needed but whether should use this lock or another */ ++ spin_lock_irqsave(&udc->lock, flags); ++ ++ driver->driver.bus = 0; ++ udc->softconnect = 1; ++ /* hook up the driver */ ++ udc->driver = driver; ++ udc->gadget.dev.driver = &driver->driver; ++ spin_unlock_irqrestore(&udc->lock, flags); ++ ++ /* bind udc driver to gadget driver */ ++ retval = driver->bind(&udc->gadget); ++ if (retval) { ++ pr_debug("bind to %s --> %d\n", driver->driver.name, retval); ++ udc->gadget.dev.driver = 0; ++ udc->driver = 0; ++ goto out; ++ } ++ ++ /* Enable DR IRQ reg and Set usbcmd reg Run bit */ ++ if (udc->transceiver) { ++ /* Suspend the controller until OTG enables it */ ++ udc_suspend(udc); ++ pr_debug("udc: suspend udc for OTG auto detect \n"); ++ ++ /* Export udc suspend/resume call to OTG */ ++ udc->gadget.dev.parent->driver->suspend = fsl_udc_suspend; ++ udc->gadget.dev.parent->driver->resume = fsl_udc_resume; ++ ++ retval = otg_set_peripheral(udc->transceiver, &udc->gadget); ++ if (retval < 0) { ++ printk(KERN_ERR "can't bind to transceiver\n"); ++ driver->unbind(&udc->gadget); ++ udc->gadget.dev.driver = 0; ++ udc->driver = 0; ++ return retval; ++ } ++ } else { ++ /* Enable DR IRQ reg and Set usbcmd reg Run bit */ ++ dr_controller_run(udc); ++ udc->usb_state = USB_STATE_ATTACHED; ++ udc->ep0_state = WAIT_FOR_SETUP; ++ pr_debug("udc: ep0_state now WAIT_FOR_SETUP\n"); ++ udc->ep0_dir = 0; ++ } ++ ++ printk(KERN_INFO "%s: bind to driver %s \n", udc->gadget.name, ++ driver->driver.name); ++ ++out: ++ return retval; ++} ++EXPORT_SYMBOL(usb_gadget_register_driver); ++ ++/* Disconnect from gadget driver */ ++int usb_gadget_unregister_driver(struct usb_gadget_driver *driver) ++{ ++ struct fsl_ep *loop_ep; ++ unsigned long flags; ++ ++ if (!udc_controller) ++ return -ENODEV; ++ ++ if (!driver || driver != udc_controller->driver || !driver->unbind) ++ return -EINVAL; ++ ++#ifdef CONFIG_USB_OTG ++ if (udc_controller->transceiver) ++ (void)otg_set_peripheral(udc_controller->transceiver, 0); ++#endif ++ ++ /* stop DR, disable intr */ ++ dr_controller_stop(udc_controller); ++ ++ /* in fact, no needed */ ++ udc_controller->usb_state = USB_STATE_ATTACHED; ++ udc_controller->ep0_state = WAIT_FOR_SETUP; ++ udc_controller->ep0_dir = 0; ++ ++ /* stand operation */ ++ spin_lock_irqsave(&udc_controller->lock, flags); ++ udc_controller->gadget.speed = USB_SPEED_UNKNOWN; ++ nuke(&udc_controller->eps[0], -ESHUTDOWN); ++ list_for_each_entry(loop_ep, &udc_controller->gadget.ep_list, ++ ep.ep_list) ++ nuke(loop_ep, -ESHUTDOWN); ++ spin_unlock_irqrestore(&udc_controller->lock, flags); ++ ++ /* unbind gadget and unhook driver. */ ++ driver->unbind(&udc_controller->gadget); ++ udc_controller->gadget.dev.driver = 0; ++ udc_controller->driver = 0; ++ ++ printk(KERN_INFO "unregistered gadget '%s'\n", driver->driver.name); ++ return 0; ++} ++EXPORT_SYMBOL(usb_gadget_unregister_driver); ++ ++/*------------------------------------------------------------------------- ++ PROC File System Support ++-------------------------------------------------------------------------*/ ++#ifdef CONFIG_USB_GADGET_DEBUG_FILES ++ ++#include <linux/seq_file.h> ++ ++static const char proc_filename[] = "driver/fsl_usb2_udc"; ++ ++static int fsl_proc_read(char *page, char **start, off_t off, int count, ++ int *eof, void *_dev) ++{ ++ char *buf = page; ++ char *next = buf; ++ unsigned size = count; ++ unsigned long flags; ++ int t, i; ++ u32 tmp_reg; ++ struct fsl_ep *ep = NULL; ++ struct fsl_req *req; ++ ++ struct fsl_udc *udc = udc_controller; ++ if (off != 0) ++ return 0; ++ ++ spin_lock_irqsave(&udc->lock, flags); ++ ++ /* ------basic driver infomation ---- */ ++ t = scnprintf(next, size, ++ DRIVER_DESC "\n" ++ "%s version: %s\n" ++ "Gadget driver: %s\n\n", ++ driver_name, DRIVER_VERSION, ++ udc->driver ? udc->driver->driver.name : "(none)"); ++ size -= t; ++ next += t; ++ ++ /* ------ DR Registers ----- */ ++ tmp_reg = fsl_readl(&dr_regs->usbcmd); ++ t = scnprintf(next, size, ++ "USBCMD reg: 0x%08x\n" ++ "\tSetupTW: %d\n" ++ "\tRun/Stop: %s\n\n", ++ tmp_reg, ++ (tmp_reg & USB_CMD_SUTW) ? 1 : 0, ++ (tmp_reg & USB_CMD_RUN_STOP) ? "Run" : "Stop"); ++ size -= t; ++ next += t; ++ ++ tmp_reg = fsl_readl(&dr_regs->usbsts); ++ t = scnprintf(next, size, ++ "USB Status Reg: 0x%08x\n" ++ "\tDr Suspend: %d Reset Received: %d " ++ "System Error: %s USB Error Interrupt: %s\n\n", ++ tmp_reg, ++ (tmp_reg & USB_STS_SUSPEND) ? 1 : 0, ++ (tmp_reg & USB_STS_RESET) ? 1 : 0, ++ (tmp_reg & USB_STS_SYS_ERR) ? "Err" : "Normal", ++ (tmp_reg & USB_STS_ERR) ? "Err detected" : "No err"); ++ size -= t; ++ next += t; ++ ++ tmp_reg = fsl_readl(&dr_regs->usbintr); ++ t = scnprintf(next, size, ++ "USB Interrupt Enable Reg: 0x%08x\n" ++ "\tSleep Enable: %d SOF Received Enable: %d " ++ "Reset Enable: %d\n" ++ "\tSystem Error Enable: %d " ++ "Port Change Dectected Enable: %d\n" ++ "\tUSB Error Intr Enable: %d USB Intr Enable: %d\n\n", ++ tmp_reg, ++ (tmp_reg & USB_INTR_DEVICE_SUSPEND) ? 1 : 0, ++ (tmp_reg & USB_INTR_SOF_EN) ? 1 : 0, ++ (tmp_reg & USB_INTR_RESET_EN) ? 1 : 0, ++ (tmp_reg & USB_INTR_SYS_ERR_EN) ? 1 : 0, ++ (tmp_reg & USB_INTR_PTC_DETECT_EN) ? 1 : 0, ++ (tmp_reg & USB_INTR_ERR_INT_EN) ? 1 : 0, ++ (tmp_reg & USB_INTR_INT_EN) ? 1 : 0); ++ size -= t; ++ next += t; ++ ++ tmp_reg = fsl_readl(&dr_regs->frindex); ++ t = scnprintf(next, size, ++ "USB Frame Index Reg: Frame Number is 0x%x\n\n", ++ (tmp_reg & USB_FRINDEX_MASKS)); ++ size -= t; ++ next += t; ++ ++ tmp_reg = fsl_readl(&dr_regs->deviceaddr); ++ t = scnprintf(next, size, ++ "USB Device Address Reg: Device Addr is 0x%x\n\n", ++ (tmp_reg & USB_DEVICE_ADDRESS_MASK)); ++ size -= t; ++ next += t; ++ ++ tmp_reg = fsl_readl(&dr_regs->endpointlistaddr); ++ t = scnprintf(next, size, ++ "USB Endpoint List Address Reg:" ++ "Device Addr is 0x%x\n\n", ++ (tmp_reg & USB_EP_LIST_ADDRESS_MASK)); ++ size -= t; ++ next += t; ++ ++ tmp_reg = fsl_readl(&dr_regs->portsc1); ++ t = scnprintf(next, size, ++ "USB Port Status&Control Reg:\n" ++ "\tPort Transceiver Type : %s" "Port Speed: %s \n" ++ "\tPHY Low Power Suspend: %s" "Port Reset: %s " ++ "Port Suspend Mode: %s \n" "\tOver-current Change: %s " ++ "Port Enable/Disable Change: %s\n" ++ "\tPort Enabled/Disabled: %s" ++ "Current Connect Status: %s\n\n", ( { ++ char *s; ++ switch (tmp_reg & PORTSCX_PTS_FSLS) { ++ case PORTSCX_PTS_UTMI: ++ s = "UTMI"; break; ++ case PORTSCX_PTS_ULPI: ++ s = "ULPI "; break; ++ case PORTSCX_PTS_FSLS: ++ s = "FS/LS Serial"; break; ++ default: ++ s = "None"; break; ++ } ++ s; } ), ( { ++ char *s; ++ switch (tmp_reg & PORTSCX_PORT_SPEED_UNDEF) { ++ case PORTSCX_PORT_SPEED_FULL: ++ s = "Full Speed"; break; ++ case PORTSCX_PORT_SPEED_LOW: ++ s = "Low Speed"; break; ++ case PORTSCX_PORT_SPEED_HIGH: ++ s = "High Speed"; break; ++ default: ++ s = "Undefined"; break; ++ } ++ s; ++ } ), ++ (tmp_reg & PORTSCX_PHY_LOW_POWER_SPD) ? ++ "Normal PHY mode" : "Low power mode", ++ (tmp_reg & PORTSCX_PORT_RESET) ? "In Reset" : ++ "Not in Reset", ++ (tmp_reg & PORTSCX_PORT_SUSPEND) ? "In " : "Not in", ++ (tmp_reg & PORTSCX_OVER_CURRENT_CHG) ? "Dected" : ++ "No", ++ (tmp_reg & PORTSCX_PORT_EN_DIS_CHANGE) ? "Disable" : ++ "Not change", ++ (tmp_reg & PORTSCX_PORT_ENABLE) ? "Enable" : ++ "Not correct", ++ (tmp_reg & PORTSCX_CURRENT_CONNECT_STATUS) ? ++ "Attached" : "Not-Att"); ++ size -= t; ++ next += t; ++ ++ tmp_reg = fsl_readl(&dr_regs->usbmode); ++ t = scnprintf(next, size, ++ "USB Mode Reg:" "Controller Mode is : %s\n\n", ( { ++ char *s; ++ switch (tmp_reg & USB_MODE_CTRL_MODE_HOST) { ++ case USB_MODE_CTRL_MODE_IDLE: ++ s = "Idle"; break; ++ case USB_MODE_CTRL_MODE_DEVICE: ++ s = "Device Controller"; break; ++ case USB_MODE_CTRL_MODE_HOST: ++ s = "Host Controller"; break; ++ default: ++ s = "None"; break; ++ } ++ s; ++ } )); ++ size -= t; ++ next += t; ++ ++ tmp_reg = fsl_readl(&dr_regs->endptsetupstat); ++ t = scnprintf(next, size, ++ "Endpoint Setup Status Reg:" "SETUP on ep 0x%x\n\n", ++ (tmp_reg & EP_SETUP_STATUS_MASK)); ++ size -= t; ++ next += t; ++ ++ for (i = 0; i < udc->max_ep / 2; i++) { ++ tmp_reg = fsl_readl(&dr_regs->endptctrl[i]); ++ t = scnprintf(next, size, "EP Ctrl Reg [0x%x]: = [0x%x]\n", ++ i, tmp_reg); ++ size -= t; ++ next += t; ++ } ++ tmp_reg = fsl_readl(&dr_regs->endpointprime); ++ t = scnprintf(next, size, "EP Prime Reg = [0x%x]\n", tmp_reg); ++ size -= t; ++ next += t; ++ ++#ifdef HAVE_SYS_REGS ++ tmp_reg = usb_sys_regs->snoop1; ++ t = scnprintf(next, size, "\nSnoop1 Reg : = [0x%x]\n\n", tmp_reg); ++ size -= t; ++ next += t; ++ ++ tmp_reg = usb_sys_regs->control; ++ t = scnprintf(next, size, "General Control Reg : = [0x%x]\n\n", ++ tmp_reg); ++ size -= t; ++ next += t; ++#endif ++ ++ /* ------fsl_udc, fsl_ep, fsl_request structure information ----- */ ++ ep = &udc->eps[0]; ++ t = scnprintf(next, size, "For %s Maxpkt is 0x%x index is 0x%x\n", ++ ep->ep.name, ep_maxpacket(ep), ep_index(ep)); ++ size -= t; ++ next += t; ++ ++ if (list_empty(&ep->queue)) { ++ t = scnprintf(next, size, "its req queue is empty\n\n"); ++ size -= t; ++ next += t; ++ } else { ++ list_for_each_entry(req, &ep->queue, queue) { ++ t = scnprintf(next, size, ++ "req %p actual 0x%x length 0x%x buf %p\n", ++ &req->req, req->req.actual, ++ req->req.length, req->req.buf); ++ size -= t; ++ next += t; ++ } ++ } ++ /* other gadget->eplist ep */ ++ list_for_each_entry(ep, &udc->gadget.ep_list, ep.ep_list) { ++ if (ep->desc) { ++ t = scnprintf(next, size, ++ "\nFor %s Maxpkt is 0x%x " ++ "index is 0x%x\n", ++ ep->ep.name, ep_maxpacket(ep), ++ ep_index(ep)); ++ size -= t; ++ next += t; ++ ++ if (list_empty(&ep->queue)) { ++ t = scnprintf(next, size, ++ "its req queue is empty\n\n"); ++ size -= t; ++ next += t; ++ } else { ++ list_for_each_entry(req, &ep->queue, queue) { ++ t = scnprintf(next, size, ++ "req %p actual 0x%x length" ++ "0x%x buf %p\n", ++ &req->req, req->req.actual, ++ req->req.length, req->req.buf); ++ size -= t; ++ next += t; ++ } /* end for each_entry of ep req */ ++ } /* end for else */ ++ } /* end for if(ep->queue) */ ++ } /* end (ep->desc) */ ++ ++ spin_unlock_irqrestore(&udc->lock, flags); ++ ++ *eof = 1; ++ return count - size; ++} ++ ++#define create_proc_file() create_proc_read_entry(proc_filename, \ ++ 0, NULL, fsl_proc_read, NULL) ++ ++#define remove_proc_file() remove_proc_entry(proc_filename, NULL) ++ ++#else /* !CONFIG_USB_GADGET_DEBUG_FILES */ ++ ++#define create_proc_file() do {} while (0) ++#define remove_proc_file() do {} while (0) ++ ++#endif /* CONFIG_USB_GADGET_DEBUG_FILES */ ++ ++/*-------------------------------------------------------------------------*/ ++ ++/* Release udc structures */ ++static void fsl_udc_release(struct device *dev) ++{ ++ complete(udc_controller->done); ++ dma_free_coherent(dev, udc_controller->ep_qh_size, ++ udc_controller->ep_qh, udc_controller->ep_qh_dma); ++ kfree(udc_controller); ++} ++ ++/****************************************************************** ++ Internal structure setup functions ++*******************************************************************/ ++/*------------------------------------------------------------------ ++ * init resource for globle controller ++ * Return the udc handle on success or NULL on failure ++ ------------------------------------------------------------------*/ ++static struct fsl_udc *__init struct_udc_setup(struct platform_device *pdev) ++{ ++ struct fsl_udc *udc; ++ struct fsl_usb2_platform_data *pdata; ++ size_t size; ++ ++ udc = kzalloc(sizeof(struct fsl_udc), GFP_KERNEL); ++ if (udc == NULL) { ++ ERR("malloc udc failed\n"); ++ return NULL; ++ } ++ ++ pdata = pdev->dev.platform_data; ++ udc->phy_mode = pdata->phy_mode; /* DDD FIXME */ ++ ++ /* max_ep_nr is bidirectional ep number, max_ep doubles the number */ ++ udc->max_ep = pdata->max_ep_nr * 2; ++ ++ udc->eps = kzalloc(sizeof(struct fsl_ep) * udc->max_ep, GFP_KERNEL); ++ if (!udc->eps) { ++ ERR("malloc fsl_ep failed\n"); ++ goto cleanup; ++ } ++ ++ /* initialized QHs, take care of alignment */ ++ size = udc->max_ep * sizeof(struct ep_queue_head); ++ if (size < QH_ALIGNMENT) ++ size = QH_ALIGNMENT; ++ else if ((size % QH_ALIGNMENT) != 0) { ++ size += QH_ALIGNMENT + 1; ++ size &= ~(QH_ALIGNMENT - 1); ++ } ++ udc->ep_qh = dma_alloc_coherent(&pdev->dev, size, ++ &udc->ep_qh_dma, GFP_KERNEL); ++ if (!udc->ep_qh) { ++ ERR("malloc QHs for udc failed\n"); ++ kfree(udc->eps); ++ goto cleanup; ++ } ++ ++ udc->ep_qh_size = size; ++ ++ /* Initialize ep0 status request structure */ ++ udc->status_req = container_of(fsl_alloc_request(NULL, GFP_KERNEL), ++ struct fsl_req, req); ++ /* allocate a small amount of memory to get valid address */ ++ udc->status_req->req.buf = kmalloc(8, GFP_KERNEL); ++ udc->status_req->req.dma = virt_to_phys(udc->status_req->req.buf); ++ ++ udc->resume_state = USB_STATE_NOTATTACHED; ++ udc->usb_state = USB_STATE_POWERED; ++ udc->ep0_dir = 0; ++ udc->remote_wakeup = 0; /* default to 0 on reset */ ++ spin_lock_init(&udc->lock); ++ ++ return udc; ++ ++cleanup: ++ kfree(udc); ++ return NULL; ++} ++ ++/*---------------------------------------------------------------- ++ * Setup the fsl_ep struct for eps ++ * Link fsl_ep->ep to gadget->ep_list ++ * ep0out is not used so do nothing here ++ * ep0in should be taken care ++ *--------------------------------------------------------------*/ ++static int __init struct_ep_setup(struct fsl_udc *udc, unsigned char index, ++ char *name, int link) ++{ ++ struct fsl_ep *ep = &udc->eps[index]; ++ ++ ep->udc = udc; ++ strcpy(ep->name, name); ++ ep->ep.name = ep->name; ++ ++ ep->ep.ops = &fsl_ep_ops; ++ ep->stopped = 0; ++ ++ /* for ep0: maxP defined in desc ++ * for other eps, maxP is set by epautoconfig() called by gadget layer ++ */ ++ ep->ep.maxpacket = (unsigned short) ~0; ++ ++ /* the queue lists any req for this ep */ ++ INIT_LIST_HEAD(&ep->queue); ++ ++ /* gagdet.ep_list used for ep_autoconfig so no ep0 */ ++ if (link) ++ list_add_tail(&ep->ep.ep_list, &udc->gadget.ep_list); ++ ep->gadget = &udc->gadget; ++ ep->qh = &udc->ep_qh[index]; ++ ++ return 0; ++} ++ ++static int board_init(struct platform_device *pdev) ++{ ++ struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data; ++ ++ pr_debug("udc: pdev=0x%p pdata=0x%p\n", pdev, pdata); ++ ++ /* ++ * do platform specific init: check the clock, grab/config pins, etc. ++ */ ++ if (pdata->platform_init && pdata->platform_init(pdev) != 0) ++ return -EINVAL; ++ ++ return 0; ++} ++ ++/* Driver probe functions */ ++ ++static int __init fsl_udc_probe(struct platform_device *pdev) ++{ ++ struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data; ++ struct fsl_udc *udc; ++ unsigned int i; ++ struct otg_transceiver *transceiver = NULL; ++ int status = -ENODEV; ++ u32 id; ++ int irq_number; ++ u64 rsrc_start, rsrc_len; ++ int ret = -ENODEV; ++ ++ pr_debug("udc: pdev=0x%p pdata=0x%p\n", pdev, pdata); ++ ++ if (board_init(pdev) != 0) ++ return -EINVAL; ++ ++ /* Initialize the udc structure including QH member and other member */ ++ udc = (struct fsl_udc *) struct_udc_setup(pdev); ++ udc_controller = udc; ++ ++ if (!udc) { ++ ERR("udc is NULL \n"); ++ return -ENOMEM; ++ } ++ dev_set_drvdata(&pdev->dev, udc); ++ pr_debug("udc_controller=0x%p", udc_controller); ++ ++ udc->pdata = pdata; ++ udc->xcvr_type = pdata->xcvr_type; ++ ++#ifdef CONFIG_USB_OTG ++ udc->transceiver = otg_get_transceiver(); ++ pr_debug("udc: otg_get_transceiver returns 0x%p", udc->transceiver); ++#endif ++ ++ if (pdev->resource[1].flags != IORESOURCE_IRQ) ++ return -ENODEV; ++ ++ rsrc_start = pdev->resource[0].start; ++ rsrc_len = pdev->resource[0].end - pdev->resource[0].start + 1; ++ ++ pr_debug(" start=0x%ux end=0x%ux\n", ++ pdev->resource[0].start, pdev->resource[0].end); ++ pr_debug("rsrc_start=0x%llx rsrc_len=0x%llx\n", rsrc_start, rsrc_len); ++ ++ dr_regs = (struct fsl_usb_device_regs *)pdata->regs; ++ ++ pr_debug("udc: pdate=0x%p dr_regs=0x%p\n", pdata, dr_regs); ++ pr_debug("udc: hci_version=0x%x\n", dr_regs->hciversion); ++ pr_debug("udc: otgsc at 0x%p\n", &dr_regs->otgsc); ++ ++ id = fsl_readl(&dr_regs->id); ++ printk(KERN_INFO "FSL2 USBOTG h/w ID=0x%x revision=0x%x\n", ++ id & 0x3f, id >> 16); ++ ++ /* USB OTG module IRQ */ ++ irq_number = platform_get_irq(pdev, 0); ++ if (irq_number > 128) { ++ status = request_irq(irq_number, fsl_udc_irq, IRQF_SHARED, ++ driver_name, udc); ++ if (status) { ++ ERR("can't get irq %d, err=%d\n", irq_number, status); ++ goto err2; ++ } ++ } else { ++ status = -ENODEV; ++ goto err2; ++ } ++ ++ if (!udc->transceiver) { ++ /* initialize usb hw reg except for regs for EP, ++ * leave usbintr reg untouched*/ ++ dr_controller_setup(udc); ++ } ++ ++ /* here comes the stand operations for probe ++ * set the fsl_udc->gadget.xxx ++ */ ++ udc->gadget.ops = &fsl_gadget_ops; ++ ++ /* gadget.ep0 is a pointer */ ++ udc->gadget.ep0 = &udc->eps[0].ep; ++ INIT_LIST_HEAD(&udc->gadget.ep_list); ++ udc->gadget.speed = USB_SPEED_UNKNOWN; ++ udc->gadget.name = driver_name; ++ ++ /* Setup gadget.dev and register with kernel */ ++ strcpy(udc->gadget.dev.bus_id, "gadget"); ++ udc->gadget.dev.release = fsl_udc_release; ++ udc->gadget.dev.parent = &pdev->dev; ++ ++ ret = device_register(&udc->gadget.dev); ++ if (ret < 0) ++ goto err3; ++ ++ if (udc->transceiver) ++ udc->gadget.is_otg = 1; ++ ++ /* setup QH and epctrl for ep0 */ ++ ep0_setup(udc); ++ ++ /* setup udc->eps[] for ep0 */ ++ struct_ep_setup(udc_controller, 0, "ep0", 0); ++ /* for ep0: the desc defined here; ++ * for other eps, gadget layer called ep_enable with defined desc ++ */ ++ udc->eps[0].desc = &fsl_ep0_desc; ++ udc->eps[0].ep.maxpacket = USB_MAX_CTRL_PAYLOAD; ++ ++ /* setup the udc->eps[] for non-control endpoints and link ++ * to gadget.ep_list */ ++ for (i = 1; i < (int)(udc->max_ep / 2); i++) { ++ char name[14]; ++ ++ sprintf(name, "ep%dout", i); ++ struct_ep_setup(udc, i * 2, name, 1); ++ sprintf(name, "ep%din", i); ++ struct_ep_setup(udc, i * 2 + 1, name, 1); ++ } ++ ++ /* use dma_pool for TD management */ ++ udc_controller->td_pool = dma_pool_create("udc_td", &pdev->dev, ++ sizeof(struct ep_td_struct), ++ DTD_ALIGNMENT, UDC_DMA_BOUNDARY); ++ if (udc->td_pool == NULL) { ++ ret = -ENOMEM; ++ goto err4; ++ } ++#if 0 // DDD why this? hoarks OTG host ++ pullup_disable(udc); ++#endif ++ ++ create_proc_file(); ++ return 0; ++ ++err4: ++ device_unregister(&udc_controller->gadget.dev); ++err3: ++ free_irq(udc_controller->irq, udc_controller); ++err2: ++ kfree(udc); ++ if (transceiver) ++ put_device(transceiver->dev); ++ release_mem_region(pdev->resource[0].start, ++ pdev->resource[0].end - pdev->resource[0].start + 1); ++ return status; ++ ++} ++ ++/* Driver removal functions ++ * Free resources ++ * Finish pending transaction ++ */ ++static int __exit fsl_udc_remove(struct platform_device *pdev) ++{ ++ struct device *dev = &pdev->dev; ++ struct fsl_udc *udc = (struct fsl_udc *)dev_get_drvdata(dev); ++ struct fsl_usb2_platform_data *pdata; ++ int irq_number; ++ ++ DECLARE_COMPLETION(done); ++ ++ pdata = pdev->dev.platform_data; ++ ++ if (!udc) ++ return -ENODEV; ++ ++ udc->done = &done; ++ ++ /* DR has been stopped in usb_gadget_unregister_driver() */ ++ ++ if (udc->transceiver) { ++ put_device(udc->transceiver->dev); ++ udc->transceiver = NULL; ++ } ++ ++ /* remove proc */ ++ remove_proc_file(); ++ ++ /* free irq */ ++ irq_number = udc->irq; ++ free_irq(pdev->resource[1].start, udc); ++ udc->irq = 0; ++ ++ /* Free allocated memory */ ++ kfree(udc->status_req->req.buf); ++ kfree(udc->status_req); ++ kfree(udc_controller->eps); ++ ++ dma_pool_destroy(udc_controller->td_pool); ++ /* deinitlaize all ep: strcut */ ++ /* deinitialize ep0: reg and QH */ ++ ++ device_unregister(&udc->gadget.dev); ++ /* free udc --wait for the release() finished */ ++ wait_for_completion(&done); ++ ++ /* ++ * do platform specific un-initialization: ++ * release iomux pins, etc. ++ */ ++ if (pdata->platform_uninit) ++ pdata->platform_uninit(pdev); ++ ++ return 0; ++} ++ ++static int udc_suspend(struct fsl_udc *udc) ++{ ++ udc->stopped = 1; ++ return 0; ++} ++ ++/* ++ * Modify Power management attributes ++ * Used by OTG statemachine to disable gadget temporarily ++ * Here we stop the DR controller and disable the irq ++ * @param dev device controller pointer ++ * @param state current state ++ * @return The function returns 0 on success or -1 if failed ++ */ ++static int fsl_udc_suspend(struct device *dev, pm_message_t state) ++{ ++ struct fsl_udc *udc = (struct fsl_udc *)dev_get_drvdata(dev); ++ pr_debug("udc: Suspend. state=%d\n", state.event); ++ return udc_suspend(udc); ++} ++ ++static int udc_resume(struct fsl_udc *udc) ++{ ++ /*Enable DR irq reg and set controller Run */ ++ if (udc->stopped) { ++ dr_controller_setup(udc); ++ dr_controller_run(udc); ++ } ++ udc->usb_state = USB_STATE_ATTACHED; ++ udc->ep0_state = WAIT_FOR_SETUP; ++ udc->ep0_dir = 0; ++ return 0; ++} ++ ++/* ++ * Invoked on USB resume. May be called in_interrupt. ++ * Here we start the DR controller and enable the irq ++ * @param dev device controller pointer ++ * @return The function returns 0 on success or -1 if failed ++ */ ++static int fsl_udc_resume(struct device *dev) ++{ ++ struct fsl_udc *udc = (struct fsl_udc *)dev_get_drvdata(dev); ++ pr_debug("udc: Resume dev=0x%p udc=0x%p\n", dev, udc); ++ ++ return udc_resume(udc); ++} ++ ++/*------------------------------------------------------------------------- ++ Register entry point for the peripheral controller driver ++--------------------------------------------------------------------------*/ ++static struct platform_driver udc_driver = { ++ .probe = fsl_udc_probe, ++ .remove = __exit_p(fsl_udc_remove), ++ .driver = { ++ .name = (char *)driver_name, ++ .owner = THIS_MODULE, ++ }, ++}; ++ ++static int __init udc_init(void) ++{ ++ printk(KERN_INFO "%s version %s init \n", driver_desc, DRIVER_VERSION); ++ return platform_driver_register(&udc_driver); ++} ++ ++module_init(udc_init); ++ ++static void __exit udc_exit(void) ++{ ++ platform_driver_unregister(&udc_driver); ++ printk(KERN_INFO "%s unregistered \n", driver_desc); ++} ++ ++module_exit(udc_exit); ++ ++MODULE_DESCRIPTION(DRIVER_DESC); ++MODULE_AUTHOR(DRIVER_AUTHOR); ++MODULE_LICENSE("GPL"); +--- a/drivers/usb/host/Kconfig ++++ b/drivers/usb/host/Kconfig +@@ -32,6 +32,7 @@ config USB_EHCI_HCD + config USB_EHCI_ROOT_HUB_TT + bool "Root Hub Transaction Translators (EXPERIMENTAL)" + depends on USB_EHCI_HCD && EXPERIMENTAL ++ default y if M54455 + ---help--- + Some EHCI chips have vendor-specific extensions to integrate + transaction translators, so that no OHCI or UHCI companion +@@ -60,12 +61,12 @@ config USB_EHCI_TT_NEWSCHED + + config USB_EHCI_BIG_ENDIAN_MMIO + bool +- depends on USB_EHCI_HCD && (PPC_CELLEB || PPC_PS3 || 440EPX || ARCH_IXP4XX) ++ depends on USB_EHCI_HCD && (PPC_CELLEB || PPC_PS3 || 440EPX || ARCH_IXP4XX || M54455) + default y + + config USB_EHCI_BIG_ENDIAN_DESC + bool +- depends on USB_EHCI_HCD && (440EPX || ARCH_IXP4XX) ++ depends on USB_EHCI_HCD && (440EPX || ARCH_IXP4XX || M54455) + default y + + config USB_EHCI_FSL +@@ -260,3 +261,19 @@ config USB_R8A66597_HCD + To compile this driver as a module, choose M here: the + module will be called r8a66597-hcd. + ++choice ++ prompt "Select transceiver" ++ depends on M54455 ++ default USB_M5445X_ULPI ++ ++config USB_M5445X_ULPI ++ bool "External ULPI" ++ ---help--- ++ Enable support for the external HS ULPI transceiver. ++ ++config USB_M5445X_FSLS ++ bool "On-chip (FL/LS only)" ++ ---help--- ++ Enable support for the on-chip FL/LS transceiver. ++endchoice ++ +--- /dev/null ++++ b/drivers/usb/host/ehci-arc.c +@@ -0,0 +1,431 @@ ++/* ++ * drivers/usb/host/ehci-arc.c ++ * ++ * Copyright 2005-2007 Freescale Semiconductor, Inc. All Rights Reserved. ++ */ ++ ++/* ++ * The code contained herein is licensed under the GNU General Public ++ * License. You may obtain a copy of the GNU General Public License ++ * Version 2 or later at the following locations: ++ * ++ * http://www.opensource.org/licenses/gpl-license.html ++ * http://www.gnu.org/copyleft/gpl.html ++ */ ++ ++/* Note: this file is #included by ehci-hcd.c */ ++ ++#include <linux/platform_device.h> ++#include <linux/usb/fsl_usb2.h> ++#include <linux/fsl_devices.h> ++#include <linux/usb/otg.h> ++ ++#include "ehci-fsl.h" ++ ++ ++/* FIXME: Power Managment is un-ported so temporarily disable it */ ++#undef CONFIG_PM ++ ++/* PCI-based HCs are common, but plenty of non-PCI HCs are used too */ ++ ++/* configure so an HC device and id are always provided */ ++/* always called with process context; sleeping is OK */ ++ ++/** ++ * usb_hcd_fsl_probe - initialize FSL-based HCDs ++ * @drvier: Driver to be used for this HCD ++ * @pdev: USB Host Controller being probed ++ * Context: !in_interrupt() ++ * ++ * Allocates basic resources for this USB host controller. ++ * ++ */ ++static int usb_hcd_fsl_probe(const struct hc_driver *driver, ++ struct platform_device *pdev) ++{ ++ struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data; ++ struct usb_hcd *hcd; ++ struct resource *res; ++ int irq; ++ int retval; ++ ++ pr_debug("initializing FSL-SOC USB Controller\n"); ++ ++ /* Need platform data for setup */ ++ if (!pdata) { ++ dev_err(&pdev->dev, ++ "No platform data for %s.\n", pdev->dev.bus_id); ++ return -ENODEV; ++ } ++ ++ retval = fsl_platform_verify(pdev); ++ if (retval) ++ return retval; ++ ++ /* ++ * do platform specific init: check the clock, grab/config pins, etc. ++ */ ++ if (pdata->platform_init && pdata->platform_init(pdev)) { ++ retval = -ENODEV; ++ goto err1; ++ } ++ ++ res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); ++ if (!res) { ++ dev_err(&pdev->dev, ++ "Found HC with no IRQ. Check %s setup!\n", ++ pdev->dev.bus_id); ++ return -ENODEV; ++ } ++ irq = res->start; ++ ++ fsl_platform_set_vbus_power(pdev, 1); ++ ++ hcd = usb_create_hcd(driver, &pdev->dev, pdev->dev.bus_id); ++ if (!hcd) { ++ retval = -ENOMEM; ++ goto err1; ++ } ++ ++ if (pdata->regs) { ++ pr_debug("REGS: using pdata->regs (0x%p)\n", pdata->regs); ++ hcd->regs = pdata->regs; ++ hcd->rsrc_start = pdata->r_start; ++ hcd->rsrc_len = pdata->r_len; ++ } else { ++ pr_debug("REGS: NO pdata->regs\n"); ++ res = platform_get_resource(pdev, IORESOURCE_MEM, 0); ++ if (!res) { ++ dev_err(&pdev->dev, "Found HC with no register addr. " ++ "Check %s setup!\n", pdev->dev.bus_id); ++ retval = -ENODEV; ++ goto err2; ++ } ++ hcd->rsrc_start = res->start; ++ hcd->rsrc_len = res->end - res->start + 1; ++ ++ /* ++ printk("DDD %s(): rsrc_start=0x%llx rsrc_len=0x%llx " ++ "pdata=0x%p\n", __FUNCTION__, ++ hcd->rsrc_start, hcd->rsrc_len, pdata); ++ */ ++ ++ if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, ++ driver->description)) { ++ dev_dbg(&pdev->dev, "request_mem_region failed\n"); ++ retval = -EBUSY; ++ goto err2; ++ } ++ hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len); ++ ++ if (hcd->regs == NULL) { ++ dev_dbg(&pdev->dev, "error mapping memory\n"); ++ retval = -EFAULT; ++ goto err3; ++ } ++ } ++ hcd->power_budget = pdata->power_budget; ++ ++ /* DDD ++ * the following must be done by this point, otherwise the OTG ++ * host port doesn't make it thru initializtion. ++ * ehci_halt(), called by ehci_fsl_setup() returns -ETIMEDOUT ++ */ ++ fsl_platform_set_host_mode(hcd); ++ ++ retval = usb_add_hcd(hcd, irq, IRQF_SHARED); ++ if (retval != 0) ++ goto err4; ++ ++#if defined(CONFIG_USB_OTG) ++ if (pdata->does_otg) { ++ struct ehci_hcd *ehci = hcd_to_ehci(hcd); ++ ++ ehci->transceiver = otg_get_transceiver(); ++ ++ if (ehci->transceiver) { ++ retval = otg_set_host(ehci->transceiver, ++ &ehci_to_hcd(ehci)->self); ++ if (retval) { ++ if (ehci->transceiver) ++ put_device(ehci->transceiver->dev); ++ goto err3; ++ } ++ } else { ++ printk(KERN_ERR "can't find transceiver\n"); ++ retval = -ENODEV; ++ goto err3; ++ } ++ } ++#endif ++ ++ return retval; ++ ++err4: ++ /* DDD only if we did the iomap() iounmap(hcd->regs); */ ++err3: ++ /* DDD only if we did a request_ ++ * release_mem_region(hcd->rsrc_start, hcd->rsrc_len); ++ */ ++err2: ++ usb_put_hcd(hcd); ++err1: ++ dev_err(&pdev->dev, "init %s fail, %d\n", pdev->dev.bus_id, retval); ++ if (pdata->platform_uninit) ++ pdata->platform_uninit(pdev); ++ return retval; ++} ++ ++/* may be called without controller electrically present */ ++/* may be called with controller, bus, and devices active */ ++ ++/** ++ * usb_hcd_fsl_remove - shutdown processing for FSL-based HCDs ++ * @dev: USB Host Controller being removed ++ * Context: !in_interrupt() ++ * ++ * Reverses the effect of usb_hcd_fsl_probe(). ++ * ++ */ ++static void usb_hcd_fsl_remove(struct usb_hcd *hcd, ++ struct platform_device *pdev) ++{ ++ struct ehci_hcd *ehci = hcd_to_ehci(hcd); ++ struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data; ++ ++ /* DDD shouldn't we turn off the power here? */ ++ fsl_platform_set_vbus_power(pdev, 0); ++ ++ usb_remove_hcd(hcd); ++ ++ if (ehci->transceiver) { ++ (void)otg_set_host(ehci->transceiver, 0); ++ put_device(ehci->transceiver->dev); ++ } ++ usb_put_hcd(hcd); ++ ++ /* ++ * do platform specific un-initialization: ++ * release iomux pins, etc. ++ */ ++ if (pdata->platform_uninit) ++ pdata->platform_uninit(pdev); ++} ++ ++/* called after powerup, by probe or system-pm "wakeup" */ ++static int ehci_fsl_reinit(struct ehci_hcd *ehci) ++{ ++ fsl_platform_usb_setup(ehci_to_hcd(ehci)); ++ ehci_port_power(ehci, 0); ++ ++ return 0; ++} ++ ++/* called during probe() after chip reset completes */ ++static int ehci_fsl_setup(struct usb_hcd *hcd) ++{ ++ struct ehci_hcd *ehci = hcd_to_ehci(hcd); ++ int retval; ++ struct fsl_usb2_platform_data *pdata; ++ pdata = hcd->self.controller-> platform_data; ++ ++ ehci->big_endian_desc = pdata->big_endian_desc; ++ ehci->big_endian_mmio = pdata->big_endian_mmio; ++ ++ /* EHCI registers start at offset 0x100 */ ++ ehci->caps = hcd->regs + 0x100; ++ ehci->regs = hcd->regs + 0x100 + ++ HC_LENGTH(ehci_readl(ehci, &ehci->caps->hc_capbase)); ++ ++ pr_debug("%s(): ehci->caps=0x%p ehci->regs=0x%p\n", __FUNCTION__, ++ ehci->caps, ehci->regs); ++ ++ dbg_hcs_params(ehci, "reset"); ++ dbg_hcc_params(ehci, "reset"); ++ ++ /* cache this readonly data; minimize chip reads */ ++ ehci->hcs_params = ehci_readl(ehci, &ehci->caps->hcs_params); ++ ++ retval = ehci_halt(ehci); ++ if (retval) ++ return retval; ++ ++ /* data structure init */ ++ retval = ehci_init(hcd); ++ if (retval) ++ return retval; ++ ++ ehci->is_tdi_rh_tt = 1; ++ ++ ehci->sbrn = 0x20; ++ ++ ehci_reset(ehci); ++ ++ retval = ehci_fsl_reinit(ehci); ++ return retval; ++} ++ ++static const struct hc_driver ehci_fsl_hc_driver = { ++ .description = hcd_name, ++ .product_desc = "Freescale On-Chip EHCI Host Controller", ++ .hcd_priv_size = sizeof(struct ehci_hcd), ++ ++ /* ++ * generic hardware linkage ++ */ ++ .irq = ehci_irq, ++ .flags = FSL_PLATFORM_HC_FLAGS, ++ ++ /* ++ * basic lifecycle operations ++ */ ++ .reset = ehci_fsl_setup, ++ .start = ehci_run, ++ .stop = ehci_stop, ++ .shutdown = ehci_shutdown, ++ ++ /* ++ * managing i/o requests and associated device resources ++ */ ++ .urb_enqueue = ehci_urb_enqueue, ++ .urb_dequeue = ehci_urb_dequeue, ++ .endpoint_disable = ehci_endpoint_disable, ++ ++ /* ++ * scheduling support ++ */ ++ .get_frame_number = ehci_get_frame, ++ ++ /* ++ * root hub support ++ */ ++ .hub_status_data = ehci_hub_status_data, ++ .hub_control = ehci_hub_control, ++ .bus_suspend = ehci_bus_suspend, ++ .bus_resume = ehci_bus_resume, ++}; ++ ++#ifdef CONFIG_USB_OTG ++/* ++ * Holding pen for all the EHCI registers except port_status, ++ * which is a zero element array and hence takes no space. ++ * The port_status register is saved in usb_ehci_portsc. ++ */ ++volatile static struct ehci_regs usb_ehci_regs; ++static u32 usb_ehci_portsc; ++ ++/* suspend/resume, section 4.3 */ ++ ++/* These routines rely on the bus (pci, platform, etc) ++ * to handle powerdown and wakeup, and currently also on ++ * transceivers that don't need any software attention to set up ++ * the right sort of wakeup. ++ * ++ * They're also used for turning on/off the port when doing OTG. ++ */ ++static int ehci_fsl_drv_suspend(struct platform_device *pdev, ++ pm_message_t message) ++{ ++ struct usb_hcd *hcd = platform_get_drvdata(pdev); ++ struct ehci_hcd *ehci = hcd_to_ehci(hcd); ++ u32 tmp; ++ ++ pr_debug("%s pdev=0x%p ehci=0x%p hcd=0x%p\n", ++ __FUNCTION__, pdev, ehci, hcd); ++ pr_debug("%s ehci->regs=0x%p hcd->regs=0x%p hcd->state=%d\n", ++ __FUNCTION__, ehci->regs, hcd->regs, hcd->state); ++ ++ hcd->state = HC_STATE_SUSPENDED; ++ pdev->dev.power.power_state = PMSG_SUSPEND; ++ ++ if (hcd->driver->suspend) ++ return hcd->driver->suspend(hcd, message); ++ ++ /* ignore non-host interrupts */ ++ clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); ++ ++ tmp = ehci_readl(ehci, &ehci->regs->command); ++ tmp &= ~CMD_RUN; ++ ehci_writel(ehci, tmp, &ehci->regs->command); ++ ++ memcpy((void *)&usb_ehci_regs, ehci->regs, sizeof(struct ehci_regs)); ++ usb_ehci_portsc = ehci_readl(ehci, &ehci->regs->port_status[0]); ++ ++ /* clear the W1C bits */ ++ usb_ehci_portsc &= cpu_to_hc32(ehci, ~PORT_RWC_BITS); ++ ++ fsl_platform_set_vbus_power(pdev, 0); ++ /* clear PP to cut power to the port */ ++ tmp = ehci_readl(ehci, &ehci->regs->port_status[0]); ++ tmp &= ~PORT_POWER; ++ ehci_writel(ehci, tmp, &ehci->regs->port_status[0]); ++ ++ return 0; ++} ++ ++static int ehci_fsl_drv_resume(struct platform_device *pdev) ++{ ++ struct usb_hcd *hcd = platform_get_drvdata(pdev); ++ struct ehci_hcd *ehci = hcd_to_ehci(hcd); ++ u32 tmp; ++ struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data; ++ ++ pr_debug("%s pdev=0x%p pdata=0x%p ehci=0x%p hcd=0x%p\n", ++ __FUNCTION__, pdev, pdata, ehci, hcd); ++ ++ pr_debug("%s ehci->regs=0x%p hcd->regs=0x%p", ++ __FUNCTION__, ehci->regs, hcd->regs); ++ ++ memcpy(ehci->regs, (void *)&usb_ehci_regs, sizeof(struct ehci_regs)); ++ ehci_writel(ehci, usb_ehci_portsc, &ehci->regs->port_status[0]); ++ ++ tmp = USBMODE_CM_HOST | (pdata->es ? USBMODE_ES : 0); ++ ehci_writel(ehci, tmp, hcd->regs + FSL_SOC_USB_USBMODE); ++ ++ set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); ++ hcd->state = HC_STATE_RUNNING; ++ pdev->dev.power.power_state = PMSG_ON; ++ ++ tmp = ehci_readl(ehci, &ehci->regs->command); ++ tmp |= CMD_RUN; ++ ehci_writel(ehci, tmp, &ehci->regs->command); ++ ++ fsl_platform_set_vbus_power(pdev, 1); ++ ++ usb_hcd_resume_root_hub(hcd); ++ ++ return 0; ++} ++#endif /* CONFIG_USB_OTG */ ++ ++static int ehci_fsl_drv_probe(struct platform_device *pdev) ++{ ++ if (usb_disabled()) ++ return -ENODEV; ++ ++ return usb_hcd_fsl_probe(&ehci_fsl_hc_driver, pdev); ++} ++ ++static int ehci_fsl_drv_remove(struct platform_device *pdev) ++{ ++ struct usb_hcd *hcd = platform_get_drvdata(pdev); ++ ++ usb_hcd_fsl_remove(hcd, pdev); ++ ++ return 0; ++} ++ ++MODULE_ALIAS("fsl-ehci"); ++ ++static struct platform_driver ehci_fsl_driver = { ++ .probe = ehci_fsl_drv_probe, ++ .remove = ehci_fsl_drv_remove, ++ .shutdown = usb_hcd_platform_shutdown, ++#ifdef CONFIG_USB_OTG ++ .suspend = ehci_fsl_drv_suspend, ++ .resume = ehci_fsl_drv_resume, ++#endif ++ .driver = { ++ .name = "fsl-ehci", ++ }, ++}; +--- a/drivers/usb/host/ehci-fsl.h ++++ b/drivers/usb/host/ehci-fsl.h +@@ -18,6 +18,8 @@ + #ifndef _EHCI_FSL_H + #define _EHCI_FSL_H + ++#include <linux/usb/fsl_xcvr.h> ++ + /* offsets for the non-ehci registers in the FSL SOC USB controller */ + #define FSL_SOC_USB_ULPIVP 0x170 + #define FSL_SOC_USB_PORTSC1 0x184 +@@ -34,5 +36,29 @@ + #define FSL_SOC_USB_PRICTRL 0x40c /* NOTE: big-endian */ + #define FSL_SOC_USB_SICTRL 0x410 /* NOTE: big-endian */ + #define FSL_SOC_USB_CTRL 0x500 /* NOTE: big-endian */ +-#define SNOOP_SIZE_2GB 0x1e ++ ++#ifdef CONFIG_MPC834x ++#include <sysdev/fsl_usb.h> ++#endif ++ ++#ifdef CONFIG_ARCH_MX3 ++#include <asm/arch/mx31_usb.h> ++#endif ++ ++#ifdef CONFIG_ARCH_MX27 ++#include <asm/arch/mx27_usb.h> ++#endif ++ ++#ifdef CONFIG_M54455 ++#include <asm-m68k/mcf5445x_usb.h> ++#endif ++ ++ ++static void fsl_platform_set_vbus_power(struct platform_device *pdev, int on) ++{ ++ struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data; ++ ++ if (pdata->xcvr_ops && pdata->xcvr_ops->set_vbus_power) ++ pdata->xcvr_ops->set_vbus_power(pdata, on); ++} + #endif /* _EHCI_FSL_H */ +--- a/drivers/usb/host/ehci-hcd.c ++++ b/drivers/usb/host/ehci-hcd.c +@@ -1043,6 +1043,11 @@ MODULE_LICENSE ("GPL"); + #define PLATFORM_DRIVER ixp4xx_ehci_driver + #endif + ++#ifdef CONFIG_M54455 ++#include "ehci-arc.c" ++#define PLATFORM_DRIVER ehci_fsl_driver ++#endif ++ + #if !defined(PCI_DRIVER) && !defined(PLATFORM_DRIVER) && \ + !defined(PS3_SYSTEM_BUS_DRIVER) && !defined(OF_PLATFORM_DRIVER) + #error "missing bus glue for ehci-hcd" +--- a/drivers/usb/host/ehci-mem.c ++++ b/drivers/usb/host/ehci-mem.c +@@ -40,7 +40,8 @@ static inline void ehci_qtd_init(struct + { + memset (qtd, 0, sizeof *qtd); + qtd->qtd_dma = dma; +- qtd->hw_token = cpu_to_le32 (QTD_STS_HALT); ++ // DDD official code` has: qtd->hw_token = cpu_to_le32 (QTD_STS_HALT); ++ qtd->hw_token = cpu_to_hc32 (ehci, QTD_STS_HALT); + qtd->hw_next = EHCI_LIST_END(ehci); + qtd->hw_alt_next = EHCI_LIST_END(ehci); + INIT_LIST_HEAD (&qtd->qtd_list); +@@ -211,9 +212,11 @@ static int ehci_mem_init (struct ehci_hc + } + + /* Hardware periodic table */ +- ehci->periodic = (__le32 *) ++ // DDD official code has: ehci->periodic = (__le32 *) ++ ehci->periodic = (__hc32 *) + dma_alloc_coherent (ehci_to_hcd(ehci)->self.controller, +- ehci->periodic_size * sizeof(__le32), ++ // DDD official: ehci->periodic_size * sizeof(__le32), ++ ehci->periodic_size * sizeof(__hc32), + &ehci->periodic_dma, 0); + if (ehci->periodic == NULL) { + goto fail; +--- a/drivers/usb/host/ehci.h ++++ b/drivers/usb/host/ehci.h +@@ -122,6 +122,12 @@ struct ehci_hcd { /* one per controlle + + u8 sbrn; /* packed release number */ + ++ /* ++ * OTG controllers and transceivers need software interaction; ++ * other external transceivers should be software-transparent ++ */ ++ struct otg_transceiver *transceiver; ++ + /* irq statistics */ + #ifdef EHCI_STATS + struct ehci_stats stats; +@@ -753,6 +759,22 @@ ehci_port_speed(struct ehci_hcd *ehci, u + #define writel_be(val, addr) __raw_writel(val, (__force unsigned *)addr) + #endif + ++#if defined(CONFIG_COLDFIRE) ++/* ++ * Sorry, include/asm-m68k/io.h is messed up. It will give you a ++ * BE readl or a LE readl depending on whether or not CONFIG_PCI is set. ++ * how broken is that? Do the right thing here. ++ */ ++#undef readl ++#undef writel ++ ++#define readl(addr) in_le32((__force unsigned *)(addr)) ++#define writel(val,addr) out_le32((__force unsigned *)(addr),(val)) ++ ++#define readl_be(addr) in_be32((__force unsigned *)(addr)) ++#define writel_be(val, addr) out_be32((__force unsigned *)(addr), (val)) ++#endif ++ + static inline unsigned int ehci_readl(const struct ehci_hcd *ehci, + __u32 __iomem * regs) + { +--- /dev/null ++++ b/drivers/usb/otg/Makefile +@@ -0,0 +1,5 @@ ++# ++# Makefile for USB OTG controller driver ++# ++fsl_usb2_otg-objs := fsl_otg.o otg_fsm.o ++obj-y += fsl_usb2_otg.o +--- /dev/null ++++ b/drivers/usb/otg/fsl_otg.c +@@ -0,0 +1,1515 @@ ++/* ++ * Copyright (c) Freescale Semiconductor, Inc. 2006-2007 ++ * ++ * USB OTG ULPI driver ++ * ++ * Based on code for MPC from: ++ * Leo Li<LeoLi@freescale.com> ++ * Jerry Huang<Chang-Ming.Huang@freescale.com> ++ * ++ * and M5329 code from ++ * Yaroslav Vinogradov yaroslav.vinogradov@freescale.com ++ * Andrey Butok ++ * ++ * Initialization based on code from Shlomi Gridish. ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with this program; if not, write to the Free Software Foundation, Inc., ++ * 675 Mass Ave, Cambridge, MA 02139, USA. ++ *************************************************************************** ++ * Changes: ++ * v0.3 08 August 2007 Duck ++ * v0.2 20 October 2006 Andrey Butok ++ * Issues fixing and some changes. ++ * v0.1 September 2006 Yaroslav Vinogradov ++ * Initial version. ++ * ++ */ ++ ++#include <linux/module.h> ++#include <linux/moduleparam.h> ++#include <linux/kernel.h> ++#include <linux/delay.h> ++#include <linux/ioport.h> ++#include <linux/sched.h> ++#include <linux/slab.h> ++#include <linux/smp_lock.h> ++#include <linux/proc_fs.h> ++#include <linux/errno.h> ++#include <linux/init.h> ++#include <linux/reboot.h> ++#include <linux/timer.h> ++#include <linux/list.h> ++#include <linux/interrupt.h> ++#include <linux/usb.h> ++#include <linux/device.h> ++#include <linux/platform_device.h> ++#include <linux/usb/ch9.h> ++#include <linux/usb_gadget.h> ++#include <linux/workqueue.h> ++#include <linux/time.h> ++#include <linux/fsl_devices.h> ++#include <linux/usb/fsl_usb2.h> ++ ++#include <linux/io.h> ++ ++#if defined CONFIG_M54455 ++#include <asm/mcfsim.h> ++#endif ++ ++#define USE_WORK_QUEUES ++#include "fsl_otg.h" ++ ++#define CONFIG_USB_OTG_DEBUG_FILES ++#define DRIVER_VERSION "Revision: 1.56" ++#define DRIVER_AUTHOR "Freescale Semiconductor Inc." ++#define DRIVER_DESC "Freescale USB OTG ULPI Driver" ++#define DRIVER_INFO DRIVER_VERSION " " DRIVER_DESC ++ ++MODULE_DESCRIPTION("Freescale USB OTG Controller Driver"); ++ ++static const char driver_name[] = "fsl-usb2-otg"; ++ ++static spinlock_t usb_dr_regs_lock; ++ ++/*#define HA_DATA_PULSE 1*/ ++ ++volatile static struct fsl_usb_device_regs *usb_dr_regs; ++static struct fsl_otg *fsl_otg_dev; ++static int srp_wait_done; ++ ++/* Driver specific timers */ ++struct fsl_otg_timer *b_data_pulse_tmr, *b_vbus_pulse_tmr, *b_srp_fail_tmr, ++ *b_srp_wait_tmr, *a_wait_enum_tmr; ++ ++static struct list_head active_timers; ++ ++static struct fsl_otg_config fsl_otg_initdata = { ++ .otg_port = 1, ++}; ++ ++static void dump_state(const char *string, struct otg_fsm *fsm) ++{ ++ printk(KERN_DEBUG "%s\n\tOTG state: %s\n", string, ++ state_string(fsl_otg_dev->otg.state)); ++ printk(KERN_DEBUG "\tFSM protocol=%s\n", fsm->protocol ? ++ (fsm->protocol == PROTO_HOST ? "Host" : "Gadget") ++ : "None"); ++ ++ /* regs */ ++ printk(KERN_DEBUG "\t OTGSC 0x%08x\n", ++ fsl_readl(&usb_dr_regs->otgsc)); ++ printk(KERN_DEBUG "\tPORTSC1 0x%08x\n", ++ fsl_readl(&usb_dr_regs->portsc1)); ++ printk(KERN_DEBUG "\tUSBMODE 0x%08x\n", ++ fsl_readl(&usb_dr_regs->usbmode)); ++ printk(KERN_DEBUG "\t USBCMD 0x%08x\n", ++ fsl_readl(&usb_dr_regs->usbcmd)); ++ printk(KERN_DEBUG "\t USBSTS 0x%08x\n", ++ fsl_readl(&usb_dr_regs->usbsts)); ++ ++ /* ------ State Machine Variables ----- */ ++ printk(KERN_DEBUG "\ta_bus_req: %d\n", fsm->a_bus_req); ++ printk(KERN_DEBUG "\tb_bus_req: %d\n", fsm->b_bus_req); ++ printk(KERN_DEBUG "\ta_bus_resume: %d\n", fsm->a_bus_resume); ++ printk(KERN_DEBUG "\ta_bus_suspend: %d\n", fsm->a_bus_suspend); ++ printk(KERN_DEBUG "\ta_conn: %d\n", fsm->a_conn); ++ printk(KERN_DEBUG "\ta_sess_vld: %d\n", fsm->a_sess_vld); ++ printk(KERN_DEBUG "\ta_srp_det: %d\n", fsm->a_srp_det); ++ printk(KERN_DEBUG "\ta_vbus_vld: %d\n", fsm->a_vbus_vld); ++ printk(KERN_DEBUG "\tb_bus_resume: %d\n", fsm->b_bus_resume); ++ printk(KERN_DEBUG "\tb_bus_suspend: %d\n", fsm->b_bus_suspend); ++ printk(KERN_DEBUG "\tb_conn: %d\n", fsm->b_conn); ++ printk(KERN_DEBUG "\tb_se0_srp: %d\n", fsm->b_se0_srp); ++ printk(KERN_DEBUG "\tb_sess_end: %d\n", fsm->b_sess_end); ++ printk(KERN_DEBUG "\tb_sess_vld: %d\n", fsm->b_sess_vld); ++ printk(KERN_DEBUG "\tid: %d\n", fsm->id); ++} ++ ++ ++/* Routines to access transceiver ULPI registers */ ++u8 view_ulpi(u8 addr) ++{ ++ u32 temp; ++ ++ temp = 0x40000000 | (addr << 16); ++ fsl_writel(temp, &usb_dr_regs->ulpiview); ++ ++ udelay(1000); ++ ++ /* DDD timeout this loop: */ ++ do { ++ temp = fsl_readl(&usb_dr_regs->ulpiview); ++ } while (temp & 0x40000000); ++ ++ return (temp & 0x0000ff00) >> 8; ++} ++ ++int write_ulpi(u8 addr, u8 data) ++{ ++ u32 temp; ++ ++ temp = 0x60000000 | (addr << 16) | data; ++ fsl_writel(temp, &usb_dr_regs->ulpiview); ++ return 0; ++} ++ ++/* prototype declaration */ ++void fsl_otg_add_timer(void *timer); ++void fsl_otg_del_timer(void *timer); ++ ++/* -------------------------------------------------------------*/ ++/* Operations that will be called from OTG Finite State Machine */ ++ ++/* Charge vbus for vbus pulsing in SRP */ ++void fsl_otg_chrg_vbus(int on) ++{ ++ u32 tmp; ++ ++ VDBG(" %d\n", on); ++ ++ tmp = fsl_readl(&usb_dr_regs->otgsc) & ~OTGSC_INTSTS_MASK; ++ ++ if (on) { ++ tmp &= ~OTGSC_CTRL_VBUS_DISCHARGE; ++ tmp |= OTGSC_CTRL_VBUS_CHARGE; ++ } else { ++ tmp &= ~OTGSC_CTRL_VBUS_CHARGE; ++ } ++ fsl_writel(tmp, &usb_dr_regs->otgsc); ++} ++ ++/* Discharge vbus through a resistor to ground */ ++void fsl_otg_dischrg_vbus(int on) ++{ ++ u32 tmp; ++ ++ VDBG(" %d\n", on); ++ ++ tmp = fsl_readl(&usb_dr_regs->otgsc) & ~OTGSC_INTSTS_MASK; ++ ++ if (on) ++ tmp |= OTGSC_CTRL_VBUS_DISCHARGE; ++ else ++ tmp &= ~OTGSC_CTRL_VBUS_DISCHARGE; ++ ++ fsl_writel(tmp, &usb_dr_regs->otgsc); ++} ++ ++/* A-device driver vbus, controlled through PP bit in PORTSC */ ++void fsl_otg_drv_vbus(int on) ++{ ++ u32 tmp; ++ ++ VDBG(" %d\n", on); ++ ++ tmp = fsl_readl(&usb_dr_regs->portsc1) & ~PORTSCX_W1C_BITS; ++ ++ if (on) ++ tmp |= PORTSCX_PORT_POWER; ++ else ++ tmp &= ~PORTSCX_PORT_POWER; ++ ++ fsl_writel(tmp, &usb_dr_regs->portsc1); ++} ++ ++/* Pull-up D+, signalling connect by periperal. Also used in ++ * data-line pulsing in SRP */ ++void fsl_otg_loc_conn(int on) ++{ ++ u32 tmp; ++ ++ VDBG(" %d\n", on); ++ ++ tmp = fsl_readl(&usb_dr_regs->otgsc) & ~OTGSC_INTSTS_MASK; ++ ++ if (on) ++ tmp |= OTGSC_CTRL_DATA_PULSING; ++ else ++ tmp &= ~OTGSC_CTRL_DATA_PULSING; ++ ++ fsl_writel(tmp, &usb_dr_regs->otgsc); ++} ++ ++/* Generate SOF by host. This is controlled through suspend/resume the ++ * port. In host mode, controller will automatically send SOF. ++ * Suspend will block the data on the port. ++ */ ++void fsl_otg_loc_sof(int on) ++{ ++ u32 tmp; ++ ++ VDBG(" %d\n", on); ++ ++ tmp = fsl_readl(&usb_dr_regs->portsc1) & ~PORTSCX_W1C_BITS; ++ ++ if (on) ++ tmp |= PORTSCX_PORT_FORCE_RESUME; ++ else ++ tmp |= PORTSCX_PORT_SUSPEND; ++ ++ fsl_writel(tmp, &usb_dr_regs->portsc1); ++} ++ ++/* Start SRP pulsing by data-line pulsing, followed with v-bus pulsing. */ ++void fsl_otg_start_pulse(void) ++{ ++ u32 __attribute__ ((unused)) tmp; ++ ++ VDBG("\n"); ++ srp_wait_done = 0; ++ ++#ifdef HA_DATA_PULSE ++ tmp = fsl_readl(&usb_dr_regs->otgsc) &= ~OTGSC_INTSTS_MASK; ++ tmp |= OTGSC_HA_DATA_PULSE; ++ fsl_writel(tmp, &usb_dr_regs->otgsc); ++#else ++ fsl_otg_loc_conn(1); ++#endif ++ ++ fsl_otg_add_timer(b_data_pulse_tmr); ++} ++ ++void fsl_otg_pulse_vbus(void); ++ ++void b_data_pulse_end(unsigned long foo) ++{ ++#ifdef HA_DATA_PULSE ++#else ++ fsl_otg_loc_conn(0); ++#endif ++ ++ /* Do VBUS pulse after data pulse */ ++ fsl_otg_pulse_vbus(); ++} ++ ++void fsl_otg_pulse_vbus(void) ++{ ++ srp_wait_done = 0; ++ fsl_otg_chrg_vbus(1); ++ /* start the timer to end vbus charge */ ++ fsl_otg_add_timer(b_vbus_pulse_tmr); ++} ++ ++void b_vbus_pulse_end(unsigned long foo) ++{ ++ fsl_otg_chrg_vbus(0); ++ ++ /* As USB3300 using the same a_sess_vld and b_sess_vld voltage ++ * we need to discharge the bus for a while to distinguish ++ * residual voltage of vbus pulsing and A device pull up */ ++ fsl_otg_dischrg_vbus(1); ++ fsl_otg_add_timer(b_srp_wait_tmr); ++} ++ ++void b_srp_end(unsigned long foo) ++{ ++ fsl_otg_dischrg_vbus(0); ++ srp_wait_done = 1; ++ ++ if ((fsl_otg_dev->otg.state == OTG_STATE_B_SRP_INIT) && ++ fsl_otg_dev->fsm.b_sess_vld) ++ fsl_otg_dev->fsm.b_srp_done = 1; ++} ++ ++/* Workaround for a_host suspending too fast. When a_bus_req=0, ++ * a_host will start by SRP. It needs to set b_hnp_enable before ++ * actually suspending to start HNP ++ */ ++void a_wait_enum(unsigned long foo) ++{ ++ VDBG("a_wait_enum timeout\n"); ++ if (!fsl_otg_dev->otg.host->b_hnp_enable) ++ fsl_otg_add_timer(a_wait_enum_tmr); ++ else ++ otg_statemachine(&fsl_otg_dev->fsm); ++} ++ ++/* ------------------------------------------------------*/ ++ ++/* The timeout callback function to set time out bit */ ++void set_tmout(unsigned long indicator) ++{ ++ *(int *)indicator = 1; ++} ++ ++/* Initialize timers */ ++void fsl_otg_init_timers(struct otg_fsm *fsm) ++{ ++ /* FSM used timers */ ++ fsm->a_wait_vrise_tmr = otg_timer_initializer(&set_tmout, TA_WAIT_VRISE, ++ (unsigned long)&fsm->a_wait_vrise_tmout); ++ fsm->a_wait_bcon_tmr = otg_timer_initializer(&set_tmout, TA_WAIT_BCON, ++ (unsigned long)&fsm->a_wait_bcon_tmout); ++ fsm->a_aidl_bdis_tmr = otg_timer_initializer(&set_tmout, TA_AIDL_BDIS, ++ (unsigned long)&fsm->a_aidl_bdis_tmout); ++ fsm->b_ase0_brst_tmr = otg_timer_initializer(&set_tmout, TB_ASE0_BRST, ++ (unsigned long)&fsm->b_ase0_brst_tmout); ++ fsm->b_se0_srp_tmr = otg_timer_initializer(&set_tmout, TB_SE0_SRP, ++ (unsigned long)&fsm->b_se0_srp); ++ fsm->b_srp_fail_tmr = otg_timer_initializer(&set_tmout, TB_SRP_FAIL, ++ (unsigned long)&fsm->b_srp_done); ++ fsm->a_wait_enum_tmr = otg_timer_initializer(&a_wait_enum, 10, ++ (unsigned long)&fsm); ++ ++ /* device driver used timers */ ++ b_srp_wait_tmr = otg_timer_initializer(&b_srp_end, TB_SRP_WAIT, 0); ++ b_data_pulse_tmr = otg_timer_initializer(&b_data_pulse_end, ++ TB_DATA_PLS, 0); ++ b_vbus_pulse_tmr = otg_timer_initializer(&b_vbus_pulse_end, ++ TB_VBUS_PLS, 0); ++ ++} ++ ++/* Add timer to timer list */ ++void fsl_otg_add_timer(void *gtimer) ++{ ++ struct fsl_otg_timer *timer = (struct fsl_otg_timer *)gtimer; ++ struct fsl_otg_timer *tmp_timer; ++ ++ /* Check if the timer is already in the active list, ++ * if so update timer count ++ */ ++ list_for_each_entry(tmp_timer, &active_timers, list) ++ if (tmp_timer == timer) { ++ timer->count = timer->expires; ++ return; ++ } ++ timer->count = timer->expires; ++ list_add_tail(&timer->list, &active_timers); ++} ++ ++/* Remove timer from the timer list; clear timeout status */ ++void fsl_otg_del_timer(void *gtimer) ++{ ++ struct fsl_otg_timer *timer = (struct fsl_otg_timer *)gtimer; ++ struct fsl_otg_timer *tmp_timer, *del_tmp; ++ ++ list_for_each_entry_safe(tmp_timer, del_tmp, &active_timers, list) ++ if (tmp_timer == timer) ++ list_del(&timer->list); ++} ++ ++/* ++ * Reduce timer count by 1, and find timeout conditions. ++ * Called by fsl_otg 1ms timer interrupt ++ */ ++int fsl_otg_tick_timer(void) ++{ ++ struct fsl_otg_timer *tmp_timer, *del_tmp; ++ int expired = 0; ++ ++ list_for_each_entry_safe(tmp_timer, del_tmp, &active_timers, list) { ++ tmp_timer->count--; ++ /* check if timer expires */ ++ if (!tmp_timer->count) { ++ list_del(&tmp_timer->list); ++ tmp_timer->function(tmp_timer->data); ++ expired = 1; ++ } ++ } ++ ++ return expired; ++} ++ ++/* Reset controller, not reset the bus */ ++void otg_reset_controller(void) ++{ ++ u32 command; ++ unsigned long flags; ++ int timeout; ++ ++ VDBG("\n"); ++ ++ spin_lock_irqsave(&usb_dr_regs_lock, flags); ++ ++ command = fsl_readl(&usb_dr_regs->usbcmd); ++ command |= USB_CMD_CTRL_RESET; ++ fsl_writel(command, &usb_dr_regs->usbcmd); ++ spin_unlock_irqrestore(&usb_dr_regs_lock, flags); ++ ++ /* Wait reset completed */ ++ timeout = 500; ++ while (fsl_readl(&usb_dr_regs->usbcmd) & USB_CMD_CTRL_RESET) ++ udelay(1); ++ if (timeout <= 0) ++ ERR("%s - USBCMD_RST never clear. Timeout is %d \n", ++ __FUNCTION__, timeout); ++} ++ ++/* Call suspend/resume routines in host driver */ ++int fsl_otg_start_host(struct otg_fsm *fsm, int on) ++{ ++ struct otg_transceiver *xceiv = fsm->transceiver; ++ struct device *dev; ++ struct fsl_otg *otg_dev = container_of(xceiv, struct fsl_otg, otg); ++ u32 retval = 0; ++ ++ if (!xceiv->host) ++ return -ENODEV; ++ ++ dev = xceiv->host->controller; ++ ++ /* ++ * Update a_vbus_vld state as a_vbus_vld int is disabled ++ * in device mode ++ */ ++ fsm->a_vbus_vld = ++ !!(fsl_readl(&usb_dr_regs->otgsc) & OTGSC_STS_A_VBUS_VALID); ++ if (on) { ++ /* start fsl usb host controller */ ++ if (otg_dev->host_working) ++ goto end; ++ else { ++ otg_reset_controller(); ++ VDBG("host on......\n"); ++ if (dev->driver->resume) { ++ retval = dev->driver->resume(dev); ++ if (fsm->id) { ++ /* default-b */ ++ fsl_otg_drv_vbus(1); ++ /* Workaround: b_host can't driver ++ * vbus, but PP in PORTSC needs to ++ * be 1 for host to work. ++ * So we set drv_vbus bit in ++ * transceiver to 0 thru ULPI. */ ++ write_ulpi(0x0c, 0x20); ++ } ++ } ++ ++ otg_dev->host_working = 1; ++ } ++ } else { ++ /* stop fsl usb host controller */ ++ if (!otg_dev->host_working) ++ goto end; ++ else { ++ VDBG("host off......\n"); ++ if (dev && dev->driver) { ++ retval = dev->driver->suspend(dev, PMSG_SUSPEND); ++ if (fsm->id) ++ /* default-b */ ++ fsl_otg_drv_vbus(0); ++ } ++ otg_dev->host_working = 0; ++ } ++ } ++end: ++ return retval; ++} ++ ++/* ++ * Call suspend and resume function in udc driver ++ * to stop and start udc driver. ++ */ ++int fsl_otg_start_gadget(struct otg_fsm *fsm, int on) ++{ ++ struct otg_transceiver *xceiv = fsm->transceiver; ++ struct device *dev; ++ ++ VDBG("DDD fsm=%p xceiv=%p\n", fsm, xceiv); ++ if (!xceiv->gadget || !xceiv->gadget->dev.parent) ++ return -ENODEV; ++ ++ VDBG("DDD xceiv=%p xceiv->gadget=%p parent=%p\n", xceiv, xceiv->gadget, ++ xceiv->gadget->dev.parent); ++ ++ VDBG("gadget %s\n", on ? "on" : "off"); ++ /* DDD dump_state("starting gadget", fsm); */ ++ ++ dev = xceiv->gadget->dev.parent; ++ ++ if (on) ++ dev->driver->resume(dev); ++ else ++ dev->driver->suspend(dev, PMSG_SUSPEND); ++ ++ return 0; ++} ++ ++static void fsl_otg_enable(struct otg_transceiver *otg_p) ++{ ++ struct fsl_otg *otg_dev = container_of(otg_p, struct fsl_otg, otg); ++ struct otg_fsm *fsm = &(otg_dev)->fsm; ++ u32 otg_sc; ++ ++ /* DDD VDBG(""); */ ++ /* enable OTG interrupt */ ++ otg_sc = fsl_readl(&usb_dr_regs->otgsc); ++ otg_sc |= OTGSC_INTERRUPT_ENABLE_BITS_MASK; ++ otg_sc &= ~OTGSC_IE_1ms_TIMER; ++ otg_sc &= ~OTGSC_CTRL_VBUS_DISCHARGE; ++ otg_sc |= OTGSC_IE_USB_ID; /* DDD added this */ ++ fsl_writel(otg_sc, &usb_dr_regs->otgsc); ++ ++ fsm->id = (otg_sc & OTGSC_STS_USB_ID) ? 1 : 0; ++ ++ if (fsm->id) { ++ otg_p->state = OTG_STATE_UNDEFINED; ++ } else { ++ otg_p->state = OTG_STATE_A_IDLE; ++ } ++ ++ otg_p->default_a = (fsm->id == 0); ++ otg_p->host->is_b_host = fsm->id; ++ otg_p->gadget->is_a_peripheral = !fsm->id; ++ ++ fsm->a_vbus_vld = 1; ++ ++ fsm->b_sess_vld = (otg_sc & OTGSC_STS_B_SESSION_VALID) ? 1 : 0; ++ fsm->a_sess_vld = (otg_sc & OTGSC_STS_A_SESSION_VALID) ? 1 : 0; ++ fsm->b_sess_end = (otg_sc & OTGSC_STS_B_SESSION_END) ? 1 : 0; ++} ++ ++/* ++ * Called by initialization code of host driver. Register host controller ++ * to the OTG. Suspend host for OTG role detection. ++ */ ++static int fsl_otg_set_host(struct otg_transceiver *otg_p, struct usb_bus *host) ++{ ++#if 0 // DDD beta-final ++ struct fsl_otg *otg_dev = container_of(otg_p, struct fsl_otg, otg); ++ struct device *dev = host->controller; ++ ++ if (!otg_p || otg_dev != fsl_otg_dev) ++ return -ENODEV; ++ ++ otg_p->host = host; ++ otg_p->host->is_b_host = otg_dev->fsm.id; ++ ++ otg_dev->fsm.a_bus_drop = 0; ++ otg_dev->fsm.a_bus_req = 1; ++ ++ otg_p->host->otg_port = fsl_otg_initdata.otg_port; ++ ++ if (dev && dev->driver) { ++ VDBG("suspending host\n"); ++ dev->driver->suspend(dev, PMSG_SUSPEND); ++ otg_dev->host_working = 0; ++ VDBG("back\n"); ++ } ++ ++ ++ /* dump_state("set_host running statemachine", &otg_dev->fsm); DDD */ ++ otg_statemachine(&otg_dev->fsm); ++ ++ return 0; ++#else ++ struct fsl_otg *otg_dev = container_of(otg_p, struct fsl_otg, otg); ++ ++ if (!otg_p || otg_dev != fsl_otg_dev) ++ return -ENODEV; ++ ++ otg_p->host = host; ++ ++ otg_dev->fsm.a_bus_drop = 0; ++ otg_dev->fsm.a_bus_req = 1; ++ ++ if (host) { ++ VDBG("host off......\n"); ++ ++ otg_p->host->otg_port = fsl_otg_initdata.otg_port; ++ otg_p->host->is_b_host = otg_dev->fsm.id; ++ /* must leave time for khubd to finish its thing ++ * before yanking the host driver out from under it, ++ * so suspend the host after a short delay. ++ */ ++ otg_dev->host_working = 1; ++ schedule_delayed_work(&otg_dev->otg_event, 100); ++ return 0; ++ } else { /* host driver going away */ ++ ++ if (!(le32_to_cpu(otg_dev->dr_mem_map->otgsc) & ++ OTGSC_STS_USB_ID)) { ++ /* Mini-A cable connected */ ++ struct otg_fsm *fsm = &otg_dev->fsm; ++ ++ otg_p->state = OTG_STATE_UNDEFINED; ++ fsm->protocol = PROTO_UNDEF; ++ } ++ } ++ ++ otg_dev->host_working = 0; ++ ++ otg_statemachine(&otg_dev->fsm); ++ ++ return 0; ++#endif ++} ++ ++/* Called by initialization code of udc. Register udc to OTG.*/ ++static int fsl_otg_set_peripheral(struct otg_transceiver *otg_p, ++ struct usb_gadget *gadget) ++{ ++ struct fsl_otg *otg_dev = container_of(otg_p, struct fsl_otg, otg); ++ ++ VDBG("\n"); ++ ++ if (!otg_p || otg_dev != fsl_otg_dev) ++ return -ENODEV; ++ ++ if (!gadget) { ++ if (!otg_dev->otg.default_a) ++ otg_p->gadget->ops->vbus_draw(otg_p->gadget, 0); ++ usb_gadget_vbus_disconnect(otg_dev->otg.gadget); ++ otg_dev->otg.gadget = 0; ++ otg_dev->fsm.b_bus_req = 0; ++ otg_statemachine(&otg_dev->fsm); ++ return 0; ++ } ++ ++ otg_p->gadget = gadget; ++ otg_p->gadget->is_a_peripheral = !otg_dev->fsm.id; ++ ++ otg_dev->fsm.b_bus_req = 1; ++ ++#if 0 /* DDD uClinux */ ++ if (otg_p->host) { ++ fsl_otg_enable(otg_p); ++ otg_statemachine(&otg_dev->fsm); ++ } ++#endif ++ /* start the gadget right away if the ID pin says Mini-B */ ++ DBG("ID pin=%d\n", otg_dev->fsm.id); ++ if (otg_dev->fsm.id == 1) { ++ fsl_otg_start_host(&otg_dev->fsm, 0); ++ fsl_otg_drv_vbus(0); ++ fsl_otg_start_gadget(&otg_dev->fsm, 1); ++ } ++ ++ return 0; ++} ++ ++/* Set OTG port power, only for B-device */ ++static int fsl_otg_set_power(struct otg_transceiver *otg_p, unsigned mA) ++{ ++ if (!fsl_otg_dev) ++ return -ENODEV; ++ if (otg_p->state == OTG_STATE_B_PERIPHERAL) ++ printk(KERN_DEBUG "FSL OTG:Draw %d mA\n", mA); ++ ++ return 0; ++} ++ ++/* Delayed pin detect interrupt processing. ++ * ++ * When the Mini-A cable is disconnected from the board, ++ * the pin-detect interrupt happens before the disconnnect ++ * interrupts for the connected device(s). In order to ++ * process the disconnect interrupt(s) prior to switching ++ * roles, the pin-detect interrupts are delayed, and handled ++ * by this routine. ++ */ ++static void fsl_otg_event(struct work_struct *work) ++{ ++ struct fsl_otg *og = container_of(work, struct fsl_otg, otg_event.work); ++ struct otg_fsm *fsm = &og->fsm; ++ ++ VDBG("DDD fsm->id=%d\n", fsm->id); ++ if (fsm->id) { /* switch to gadget */ ++ fsl_otg_start_host(fsm, 0); ++ fsl_otg_drv_vbus(0); ++ fsl_otg_start_gadget(fsm, 1); ++ } ++} ++ ++/* B-device start SRP */ ++static int fsl_otg_start_srp(struct otg_transceiver *otg_p) ++{ ++ struct fsl_otg *otg_dev = container_of(otg_p, struct fsl_otg, otg); ++ ++ if (!otg_p || otg_dev != fsl_otg_dev ++ || otg_p->state != OTG_STATE_B_IDLE) ++ return -ENODEV; ++ ++ otg_dev->fsm.b_bus_req = 1; ++ otg_statemachine(&otg_dev->fsm); ++ ++ return 0; ++} ++ ++/* A_host suspend will call this function to start hnp */ ++static int fsl_otg_start_hnp(struct otg_transceiver *otg_p) ++{ ++ struct fsl_otg *otg_dev = container_of(otg_p, struct fsl_otg, otg); ++ ++ if (!otg_p || otg_dev != fsl_otg_dev) ++ return -ENODEV; ++ ++ VDBG("start_hnp.............\n"); ++ /* clear a_bus_req to enter a_suspend state */ ++ otg_dev->fsm.a_bus_req = 0; ++ otg_statemachine(&otg_dev->fsm); ++ ++ return 0; ++} ++ ++/* ++ * Interrupt handler. OTG/host/peripheral share the same int line. ++ * OTG driver clears OTGSC interrupts and leaves USB interrupts ++ * intact. It needs to have knowledge of some USB interrupts ++ * such as port change. ++ */ ++irqreturn_t fsl_otg_isr(int irq, void *dev_id) ++{ ++ struct otg_fsm *fsm = &((struct fsl_otg *)dev_id)->fsm; ++ struct otg_transceiver *otg = &((struct fsl_otg *)dev_id)->otg; ++ u32 otg_int_src, otg_sc; ++ ++ otg_sc = fsl_readl(&usb_dr_regs->otgsc); ++ otg_int_src = otg_sc & OTGSC_INTSTS_MASK & (otg_sc >> 8); ++ ++ /* Only clear otg interrupts */ ++ fsl_writel(otg_sc, &usb_dr_regs->otgsc); ++ ++ /*FIXME: ID change not generate when init to 0 */ ++ fsm->id = (otg_sc & OTGSC_STS_USB_ID) ? 1 : 0; ++ otg->default_a = (fsm->id == 0); ++ ++ /* process OTG interrupts */ ++ if (otg_int_src) { ++ VDBG("\nOTG irq 0x%08x\n", otg_int_src); ++ ++ if (otg_int_src & OTGSC_INTSTS_USB_ID) { ++ fsm->id = (otg_sc & OTGSC_STS_USB_ID) ? 1 : 0; ++ otg->default_a = (fsm->id == 0); ++ /* clear conn information */ ++ if (fsm->id) ++ fsm->b_conn = 0; ++ else ++ fsm->a_conn = 0; ++ ++ if (otg->host) ++ otg->host->is_b_host = fsm->id; ++ if (otg->gadget) ++ otg->gadget->is_a_peripheral = !fsm->id; ++ VDBG("ID int (ID is %d)\n", fsm->id); ++ ++ if (fsm->id) { /* switch to gadget */ ++ schedule_delayed_work(&((struct fsl_otg *) ++ dev_id)->otg_event, 25); ++ } else { /* switch to host */ ++ cancel_delayed_work(& ++ ((struct fsl_otg *)dev_id)-> ++ otg_event); ++ fsl_otg_start_gadget(fsm, 0); ++ fsl_otg_drv_vbus(1); ++ fsl_otg_start_host(fsm, 1); ++ } ++ ++ return IRQ_HANDLED; ++ } ++ } ++ ++ return IRQ_NONE; ++} ++ ++ ++#if 0 // DDD feta-final ++irqreturn_t foo_fsl_otg_isr(int irq, void *dev_id) ++{ ++ struct otg_fsm *fsm = &((struct fsl_otg *)dev_id)->fsm; ++ struct otg_transceiver *otg = &((struct fsl_otg *)dev_id)->otg; ++ u32 otg_int_src, usb_int_src, otg_sc; ++ int trigger = 0; ++ int tmp; ++ ++ usb_int_src = fsl_readl(&usb_dr_regs->usbsts); ++ otg_sc = fsl_readl(&usb_dr_regs->otgsc); ++ otg_int_src = otg_sc & OTGSC_INTSTS_MASK & (otg_sc >> 8); ++ ++ /* Only clear otg interrupts */ ++ fsl_writel(otg_sc, &usb_dr_regs->otgsc); ++ ++ /*FIXME: ID change not generate when init to 0 */ ++ /* process OTG interrupts */ ++ if (otg_int_src) { ++ VDBG("\nOTG irq 0x%08x\n", otg_int_src); ++ if (otg_int_src & OTGSC_INTSTS_1MS_TIMER) ++ trigger = fsl_otg_tick_timer(); ++ ++ if (otg_int_src & OTGSC_INTSTS_USB_ID) { ++ fsm->id = (otg_sc & OTGSC_STS_USB_ID) ? 1 : 0; ++ otg->default_a = (fsm->id == 0); ++ if (otg->host) ++ otg->host->is_b_host = fsm->id; ++ if (otg->gadget) ++ otg->gadget->is_a_peripheral = !fsm->id; ++ VDBG("IRQ=ID now=%d\n", fsm->id); ++ ++ if (fsm->id) { /* switch to gadget */ ++ schedule_delayed_work(&((struct fsl_otg *) ++ dev_id)->otg_event, 25); ++ } else { /* switch to host */ ++ cancel_delayed_work(& ++ ((struct fsl_otg *)dev_id)-> ++ otg_event); ++ fsl_otg_start_gadget(fsm, 0); ++ fsl_otg_drv_vbus(1); ++ fsl_otg_start_host(fsm, 1); ++ } ++ ++ return IRQ_HANDLED; ++ } ++ if (otg_int_src & OTGSC_INTSTS_DATA_PULSE) { ++ fsm->a_srp_det = 1; ++ trigger = 1; ++ VDBG("!!!!Data pulse int\n"); ++ } ++ if (otg_int_src & OTGSC_INTSTS_A_SESSION_VALID) { ++ fsm->a_sess_vld = ++ (otg_sc & OTGSC_STS_A_SESSION_VALID) ? 1 : 0; ++ /* detect VBUS pulsing */ ++ if ((fsm->transceiver->state == OTG_STATE_A_IDLE) ++ && fsm->a_sess_vld) ++ fsm->a_srp_det = 1; ++ trigger = 1; ++ VDBG("!!!a_sess_vld int state=%d\n", fsm->a_sess_vld); ++ } ++ if (otg_int_src & OTGSC_INTSTS_A_VBUS_VALID) { ++ fsm->a_vbus_vld = !!(otg_sc & OTGSC_STS_A_VBUS_VALID); ++ trigger = 1; ++ VDBG("!!!a_vbus_vld int state=%d\n", fsm->a_vbus_vld); ++ ++#if 1 ++ if ((fsm->a_vbus_vld == 0) && (fsm->id == 0)) { ++ if (fsm->transceiver->state != OTG_STATE_A_WAIT_VFALL) ++ /* Warning insted of transfer to Error state. */ ++ printk(KERN_WARNING "ulpi: The USB Device is " ++ "sinking too much current!!\n"); ++ fsm->a_vbus_vld = 1; ++ } ++#endif ++ ++ ++ } ++ if (otg_int_src & OTGSC_INTSTS_B_SESSION_VALID) { ++ fsm->b_sess_vld = ++ (otg_sc & OTGSC_STS_B_SESSION_VALID) ? 1 : 0; ++ trigger = 1; ++ /* SRP done */ ++ if ((fsl_otg_dev->otg.state == OTG_STATE_B_SRP_INIT) && ++ fsm->b_sess_vld && srp_wait_done) ++ fsm->b_srp_done = 1; ++ VDBG("!!!!b_sess_vld int state=%d\n", fsm->b_sess_vld); ++ } ++ if (otg_int_src & OTGSC_INTSTS_B_SESSION_END) { ++ fsm->b_sess_end = ++ (otg_sc & OTGSC_STS_B_SESSION_END) ? 1 : 0; ++ trigger = 1; ++ VDBG("!!!!b_sess_end int state=%d\n", fsm->b_sess_end); ++ } ++ } ++ ++ /* process USB interrupts */ ++ if ((usb_int_src & USB_STS_PORT_CHANGE) ++ && (fsm->protocol == PROTO_HOST)) { ++ VDBG("\nUSB irq A 0x%08x\n", usb_int_src); ++ /* Device resume do not generate statemachine change */ ++ if (fsl_readl(&usb_dr_regs->portsc1) & ++ PORTSCX_PORT_FORCE_RESUME) { ++ if (otg->default_a) { ++ fsm->b_bus_resume = 1; ++ trigger = 1; ++ } else { ++ fsm->a_bus_resume = 1; ++ trigger = 1; ++ } ++ } ++ ++ tmp = (fsl_readl(&usb_dr_regs->portsc1) & ++ PORTSCX_CURRENT_CONNECT_STATUS) ? 1 : 0; ++ if (otg->default_a && (fsm->b_conn != tmp)) { ++ fsm->b_conn = tmp; ++ trigger = 1; ++ } else if (!otg->default_a && (fsm->a_conn != tmp)) { ++ fsm->a_conn = tmp; ++ trigger = 1; ++ } ++ } ++ /* Workaround: sometimes CSC bit will lost. We change to ++ * polling CCS bit for connect change */ ++ if (fsm->protocol == PROTO_GADGET) { ++ if (usb_int_src & USB_STS_SUSPEND) { ++ VDBG("\nUSB irq B 0x%08x\n", usb_int_src); ++ VDBG("peripheral detected suspend\n"); ++ if (otg->default_a) ++ /* A-device detects B suspend */ ++ fsm->b_bus_suspend = 1; ++ else ++ /* B-device detects A suspend */ ++ fsm->a_bus_suspend = 1; ++ trigger = 1; ++ } else if (usb_int_src & USB_STS_PORT_CHANGE) { ++ VDBG("\nUSB irq C 0x%08x\n", usb_int_src); ++ VDBG("peripheral resumed\n"); ++ if (otg->default_a) ++ fsm->b_bus_suspend = 0; ++ else ++ fsm->a_bus_suspend = 0; ++ trigger = 1; ++ } ++ } ++ ++ /* Invoke statemachine until state is stable */ ++ while (trigger) { ++ trigger = otg_statemachine(fsm); ++ } ++ ++ return IRQ_HANDLED; ++} ++#endif ++ ++ ++static struct otg_fsm_ops fsl_otg_ops = { ++ .chrg_vbus = fsl_otg_chrg_vbus, ++ .drv_vbus = fsl_otg_drv_vbus, ++ .loc_conn = fsl_otg_loc_conn, ++ .loc_sof = fsl_otg_loc_sof, ++ .start_pulse = fsl_otg_start_pulse, ++ ++ .add_timer = fsl_otg_add_timer, ++ .del_timer = fsl_otg_del_timer, ++ ++ .start_host = fsl_otg_start_host, ++ .start_gadget = fsl_otg_start_gadget, ++}; ++ ++/* Initialize the global variable fsl_otg_dev and request IRQ for OTG */ ++int fsl_otg_cfg(struct platform_device *pdev) ++{ ++ int status; ++ struct fsl_otg *fsl_otg_tc; ++ struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data; ++ struct resource *res; ++ ++ DBG("\n"); ++ ++ if (fsl_otg_dev) ++ return 0; ++ ++ /* allocate space to fsl otg device */ ++ fsl_otg_tc = kzalloc(sizeof(struct fsl_otg), GFP_KERNEL); ++ if (!fsl_otg_tc) ++ return -ENODEV; ++ ++#if 1 // DDD ++ if (pdata->regs) { ++ fsl_otg_tc->dr_mem_map = pdata->regs; ++ } else { ++ res = platform_get_resource(pdev, IORESOURCE_MEM, 0); ++ if (!res) { ++ dev_err(&pdev->dev, "no register addr.\n"); ++ return -ENODEV; ++ } ++ ++ printk("DDD %s(): rsrc_start=0x%x rsrc_len=0x%x\n", ++ __FUNCTION__, res->start, res->end - res->start + 1); ++ ++ if (!request_mem_region(res->start, res->end - res->start + 1, ++ "OTG")) { ++ dev_dbg(&pdev->dev, "request_mem_region failed\n"); ++ return -EBUSY; ++ } ++ fsl_otg_tc->dr_mem_map = ioremap(res->start, ++ res->end - res->start + 1); ++ } ++ DBG("set dr_mem_map to 0x%p\n", fsl_otg_tc->dr_mem_map); ++ ++#endif ++ INIT_DELAYED_WORK(&fsl_otg_tc->otg_event, fsl_otg_event); ++ ++ INIT_LIST_HEAD(&active_timers); ++ fsl_otg_init_timers(&fsl_otg_tc->fsm); ++ ++ /* Set OTG state machine operations */ ++ fsl_otg_tc->fsm.ops = &fsl_otg_ops; ++ ++#if 1 /* DDD */ ++ /* record initial state of ID pin */ ++ fsl_otg_tc->fsm.id = (fsl_otg_tc->dr_mem_map->otgsc & OTGSC_STS_USB_ID) ++ ? 1 : 0; ++ DBG("initial ID pin=%d\n", fsl_otg_tc->fsm.id); ++#endif ++ /* initialize the otg structure */ ++ fsl_otg_tc->otg.label = DRIVER_DESC; ++ fsl_otg_tc->otg.set_host = fsl_otg_set_host; ++ fsl_otg_tc->otg.set_peripheral = fsl_otg_set_peripheral; ++ fsl_otg_tc->otg.set_power = fsl_otg_set_power; ++ fsl_otg_tc->otg.start_hnp = fsl_otg_start_hnp; ++ fsl_otg_tc->otg.start_srp = fsl_otg_start_srp; ++ ++ fsl_otg_dev = fsl_otg_tc; ++ ++ /* Store the otg transceiver */ ++ status = otg_set_transceiver(&fsl_otg_tc->otg); ++ if (status) { ++ printk(KERN_WARNING ": unable to register OTG transceiver.\n"); ++ return status; ++ } ++ ++ return 0; ++} ++ ++/* OTG Initialization*/ ++int usb_otg_start(struct platform_device *pdev) ++{ ++ struct fsl_otg *p_otg; ++ struct otg_transceiver *otg_trans = otg_get_transceiver(); ++ struct otg_fsm *fsm; ++ int status; ++ u32 temp; ++ struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data; ++ int timeout; ++ ++ DBG("\n"); ++ ++ p_otg = container_of(otg_trans, struct fsl_otg, otg); ++ fsm = &p_otg->fsm; ++ ++ /* Initialize the state machine structure with default values */ ++ SET_OTG_STATE(otg_trans, OTG_STATE_UNDEFINED); ++ fsm->transceiver = &p_otg->otg; ++ ++ usb_dr_regs = p_otg->dr_mem_map; ++ DBG("set usb_dr_regs to 0x%p\n", usb_dr_regs); ++ ++ /* request irq */ ++ p_otg->irq = platform_get_irq(pdev, 0); ++ status = request_irq(p_otg->irq, fsl_otg_isr, ++ IRQF_SHARED, driver_name, p_otg); ++ if (status) { ++ dev_dbg(p_otg->otg.dev, "can't get IRQ %d, error %d\n", ++ p_otg->irq, status); ++ kfree(p_otg); ++ return status; ++ } ++ ++ ++ /* stop the controller */ ++ temp = fsl_readl(&usb_dr_regs->usbcmd) & ~USB_CMD_RUN_STOP; ++ fsl_writel(temp, &usb_dr_regs->usbcmd); ++ ++ /* reset the controller */ ++ temp = fsl_readl(&usb_dr_regs->usbcmd); ++ temp |= USB_CMD_CTRL_RESET; ++ fsl_writel(temp, &usb_dr_regs->usbcmd); ++ ++ /* wait reset completed */ ++ timeout = 500; ++ while (timeout-- && ++ fsl_readl(&usb_dr_regs->usbcmd) & USB_CMD_CTRL_RESET) ++ udelay(1); ++ if (timeout <= 0) ++ ERR("%s - USBCMD_RST never clear. Timeout is %d \n", ++ __FUNCTION__, timeout); ++ ++ /* configure the VBUSHS as IDLE(both host and device) */ ++#if 0 ++ /* DDD really have to check into setting the following */ ++ fsl_writel(USB_MODE_STREAM_DISABLE, &usb_dr_regs->usbmode); ++#else ++ temp = USB_MODE_STREAM_DISABLE | (pdata->es ? USBMODE_ES : 0); ++ fsl_writel(temp, &usb_dr_regs->usbmode); ++#endif ++ ++ /* configure PHY interface */ ++ temp = fsl_readl(&usb_dr_regs->portsc1); ++ temp &= ~(PORTSCX_PHY_TYPE_SEL | PORTSCX_PTW_8BIT); ++ ++ /* DDD wrong xcvr setting stuff follows */ ++ temp |= PORTSCX_PTS_ULPI; ++ fsl_writel(temp, &usb_dr_regs->portsc1); ++ ++ ++ /* disable all interrupt and clear all OTGSC status */ ++ temp = fsl_readl(&usb_dr_regs->otgsc); ++ temp &= ~OTGSC_INTERRUPT_ENABLE_BITS_MASK; ++#if 0 // DDD ++ /* DDD only want ID int ++ * temp |= OTGSC_INTERRUPT_STATUS_BITS_MASK | OTGSC_CTRL_VBUS_DISCHARGE; ++ */ ++ temp |= OTGSC_IE_USB_ID; /* DDD added this */ ++ temp &= ~OTGSC_IE_1ms_TIMER; /* DDD added this */ ++#else ++ temp |= OTGSC_INTERRUPT_STATUS_BITS_MASK | OTGSC_CTRL_VBUS_DISCHARGE; ++#endif ++ fsl_writel(temp, &usb_dr_regs->otgsc); ++ ++ fsl_otg_drv_vbus(0); ++ ++#if 0 // DDD beta-final ++ temp = fsl_readl(&usb_dr_regs->otgsc); ++ temp |= OTGSC_IE_A_SESSION_VALID; ++ fsl_writel(temp, &usb_dr_regs->otgsc); ++#else ++ /* ++ * The identification (id) input is FALSE when a Mini-A plug is inserted ++ * in the devices Mini-AB receptacle. Otherwise, this input is TRUE. ++ * Also: record initial state of ID pin ++ */ ++ if (fsl_readl(&usb_dr_regs->otgsc) & OTGSC_STS_USB_ID) { ++ p_otg->otg.state = OTG_STATE_UNDEFINED; ++ p_otg->fsm.id = 1; ++ } else { ++ p_otg->otg.state = OTG_STATE_A_IDLE; ++ p_otg->fsm.id = 0; ++ } ++ ++ DBG("initial ID pin=%d\n", p_otg->fsm.id); ++ ++ /* enable OTG ID pin interrupt */ ++ temp = fsl_readl(&usb_dr_regs->otgsc); ++ temp |= OTGSC_IE_USB_ID; ++ temp &= ~(OTGSC_CTRL_VBUS_DISCHARGE | OTGSC_IE_1ms_TIMER); ++ fsl_writel(temp, &usb_dr_regs->otgsc); ++#endif ++ ++ return 0; ++} ++ ++/* Initialize board specific registers,PIB board,clock and pin multiplexing */ ++static int board_init(struct platform_device *pdev) ++{ ++ struct fsl_usb2_platform_data *pdata; ++ pdata = (struct fsl_usb2_platform_data *)pdev->dev.platform_data; ++ ++ /* ++ * do platform specific init: check the clock, grab/config pins, etc. ++ */ ++ if (pdata->platform_init(pdev) != 0) ++ return -EINVAL; ++ ++ return 0; ++} ++ ++/*------------------------------------------------------------------------- ++ PROC File System Support ++-------------------------------------------------------------------------*/ ++#ifdef CONFIG_USB_OTG_DEBUG_FILES ++ ++#include <linux/seq_file.h> ++ ++static const char proc_filename[] = "driver/fsl_usb2_otg"; ++ ++static int otg_proc_read(char *page, char **start, off_t off, int count, ++ int *eof, void *_dev) ++{ ++ struct otg_fsm *fsm = &fsl_otg_dev->fsm; ++ char *buf = page; ++ char *next = buf; ++ unsigned size = count; ++ unsigned long flags; ++ int t; ++ u32 tmp_reg; ++ ++ if (off != 0) ++ return 0; ++ ++ spin_lock_irqsave(&fsm->lock, flags); ++ ++ /* ------basic driver infomation ---- */ ++ t = scnprintf(next, size, ++ DRIVER_DESC "\n" "fsl_usb2_otg version: %s\n\n", ++ DRIVER_VERSION); ++ size -= t; ++ next += t; ++ ++ /* ------ Registers ----- */ ++ /* tmp_reg = le32_to_cpu(usb_dr_regs->otgsc); */ ++ tmp_reg = fsl_readl(&usb_dr_regs->otgsc); ++ t = scnprintf(next, size, "OTGSC reg: 0x%08x\n", tmp_reg); ++ size -= t; ++ next += t; ++ ++ /* tmp_reg = le32_to_cpu(usb_dr_regs->portsc); */ ++ tmp_reg = fsl_readl(&usb_dr_regs->portsc1); ++ t = scnprintf(next, size, "PORTSC reg: 0x%08x\n", tmp_reg); ++ size -= t; ++ next += t; ++ ++ /* tmp_reg = le32_to_cpu(usb_dr_regs->usbmode); */ ++ tmp_reg = fsl_readl(&usb_dr_regs->usbmode); ++ t = scnprintf(next, size, "USBMODE reg: 0x%08x\n", tmp_reg); ++ size -= t; ++ next += t; ++ ++ /* tmp_reg = le32_to_cpu(usb_dr_regs->usbcmd); */ ++ tmp_reg = fsl_readl(&usb_dr_regs->usbcmd); ++ t = scnprintf(next, size, "USBCMD reg: 0x%08x\n", tmp_reg); ++ size -= t; ++ next += t; ++ ++ /* tmp_reg = le32_to_cpu(usb_dr_regs->usbsts); */ ++ tmp_reg = fsl_readl(&usb_dr_regs->usbsts); ++ t = scnprintf(next, size, "USBSTS reg: 0x%08x\n", tmp_reg); ++ size -= t; ++ next += t; ++ ++ /* ------ State ----- */ ++ t = scnprintf(next, size, "FSM protocol=%d %s\n", fsm->protocol, ++ fsm->protocol ? ++ (fsm->protocol == PROTO_HOST ? "Host" : "Gadget") ++ : "None"); ++ size -= t; ++ next += t; ++ ++ t = scnprintf(next, size, ++ "OTG state: %s\n\n", ++ state_string(fsl_otg_dev->otg.state)); ++ size -= t; ++ next += t; ++ ++ /* ------ State Machine Variables ----- */ ++ t = scnprintf(next, size, "a_bus_req: %d\n", fsm->a_bus_req); ++ size -= t; ++ next += t; ++ ++ t = scnprintf(next, size, "b_bus_req: %d\n", fsm->b_bus_req); ++ size -= t; ++ next += t; ++ ++ t = scnprintf(next, size, "a_bus_resume: %d\n", fsm->a_bus_resume); ++ size -= t; ++ next += t; ++ ++ t = scnprintf(next, size, "a_bus_suspend: %d\n", fsm->a_bus_suspend); ++ size -= t; ++ next += t; ++ ++ t = scnprintf(next, size, "a_conn: %d\n", fsm->a_conn); ++ size -= t; ++ next += t; ++ ++ t = scnprintf(next, size, "a_sess_vld: %d\n", fsm->a_sess_vld); ++ size -= t; ++ next += t; ++ ++ t = scnprintf(next, size, "a_srp_det: %d\n", fsm->a_srp_det); ++ size -= t; ++ next += t; ++ ++ t = scnprintf(next, size, "a_vbus_vld: %d\n", fsm->a_vbus_vld); ++ size -= t; ++ next += t; ++ ++ t = scnprintf(next, size, "b_bus_resume: %d\n", fsm->b_bus_resume); ++ size -= t; ++ next += t; ++ ++ t = scnprintf(next, size, "b_bus_suspend: %d\n", fsm->b_bus_suspend); ++ size -= t; ++ next += t; ++ ++ t = scnprintf(next, size, "b_conn: %d\n", fsm->b_conn); ++ size -= t; ++ next += t; ++ ++ t = scnprintf(next, size, "b_se0_srp: %d\n", fsm->b_se0_srp); ++ size -= t; ++ next += t; ++ ++ t = scnprintf(next, size, "b_sess_end: %d\n", fsm->b_sess_end); ++ size -= t; ++ next += t; ++ ++ t = scnprintf(next, size, "b_sess_vld: %d\n", fsm->b_sess_vld); ++ size -= t; ++ next += t; ++ ++ t = scnprintf(next, size, "id: %d\n", fsm->id); ++ size -= t; ++ next += t; ++ ++ spin_unlock_irqrestore(&fsm->lock, flags); ++ ++ *eof = 1; ++ return count - size; ++} ++ ++#define create_proc_file() create_proc_read_entry(proc_filename, \ ++ 0, NULL, otg_proc_read, NULL) ++ ++#define remove_proc_file() remove_proc_entry(proc_filename, NULL) ++ ++#else /* !CONFIG_USB_OTG_DEBUG_FILES */ ++ ++#define create_proc_file() do {} while (0) ++#define remove_proc_file() do {} while (0) ++ ++#endif /*CONFIG_USB_OTG_DEBUG_FILES */ ++ ++/*----------------------------------------------------------*/ ++/* Char driver interface to control some OTG input */ ++ ++/* ++ * This function handle some ioctl command,such as get otg ++ * status and set host suspend ++ */ ++static int fsl_otg_ioctl(struct inode *inode, struct file *file, ++ unsigned int cmd, unsigned long arg) ++{ ++ u32 retval = 0; ++ ++ switch (cmd) { ++ case GET_OTG_STATUS: ++ retval = fsl_otg_dev->host_working; ++ break; ++ ++ case SET_A_SUSPEND_REQ: ++ fsl_otg_dev->fsm.a_suspend_req = arg; ++ break; ++ ++ case SET_A_BUS_DROP: ++ fsl_otg_dev->fsm.a_bus_drop = arg; ++ break; ++ ++ case SET_A_BUS_REQ: ++ fsl_otg_dev->fsm.a_bus_req = arg; ++ break; ++ ++ case SET_B_BUS_REQ: ++ fsl_otg_dev->fsm.b_bus_req = arg; ++ break; ++ ++ default: ++ break; ++ } ++ ++ otg_statemachine(&fsl_otg_dev->fsm); ++ ++ return retval; ++} ++ ++static int fsl_otg_open(struct inode *inode, struct file *file) ++{ ++ ++ return 0; ++} ++ ++static int fsl_otg_release(struct inode *inode, struct file *file) ++{ ++ ++ return 0; ++} ++ ++static struct file_operations otg_fops = { ++ .owner = THIS_MODULE, ++ .llseek = NULL, ++ .read = NULL, ++ .write = NULL, ++ .ioctl = fsl_otg_ioctl, ++ .open = fsl_otg_open, ++ .release = fsl_otg_release, ++}; ++ ++static int __init fsl_otg_probe(struct platform_device *pdev) ++{ ++ int status; ++ struct fsl_usb2_platform_data *pdata; ++ ++ DBG("pdev=0x%p\n", pdev); ++ ++ if (!pdev) ++ return -ENODEV; ++ ++ if (!pdev->dev.platform_data) ++ return -ENOMEM; ++ ++ pdata = pdev->dev.platform_data; ++#if 1 // DDD do this elsewhere ++ /* Initialize the clock, multiplexing pin and PHY interface */ ++ board_init(pdev); ++#endif ++ ++ /* configure the OTG */ ++ status = fsl_otg_cfg(pdev); ++ if (status) { ++ printk(KERN_INFO "Couldn't init OTG module\n"); ++ return -status; ++ } ++ ++ /* start OTG */ ++ status = usb_otg_start(pdev); ++ ++ if (register_chrdev(FSL_OTG_MAJOR, FSL_OTG_NAME, &otg_fops)) { ++ printk(KERN_WARNING FSL_OTG_NAME ++ ": unable to register FSL OTG device\n"); ++ return -EIO; ++ } ++ ++ create_proc_file(); ++ return status; ++} ++ ++static int fsl_otg_remove(struct platform_device *pdev) ++{ ++ u32 ie; ++ struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data; ++ unsigned long flags; ++ ++ DBG("pdev=0x%p pdata=0x%p\n", pdev, pdata); ++ ++ otg_set_transceiver(NULL); ++ ++ /* disable and clear OTGSC interrupts */ ++ spin_lock_irqsave(&usb_dr_regs_lock, flags); ++ ie = fsl_readl(&usb_dr_regs->otgsc); ++ ie &= ~OTGSC_INTERRUPT_ENABLE_BITS_MASK; ++ ie |= OTGSC_INTERRUPT_STATUS_BITS_MASK; ++ fsl_writel(ie, &usb_dr_regs->otgsc); ++ spin_unlock_irqrestore(&usb_dr_regs_lock, flags); ++ ++ free_irq(fsl_otg_dev->irq, fsl_otg_dev); ++ ++ kfree(fsl_otg_dev); ++ ++ remove_proc_file(); ++ ++ unregister_chrdev(FSL_OTG_MAJOR, FSL_OTG_NAME); ++ ++ if (pdata->platform_uninit) ++ pdata->platform_uninit(pdev); ++ ++ fsl_otg_dev = NULL; ++ return 0; ++} ++ ++struct platform_driver fsl_otg_driver = { ++ .probe = fsl_otg_probe, ++ .remove = fsl_otg_remove, ++ .driver = { ++ .name = driver_name, ++ .owner = THIS_MODULE, ++ }, ++}; ++ ++/*-------------------------------------------------------------------------*/ ++ ++static int __init fsl_usb_otg_init(void) ++{ ++ printk(KERN_INFO DRIVER_DESC " loaded, %s\n", DRIVER_VERSION); ++ return platform_driver_register(&fsl_otg_driver); ++} ++ ++static void __exit fsl_usb_otg_exit(void) ++{ ++ platform_driver_unregister(&fsl_otg_driver); ++} ++ ++module_init(fsl_usb_otg_init); ++module_exit(fsl_usb_otg_exit); ++ ++MODULE_DESCRIPTION(DRIVER_INFO); ++MODULE_AUTHOR(DRIVER_AUTHOR); ++MODULE_LICENSE("GPL"); +--- /dev/null ++++ b/drivers/usb/otg/fsl_otg.h +@@ -0,0 +1,139 @@ ++/* ++ * Copyright 2005-2007 Freescale Semiconductor, Inc. All Rights Reserved. ++ */ ++ ++/* ++ * The code contained herein is licensed under the GNU General Public ++ * License. You may obtain a copy of the GNU General Public License ++ * Version 2 or later at the following locations: ++ * ++ * http://www.opensource.org/licenses/gpl-license.html ++ * http://www.gnu.org/copyleft/gpl.html ++ */ ++ ++#ifndef FSL_OTG_H ++#define FSL_OTG_H ++#include <linux/usb/otg.h> ++#include "otg_fsm.h" ++#include <linux/ioctl.h> ++ ++#define ERR(format, arg...) \ ++printk(KERN_ERR "%s:%s: " format "\n" , __FILE__, __FUNCTION__ , ## arg) ++ ++/* ++ * A-DEVICE timing constants ++ */ ++ ++/* Wait for VBUS Rise */ ++#define TA_WAIT_VRISE (100) /* a_wait_vrise 100 ms, section: 6.6.5.1 */ ++ ++/* Wait for B-Connect */ ++#define TA_WAIT_BCON (10000) /* a_wait_bcon > 1 sec, section: 6.6.5.2 ++ * This is only used to get out of ++ * OTG_STATE_A_WAIT_BCON state if there was ++ * no connection for these many milliseconds ++ */ ++ ++/* A-Idle to B-Disconnect */ ++/* It is necessary for this timer to be more than 750 ms because of a bug in OPT ++ * test 5.4 in which B OPT disconnects after 750 ms instead of 75ms as stated ++ * in the test description ++ */ ++#define TA_AIDL_BDIS (5000) /* a_suspend minimum 200 ms, section: 6.6.5.3 */ ++ ++/* B-Idle to A-Disconnect */ ++#define TA_BIDL_ADIS (12) /* 3 to 200 ms */ ++ ++/* B-device timing constants */ ++ ++/* Data-Line Pulse Time*/ ++#define TB_DATA_PLS (10) /* b_srp_init,continue 5~10ms, section:5.3.3 */ ++#define TB_DATA_PLS_MIN (5) /* minimum 5 ms */ ++#define TB_DATA_PLS_MAX (10) /* maximum 10 ms */ ++ ++/* SRP Initiate Time */ ++#define TB_SRP_INIT (100) /* b_srp_init,maximum 100 ms, section:5.3.8 */ ++ ++/* SRP Fail Time */ ++#define TB_SRP_FAIL (7000) /* b_srp_init,Fail time 5~30s, section:6.8.2.2 */ ++ ++/* SRP result wait time */ ++#define TB_SRP_WAIT (60) ++ ++/* VBus time */ ++#define TB_VBUS_PLS (30) /* time to keep vbus pulsing asserted */ ++ ++/* Discharge time */ ++/* This time should be less than 10ms. It varies from system to system. */ ++#define TB_VBUS_DSCHRG (8) ++ ++/* A-SE0 to B-Reset */ ++#define TB_ASE0_BRST (20) /* b_wait_acon, mini 3.125 ms,section:6.8.2.4 */ ++ ++/* A bus suspend timer before we can switch to b_wait_aconn */ ++#define TB_A_SUSPEND (7) ++#define TB_BUS_RESUME (12) ++ ++/* SE0 Time Before SRP */ ++#define TB_SE0_SRP (2) /* b_idle,minimum 2 ms, section:5.3.2 */ ++ ++#define SET_OTG_STATE(otg_ptr, newstate) ((otg_ptr)->state = newstate) ++ ++ ++struct fsl_otg_timer { ++ unsigned long expires; /* Number of count increase to timeout */ ++ unsigned long count; /* Tick counter */ ++ void (*function) (unsigned long); /* Timeout function */ ++ unsigned long data; /* Data passed to function */ ++ struct list_head list; ++}; ++ ++struct fsl_otg_timer inline *otg_timer_initializer ++ (void (*function) (unsigned long), unsigned long expires, ++ unsigned long data) { ++ struct fsl_otg_timer *timer; ++ timer = kmalloc(sizeof(struct fsl_otg_timer), GFP_KERNEL); ++ if (timer == NULL) ++ return NULL; ++ timer->function = function; ++ timer->expires = expires; ++ timer->data = data; ++ return timer; ++} ++ ++struct fsl_otg { ++ struct otg_transceiver otg; ++ struct otg_fsm fsm; ++ struct fsl_usb_device_regs *dr_mem_map; ++ struct delayed_work otg_event; ++ ++ /*used for usb host */ ++ u8 host_working; ++ u8 on_off; ++ ++ int irq; ++}; ++ ++struct fsl_otg_config { ++ u8 otg_port; ++}; ++ ++/*For SRP and HNP handle*/ ++#define FSL_OTG_MAJOR 66 ++#define FSL_OTG_NAME "fsl-otg" ++/*Command to OTG driver(ioctl)*/ ++#define OTG_IOCTL_MAGIC FSL_OTG_MAJOR ++/*if otg work as host,it should return 1,otherwise it return 0*/ ++#define GET_OTG_STATUS _IOR(OTG_IOCTL_MAGIC, 1, int) ++#define SET_A_SUSPEND_REQ _IOW(OTG_IOCTL_MAGIC, 2, int) ++#define SET_A_BUS_DROP _IOW(OTG_IOCTL_MAGIC, 3, int) ++#define SET_A_BUS_REQ _IOW(OTG_IOCTL_MAGIC, 4, int) ++#define SET_B_BUS_REQ _IOW(OTG_IOCTL_MAGIC, 5, int) ++#define GET_A_SUSPEND_REQ _IOR(OTG_IOCTL_MAGIC, 6, int) ++#define GET_A_BUS_DROP _IOR(OTG_IOCTL_MAGIC, 7, int) ++#define GET_A_BUS_REQ _IOR(OTG_IOCTL_MAGIC, 8, int) ++#define GET_B_BUS_REQ _IOR(OTG_IOCTL_MAGIC, 9, int) ++ ++ ++/********************************************************************/ ++#endif +--- /dev/null ++++ b/drivers/usb/otg/otg_fsm.c +@@ -0,0 +1,381 @@ ++/* OTG Finite State Machine from OTG spec ++ * ++ * Copyright (C) 2007 Freescale Semiconductor, Inc. ++ * ++ * Author: Li Yang <LeoLi@freescale.com> ++ * Jerry Huang <Chang-Ming.Huang@freescale.com> ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with this program; if not, write to the Free Software Foundation, Inc., ++ * 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++#include <linux/kernel.h> ++#include <linux/types.h> ++#include <linux/usb/otg.h> ++#include <linux/spinlock.h> ++#include <linux/delay.h> ++#include <linux/usb.h> ++#include <linux/usb_gadget.h> ++ ++#include "otg_fsm.h" ++ ++ ++/* Defined by device specific driver, for different timer implementation */ ++extern void *a_wait_vrise_tmr, *a_wait_bcon_tmr, *a_aidl_bdis_tmr, ++ *b_ase0_brst_tmr, *b_se0_srp_tmr, *b_srp_fail_tmr, *a_wait_enum_tmr; ++ ++const char *state_string(enum usb_otg_state state) ++{ ++ switch (state) { ++ case OTG_STATE_A_IDLE: return "a_idle"; ++ case OTG_STATE_A_WAIT_VRISE: return "a_wait_vrise"; ++ case OTG_STATE_A_WAIT_BCON: return "a_wait_bcon"; ++ case OTG_STATE_A_HOST: return "a_host"; ++ case OTG_STATE_A_SUSPEND: return "a_suspend"; ++ case OTG_STATE_A_PERIPHERAL: return "a_peripheral"; ++ case OTG_STATE_A_WAIT_VFALL: return "a_wait_vfall"; ++ case OTG_STATE_A_VBUS_ERR: return "a_vbus_err"; ++ case OTG_STATE_B_IDLE: return "b_idle"; ++ case OTG_STATE_B_SRP_INIT: return "b_srp_init"; ++ case OTG_STATE_B_PERIPHERAL: return "b_peripheral"; ++ case OTG_STATE_B_WAIT_ACON: return "b_wait_acon"; ++ case OTG_STATE_B_HOST: return "b_host"; ++ default: return "UNDEFINED"; ++ } ++} ++EXPORT_SYMBOL(state_string); ++ ++/* Change USB protocol when there is a protocol change */ ++static int otg_set_protocol(struct otg_fsm *fsm, int protocol) ++{ ++ int ret = 0; ++ ++ VDBG("DDD old fsm->protocol= %d; new protocol= %d\n", ++ fsm->protocol, protocol); ++ if (fsm->protocol != protocol) { ++ VDBG("Changing role fsm->protocol= %d; new protocol= %d\n", ++ fsm->protocol, protocol); ++ /* stop old protocol */ ++ if (fsm->protocol == PROTO_HOST) ++ ret = fsm->ops->start_host(fsm, 0); ++ else if (fsm->protocol == PROTO_GADGET) ++ ret = fsm->ops->start_gadget(fsm, 0); ++ if (ret) ++ return ret; ++ ++ /* start new protocol */ ++ if (protocol == PROTO_HOST) ++ ret = fsm->ops->start_host(fsm, 1); ++ else if (protocol == PROTO_GADGET) ++ ret = fsm->ops->start_gadget(fsm, 1); ++ if (ret) ++ return ret; ++ ++ fsm->protocol = protocol; ++ return 0; ++ } ++ ++ return 0; ++} ++ ++static int state_changed; ++ ++/* Called when leaving a state. Do state clean up jobs here */ ++static void otg_leave_state(struct otg_fsm *fsm, enum usb_otg_state old_state) ++{ ++ switch (old_state) { ++ case OTG_STATE_B_IDLE: ++ otg_del_timer(fsm, fsm->b_se0_srp_tmr); ++ fsm->b_se0_srp = 0; ++ break; ++ case OTG_STATE_B_SRP_INIT: ++ fsm->b_srp_done = 0; ++ break; ++ case OTG_STATE_B_PERIPHERAL: ++ break; ++ case OTG_STATE_B_WAIT_ACON: ++ otg_del_timer(fsm, fsm->b_ase0_brst_tmr); ++ fsm->b_ase0_brst_tmout = 0; ++ break; ++ case OTG_STATE_B_HOST: ++ break; ++ case OTG_STATE_A_IDLE: ++ break; ++ case OTG_STATE_A_WAIT_VRISE: ++ otg_del_timer(fsm, fsm->a_wait_vrise_tmr); ++ fsm->a_wait_vrise_tmout = 0; ++ break; ++ case OTG_STATE_A_WAIT_BCON: ++ otg_del_timer(fsm, fsm->a_wait_bcon_tmr); ++ fsm->a_wait_bcon_tmout = 0; ++ break; ++ case OTG_STATE_A_HOST: ++ otg_del_timer(fsm, fsm->a_wait_enum_tmr); ++ break; ++ case OTG_STATE_A_SUSPEND: ++ otg_del_timer(fsm, fsm->a_aidl_bdis_tmr); ++ fsm->a_aidl_bdis_tmout = 0; ++ fsm->a_suspend_req = 0; ++ fsm->a_bus_req = 1; /* FIXME */ ++ break; ++ case OTG_STATE_A_PERIPHERAL: ++ break; ++ case OTG_STATE_A_WAIT_VFALL: ++ otg_del_timer(fsm, fsm->a_wait_vrise_tmr); ++ break; ++ case OTG_STATE_A_VBUS_ERR: ++ break; ++ default: ++ break; ++ } ++} ++ ++/* Called when entering a state */ ++static int otg_set_state(struct otg_fsm *fsm, enum usb_otg_state new_state) ++{ ++ state_changed = 1; ++ VDBG("State: old=%s new=%s \n", ++ state_string(fsm->transceiver->state), state_string(new_state)); ++ ++ if (fsm->transceiver->state == new_state) ++ return 0; ++ ++ otg_leave_state(fsm, fsm->transceiver->state); ++ switch (new_state) { ++ case OTG_STATE_B_IDLE: ++ otg_drv_vbus(fsm, 0); ++ otg_chrg_vbus(fsm, 0); ++ otg_loc_conn(fsm, 0); ++ otg_loc_sof(fsm, 0); ++ otg_set_protocol(fsm, PROTO_UNDEF); ++ otg_add_timer(fsm, fsm->b_se0_srp_tmr); ++ break; ++ case OTG_STATE_B_SRP_INIT: ++ otg_start_pulse(fsm); ++ otg_loc_sof(fsm, 0); ++ otg_set_protocol(fsm, PROTO_UNDEF); ++ otg_add_timer(fsm, fsm->b_srp_fail_tmr); ++ break; ++ case OTG_STATE_B_PERIPHERAL: ++ otg_chrg_vbus(fsm, 0); ++ otg_loc_conn(fsm, 1); ++ otg_loc_sof(fsm, 0); ++ otg_set_protocol(fsm, PROTO_GADGET); ++ break; ++ case OTG_STATE_B_WAIT_ACON: ++ otg_chrg_vbus(fsm, 0); ++ otg_loc_conn(fsm, 0); ++ otg_loc_sof(fsm, 0); ++ otg_set_protocol(fsm, PROTO_HOST); ++ otg_add_timer(fsm, fsm->b_ase0_brst_tmr); ++ fsm->a_bus_suspend = 0; ++ break; ++ case OTG_STATE_B_HOST: ++ otg_chrg_vbus(fsm, 0); ++ otg_loc_conn(fsm, 0); ++ otg_loc_sof(fsm, 1); ++ otg_set_protocol(fsm, PROTO_HOST); ++ usb_bus_start_enum(fsm->transceiver->host, ++ fsm->transceiver->host->otg_port); ++ break; ++ case OTG_STATE_A_IDLE: ++ otg_drv_vbus(fsm, 0); ++ otg_chrg_vbus(fsm, 0); ++ otg_loc_conn(fsm, 0); ++ otg_loc_sof(fsm, 0); ++ otg_set_protocol(fsm, PROTO_HOST); ++ break; ++ case OTG_STATE_A_WAIT_VRISE: ++ otg_drv_vbus(fsm, 1); ++ otg_loc_conn(fsm, 0); ++ otg_loc_sof(fsm, 0); ++ otg_set_protocol(fsm, PROTO_HOST); ++ otg_add_timer(fsm, fsm->a_wait_vrise_tmr); ++ break; ++ case OTG_STATE_A_WAIT_BCON: ++ otg_drv_vbus(fsm, 1); ++ otg_loc_conn(fsm, 0); ++ otg_loc_sof(fsm, 0); ++ otg_set_protocol(fsm, PROTO_HOST); ++ otg_add_timer(fsm, fsm->a_wait_bcon_tmr); ++ break; ++ case OTG_STATE_A_HOST: ++ otg_drv_vbus(fsm, 1); ++ otg_loc_conn(fsm, 0); ++ otg_loc_sof(fsm, 1); ++ otg_set_protocol(fsm, PROTO_HOST); ++ /* ++ * When HNP is triggered while a_bus_req = 0, a_host will ++ * suspend too fast to complete a_set_b_hnp_en ++ */ ++ if (!fsm->a_bus_req || fsm->a_suspend_req) ++ otg_add_timer(fsm, fsm->a_wait_enum_tmr); ++ break; ++ case OTG_STATE_A_SUSPEND: ++ otg_drv_vbus(fsm, 1); ++ otg_loc_conn(fsm, 0); ++ otg_loc_sof(fsm, 0); ++ otg_set_protocol(fsm, PROTO_HOST); ++ otg_add_timer(fsm, fsm->a_aidl_bdis_tmr); ++ ++ break; ++ case OTG_STATE_A_PERIPHERAL: ++ otg_loc_conn(fsm, 1); ++ otg_loc_sof(fsm, 0); ++ otg_set_protocol(fsm, PROTO_GADGET); ++ otg_drv_vbus(fsm, 1); ++ break; ++ case OTG_STATE_A_WAIT_VFALL: ++ otg_drv_vbus(fsm, 0); ++ otg_loc_conn(fsm, 0); ++ otg_loc_sof(fsm, 0); ++ otg_set_protocol(fsm, PROTO_HOST); ++ break; ++ case OTG_STATE_A_VBUS_ERR: ++ otg_drv_vbus(fsm, 0); ++ otg_loc_conn(fsm, 0); ++ otg_loc_sof(fsm, 0); ++ otg_set_protocol(fsm, PROTO_UNDEF); ++ break; ++ default: ++ break; ++ } ++ ++ fsm->transceiver->state = new_state; ++ return 0; ++} ++ ++/* State change judgement */ ++int otg_statemachine(struct otg_fsm *fsm) ++{ ++ enum usb_otg_state state; ++ unsigned long flags; ++ ++ spin_lock_irqsave(&fsm->lock, flags); ++ ++ state = fsm->transceiver->state; ++ state_changed = 0; ++ /* State machine state change judgement */ ++ ++ VDBG(" State: %s \n", state_string(state)); ++ ++ switch (state) { ++ case OTG_STATE_UNDEFINED: ++ if (fsm->id) ++ otg_set_state(fsm, OTG_STATE_B_IDLE); ++ else ++ otg_set_state(fsm, OTG_STATE_A_IDLE); ++ break; ++ case OTG_STATE_B_IDLE: ++ if (!fsm->id) ++ otg_set_state(fsm, OTG_STATE_A_IDLE); ++ else if (fsm->b_sess_vld && fsm->transceiver->gadget) ++ otg_set_state(fsm, OTG_STATE_B_PERIPHERAL); ++ else if (fsm->b_bus_req && fsm->b_sess_end && fsm->b_se0_srp) ++ otg_set_state(fsm, OTG_STATE_B_SRP_INIT); ++ break; ++ case OTG_STATE_B_SRP_INIT: ++ if (!fsm->id || fsm->b_srp_done) ++ otg_set_state(fsm, OTG_STATE_B_IDLE); ++ break; ++ case OTG_STATE_B_PERIPHERAL: ++ if (!fsm->id || !fsm->b_sess_vld) ++ otg_set_state(fsm, OTG_STATE_B_IDLE); ++ else if (fsm->b_bus_req && ++ fsm->transceiver-> ++ gadget->b_hnp_enable && fsm->a_bus_suspend) ++ otg_set_state(fsm, OTG_STATE_B_WAIT_ACON); ++ break; ++ case OTG_STATE_B_WAIT_ACON: ++ if (fsm->a_conn) ++ otg_set_state(fsm, OTG_STATE_B_HOST); ++ else if (!fsm->id || !fsm->b_sess_vld) ++ otg_set_state(fsm, OTG_STATE_B_IDLE); ++ else if (fsm->a_bus_resume || fsm->b_ase0_brst_tmout) { ++ fsm->b_ase0_brst_tmout = 0; ++ otg_set_state(fsm, OTG_STATE_B_PERIPHERAL); ++ } ++ break; ++ case OTG_STATE_B_HOST: ++ if (!fsm->id || !fsm->b_sess_vld) ++ otg_set_state(fsm, OTG_STATE_B_IDLE); ++ else if (!fsm->b_bus_req || !fsm->a_conn) ++ otg_set_state(fsm, OTG_STATE_B_PERIPHERAL); ++ break; ++ case OTG_STATE_A_IDLE: ++ if (fsm->id) ++ otg_set_state(fsm, OTG_STATE_B_IDLE); ++ else if (!fsm->a_bus_drop && (fsm->a_bus_req || fsm->a_srp_det)) ++ otg_set_state(fsm, OTG_STATE_A_WAIT_VRISE); ++ break; ++ case OTG_STATE_A_WAIT_VRISE: ++ if (fsm->id || fsm->a_bus_drop || fsm->a_vbus_vld || ++ fsm->a_wait_vrise_tmout) { ++ otg_set_state(fsm, OTG_STATE_A_WAIT_BCON); ++ } ++ break; ++ case OTG_STATE_A_WAIT_BCON: ++ if (!fsm->a_vbus_vld) ++ otg_set_state(fsm, OTG_STATE_A_VBUS_ERR); ++ else if (fsm->id | fsm->a_bus_drop | fsm->a_wait_bcon_tmout) ++ otg_set_state(fsm, OTG_STATE_A_WAIT_VFALL); ++ else if (fsm->b_conn) ++ otg_set_state(fsm, OTG_STATE_A_HOST); ++ break; ++ case OTG_STATE_A_HOST: ++ if ((!fsm->a_bus_req || fsm->a_suspend_req) && ++ fsm->transceiver->host->b_hnp_enable) ++ otg_set_state(fsm, OTG_STATE_A_SUSPEND); ++ else if (fsm->id || !fsm->b_conn || fsm->a_bus_drop) ++ otg_set_state(fsm, OTG_STATE_A_WAIT_BCON); ++ else if (!fsm->a_vbus_vld) ++ otg_set_state(fsm, OTG_STATE_A_VBUS_ERR); ++ break; ++ case OTG_STATE_A_SUSPEND: ++ if (!fsm->b_conn && fsm->transceiver->host->b_hnp_enable) ++ otg_set_state(fsm, OTG_STATE_A_PERIPHERAL); ++ else if (!fsm->b_conn && !fsm->transceiver->host->b_hnp_enable) ++ otg_set_state(fsm, OTG_STATE_A_WAIT_BCON); ++ else if (fsm->a_bus_req || fsm->b_bus_resume) ++ otg_set_state(fsm, OTG_STATE_A_HOST); ++ else if (fsm->id || fsm->a_bus_drop || fsm->a_aidl_bdis_tmout) ++ otg_set_state(fsm, OTG_STATE_A_WAIT_VFALL); ++ else if (!fsm->a_vbus_vld) ++ otg_set_state(fsm, OTG_STATE_A_VBUS_ERR); ++ break; ++ case OTG_STATE_A_PERIPHERAL: ++ if (fsm->id || fsm->a_bus_drop) ++ otg_set_state(fsm, OTG_STATE_A_WAIT_VFALL); ++ else if (fsm->b_bus_suspend) ++ otg_set_state(fsm, OTG_STATE_A_WAIT_BCON); ++ else if (!fsm->a_vbus_vld) ++ otg_set_state(fsm, OTG_STATE_A_VBUS_ERR); ++ break; ++ case OTG_STATE_A_WAIT_VFALL: ++ if (fsm->id || fsm->a_bus_req || (!fsm->a_sess_vld && ++ !fsm->b_conn)) ++ otg_set_state(fsm, OTG_STATE_A_IDLE); ++ break; ++ case OTG_STATE_A_VBUS_ERR: ++ if (fsm->id || fsm->a_bus_drop || fsm->a_clr_err) ++ otg_set_state(fsm, OTG_STATE_A_WAIT_VFALL); ++ break; ++ default: ++ break; ++ } ++ spin_unlock_irqrestore(&fsm->lock, flags); ++ ++ return state_changed; ++} ++EXPORT_SYMBOL(otg_statemachine); +--- /dev/null ++++ b/drivers/usb/otg/otg_fsm.h +@@ -0,0 +1,170 @@ ++/* Copyright (C) 2006-2007 Freescale Semiconductor, Inc. ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with this program; if not, write to the Free Software Foundation, Inc., ++ * 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++#ifndef OTG_FSM_H ++#define OTG_FSM_H ++ ++#if 1 ++#define DEBUG 1 ++#define VERBOSE 1 ++#endif ++ ++#ifdef DEBUG ++#define DBG(fmt, args...) printk(KERN_DEBUG "[%s] " fmt , \ ++ __FUNCTION__, ## args) ++#else ++#define DBG(fmt, args...) do {} while (0) ++#endif ++ ++#ifdef VERBOSE ++#define VDBG DBG ++#else ++#define VDBG(stuff...) do {} while (0) ++#endif ++ ++#ifdef VERBOSE ++#define MPC_LOC printk("Current Location [%s]:[%d]\n", __FILE__, __LINE__) ++#else ++#define MPC_LOC do {} while (0) ++#endif ++ ++#define PROTO_UNDEF 0 ++#define PROTO_HOST 1 ++#define PROTO_GADGET 2 ++ ++ ++ ++ ++ ++/* OTG state machine according to the OTG spec */ ++struct otg_fsm { ++ /* Input */ ++ int a_bus_resume; ++ int a_bus_suspend; ++ int a_conn; ++ int a_sess_vld; ++ int a_srp_det; ++ int a_vbus_vld; ++ int b_bus_resume; ++ int b_bus_suspend; ++ int b_conn; ++ int b_se0_srp; ++ int b_sess_end; ++ int b_sess_vld; ++ int id; ++ ++ /* Internal variables */ ++ int a_set_b_hnp_en; ++ int b_srp_done; ++ int b_hnp_enable; ++ ++ /* Timeout indicator for timers */ ++ int a_wait_vrise_tmout; ++ int a_wait_bcon_tmout; ++ int a_aidl_bdis_tmout; ++ int b_ase0_brst_tmout; ++ ++ /* Informative variables */ ++ int a_bus_drop; ++ int a_bus_req; ++ int a_clr_err; ++ int a_suspend_req; ++ int b_bus_req; ++ ++ /* Output */ ++ int drv_vbus; ++ int loc_conn; ++ int loc_sof; ++ ++ struct otg_fsm_ops *ops; ++ struct otg_transceiver *transceiver; ++ ++ void *a_wait_vrise_tmr; ++ void *a_wait_bcon_tmr; ++ void *a_aidl_bdis_tmr; ++ void *b_ase0_brst_tmr; ++ void *b_se0_srp_tmr; ++ void *b_srp_fail_tmr; ++ void *a_wait_enum_tmr; ++ ++ /* Current usb protocol used: 0:undefine; 1:host; 2:client */ ++ int protocol; ++ spinlock_t lock; /* fsm lock */ ++}; ++ ++struct otg_fsm_ops { ++ void (*chrg_vbus)(int on); ++ void (*drv_vbus)(int on); ++ void (*loc_conn)(int on); ++ void (*loc_sof)(int on); ++ void (*start_pulse)(void); ++ void (*add_timer)(void *timer); ++ void (*del_timer)(void *timer); ++ int (*start_host)(struct otg_fsm *fsm, int on); ++ int (*start_gadget)(struct otg_fsm *fsm, int on); ++}; ++ ++ ++static inline void otg_chrg_vbus(struct otg_fsm *fsm, int on) ++{ ++ fsm->ops->chrg_vbus(on); ++} ++ ++static inline void otg_drv_vbus(struct otg_fsm *fsm, int on) ++{ ++ if (fsm->drv_vbus != on) { ++ fsm->drv_vbus = on; ++ fsm->ops->drv_vbus(on); ++ } ++} ++ ++static inline void otg_loc_conn(struct otg_fsm *fsm, int on) ++{ ++ if (fsm->loc_conn != on) { ++ fsm->loc_conn = on; ++ fsm->ops->loc_conn(on); ++ } ++} ++ ++static inline void otg_loc_sof(struct otg_fsm *fsm, int on) ++{ ++ if (fsm->loc_sof != on) { ++ fsm->loc_sof = on; ++ fsm->ops->loc_sof(on); ++ } ++} ++ ++static inline void otg_start_pulse(struct otg_fsm *fsm) ++{ ++ fsm->ops->start_pulse(); ++} ++ ++static inline void otg_add_timer(struct otg_fsm *fsm, void *timer) ++{ ++ fsm->ops->add_timer(timer); ++} ++ ++static inline void otg_del_timer(struct otg_fsm *fsm, void *timer) ++{ ++ fsm->ops->del_timer(timer); ++} ++ ++extern int otg_statemachine(struct otg_fsm *fsm); ++ ++extern const char *state_string(enum usb_otg_state state); ++ ++#endif +--- a/include/asm-m68k/mcf5445x_usb.h ++++ b/include/asm-m68k/mcf5445x_usb.h +@@ -41,7 +41,8 @@ static inline void fsl_platform_set_host + + /* set host mode and select "big endian" */ + temp = fsl_readl(®s->usbmode); +- fsl_writel(temp | USBMODE_CM_HOST | USBMODE_ES, ®s->usbmode); ++ temp |= USBMODE_CM_HOST | (pdata->es ? USBMODE_ES : 0); ++ fsl_writel(temp, ®s->usbmode); + + pr_debug("%s: set usbmode to 0x%x\n\n", __FUNCTION__, + fsl_readl(®s->usbmode)); +--- a/include/linux/fsl_devices.h ++++ b/include/linux/fsl_devices.h +@@ -91,6 +91,19 @@ enum fsl_usb2_operating_modes { + FSL_USB2_DR_OTG, + }; + ++/* DDD ++ * replace _operating_modes with _controller ++ * ++ * the operating_mode tests in fsl_platform_verify() aren't needed, ++ * since the ehci driver isn't going to be probe()d unless it's ++ * "fsl-ehci" device anyway, and what we really need to know is ++ * which controller (MPH/DR) we're dealing with ++ */ ++enum fsl_usb2_controller { ++ FSL_USB2_MPH, ++ FSL_USB2_DR, ++}; ++ + enum fsl_usb2_phy_modes { + FSL_USB2_PHY_NONE, + FSL_USB2_PHY_ULPI, +@@ -101,9 +114,36 @@ enum fsl_usb2_phy_modes { + + struct fsl_usb2_platform_data { + /* board specific information */ +- enum fsl_usb2_operating_modes operating_mode; ++ /* ++ * DDD see note above ++ * enum fsl_usb2_operating_modes operating_mode; ++ */ ++ enum fsl_usb2_controller controller; + enum fsl_usb2_phy_modes phy_mode; + unsigned int port_enables; ++ /* ++ * DDD this could arguably be moved to a separate ++ * fsl usb2 device header file ++ */ ++ char *name; /* pretty print */ ++ int (*platform_init) (struct platform_device *); ++ void (*platform_uninit) (struct platform_device *); ++ int (*platform_verify) (struct platform_device *); ++ u32 xcvr_type; /* PORTSCX_PTS_* */ ++ u32 view; /* ULPI viewport register */ ++ u32 r_start; /* start of MEM resource */ ++ u32 r_len; /* length of MEM resource */ ++ void __iomem *regs; /* ioremap'd register base */ ++ unsigned big_endian_mmio : 1; ++ unsigned big_endian_desc : 1; ++ unsigned es : 1; /* need USBMODE:ES */ ++ unsigned have_sysif_regs : 1; ++ unsigned le_setup_buf : 1; ++ unsigned does_otg : 1; /* set IFF it's an OTG port */ ++ ++ unsigned power_budget; /* for hcd->power_budget */ ++ struct fsl_xcvr_ops *xcvr_ops; ++ int max_ep_nr; /* max # of endpoints */ + }; + + /* Flags in fsl_usb2_mph_platform_data */ +--- /dev/null ++++ b/include/linux/usb/fsl_usb2.h +@@ -0,0 +1,464 @@ ++/* ++ * Copyright 2005-2007 Freescale Semiconductor, Inc. All Rights Reserved. ++ */ ++ ++/* ++ * The code contained herein is licensed under the GNU General Public ++ * License. You may obtain a copy of the GNU General Public License ++ * Version 2 or later at the following locations: ++ * ++ * http://www.opensource.org/licenses/gpl-license.html ++ * http://www.gnu.org/copyleft/gpl.html ++ */ ++ ++/* ++ * Freescale USB device/endpoint management registers ++ */ ++#ifndef __FSL_USB2_H ++#define __FSL_USB2_H ++ ++ ++ /* USB DR device mode registers (Little Endian) */ ++struct fsl_usb_device_regs { ++ /* Capability register */ ++ u32 id; ++ u32 res1[63]; ++ u16 caplength; /* Capability Register Length */ ++ u16 hciversion; /* Host Controller Interface Version */ ++ u32 hcsparams; /* Host Controller Structual Parameters */ ++ u32 hccparams; /* Host Controller Capability Parameters */ ++ u32 res2[5]; ++ u32 dciversion; /* Device Controller Interface Version */ ++ u32 dccparams; /* Device Controller Capability Parameters */ ++ u32 res3[6]; ++ /* Operation register */ ++ u32 usbcmd; /* USB Command Register */ ++ u32 usbsts; /* USB Status Register */ ++ u32 usbintr; /* USB Interrupt Enable Register */ ++ u32 frindex; /* Frame Index Register */ ++ u32 res4; ++ u32 deviceaddr; /* Device Address */ ++ u32 endpointlistaddr; /* Endpoint List Address Register */ ++ u32 res5; ++ u32 burstsize; /* Master Interface Data Burst Size Register */ ++ u32 txttfilltuning; /* Transmit FIFO Tuning Controls Register */ ++ u32 res6[2]; ++ u32 ulpiview; ++ u32 res7[3]; ++ u32 configflag; /* Configure Flag Register */ ++ u32 portsc1; /* Port 1 Status and Control Register */ ++ u32 res8[7]; ++ u32 otgsc; /* On-The-Go Status and Control */ ++ u32 usbmode; /* USB Mode Register */ ++ u32 endptsetupstat; /* Endpoint Setup Status Register */ ++ u32 endpointprime; /* Endpoint Initialization Register */ ++ u32 endptflush; /* Endpoint Flush Register */ ++ u32 endptstatus; /* Endpoint Status Register */ ++ u32 endptcomplete; /* Endpoint Complete Register */ ++#if 0 ++ u32 endptctrl[USB_MAX_ENDPOINTS]; /* Endpoint Control Registers */ ++#else ++ // DDD see DCCPARAMS:DEN for the real number of device endpoints ++ // DDD 16 is the max ++ u32 endptctrl[16]; /* Endpoint Control Registers */ ++#endif ++}; ++ ++ /* USB DR host mode registers (Little Endian) */ ++struct fsl_usb_host_regs { ++ /* Capability register */ ++ u32 id; ++ u32 res1[63]; ++ u16 caplength; /* Capability Register Length */ ++ u16 hciversion; /* Host Controller Interface Version */ ++ u32 hcsparams; /* Host Controller Structual Parameters */ ++ u32 hccparams; /* Host Controller Capability Parameters */ ++ u32 res2[5]; ++ u32 dciversion; /* Device Controller Interface Version */ ++ u32 dccparams; /* Device Controller Capability Parameters */ ++ u32 res3[6]; ++ /* Operation register */ ++ u32 usbcmd; /* USB Command Register */ ++ u32 usbsts; /* USB Status Register */ ++ u32 usbintr; /* USB Interrupt Enable Register */ ++ u32 frindex; /* Frame Index Register */ ++ u32 res4; ++ u32 periodiclistbase; /* Periodic Frame List Base Address Register */ ++ u32 asynclistaddr; /* Current Asynchronous List Address Register */ ++ u32 res5; ++ u32 burstsize; /* Master Interface Data Burst Size Register */ ++ u32 txttfilltuning; /* Transmit FIFO Tuning Controls Register */ ++ u32 res6[2]; ++ u32 ulpiview; ++ u32 res7[3]; ++ u32 configflag; /* Configure Flag Register */ ++ u32 portsc1; /* Port 1 Status and Control Register */ ++ u32 res8[7]; ++ u32 otgsc; /* On-The-Go Status and Control */ ++ u32 usbmode; /* USB Mode Register */ ++ u32 endptsetupstat; /* Endpoint Setup Status Register */ ++ u32 endpointprime; /* Endpoint Initialization Register */ ++ u32 endptflush; /* Endpoint Flush Register */ ++ u32 endptstatus; /* Endpoint Status Register */ ++ u32 endptcomplete; /* Endpoint Complete Register */ ++#if 0 ++ u32 endptctrl[USB_MAX_ENDPOINTS]; /* Endpoint Control Registers */ ++#else ++ // DDD: do these exits in the host register set?? ++ // DDD see DCCPARAMS:DEN for the real number of device endpoints ++ // DDD 16 is the max ++ u32 endptctrl[16]; /* Endpoint Control Registers */ ++#endif ++}; ++ ++ /* non-EHCI USB system interface registers (Big Endian) */ ++struct usb_sys_interface { ++ u32 snoop1; ++ u32 snoop2; ++ u32 age_cnt_thresh; /* Age Count Threshold Register */ ++ u32 pri_ctrl; /* Priority Control Register */ ++ u32 si_ctrl; /* System Interface Control Register */ ++ u32 res[59]; ++ u32 control; /* General Purpose Control Register */ ++}; ++ ++/* ep0 transfer state */ ++#define WAIT_FOR_SETUP 0 ++#define DATA_STATE_XMIT 1 ++#define DATA_STATE_NEED_ZLP 2 ++#define WAIT_FOR_OUT_STATUS 3 ++#define DATA_STATE_RECV 4 ++ ++/* Frame Index Register Bit Masks */ ++#define USB_FRINDEX_MASKS 0x3fff ++ ++ ++ ++/* USBCMD Register Bit Masks */ ++#define USB_CMD_RUN_STOP 0x00000001 ++#define USB_CMD_CTRL_RESET 0x00000002 ++#define USB_CMD_PERIODIC_SCHEDULE_EN 0x00000010 ++#define USB_CMD_ASYNC_SCHEDULE_EN 0x00000020 ++#define USB_CMD_INT_AA_DOORBELL 0x00000040 ++#define USB_CMD_ASP 0x00000300 ++#define USB_CMD_ASYNC_SCH_PARK_EN 0x00000800 ++#define USB_CMD_SUTW 0x00002000 ++#define USB_CMD_ATDTW 0x00004000 ++#define USB_CMD_ITC 0x00FF0000 ++ ++/* bit 15,3,2 are frame list size */ ++#define USB_CMD_FRAME_SIZE_1024 0x00000000 ++#define USB_CMD_FRAME_SIZE_512 0x00000004 ++#define USB_CMD_FRAME_SIZE_256 0x00000008 ++#define USB_CMD_FRAME_SIZE_128 0x0000000C ++#define USB_CMD_FRAME_SIZE_64 0x00008000 ++#define USB_CMD_FRAME_SIZE_32 0x00008004 ++#define USB_CMD_FRAME_SIZE_16 0x00008008 ++#define USB_CMD_FRAME_SIZE_8 0x0000800C ++ ++/* bit 9-8 are async schedule park mode count */ ++#define USB_CMD_ASP_00 0x00000000 ++#define USB_CMD_ASP_01 0x00000100 ++#define USB_CMD_ASP_10 0x00000200 ++#define USB_CMD_ASP_11 0x00000300 ++#define USB_CMD_ASP_BIT_POS 8 ++ ++/* bit 23-16 are interrupt threshold control */ ++#define USB_CMD_ITC_NO_THRESHOLD 0x00000000 ++#define USB_CMD_ITC_1_MICRO_FRM 0x00010000 ++#define USB_CMD_ITC_2_MICRO_FRM 0x00020000 ++#define USB_CMD_ITC_4_MICRO_FRM 0x00040000 ++#define USB_CMD_ITC_8_MICRO_FRM 0x00080000 ++#define USB_CMD_ITC_16_MICRO_FRM 0x00100000 ++#define USB_CMD_ITC_32_MICRO_FRM 0x00200000 ++#define USB_CMD_ITC_64_MICRO_FRM 0x00400000 ++#define USB_CMD_ITC_BIT_POS 16 ++ ++ ++ ++ ++/* USB STS Register Bit Masks */ ++#define USB_STS_INT 0x00000001 ++#define USB_STS_ERR 0x00000002 ++#define USB_STS_PORT_CHANGE 0x00000004 ++#define USB_STS_FRM_LST_ROLL 0x00000008 ++#define USB_STS_SYS_ERR 0x00000010 ++#define USB_STS_IAA 0x00000020 ++#define USB_STS_RESET 0x00000040 ++#define USB_STS_SOF 0x00000080 ++#define USB_STS_SUSPEND 0x00000100 ++#define USB_STS_HC_HALTED 0x00001000 ++#define USB_STS_RCL 0x00002000 ++#define USB_STS_PERIODIC_SCHEDULE 0x00004000 ++#define USB_STS_ASYNC_SCHEDULE 0x00008000 ++ ++/* USB INTR Register Bit Masks */ ++#define USB_INTR_INT_EN 0x00000001 ++#define USB_INTR_ERR_INT_EN 0x00000002 ++#define USB_INTR_PTC_DETECT_EN 0x00000004 ++#define USB_INTR_FRM_LST_ROLL_EN 0x00000008 ++#define USB_INTR_SYS_ERR_EN 0x00000010 ++#define USB_INTR_ASYN_ADV_EN 0x00000020 ++#define USB_INTR_RESET_EN 0x00000040 ++#define USB_INTR_SOF_EN 0x00000080 ++#define USB_INTR_DEVICE_SUSPEND 0x00000100 ++ ++/* Device Address bit masks */ ++#define USB_DEVICE_ADDRESS_MASK 0xFE000000 ++#define USB_DEVICE_ADDRESS_BIT_POS 25 ++ ++/* endpoint list address bit masks */ ++#define USB_EP_LIST_ADDRESS_MASK 0xfffff800 ++ ++ ++/* x_PORTSCx */ ++/* bit 31-30 are port transceiver select */ ++#define PORTSCX_PTS_MASK (3 << 30) /* parallel xcvr select mask */ ++#define PORTSCX_PHY_TYPE_SEL PORTSCX_PTS_MASK ++#define PORTSCX_PTS_UTMI (0 << 30) /* UTMI/UTMI+ */ ++#define PORTSCX_PTS_PHILIPS (1 << 30) /* Philips classic */ ++#define PORTSCX_PTS_ULPI (2 << 30) /* ULPI */ ++#define PORTSCX_PTS_SERIAL (3 << 30) /* serial */ ++#define PORTSCX_PTS_FSLS PORTSCX_PTS_SERIAL ++#define PORTSCX_PTS_ONCHIP PORTSCX_PTS_FSLS ++ ++#define PORTSCX_STS (1 << 29) /* serial xcvr select */ ++ ++/* bit 28 is parallel transceiver width for UTMI interface */ ++#define PORTSCX_PTW_8BIT (0 << 28) /* 8 bit parallel xcvr */ ++#define PORTSCX_PTW_16BIT (1 << 28) /* 16 bi parallel xcvr */ ++ ++/* bit 27-26 are port speed */ ++#define PORTSCX_PORT_SPEED_FULL (0 << 26) ++#define PORTSCX_PORT_SPEED_LOW (1 << 26) ++#define PORTSCX_PORT_SPEED_HIGH (2 << 26) ++#define PORTSCX_PORT_SPEED_UNDEF (3 << 26) ++#define PORTSCX_PORT_SPEED_MASK (3 << 26) ++ ++#define PORTSCX_PHY_LOW_POWER_SPD (1 << 23) /* phy low pwr suspend/clk disable */ ++ ++/* bit 19-16 are port test control */ ++#define PORTSCX_PTC_DISABLE (0 << 16) ++#define PORTSCX_PTC_JSTATE (1 << 16) ++#define PORTSCX_PTC_KSTATE (2 << 16) ++#define PORTSCX_PTC_SEQNAK (3 << 16) /* SE0 (host) / NAK (device) */ ++#define PORTSCX_PTC_PACKET (4 << 16) ++#define PORTSCX_PTC_FORCE_EN_HS (5 << 16) ++#define PORTSCX_PTC_FORCE_EN_FS (6 << 16) ++#define PORTSCX_PTC_FORCE_EN_LS (7 << 16) ++ ++ ++/* bit 15-14 are port indicator control */ ++#define PORTSCX_PIC_OFF (0 << 14) ++#define PORTSCX_PIC_AMBER (1 << 14) ++#define PORTSCX_PIC_GREEN (2 << 14) ++#define PORTSCX_PIC_UNDEF (3 << 14) ++ ++#define PORTSCX_PORT_POWER (1 << 12) /* port power */ ++ ++/* bit 11-10 are line status */ ++#define PORTSCX_LS_MASK (3 << 10) /* Line State mask */ ++#define PORTSCX_LS_SE0 (0 << 10) /* SE0 */ ++#define PORTSCX_LS_K_STATE (1 << 10) /* K-state */ ++#define PORTSCX_LS_J_STATE (2 << 10) /* J-state */ ++ ++#define PORTSCX_PORT_RESET (1 << 8) /* Port reset */ ++#define PORTSCX_PORT_SUSPEND (1 << 7) /* Suspend */ ++#define PORTSCX_PORT_FORCE_RESUME (1 << 6) /* Force port resume */ ++#define PORTSCX_OVER_CURRENT_CHG (1 << 5) /* over current change */ ++#define PORTSCX_OVER_CURRENT_ACT (1 << 4) /* over currrent active */ ++#define PORTSCX_PORT_EN_DIS_CHANGE (1 << 3) /* port {en,dis}able change */ ++#define PORTSCX_PORT_ENABLE (1 << 2) /* port enabled */ ++#define PORTSCX_CONNECT_STATUS_CHANGE (1 << 1) /* connect status change */ ++#define PORTSCX_CURRENT_CONNECT_STATUS (1 << 0) /* current connect status */ ++ ++#define PORTSCX_W1C_BITS \ ++ ( PORTSCX_CONNECT_STATUS_CHANGE | \ ++ PORTSCX_PORT_EN_DIS_CHANGE | \ ++ PORTSCX_OVER_CURRENT_CHG ) ++ ++ ++ ++/* UOG_OTGSC Register Bits */ ++/* control bits: */ ++#define OTGSC_CTRL_VBUS_DISCHARGE (1 << 0) ++#define OTGSC_CTRL_VBUS_CHARGE (1 << 1) ++#define OTGSC_CTRL_OTG_TERM (1 << 3) /* controls DM pulldown */ ++#define OTGSC_CTRL_DATA_PULSING (1 << 4) ++#define OTGSC_CTRL_USB_ID_PU (1 << 5) /* enable ID pullup */ ++/* current status: (R/O) */ ++#define OTGSC_STS_USB_ID (1 << 8) /* 0=A-device 1=B-device */ ++#define OTGSC_STS_A_VBUS_VALID (1 << 9) ++#define OTGSC_STS_A_SESSION_VALID (1 << 10) ++#define OTGSC_STS_B_SESSION_VALID (1 << 11) ++#define OTGSC_STS_B_SESSION_END (1 << 12) ++#define OTGSC_STS_1ms_TIMER (1 << 13) ++#define OTGSC_STS_DATA_PULSE (1 << 14) ++/* interrupt status: (write to clear) */ ++#define OTGSC_INTSTS_MASK (0x7f << 16) ++#define OTGSC_INTSTS_USB_ID (1 << 16) ++#define OTGSC_INTSTS_A_VBUS_VALID (1 << 17) ++#define OTGSC_INTSTS_A_SESSION_VALID (1 << 18) ++#define OTGSC_INTSTS_B_SESSION_VALID (1 << 19) ++#define OTGSC_INTSTS_B_SESSION_END (1 << 20) ++#define OTGSC_INTSTS_1MS_TIMER (1 << 21) ++#define OTGSC_INTSTS_DATA_PULSE (1 << 22) ++/* interrupt enables: */ ++#define OTGSC_IE_MASK (0x7f << 24) ++#define OTGSC_IE_USB_ID (1 << 24) ++#define OTGSC_IE_A_VBUS_VALID (1 << 25) ++#define OTGSC_IE_A_SESSION_VALID (1 << 26) ++#define OTGSC_IE_B_SESSION_VALID (1 << 27) ++#define OTGSC_IE_B_SESSION_END (1 << 28) ++#define OTGSC_IE_1ms_TIMER (1 << 29) ++#define OTGSC_IE_DATA_PULSE (1 << 30) ++ ++#if 1 /* DDD FIXME these here for compatibility between my names and Leo's */ ++/* OTG interrupt enable bit masks */ ++#define OTGSC_INTERRUPT_ENABLE_BITS_MASK OTGSC_IE_MASK ++ ++/* OTG interrupt status bit masks */ ++#define OTGSC_INTERRUPT_STATUS_BITS_MASK OTGSC_INTSTS_MASK ++#endif // 1 ++ ++ ++ ++/* x_USBMODE */ ++#undef USBMODE_SDIS /* defined as bit 3 in drivers/usb/host/ehci.h */ ++#define USBMODE_SDIS (1 << 4) /* stream disable mode */ ++#define USBMODE_SLOM (1 << 3) /* setup lockout mode */ ++#define USBMODE_ES (1 << 2) /* (big) endian select */ ++#define USBMODE_CM_MASK (3 << 0) /* controller mode mask */ ++#define USBMODE_CM_HOST (3 << 0) /* host */ ++#define USBMODE_CM_DEVICE (2 << 0) /* device */ ++// DDD #define USBMODE_CM_IDLE (0 << 0) /* idle */ ++ ++/* DDD for compatibility for now */ ++#define USB_MODE_CTRL_MODE_IDLE USBMODE_CM_IDLE ++#define USB_MODE_CTRL_MODE_DEVICE USBMODE_CM_DEVICE ++#define USB_MODE_CTRL_MODE_HOST USBMODE_CM_HOST ++#define USB_MODE_SETUP_LOCK_OFF USBMODE_SLOM ++#define USB_MODE_STREAM_DISABLE USBMODE_SDIS ++ ++ ++/* ULPIVIEW register bits */ ++#define ULPIVW_WU (1 << 31) /* Wakeup */ ++#define ULPIVW_RUN (1 << 30) /* read/write run */ ++#define ULPIVW_WRITE (1 << 29) /* 0=read 1=write */ ++#define ULPIVW_SS (1 << 27) /* SyncState */ ++#define ULPIVW_PORT_MASK 0x07 /* Port field */ ++#define ULPIVW_PORT_SHIFT 24 ++#define ULPIVW_ADDR_MASK 0xFF /* data address field */ ++#define ULPIVW_ADDR_SHIFT 16 ++#define ULPIVW_RDATA_MASK 0xFF /* read data field */ ++#define ULPIVW_RDATA_SHIFT 8 ++#define ULPIVW_WDATA_MASK 0xFF /* write data field */ ++#define ULPIVW_WDATA_SHIFT 0 ++ ++ ++/* Endpoint Flush Register */ ++#define EPFLUSH_TX_OFFSET 0x00010000 ++#define EPFLUSH_RX_OFFSET 0x00000000 ++ ++/* Endpoint Setup Status bit masks */ ++#define EP_SETUP_STATUS_MASK 0x0000003F ++#define EP_SETUP_STATUS_EP0 0x00000001 ++ ++/* ENDPOINTCTRLx Register Bit Masks */ ++#define EPCTRL_TX_ENABLE 0x00800000 ++#define EPCTRL_TX_DATA_TOGGLE_RST 0x00400000 /* Not EP0 */ ++#define EPCTRL_TX_DATA_TOGGLE_INH 0x00200000 /* Not EP0 */ ++#define EPCTRL_TX_TYPE 0x000C0000 ++#define EPCTRL_TX_DATA_SOURCE 0x00020000 /* Not EP0 */ ++#define EPCTRL_TX_EP_STALL 0x00010000 ++#define EPCTRL_RX_ENABLE 0x00000080 ++#define EPCTRL_RX_DATA_TOGGLE_RST 0x00000040 /* Not EP0 */ ++#define EPCTRL_RX_DATA_TOGGLE_INH 0x00000020 /* Not EP0 */ ++#define EPCTRL_RX_TYPE 0x0000000C ++#define EPCTRL_RX_DATA_SINK 0x00000002 /* Not EP0 */ ++#define EPCTRL_RX_EP_STALL 0x00000001 ++ ++/* bit 19-18 and 3-2 are endpoint type */ ++#define EPCTRL_EP_TYPE_CONTROL 0 ++#define EPCTRL_EP_TYPE_ISO 1 ++#define EPCTRL_EP_TYPE_BULK 2 ++#define EPCTRL_EP_TYPE_INTERRUPT 3 ++#define EPCTRL_TX_EP_TYPE_SHIFT 18 ++#define EPCTRL_RX_EP_TYPE_SHIFT 2 ++ ++/* SNOOPn Register Bit Masks */ ++#define SNOOP_ADDRESS_MASK 0xFFFFF000 ++#define SNOOP_SIZE_ZERO 0x00 /* snooping disable */ ++#define SNOOP_SIZE_4KB 0x0B /* 4KB snoop size */ ++#define SNOOP_SIZE_8KB 0x0C ++#define SNOOP_SIZE_16KB 0x0D ++#define SNOOP_SIZE_32KB 0x0E ++#define SNOOP_SIZE_64KB 0x0F ++#define SNOOP_SIZE_128KB 0x10 ++#define SNOOP_SIZE_256KB 0x11 ++#define SNOOP_SIZE_512KB 0x12 ++#define SNOOP_SIZE_1MB 0x13 ++#define SNOOP_SIZE_2MB 0x14 ++#define SNOOP_SIZE_4MB 0x15 ++#define SNOOP_SIZE_8MB 0x16 ++#define SNOOP_SIZE_16MB 0x17 ++#define SNOOP_SIZE_32MB 0x18 ++#define SNOOP_SIZE_64MB 0x19 ++#define SNOOP_SIZE_128MB 0x1A ++#define SNOOP_SIZE_256MB 0x1B ++#define SNOOP_SIZE_512MB 0x1C ++#define SNOOP_SIZE_1GB 0x1D ++#define SNOOP_SIZE_2GB 0x1E /* 2GB snoop size */ ++ ++/* pri_ctrl Register Bit Masks */ ++#define PRI_CTRL_PRI_LVL1 0x0000000C ++#define PRI_CTRL_PRI_LVL0 0x00000003 ++ ++/* si_ctrl Register Bit Masks */ ++#define SI_CTRL_ERR_DISABLE 0x00000010 ++#define SI_CTRL_IDRC_DISABLE 0x00000008 ++#define SI_CTRL_RD_SAFE_EN 0x00000004 ++#define SI_CTRL_RD_PREFETCH_DISABLE 0x00000002 ++#define SI_CTRL_RD_PREFEFETCH_VAL 0x00000001 ++ ++ ++/* control Register Bit Masks */ ++#define USB_CTRL_IOENB 0x00000004 ++#define USB_CTRL_ULPI_INT0EN 0x00000001 ++ ++ ++/* Endpoint Transfer Descriptor bit Masks */ ++#define DTD_NEXT_TERMINATE 0x00000001 ++#define DTD_IOC 0x00008000 ++#define DTD_STATUS_ACTIVE 0x00000080 ++#define DTD_STATUS_HALTED 0x00000040 ++#define DTD_STATUS_DATA_BUFF_ERR 0x00000020 ++#define DTD_STATUS_TRANSACTION_ERR 0x00000008 ++#define DTD_RESERVED_FIELDS 0x80007300 ++#define DTD_ADDR_MASK 0xFFFFFFE0 ++#define DTD_PACKET_SIZE 0x7FFF0000 ++#define DTD_LENGTH_BIT_POS 16 ++#define DTD_ERROR_MASK (DTD_STATUS_HALTED | \ ++ DTD_STATUS_DATA_BUFF_ERR | \ ++ DTD_STATUS_TRANSACTION_ERR) ++/* Alignment requirements; must be a power of two */ ++#define DTD_ALIGNMENT 0x20 ++#define QH_ALIGNMENT 2048 ++ ++/* Controller dma boundary */ ++#define UDC_DMA_BOUNDARY 0x1000 ++ ++#if defined CONFIG_PPC32 ++#define fsl_readl(addr) in_le32((addr)) ++#define fsl_writel(addr, val32) out_le32((addr), (val32)) ++#elif defined CONFIG_COLDFIRE ++#define fsl_readl(addr) in_be32((__force unsigned *)(addr)) ++#define fsl_writel(val32, addr) out_be32((__force unsigned *)(addr), (val32)) ++ ++#define fsl_readw(addr) in_be16((__force unsigned *)(addr)) ++#define fsl_writew(val16, addr) out_be16((__force unsigned *)(addr), (val16)) ++#else ++#error fsl_{readl, writel} must be defined ++#endif ++ ++#endif /* __FSL_USB2_H */ +--- /dev/null ++++ b/include/linux/usb/fsl_xcvr.h +@@ -0,0 +1,42 @@ ++/* ++ * Copyright 2007 Freescale Semiconductor, Inc. All Rights Reserved. ++ */ ++ ++/* ++ * The code contained herein is licensed under the GNU General Public ++ * License. You may obtain a copy of the GNU General Public License ++ * Version 2 or later at the following locations: ++ * ++ * http://www.opensource.org/licenses/gpl-license.html ++ * http://www.gnu.org/copyleft/gpl.html ++ */ ++ ++enum fsl_usb_ctrlr { ++ USB_CTRLR_H1 = 0, ++ USB_CTRLR_H2 = 1, ++ USB_CTRLR_OTG = 2, ++}; ++ ++ ++/** ++ * struct fsl_xcvr_ops - USB transceiver operations ++ * ++ * @xcvr_type: one of PORTSCX_PTS_{UTMI,SERIAL,ULPI} ++ * @init: transceiver- and board-specific initialization function ++ * @uninit: transceiver- and board-specific uninitialization function ++ * @set_host: ++ * @set_device: ++ * ++ */ ++struct fsl_xcvr_ops { ++ enum fsl_usb_ctrlr ctrlr; /* H1, H2, OTG */ ++ u32 xcvr_type; ++ ++ void (*init)(struct platform_device *pdev); ++ void (*uninit)(struct platform_device *pdev); ++ void (*set_host)(void); /* DDD combine set_host and _device ? */ ++ void (*set_device)(void); ++ void (*set_vbus_power)(struct fsl_usb2_platform_data *pdata, int on); ++}; ++ ++ diff --git a/target/linux/coldfire/patches/017-mcfv4e_elf_entry_stext.patch b/target/linux/coldfire/patches/017-mcfv4e_elf_entry_stext.patch new file mode 100644 index 0000000000..ffb3c8aeca --- /dev/null +++ b/target/linux/coldfire/patches/017-mcfv4e_elf_entry_stext.patch @@ -0,0 +1,25 @@ +From 2beb3e5edd46ea1d87ac87dbb977dce423a1f124 Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Wed, 21 Nov 2007 14:56:19 -0700 +Subject: [PATCH] Change elf entry point from _start to _stext. + +Changing the symbol was required by CodeWarrior so it could +locate the entry point. + +LTIBName: mcfv4e-elf-entry-stext +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + arch/m68k/coldfire/vmlinux-cf.lds | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +--- a/arch/m68k/coldfire/vmlinux-cf.lds ++++ b/arch/m68k/coldfire/vmlinux-cf.lds +@@ -4,7 +4,7 @@ + + OUTPUT_FORMAT("elf32-m68k", "elf32-m68k", "elf32-m68k") + OUTPUT_ARCH(m68k) +-ENTRY(_start) ++ENTRY(_stext) + jiffies = jiffies_64 + 4; + SECTIONS + { diff --git a/target/linux/coldfire/patches/018-mcfv4e_linker_script_update.patch b/target/linux/coldfire/patches/018-mcfv4e_linker_script_update.patch new file mode 100644 index 0000000000..3c7da56934 --- /dev/null +++ b/target/linux/coldfire/patches/018-mcfv4e_linker_script_update.patch @@ -0,0 +1,187 @@ +From 3aa2c28ff4271e9232b6c98ba000804de3ed3f33 Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Mon, 26 Nov 2007 23:41:23 -0700 +Subject: [PATCH] Rewrite coldfire linker script. + +LTIBName: mcfv4e-linker-script-update +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + arch/m68k/coldfire/vmlinux-cf.lds | 107 ++++++++++++++++++++++++------------- + arch/m68k/kernel/vmlinux.lds.S | 3 +- + 2 files changed, 72 insertions(+), 38 deletions(-) + +--- a/arch/m68k/coldfire/vmlinux-cf.lds ++++ b/arch/m68k/coldfire/vmlinux-cf.lds +@@ -1,76 +1,115 @@ +-/* ld script to make m68k Coldfire Linux kernel */ ++/* ld script to make m68k Coldfire Linux kernel ++ * ++ * Derived from arch/m68k/kernel/vmlinux-std.lds ++ * ++ * Updated 11/26/2007 for new CodeSourcery toolset ++ * by Kurt Mahan <kmahan@freescale.com> ++ */ ++ ++#define LOAD_OFFSET 0x00000000 + + #include <asm-generic/vmlinux.lds.h> ++#include <asm/page_offset.h> ++ ++#define START_OFFSET 0x00020000 ++#define IMAGE_START PAGE_OFFSET_RAW + START_OFFSET + + OUTPUT_FORMAT("elf32-m68k", "elf32-m68k", "elf32-m68k") + OUTPUT_ARCH(m68k) + ENTRY(_stext) + jiffies = jiffies_64 + 4; ++ + SECTIONS + { +- . = 0xC0020000; +- _text = .; /* Text and read-only data */ +- .text : { ++ . = IMAGE_START; ++ .text.head : AT(ADDR(.text.head) - LOAD_OFFSET) { ++ _text = .; /* Text and read-only data */ + *(.text.head) ++ } :text = 0x4e75 ++ ++ .text : AT(ADDR(.text) - LOAD_OFFSET) { + TEXT_TEXT + SCHED_TEXT + LOCK_TEXT + *(.fixup) + *(.gnu.warning) +- } :text = 0x4e75 +- ++ } :text = 0x4e75 + _etext = .; /* End of text section */ + + . = ALIGN(16); +- __start___ex_table = .; +- __ex_table : { *(__ex_table) } +- __stop___ex_table = .; ++ __ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) { ++ __start___ex_table = .; ++ *(__ex_table) ++ __stop___ex_table = .; ++ } + + RODATA + +- .data : { /* Data */ ++ . = ALIGN(8192); ++ .data : AT(ADDR(.data) - LOAD_OFFSET) { /* Data */ + DATA_DATA + CONSTRUCTORS +- } ++ } :data + +- .bss : { *(.bss) } /* BSS */ ++ .bss : AT(ADDR(.bss) - LOAD_OFFSET) { /* BSS */ ++ *(.bss) ++ } + + . = ALIGN(16); +- .data.cacheline_aligned : { *(.data.cacheline_aligned) } :data ++ .data.cacheline_aligned : AT(ADDR(.data.cacheline_aligned) - LOAD_OFFSET ) { ++ *(.data.cacheline_aligned) ++ } :data + + _edata = .; /* End of data section */ + + . = ALIGN(8192); /* Initrd */ +- __init_begin = .; +- .init.text : { ++ .init.text : AT(ADDR(.init.text) - LOAD_OFFSET) { ++ __init_begin = .; + _sinittext = .; + *(.init.text) + _einittext = .; + } +- .init.data : { *(.init.data) } ++ ++ .init.data : AT(ADDR(.init.data) - LOAD_OFFSET) { ++ *(.init.data) ++ } ++ + . = ALIGN(16); +- __setup_start = .; +- .init.setup : { *(.init.setup) } +- __setup_end = .; +- __initcall_start = .; +- .initcall.init : { ++ .init.setup : AT(ADDR(.init.setup) - LOAD_OFFSET) { ++ __setup_start = .; ++ *(.init.setup) ++ __setup_end = .; ++ } ++ ++ .initcall.init : AT(ADDR(.initcall.init) - LOAD_OFFSET) { ++ __initcall_start = .; + INITCALLS ++ __initcall_end = .; + } +- __initcall_end = .; +- __con_initcall_start = .; +- .con_initcall.init : { *(.con_initcall.init) } +- __con_initcall_end = .; ++ ++ .con_initcall.init : AT(ADDR(.con_initcall.init) - LOAD_OFFSET) { ++ __con_initcall_start = .; ++ *(.con_initcall.init) ++ __con_initcall_end = .; ++ } ++ + SECURITY_INIT ++ + #ifdef CONFIG_BLK_DEV_INITRD + . = ALIGN(8192); +- __initramfs_start = .; +- .init.ramfs : { *(.init.ramfs) } +- __initramfs_end = .; ++ .init.ramfs : AT(ADDR(.init.ramfs) - LOAD_OFFSET) { ++ __initramfs_start = .; ++ *(.init.ramfs) ++ __initramfs_end = .; ++ } + #endif ++ + . = ALIGN(8192); + __init_end = .; + +- .data.init_task : { *(.data.init_task) } /* The initial task and kernel stack */ ++ .data.init_task : AT(ADDR(.data.init_task) - LOAD_OFFSET) { ++ *(.data.init_task) /* The initial task and kernel stack */ ++ } + + _end = . ; + +@@ -79,14 +118,8 @@ SECTIONS + *(.exit.text) + *(.exit.data) + *(.exitcall.exit) +- } ++ } + + /* Stabs debugging sections. */ +- .stab 0 : { *(.stab) } +- .stabstr 0 : { *(.stabstr) } +- .stab.excl 0 : { *(.stab.excl) } +- .stab.exclstr 0 : { *(.stab.exclstr) } +- .stab.index 0 : { *(.stab.index) } +- .stab.indexstr 0 : { *(.stab.indexstr) } +- .comment 0 : { *(.comment) } ++ STABS_DEBUG + } +--- a/arch/m68k/kernel/vmlinux.lds.S ++++ b/arch/m68k/kernel/vmlinux.lds.S +@@ -1,6 +1,7 @@ + PHDRS + { +- text PT_LOAD FILEHDR PHDRS FLAGS (7); ++ headers PT_PHDR PHDRS ; ++ text PT_LOAD FILEHDR PHDRS FLAGS (5); + data PT_LOAD FLAGS (7); + } + #ifdef CONFIG_SUN3 diff --git a/target/linux/coldfire/patches/019-m5445x_spi.patch b/target/linux/coldfire/patches/019-m5445x_spi.patch new file mode 100644 index 0000000000..49b83e0b18 --- /dev/null +++ b/target/linux/coldfire/patches/019-m5445x_spi.patch @@ -0,0 +1,3345 @@ +From bc755a3b8859e7307a8b10f39ca4cb6401c51987 Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Tue, 27 Nov 2007 14:39:37 -0700 +Subject: [PATCH] Add M5445x SPI support. + +LTIBName: m5445x-spi +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + arch/m68k/configs/m54455evb_defconfig | 24 +- + drivers/spi/Kconfig | 36 + + drivers/spi/Makefile | 4 + + drivers/spi/coldfire_edma.c | 358 ++++++++ + drivers/spi/spi-m5445x.c | 156 ++++ + drivers/spi/spi_coldfire.c | 1552 +++++++++++++++++++++++++++++++++ + drivers/spi/ssi_audio.c | 906 +++++++++++++++++++ + include/asm-m68k/coldfire_edma.h | 101 ++- + include/linux/spi/mcfqspi.h | 80 ++ + 9 files changed, 3196 insertions(+), 21 deletions(-) + create mode 100644 drivers/spi/coldfire_edma.c + create mode 100644 drivers/spi/spi-m5445x.c + create mode 100644 drivers/spi/spi_coldfire.c + create mode 100644 drivers/spi/ssi_audio.c + create mode 100644 include/linux/spi/mcfqspi.h + +--- a/arch/m68k/configs/m54455evb_defconfig ++++ b/arch/m68k/configs/m54455evb_defconfig +@@ -321,6 +321,8 @@ CONFIG_MTD_PHYSMAP_BANKWIDTH=1 + # + # Self-contained MTD device drivers + # ++# CONFIG_MTD_DATAFLASH is not set ++# CONFIG_MTD_M25P80 is not set + # CONFIG_MTD_SLRAM is not set + # CONFIG_MTD_PHRAM is not set + # CONFIG_MTD_MTDRAM is not set +@@ -497,8 +499,26 @@ CONFIG_UNIX98_PTYS=y + # + # SPI support + # +-# CONFIG_SPI is not set +-# CONFIG_SPI_MASTER is not set ++CONFIG_SPI=y ++# CONFIG_SPI_DEBUG is not set ++CONFIG_COLDFIRE_EDMA=y ++CONFIG_SPI_MASTER=y ++ ++# ++# SPI Master Controller Drivers ++# ++# CONFIG_SPI_BITBANG is not set ++CONFIG_SPI_COLDFIRE=y ++CONFIG_SPI_COLDFIRE_DSPI_EDMA=y ++ ++# ++# SPI Protocol Masters ++# ++# CONFIG_SPI_AT25 is not set ++# CONFIG_SPI_SPIDEV is not set ++# CONFIG_SPI_TLE62X0 is not set ++CONFIG_SPI_COLDFIRE_SSI_AUDIO=y ++# CONFIG_SSIAUDIO_USE_EDMA is not set + # CONFIG_W1 is not set + # CONFIG_POWER_SUPPLY is not set + # CONFIG_HWMON is not set +--- a/drivers/spi/Kconfig ++++ b/drivers/spi/Kconfig +@@ -35,6 +35,15 @@ config SPI_DEBUG + Say "yes" to enable debug messaging (like dev_dbg and pr_debug), + sysfs, and debugfs support in SPI controller and protocol drivers. + ++config COLDFIRE_EDMA ++ tristate "Coldfire eDMA" ++ depends on COLDFIRE && EXPERIMENTAL ++ help ++ Support for Coldfire eDMA controller. Required for example ++ by SSI audio device driver. ++ ++ ++ + # + # MASTER side ... talking to discrete SPI slave chips including microcontrollers + # +@@ -113,6 +122,21 @@ config SPI_GPIO + + If unsure, say N. + ++config SPI_COLDFIRE ++ tristate "Coldfire QSPI/DSPI SPI Master" ++ depends on SPI_MASTER && COLDFIRE && EXPERIMENTAL ++ help ++ SPI driver for Freescale Coldfire QSPI module in master mode. ++ Tested with the 5282 processor, but should also work with other ++ Coldfire variants. ++ ++config SPI_COLDFIRE_DSPI_EDMA ++ boolean "Coldfire DSPI master driver uses eDMA" ++ depends on SPI_MASTER && COLDFIRE && SPI_COLDFIRE && EXPERIMENTAL && COLDFIRE_EDMA ++ default n ++ help ++ Say "yes" if you want DSPI master driver to use eDMA for transfers. ++ + config SPI_IMX + tristate "Freescale iMX SPI controller" + depends on SPI_MASTER && ARCH_IMX && EXPERIMENTAL +@@ -255,6 +279,18 @@ config SPI_TLE62X0 + # + # Add new SPI protocol masters in alphabetical order above this line + # ++config SPI_COLDFIRE_SSI_AUDIO ++ tristate "Coldfire SSI AUDIO" ++ depends on SPI_MASTER && SPI_COLDFIRE && EXPERIMENTAL ++ help ++ SSI audio device driver ++ ++config SSIAUDIO_USE_EDMA ++ boolean "Coldfire DSPI master driver uses eDMA" ++ default y ++ depends on EXPERIMENTAL && COLDFIRE_EDMA && SPI_COLDFIRE_SSI_AUDIO ++ help ++ Say "yes" if you want SSI audio driver to use eDMA for SSI transfers. + + # (slave support would go here) + +--- a/drivers/spi/Makefile ++++ b/drivers/spi/Makefile +@@ -6,6 +6,8 @@ ifeq ($(CONFIG_SPI_DEBUG),y) + EXTRA_CFLAGS += -DDEBUG + endif + ++obj-$(CONFIG_COLDFIRE_EDMA) += coldfire_edma.o ++ + # small core, mostly translating board-specific + # config declarations into driver model code + obj-$(CONFIG_SPI_MASTER) += spi.o +@@ -16,6 +18,7 @@ obj-$(CONFIG_SPI_BFIN) += spi_bfin5xx. + obj-$(CONFIG_SPI_BITBANG) += spi_bitbang.o + obj-$(CONFIG_SPI_AU1550) += au1550_spi.o + obj-$(CONFIG_SPI_BUTTERFLY) += spi_butterfly.o ++obj-$(CONFIG_SPI_COLDFIRE) += spi_coldfire.o spi-m5445x.o + obj-$(CONFIG_SPI_GPIO) += spi_gpio.o + obj-$(CONFIG_SPI_IMX) += spi_imx.o + obj-$(CONFIG_SPI_LM70_LLP) += spi_lm70llp.o +@@ -35,6 +38,7 @@ obj-$(CONFIG_SPI_SH_SCI) += spi_sh_sci. + obj-$(CONFIG_SPI_AT25) += at25.o + obj-$(CONFIG_SPI_SPIDEV) += spidev.o + obj-$(CONFIG_SPI_TLE62X0) += tle62x0.o ++obj-$(CONFIG_SPI_COLDFIRE_SSI_AUDIO) += ssi_audio.o + # ... add above this line ... + + # SPI slave controller drivers (upstream link) +--- /dev/null ++++ b/drivers/spi/coldfire_edma.c +@@ -0,0 +1,358 @@ ++/* ++ * ++ * coldfire_edma.c - eDMA driver for Coldfire MCF5445x ++ * ++ * Yaroslav Vinogradov yaroslav.vinogradov@freescale.com ++ * ++ * Copyright Freescale Semiconductor, Inc. 2007 ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ */ ++ ++#include <linux/init.h> ++#include <linux/module.h> ++#include <asm/virtconvert.h> ++#include <asm/coldfire.h> ++#include <linux/fs.h> ++#include <linux/cdev.h> ++#include <linux/seq_file.h> ++#include <linux/proc_fs.h> ++#include <asm/mcf5445x_edma.h> ++#include <asm/mcf5445x_intc.h> ++#include <asm/coldfire_edma.h> ++ ++ ++/* callback handler data for each TCD */ ++struct edma_isr_record { ++ edma_irq_handler irq_handler; /* interrupt handler */ ++ edma_error_handler error_handler; /* error interrupt handler */ ++ void* dev; /* device used for the channel */ ++ int allocated; /* busy flag */ ++ spinlock_t *lock; /* spin lock (if needs to be locked in interrupt) */ ++ const char* device_id; /* device id string, used in proc file system */ ++}; ++ ++/* device structure */ ++struct coldfire_edma_dev { ++ struct cdev cdev; /* character device */ ++ struct edma_isr_record dma_interrupt_handlers[EDMA_CHANNELS]; /* channel handlers */ ++}; ++ ++/* allocated major device number */ ++static int coldfire_dma_major; ++/* device driver structure */ ++static struct coldfire_edma_dev* devp = NULL; ++ ++/* device driver file operations */ ++struct file_operations coldfire_edma_fops = { ++ .owner = THIS_MODULE, ++}; ++ ++/* eDMA channel interrupt handler */ ++static int dmaisr(int irq, void *dev_id) ++{ ++ int channel = irq - EDMA_INT_CONTROLLER_BASE - EDMA_INT_CHANNEL_BASE; ++ int result = IRQ_HANDLED; ++ ++ if (devp!=NULL && devp->dma_interrupt_handlers[channel].lock) { ++ spin_lock(devp->dma_interrupt_handlers[channel].lock); ++ } ++ ++ if (devp!=NULL && devp->dma_interrupt_handlers[channel].irq_handler) { ++ result = devp->dma_interrupt_handlers[channel].irq_handler(channel, ++ devp->dma_interrupt_handlers[channel].dev); ++ } else { ++ confirm_edma_interrupt_handled(channel); ++ printk(EDMA_DRIVER_NAME ": No handler for DMA channel %d\n", channel); ++ } ++ ++ if (devp!=NULL && devp->dma_interrupt_handlers[channel].lock) { ++ spin_unlock(devp->dma_interrupt_handlers[channel].lock); ++ } ++ ++ return result; ++} ++ ++/* eDMA error interrupt handler */ ++static int dma_error_isr(int irq, void* dev_id) ++{ ++ u16 err; ++ int i; ++ ++ err = MCF_EDMA_ERR; ++ for (i=0;i<EDMA_CHANNELS;i++) { ++ if (err & (1<<i)) { ++ if (devp!=NULL && devp->dma_interrupt_handlers[i].error_handler) { ++ devp->dma_interrupt_handlers[i].error_handler(i, devp->dma_interrupt_handlers[i].dev); ++ } else { ++ printk(KERN_WARNING EDMA_DRIVER_NAME ": DMA error on channel %d\n", i); ++ } ++ } ++ } ++ ++ MCF_EDMA_CERR = MCF_EDMA_CERR_CAER; ++ return IRQ_HANDLED; ++} ++ ++/* sets channel parameters */ ++void set_edma_params(int channel, u32 source, u32 dest, ++ u32 attr, u32 soff, u32 nbytes, u32 slast, ++ u32 citer, u32 biter, u32 doff, u32 dlast_sga, ++ int major_int, int disable_req) ++{ ++ ++ if (channel<0 || channel>EDMA_CHANNELS) ++ return; ++ ++ MCF_EDMA_TCD_SADDR(channel) = source; ++ MCF_EDMA_TCD_DADDR(channel) = dest; ++ MCF_EDMA_TCD_ATTR(channel) = attr; ++ MCF_EDMA_TCD_SOFF(channel) = MCF_EDMA_TCD_SOFF_SOFF(soff); ++ MCF_EDMA_TCD_NBYTES(channel) = MCF_EDMA_TCD_NBYTES_NBYTES(nbytes); ++ MCF_EDMA_TCD_SLAST(channel) = MCF_EDMA_TCD_SLAST_SLAST(slast); ++ MCF_EDMA_TCD_CITER(channel) = MCF_EDMA_TCD_CITER_CITER(citer); ++ MCF_EDMA_TCD_BITER(channel)=MCF_EDMA_TCD_BITER_BITER(biter); ++ MCF_EDMA_TCD_DOFF(channel) = MCF_EDMA_TCD_DOFF_DOFF(doff); ++ MCF_EDMA_TCD_DLAST_SGA(channel) = MCF_EDMA_TCD_DLAST_SGA_DLAST_SGA(dlast_sga); ++ /* interrupt at the end of major loop */ ++ if (major_int) { ++ MCF_EDMA_TCD_CSR(channel) |= MCF_EDMA_TCD_CSR_INT_MAJOR; ++ } else { ++ MCF_EDMA_TCD_CSR(channel) &= ~MCF_EDMA_TCD_CSR_INT_MAJOR; ++ } ++ /* disable request at the end of major loop of transfer or not*/ ++ if (disable_req) { ++ MCF_EDMA_TCD_CSR(channel) |= MCF_EDMA_TCD_CSR_D_REQ; ++ } else { ++ MCF_EDMA_TCD_CSR(channel) &= ~MCF_EDMA_TCD_CSR_D_REQ; ++ } ++ ++} ++EXPORT_SYMBOL(set_edma_params); ++ ++/* init eDMA controller */ ++void init_edma(void) ++{ ++ MCF_EDMA_CR = 0; ++} ++EXPORT_SYMBOL(init_edma); ++ ++/* request eDMA channel */ ++int request_edma_channel(int channel, ++ edma_irq_handler handler, ++ edma_error_handler error_handler, ++ void* dev, ++ spinlock_t *lock, ++ const char* device_id ) ++{ ++ if (devp!=NULL && channel>=0 && channel<=EDMA_CHANNELS) { ++ if (devp->dma_interrupt_handlers[channel].allocated) { ++ return -EBUSY; ++ } ++ devp->dma_interrupt_handlers[channel].allocated = 1; ++ devp->dma_interrupt_handlers[channel].irq_handler = handler; ++ devp->dma_interrupt_handlers[channel].error_handler = error_handler; ++ devp->dma_interrupt_handlers[channel].dev = dev; ++ devp->dma_interrupt_handlers[channel].lock = lock; ++ devp->dma_interrupt_handlers[channel].device_id = device_id; ++ return 0; ++ } ++ return -EINVAL; ++} ++EXPORT_SYMBOL(request_edma_channel); ++ ++/* free eDMA channel */ ++int free_edma_channel(int channel, void* dev) ++{ ++ if (devp!=NULL && channel>=0 && channel<=EDMA_CHANNELS) { ++ if (devp->dma_interrupt_handlers[channel].allocated) { ++ if (devp->dma_interrupt_handlers[channel].dev != dev) { ++ return -EBUSY; ++ } ++ devp->dma_interrupt_handlers[channel].allocated = 0; ++ devp->dma_interrupt_handlers[channel].dev = NULL; ++ devp->dma_interrupt_handlers[channel].irq_handler = NULL; ++ devp->dma_interrupt_handlers[channel].error_handler = NULL; ++ devp->dma_interrupt_handlers[channel].lock = NULL; ++ } ++ return 0; ++ } ++ return -EINVAL; ++} ++EXPORT_SYMBOL(free_edma_channel); ++ ++/* clean-up device driver allocated resources */ ++static void coldfire_edma_cleanup(void) ++{ ++ dev_t devno; ++ int i; ++ ++ /* free interrupts/memory */ ++ if (devp) { ++ for (i=0;i<EDMA_CHANNELS;i++) ++ { ++ MCF_INTC0_SIMR = EDMA_INT_CHANNEL_BASE+i; ++ free_irq(EDMA_INT_CHANNEL_BASE+EDMA_INT_CONTROLLER_BASE+i, devp); ++ } ++ MCF_INTC0_SIMR = EDMA_INT_CHANNEL_BASE+EDMA_CHANNELS; ++ free_irq(EDMA_INT_CHANNEL_BASE+EDMA_INT_CONTROLLER_BASE+EDMA_CHANNELS, devp); ++ cdev_del(&devp->cdev); ++ kfree(devp); ++ } ++ ++ /* unregister character device */ ++ devno = MKDEV(coldfire_dma_major, 0); ++ unregister_chrdev_region(devno, 1); ++} ++ ++#ifdef CONFIG_PROC_FS ++/* proc file system support */ ++ ++#define FREE_CHANNEL "free" ++#define DEVICE_UNKNOWN "device unknown" ++ ++static int proc_edma_show(struct seq_file *m, void *v) ++{ ++ int i; ++ ++ if (devp==NULL) return 0; ++ ++ for (i = 0 ; i < EDMA_CHANNELS ; i++) { ++ if (devp->dma_interrupt_handlers[i].allocated) { ++ if (devp->dma_interrupt_handlers[i].device_id) ++ seq_printf(m, "%2d: %s\n", i, devp->dma_interrupt_handlers[i].device_id); ++ else ++ seq_printf(m, "%2d: %s\n", i, DEVICE_UNKNOWN); ++ } else { ++ seq_printf(m, "%2d: %s\n", i, FREE_CHANNEL); ++ } ++ } ++ return 0; ++} ++ ++static int proc_edma_open(struct inode *inode, struct file *file) ++{ ++ return single_open(file, proc_edma_show, NULL); ++} ++ ++static const struct file_operations proc_edma_operations = { ++ .open = proc_edma_open, ++ .read = seq_read, ++ .llseek = seq_lseek, ++ .release = single_release, ++}; ++ ++static int __init proc_edma_init(void) ++{ ++ struct proc_dir_entry *e; ++ ++ e = create_proc_entry("edma", 0, NULL); ++ if (e) ++ e->proc_fops = &proc_edma_operations; ++ ++ return 0; ++} ++ ++#endif ++ ++/* initializes device driver */ ++static int __init coldfire_edma_init(void) ++{ ++ dev_t dev; ++ int result; ++ int i; ++ ++ /* allocate free major number */ ++ result = alloc_chrdev_region(&dev, DMA_DEV_MINOR, 1, EDMA_DRIVER_NAME); ++ if (result<0) { ++ printk(KERN_WARNING EDMA_DRIVER_NAME": can't get major %d\n", result); ++ return result; ++ } ++ coldfire_dma_major = MAJOR(dev); ++ ++ /* allocate device driver structure */ ++ devp = kmalloc(sizeof(struct coldfire_edma_dev), GFP_KERNEL); ++ if (!devp) { ++ result = -ENOMEM; ++ goto fail; ++ } ++ ++ /* init handlers (no handlers for beggining) */ ++ for (i=0;i<EDMA_CHANNELS;i++) { ++ devp->dma_interrupt_handlers[i].irq_handler = NULL; ++ devp->dma_interrupt_handlers[i].error_handler = NULL; ++ devp->dma_interrupt_handlers[i].dev = NULL; ++ devp->dma_interrupt_handlers[i].allocated = 0; ++ devp->dma_interrupt_handlers[i].lock = NULL; ++ devp->dma_interrupt_handlers[i].device_id = NULL; ++ } ++ ++ /* register char device */ ++ cdev_init(&devp->cdev, &coldfire_edma_fops); ++ devp->cdev.owner = THIS_MODULE; ++ devp->cdev.ops = &coldfire_edma_fops; ++ result = cdev_add(&devp->cdev, dev, 1); ++ if (result) { ++ printk(KERN_NOTICE EDMA_DRIVER_NAME": Error %d adding coldfire-dma device\n", result); ++ result = -ENODEV; ++ goto fail; ++ } ++ ++ /* request/enable irq for each eDMA channel */ ++ for (i=0;i<EDMA_CHANNELS;i++) ++ { ++ result = request_irq(EDMA_INT_CHANNEL_BASE+EDMA_INT_CONTROLLER_BASE+i, ++ dmaisr, SA_INTERRUPT, EDMA_DRIVER_NAME, devp); ++ if (result) { ++ printk(KERN_WARNING EDMA_DRIVER_NAME": Cannot request irq %d\n", ++ EDMA_INT_CHANNEL_BASE+EDMA_INT_CONTROLLER_BASE+i); ++ result = -EBUSY; ++ goto fail; ++ } ++ ++ MCF_INTC0_ICR(EDMA_INT_CHANNEL_BASE+i) = EDMA_IRQ_LEVEL; ++ MCF_INTC0_CIMR = EDMA_INT_CHANNEL_BASE+i; ++ ++ } ++ ++ /* request error interrupt */ ++ result = request_irq(EDMA_INT_CHANNEL_BASE + EDMA_INT_CONTROLLER_BASE + EDMA_CHANNELS, ++ dma_error_isr, SA_INTERRUPT, EDMA_DRIVER_NAME, devp); ++ if (result) { ++ printk(KERN_WARNING EDMA_DRIVER_NAME": Cannot request irq %d\n", ++ EDMA_INT_CHANNEL_BASE+EDMA_INT_CONTROLLER_BASE+EDMA_CHANNELS); ++ result = -EBUSY; ++ goto fail; ++ } ++ ++ /* enable error interrupt in interrupt controller */ ++ MCF_INTC0_ICR(EDMA_INT_CHANNEL_BASE+EDMA_CHANNELS) = EDMA_IRQ_LEVEL; ++ MCF_INTC0_CIMR = EDMA_INT_CHANNEL_BASE+EDMA_CHANNELS; ++ ++#ifdef CONFIG_PROC_FS ++ proc_edma_init(); ++#endif ++ ++ printk(EDMA_DRIVER_NAME ": initialized successfully\n"); ++ ++ return 0; ++fail: ++ coldfire_edma_cleanup(); ++ return result; ++ ++} ++ ++static void __exit coldfire_edma_exit(void) ++{ ++ coldfire_edma_cleanup(); ++} ++ ++module_init(coldfire_edma_init); ++module_exit(coldfire_edma_exit); ++ ++MODULE_LICENSE("GPL"); ++MODULE_AUTHOR("Yaroslav Vinogradov, Freescale Inc."); ++MODULE_DESCRIPTION("eDMA library for Coldfire 5445x"); +--- /dev/null ++++ b/drivers/spi/spi-m5445x.c +@@ -0,0 +1,156 @@ ++/***************************************************************************/ ++/* ++ * linux/arch/m68k/coldfire/spi-m5445x.c ++ * ++ * Sub-architcture dependant initialization code for the Freescale ++ * 5445x SPI module ++ * ++ * Yaroslav Vinogradov yaroslav.vinogradov@freescale.com ++ * Copyright Freescale Semiconductor, Inc 2007 ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ */ ++/***************************************************************************/ ++ ++ ++#include <linux/kernel.h> ++#include <linux/sched.h> ++#include <linux/param.h> ++#include <linux/init.h> ++#include <linux/interrupt.h> ++#include <linux/device.h> ++#include <linux/platform_device.h> ++#include <linux/spi/spi.h> ++ ++#include <asm/dma.h> ++#include <asm/traps.h> ++#include <asm/machdep.h> ++#include <asm/coldfire.h> ++#include <asm/mcfsim.h> ++#include <asm/mcfqspi.h> ++#include <asm/mcf5445x_gpio.h> ++ ++#define SPI_NUM_CHIPSELECTS 0x10 ++#define SPI_PAR_VAL (0 | MCF_GPIO_PAR_DSPI_PCS5_PCS5 | MCF_GPIO_PAR_DSPI_PCS2_PCS2 \ ++ | MCF_GPIO_PAR_DSPI_PCS1_PCS1 | MCF_GPIO_PAR_DSPI_PCS0_PCS0 | MCF_GPIO_PAR_DSPI_SIN_SIN \ ++ | MCF_GPIO_PAR_DSPI_SOUT_SOUT | MCF_GPIO_PAR_DSPI_SCK_SCK) ++ ++#define MCF5445x_DSPI_IRQ_SOURCE (31) ++#define MCF5445x_DSPI_IRQ_VECTOR (64 + MCF5445x_DSPI_IRQ_SOURCE) ++ ++#define MCF5445x_DSPI_PAR (0xFC0A4063) ++#define MCF5445x_DSPI_MCR (0xFC05C000) ++#define MCF5445x_INTC0_ICR (0xFC048040) ++#define MCF5445x_INTC0_IMRL (0xFC04800C) ++ ++ ++#define M5445x_AUDIO_IRQ_SOURCE 49 ++#define M5445x_AUDIO_IRQ_VECTOR (128+M5445x_AUDIO_IRQ_SOURCE) ++#define M5445x_AUDIO_IRQ_LEVEL 4 ++ ++void coldfire_qspi_cs_control(u8 cs, u8 command) ++{ ++} ++ ++#if defined(CONFIG_SPI_COLDFIRE_SSI_AUDIO) ++static struct coldfire_spi_chip ssi_audio_chip_info = { ++ .mode = SPI_MODE_0, ++ .bits_per_word = 16, ++ .del_cs_to_clk = 16, ++ .del_after_trans = 16, ++ .void_write_data = 0 ++}; ++ ++#endif ++ ++static struct spi_board_info spi_board_info[] = { ++ ++#if defined(CONFIG_SPI_COLDFIRE_SSI_AUDIO) ++ { ++ .modalias = "ssi_audio", ++ .max_speed_hz = 300000, ++ .bus_num = 1, ++ .chip_select = 5, ++ .irq = M5445x_AUDIO_IRQ_VECTOR, ++ .platform_data = NULL, ++ .controller_data = &ssi_audio_chip_info ++ } ++#endif ++ ++}; ++ ++static struct coldfire_spi_master coldfire_master_info = { ++ .bus_num = 1, ++ .num_chipselect = SPI_NUM_CHIPSELECTS, ++ .irq_source = MCF5445x_DSPI_IRQ_SOURCE, ++ .irq_vector = MCF5445x_DSPI_IRQ_VECTOR, ++ .irq_mask = (0x01 << MCF5445x_DSPI_IRQ_SOURCE), ++ .irq_lp = 0x2, /* Level */ ++ .par_val = SPI_PAR_VAL, ++// .par_val16 = SPI_PAR_VAL, ++ .cs_control = coldfire_qspi_cs_control, ++}; ++ ++static struct resource coldfire_spi_resources[] = { ++ [0] = { ++ .name = "qspi-par", ++ .start = MCF5445x_DSPI_PAR, ++ .end = MCF5445x_DSPI_PAR, ++ .flags = IORESOURCE_MEM ++ }, ++ ++ [1] = { ++ .name = "qspi-module", ++ .start = MCF5445x_DSPI_MCR, ++ .end = MCF5445x_DSPI_MCR + 0xB8, ++ .flags = IORESOURCE_MEM ++ }, ++ ++ [2] = { ++ .name = "qspi-int-level", ++ .start = MCF5445x_INTC0_ICR + MCF5445x_DSPI_IRQ_SOURCE, ++ .end = MCF5445x_INTC0_ICR + MCF5445x_DSPI_IRQ_SOURCE, ++ .flags = IORESOURCE_MEM ++ }, ++ ++ [3] = { ++ .name = "qspi-int-mask", ++ .start = MCF5445x_INTC0_IMRL, ++ .end = MCF5445x_INTC0_IMRL, ++ .flags = IORESOURCE_MEM ++ } ++}; ++ ++static struct platform_device coldfire_spi = { ++ .name = "spi_coldfire", //"coldfire-qspi", ++ .id = -1, ++ .resource = coldfire_spi_resources, ++ .num_resources = ARRAY_SIZE(coldfire_spi_resources), ++ .dev = { ++ .platform_data = &coldfire_master_info, ++ } ++}; ++ ++static int __init spi_dev_init(void) ++{ ++ int retval = 0; ++ ++ retval = platform_device_register(&coldfire_spi); ++ ++ if (retval < 0) { ++ printk(KERN_ERR "SPI-m5445x: platform_device_register failed with code=%d\n", retval); ++ goto out; ++ } ++ ++ if (ARRAY_SIZE(spi_board_info)) ++ retval = spi_register_board_info(spi_board_info, ARRAY_SIZE(spi_board_info)); ++ ++ ++out: ++ return retval; ++} ++ ++arch_initcall(spi_dev_init); +--- /dev/null ++++ b/drivers/spi/spi_coldfire.c +@@ -0,0 +1,1552 @@ ++/****************************************************************************/ ++ ++/* ++ * spi_coldfire.c - Master QSPI/DSPI controller for the ColdFire processors ++ * ++ * (C) Copyright 2005, Intec Automation, ++ * Mike Lavender (mike@steroidmicros) ++ * ++ * (C) Copyright 2007, Freescale Inc, ++ * Yaroslav Vinogradov (yaroslav.vinogradov@freescale.com) ++ * ++ ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 2 of the License, or ++ (at your option) any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program; if not, write to the Free Software ++ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ ++/* ------------------------------------------------------------------------- */ ++ ++ ++/****************************************************************************/ ++ ++/* ++ * Includes ++ */ ++ ++#include <linux/autoconf.h> ++#include <linux/init.h> ++#include <linux/module.h> ++#include <linux/device.h> ++#include <linux/interrupt.h> ++#include <linux/platform_device.h> ++#include <linux/spi/spi.h> ++#include <linux/workqueue.h> ++#include <linux/delay.h> ++ ++#include <asm/delay.h> ++#include <asm/mcfsim.h> ++#include <asm/mcfqspi.h> ++#include <asm/coldfire.h> ++#include <asm/virtconvert.h> ++ ++#if defined(CONFIG_M54455) ++ #define SPI_DSPI ++ #if defined(CONFIG_SPI_COLDFIRE_DSPI_EDMA) ++ #define SPI_DSPI_EDMA ++ #ifdef CONFIG_MMU ++ #define SPI_USE_MMU ++ #endif ++ #endif ++#endif ++ ++#ifdef SPI_DSPI ++#include <asm/mcf5445x_dspi.h> ++ ++ ++#endif ++ ++#if defined(SPI_DSPI_EDMA) ++ ++/* edma buffer size in transfer units (32bits) */ ++#define EDMA_BUFFER_SIZE (PAGE_SIZE/4) ++#define EDMA_BUFSIZE_KMALLOC (EDMA_BUFFER_SIZE*4) ++ ++#define DSPI_DMA_RX_TCD 12 ++#define DSPI_DMA_TX_TCD 13 ++ ++ ++#include <asm/coldfire_edma.h> ++#include <asm/mcf5445x_edma.h> ++#endif ++ ++ ++MODULE_AUTHOR("Mike Lavender"); ++MODULE_DESCRIPTION("ColdFire QSPI Contoller"); ++MODULE_LICENSE("GPL"); ++ ++#define DRIVER_NAME "Coldfire QSPI/DSPI" ++ ++/****************************************************************************/ ++ ++/* ++ * Local constants and macros ++ */ ++ ++#define QSPI_RAM_SIZE 0x10 /* 16 word table */ ++ ++#define QSPI_TRANSMIT_RAM 0x00 ++#define QSPI_RECEIVE_RAM 0x10 ++#define QSPI_COMMAND_RAM 0x20 ++ ++#define QSPI_COMMAND 0x7000 /* 15: X = Continuous CS ++ * 14: 1 = Get BITSE from QMR[BITS] ++ * 13: 1 = Get DT from QDLYR[DTL] ++ * 12: 1 = Get DSK from QDLYR[QCD] ++ * 8-11: XXXX = next 4 bytes for CS ++ * 0-7: 0000 0000 Reserved ++ */ ++ ++#define QIR_WCEF 0x0008 /* write collison */ ++#define QIR_ABRT 0x0004 /* abort */ ++#define QIR_SPIF 0x0001 /* finished */ ++ ++#define QIR_WCEFE 0x0800 ++#define QIR_ABRTE 0x0400 ++#define QIR_SPIFE 0x0100 ++ ++#define QIR_WCEFB 0x8000 ++#define QIR_ABRTB 0x4000 ++#define QIR_ABRTL 0x1000 ++ ++#define QMR_BITS 0x3C00 ++#define QMR_BITS_8 0x2000 ++ ++#define QCR_CONT 0x8000 ++ ++#define QDLYR_SPE 0x8000 ++ ++#define QWR_ENDQP_MASK 0x0F00 ++#define QWR_CSIV 0x1000 /* 1 = active low chip selects */ ++ ++ ++#define START_STATE ((void*)0) ++#define RUNNING_STATE ((void*)1) ++#define DONE_STATE ((void*)2) ++#define ERROR_STATE ((void*)-1) ++ ++#define QUEUE_RUNNING 0 ++#define QUEUE_STOPPED 1 ++ ++/****************************************************************************/ ++ ++/* ++ * Local Data Structures ++ */ ++ ++struct transfer_state { ++ u32 index; ++ u32 len; ++ void *tx; ++ void *tx_end; ++ void *rx; ++ void *rx_end; ++ char flags; ++#define TRAN_STATE_RX_VOID 0x01 ++#define TRAN_STATE_TX_VOID 0x02 ++#define TRAN_STATE_WORD_ODD_NUM 0x04 ++ u8 cs; ++ u16 void_write_data; ++ unsigned cs_change:1; ++}; ++ ++typedef struct { ++ unsigned master:1; ++ unsigned dohie:1; ++ unsigned bits:4; ++ unsigned cpol:1; ++ unsigned cpha:1; ++ unsigned baud:8; ++} QMR; ++ ++typedef struct { ++ unsigned spe:1; ++ unsigned qcd:7; ++ unsigned dtl:8; ++} QDLYR; ++ ++typedef struct { ++ unsigned halt:1; ++ unsigned wren:1; ++ unsigned wrto:1; ++ unsigned csiv:1; ++ unsigned endqp:4; ++ unsigned cptqp:4; ++ unsigned newqp:4; ++} QWR; ++ ++ ++typedef struct { ++ unsigned master:1; ++ unsigned cont_scke:1; ++ unsigned dconf:2; ++ unsigned frz:1; ++ unsigned mtfe:1; ++ unsigned pcsse:1; ++ unsigned rooe:1; ++ unsigned pcsis:8; ++ unsigned reserved15:1; ++ unsigned mdis:1; ++ unsigned dis_tx:1; ++ unsigned dis_rxf:1; ++ unsigned clr_tx:1; ++ unsigned clr_rxf:1; ++ unsigned smpl_pt:2; ++ unsigned reserved71:7; ++ unsigned halt:1; ++} DSPI_MCR; ++ ++typedef struct { ++ unsigned dbr:1; ++ unsigned fmsz:4; ++ unsigned cpol:1; ++ unsigned cpha:1; ++ unsigned lsbfe:1; ++ unsigned pcssck:2; ++ unsigned pasc:2; ++ unsigned pdt:2; ++ unsigned pbr:2; ++ unsigned cssck:4; ++ unsigned asc:4; ++ unsigned dt:4; ++ unsigned br:4; ++} DSPI_CTAR; ++ ++struct chip_data { ++#if defined(SPI_DSPI) ++ /* dspi data */ ++ union { ++ u32 mcr_val; ++ DSPI_MCR mcr; ++ }; ++ union { ++ u32 ctar_val; ++ DSPI_CTAR ctar; ++ }; ++#else ++ union { ++ u16 qmr_val; ++ QMR qmr; ++ }; ++ union { ++ u16 qdlyr_val; ++ QDLYR qdlyr; ++ }; ++ union { ++ u16 qwr_val; ++ QWR qwr; ++ }; ++#endif ++ ++ u16 void_write_data; ++}; ++ ++ ++struct driver_data { ++ /* Driver model hookup */ ++ struct platform_device *pdev; ++ ++ /* SPI framework hookup */ ++ struct spi_master *master; ++ ++ /* Driver message queue */ ++ struct workqueue_struct *workqueue; ++ struct work_struct pump_messages; ++ spinlock_t lock; ++ struct list_head queue; ++ int busy; ++ int run; ++ ++ /* Message Transfer pump */ ++ struct tasklet_struct pump_transfers; ++ ++ /* Current message transfer state info */ ++ struct spi_message* cur_msg; ++ struct spi_transfer* cur_transfer; ++ struct chip_data *cur_chip; ++ size_t len; ++ void *tx; ++ void *tx_end; ++ void *rx; ++ void *rx_end; ++ char flags; ++#define TRAN_STATE_RX_VOID 0x01 ++#define TRAN_STATE_TX_VOID 0x02 ++#define TRAN_STATE_WORD_ODD_NUM 0x04 ++ u8 cs; ++ u16 void_write_data; ++ unsigned cs_change:1; ++ ++ u32 trans_cnt; ++ u32 wce_cnt; ++ u32 abrt_cnt; ++#if defined(SPI_DSPI) ++ u32 *mcr; /* DSPI MCR register */ ++ u32 *ctar; /* DSPI CTAR register */ ++ u32 *dspi_dtfr; /* DSPI DTFR register */ ++ u32 *dspi_drfr; /* DSPI DRFR register */ ++ u32 *dspi_rser; /* DSPI RSER register */ ++ u32 *dspi_sr; /* DSPI status register */ ++ u8 dspi_ctas; /* DSPI CTAS value*/ ++ ++#if defined(SPI_DSPI_EDMA) ++ void* edma_tx_buf; ++ void* edma_rx_buf; ++#endif ++ ++ ++#else ++ u16 *qmr; /* QSPI mode register */ ++ u16 *qdlyr; /* QSPI delay register */ ++ u16 *qwr; /* QSPI wrap register */ ++ u16 *qir; /* QSPI interrupt register */ ++ u16 *qar; /* QSPI address register */ ++ u16 *qdr; /* QSPI data register */ ++ u16 *qcr; /* QSPI command register */ ++#endif ++ u8 *par; /* Pin assignment register */ ++ u8 *int_icr; /* Interrupt level and priority register */ ++ u32 *int_mr; /* Interrupt mask register */ ++ void (*cs_control)(u8 cs, u8 command); ++}; ++ ++#define DSPI_CS(cs) ((1<<(cs))<<16) ++ ++ ++/****************************************************************************/ ++ ++/* ++ * SPI local functions ++ */ ++ ++//#define SPI_COLDFIRE_DEBUG ++ ++static void *next_transfer(struct driver_data *drv_data) ++{ ++ struct spi_message *msg = drv_data->cur_msg; ++ struct spi_transfer *trans = drv_data->cur_transfer; ++ ++ /* Move to next transfer */ ++ if (trans->transfer_list.next != &msg->transfers) { ++ drv_data->cur_transfer = ++ list_entry(trans->transfer_list.next, ++ struct spi_transfer, ++ transfer_list); ++ return RUNNING_STATE; ++ } else ++ return DONE_STATE; ++} ++ ++ ++#define DSPI_BITS MCF_DSPI_DCTAR_FMSZ(15) ++#define DSPI_BITS_16 MCF_DSPI_DCTAR_FMSZ(15) ++#define DSPI_BITS_8 MCF_DSPI_DCTAR_FMSZ(7) ++#define DSPI_FIFO_SIZE 16 ++ ++static inline int is_word_transfer(struct driver_data *drv_data) ++{ ++#if defined(SPI_DSPI) ++ return ((*drv_data->ctar & DSPI_BITS_16) == DSPI_BITS_8) ? 0 : 1; ++#else ++ return ((*drv_data->qmr & QMR_BITS) == QMR_BITS_8) ? 0 : 1; ++#endif ++} ++ ++static void inline set_8bit_transfer_mode(struct driver_data *drv_data) ++{ ++#if defined(SPI_DSPI) ++ *drv_data->ctar |= (*drv_data->ctar & ~DSPI_BITS) | DSPI_BITS_8; ++#else ++ *drv_data->qmr |= (*drv_data->qmr & ~QMR_BITS) | QMR_BITS_8; ++#endif ++} ++ ++static void inline set_16bit_transfer_mode(struct driver_data *drv_data) ++{ ++#if defined(SPI_DSPI) ++ *drv_data->ctar |= (*drv_data->ctar & ~DSPI_BITS) | DSPI_BITS_16; ++#else ++ *drv_data->qmr |= (*drv_data->qmr & ~QMR_BITS); ++#endif ++} ++ ++static int write(struct driver_data *drv_data) ++{ ++ int tx_count = 0; ++#ifndef SPI_DSPI ++ int cmd_count = 0; ++#endif ++ int tx_word; ++ ++#if defined(SPI_DSPI) ++ ++#if defined(SPI_DSPI_EDMA) ++ u32* edma_wr; ++#endif ++ ++ u16 d16; ++ u8 d8; ++ u32 dspi_pushr; ++ int first = 1; ++#endif ++ ++ tx_word = is_word_transfer(drv_data); ++ ++ // If we are in word mode, but only have a single byte to transfer ++ // then switch to byte mode temporarily. Will switch back at the ++ // end of the transfer. ++ if (tx_word && ((drv_data->tx_end - drv_data->tx) == 1)) { ++ drv_data->flags |= TRAN_STATE_WORD_ODD_NUM; ++ set_8bit_transfer_mode(drv_data); ++ tx_word = 0; ++ } ++ ++ ++#if defined(SPI_DSPI) ++ ++#if defined(SPI_DSPI_EDMA) ++ edma_wr = (u32*)(drv_data->edma_tx_buf); ++#endif ++ ++ ++#if defined(SPI_DSPI_EDMA) ++ while ((drv_data->tx < drv_data->tx_end) && (tx_count < EDMA_BUFFER_SIZE)) { ++#else ++ while ((drv_data->tx < drv_data->tx_end) && (tx_count < DSPI_FIFO_SIZE)) { ++#endif ++ if (tx_word) { ++ if ((drv_data->tx_end - drv_data->tx) == 1) ++ break; ++ if (!(drv_data->flags & TRAN_STATE_TX_VOID)) { ++ d16 = *(u16 *)drv_data->tx; ++ } else { ++ d16 = drv_data->void_write_data; ++ } ++ ++ dspi_pushr = MCF_DSPI_DTFR_TXDATA(d16) ++ | DSPI_CS(drv_data->cs) ++ | MCF_DSPI_DTFR_CTAS(drv_data->dspi_ctas) ++ //| MCF_DSPI_DTFR_CONT ++ ; ++ ++ drv_data->tx += 2; ++ ++#if defined(SPI_DSPI_EDMA) ++ if (drv_data->tx == drv_data->tx_end || tx_count==EDMA_BUFFER_SIZE-1) { ++#else ++ if (drv_data->tx == drv_data->tx_end || tx_count==DSPI_FIFO_SIZE-1) { ++#endif ++ // last transfer in queue ++ dspi_pushr |= MCF_DSPI_DTFR_EOQ; ++ if (drv_data->cs_change) { ++ dspi_pushr &= ~MCF_DSPI_DTFR_CONT; ++ } ++ } ++ ++ if (first) { ++ first = 0; ++ dspi_pushr |= MCF_DSPI_DTFR_CTCNT; // clear counter ++ } ++#if defined(SPI_DSPI_EDMA) ++ *edma_wr = dspi_pushr; ++ edma_wr++; ++#else ++ *drv_data->dspi_dtfr = dspi_pushr; ++ //MCF_DSPI_DTFR = dspi_pushr; ++#endif ++ ++ ++ } else { ++ if (!(drv_data->flags & TRAN_STATE_TX_VOID)) { ++ d8 = *(u8 *)drv_data->tx; ++ } else { ++ d8 = *(u8 *)&drv_data->void_write_data; ++ } ++ ++ dspi_pushr = MCF_DSPI_DTFR_TXDATA(d8) ++ | DSPI_CS(drv_data->cs) ++ /* | MCF_DSPI_DTFR_PCS5 | */ ++ | MCF_DSPI_DTFR_CTAS(drv_data->dspi_ctas) ++ | MCF_DSPI_DTFR_CONT; ++ ++ drv_data->tx++; ++ ++ if (drv_data->tx == drv_data->tx_end || tx_count==DSPI_FIFO_SIZE-1) { ++ // last transfer in queue ++ dspi_pushr |= MCF_DSPI_DTFR_EOQ; ++ if (drv_data->cs_change) { ++ dspi_pushr &= ~MCF_DSPI_DTFR_CONT; ++ } ++ } ++ ++ if (first) { ++ first = 0; ++ dspi_pushr |= MCF_DSPI_DTFR_CTCNT; // clear counter ++ } ++ ++#if defined(SPI_DSPI_EDMA) ++ *edma_wr = dspi_pushr; ++ edma_wr++; ++#else ++ *drv_data->dspi_dtfr = dspi_pushr; ++ //MCF_DSPI_DTFR = dspi_pushr; ++#endif ++ ++ } ++ tx_count++; ++ } ++ ++#if defined(SPI_DSPI_EDMA) ++ ++ if (tx_count>0) { ++ ++ // TODO: initiate eDMA transfer ++ set_edma_params(DSPI_DMA_TX_TCD, ++#ifdef SPI_USE_MMU ++ virt_to_phys(drv_data->edma_tx_buf), ++#else ++ drv_data->edma_tx_buf, ++#endif ++ (u32)drv_data->dspi_dtfr, ++ MCF_EDMA_TCD_ATTR_SSIZE_32BIT | MCF_EDMA_TCD_ATTR_DSIZE_32BIT, ++ 4, // soff ++ 4, // nbytes ++ 0, // slast ++ tx_count, // citer ++ tx_count, // biter ++ 0, // doff ++ 0, // dlastsga ++ 0, // major_int ++ 1 // disable_req ++ ); ++ ++ set_edma_params(DSPI_DMA_RX_TCD, ++ (u32)drv_data->dspi_drfr, ++#ifdef SPI_USE_MMU ++ virt_to_phys(drv_data->edma_rx_buf), ++#else ++ drv_data->edma_rx_buf, ++#endif ++ MCF_EDMA_TCD_ATTR_SSIZE_32BIT | MCF_EDMA_TCD_ATTR_DSIZE_32BIT, ++ 0, // soff ++ 4, // nbytes ++ 0, // slast ++ tx_count, // citer ++ tx_count, // biter ++ 4, // doff ++ 0, // dlastsga ++ 0, // major_int ++ 1 // disable_req ++ ); ++ ++ ++ start_edma_transfer(DSPI_DMA_TX_TCD); // transmit SPI data ++ start_edma_transfer(DSPI_DMA_RX_TCD); // receive SPI data ++ } ++#endif ++ ++#else ++ ++ *drv_data->qar = QSPI_TRANSMIT_RAM; ++ while ((drv_data->tx < drv_data->tx_end) && (tx_count < QSPI_RAM_SIZE)) { ++ if (tx_word) { ++ if ((drv_data->tx_end - drv_data->tx) == 1) ++ break; ++ ++ if (!(drv_data->flags & TRAN_STATE_TX_VOID)) ++ *drv_data->qdr = *(u16 *)drv_data->tx; ++ else ++ *drv_data->qdr = drv_data->void_write_data; ++ drv_data->tx += 2; ++ } else { ++ if (!(drv_data->flags & TRAN_STATE_TX_VOID)) ++ *drv_data->qdr = *(u8 *)drv_data->tx; ++ else ++ *drv_data->qdr = *(u8 *)&drv_data->void_write_data; ++ drv_data->tx++; ++ } ++ tx_count++; ++ } ++ ++ ++ *drv_data->qar = QSPI_COMMAND_RAM; ++ while (cmd_count < tx_count) { ++ u16 qcr = QSPI_COMMAND ++ | QCR_CONT ++ | (~((0x01 << drv_data->cs) << 8) & 0x0F00); ++ ++ if ( (cmd_count == tx_count - 1) ++ && (drv_data->tx == drv_data->tx_end) ++ && (drv_data->cs_change) ) { ++ qcr &= ~QCR_CONT; ++ } ++ *drv_data->qcr = qcr; ++ cmd_count++; ++ } ++ ++ *drv_data->qwr = (*drv_data->qwr & ~QWR_ENDQP_MASK) | ((cmd_count - 1) << 8); ++ ++ /* Fire it up! */ ++ *drv_data->qdlyr |= QDLYR_SPE; ++#endif ++ ++ return tx_count; ++} ++ ++ ++static int read(struct driver_data *drv_data) ++{ ++ int rx_count = 0; ++ int rx_word; ++#if defined(SPI_DSPI_EDMA) ++ u32* rx_edma; ++#endif ++ u16 d; ++ rx_word = is_word_transfer(drv_data); ++ ++#if defined(SPI_DSPI) ++ ++#if defined(SPI_DSPI_EDMA) ++ rx_edma = (u32*) drv_data->edma_tx_buf; ++ while ((drv_data->rx < drv_data->rx_end) && (rx_count < EDMA_BUFFER_SIZE)) { ++#else ++ while ((drv_data->rx < drv_data->rx_end) && (rx_count < DSPI_FIFO_SIZE)) { ++#endif ++ if (rx_word) { ++ if ((drv_data->rx_end - drv_data->rx) == 1) ++ break; ++#if defined(SPI_DSPI_EDMA) ++ d = MCF_DSPI_DRFR_RXDATA(*rx_edma); ++ rx_edma++; ++#else ++ d = MCF_DSPI_DRFR_RXDATA(*drv_data->dspi_drfr); ++#endif ++ ++ if (!(drv_data->flags & TRAN_STATE_RX_VOID)) ++ *(u16 *)drv_data->rx = d; ++ drv_data->rx += 2; ++ } else { ++#if defined(SPI_DSPI_EDMA) ++ d = MCF_DSPI_DRFR_RXDATA(*rx_edma); ++ rx_edma++; ++#else ++ d = MCF_DSPI_DRFR_RXDATA(*drv_data->dspi_drfr); ++#endif ++ if (!(drv_data->flags & TRAN_STATE_RX_VOID)) ++ *(u8 *)drv_data->rx = d; ++ drv_data->rx++; ++ } ++ rx_count++; ++ } ++ ++ ++#else ++ ++ *drv_data->qar = QSPI_RECEIVE_RAM; ++ while ((drv_data->rx < drv_data->rx_end) && (rx_count < QSPI_RAM_SIZE)) { ++ if (rx_word) { ++ if ((drv_data->rx_end - drv_data->rx) == 1) ++ break; ++ ++ if (!(drv_data->flags & TRAN_STATE_RX_VOID)) ++ *(u16 *)drv_data->rx = *drv_data->qdr; ++ drv_data->rx += 2; ++ } else { ++ if (!(drv_data->flags & TRAN_STATE_RX_VOID)) ++ *(u8 *)drv_data->rx = *drv_data->qdr; ++ drv_data->rx++; ++ } ++ rx_count++; ++ } ++#endif ++ ++ return rx_count; ++} ++ ++ ++static inline void qspi_setup_chip(struct driver_data *drv_data) ++{ ++ struct chip_data *chip = drv_data->cur_chip; ++ ++#if defined(SPI_DSPI) ++ ++ *drv_data->mcr = chip->mcr_val; ++ ++ // TODO: remove later ++ chip->ctar_val = 0x78560118; ++ ++ *drv_data->ctar = chip->ctar_val; ++ *drv_data->dspi_rser = 0 ++ | MCF_DSPI_DRSER_EOQFE ++#if defined(SPI_DSPI_EDMA) ++ | MCF_DSPI_DRSER_TFFFE ++ | MCF_DSPI_DRSER_TFFFS ++#endif ++ ; ++ ++ ++#else ++ *drv_data->qmr = chip->qmr_val; ++ *drv_data->qdlyr = chip->qdlyr_val; ++ *drv_data->qwr = chip->qwr_val; ++ ++ /* ++ * Enable all the interrupts and clear all the flags ++ */ ++ *drv_data->qir = (QIR_SPIFE | QIR_ABRTE | QIR_WCEFE) ++ | (QIR_WCEFB | QIR_ABRTB | QIR_ABRTL) ++ | (QIR_SPIF | QIR_ABRT | QIR_WCEF); ++#endif ++} ++ ++#if defined(SPI_DSPI_EDMA) ++static int edma_tx_handler(int channel, void* dev) ++{ ++ if (channel == DSPI_DMA_TX_TCD) { ++ stop_edma_transfer(DSPI_DMA_TX_TCD); ++ } ++ return IRQ_HANDLED; ++} ++ ++static int edma_rx_handler(int channel, void* dev) ++{ ++ if (channel == DSPI_DMA_RX_TCD) { ++ stop_edma_transfer(DSPI_DMA_RX_TCD); ++ } ++ ++ return IRQ_HANDLED; ++} ++#endif ++ ++static irqreturn_t qspi_interrupt(int irq, void *dev_id) ++{ ++ struct driver_data *drv_data = (struct driver_data *)dev_id; ++ struct spi_message *msg = drv_data->cur_msg; ++#if defined(SPI_DSPI) ++#if !defined(SPI_DSPI_EDMA) ++ u32 irq_status = *drv_data->dspi_sr; ++#endif ++#else ++ u16 irq_status = *drv_data->qir; ++#endif ++ ++ /* Clear all flags immediately */ ++#if defined(SPI_DSPI) ++ *drv_data->dspi_sr = MCF_DSPI_DSR_EOQF; ++#else ++ *drv_data->qir |= (QIR_SPIF | QIR_ABRT | QIR_WCEF); ++#endif ++ ++ if (!drv_data->cur_msg || !drv_data->cur_msg->state) { ++#if !defined(SPI_DSPI_EDMA) ++ /* if eDMA is used it happens some time (at least once)*/ ++ printk(KERN_ERR "coldfire-qspi: bad message or transfer " ++ "state in interrupt handler. IRQ status=%x\n", irq_status); ++#endif ++ return IRQ_NONE; ++ } ++ ++#if !defined(SPI_DSPI) ++ if (irq_status & QIR_SPIF) { ++#endif ++ /* ++ * Read the data into the buffer and reload and start ++ * queue with new data if not finished. If finished ++ * then setup the next transfer ++ */ ++ read(drv_data); ++ ++ if (drv_data->rx == drv_data->rx_end) { ++ /* ++ * Finished now - fall through and schedule next ++ * transfer tasklet ++ */ ++ if (drv_data->flags & TRAN_STATE_WORD_ODD_NUM) { ++ //*drv_data->qmr &= ~QMR_BITS; ++ set_16bit_transfer_mode(drv_data); ++ } ++ ++ msg->state = next_transfer(drv_data); ++ msg->actual_length += drv_data->len; ++ } else { ++ /* not finished yet - keep going */ ++ write(drv_data); ++ return IRQ_HANDLED; ++ } ++#if !defined(SPI_DSPI) ++ } else { ++ if (irq_status & QIR_WCEF) ++ drv_data->wce_cnt++; ++ ++ if (irq_status & QIR_ABRT) ++ drv_data->abrt_cnt++; ++ ++ msg->state = ERROR_STATE; ++ } ++#endif ++ ++ tasklet_schedule(&drv_data->pump_transfers); ++ ++ return IRQ_HANDLED; ++} ++ ++/* caller already set message->status; dma and pio irqs are blocked */ ++static void giveback(struct driver_data *drv_data) ++{ ++ struct spi_transfer* last_transfer; ++ unsigned long flags; ++ struct spi_message *msg; ++ ++ spin_lock_irqsave(&drv_data->lock, flags); ++ msg = drv_data->cur_msg; ++ drv_data->cur_msg = NULL; ++ drv_data->cur_transfer = NULL; ++ drv_data->cur_chip = NULL; ++ queue_work(drv_data->workqueue, &drv_data->pump_messages); ++ spin_unlock_irqrestore(&drv_data->lock, flags); ++ ++ last_transfer = list_entry(msg->transfers.prev, ++ struct spi_transfer, ++ transfer_list); ++ ++ if (!last_transfer->cs_change) ++ drv_data->cs_control(drv_data->cs, QSPI_CS_DROP); ++ ++ msg->state = NULL; ++ if (msg->complete) ++ msg->complete(msg->context); ++} ++ ++ ++static void pump_transfers(unsigned long data) ++{ ++ struct driver_data *drv_data = (struct driver_data *)data; ++ struct spi_message *message = NULL; ++ struct spi_transfer *transfer = NULL; ++ struct spi_transfer *previous = NULL; ++ struct chip_data *chip = NULL; ++ unsigned long flags; ++ ++ /* Get current state information */ ++ message = drv_data->cur_msg; ++ transfer = drv_data->cur_transfer; ++ chip = drv_data->cur_chip; ++ ++ /* Handle for abort */ ++ if (message->state == ERROR_STATE) { ++ message->status = -EIO; ++ giveback(drv_data); ++ return; ++ } ++ ++ /* Handle end of message */ ++ if (message->state == DONE_STATE) { ++ message->status = 0; ++ giveback(drv_data); ++ return; ++ } ++ ++ if (message->state == START_STATE) { ++ qspi_setup_chip(drv_data); ++ ++ if (drv_data->cs_control) { ++ //printk( "m s\n" ); ++ drv_data->cs_control(message->spi->chip_select, QSPI_CS_ASSERT); ++ } ++ } ++ ++ /* Delay if requested at end of transfer*/ ++ if (message->state == RUNNING_STATE) { ++ previous = list_entry(transfer->transfer_list.prev, ++ struct spi_transfer, ++ transfer_list); ++ ++ if (drv_data->cs_control && transfer->cs_change) ++ drv_data->cs_control(message->spi->chip_select, QSPI_CS_DROP); ++ ++ if (previous->delay_usecs) ++ udelay(previous->delay_usecs); ++ ++ if (drv_data->cs_control && transfer->cs_change) ++ drv_data->cs_control(message->spi->chip_select, QSPI_CS_ASSERT); ++ } ++ ++ drv_data->flags = 0; ++ drv_data->tx = (void *)transfer->tx_buf; ++ drv_data->tx_end = drv_data->tx + transfer->len; ++ drv_data->rx = transfer->rx_buf; ++ drv_data->rx_end = drv_data->rx + transfer->len; ++ drv_data->len = transfer->len; ++ if (!drv_data->rx) ++ drv_data->flags |= TRAN_STATE_RX_VOID; ++ if (!drv_data->tx) ++ drv_data->flags |= TRAN_STATE_TX_VOID; ++ drv_data->cs = message->spi->chip_select; ++ drv_data->cs_change = transfer->cs_change; ++ drv_data->void_write_data = chip->void_write_data; ++ ++ message->state = RUNNING_STATE; ++ ++ /* Go baby, go */ ++ local_irq_save(flags); ++ write(drv_data); ++ local_irq_restore(flags); ++} ++ ++ ++static void pump_messages(struct work_struct * work) ++{ ++ struct driver_data *drv_data; ++ unsigned long flags; ++ ++ drv_data = container_of(work, struct driver_data, pump_messages); ++ ++ /* Lock queue and check for queue work */ ++ spin_lock_irqsave(&drv_data->lock, flags); ++ if (list_empty(&drv_data->queue) || drv_data->run == QUEUE_STOPPED) { ++ drv_data->busy = 0; ++ spin_unlock_irqrestore(&drv_data->lock, flags); ++ return; ++ } ++ ++ /* Make sure we are not already running a message */ ++ if (drv_data->cur_msg) { ++ spin_unlock_irqrestore(&drv_data->lock, flags); ++ return; ++ } ++ ++ /* Extract head of queue */ ++ drv_data->cur_msg = list_entry(drv_data->queue.next, ++ struct spi_message, queue); ++ list_del_init(&drv_data->cur_msg->queue); ++ ++ /* Initial message state*/ ++ drv_data->cur_msg->state = START_STATE; ++ drv_data->cur_transfer = list_entry(drv_data->cur_msg->transfers.next, ++ struct spi_transfer, ++ transfer_list); ++ ++ /* Setup the SPI Registers using the per chip configuration */ ++ drv_data->cur_chip = spi_get_ctldata(drv_data->cur_msg->spi); ++ ++ /* Mark as busy and launch transfers */ ++ tasklet_schedule(&drv_data->pump_transfers); ++ ++ drv_data->busy = 1; ++ spin_unlock_irqrestore(&drv_data->lock, flags); ++} ++ ++/****************************************************************************/ ++ ++/* ++ * SPI master implementation ++ */ ++ ++static int transfer(struct spi_device *spi, struct spi_message *msg) ++{ ++ struct driver_data *drv_data = spi_master_get_devdata(spi->master); ++ unsigned long flags; ++ ++ spin_lock_irqsave(&drv_data->lock, flags); ++ ++ if (drv_data->run == QUEUE_STOPPED) { ++ spin_unlock_irqrestore(&drv_data->lock, flags); ++ return -ESHUTDOWN; ++ } ++ ++ msg->actual_length = 0; ++ msg->status = -EINPROGRESS; ++ msg->state = START_STATE; ++ ++ list_add_tail(&msg->queue, &drv_data->queue); ++ ++ if (drv_data->run == QUEUE_RUNNING && !drv_data->busy) ++ queue_work(drv_data->workqueue, &drv_data->pump_messages); ++ ++ spin_unlock_irqrestore(&drv_data->lock, flags); ++ ++ return 0; ++} ++ ++ ++static int setup(struct spi_device *spi) ++{ ++ struct coldfire_spi_chip *chip_info; ++ struct chip_data *chip; ++#ifndef SPI_DSPI ++ u32 baud_divisor = 255; ++#endif ++ ++ chip_info = (struct coldfire_spi_chip *)spi->controller_data; ++ ++ /* Only alloc on first setup */ ++ chip = spi_get_ctldata(spi); ++ if (chip == NULL) { ++ chip = kcalloc(1, sizeof(struct chip_data), GFP_KERNEL); ++ if (!chip) ++ return -ENOMEM; ++ spi->mode = chip_info->mode; ++ spi->bits_per_word = chip_info->bits_per_word; ++ } ++ ++#if defined(SPI_DSPI) ++ chip->mcr.master = 1; ++ chip->mcr.cont_scke = 0; ++ chip->mcr.dconf = 0; ++ chip->mcr.frz = 0; ++ chip->mcr.mtfe = 1; ++ chip->mcr.pcsse = 0; ++ chip->mcr.rooe = 0; ++ chip->mcr.pcsis = 0xFF; ++ chip->mcr.reserved15 = 0; ++ chip->mcr.mdis = 0; ++ chip->mcr.dis_tx = 0; ++ chip->mcr.dis_rxf = 0; ++ chip->mcr.clr_tx = 1; ++ chip->mcr.clr_rxf = 1; ++ chip->mcr.smpl_pt = 0; ++ chip->mcr.reserved71 = 0; ++ chip->mcr.halt = 0; ++ ++ if ((spi->bits_per_word >= 4) && (spi->bits_per_word <= 16)) { ++ chip->ctar.fmsz = spi->bits_per_word-1; ++ } else { ++ printk(KERN_ERR "coldfire-qspi: invalid wordsize\n"); ++ kfree(chip); ++ return -ENODEV; ++ } ++ ++ if (spi->mode & SPI_CPHA) ++ chip->ctar.cpha = 1; ++ else ++ chip->ctar.cpha = 0; ++ ++ if (spi->mode & SPI_CPOL) ++ chip->ctar.cpol = 1; ++ else ++ chip->ctar.cpol = 0; ++ ++ if (spi->mode & SPI_LSB_FIRST) ++ chip->ctar.lsbfe = 1; ++ else ++ chip->ctar.lsbfe = 0; ++ ++ /* This values are default for audio device */ ++ chip->ctar.dbr = 0; ++ chip->ctar.pbr = 2; ++ chip->ctar.br = 8; ++ ++ /* This values are default for audio device */ ++ chip->ctar.pcssck = 1; ++ chip->ctar.pasc = 1; ++ chip->ctar.pdt = 1; ++ chip->ctar.cssck = 0; ++ chip->ctar.asc = 1; ++ chip->ctar.dt = 1; ++ ++ chip->void_write_data = chip_info->void_write_data; ++ ++#else ++ ++ chip->qwr.csiv = 1; // Chip selects are active low ++ chip->qmr.master = 1; // Must set to master mode ++ chip->qmr.dohie = 1; // Data output high impediance enabled ++ chip->void_write_data = chip_info->void_write_data; ++ ++ chip->qdlyr.qcd = chip_info->del_cs_to_clk; ++ chip->qdlyr.dtl = chip_info->del_after_trans; ++ ++ if (spi->max_speed_hz != 0) ++ baud_divisor = (MCF_CLK/(2*spi->max_speed_hz)); ++ ++ if (baud_divisor < 2) ++ baud_divisor = 2; ++ ++ if (baud_divisor > 255) ++ baud_divisor = 255; ++ ++ chip->qmr.baud = baud_divisor; ++ ++ //printk( "QSPI: spi->max_speed_hz %d\n", spi->max_speed_hz ); ++ //printk( "QSPI: Baud set to %d\n", chip->qmr.baud ); ++ ++ if (spi->mode & SPI_CPHA) ++ chip->qmr.cpha = 1; ++ ++ if (spi->mode & SPI_CPOL) ++ chip->qmr.cpol = 1; ++ ++ if (spi->bits_per_word == 16) { ++ chip->qmr.bits = 0; ++ } else if ((spi->bits_per_word >= 8) && (spi->bits_per_word <= 15)) { ++ chip->qmr.bits = spi->bits_per_word; ++ } else { ++ printk(KERN_ERR "coldfire-qspi: invalid wordsize\n"); ++ kfree(chip); ++ return -ENODEV; ++ } ++ ++#endif ++ ++ spi_set_ctldata(spi, chip); ++ ++ return 0; ++} ++ ++static int init_queue(struct driver_data *drv_data) ++{ ++ INIT_LIST_HEAD(&drv_data->queue); ++ spin_lock_init(&drv_data->lock); ++ ++ drv_data->run = QUEUE_STOPPED; ++ drv_data->busy = 0; ++ ++ tasklet_init(&drv_data->pump_transfers, ++ pump_transfers, (unsigned long)drv_data); ++ ++ INIT_WORK(&drv_data->pump_messages, pump_messages/*, drv_data*/); ++ ++ drv_data->workqueue = create_singlethread_workqueue( ++ drv_data->master->cdev.dev->bus_id); ++ if (drv_data->workqueue == NULL) ++ return -EBUSY; ++ ++ return 0; ++} ++ ++static int start_queue(struct driver_data *drv_data) ++{ ++ unsigned long flags; ++ ++ spin_lock_irqsave(&drv_data->lock, flags); ++ ++ if (drv_data->run == QUEUE_RUNNING || drv_data->busy) { ++ spin_unlock_irqrestore(&drv_data->lock, flags); ++ return -EBUSY; ++ } ++ ++ drv_data->run = QUEUE_RUNNING; ++ drv_data->cur_msg = NULL; ++ drv_data->cur_transfer = NULL; ++ drv_data->cur_chip = NULL; ++ spin_unlock_irqrestore(&drv_data->lock, flags); ++ ++ queue_work(drv_data->workqueue, &drv_data->pump_messages); ++ ++ return 0; ++} ++ ++static int stop_queue(struct driver_data *drv_data) ++{ ++ unsigned long flags; ++ unsigned limit = 500; ++ int status = 0; ++ ++ spin_lock_irqsave(&drv_data->lock, flags); ++ ++ /* This is a bit lame, but is optimized for the common execution path. ++ * A wait_queue on the drv_data->busy could be used, but then the common ++ * execution path (pump_messages) would be required to call wake_up or ++ * friends on every SPI message. Do this instead */ ++ drv_data->run = QUEUE_STOPPED; ++ while (!list_empty(&drv_data->queue) && drv_data->busy && limit--) { ++ spin_unlock_irqrestore(&drv_data->lock, flags); ++ msleep(10); ++ spin_lock_irqsave(&drv_data->lock, flags); ++ } ++ ++ if (!list_empty(&drv_data->queue) || drv_data->busy) ++ status = -EBUSY; ++ ++ spin_unlock_irqrestore(&drv_data->lock, flags); ++ ++ return status; ++} ++ ++static int destroy_queue(struct driver_data *drv_data) ++{ ++ int status; ++ ++ status = stop_queue(drv_data); ++ if (status != 0) ++ return status; ++ ++ destroy_workqueue(drv_data->workqueue); ++ ++ return 0; ++} ++ ++ ++static void cleanup(const struct spi_device *spi) ++{ ++ struct chip_data *chip = spi_get_ctldata((struct spi_device *)spi); ++ ++ dev_dbg(&spi->dev, "spi_device %u.%u cleanup\n", ++ spi->master->bus_num, spi->chip_select); ++ ++ kfree(chip); ++} ++ ++ ++/****************************************************************************/ ++ ++/* ++ * Generic Device driver routines and interface implementation ++ */ ++ ++static int coldfire_spi_probe(struct platform_device *pdev) ++{ ++ struct device *dev = &pdev->dev; ++ struct coldfire_spi_master *platform_info; ++ struct spi_master *master; ++ struct driver_data *drv_data = 0; ++ struct resource *memory_resource; ++ int irq; ++ int status = 0; ++ int i; ++ ++#if defined(SPI_DSPI_EDMA) ++ init_edma(); ++#endif ++ ++ platform_info = (struct coldfire_spi_master *)pdev->dev.platform_data; ++ ++ master = spi_alloc_master(dev, sizeof(struct driver_data)); ++ if (!master) ++ return -ENOMEM; ++ ++ drv_data = class_get_devdata(&master->cdev); ++ drv_data->master = master; ++ ++ INIT_LIST_HEAD(&drv_data->queue); ++ spin_lock_init(&drv_data->lock); ++ ++ master->bus_num = platform_info->bus_num; ++ master->num_chipselect = platform_info->num_chipselect; ++ master->cleanup = cleanup; ++ master->setup = setup; ++ master->transfer = transfer; ++ ++ drv_data->cs_control = platform_info->cs_control; ++ if (drv_data->cs_control) ++ for(i = 0; i < master->num_chipselect; i++) ++ drv_data->cs_control(i, QSPI_CS_INIT | QSPI_CS_DROP); ++ ++ /* Setup register addresses */ ++ memory_resource = platform_get_resource_byname(pdev, IORESOURCE_MEM, "qspi-module"); ++ if (!memory_resource) { ++ dev_dbg(dev, "can not find platform module memory\n"); ++ goto out_error_master_alloc; ++ } ++ ++#if defined(SPI_DSPI_EDMA) ++ drv_data->edma_tx_buf = kmalloc(EDMA_BUFSIZE_KMALLOC, GFP_DMA); ++ if (!drv_data->edma_tx_buf) { ++ dev_dbg(dev, "cannot allocate eDMA TX memory\n"); ++ goto out_error_master_alloc; ++ } ++ drv_data->edma_rx_buf = kmalloc(EDMA_BUFSIZE_KMALLOC, GFP_DMA); ++ if (!drv_data->edma_rx_buf) { ++ kfree(drv_data->edma_tx_buf); ++ dev_dbg(dev, "cannot allocate eDMA RX memory\n"); ++ goto out_error_master_alloc; ++ } ++#endif ++ ++#if defined(SPI_DSPI) ++ ++ drv_data->mcr = (void *)(memory_resource->start + 0x00000000); ++ drv_data->ctar = (void *)(memory_resource->start + 0x0000000C); ++ drv_data->dspi_sr = (void *)(memory_resource->start + 0x0000002C); ++ drv_data->dspi_rser = (void *)(memory_resource->start + 0x00000030); ++ drv_data->dspi_dtfr = (void *)(memory_resource->start + 0x00000034); ++ drv_data->dspi_drfr = (void *)(memory_resource->start + 0x00000038); ++ ++#else ++ ++ drv_data->qmr = (void *)(memory_resource->start + 0x00000000); ++ drv_data->qdlyr = (void *)(memory_resource->start + 0x00000004); ++ drv_data->qwr = (void *)(memory_resource->start + 0x00000008); ++ drv_data->qir = (void *)(memory_resource->start + 0x0000000c); ++ drv_data->qar = (void *)(memory_resource->start + 0x00000010); ++ drv_data->qdr = (void *)(memory_resource->start + 0x00000014); ++ drv_data->qcr = (void *)(memory_resource->start + 0x00000014); ++ ++#endif ++ ++ /* Setup register addresses */ ++ memory_resource = platform_get_resource_byname(pdev, IORESOURCE_MEM, "qspi-par"); ++ if (!memory_resource) { ++ dev_dbg(dev, "can not find platform par memory\n"); ++ goto out_error_master_alloc; ++ } ++ ++ drv_data->par = (void *)memory_resource->start; ++ ++ /* Setup register addresses */ ++ memory_resource = platform_get_resource_byname(pdev, IORESOURCE_MEM, "qspi-int-level"); ++ if (!memory_resource) { ++ dev_dbg(dev, "can not find platform par memory\n"); ++ goto out_error_master_alloc; ++ } ++ ++ drv_data->int_icr = (void *)memory_resource->start; ++ ++ /* Setup register addresses */ ++ memory_resource = platform_get_resource_byname(pdev, IORESOURCE_MEM, "qspi-int-mask"); ++ if (!memory_resource) { ++ dev_dbg(dev, "can not find platform par memory\n"); ++ goto out_error_master_alloc; ++ } ++ ++ drv_data->int_mr = (void *)memory_resource->start; ++ ++ irq = platform_info->irq_vector; ++ ++ status = request_irq(platform_info->irq_vector, qspi_interrupt, SA_INTERRUPT, dev->bus_id, drv_data); ++ if (status < 0) { ++ dev_err(&pdev->dev, "unable to attach ColdFire QSPI interrupt\n"); ++ goto out_error_master_alloc; ++ } ++ ++ /* Now that we have all the addresses etc. Let's set it up */ ++ // TODO: ++ //*drv_data->par = platform_info->par_val; ++ ++ MCF_GPIO_PAR_DSPI = 0 ++ | MCF_GPIO_PAR_DSPI_PCS5_PCS5 ++ | MCF_GPIO_PAR_DSPI_PCS2_PCS2 ++ | MCF_GPIO_PAR_DSPI_PCS1_PCS1 ++ | MCF_GPIO_PAR_DSPI_PCS0_PCS0 ++ | MCF_GPIO_PAR_DSPI_SIN_SIN ++ | MCF_GPIO_PAR_DSPI_SOUT_SOUT ++ | MCF_GPIO_PAR_DSPI_SCK_SCK; ++ ++ *drv_data->int_icr = platform_info->irq_lp; ++ *drv_data->int_mr &= ~platform_info->irq_mask; ++ ++#ifdef SPI_DSPI ++ drv_data->dspi_ctas = 0; // TODO: change later ++#endif ++ ++ /* Initial and start queue */ ++ status = init_queue(drv_data); ++ if (status != 0) { ++ dev_err(&pdev->dev, "problem initializing queue\n"); ++ goto out_error_irq_alloc; ++ } ++ status = start_queue(drv_data); ++ if (status != 0) { ++ dev_err(&pdev->dev, "problem starting queue\n"); ++ goto out_error_irq_alloc; ++ } ++ ++ /* Register with the SPI framework */ ++ platform_set_drvdata(pdev, drv_data); ++ status = spi_register_master(master); ++ if (status != 0) { ++ dev_err(&pdev->dev, "problem registering spi master\n"); ++ status = -EINVAL; ++ goto out_error_queue_alloc; ++ } ++ ++#if defined(SPI_DSPI_EDMA) ++ if (request_edma_channel(DSPI_DMA_TX_TCD, ++ edma_tx_handler, ++ NULL, ++ pdev, ++ NULL, /* spinlock */ ++ DRIVER_NAME ++ )!=0) ++ { ++ dev_err(&pdev->dev, "problem requesting edma transmit channel\n"); ++ status = -EINVAL; ++ goto out_error_queue_alloc; ++ } ++ ++ if (request_edma_channel(DSPI_DMA_RX_TCD, ++ edma_rx_handler, ++ NULL, ++ pdev, ++ NULL, /* spinlock */ ++ DRIVER_NAME ++ )!=0) ++ { ++ dev_err(&pdev->dev, "problem requesting edma receive channel\n"); ++ status = -EINVAL; ++ goto out_edma_transmit; ++ } ++#endif ++ ++ printk( "SPI: Coldfire master initialized\n" ); ++ //dev_info(&pdev->dev, "driver initialized\n"); ++ return status; ++ ++#if defined(SPI_DSPI_EDMA) ++out_edma_transmit: ++ free_edma_channel(DSPI_DMA_TX_TCD, pdev); ++#endif ++ ++out_error_queue_alloc: ++ destroy_queue(drv_data); ++ ++out_error_irq_alloc: ++ free_irq(irq, drv_data); ++ ++out_error_master_alloc: ++ spi_master_put(master); ++ return status; ++ ++} ++ ++static int coldfire_spi_remove(struct platform_device *pdev) ++{ ++ struct driver_data *drv_data = platform_get_drvdata(pdev); ++ int irq; ++ int status = 0; ++ ++ if (!drv_data) ++ return 0; ++ ++#if defined(SPI_DSPI_EDMA) ++ free_edma_channel(DSPI_DMA_TX_TCD, pdev); ++ free_edma_channel(DSPI_DMA_RX_TCD, pdev); ++#endif ++ ++ /* Remove the queue */ ++ status = destroy_queue(drv_data); ++ if (status != 0) ++ return status; ++ ++ /* Disable the SSP at the peripheral and SOC level */ ++ /*write_SSCR0(0, drv_data->ioaddr); ++ pxa_set_cken(drv_data->master_info->clock_enable, 0);*/ ++ ++ /* Release DMA */ ++ /*if (drv_data->master_info->enable_dma) { ++ if (drv_data->ioaddr == SSP1_VIRT) { ++ DRCMRRXSSDR = 0; ++ DRCMRTXSSDR = 0; ++ } else if (drv_data->ioaddr == SSP2_VIRT) { ++ DRCMRRXSS2DR = 0; ++ DRCMRTXSS2DR = 0; ++ } else if (drv_data->ioaddr == SSP3_VIRT) { ++ DRCMRRXSS3DR = 0; ++ DRCMRTXSS3DR = 0; ++ } ++ pxa_free_dma(drv_data->tx_channel); ++ pxa_free_dma(drv_data->rx_channel); ++ }*/ ++ ++ /* Release IRQ */ ++ irq = platform_get_irq(pdev, 0); ++ if (irq >= 0) ++ free_irq(irq, drv_data); ++ ++ /* Disconnect from the SPI framework */ ++ spi_unregister_master(drv_data->master); ++ ++ /* Prevent double remove */ ++ platform_set_drvdata(pdev, NULL); ++ ++ return 0; ++} ++ ++static void coldfire_spi_shutdown(struct platform_device *pdev) ++{ ++ int status = 0; ++ ++ if ((status = coldfire_spi_remove(pdev)) != 0) ++ dev_err(&pdev->dev, "shutdown failed with %d\n", status); ++} ++ ++ ++#ifdef CONFIG_PM ++static int suspend_devices(struct device *dev, void *pm_message) ++{ ++ pm_message_t *state = pm_message; ++ ++ if (dev->power.power_state.event != state->event) { ++ dev_warn(dev, "pm state does not match request\n"); ++ return -1; ++ } ++ ++ return 0; ++} ++ ++static int coldfire_spi_suspend(struct platform_device *pdev, pm_message_t state) ++{ ++ struct driver_data *drv_data = platform_get_drvdata(pdev); ++ int status = 0; ++ ++ /* Check all childern for current power state */ ++ if (device_for_each_child(&pdev->dev, &state, suspend_devices) != 0) { ++ dev_warn(&pdev->dev, "suspend aborted\n"); ++ return -1; ++ } ++ ++ status = stop_queue(drv_data); ++ if (status != 0) ++ return status; ++ /*write_SSCR0(0, drv_data->ioaddr); ++ pxa_set_cken(drv_data->master_info->clock_enable, 0);*/ ++ ++ return 0; ++} ++ ++static int coldfire_spi_resume(struct platform_device *pdev) ++{ ++ struct driver_data *drv_data = platform_get_drvdata(pdev); ++ int status = 0; ++ ++ /* Enable the SSP clock */ ++ /*pxa_set_cken(drv_data->master_info->clock_enable, 1);*/ ++ ++ /* Start the queue running */ ++ status = start_queue(drv_data); ++ if (status != 0) { ++ dev_err(&pdev->dev, "problem starting queue (%d)\n", status); ++ return status; ++ } ++ ++ return 0; ++} ++#else ++#define coldfire_spi_suspend NULL ++#define coldfire_spi_resume NULL ++#endif /* CONFIG_PM */ ++ ++static struct platform_driver driver = { ++ .driver = { ++ .name = "spi_coldfire", ++ .bus = &platform_bus_type, ++ .owner = THIS_MODULE, ++ }, ++ .probe = coldfire_spi_probe, ++ .remove = __devexit_p(coldfire_spi_remove), ++ .shutdown = coldfire_spi_shutdown, ++ .suspend = coldfire_spi_suspend, ++ .resume = coldfire_spi_resume, ++}; ++ ++static int __init coldfire_spi_init(void) ++{ ++ platform_driver_register(&driver); ++ ++ return 0; ++} ++module_init(coldfire_spi_init); ++ ++static void __exit coldfire_spi_exit(void) ++{ ++ platform_driver_unregister(&driver); ++} ++module_exit(coldfire_spi_exit); +--- /dev/null ++++ b/drivers/spi/ssi_audio.c +@@ -0,0 +1,906 @@ ++/* ++ * MCF5445x audio driver. ++ * ++ * Yaroslav Vinogradov yaroslav.vinogradov@freescale.com ++ * Copyright Freescale Semiconductor, Inc. 2006 ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ */ ++ ++#include <linux/device.h> ++#include <linux/init.h> ++#include <linux/delay.h> ++#include <linux/spi/spi.h> ++#include <linux/fs.h> ++#include <linux/kernel.h> ++#include <linux/major.h> ++#include <asm/mcfsim.h> ++#include <linux/interrupt.h> ++#include <linux/soundcard.h> ++#include <asm/uaccess.h> ++#include <asm/virtconvert.h> ++ ++#include <asm/coldfire.h> ++#include <asm/coldfire_edma.h> ++#include <asm/mcf5445x_ssi.h> ++#include <asm/mcf5445x_ccm.h> ++#include <asm/mcf5445x_gpio.h> ++ ++#define SOUND_DEVICE_NAME "sound" ++#define DRIVER_NAME "ssi_audio" ++ ++ ++/* #define AUDIO_DEBUG */ ++ ++#ifdef CONFIG_MMU ++#define USE_MMU ++#endif ++ ++#define MAX_SPEED_HZ 12000000 ++ ++#define M5445x_AUDIO_IRQ_SOURCE 49 ++#define M5445x_AUDIO_IRQ_VECTOR (128+M5445x_AUDIO_IRQ_SOURCE) ++#define M5445x_AUDIO_IRQ_LEVEL 5 ++ ++/* TLV320DAC23 audio chip registers */ ++ ++#define CODEC_LEFT_IN_REG (0x00) ++#define CODEC_RIGHT_IN_REG (0x01) ++#define CODEC_LEFT_HP_VOL_REG (0x02) ++#define CODEC_RIGHT_HP_VOL_REG (0x03) ++#define CODEC_ANALOG_APATH_REG (0x04) ++#define CODEC_DIGITAL_APATH_REG (0x05) ++#define CODEC_POWER_DOWN_REG (0x06) ++#define CODEC_DIGITAL_IF_FMT_REG (0x07) ++#define CODEC_SAMPLE_RATE_REG (0x08) ++#define CODEC_DIGITAL_IF_ACT_REG (0x09) ++#define CODEC_RESET_REG (0x0f) ++ ++#define CODEC_SAMPLE_8KHZ (0x0C) ++#define CODEC_SAMPLE_16KHZ (0x58) ++#define CODEC_SAMPLE_22KHZ (0x62) ++#define CODEC_SAMPLE_32KHZ (0x18) ++#define CODEC_SAMPLE_44KHZ (0x22) ++#define CODEC_SAMPLE_48KHZ (0x00) ++ ++/* Audio buffer data size */ ++#define BUFSIZE (64*1024) ++/* DMA transfer size */ ++#define DMASIZE (16*1024) ++ ++/* transmit eDMA channel for SSI channel 0 */ ++#define DMA_TCD 10 ++/* transmit eDMA channel for SSI channel 1 */ ++#define DMA_TCD2 11 ++ ++struct ssi_audio { ++ struct spi_device *spi; ++ u32 speed; ++ u32 stereo; ++ u32 bits; ++ u32 format; ++ u8 isopen; ++ u8 dmaing; ++ u8 ssi_enabled; ++ u8 channel; ++ spinlock_t lock; ++ u8* audio_buf; ++}; ++ ++static struct ssi_audio* audio_device = NULL; ++volatile u32 audio_start; ++volatile u32 audio_count; ++volatile u32 audio_append; ++volatile u32 audio_appstart; ++volatile u32 audio_txbusy; ++ ++struct ssi_audio_format { ++ unsigned int format; ++ unsigned int bits; ++} ssi_audio_formattable[] = { ++ { AFMT_MU_LAW, 8 }, ++ { AFMT_A_LAW, 8 }, ++ { AFMT_IMA_ADPCM, 8 }, ++ { AFMT_U8, 8 }, ++ { AFMT_S16_LE, 16 }, ++ { AFMT_S16_BE, 16 }, ++ { AFMT_S8, 8 }, ++ { AFMT_U16_LE, 16 }, ++ { AFMT_U16_BE, 16 }, ++}; ++ ++#define FORMATSIZE (sizeof(ssi_audio_formattable) / sizeof(struct ssi_audio_format)) ++ ++static void ssi_audio_setsamplesize(int val) ++{ ++ int i; ++ ++ if (audio_device == NULL) return; ++ ++ for (i = 0; (i < FORMATSIZE); i++) { ++ if (ssi_audio_formattable[i].format == val) { ++ audio_device->format = ssi_audio_formattable[i].format; ++ audio_device->bits = ssi_audio_formattable[i].bits; ++ break; ++ } ++ } ++ ++#ifdef AUDIO_DEBUG ++ printk(DRIVER_NAME ":ssi_audio_setsamplesize %d %d\n", audio_device->format, audio_device->bits); ++#endif ++} ++ ++static void ssi_audio_txdrain(void) ++{ ++#ifdef AUDIO_DEBUG ++ printk(DRIVER_NAME ":ssi_audio_txdrain()\n"); ++#endif ++ ++ if (audio_device == NULL) return; ++ ++ while (!signal_pending(current)) { ++ if (audio_txbusy == 0) ++ break; ++ current->state = TASK_INTERRUPTIBLE; ++ schedule_timeout(1); ++ } ++} ++ ++#ifdef CONFIG_SSIAUDIO_USE_EDMA ++/* ++ * Configure and start DMA engine. ++ */ ++void __inline__ ssi_audio_dmarun(void) ++{ ++ set_edma_params(DMA_TCD, ++#ifdef USE_MMU ++ virt_to_phys(&(audio_device->audio_buf[audio_start])), ++#else ++ (u32)&(audio_device->audio_buf[audio_start]), ++#endif ++ (u32)&MCF_SSI_TX0, ++ MCF_EDMA_TCD_ATTR_SSIZE_32BIT | MCF_EDMA_TCD_ATTR_DSIZE_32BIT, ++ 8, ++ 4, ++ 0, ++ audio_count/8, ++ audio_count/8, ++ 0, ++ 0, ++ 0, // major_int ++ 0 // disable_req ++ ); ++ ++ set_edma_params(DMA_TCD2, ++#ifdef USE_MMU ++ virt_to_phys(&(audio_device->audio_buf[audio_start+4])), ++#else ++ (u32)&(audio_device->audio_buf[audio_start+4]), ++#endif ++ (u32)&MCF_SSI_TX1, ++ MCF_EDMA_TCD_ATTR_SSIZE_32BIT | MCF_EDMA_TCD_ATTR_DSIZE_32BIT, ++ 8, ++ 4, ++ 0, ++ audio_count/8, ++ audio_count/8, ++ 0, ++ 0, ++ 1, // major_int ++ 0 // disable_req ++ ); ++ ++ audio_device->dmaing = 1; ++ audio_txbusy = 1; ++ ++ start_edma_transfer(DMA_TCD); ++ start_edma_transfer(DMA_TCD2); ++#if 0 ++ MCF_EDMA_ERQ |= (1<<DMA_TCD) | (1<<DMA_TCD2); ++ MCF_EDMA_SSRT = DMA_TCD; ++ MCF_EDMA_SSRT = DMA_TCD2; ++#endif ++ ++} ++ ++/* ++ * Start DMA'ing a new buffer of data if any available. ++ */ ++static void ssi_audio_dmabuf(void) ++{ ++#ifdef AUDIO_DEBUG ++ printk(DRIVER_NAME ":ssi_audio_dmabuf(): append=%x start=%x\n", audio_append, audio_appstart); ++#endif ++ ++ /* If already running then nothing to do... */ ++ if (audio_device->dmaing) ++ return; ++ ++ /* Set DMA buffer size */ ++ audio_count = (audio_append >= audio_appstart) ? ++ (audio_append - audio_appstart) : ++ (BUFSIZE - audio_appstart); ++ if (audio_count > DMASIZE) ++ audio_count = DMASIZE; ++ ++ /* Adjust pointers and counters accordingly */ ++ audio_appstart += audio_count; ++ if (audio_appstart >= BUFSIZE) ++ audio_appstart = 0; ++ ++ if (audio_count > 0) ++ ssi_audio_dmarun(); ++ else { ++ audio_txbusy = 0; ++#ifdef AUDIO_DEBUG ++ printk(DRIVER_NAME ":DMA buffer is empty!\n"); ++#endif ++ } ++} ++ ++void __inline__ stop_dma(void) { ++ stop_edma_transfer(DMA_TCD); ++ stop_edma_transfer(DMA_TCD2); ++} ++ ++static int ssi_audio_dma_handler_empty(int channel, void *dev_id) ++{ ++ return IRQ_HANDLED; ++} ++ ++static int ssi_audio_dma_handler(int channel, void *dev_id) ++{ ++#ifdef AUDIO_DEBUG ++ printk(DRIVER_NAME ":ssi_audio_dma_handler(channel=%d)\n", channel); ++#endif ++ ++ /* Clear DMA interrupt */ ++ stop_dma(); ++ ++ audio_device->dmaing = 0; ++ ++ /* Update data pointers and counts */ ++ audio_start += audio_count; ++ if (audio_start >= BUFSIZE) ++ audio_start = 0; ++ audio_count = 0; ++ ++ /* Start new DMA buffer if we can */ ++ ssi_audio_dmabuf(); ++ ++ return IRQ_HANDLED; ++} ++ ++static void init_dma(void) ++{ ++ /* SSI DMA Signals mapped to DMA request */ ++ MCF_CCM_MISCCR &= ~MCF_CCM_MISCCR_TIMDMA; ++ init_edma(); ++} ++ ++#endif /* CONFIG_SSIAUDIO_USE_EDMA */ ++ ++ ++/* Write CODEC register using SPI ++ * address - CODEC register address ++ * data - data to be written into register ++ */ ++static int codec_write(u8 addr, u16 data) ++{ ++ u16 spi_word; ++ ++ if (audio_device==NULL || audio_device->spi==NULL) ++ return -ENODEV; ++ ++ spi_word = ((addr & 0x7F)<<9)|(data & 0x1FF); ++ return spi_write(audio_device->spi, (const u8*)&spi_word, sizeof(spi_word)); ++} ++ ++static inline void enable_ssi(void) ++{ ++ if (audio_device==NULL || audio_device->ssi_enabled) return; ++ audio_device->ssi_enabled = 1; ++ MCF_SSI_CR |= MCF_SSI_CR_SSI_EN; /* enable SSI module */ ++ MCF_SSI_CR |= MCF_SSI_CR_TE; /* enable tranmitter */ ++} ++ ++static inline void disable_ssi(void) ++{ ++ if (audio_device==NULL || audio_device->ssi_enabled==0) return; ++ MCF_SSI_CR &= ~MCF_SSI_CR_TE; /* disable transmitter */ ++ MCF_SSI_CR &= ~MCF_SSI_CR_SSI_EN; /* disable SSI module */ ++ audio_device->ssi_enabled = 0; ++} ++ ++/* Audio CODEC initialization */ ++/* TODO: also the SSI frequency/dividers must be adjusted */ ++static void adjust_codec_speed(void) { ++#ifdef AUDIO_DEBUG ++ printk(DRIVER_NAME ":adjust_codec_speed: %d\n", audio_device->speed); ++#endif ++ ++ if (audio_device->speed == 8000) { ++ codec_write(CODEC_SAMPLE_RATE_REG,CODEC_SAMPLE_8KHZ); ++ } else if (audio_device->speed == 16000) { ++ codec_write(CODEC_SAMPLE_RATE_REG,CODEC_SAMPLE_16KHZ); ++ } else if (audio_device->speed == 22000) { ++ codec_write(CODEC_SAMPLE_RATE_REG,CODEC_SAMPLE_22KHZ); ++ } else if (audio_device->speed == 44000 || audio_device->speed == 44100) { ++ codec_write(CODEC_SAMPLE_RATE_REG,CODEC_SAMPLE_44KHZ); ++ } else if (audio_device->speed == 48000) { ++ codec_write(CODEC_SAMPLE_RATE_REG,CODEC_SAMPLE_48KHZ); ++ } else { ++ /* default 44KHz */ ++ codec_write(CODEC_SAMPLE_RATE_REG,CODEC_SAMPLE_44KHZ); ++ } ++} ++ ++static void codec_reset(void) ++{ ++ codec_write(CODEC_RESET_REG, 0); /* reset the audio chip */ ++ udelay(1500); /* wait for reset */ ++} ++ ++static void init_audio_codec(void) ++{ ++#ifdef AUDIO_DEBUG ++ printk(DRIVER_NAME ":init_audio_codec()\n"); ++#endif ++ codec_reset(); ++ ++ codec_write(CODEC_LEFT_IN_REG, 0x017); ++ codec_write(CODEC_RIGHT_IN_REG, 0x017); ++ codec_write(CODEC_POWER_DOWN_REG, 0x000); /* Turn off line input */ ++ codec_write(CODEC_DIGITAL_IF_FMT_REG, 0x00A); /* I2S slave mode */ ++ /* codec_write(CODEC_DIGITAL_IF_FMT_REG, 0x042); // I2S master mode */ ++ codec_write(CODEC_DIGITAL_APATH_REG, 0x007); /* Set A path */ ++ ++ /* set sample rate */ ++ adjust_codec_speed(); ++ ++ codec_write(CODEC_LEFT_HP_VOL_REG, 0x075); /* set volume */ ++ codec_write(CODEC_RIGHT_HP_VOL_REG, 0x075); /* set volume */ ++ codec_write(CODEC_DIGITAL_IF_ACT_REG, 1); /* Activate digital interface */ ++ codec_write(CODEC_ANALOG_APATH_REG, 0x0F2); ++} ++ ++ ++static void chip_init(void) ++{ ++#ifdef CONFIG_SSIAUDIO_USE_EDMA ++ init_dma(); ++#endif ++ ++ /* Enable the SSI pins */ ++ MCF_GPIO_PAR_SSI = ( 0 ++ | MCF_GPIO_PAR_SSI_MCLK ++ | MCF_GPIO_PAR_SSI_STXD(3) ++ | MCF_GPIO_PAR_SSI_SRXD(3) ++ | MCF_GPIO_PAR_SSI_FS(3) ++ | MCF_GPIO_PAR_SSI_BCLK(3) ); ++ ++} ++ ++static void init_ssi(void) ++{ ++#ifdef AUDIO_DEBUG ++ printk(DRIVER_NAME ":init_ssi()\n"); ++#endif ++ ++ /* Dividers are for MCF54445 on 266Mhz, the output is 44.1Khz*/ ++ /* Enable SSI clock in CCM */ ++ MCF_CCM_CDR = MCF_CCM_CDR_SSIDIV(47); ++ ++ /* Issue a SSI reset */ ++ MCF_SSI_CR &= ~MCF_SSI_CR_SSI_EN; /* disable SSI module */ ++ ++ /* SSI module uses internal CPU clock */ ++ MCF_CCM_MISCCR |= MCF_CCM_MISCCR_SSISRC; ++ ++ MCF_CCM_MISCCR |= MCF_CCM_MISCCR_SSIPUE; ++ MCF_CCM_MISCCR |= MCF_CCM_MISCCR_SSIPUS_UP; ++ ++ MCF_SSI_CR = 0 ++ | MCF_SSI_CR_CIS ++ | MCF_SSI_CR_TCH /* Enable two channel mode */ ++ | MCF_SSI_CR_MCE /* Set clock out on SSI_MCLK pin */ ++ | MCF_SSI_CR_I2S_MASTER /* Set I2S master mode */ ++ | MCF_SSI_CR_SYN /* Enable synchronous mode */ ++ | MCF_SSI_CR_NET ++ ; ++ ++ MCF_SSI_TCR = 0 ++ | MCF_SSI_TCR_TXDIR /* internally generated bit clock */ ++ | MCF_SSI_TCR_TFDIR /* internally generated frame sync */ ++ | MCF_SSI_TCR_TSCKP /* Clock data on falling edge of bit clock */ ++ | MCF_SSI_TCR_TFSI /* Frame sync active low */ ++ | MCF_SSI_TCR_TEFS /* TX frame sync 1 bit before data */ ++ | MCF_SSI_TCR_TFEN0 /* TX FIFO 0 enabled */ ++ | MCF_SSI_TCR_TFEN1 /* TX FIFO 1 enabled */ ++ | MCF_SSI_TCR_TXBIT0 ++ ; ++ ++ MCF_SSI_CCR = MCF_SSI_CCR_WL(7) /* 16 bit word length */ ++ | MCF_SSI_CCR_DC(1) /* Frame rate divider */ ++ | MCF_SSI_CCR_PM(0) ++ | MCF_SSI_CCR_DIV2 ++ ; ++ ++ MCF_SSI_FCSR = 0 ++ | MCF_SSI_FCSR_TFWM0(0) ++ | MCF_SSI_FCSR_TFWM1(0) ++ ; ++ ++ MCF_SSI_IER = 0 // interrupts ++#ifndef CONFIG_SSIAUDIO_USE_EDMA ++ | MCF_SSI_IER_TIE /* transmit interrupts */ ++ | MCF_SSI_IER_TFE0 /* transmit FIFO 0 empty */ ++ | MCF_SSI_IER_TFE1 /* transmit FIFO 1 empty */ ++#else ++ | MCF_SSI_IER_TDMAE /* DMA request enabled */ ++ | MCF_SSI_IER_TFE0 /* transmit FIFO 0 empty */ ++ | MCF_SSI_IER_TFE1 /* transmit FIFO 1 empty */ ++#endif ++ ; ++ ++#ifndef CONFIG_SSIAUDIO_USE_EDMA ++ /* enable IRQ: SSI interrupt */ ++ MCF_INTC1_ICR(M5445x_AUDIO_IRQ_SOURCE) = M5445x_AUDIO_IRQ_LEVEL; ++ MCF_INTC1_CIMR = M5445x_AUDIO_IRQ_SOURCE; ++#endif ++} ++ ++#ifndef CONFIG_SSIAUDIO_USE_EDMA ++/* interrupt for SSI */ ++static int ssi_audio_isr(int irq, void *dev_id) ++{ ++ unsigned long *bp; ++ ++ if (audio_txbusy==0) { ++ return IRQ_HANDLED; ++ } ++ ++ spin_lock(&(audio_device->lock)); ++ ++ if (audio_start == audio_append) { ++ disable_ssi(); ++ audio_txbusy = 0; ++ } else { ++ if (MCF_SSI_ISR & (MCF_SSI_ISR_TFE0|MCF_SSI_ISR_TFE1)) { ++ bp = (unsigned long *) &audio_device->audio_buf[audio_start]; ++ if (audio_device->channel) { ++ MCF_SSI_TX1 = *bp; ++ audio_device->channel = 0; ++ } else { ++ MCF_SSI_TX0 = *bp; ++ audio_device->channel = 1; ++ } ++ audio_start += 4; ++ if (audio_start >= BUFSIZE) ++ audio_start = 0; ++ } ++ } ++ ++ spin_unlock(&(audio_device->lock)); ++ ++ return IRQ_HANDLED; ++} ++#endif ++ ++/* Set initial driver playback defaults. */ ++static void init_driver_variables(void) ++{ ++ audio_device->speed = 44100; ++ audio_device->format = AFMT_S16_LE; ++ audio_device->bits = 16; ++ audio_device->stereo = 1; ++ audio_device->ssi_enabled = 0; ++ ++ audio_start = 0; ++ audio_count = 0; ++ audio_append = 0; ++ audio_appstart = 0; ++ audio_txbusy = 0; ++ audio_device->dmaing = 0; ++} ++ ++/* open audio device */ ++static int ssi_audio_open(struct inode *inode, struct file *filp) ++{ ++#ifdef AUDIO_DEBUG ++ printk(DRIVER_NAME ":ssi_audio_open()\n"); ++#endif ++ ++ if (audio_device==NULL) return (-ENODEV); ++ ++ if (audio_device->isopen) ++ return(-EBUSY); ++ ++ spin_lock(&(audio_device->lock)); ++ ++ audio_device->isopen = 1; ++ ++ init_driver_variables(); ++ init_ssi(); ++ init_audio_codec(); ++ ++ spin_unlock(&(audio_device->lock)); ++ ++ udelay(100); ++ ++ return 0; ++} ++ ++/* close audio device */ ++static int ssi_audio_close(struct inode *inode, struct file *filp) ++{ ++#ifdef AUDIO_DEBUG ++ printk(DRIVER_NAME ":ssi_audio_close()\n"); ++#endif ++ ++ if (audio_device==NULL) return (-ENODEV); ++ ++ ssi_audio_txdrain(); ++ ++ spin_lock(&(audio_device->lock)); ++ ++#ifdef CONFIG_SSIAUDIO_USE_EDMA ++ stop_dma(); ++#endif ++ disable_ssi(); ++ codec_reset(); ++ init_driver_variables(); ++ audio_device->isopen = 0; ++ ++ spin_unlock(&(audio_device->lock)); ++ return 0; ++} ++ ++/* write to audio device */ ++static ssize_t ssi_audio_write(struct file *filp, const char *buf, size_t count, loff_t *ppos) ++{ ++ unsigned long *dp, *buflp; ++ unsigned short *bufwp; ++ unsigned char *bufbp; ++ unsigned int slen, bufcnt, i, s, e; ++ ++#ifdef AUDIO_DEBUG ++ printk(DRIVER_NAME ":ssi_audio_write(buf=%x,count=%d)\n", (int) buf, count); ++#endif ++ ++ if (audio_device==NULL) return (-ENODEV); ++ ++ if (count <= 0) ++ return 0; ++ ++ spin_lock(&(audio_device->lock)); ++ ++ buflp = (unsigned long *) buf; ++ bufwp = (unsigned short *) buf; ++ bufbp = (unsigned char *) buf; ++ ++ bufcnt = count & ~0x3; ++ ++ bufcnt <<= 1; ++ if (audio_device->stereo == 0) ++ bufcnt <<= 1; ++ if (audio_device->bits == 8) ++ bufcnt <<= 1; ++ ++tryagain: ++ /* ++ * Get a snapshot of buffer, so we can figure out how ++ * much data we can fit in... ++ */ ++ s = audio_start; ++ e = audio_append; ++ dp = (unsigned long *) &(audio_device->audio_buf[e]); ++ ++ slen = ((s > e) ? (s - e) : (BUFSIZE - (e - s))) - 4; ++ if (slen > bufcnt) ++ slen = bufcnt; ++ if ((BUFSIZE - e) < slen) ++ slen = BUFSIZE - e; ++ ++ if (slen == 0) { ++ if (signal_pending(current)) ++ return(-ERESTARTSYS); ++ set_current_state(TASK_INTERRUPTIBLE); ++ schedule_timeout(1); ++ goto tryagain; ++ } ++ ++ /* For DMA we need to have data as 32 bit ++ values (since SSI TX register is 32 bit). ++ So, the incomming 16 bit data must be put to buffer as 32 bit values. ++ Also, the endianess is converted if needed ++ */ ++ if (audio_device->stereo) { ++ if (audio_device->bits == 16) { ++ if (audio_device->format==AFMT_S16_LE) { ++ /*- convert endianess, probably could be done by SSI also */ ++ for (i = 0; (i < slen); i += 4) { ++ unsigned short val = le16_to_cpu((*bufwp++)); ++ *dp++ = val; ++ } ++ } else { ++ for (i = 0; (i < slen); i += 4) { ++ *dp++ = *bufwp++; ++ } ++ } ++ } else { ++ for (i = 0; (i < slen); i += 4) { ++ *dp = (((unsigned long) *bufbp++) << 24); ++ *dp++ |= (((unsigned long) *bufbp++) << 8); ++ } ++ } ++ } else { ++ if (audio_device->bits == 16) { ++ for (i = 0; (i < slen); i += 4) { ++ *dp++ = (((unsigned long)*bufwp)<<16) | *bufwp; ++ bufwp++; ++ } ++ } else { ++ for (i = 0; (i < slen); i += 4) { ++ *dp++ = (((unsigned long) *bufbp) << 24) | ++ (((unsigned long) *bufbp) << 8); ++ bufbp++; ++ } ++ } ++ } ++ ++ e += slen; ++ if (e >= BUFSIZE) ++ e = 0; ++ audio_append = e; ++ ++ /* If not outputing audio, then start now */ ++ if (audio_txbusy == 0) { ++ audio_txbusy++; ++ audio_device->channel = 0; ++ enable_ssi(); ++#ifdef CONFIG_SSIAUDIO_USE_EDMA ++ ssi_audio_dmabuf(); /* start first DMA transfer */ ++#endif ++ } ++ ++ bufcnt -= slen; ++ ++ if (bufcnt > 0) ++ goto tryagain; ++ ++ spin_unlock(&(audio_device->lock)); ++ ++ return count; ++} ++ ++/* ioctl: control the driver */ ++static int ssi_audio_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg) ++{ ++ long val; ++ int rc = 0; ++ ++#ifdef AUDIO_DEBUG ++ printk(DRIVER_NAME ":ssi_audio_ioctl(cmd=%x,arg=%x)\n", (int) cmd, (int) arg); ++#endif ++ ++ if (audio_device==NULL) return (-ENODEV); ++ ++ switch (cmd) { ++ ++ case SNDCTL_DSP_SPEED: ++ if (access_ok(VERIFY_READ, (void *) arg, sizeof(val))) { ++ get_user(val, (unsigned long *) arg); ++#ifdef AUDIO_DEBUG ++ printk(DRIVER_NAME ":ssi_audio_ioctl: SNDCTL_DSP_SPEED: %ld\n", val); ++#endif ++ ssi_audio_txdrain(); ++ audio_device->speed = val; ++ init_audio_codec(); ++ } else { ++ rc = -EINVAL; ++ } ++ break; ++ ++ case SNDCTL_DSP_SAMPLESIZE: ++ if (access_ok(VERIFY_READ, (void *) arg, sizeof(val))) { ++ get_user(val, (unsigned long *) arg); ++ ssi_audio_txdrain(); ++ ssi_audio_setsamplesize(val); ++ } else { ++ rc = -EINVAL; ++ } ++ break; ++ ++ case SNDCTL_DSP_STEREO: ++ if (access_ok(VERIFY_READ, (void *) arg, sizeof(val))) { ++ get_user(val, (unsigned long *) arg); ++ ssi_audio_txdrain(); ++ audio_device->stereo = val; ++ } else { ++ rc = -EINVAL; ++ } ++ break; ++ ++ case SNDCTL_DSP_GETBLKSIZE: ++ if (access_ok(VERIFY_WRITE, (void *) arg, sizeof(long))) ++ put_user(BUFSIZE, (long *) arg); ++ else ++ rc = -EINVAL; ++ break; ++ ++ case SNDCTL_DSP_SYNC: ++ ssi_audio_txdrain(); ++ break; ++ ++ default: ++ rc = -EINVAL; ++ break; ++ } ++ ++ return rc; ++} ++ ++/****************************************************************************/ ++ ++struct file_operations ssi_audio_fops = { ++ open: ssi_audio_open, /* open */ ++ release: ssi_audio_close, /* close */ ++ write: ssi_audio_write, /* write */ ++ ioctl: ssi_audio_ioctl, /* ioctl */ ++}; ++ ++/* initialize audio driver */ ++static int __devinit ssi_audio_probe(struct spi_device *spi) ++{ ++ struct ssi_audio *audio; ++ int err; ++ ++#ifdef AUDIO_DEBUG ++ printk(DRIVER_NAME": probe\n"); ++#endif ++ ++ if (!spi->irq) { ++ dev_dbg(&spi->dev, "no IRQ?\n"); ++ return -ENODEV; ++ } ++ ++ /* don't exceed max specified sample rate */ ++ if (spi->max_speed_hz > MAX_SPEED_HZ) { ++ dev_dbg(&spi->dev, "f(sample) %d KHz?\n", ++ (spi->max_speed_hz)/1000); ++ return -EINVAL; ++ } ++ ++ /* register charcter device */ ++ if (register_chrdev(SOUND_MAJOR, SOUND_DEVICE_NAME, &ssi_audio_fops) < 0) { ++ printk(KERN_WARNING DRIVER_NAME ": failed to register major %d\n", SOUND_MAJOR); ++ dev_dbg(&spi->dev, DRIVER_NAME ": failed to register major %d\n", SOUND_MAJOR); ++ return -ENODEV; ++ } ++ ++ audio = kzalloc(sizeof(struct ssi_audio), GFP_KERNEL); ++ if (!audio) { ++ err = -ENOMEM; ++ goto err_out; ++ } ++ ++ /* DMA buffer must be from GFP_DMA zone, so it will not be cached */ ++ audio->audio_buf = kmalloc(BUFSIZE, GFP_DMA); ++ if (audio->audio_buf == NULL) { ++ dev_dbg(&spi->dev, DRIVER_NAME ": failed to allocate DMA[%d] buffer\n", BUFSIZE); ++ err = -ENOMEM; ++ goto err_free_mem; ++ } ++ ++ audio_device = audio; ++ ++ dev_set_drvdata(&spi->dev, audio); ++ spi->dev.power.power_state = PMSG_ON; ++ ++ audio->spi = spi; ++ ++#ifndef CONFIG_SSIAUDIO_USE_EDMA ++ if (request_irq(spi->irq, ssi_audio_isr, SA_INTERRUPT, spi->dev.bus_id, audio)) { ++ dev_dbg(&spi->dev, "irq %d busy?\n", spi->irq); ++ err = -EBUSY; ++ goto err_free_mem; ++ } ++ ++#else ++ /* request 2 eDMA channels since two channel output mode is used */ ++ if (request_edma_channel(DMA_TCD, ++ ssi_audio_dma_handler_empty, ++ NULL, ++ audio, ++ &(audio_device->lock), ++ DRIVER_NAME ++ )!=0) ++ { ++ dev_dbg(&spi->dev, "DMA channel %d busy?\n", DMA_TCD); ++ err = -EBUSY; ++ goto err_free_mem; ++ } ++ if (request_edma_channel(DMA_TCD2, ++ ssi_audio_dma_handler, ++ NULL, ++ audio, ++ &(audio_device->lock), ++ DRIVER_NAME ++ )!=0) ++ { ++ dev_dbg(&spi->dev, "DMA channel %d busy?\n", DMA_TCD2); ++ err = -EBUSY; ++ goto err_free_mem; ++ } ++ ++#endif ++ chip_init(); ++ printk(DRIVER_NAME ": Probed successfully\n"); ++ ++ return 0; ++ ++ err_free_mem: ++ kfree(audio); ++ audio_device = NULL; ++ err_out: ++ unregister_chrdev(SOUND_MAJOR, SOUND_DEVICE_NAME); ++ return err; ++} ++ ++static int __devexit ssi_audio_remove(struct spi_device *spi) ++{ ++ struct ssi_audio *audio = dev_get_drvdata(&spi->dev); ++ ++ ssi_audio_txdrain(); ++#ifndef CONFIG_SSIAUDIO_USE_EDMA ++ free_irq(spi->irq, audio); ++#else ++ free_edma_channel(DMA_TCD, audio); ++ free_edma_channel(DMA_TCD2, audio); ++#endif ++ kfree(audio->audio_buf); ++ kfree(audio); ++ audio_device = NULL; ++ unregister_chrdev(SOUND_MAJOR, SOUND_DEVICE_NAME); ++ dev_dbg(&spi->dev, "unregistered audio\n"); ++ return 0; ++} ++ ++static int ssi_audio_suspend(struct spi_device *spi, pm_message_t message) { ++ return 0; ++} ++ ++static int ssi_audio_resume(struct spi_device *spi) { ++ return 0; ++} ++ ++static struct spi_driver ssi_audio_driver = { ++ .driver = { ++ .name = DRIVER_NAME, ++ .bus = &spi_bus_type, ++ .owner = THIS_MODULE, ++ }, ++ .probe = ssi_audio_probe, ++ .remove = __devexit_p(ssi_audio_remove), ++ .suspend = ssi_audio_suspend, ++ .resume = ssi_audio_resume, ++}; ++ ++static int __init ssi_audio_init(void) ++{ ++ return spi_register_driver(&ssi_audio_driver); ++} ++module_init(ssi_audio_init); ++ ++static void __exit ssi_audio_exit(void) ++{ ++ spi_unregister_driver(&ssi_audio_driver); ++} ++module_exit(ssi_audio_exit); ++ ++MODULE_DESCRIPTION("SSI/I2S Audio Driver"); ++MODULE_LICENSE("GPL"); +--- a/include/asm-m68k/coldfire_edma.h ++++ b/include/asm-m68k/coldfire_edma.h +@@ -1,39 +1,102 @@ ++/* ++ * coldfire_edma.h - eDMA driver for Coldfire MCF5445x ++ * ++ * Yaroslav Vinogradov yaroslav.vinogradov@freescale.com ++ * ++ * Copyright Freescale Semiconductor, Inc. 2007 ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ */ ++ + #ifndef _LINUX_COLDFIRE_DMA_H + #define _LINUX_COLDFIRE_DMA_H + + #include <linux/interrupt.h> ++#include <asm/mcf5445x_edma.h> + +-#define EDMA_DRIVER_NAME "ColdFire-eDMA" +-#define DMA_DEV_MINOR 1 ++#define EDMA_DRIVER_NAME "ColdFire-eDMA" ++#define DMA_DEV_MINOR 1 + + #define EDMA_INT_CHANNEL_BASE 8 + #define EDMA_INT_CONTROLLER_BASE 64 + #define EDMA_CHANNELS 16 +- ++ + #define EDMA_IRQ_LEVEL 5 +- ++ + typedef irqreturn_t (*edma_irq_handler)(int, void *); + typedef void (*edma_error_handler)(int, void *); +- ++ ++/* Setup transfer control descriptor (TCD) ++ * channel - descriptor number ++ * source - source address ++ * dest - destination address ++ * attr - attributes ++ * soff - source offset ++ * nbytes - number of bytes to be transfered in minor loop ++ * slast - last source address adjustment ++ * citer - major loop count ++ * biter - beggining minor loop count ++ * doff - destination offset ++ * dlast_sga - last destination address adjustment ++ * major_int - generate interrupt after each major loop ++ * disable_req - disable DMA request after major loop ++ */ + void set_edma_params(int channel, u32 source, u32 dest, +- u32 attr, u32 soff, u32 nbytes, u32 slast, +- u32 citer, u32 biter, u32 doff, u32 dlast_sga); +- +-void start_edma_transfer(int channel, int major_int); +- +-void stop_edma_transfer(int channel); +- +-void confirm_edma_interrupt_handled(int channel); +- ++ u32 attr, u32 soff, u32 nbytes, u32 slast, ++ u32 citer, u32 biter, u32 doff, u32 dlast_sga, ++ int major_int, int disable_req); ++ ++/* Starts eDMA transfer on specified channel ++ * channel - eDMA TCD number ++ */ ++static inline void start_edma_transfer(int channel) ++{ ++ MCF_EDMA_SERQ = channel; ++ MCF_EDMA_SSRT = channel; ++} ++ ++/* Stops eDMA transfer ++ * channel - eDMA TCD number ++ */ ++static inline void stop_edma_transfer(int channel) ++{ ++ MCF_EDMA_CINT = channel; ++ MCF_EDMA_CERQ = channel; ++} ++ ++ ++/* Confirm that interrupt has been handled ++ * channel - eDMA TCD number ++ */ ++static inline void confirm_edma_interrupt_handled(int channel) ++{ ++ MCF_EDMA_CINT = channel; ++} ++ ++/* Initialize eDMA controller */ + void init_edma(void); +- +-int request_edma_channel(int channel, +- edma_irq_handler handler, +- edma_error_handler error_handler, +- void *dev, +- spinlock_t *lock, +- const char *device_id); +- ++ ++/* Request eDMA channel: ++ * channel - eDMA TCD number ++ * handler - channel IRQ callback ++ * error_handler - error interrupt handler callback for channel ++ * dev - device ++ * lock - spinlock to be locked (can be NULL) ++ * device_id - device driver name for proc file system output ++ */ ++int request_edma_channel(int channel, ++ edma_irq_handler handler, ++ edma_error_handler error_handler, ++ void *dev, ++ spinlock_t *lock, ++ const char *device_id); ++ ++/* Free eDMA channel ++ * channel - eDMA TCD number ++ * dev - device ++ */ + int free_edma_channel(int channel, void *dev); +- + #endif +--- /dev/null ++++ b/include/linux/spi/mcfqspi.h +@@ -0,0 +1,80 @@ ++/****************************************************************************/ ++ ++/* ++ * mcfqspi.c - Master QSPI controller for the ColdFire processors ++ * ++ * (C) Copyright 2005, Intec Automation, ++ * Mike Lavender (mike@steroidmicros) ++ * ++ ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 2 of the License, or ++ (at your option) any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program; if not, write to the Free Software ++ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ ++/* ------------------------------------------------------------------------- */ ++ ++#ifndef MCFQSPI_H_ ++#define MCFQSPI_H_ ++ ++#define QSPI_CS_INIT 0x01 ++#define QSPI_CS_ASSERT 0x02 ++#define QSPI_CS_DROP 0x04 ++ ++#define QSPIIOCS_DOUT_HIZ 1 /* QMR[DOHIE] set hi-z dout between transfers */ ++#define QSPIIOCS_BITS 2 /* QMR[BITS] set transfer size */ ++#define QSPIIOCG_BITS 3 /* QMR[BITS] get transfer size */ ++#define QSPIIOCS_CPOL 4 /* QMR[CPOL] set SCK inactive state */ ++#define QSPIIOCS_CPHA 5 /* QMR[CPHA] set SCK phase, 1=rising edge */ ++#define QSPIIOCS_BAUD 6 /* QMR[BAUD] set SCK baud rate divider */ ++#define QSPIIOCS_QCD 7 /* QDLYR[QCD] set start delay */ ++#define QSPIIOCS_DTL 8 /* QDLYR[DTL] set after delay */ ++#define QSPIIOCS_CONT 9 /* continuous CS asserted during transfer */ ++#define QSPIIOCS_READDATA 10 /* set data send during read */ ++#define QSPIIOCS_ODD_MOD 11 /* if length of buffer is a odd number, 16-bit transfers */ ++ /* are finalized with a 8-bit transfer */ ++#define QSPIIOCS_DSP_MOD 12 /* transfers are bounded to 15/30 bytes (a multiple of 3 bytes = 1 DSPword) */ ++#define QSPIIOCS_POLL_MOD 13 /* driver uses polling instead of interrupts */ ++ ++#define QSPIIOCS_SET_CSIV 14 /* sets CSIV flag (cs inactive level) */ ++ ++#ifdef CONFIG_M520x ++#undef MCF_GPIO_PAR_QSPI ++#define MCF_GPIO_PAR_QSPI (0xA4034) ++#endif ++ ++struct coldfire_spi_master { ++ u16 bus_num; ++ u16 num_chipselect; ++ u8 irq_source; ++ u32 irq_vector; ++ u32 irq_mask; ++ u8 irq_lp; ++ u8 par_val; ++ u16 par_val16; ++ void (*cs_control)(u8 cs, u8 command); ++}; ++ ++ ++struct coldfire_spi_chip { ++ u8 mode; ++ u8 bits_per_word; ++ u8 del_cs_to_clk; ++ u8 del_after_trans; ++ u16 void_write_data; ++}; ++ ++typedef struct qspi_read_data { ++ __u32 length; ++ __u8 *buf; /* data to send during read */ ++ unsigned int loop : 1; ++} qspi_read_data; ++#endif /*MCFQSPI_H_*/ diff --git a/target/linux/coldfire/patches/020-mcfv4e_inline_memory_params.patch b/target/linux/coldfire/patches/020-mcfv4e_inline_memory_params.patch new file mode 100644 index 0000000000..bd1769d080 --- /dev/null +++ b/target/linux/coldfire/patches/020-mcfv4e_inline_memory_params.patch @@ -0,0 +1,168 @@ +From 3f698a1cf08cc02911cdb2ca3217be77eeba794b Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Tue, 27 Nov 2007 23:17:53 -0700 +Subject: [PATCH] Change inline assembly memory params. + +For various routines change how the assembly memory pointer +is passed in. + +LTIBName: mcfv4e-inline-memory-params +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + include/asm-m68k/bitops.h | 68 ++++++++++++++++++++++++++++++++++++++++++++- + 1 files changed, 67 insertions(+), 1 deletions(-) + +--- a/include/asm-m68k/bitops.h ++++ b/include/asm-m68k/bitops.h +@@ -465,7 +465,7 @@ static inline int ext2_find_next_bit(con + __constant_coldfire_test_and_set_bit(nr, vaddr) : \ + __generic_coldfire_test_and_set_bit(nr, vaddr)) + +- ++#if 0 + static __inline__ int __constant_coldfire_test_and_set_bit(int nr, + volatile void *vaddr) + { +@@ -477,6 +477,17 @@ static __inline__ int __constant_coldfir + : "di" (nr & 7)); + return retval; + } ++#else ++static __inline__ int __constant_coldfire_test_and_set_bit(int nr,volatile void * vaddr) ++{ ++ char retval; ++ volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3]; ++ __asm__ __volatile__ ("bset %2,(%4); sne %0" ++ : "=d" (retval), "=m" (*p) ++ : "di" (nr & 7), "m" (*p), "a" (p)); ++ return retval; ++} ++#endif + + static __inline__ int __generic_coldfire_test_and_set_bit(int nr, + volatile void *vaddr) +@@ -496,6 +507,7 @@ static __inline__ int __generic_coldfire + __constant_coldfire_set_bit(nr, vaddr) : \ + __generic_coldfire_set_bit(nr, vaddr)) + ++#if 0 + static __inline__ void __constant_coldfire_set_bit(int nr, + volatile void *vaddr) + { +@@ -503,6 +515,14 @@ static __inline__ void __constant_coldfi + __asm__ __volatile__ ("bset %1,%0" + : "+QUd" (*p) : "di" (nr & 7)); + } ++#else ++static __inline__ void __constant_coldfire_set_bit(int nr, volatile void * vaddr) ++{ ++ volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3]; ++ __asm__ __volatile__ ("bset %1,(%3)" ++ : "=m" (*p) : "di" (nr & 7), "m" (*p), "a" (p)); ++} ++#endif + + static __inline__ void __generic_coldfire_set_bit(int nr, volatile void *vaddr) + { +@@ -518,6 +538,7 @@ static __inline__ void __generic_coldfir + __constant_coldfire_test_and_clear_bit(nr, vaddr) : \ + __generic_coldfire_test_and_clear_bit(nr, vaddr)) + ++#if 0 + static __inline__ int __constant_coldfire_test_and_clear_bit(int nr, + volatile void *vaddr) + { +@@ -530,6 +551,19 @@ static __inline__ int __constant_coldfir + + return retval; + } ++#else ++static __inline__ int __constant_coldfire_test_and_clear_bit(int nr, volatile void *vaddr) ++{ ++ char retval; ++ volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3]; ++ ++ __asm__ __volatile__ ("bclr %2,(%4); sne %0" ++ : "=d" (retval), "=m" (*p) ++ : "id" (nr & 7), "m" (*p), "a" (p)); ++ ++ return retval; ++} ++#endif + + static __inline__ int __generic_coldfire_test_and_clear_bit(int nr, + volatile void *vaddr) +@@ -556,6 +590,7 @@ static __inline__ int __generic_coldfire + __constant_coldfire_clear_bit(nr, vaddr) : \ + __generic_coldfire_clear_bit(nr, vaddr)) + ++#if 0 + static __inline__ void __constant_coldfire_clear_bit(int nr, + volatile void *vaddr) + { +@@ -563,6 +598,14 @@ static __inline__ void __constant_coldfi + __asm__ __volatile__ ("bclr %1,%0" + : "+QUd" (*p) : "id" (nr & 7)); + } ++#else ++static __inline__ void __constant_coldfire_clear_bit(int nr, volatile void * vaddr) ++{ ++ volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3]; ++ __asm__ __volatile__ ("bclr %1,(%3)" ++ : "=m" (*p) : "id" (nr & 7), "m" (*p), "a" (p)); ++} ++#endif + + static __inline__ void __generic_coldfire_clear_bit(int nr, + volatile void *vaddr) +@@ -579,6 +622,7 @@ static __inline__ void __generic_coldfir + __constant_coldfire_test_and_change_bit(nr, vaddr) : \ + __generic_coldfire_test_and_change_bit(nr, vaddr)) + ++#if 0 + static __inline__ int __constant_coldfire_test_and_change_bit(int nr, + volatile void *vaddr) + { +@@ -591,6 +635,19 @@ static __inline__ int __constant_coldfir + + return retval; + } ++#else ++static __inline__ int __constant_coldfire_test_and_change_bit(int nr, volatile void * vaddr) ++{ ++ char retval; ++ volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3]; ++ ++ __asm__ __volatile__ ("bchg %2,(%4); sne %0" ++ : "=d" (retval), "=m" (*p) ++ : "id" (nr & 7), "m" (*p), "a" (p)); ++ ++ return retval; ++} ++#endif + + static __inline__ int __generic_coldfire_test_and_change_bit(int nr, + volatile void *vaddr) +@@ -612,6 +669,7 @@ static __inline__ int __generic_coldfire + __constant_coldfire_change_bit(nr, vaddr) : \ + __generic_coldfire_change_bit(nr, vaddr)) + ++#if 0 + static __inline__ void __constant_coldfire_change_bit(int nr, + volatile void *vaddr) + { +@@ -619,6 +677,14 @@ static __inline__ void __constant_coldfi + __asm__ __volatile__ ("bchg %1,%0" + : "+QUd" (*p) : "id" (nr & 7)); + } ++#else ++static __inline__ void __constant_coldfire_change_bit(int nr, volatile void * vaddr) ++{ ++ volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3]; ++ __asm__ __volatile__ ("bchg %1,(%3)" ++ : "=m" (*p) : "id" (nr & 7), "m" (*p), "a" (p)); ++} ++#endif + + static __inline__ void __generic_coldfire_change_bit(int nr, + volatile void *vaddr) diff --git a/target/linux/coldfire/patches/021-m5445x_usb_premerge.patch b/target/linux/coldfire/patches/021-m5445x_usb_premerge.patch new file mode 100644 index 0000000000..4650aae6e4 --- /dev/null +++ b/target/linux/coldfire/patches/021-m5445x_usb_premerge.patch @@ -0,0 +1,45 @@ +From 3d7f85e904cf9dab191eeab9933ecac1e90d06e4 Mon Sep 17 00:00:00 2001 +From: Bruce Schmid <duck@freescale.com> +Date: Thu, 29 Nov 2007 16:30:47 -0700 +Subject: [PATCH] USB pre-merge + +LTIBName: m5445x-usb-premerge +Signed-off-by: Duck <duck@freescale.com> +--- + drivers/usb/host/ehci-arc.c | 18 +++++++++++++++++- + 1 files changed, 17 insertions(+), 1 deletions(-) + +--- a/drivers/usb/host/ehci-arc.c ++++ b/drivers/usb/host/ehci-arc.c +@@ -373,14 +373,30 @@ static int ehci_fsl_drv_resume(struct pl + pr_debug("%s pdev=0x%p pdata=0x%p ehci=0x%p hcd=0x%p\n", + __FUNCTION__, pdev, pdata, ehci, hcd); + +- pr_debug("%s ehci->regs=0x%p hcd->regs=0x%p", ++ pr_debug("%s ehci->regs=0x%p hcd->regs=0x%p\n", + __FUNCTION__, ehci->regs, hcd->regs); + + memcpy(ehci->regs, (void *)&usb_ehci_regs, sizeof(struct ehci_regs)); ++ ++#if 0 // DDD test + ehci_writel(ehci, usb_ehci_portsc, &ehci->regs->port_status[0]); ++ printk("set portsc %08x %08x\n", usb_ehci_portsc, ++ ehci_readl(ehci, &ehci->regs->port_status[0])); ++ printk("set usbmode %08x\n", ++ ehci_readl(ehci, &ehci->regs + FSL_SOC_USB_USBMODE)); + + tmp = USBMODE_CM_HOST | (pdata->es ? USBMODE_ES : 0); + ehci_writel(ehci, tmp, hcd->regs + FSL_SOC_USB_USBMODE); ++#else ++ tmp = USBMODE_CM_HOST | (pdata->es ? USBMODE_ES : 0); ++ ehci_writel(ehci, tmp, hcd->regs + FSL_SOC_USB_USBMODE); ++ printk("tmp %08x set usbmode %08x\n", tmp, ++ ehci_readl(ehci, hcd->regs + FSL_SOC_USB_USBMODE)); ++ ++ ehci_writel(ehci, usb_ehci_portsc, &ehci->regs->port_status[0]); ++ printk("set portsc %08x %08x\n", usb_ehci_portsc, ++ ehci_readl(ehci, &ehci->regs->port_status[0])); ++#endif + + set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); + hcd->state = HC_STATE_RUNNING; diff --git a/target/linux/coldfire/patches/022-m5445x_ccm_bitdefs.patch b/target/linux/coldfire/patches/022-m5445x_ccm_bitdefs.patch new file mode 100644 index 0000000000..dbaae3a5d3 --- /dev/null +++ b/target/linux/coldfire/patches/022-m5445x_ccm_bitdefs.patch @@ -0,0 +1,54 @@ +From b100a50c3bf7884a97d5008fc79d9b45f3b6e999 Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Fri, 30 Nov 2007 12:55:12 -0700 +Subject: [PATCH] Fix bitfield definitions. + +LTIBName: m5445x-ccm-bitdefs +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + include/asm-m68k/mcf5445x_ccm.h | 34 ++++++++++++++++++---------------- + 1 files changed, 18 insertions(+), 16 deletions(-) + +--- a/include/asm-m68k/mcf5445x_ccm.h ++++ b/include/asm-m68k/mcf5445x_ccm.h +@@ -118,22 +118,24 @@ + #define MCF_CCM_MISCCR_BMT(x) (((x) & 0x0007) << 8) /* Bus monitor timing field */ + #define MCF_CCM_MISCCR_BME (0x0800) /* Bus monitor external enable bit */ + #define MCF_CCM_MISCCR_LIMP (0x1000) /* Limp mode enable */ +-#define MCF_CCM_MISCCR_BMT_65536 (0) +-#define MCF_CCM_MISCCR_BMT_32768 (1) +-#define MCF_CCM_MISCCR_BMT_16384 (2) +-#define MCF_CCM_MISCCR_BMT_8192 (3) +-#define MCF_CCM_MISCCR_BMT_4096 (4) +-#define MCF_CCM_MISCCR_BMT_2048 (5) +-#define MCF_CCM_MISCCR_BMT_1024 (6) +-#define MCF_CCM_MISCCR_BMT_512 (7) +-#define MCF_CCM_MISCCR_SSIPUS_UP (1) +-#define MCF_CCM_MISCCR_SSIPUS_DOWN (0) +-#define MCF_CCM_MISCCR_TIMDMA_TIM (1) +-#define MCF_CCM_MISCCR_TIMDMA_SSI (0) +-#define MCF_CCM_MISCCR_SSISRC_CLKIN (0) +-#define MCF_CCM_MISCCR_SSISRC_PLL (1) +-#define MCF_CCM_MISCCR_USBOC_ACTHI (0) +-#define MCF_CCM_MISCCR_USBOV_ACTLO (1) ++#define MCF_CCM_MISCCR_BMT_65536 (0 << 8) ++#define MCF_CCM_MISCCR_BMT_32768 (1 << 8) ++#define MCF_CCM_MISCCR_BMT_16384 (2 << 8) ++#define MCF_CCM_MISCCR_BMT_8192 (3 << 8) ++#define MCF_CCM_MISCCR_BMT_4096 (4 << 8) ++#define MCF_CCM_MISCCR_BMT_2048 (5 << 8) ++#define MCF_CCM_MISCCR_BMT_1024 (6 << 8) ++#define MCF_CCM_MISCCR_BMT_512 (7 << 8) ++#define MCF_CCM_MISCCR_SSIPUE_UP (1 << 7) ++#define MCF_CCM_MISCCR_SSIPUE_DOWN (0 << 7) ++#define MCF_CCM_MISCCR_SSIPUS_UP (1 << 6) ++#define MCF_CCM_MISCCR_SSIPUS_DOWN (0 << 6) ++#define MCF_CCM_MISCCR_TIMDMA_TIM (1 << 5) ++#define MCF_CCM_MISCCR_TIMDMA_SSI (0 << 5) ++#define MCF_CCM_MISCCR_SSISRC_CLKIN (0 << 4) ++#define MCF_CCM_MISCCR_SSISRC_PLL (1 << 4) ++#define MCF_CCM_MISCCR_USBOC_ACTHI (0 << 1) ++#define MCF_CCM_MISCCR_USBOC_ACTLO (1 << 1) + #define MCF_CCM_MISCCR_USBSRC_CLKIN (0) + #define MCF_CCM_MISCCR_USBSRC_PLL (1) + diff --git a/target/linux/coldfire/patches/023-mcfv4e_cache_base_update.patch b/target/linux/coldfire/patches/023-mcfv4e_cache_base_update.patch new file mode 100644 index 0000000000..9215085a06 --- /dev/null +++ b/target/linux/coldfire/patches/023-mcfv4e_cache_base_update.patch @@ -0,0 +1,1194 @@ +From 3592cd3db82e5b010df590079f1e310b5d317248 Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Mon, 3 Dec 2007 23:03:07 -0700 +Subject: [PATCH] Rewrite Coldfire cache code. + +LTIBName: mcfv4e-cache-base-update +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + arch/m68k/coldfire/cache.c | 196 +------------- + arch/m68k/coldfire/head.S | 6 +- + arch/m68k/coldfire/signal.c | 4 +- + arch/m68k/kernel/sys_m68k.c | 16 ++ + arch/m68k/mm/cache.c | 31 +--- + arch/m68k/mm/memory.c | 76 +----- + include/asm-m68k/cf_cacheflush.h | 525 +++++++++++++++++++++++++++++--------- + include/asm-m68k/cfcache.h | 95 ++++---- + 8 files changed, 495 insertions(+), 454 deletions(-) + +--- a/arch/m68k/coldfire/cache.c ++++ b/arch/m68k/coldfire/cache.c +@@ -1,7 +1,8 @@ + /* +- * linux/arch/m68k/coldifre/cache.c ++ * linux/arch/m68k/coldfire/cache.c + * + * Matt Waddel Matt.Waddel@freescale.com ++ * Kurt Mahan kmahan@freescale.com + * Copyright Freescale Semiconductor, Inc. 2007 + * + * This program is free software; you can redistribute it and/or modify +@@ -15,191 +16,13 @@ + #include <asm/coldfire.h> + #include <asm/system.h> + +-#define _DCACHE_SIZE (2*16384) +-#define _ICACHE_SIZE (2*16384) +- +-#define _SET_SHIFT 4 +- +-/* +- * Masks for cache sizes. Programming note: because the set size is a +- * power of two, the mask is also the last address in the set. +- */ +- +-#define _DCACHE_SET_MASK ((_DCACHE_SIZE/64-1)<<_SET_SHIFT) +-#define _ICACHE_SET_MASK ((_ICACHE_SIZE/64-1)<<_SET_SHIFT) +-#define LAST_DCACHE_ADDR _DCACHE_SET_MASK +-#define LAST_ICACHE_ADDR _ICACHE_SET_MASK +- +-/************************************************************ +- * Routine to cleanly flush the cache, pushing all lines and +- * invalidating them. +- * +- * The is the flash-resident version, used after copying the .text +- * segment from flash to ram. +- *************************************************************/ +-void FLASHDcacheFlushInvalidate(void) +- __attribute__ ((section (".text_loader"))); +- +-void FLASHDcacheFlushInvalidate() +-{ +- unsigned long set; +- unsigned long start_set; +- unsigned long end_set; +- +- start_set = 0; +- end_set = (unsigned long)LAST_DCACHE_ADDR; +- +- for (set = start_set; set < end_set; set += (0x10 - 3)) +- asm volatile("cpushl %%dc,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%dc,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%dc,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%dc,(%0)" : : "a" (set)); +-} +- +-/************************************************************ +- * Routine to cleanly flush the cache, pushing all lines and +- * invalidating them. +- * +- *************************************************************/ +-void DcacheFlushInvalidate() +-{ +- unsigned long set; +- unsigned long start_set; +- unsigned long end_set; +- +- start_set = 0; +- end_set = (unsigned long)LAST_DCACHE_ADDR; +- +- for (set = start_set; set < end_set; set += (0x10 - 3)) +- asm volatile("cpushl %%dc,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%dc,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%dc,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%dc,(%0)" : : "a" (set)); +-} +- +- +- +-/****************************************************************************** +- * Routine to cleanly flush the a block of cache, pushing all relevant lines +- * and invalidating them. +- * +- ******************************************************************************/ +-void DcacheFlushInvalidateCacheBlock(void *start, unsigned long size) +-{ +- unsigned long set; +- unsigned long start_set; +- unsigned long end_set; +- +- /* if size is bigger than the cache can store +- * set the size to the maximum amount +- */ +- +- if (size > LAST_DCACHE_ADDR) +- size = LAST_DCACHE_ADDR; +- +- start_set = ((unsigned long)start) & _DCACHE_SET_MASK; +- end_set = ((unsigned long)(start+size-1)) & _DCACHE_SET_MASK; +- +- if (start_set > end_set) { +- /* from the begining to the lowest address */ +- for (set = 0; set <= end_set; set += (0x10 - 3)) +- asm volatile("cpushl %%dc,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%dc,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%dc,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%dc,(%0)" : : "a" (set)); +- +- /* next loop will finish the cache ie pass the hole */ +- end_set = LAST_DCACHE_ADDR; +- } +- for (set = start_set; set <= end_set; set += (0x10 - 3)) +- asm volatile("cpushl %%dc,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%dc,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%dc,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%dc,(%0)" : : "a" (set)); +-} +- +- +-void IcacheInvalidateCacheBlock(void *start, unsigned long size) +-{ +- unsigned long set; +- unsigned long start_set; +- unsigned long end_set; +- +- /* if size is bigger than the cache can store +- * set the size to the maximum ammount +- */ +- +- if (size > LAST_ICACHE_ADDR) +- size = LAST_ICACHE_ADDR; +- +- start_set = ((unsigned long)start) & _ICACHE_SET_MASK; +- end_set = ((unsigned long)(start+size-1)) & _ICACHE_SET_MASK; +- +- if (start_set > end_set) { +- /* from the begining to the lowest address */ +- for (set = 0; set <= end_set; set += (0x10 - 3)) +- asm volatile("cpushl %%ic,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%ic,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%ic,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%ic,(%0)" : : "a" (set)); +- +- /* next loop will finish the cache ie pass the hole */ +- end_set = LAST_ICACHE_ADDR; +- } +- for (set = start_set; set <= end_set; set += (0x10 - 3)) +- asm volatile("cpushl %%ic,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%ic,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%ic,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%ic,(%0)" : : "a" (set)); +-} +- +- +-/******************************************************************** +- * Disable the data cache completely +- ********************************************************************/ +-void DcacheDisable(void) +-{ +- int newValue; +- unsigned long flags; +- +- local_save_flags(flags); +- local_irq_disable(); +- +- DcacheFlushInvalidate(); /* begin by flushing the cache */ +- newValue = CACHE_DISABLE_MODE; /* disable it */ +- cacr_set(newValue); +- local_irq_restore(flags); +-} +- +-/******************************************************************** +- * Unconditionally enable the data cache +- ********************************************************************/ +-void DcacheEnable(void) +-{ +- cacr_set(CACHE_INITIAL_MODE); +-} +- +- ++/* Cache Control Reg shadow reg */ + unsigned long shadow_cacr; + ++/** ++ * cacr_set - Set the Cache Control Register ++ * @x Value to set ++ */ + void cacr_set(unsigned long x) + { + shadow_cacr = x; +@@ -209,6 +32,11 @@ void cacr_set(unsigned long x) + : "r" (shadow_cacr)); + } + ++/** ++ * cacr_get - Get the current value of the Cache Control Register ++ * ++ * @return CACR value ++ */ + unsigned long cacr_get(void) + { + return shadow_cacr; +--- a/arch/m68k/coldfire/head.S ++++ b/arch/m68k/coldfire/head.S +@@ -244,7 +244,7 @@ ENTRY(__start) + /* Setup initial stack pointer */ + movel #0x40001000,%sp + +-/* Clear usp */ ++/* Setup usp */ + subl %a0,%a0 + movel %a0,%usp + +@@ -252,6 +252,10 @@ ENTRY(__start) + movec %d0, %rambar1 + movew #0x2700,%sr + ++/* reset cache */ ++ movel #(CF_CACR_ICINVA + CF_CACR_DCINVA),%d0 ++ movecl %d0,%cacr ++ + movel #(MMU_BASE+1),%d0 + movecl %d0,%mmubar + movel #MMUOR_CA,%a0 /* Clear tlb entries */ +--- a/arch/m68k/coldfire/signal.c ++++ b/arch/m68k/coldfire/signal.c +@@ -37,6 +37,7 @@ + #include <asm/cf_pgtable.h> + #include <asm/traps.h> + #include <asm/ucontext.h> ++#include <asm/cacheflush.h> + + #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) + +@@ -605,10 +606,9 @@ static inline int rt_setup_ucontext(stru + return err; + } + +-extern void IcacheInvalidateCacheBlock(void *, unsigned long); + static inline void push_cache(unsigned long vaddr) + { +- IcacheInvalidateCacheBlock((void *)vaddr, 8); ++ cf_cache_push(__pa(vaddr), 8); + } + + static inline void __user * +--- a/arch/m68k/kernel/sys_m68k.c ++++ b/arch/m68k/kernel/sys_m68k.c +@@ -29,6 +29,9 @@ + #include <asm/traps.h> + #include <asm/page.h> + #include <asm/unistd.h> ++#ifdef CONFIG_COLDFIRE ++#include <asm/cacheflush.h> ++#endif + + /* + * sys_pipe() is the normal C calling standard for creating +@@ -257,6 +260,7 @@ asmlinkage int sys_ipc (uint call, int f + return -EINVAL; + } + ++#ifndef CONFIG_COLDFIRE + /* Convert virtual (user) address VADDR to physical address PADDR */ + #define virt_to_phys_040(vaddr) \ + ({ \ +@@ -580,6 +584,7 @@ cache_flush_060 (unsigned long addr, int + } + return 0; + } ++#endif /* CONFIG_COLDFIRE */ + + /* sys_cacheflush -- flush (part of) the processor cache. */ + asmlinkage int +@@ -612,6 +617,7 @@ sys_cacheflush (unsigned long addr, int + goto out; + } + ++#ifndef CONFIG_COLDFIRE + if (CPU_IS_020_OR_030) { + if (scope == FLUSH_SCOPE_LINE && len < 256) { + unsigned long cacr; +@@ -656,6 +662,16 @@ sys_cacheflush (unsigned long addr, int + ret = cache_flush_060 (addr, scope, cache, len); + } + } ++#else /* CONFIG_COLDFIRE */ ++ if ((cache & FLUSH_CACHE_INSN) && (cache & FLUSH_CACHE_DATA)) ++ flush_bcache(); ++ else if (cache & FLUSH_CACHE_INSN) ++ flush_icache(); ++ else ++ flush_dcache(); ++ ++ ret = 0; ++#endif /* CONFIG_COLDFIRE */ + out: + unlock_kernel(); + return ret; +--- a/arch/m68k/mm/cache.c ++++ b/arch/m68k/mm/cache.c +@@ -81,36 +81,7 @@ static unsigned long virt_to_phys_slow(u + void flush_icache_range(unsigned long address, unsigned long endaddr) + { + #ifdef CONFIG_COLDFIRE +- unsigned long set; +- unsigned long start_set; +- unsigned long end_set; +- +- start_set = address & _ICACHE_SET_MASK; +- end_set = endaddr & _ICACHE_SET_MASK; +- +- if (start_set > end_set) { +- /* from the begining to the lowest address */ +- for (set = 0; set <= end_set; set += (0x10 - 3)) +- asm volatile ("cpushl %%ic,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%ic,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%ic,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%ic,(%0)" : : "a" (set)); +- +- /* next loop will finish the cache ie pass the hole */ +- end_set = LAST_ICACHE_ADDR; +- } +- for (set = start_set; set <= end_set; set += (0x10 - 3)) +- asm volatile ("cpushl %%ic,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%ic,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%ic,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%ic,(%0)" : : "a" (set)); +- ++ cf_icache_flush_range(address, endaddr); + #else /* !CONFIG_COLDFIRE */ + + if (CPU_IS_040_OR_060) { +--- a/arch/m68k/mm/memory.c ++++ b/arch/m68k/mm/memory.c +@@ -127,6 +127,7 @@ int free_pointer_table (pmd_t *ptable) + return 0; + } + ++#ifndef CONFIG_COLDFIRE + /* invalidate page in both caches */ + static inline void clear040(unsigned long paddr) + { +@@ -173,6 +174,7 @@ static inline void pushcl040(unsigned lo + clear040(paddr); + local_irq_restore(flags); + } ++#endif /* CONFIG_COLDFIRE */ + + /* + * 040: Hit every page containing an address in the range paddr..paddr+len-1. +@@ -203,38 +205,10 @@ static inline void pushcl040(unsigned lo + + void cache_clear (unsigned long paddr, int len) + { +- if (CPU_IS_CFV4E) { +- unsigned long set; +- unsigned long start_set; +- unsigned long end_set; +- +- start_set = paddr & _ICACHE_SET_MASK; +- end_set = (paddr+len-1) & _ICACHE_SET_MASK; +- +- if (start_set > end_set) { +- /* from the begining to the lowest address */ +- for (set = 0; set <= end_set; set += (0x10 - 3)) +- asm volatile("cpushl %%bc,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%bc,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%bc,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%bc,(%0)" : : "a" (set)); +- +- /* next loop will finish the cache ie pass the hole */ +- end_set = LAST_ICACHE_ADDR; +- } +- for (set = start_set; set <= end_set; set += (0x10 - 3)) +- asm volatile("cpushl %%bc,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%bc,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%bc,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%bc,(%0)" : : "a" (set)); +- +- } else if (CPU_IS_040_OR_060) { ++#ifdef CONFIG_COLDFIRE ++ cf_cache_clear(paddr, len); ++#else ++ if (CPU_IS_040_OR_060) { + int tmp; + + /* +@@ -268,6 +242,7 @@ void cache_clear (unsigned long paddr, i + if(mach_l2_flush) + mach_l2_flush(0); + #endif ++#endif /* CONFIG_COLDFIRE */ + } + EXPORT_SYMBOL(cache_clear); + +@@ -281,38 +256,10 @@ EXPORT_SYMBOL(cache_clear); + + void cache_push (unsigned long paddr, int len) + { +- if (CPU_IS_CFV4E) { +- unsigned long set; +- unsigned long start_set; +- unsigned long end_set; +- +- start_set = paddr & _ICACHE_SET_MASK; +- end_set = (paddr+len-1) & _ICACHE_SET_MASK; +- +- if (start_set > end_set) { +- /* from the begining to the lowest address */ +- for (set = 0; set <= end_set; set += (0x10 - 3)) +- asm volatile("cpushl %%bc,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%bc,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%bc,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%bc,(%0)" : : "a" (set)); +- +- /* next loop will finish the cache ie pass the hole */ +- end_set = LAST_ICACHE_ADDR; +- } +- for (set = start_set; set <= end_set; set += (0x10 - 3)) +- asm volatile("cpushl %%bc,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%bc,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%bc,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%bc,(%0)" : : "a" (set)); +- +- } else if (CPU_IS_040_OR_060) { ++#ifdef CONFIG_COLDFIRE ++ cf_cache_push(paddr, len); ++#else ++ if (CPU_IS_040_OR_060) { + int tmp = PAGE_SIZE; + + /* +@@ -352,6 +299,7 @@ void cache_push (unsigned long paddr, in + if(mach_l2_flush) + mach_l2_flush(1); + #endif ++#endif /* CONFIG_COLDFIRE */ + } + EXPORT_SYMBOL(cache_push); + +--- a/include/asm-m68k/cf_cacheflush.h ++++ b/include/asm-m68k/cf_cacheflush.h +@@ -1,160 +1,439 @@ ++/* ++ * include/asm-m68k/cf_cacheflush.h - Coldfire Cache ++ * ++ * Based on include/asm-m68k/cacheflush.h ++ * ++ * Coldfire pieces by: ++ * Kurt Mahan kmahan@freescale.com ++ * ++ * Copyright Freescale Semiconductor, Inc. 2007 ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ */ + #ifndef M68K_CF_CACHEFLUSH_H + #define M68K_CF_CACHEFLUSH_H + + #include <asm/cfcache.h> + + /* +- * Cache handling functions ++ * Coldfire Cache Model ++ * ++ * The Coldfire processors use a Harvard architecture cache configured ++ * as four-way set associative. The cache does not implement bus snooping ++ * so cache coherency with other masters must be maintained in software. ++ * ++ * The cache is managed via the CPUSHL instruction in conjunction with ++ * bits set in the CACR (cache control register). Currently the code ++ * uses the CPUSHL enhancement which adds the ability to ++ * invalidate/clear/push a cacheline by physical address. This feature ++ * is designated in the Hardware Configuration Register [D1-CPES]. ++ * ++ * CACR Bits: ++ * DPI[28] cpushl invalidate disable for d-cache ++ * IDPI[12] cpushl invalidate disable for i-cache ++ * SPA[14] cpushl search by physical address ++ * IVO[20] cpushl invalidate only ++ * ++ * Random Terminology: ++ * * invalidate = reset the cache line's valid bit ++ * * push = generate a line-sized store of the data if its contents are marked ++ * as modifed (the modified flag is cleared after the store) ++ * * clear = push + invalidate + */ + +-#define flush_icache() \ +-({ \ +- unsigned long set; \ +- unsigned long start_set; \ +- unsigned long end_set; \ +- \ +- start_set = 0; \ +- end_set = (unsigned long)LAST_DCACHE_ADDR; \ +- \ +- for (set = start_set; set <= end_set; set += (0x10 - 3)) \ +- asm volatile("cpushl %%ic,(%0)\n" \ +- "\taddq%.l #1,%0\n" \ +- "\tcpushl %%ic,(%0)\n" \ +- "\taddq%.l #1,%0\n" \ +- "\tcpushl %%ic,(%0)\n" \ +- "\taddq%.l #1,%0\n" \ +- "\tcpushl %%ic,(%0)" : : "a" (set)); \ +-}) ++/** ++ * flush_icache - Flush all of the instruction cache ++ */ ++static inline void flush_icache(void) ++{ ++ asm volatile("nop\n" ++ "moveq%.l #0,%%d0\n" ++ "moveq%.l #0,%%d1\n" ++ "move%.l %%d0,%%a0\n" ++ "1:\n" ++ "cpushl %%ic,(%%a0)\n" ++ "add%.l #0x0010,%%a0\n" ++ "addq%.l #1,%%d1\n" ++ "cmpi%.l %0,%%d1\n" ++ "bne 1b\n" ++ "moveq%.l #0,%%d1\n" ++ "addq%.l #1,%%d0\n" ++ "move%.l %%d0,%%a0\n" ++ "cmpi%.l #4,%%d0\n" ++ "bne 1b\n" ++ : : "i" (CACHE_SETS) ++ : "a0", "d0", "d1"); ++} + +-/* +- * invalidate the cache for the specified memory range. +- * It starts at the physical address specified for +- * the given number of bytes. ++/** ++ * flush_dcache - Flush all of the data cache + */ +-extern void cache_clear(unsigned long paddr, int len); +-/* +- * push any dirty cache in the specified memory range. +- * It starts at the physical address specified for +- * the given number of bytes. ++static inline void flush_dcache(void) ++{ ++ asm volatile("nop\n" ++ "moveq%.l #0,%%d0\n" ++ "moveq%.l #0,%%d1\n" ++ "move%.l %%d0,%%a0\n" ++ "1:\n" ++ "cpushl %%dc,(%%a0)\n" ++ "add%.l #0x0010,%%a0\n" ++ "addq%.l #1,%%d1\n" ++ "cmpi%.l %0,%%d1\n" ++ "bne 1b\n" ++ "moveq%.l #0,%%d1\n" ++ "addq%.l #1,%%d0\n" ++ "move%.l %%d0,%%a0\n" ++ "cmpi%.l #4,%%d0\n" ++ "bne 1b\n" ++ : : "i" (CACHE_SETS) ++ : "a0", "d0", "d1"); ++} ++ ++/** ++ * flush_bcache - Flush all of both caches + */ +-extern void cache_push(unsigned long paddr, int len); ++static inline void flush_bcache(void) ++{ ++ asm volatile("nop\n" ++ "moveq%.l #0,%%d0\n" ++ "moveq%.l #0,%%d1\n" ++ "move%.l %%d0,%%a0\n" ++ "1:\n" ++ "cpushl %%bc,(%%a0)\n" ++ "add%.l #0x0010,%%a0\n" ++ "addq%.l #1,%%d1\n" ++ "cmpi%.l %0,%%d1\n" ++ "bne 1b\n" ++ "moveq%.l #0,%%d1\n" ++ "addq%.l #1,%%d0\n" ++ "move%.l %%d0,%%a0\n" ++ "cmpi%.l #4,%%d0\n" ++ "bne 1b\n" ++ : : "i" (CACHE_SETS) ++ : "a0", "d0", "d1"); ++} + +-/* +- * push and invalidate pages in the specified user virtual +- * memory range. ++/** ++ * cf_cache_clear - invalidate cache ++ * @paddr: starting physical address ++ * @len: number of bytes ++ * ++ * Invalidate cache lines starting at paddr for len bytes. ++ * Those lines are not pushed. ++ */ ++static inline void cf_cache_clear(unsigned long paddr, int len) ++{ ++ /* number of lines */ ++ len = (len + (CACHE_LINE_SIZE-1)) / CACHE_LINE_SIZE; ++ ++ /* align on set boundary */ ++ paddr &= 0xfffffff0; ++ ++ asm volatile("nop\n" ++ "move%.l %2,%%d0\n" ++ "or%.l %3,%%d0\n" ++ "movec %%d0,%%cacr\n" ++ "move%.l %0,%%a0\n" ++ "move%.l %1,%%d0\n" ++ "1:\n" ++ "cpushl %%bc,(%%a0)\n" ++ "lea 0x10(%%a0),%%a0\n" ++ "subq%.l #1,%%d0\n" ++ "bne%.b 1b\n" ++ "movec %2,%%cacr\n" ++ : : "a" (paddr), "r" (len), ++ "r" (shadow_cacr), ++ "i" (CF_CACR_SPA+CF_CACR_IVO) ++ : "a0", "d0"); ++} ++ ++/** ++ * cf_cache_push - Push dirty cache out with no invalidate ++ * @paddr: starting physical address ++ * @len: number of bytes ++ * ++ * Push the any dirty lines starting at paddr for len bytes. ++ * Those lines are not invalidated. ++ */ ++static inline void cf_cache_push(unsigned long paddr, int len) ++{ ++ /* number of lines */ ++ len = (len + (CACHE_LINE_SIZE-1)) / CACHE_LINE_SIZE; ++ ++ /* align on set boundary */ ++ paddr &= 0xfffffff0; ++ ++ asm volatile("nop\n" ++ "move%.l %2,%%d0\n" ++ "or%.l %3,%%d0\n" ++ "movec %%d0,%%cacr\n" ++ "move%.l %0,%%a0\n" ++ "move%.l %1,%%d0\n" ++ "1:\n" ++ "cpushl %%bc,(%%a0)\n" ++ "lea 0x10(%%a0),%%a0\n" ++ "subq%.l #1,%%d0\n" ++ "bne.b 1b\n" ++ "movec %2,%%cacr\n" ++ : : "a" (paddr), "r" (len), ++ "r" (shadow_cacr), ++ "i" (CF_CACR_SPA+CF_CACR_DPI+CF_CACR_IDPI) ++ : "a0", "d0"); ++} ++ ++/** ++ * cf_cache_flush - Push dirty cache out and invalidate ++ * @paddr: starting physical address ++ * @len: number of bytes ++ * ++ * Push the any dirty lines starting at paddr for len bytes and ++ * invalidate those lines. ++ */ ++static inline void cf_cache_flush(unsigned long paddr, int len) ++{ ++ /* number of lines */ ++ len = (len + (CACHE_LINE_SIZE-1)) / CACHE_LINE_SIZE; ++ ++ /* align on set boundary */ ++ paddr &= 0xfffffff0; ++ ++ asm volatile("nop\n" ++ "move%.l %2,%%d0\n" ++ "or%.l %3,%%d0\n" ++ "movec %%d0,%%cacr\n" ++ "move%.l %0,%%a0\n" ++ "move%.l %1,%%d0\n" ++ "1:\n" ++ "cpushl %%bc,(%%a0)\n" ++ "lea 0x10(%%a0),%%a0\n" ++ "subq%.l #1,%%d0\n" ++ "bne.b 1b\n" ++ "movec %2,%%cacr\n" ++ : : "a" (paddr), "r" (len), ++ "r" (shadow_cacr), ++ "i" (CF_CACR_SPA) ++ : "a0", "d0"); ++} ++ ++/** ++ * cf_cache_flush_range - Push dirty data/inst cache in range out and invalidate ++ * @vstart - starting virtual address ++ * @vend: ending virtual address ++ * ++ * Push the any dirty data/instr lines starting at paddr for len bytes and ++ * invalidate those lines. ++ */ ++static inline void cf_cache_flush_range(unsigned long vstart, unsigned long vend) ++{ ++ int len; ++ ++ /* align on set boundary */ ++ vstart &= 0xfffffff0; ++ vend = PAGE_ALIGN((vend + (CACHE_LINE_SIZE-1))) & 0xfffffff0; ++ len = vend - vstart; ++ vstart = __pa(vstart); ++ vend = vstart + len; ++ ++ asm volatile("nop\n" ++ "move%.l %2,%%d0\n" ++ "or%.l %3,%%d0\n" ++ "movec %%d0,%%cacr\n" ++ "move%.l %0,%%a0\n" ++ "move%.l %1,%%a1\n" ++ "1:\n" ++ "cpushl %%bc,(%%a0)\n" ++ "lea 0x10(%%a0),%%a0\n" ++ "cmpa%.l %%a0,%%a1\n" ++ "bne.b 1b\n" ++ "movec %2,%%cacr\n" ++ : /* no return */ ++ : "a" (vstart), "a" (vend), ++ "r" (shadow_cacr), ++ "i" (CF_CACR_SPA) ++ : "a0", "a1", "d0"); ++} ++ ++/** ++ * cf_dcache_flush_range - Push dirty data cache in range out and invalidate ++ * @vstart - starting virtual address ++ * @vend: ending virtual address ++ * ++ * Push the any dirty data lines starting at paddr for len bytes and ++ * invalidate those lines. ++ */ ++static inline void cf_dcache_flush_range(unsigned long vstart, unsigned long vend) ++{ ++ /* align on set boundary */ ++ vstart &= 0xfffffff0; ++ vend = (vend + (CACHE_LINE_SIZE-1)) & 0xfffffff0; ++ ++ asm volatile("nop\n" ++ "move%.l %2,%%d0\n" ++ "or%.l %3,%%d0\n" ++ "movec %%d0,%%cacr\n" ++ "move%.l %0,%%a0\n" ++ "move%.l %1,%%a1\n" ++ "1:\n" ++ "cpushl %%dc,(%%a0)\n" ++ "lea 0x10(%%a0),%%a0\n" ++ "cmpa%.l %%a0,%%a1\n" ++ "bne.b 1b\n" ++ "movec %2,%%cacr\n" ++ : /* no return */ ++ : "a" (__pa(vstart)), "a" (__pa(vend)), ++ "r" (shadow_cacr), ++ "i" (CF_CACR_SPA) ++ : "a0", "a1", "d0"); ++} ++ ++/** ++ * cf_icache_flush_range - Push dirty inst cache in range out and invalidate ++ * @vstart - starting virtual address ++ * @vend: ending virtual address ++ * ++ * Push the any dirty instr lines starting at paddr for len bytes and ++ * invalidate those lines. This should just be an invalidate since you ++ * shouldn't be able to have dirty instruction cache. + */ +-extern void cache_push_v(unsigned long vaddr, int len); ++static inline void cf_icache_flush_range(unsigned long vstart, unsigned long vend) ++{ ++ /* align on set boundary */ ++ vstart &= 0xfffffff0; ++ vend = (vend + (CACHE_LINE_SIZE-1)) & 0xfffffff0; ++ ++ asm volatile("nop\n" ++ "move%.l %2,%%d0\n" ++ "or%.l %3,%%d0\n" ++ "movec %%d0,%%cacr\n" ++ "move%.l %0,%%a0\n" ++ "move%.l %1,%%a1\n" ++ "1:\n" ++ "cpushl %%ic,(%%a0)\n" ++ "lea 0x10(%%a0),%%a0\n" ++ "cmpa%.l %%a0,%%a1\n" ++ "bne.b 1b\n" ++ "movec %2,%%cacr\n" ++ : /* no return */ ++ : "a" (__pa(vstart)), "a" (__pa(vend)), ++ "r" (shadow_cacr), ++ "i" (CF_CACR_SPA) ++ : "a0", "a1", "d0"); ++} + +-/* This is needed whenever the virtual mapping of the current +- process changes. */ ++/** ++ * flush_cache_mm - Flush an mm_struct ++ * @mm: mm_struct to flush ++ */ ++static inline void flush_cache_mm(struct mm_struct *mm) ++{ ++ if (mm == current->mm) ++ flush_bcache(); ++} + ++#define flush_cache_dup_mm(mm) flush_cache_mm(mm) + +-#define flush_cache_all() do { } while (0) +-#define flush_cache_mm(mm) do { } while (0) +-#define flush_cache_range(mm, a, b) do { } while (0) +-#define flush_cache_page(vma, vmaddr, pfn) do { } while (0) +- +-#define flush_dcache_range(paddr, len) do { } while (0) +- +-/* Push the page at kernel virtual address and clear the icache */ +-/* use cpush %bc instead of cpush %dc, cinv %ic */ +-#define flush_page_to_ram(page) __flush_page_to_ram((void *) page_address(page)) +-extern inline void __flush_page_to_ram(void *address) +-{ +- unsigned long set; +- unsigned long start_set; +- unsigned long end_set; +- unsigned long addr = (unsigned long) address; +- +- addr &= ~(PAGE_SIZE - 1); /* round down to page start address */ +- +- start_set = addr & _ICACHE_SET_MASK; +- end_set = (addr + PAGE_SIZE-1) & _ICACHE_SET_MASK; +- +- if (start_set > end_set) { +- /* from the begining to the lowest address */ +- for (set = 0; set <= end_set; set += (0x10 - 3)) +- asm volatile("cpushl %%bc,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%bc,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%bc,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%bc,(%0)" : : "a" (set)); +- +- /* next loop will finish the cache ie pass the hole */ +- end_set = LAST_ICACHE_ADDR; +- } +- for (set = start_set; set <= end_set; set += (0x10 - 3)) +- asm volatile("cpushl %%bc,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%bc,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%bc,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%bc,(%0)" : : "a" (set)); +-} +- +-#define flush_dcache_page(page) do { } while (0) +-#define flush_icache_page(vma, pg) do { } while (0) +-#define flush_icache_user_range(adr, len) do { } while (0) +-/* NL */ +-#define flush_icache_user_page(vma, page, addr, len) do { } while (0) +- +-/* Push n pages at kernel virtual address and clear the icache */ +-/* use cpush %bc instead of cpush %dc, cinv %ic */ +-extern inline void flush_icache_range(unsigned long address, +- unsigned long endaddr) +-{ +- unsigned long set; +- unsigned long start_set; +- unsigned long end_set; +- +- start_set = address & _ICACHE_SET_MASK; +- end_set = endaddr & _ICACHE_SET_MASK; +- +- if (start_set > end_set) { +- /* from the begining to the lowest address */ +- for (set = 0; set <= end_set; set += (0x10 - 3)) +- asm volatile("cpushl %%ic,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%ic,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%ic,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%ic,(%0)" : : "a" (set)); +- +- /* next loop will finish the cache ie pass the hole */ +- end_set = LAST_ICACHE_ADDR; +- } +- for (set = start_set; set <= end_set; set += (0x10 - 3)) +- asm volatile("cpushl %%ic,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%ic,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%ic,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%ic,(%0)" : : "a" (set)); ++/** ++ * flush_cache_range - Flush a cache range ++ * @vma: vma struct ++ * @start: Starting address ++ * @end: Ending address ++ * ++ * flush_cache_range must be a macro to avoid a dependency on ++ * linux/mm.h which includes this file. ++ */ ++static inline void flush_cache_range(struct vm_area_struct *vma, ++ unsigned long start, unsigned long end) ++{ ++ if (vma->vm_mm == current->mm) ++ cf_cache_flush_range(start, end); + } + ++/** ++ * flush_cache_page - Flush a page of the cache ++ * @vma: vma struct ++ * @vmaddr: ++ * @pfn: page numer ++ * ++ * flush_cache_page must be a macro to avoid a dependency on ++ * linux/mm.h which includes this file. ++ */ ++static inline void flush_cache_page(struct vm_area_struct *vma, ++ unsigned long vmaddr, unsigned long pfn) ++{ ++ if (vma->vm_mm == current->mm) ++ cf_cache_flush_range(vmaddr, vmaddr+PAGE_SIZE); ++} ++ ++/** ++ * __flush_page_to_ram - Push a page out of the cache ++ * @vaddr: Virtual address at start of page ++ * ++ * Push the page at kernel virtual address *vaddr* and clear ++ * the icache. ++ */ ++static inline void __flush_page_to_ram(void *vaddr) ++{ ++ asm volatile("nop\n" ++ "move%.l %2,%%d0\n" ++ "or%.l %3,%%d0\n" ++ "movec %%d0,%%cacr\n" ++ "move%.l %0,%%d0\n" ++ "and%.l #0xfffffff0,%%d0\n" ++ "move%.l %%d0,%%a0\n" ++ "move%.l %1,%%d0\n" ++ "1:\n" ++ "cpushl %%bc,(%%a0)\n" ++ "lea 0x10(%%a0),%%a0\n" ++ "subq%.l #1,%%d0\n" ++ "bne.b 1b\n" ++ "movec %2,%%cacr\n" ++ : : "a" (__pa(vaddr)), "i" (PAGE_SIZE / CACHE_LINE_SIZE), ++ "r" (shadow_cacr), "i" (CF_CACR_SPA) ++ : "a0", "d0"); ++} ++ ++/* ++ * Various defines for the kernel. ++ */ ++ ++extern void cache_clear(unsigned long paddr, int len); ++extern void cache_push(unsigned long paddr, int len); ++extern void flush_icache_range(unsigned long address, unsigned long endaddr); ++ ++#define flush_cache_all() flush_bcache() ++#define flush_cache_vmap(start, end) flush_bcache() ++#define flush_cache_vunmap(start, end) flush_bcache() ++ ++#define flush_dcache_range(vstart, vend) cf_dcache_flush_range(vstart, vend) ++#define flush_dcache_page(page) __flush_page_to_ram(page_address(page)) ++#define flush_dcache_mmap_lock(mapping) do { } while (0) ++#define flush_dcache_mmap_unlock(mapping) do { } while (0) ++ ++#define flush_icache_page(vma, page) __flush_page_to_ram(page_address(page)) ++ ++/** ++ * copy_to_user_page - Copy memory to user page ++ */ + static inline void copy_to_user_page(struct vm_area_struct *vma, + struct page *page, unsigned long vaddr, + void *dst, void *src, int len) + { + memcpy(dst, src, len); +- flush_icache_user_page(vma, page, vaddr, len); ++ cf_cache_flush(page_to_phys(page), PAGE_SIZE); + } ++ ++/** ++ * copy_from_user_page - Copy memory from user page ++ */ + static inline void copy_from_user_page(struct vm_area_struct *vma, + struct page *page, unsigned long vaddr, + void *dst, void *src, int len) + { ++ cf_cache_flush(page_to_phys(page), PAGE_SIZE); + memcpy(dst, src, len); + } + +-#define flush_cache_dup_mm(mm) flush_cache_mm(mm) +-#define flush_cache_vmap(start, end) flush_cache_all() +-#define flush_cache_vunmap(start, end) flush_cache_all() +-#define flush_dcache_mmap_lock(mapping) do { } while (0) +-#define flush_dcache_mmap_unlock(mapping) do { } while (0) +- + #endif /* M68K_CF_CACHEFLUSH_H */ +--- a/include/asm-m68k/cfcache.h ++++ b/include/asm-m68k/cfcache.h +@@ -1,19 +1,32 @@ + /* +- * include/asm-m68k/cfcache.h ++ * include/asm-m68k/cfcache.h - Coldfire Cache Controller ++ * ++ * Kurt Mahan kmahan@freescale.com ++ * ++ * Copyright Freescale Semiconductor, Inc. 2007 ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. + */ + #ifndef CF_CFCACHE_H + #define CF_CFCACHE_H + ++/* ++ * CACR Cache Control Register ++ */ + #define CF_CACR_DEC (0x80000000) /* Data Cache Enable */ + #define CF_CACR_DW (0x40000000) /* Data default Write-protect */ + #define CF_CACR_DESB (0x20000000) /* Data Enable Store Buffer */ +-#define CF_CACR_DDPI (0x10000000) /* Data Disable CPUSHL Invalidate */ ++#define CF_CACR_DPI (0x10000000) /* Data Disable CPUSHL Invalidate */ + #define CF_CACR_DHLCK (0x08000000) /* 1/2 Data Cache Lock Mode */ + #define CF_CACR_DDCM_00 (0x00000000) /* Cacheable writethrough imprecise */ + #define CF_CACR_DDCM_01 (0x02000000) /* Cacheable copyback */ + #define CF_CACR_DDCM_10 (0x04000000) /* Noncacheable precise */ + #define CF_CACR_DDCM_11 (0x06000000) /* Noncacheable imprecise */ + #define CF_CACR_DCINVA (0x01000000) /* Data Cache Invalidate All */ ++#define CF_CACR_DDSP (0x00800000) /* Data default supervisor-protect */ + #define CF_CACR_IVO (0x00100000) /* Invalidate only */ + #define CF_CACR_BEC (0x00080000) /* Branch Cache Enable */ + #define CF_CACR_BCINVA (0x00040000) /* Branch Cache Invalidate All */ +@@ -24,61 +37,43 @@ + #define CF_CACR_IHLCK (0x00000800) /* 1/2 Instruction Cache Lock Mode */ + #define CF_CACR_IDCM (0x00000400) /* Noncacheable Instr default mode */ + #define CF_CACR_ICINVA (0x00000100) /* Instr Cache Invalidate All */ ++#define CF_CACR_IDSP (0x00000080) /* Ins default supervisor-protect */ + #define CF_CACR_EUSP (0x00000020) /* Switch stacks in user mode */ + +-#define DCACHE_LINE_SIZE 0x0010 /* bytes per line */ +-#define DCACHE_WAY_SIZE 0x2000 /* words per cache block */ +-#define CACHE_DISABLE_MODE (CF_CACR_DCINVA+CF_CACR_BCINVA+CF_CACR_ICINVA) +-#ifdef CONFIG_M5445X_DISABLE_CACHE +-/* disable cache for testing rev0 silicon */ +-#define CACHE_INITIAL_MODE (CF_CACR_EUSP) +-#else +-#define CACHE_INITIAL_MODE (CF_CACR_DEC+CF_CACR_BEC+CF_CACR_IEC+CF_CACR_EUSP) +-#endif +- +-#define _DCACHE_SIZE (2*16384) +-#define _ICACHE_SIZE (2*16384) +- +-#define _SET_SHIFT 4 +- ++#ifdef CONFIG_M54455 + /* +- * Masks for cache sizes. Programming note: because the set size is a +- * power of two, the mask is also the last address in the set. +- * This may need to be #ifdef for other Coldfire processors. ++ * M5445x Cache Configuration ++ * - cache line size is 16 bytes ++ * - cache is 4-way set associative ++ * - each cache has 256 sets (64k / 16bytes / 4way) ++ * - I-Cache size is 16KB ++ * - D-Cache size is 16KB + */ ++#define ICACHE_SIZE 0x4000 /* instruction - 16k */ ++#define DCACHE_SIZE 0x4000 /* data - 16k */ + +-#define _DCACHE_SET_MASK ((_DCACHE_SIZE/64-1)<<_SET_SHIFT) +-#define _ICACHE_SET_MASK ((_ICACHE_SIZE/64-1)<<_SET_SHIFT) +-#define LAST_DCACHE_ADDR _DCACHE_SET_MASK +-#define LAST_ICACHE_ADDR _ICACHE_SET_MASK +- ++#define CACHE_LINE_SIZE 0x0010 /* 16 bytes */ ++#define CACHE_SETS 0x0100 /* 256 sets */ ++#define CACHE_WAYS 0x0004 /* 4 way */ ++ ++#define CACHE_DISABLE_MODE (CF_CACR_DCINVA+ \ ++ CF_CACR_BCINVA+ \ ++ CF_CACR_ICINVA) ++ ++#ifndef CONFIG_M5445X_DISABLE_CACHE ++#define CACHE_INITIAL_MODE (CF_CACR_DEC+ \ ++ CF_CACR_BEC+ \ ++ CF_CACR_IEC+ \ ++ CF_CACR_EUSP) ++#else ++/* cache disabled for testing */ ++#define CACHE_INITIAL_MODE (CF_CACR_EUSP) ++#endif /* CONFIG_M5445X_DISABLE_CACHE */ ++#endif /* CONFIG_M54455 */ + + #ifndef __ASSEMBLY__ + +-extern void DcacheFlushInvalidate(void); +- +-extern void DcacheDisable(void); +-extern void DcacheEnable(void); +- +-/******************************************************************************/ +-/*** Unimplemented Cache functionality ***/ +-/******************************************************************************/ +-#define preDcacheInvalidateBlockMark() +-#define postDcacheInvalidateBlockMark() +-#define DcacheZeroBlock(p, l) fast_bzero((char *)(p), (long)(l)) +-#define loadDcacheInvalidateBlock() ASSERT(!"Not Implemented on V4e") +-#define IcacheInvalidateBlock() ASSERT(!"Not Implemented on V4e") +- +-/******************************************************************************/ +-/*** Redundant Cache functionality on ColdFire ***/ +-/******************************************************************************/ +-#define DcacheInvalidateBlock(p, l) DcacheFlushInvalidateCacheBlock(p, l) +-#define DcacheFlushCacheBlock(p, l) DcacheFlushInvalidateCacheBlock(p, l) +-#define DcacheFlushBlock(p, l) DcacheFlushInvalidateCacheBlock(p, l) +- +-extern void DcacheFlushInvalidateCacheBlock(void *start, unsigned long size); +-extern void FLASHDcacheFlushInvalidate(void); +- ++extern unsigned long shadow_cacr; + extern void cacr_set(unsigned long x); + + #endif /* !__ASSEMBLY__ */ diff --git a/target/linux/coldfire/patches/024-m5445x_enable_cache_store.patch b/target/linux/coldfire/patches/024-m5445x_enable_cache_store.patch new file mode 100644 index 0000000000..e0b9c8033f --- /dev/null +++ b/target/linux/coldfire/patches/024-m5445x_enable_cache_store.patch @@ -0,0 +1,40 @@ +From 96de11ad11db226423d364a75cc82c6118a18a1f Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Tue, 4 Dec 2007 00:04:21 -0700 +Subject: [PATCH] Enable Cache Store Buffer. + +LTIBName: m5445x-enable-cache-store +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + arch/m68k/coldfire/config.c | 2 ++ + include/asm-m68k/cfcache.h | 1 + + 2 files changed, 3 insertions(+), 0 deletions(-) + +--- a/arch/m68k/coldfire/config.c ++++ b/arch/m68k/coldfire/config.c +@@ -21,6 +21,7 @@ + #include <asm/machdep.h> + #include <asm/coldfire.h> + #include <asm/cfcache.h> ++#include <asm/cacheflush.h> + #include <asm/bootinfo.h> + #include <asm/io.h> + #include <asm/cfmmu.h> +@@ -165,6 +166,7 @@ asmlinkage void __init cf_early_init(voi + + sizeof(record->data[0]) + sizeof(record->data[1]); + + /* Invalidate caches via CACR */ ++ flush_bcache(); + cacr_set(CACHE_DISABLE_MODE); + + /* Turn on caches via CACR, enable EUSP */ +--- a/include/asm-m68k/cfcache.h ++++ b/include/asm-m68k/cfcache.h +@@ -64,6 +64,7 @@ + #define CACHE_INITIAL_MODE (CF_CACR_DEC+ \ + CF_CACR_BEC+ \ + CF_CACR_IEC+ \ ++ CF_CACR_DESB+ \ + CF_CACR_EUSP) + #else + /* cache disabled for testing */ diff --git a/target/linux/coldfire/patches/025-m5445x_usb_autosuspend_delay.patch b/target/linux/coldfire/patches/025-m5445x_usb_autosuspend_delay.patch new file mode 100644 index 0000000000..39f4e6a38b --- /dev/null +++ b/target/linux/coldfire/patches/025-m5445x_usb_autosuspend_delay.patch @@ -0,0 +1,22 @@ +From 2ff438b85bd3f34f31886883d9dacbd15bc16df8 Mon Sep 17 00:00:00 2001 +From: Bruce Schmid <duck@freescale.com> +Date: Tue, 4 Dec 2007 11:30:14 -0700 +Subject: [PATCH] USB: restore usb_autosuspend_delay + +LTIBName: m5445x-usb-autosuspend-delay +Signed-off-by: Duck <duck@freescale.com> +--- + drivers/usb/core/usb.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +--- a/drivers/usb/core/usb.c ++++ b/drivers/usb/core/usb.c +@@ -52,7 +52,7 @@ static int nousb; /* Disable USB when bu + struct workqueue_struct *ksuspend_usb_wq; + + #ifdef CONFIG_USB_SUSPEND +-static int usb_autosuspend_delay = -1; /* Default delay value, ++static int usb_autosuspend_delay = 2; /* Default delay value, + * in seconds */ + module_param_named(autosuspend, usb_autosuspend_delay, int, 0644); + MODULE_PARM_DESC(autosuspend, "default autosuspend delay"); diff --git a/target/linux/coldfire/patches/026-m5445x_usb_cleanup_2.patch b/target/linux/coldfire/patches/026-m5445x_usb_cleanup_2.patch new file mode 100644 index 0000000000..634e9dfc67 --- /dev/null +++ b/target/linux/coldfire/patches/026-m5445x_usb_cleanup_2.patch @@ -0,0 +1,470 @@ +From b014a8a0b66b1f0f55b3384f586f43e67e6dcc5d Mon Sep 17 00:00:00 2001 +From: Bruce Schmid <duck@freescale.com> +Date: Tue, 4 Dec 2007 16:03:17 -0700 +Subject: [PATCH] USB: cleanup + +LTIBName: m5445x-usb-cleanup-2 +Signed-off-by: Duck <duck@freescale.com> +--- + drivers/usb/gadget/mcf5445x_udc.c | 14 --- + drivers/usb/host/ehci-arc.c | 19 +--- + drivers/usb/otg/fsl_otg.c | 225 ++----------------------------------- + drivers/usb/otg/otg_fsm.h | 2 +- + include/linux/usb/fsl_usb2.h | 5 +- + 5 files changed, 15 insertions(+), 250 deletions(-) + +--- a/drivers/usb/gadget/mcf5445x_udc.c ++++ b/drivers/usb/gadget/mcf5445x_udc.c +@@ -321,11 +321,6 @@ static void pullup_enable(struct fsl_udc + temp = fsl_readl(&dr_regs->usbcmd); + temp |= USB_CMD_RUN_STOP; + fsl_writel(temp, &dr_regs->usbcmd); +- +-#ifdef NEVER /* DDD FIXME: we want this? */ +- if (!udc->transceiver) +- *((u16 *)(MCF_FBCS1_CSAR)) &= ~0x1; /* Enable pullup register */ +-#endif + } + + static void pullup_disable(struct fsl_udc *udc) +@@ -345,12 +340,6 @@ static void pullup_disable(struct fsl_ud + tmp = fsl_readl(&dr_regs->usbcmd); + tmp &= ~USB_CMD_RUN_STOP; + fsl_writel(tmp, &dr_regs->usbcmd); +- +-#ifdef NEVER /* DDD FIXME: we want this? */ +- if (!udc->transceiver) +- *((u16 *)(MCF_FBCS1_CSAR)) |= 0x1; /* Disable pullup register */ +-#endif +- + } + + static void dr_controller_run(struct fsl_udc *udc) +@@ -2598,9 +2587,6 @@ static int __init fsl_udc_probe(struct p + ret = -ENOMEM; + goto err4; + } +-#if 0 // DDD why this? hoarks OTG host +- pullup_disable(udc); +-#endif + + create_proc_file(); + return 0; +--- a/drivers/usb/host/ehci-arc.c ++++ b/drivers/usb/host/ehci-arc.c +@@ -378,25 +378,14 @@ static int ehci_fsl_drv_resume(struct pl + + memcpy(ehci->regs, (void *)&usb_ehci_regs, sizeof(struct ehci_regs)); + +-#if 0 // DDD test +- ehci_writel(ehci, usb_ehci_portsc, &ehci->regs->port_status[0]); +- printk("set portsc %08x %08x\n", usb_ehci_portsc, +- ehci_readl(ehci, &ehci->regs->port_status[0])); +- printk("set usbmode %08x\n", +- ehci_readl(ehci, &ehci->regs + FSL_SOC_USB_USBMODE)); +- + tmp = USBMODE_CM_HOST | (pdata->es ? USBMODE_ES : 0); + ehci_writel(ehci, tmp, hcd->regs + FSL_SOC_USB_USBMODE); +-#else +- tmp = USBMODE_CM_HOST | (pdata->es ? USBMODE_ES : 0); +- ehci_writel(ehci, tmp, hcd->regs + FSL_SOC_USB_USBMODE); +- printk("tmp %08x set usbmode %08x\n", tmp, +- ehci_readl(ehci, hcd->regs + FSL_SOC_USB_USBMODE)); ++ pr_debug("tmp %08x set usbmode %08x\n", tmp, ++ ehci_readl(ehci, hcd->regs + FSL_SOC_USB_USBMODE)); + + ehci_writel(ehci, usb_ehci_portsc, &ehci->regs->port_status[0]); +- printk("set portsc %08x %08x\n", usb_ehci_portsc, +- ehci_readl(ehci, &ehci->regs->port_status[0])); +-#endif ++ pr_debug("set portsc %08x %08x\n", usb_ehci_portsc, ++ ehci_readl(ehci, &ehci->regs->port_status[0])); + + set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); + hcd->state = HC_STATE_RUNNING; +--- a/drivers/usb/otg/fsl_otg.c ++++ b/drivers/usb/otg/fsl_otg.c +@@ -98,6 +98,7 @@ static struct fsl_otg_config fsl_otg_ini + .otg_port = 1, + }; + ++#if 0 + static void dump_state(const char *string, struct otg_fsm *fsm) + { + printk(KERN_DEBUG "%s\n\tOTG state: %s\n", string, +@@ -135,6 +136,7 @@ static void dump_state(const char *strin + printk(KERN_DEBUG "\tb_sess_vld: %d\n", fsm->b_sess_vld); + printk(KERN_DEBUG "\tid: %d\n", fsm->id); + } ++#endif + + + /* Routines to access transceiver ULPI registers */ +@@ -537,6 +539,7 @@ int fsl_otg_start_gadget(struct otg_fsm + return 0; + } + ++#if 0 + static void fsl_otg_enable(struct otg_transceiver *otg_p) + { + struct fsl_otg *otg_dev = container_of(otg_p, struct fsl_otg, otg); +@@ -549,7 +552,7 @@ static void fsl_otg_enable(struct otg_tr + otg_sc |= OTGSC_INTERRUPT_ENABLE_BITS_MASK; + otg_sc &= ~OTGSC_IE_1ms_TIMER; + otg_sc &= ~OTGSC_CTRL_VBUS_DISCHARGE; +- otg_sc |= OTGSC_IE_USB_ID; /* DDD added this */ ++ otg_sc |= OTGSC_IE_USB_ID; + fsl_writel(otg_sc, &usb_dr_regs->otgsc); + + fsm->id = (otg_sc & OTGSC_STS_USB_ID) ? 1 : 0; +@@ -570,6 +573,7 @@ static void fsl_otg_enable(struct otg_tr + fsm->a_sess_vld = (otg_sc & OTGSC_STS_A_SESSION_VALID) ? 1 : 0; + fsm->b_sess_end = (otg_sc & OTGSC_STS_B_SESSION_END) ? 1 : 0; + } ++#endif + + /* + * Called by initialization code of host driver. Register host controller +@@ -577,34 +581,6 @@ static void fsl_otg_enable(struct otg_tr + */ + static int fsl_otg_set_host(struct otg_transceiver *otg_p, struct usb_bus *host) + { +-#if 0 // DDD beta-final +- struct fsl_otg *otg_dev = container_of(otg_p, struct fsl_otg, otg); +- struct device *dev = host->controller; +- +- if (!otg_p || otg_dev != fsl_otg_dev) +- return -ENODEV; +- +- otg_p->host = host; +- otg_p->host->is_b_host = otg_dev->fsm.id; +- +- otg_dev->fsm.a_bus_drop = 0; +- otg_dev->fsm.a_bus_req = 1; +- +- otg_p->host->otg_port = fsl_otg_initdata.otg_port; +- +- if (dev && dev->driver) { +- VDBG("suspending host\n"); +- dev->driver->suspend(dev, PMSG_SUSPEND); +- otg_dev->host_working = 0; +- VDBG("back\n"); +- } +- +- +- /* dump_state("set_host running statemachine", &otg_dev->fsm); DDD */ +- otg_statemachine(&otg_dev->fsm); +- +- return 0; +-#else + struct fsl_otg *otg_dev = container_of(otg_p, struct fsl_otg, otg); + + if (!otg_p || otg_dev != fsl_otg_dev) +@@ -644,7 +620,6 @@ static int fsl_otg_set_host(struct otg_t + otg_statemachine(&otg_dev->fsm); + + return 0; +-#endif + } + + /* Called by initialization code of udc. Register udc to OTG.*/ +@@ -673,12 +648,6 @@ static int fsl_otg_set_peripheral(struct + + otg_dev->fsm.b_bus_req = 1; + +-#if 0 /* DDD uClinux */ +- if (otg_p->host) { +- fsl_otg_enable(otg_p); +- otg_statemachine(&otg_dev->fsm); +- } +-#endif + /* start the gadget right away if the ID pin says Mini-B */ + DBG("ID pin=%d\n", otg_dev->fsm.id); + if (otg_dev->fsm.id == 1) { +@@ -815,162 +784,6 @@ irqreturn_t fsl_otg_isr(int irq, void *d + } + + +-#if 0 // DDD feta-final +-irqreturn_t foo_fsl_otg_isr(int irq, void *dev_id) +-{ +- struct otg_fsm *fsm = &((struct fsl_otg *)dev_id)->fsm; +- struct otg_transceiver *otg = &((struct fsl_otg *)dev_id)->otg; +- u32 otg_int_src, usb_int_src, otg_sc; +- int trigger = 0; +- int tmp; +- +- usb_int_src = fsl_readl(&usb_dr_regs->usbsts); +- otg_sc = fsl_readl(&usb_dr_regs->otgsc); +- otg_int_src = otg_sc & OTGSC_INTSTS_MASK & (otg_sc >> 8); +- +- /* Only clear otg interrupts */ +- fsl_writel(otg_sc, &usb_dr_regs->otgsc); +- +- /*FIXME: ID change not generate when init to 0 */ +- /* process OTG interrupts */ +- if (otg_int_src) { +- VDBG("\nOTG irq 0x%08x\n", otg_int_src); +- if (otg_int_src & OTGSC_INTSTS_1MS_TIMER) +- trigger = fsl_otg_tick_timer(); +- +- if (otg_int_src & OTGSC_INTSTS_USB_ID) { +- fsm->id = (otg_sc & OTGSC_STS_USB_ID) ? 1 : 0; +- otg->default_a = (fsm->id == 0); +- if (otg->host) +- otg->host->is_b_host = fsm->id; +- if (otg->gadget) +- otg->gadget->is_a_peripheral = !fsm->id; +- VDBG("IRQ=ID now=%d\n", fsm->id); +- +- if (fsm->id) { /* switch to gadget */ +- schedule_delayed_work(&((struct fsl_otg *) +- dev_id)->otg_event, 25); +- } else { /* switch to host */ +- cancel_delayed_work(& +- ((struct fsl_otg *)dev_id)-> +- otg_event); +- fsl_otg_start_gadget(fsm, 0); +- fsl_otg_drv_vbus(1); +- fsl_otg_start_host(fsm, 1); +- } +- +- return IRQ_HANDLED; +- } +- if (otg_int_src & OTGSC_INTSTS_DATA_PULSE) { +- fsm->a_srp_det = 1; +- trigger = 1; +- VDBG("!!!!Data pulse int\n"); +- } +- if (otg_int_src & OTGSC_INTSTS_A_SESSION_VALID) { +- fsm->a_sess_vld = +- (otg_sc & OTGSC_STS_A_SESSION_VALID) ? 1 : 0; +- /* detect VBUS pulsing */ +- if ((fsm->transceiver->state == OTG_STATE_A_IDLE) +- && fsm->a_sess_vld) +- fsm->a_srp_det = 1; +- trigger = 1; +- VDBG("!!!a_sess_vld int state=%d\n", fsm->a_sess_vld); +- } +- if (otg_int_src & OTGSC_INTSTS_A_VBUS_VALID) { +- fsm->a_vbus_vld = !!(otg_sc & OTGSC_STS_A_VBUS_VALID); +- trigger = 1; +- VDBG("!!!a_vbus_vld int state=%d\n", fsm->a_vbus_vld); +- +-#if 1 +- if ((fsm->a_vbus_vld == 0) && (fsm->id == 0)) { +- if (fsm->transceiver->state != OTG_STATE_A_WAIT_VFALL) +- /* Warning insted of transfer to Error state. */ +- printk(KERN_WARNING "ulpi: The USB Device is " +- "sinking too much current!!\n"); +- fsm->a_vbus_vld = 1; +- } +-#endif +- +- +- } +- if (otg_int_src & OTGSC_INTSTS_B_SESSION_VALID) { +- fsm->b_sess_vld = +- (otg_sc & OTGSC_STS_B_SESSION_VALID) ? 1 : 0; +- trigger = 1; +- /* SRP done */ +- if ((fsl_otg_dev->otg.state == OTG_STATE_B_SRP_INIT) && +- fsm->b_sess_vld && srp_wait_done) +- fsm->b_srp_done = 1; +- VDBG("!!!!b_sess_vld int state=%d\n", fsm->b_sess_vld); +- } +- if (otg_int_src & OTGSC_INTSTS_B_SESSION_END) { +- fsm->b_sess_end = +- (otg_sc & OTGSC_STS_B_SESSION_END) ? 1 : 0; +- trigger = 1; +- VDBG("!!!!b_sess_end int state=%d\n", fsm->b_sess_end); +- } +- } +- +- /* process USB interrupts */ +- if ((usb_int_src & USB_STS_PORT_CHANGE) +- && (fsm->protocol == PROTO_HOST)) { +- VDBG("\nUSB irq A 0x%08x\n", usb_int_src); +- /* Device resume do not generate statemachine change */ +- if (fsl_readl(&usb_dr_regs->portsc1) & +- PORTSCX_PORT_FORCE_RESUME) { +- if (otg->default_a) { +- fsm->b_bus_resume = 1; +- trigger = 1; +- } else { +- fsm->a_bus_resume = 1; +- trigger = 1; +- } +- } +- +- tmp = (fsl_readl(&usb_dr_regs->portsc1) & +- PORTSCX_CURRENT_CONNECT_STATUS) ? 1 : 0; +- if (otg->default_a && (fsm->b_conn != tmp)) { +- fsm->b_conn = tmp; +- trigger = 1; +- } else if (!otg->default_a && (fsm->a_conn != tmp)) { +- fsm->a_conn = tmp; +- trigger = 1; +- } +- } +- /* Workaround: sometimes CSC bit will lost. We change to +- * polling CCS bit for connect change */ +- if (fsm->protocol == PROTO_GADGET) { +- if (usb_int_src & USB_STS_SUSPEND) { +- VDBG("\nUSB irq B 0x%08x\n", usb_int_src); +- VDBG("peripheral detected suspend\n"); +- if (otg->default_a) +- /* A-device detects B suspend */ +- fsm->b_bus_suspend = 1; +- else +- /* B-device detects A suspend */ +- fsm->a_bus_suspend = 1; +- trigger = 1; +- } else if (usb_int_src & USB_STS_PORT_CHANGE) { +- VDBG("\nUSB irq C 0x%08x\n", usb_int_src); +- VDBG("peripheral resumed\n"); +- if (otg->default_a) +- fsm->b_bus_suspend = 0; +- else +- fsm->a_bus_suspend = 0; +- trigger = 1; +- } +- } +- +- /* Invoke statemachine until state is stable */ +- while (trigger) { +- trigger = otg_statemachine(fsm); +- } +- +- return IRQ_HANDLED; +-} +-#endif +- +- + static struct otg_fsm_ops fsl_otg_ops = { + .chrg_vbus = fsl_otg_chrg_vbus, + .drv_vbus = fsl_otg_drv_vbus, +@@ -1003,7 +816,6 @@ int fsl_otg_cfg(struct platform_device * + if (!fsl_otg_tc) + return -ENODEV; + +-#if 1 // DDD + if (pdata->regs) { + fsl_otg_tc->dr_mem_map = pdata->regs; + } else { +@@ -1013,8 +825,10 @@ int fsl_otg_cfg(struct platform_device * + return -ENODEV; + } + ++ /* + printk("DDD %s(): rsrc_start=0x%x rsrc_len=0x%x\n", + __FUNCTION__, res->start, res->end - res->start + 1); ++ */ + + if (!request_mem_region(res->start, res->end - res->start + 1, + "OTG")) { +@@ -1026,7 +840,6 @@ int fsl_otg_cfg(struct platform_device * + } + DBG("set dr_mem_map to 0x%p\n", fsl_otg_tc->dr_mem_map); + +-#endif + INIT_DELAYED_WORK(&fsl_otg_tc->otg_event, fsl_otg_event); + + INIT_LIST_HEAD(&active_timers); +@@ -1035,12 +848,11 @@ int fsl_otg_cfg(struct platform_device * + /* Set OTG state machine operations */ + fsl_otg_tc->fsm.ops = &fsl_otg_ops; + +-#if 1 /* DDD */ + /* record initial state of ID pin */ + fsl_otg_tc->fsm.id = (fsl_otg_tc->dr_mem_map->otgsc & OTGSC_STS_USB_ID) + ? 1 : 0; + DBG("initial ID pin=%d\n", fsl_otg_tc->fsm.id); +-#endif ++ + /* initialize the otg structure */ + fsl_otg_tc->otg.label = DRIVER_DESC; + fsl_otg_tc->otg.set_host = fsl_otg_set_host; +@@ -1115,13 +927,8 @@ int usb_otg_start(struct platform_device + __FUNCTION__, timeout); + + /* configure the VBUSHS as IDLE(both host and device) */ +-#if 0 +- /* DDD really have to check into setting the following */ +- fsl_writel(USB_MODE_STREAM_DISABLE, &usb_dr_regs->usbmode); +-#else + temp = USB_MODE_STREAM_DISABLE | (pdata->es ? USBMODE_ES : 0); + fsl_writel(temp, &usb_dr_regs->usbmode); +-#endif + + /* configure PHY interface */ + temp = fsl_readl(&usb_dr_regs->portsc1); +@@ -1135,24 +942,11 @@ int usb_otg_start(struct platform_device + /* disable all interrupt and clear all OTGSC status */ + temp = fsl_readl(&usb_dr_regs->otgsc); + temp &= ~OTGSC_INTERRUPT_ENABLE_BITS_MASK; +-#if 0 // DDD +- /* DDD only want ID int +- * temp |= OTGSC_INTERRUPT_STATUS_BITS_MASK | OTGSC_CTRL_VBUS_DISCHARGE; +- */ +- temp |= OTGSC_IE_USB_ID; /* DDD added this */ +- temp &= ~OTGSC_IE_1ms_TIMER; /* DDD added this */ +-#else + temp |= OTGSC_INTERRUPT_STATUS_BITS_MASK | OTGSC_CTRL_VBUS_DISCHARGE; +-#endif + fsl_writel(temp, &usb_dr_regs->otgsc); + + fsl_otg_drv_vbus(0); + +-#if 0 // DDD beta-final +- temp = fsl_readl(&usb_dr_regs->otgsc); +- temp |= OTGSC_IE_A_SESSION_VALID; +- fsl_writel(temp, &usb_dr_regs->otgsc); +-#else + /* + * The identification (id) input is FALSE when a Mini-A plug is inserted + * in the devices Mini-AB receptacle. Otherwise, this input is TRUE. +@@ -1173,7 +967,6 @@ int usb_otg_start(struct platform_device + temp |= OTGSC_IE_USB_ID; + temp &= ~(OTGSC_CTRL_VBUS_DISCHARGE | OTGSC_IE_1ms_TIMER); + fsl_writel(temp, &usb_dr_regs->otgsc); +-#endif + + return 0; + } +@@ -1427,10 +1220,8 @@ static int __init fsl_otg_probe(struct p + return -ENOMEM; + + pdata = pdev->dev.platform_data; +-#if 1 // DDD do this elsewhere + /* Initialize the clock, multiplexing pin and PHY interface */ + board_init(pdev); +-#endif + + /* configure the OTG */ + status = fsl_otg_cfg(pdev); +--- a/drivers/usb/otg/otg_fsm.h ++++ b/drivers/usb/otg/otg_fsm.h +@@ -18,7 +18,7 @@ + #ifndef OTG_FSM_H + #define OTG_FSM_H + +-#if 1 ++#if 0 + #define DEBUG 1 + #define VERBOSE 1 + #endif +--- a/include/linux/usb/fsl_usb2.h ++++ b/include/linux/usb/fsl_usb2.h +@@ -104,9 +104,8 @@ struct fsl_usb_host_regs { + #if 0 + u32 endptctrl[USB_MAX_ENDPOINTS]; /* Endpoint Control Registers */ + #else +- // DDD: do these exits in the host register set?? +- // DDD see DCCPARAMS:DEN for the real number of device endpoints +- // DDD 16 is the max ++ /* DDD see DCCPARAMS:DEN for the real number of device endpoints */ ++ /* DDD 16 is the max */ + u32 endptctrl[16]; /* Endpoint Control Registers */ + #endif + }; diff --git a/target/linux/coldfire/patches/027-m5445x_usb_sdram_priority.patch b/target/linux/coldfire/patches/027-m5445x_usb_sdram_priority.patch new file mode 100644 index 0000000000..e75f092a3d --- /dev/null +++ b/target/linux/coldfire/patches/027-m5445x_usb_sdram_priority.patch @@ -0,0 +1,130 @@ +From b6b6d18a54e22784cb48e1953201484830d030e4 Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Thu, 6 Dec 2007 14:17:46 -0700 +Subject: [PATCH] Change USB to SDRAM priority. + +Increase the USB priority to the maximum, above ColdfireCore, +in the SDRAM crossbar switch. This fixes the issues with the +USB core not being able to transfer to memory fast enough to +keep up with HS. + +LTIBName: m5445x-usb-sdram-priority +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + arch/m68k/coldfire/config.c | 12 ++++++ + include/asm-m68k/mcf5445x_xbs.h | 81 +++++++++++++++++++++++++++++++++++++++ + 2 files changed, 93 insertions(+), 0 deletions(-) + create mode 100644 include/asm-m68k/mcf5445x_xbs.h + +--- a/arch/m68k/coldfire/config.c ++++ b/arch/m68k/coldfire/config.c +@@ -36,6 +36,7 @@ + #include <asm/mcf5445x_sdramc.h> + #include <asm/mcf5445x_fbcs.h> + #include <asm/mcf5445x_dtim.h> ++#include <asm/mcf5445x_xbs.h> + + /* JKM -- testing */ + #include <linux/pfn.h> +@@ -131,6 +132,17 @@ asmlinkage void __init cf_early_init(voi + MCF_SDRAMC_SDCS(1) = (256*1024*1024) | 0x1B; + #endif + ++ /* Setup SDRAM crossbar(XBS) priorities */ ++printk(KERN_INFO "Bumping USB Priority\n"); ++ MCF_XBS_PRS2 = (MCF_XBS_PRS_M0(MCF_XBS_PRI_2) | ++ MCF_XBS_PRS_M1(MCF_XBS_PRI_3) | ++ MCF_XBS_PRS_M2(MCF_XBS_PRI_4) | ++ MCF_XBS_PRS_M3(MCF_XBS_PRI_5) | ++ MCF_XBS_PRS_M5(MCF_XBS_PRI_6) | ++ MCF_XBS_PRS_M6(MCF_XBS_PRI_1) | ++ MCF_XBS_PRS_M7(MCF_XBS_PRI_7)); ++ ++ + m68k_machtype = MACH_CFMMU; + m68k_fputype = FPU_CFV4E; + m68k_mmutype = MMU_CFV4E; +--- /dev/null ++++ b/include/asm-m68k/mcf5445x_xbs.h +@@ -0,0 +1,81 @@ ++/* ++ * Kurt Mahan kmahan@freescale.com ++ * ++ * Copyright Freescale Semiconductor, Inc. 2007 ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ */ ++ ++#ifndef __MCF5445X_XBS_H__ ++#define __MCF5445X_XBS_H__ ++ ++/* ++ * Crossbar Switch (XBS) ++ */ ++ ++/* Register read/write macros */ ++#define MCF_XBS_PRS1 MCF_REG32(0xFC004100) /* Flexbus Priority */ ++#define MCF_XBS_CRS1 MCF_REG32(0xFC004110) /* Flexbus Control */ ++#define MCF_XBS_PRS2 MCF_REG32(0xFC004200) /* SDRam Priority */ ++#define MCF_XBS_CRS2 MCF_REG32(0xFC004210) /* SDRam Control */ ++#define MCF_XBS_PRS3 MCF_REG32(0xFC004300) /* ATA Priority */ ++#define MCF_XBS_CRS3 MCF_REG32(0xFC004310) /* ATA Control */ ++#define MCF_XBS_PRS4 MCF_REG32(0xFC004400) /* SRAM Priority */ ++#define MCF_XBS_CRS4 MCF_REG32(0xFC004410) /* SRAM Control */ ++#define MCF_XBS_PRS5 MCF_REG32(0xFC004500) /* PCI Priority */ ++#define MCF_XBS_CRS5 MCF_REG32(0xFC004510) /* PCI Control */ ++#define MCF_XBS_PRS6 MCF_REG32(0xFC004600) /* Slave6 Priority */ ++#define MCF_XBS_CRS6 MCF_REG32(0xFC004610) /* Slave6 Control */ ++#define MCF_XBS_PRS7 MCF_REG32(0xFC004700) /* Other Priority */ ++#define MCF_XBS_CRS7 MCF_REG32(0xFC004710) /* Other Control */ ++ ++/* Priorities */ ++#define MCF_XBS_PRI_1 0 /* Level 1 (highest) */ ++#define MCF_XBS_PRI_2 1 /* Level 2 */ ++#define MCF_XBS_PRI_3 2 /* Level 3 */ ++#define MCF_XBS_PRI_4 3 /* Level 4 */ ++#define MCF_XBS_PRI_5 4 /* Level 5 */ ++#define MCF_XBS_PRI_6 5 /* Level 6 */ ++#define MCF_XBS_PRI_7 6 /* Level 7 (lowest) */ ++#define MCF_XBS_PRI_MASK 7 /* Mask (Not a valid level) */ ++ ++/* Priority Register (PRSn) Defs */ ++#define MCF_XBS_PRS_MACRO(m,p) ((p)<<((m)<<2)) ++#define MCF_XBS_PRS_M0(p) MCF_XBS_PRS_MACRO(0, p) /* Coldfire Core */ ++#define MCF_XBS_PRS_M1(p) MCF_XBS_PRS_MACRO(1, p) /* eDMA */ ++#define MCF_XBS_PRS_M2(p) MCF_XBS_PRS_MACRO(2, p) /* FEC0 */ ++#define MCF_XBS_PRS_M3(p) MCF_XBS_PRS_MACRO(3, p) /* FEC1 */ ++#define MCF_XBS_PRS_M4(p) MCF_XBS_PRS_MACRO(4, p) /* Master 4 */ ++#define MCF_XBS_PRS_M5(p) MCF_XBS_PRS_MACRO(5, p) /* PCI */ ++#define MCF_XBS_PRS_M6(p) MCF_XBS_PRS_MACRO(6, p) /* USB OTG */ ++#define MCF_XBS_PRS_M7(p) MCF_XBS_PRS_MACRO(7, p) /* Serial Boot */ ++ ++/* Control Register (CRSn) Defs */ ++#define MCF_XBS_CRS_RO 0x80000000 /* Read Only */ ++#define MCF_XBS_CRS_ARB 0x00000100 /* Arbitration Mode */ ++#define MCF_XBS_CRS_PCTL 0x00000030 /* Parking Control */ ++#define MCF_XBS_CRS_PARK 0x00000007 /* Park Location */ ++ ++/* MCF_XBS_CRS_ARB Defs */ ++#define MCF_ABS_CRS_ARB_FIXED 0x00000000 /* Fixed priority */ ++#define MCF_ABS_CRS_ARB_ROUND 0x00000100 /* Round Robin priority */ ++ ++/* MCF_XBS_CRS_PCTL Defs */ ++#define MCF_ABS_CRS_PCTL_PARK 0x00000000 /* Park on the defined PARK */ ++#define MCF_ABS_CRS_PCTL_LAST 0x00000010 /* Park on the last master */ ++#define MCF_ABS_CRS_PCTL_NONE 0x00000020 /* Don't park */ ++ ++/* MCF_XBS_CRS_PARK Defs */ ++#define MCF_ABS_CRS_PARK_M0 0x00000000 /* Park on Coldfire Core */ ++#define MCF_ABS_CRS_PARK_M1 0x00000001 /* Park on eDMA */ ++#define MCF_ABS_CRS_PARK_M2 0x00000002 /* Park on FEC0 */ ++#define MCF_ABS_CRS_PARK_M3 0x00000003 /* Park on FEC1 */ ++#define MCF_ABS_CRS_PARK_M4 0x00000004 /* Park on Reserved */ ++#define MCF_ABS_CRS_PARK_M5 0x00000005 /* Park on PCI */ ++#define MCF_ABS_CRS_PARK_M6 0x00000006 /* Park on USB OTG */ ++#define MCF_ABS_CRS_PARK_M7 0x00000007 /* Park on Serial Boot */ ++ ++#endif /* __MCF5445X_XBS_H__ */ diff --git a/target/linux/coldfire/patches/028-mcfv4e_cache_ck_0_len.patch b/target/linux/coldfire/patches/028-mcfv4e_cache_ck_0_len.patch new file mode 100644 index 0000000000..a160f5600a --- /dev/null +++ b/target/linux/coldfire/patches/028-mcfv4e_cache_ck_0_len.patch @@ -0,0 +1,55 @@ +From 679a5be6f06b909adccc9c588feb26bf6d6df402 Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Thu, 6 Dec 2007 16:40:39 -0700 +Subject: [PATCH] Add zero length checking to cache routines. + +LTIBName: mcfv4e-cache-ck-0-len +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + include/asm-m68k/cf_cacheflush.h | 14 +++++++++++--- + 1 files changed, 11 insertions(+), 3 deletions(-) + +--- a/include/asm-m68k/cf_cacheflush.h ++++ b/include/asm-m68k/cf_cacheflush.h +@@ -127,7 +127,9 @@ static inline void flush_bcache(void) + static inline void cf_cache_clear(unsigned long paddr, int len) + { + /* number of lines */ +- len = (len + (CACHE_LINE_SIZE-1)) / CACHE_LINE_SIZE; ++ len = (len + (CACHE_LINE_SIZE-1)) / CACHE_LINE_SIZE; ++ if (len == 0) ++ return; + + /* align on set boundary */ + paddr &= 0xfffffff0; +@@ -161,7 +163,9 @@ static inline void cf_cache_clear(unsign + static inline void cf_cache_push(unsigned long paddr, int len) + { + /* number of lines */ +- len = (len + (CACHE_LINE_SIZE-1)) / CACHE_LINE_SIZE; ++ len = (len + (CACHE_LINE_SIZE-1)) / CACHE_LINE_SIZE; ++ if (len == 0) ++ return; + + /* align on set boundary */ + paddr &= 0xfffffff0; +@@ -195,7 +199,9 @@ static inline void cf_cache_push(unsigne + static inline void cf_cache_flush(unsigned long paddr, int len) + { + /* number of lines */ +- len = (len + (CACHE_LINE_SIZE-1)) / CACHE_LINE_SIZE; ++ len = (len + (CACHE_LINE_SIZE-1)) / CACHE_LINE_SIZE; ++ if (len == 0) ++ return; + + /* align on set boundary */ + paddr &= 0xfffffff0; +@@ -234,6 +240,8 @@ static inline void cf_cache_flush_range( + vstart &= 0xfffffff0; + vend = PAGE_ALIGN((vend + (CACHE_LINE_SIZE-1))) & 0xfffffff0; + len = vend - vstart; ++ if (len == 0) ++ return; + vstart = __pa(vstart); + vend = vstart + len; + diff --git a/target/linux/coldfire/patches/029-m5445x_usb_disable_debug.patch b/target/linux/coldfire/patches/029-m5445x_usb_disable_debug.patch new file mode 100644 index 0000000000..fa74786527 --- /dev/null +++ b/target/linux/coldfire/patches/029-m5445x_usb_disable_debug.patch @@ -0,0 +1,22 @@ +From d6cd1bb1f60f790f8a5d410cfe40bfb344dde09b Mon Sep 17 00:00:00 2001 +From: Bruce Schmid <duck@freescale.com> +Date: Thu, 6 Dec 2007 17:22:23 -0700 +Subject: [PATCH] USB: gadget: turn off DEBUG + +LTIBName: m5445x-usb-disable-debug +Signed-off-by: Duck <duck@freescale.com> +--- + drivers/usb/gadget/mcf5445x_udc.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +--- a/drivers/usb/gadget/mcf5445x_udc.c ++++ b/drivers/usb/gadget/mcf5445x_udc.c +@@ -34,7 +34,7 @@ + * + */ + +-#define DEBUG ++#undef DEBUG + #undef VERBOSE + + #include <linux/module.h> diff --git a/target/linux/coldfire/patches/030-m5445x_usb_add_dualspeed.patch b/target/linux/coldfire/patches/030-m5445x_usb_add_dualspeed.patch new file mode 100644 index 0000000000..d2ffa69ad7 --- /dev/null +++ b/target/linux/coldfire/patches/030-m5445x_usb_add_dualspeed.patch @@ -0,0 +1,21 @@ +From 5fb2a68befbec97dba2264b2834487c72f47095d Mon Sep 17 00:00:00 2001 +From: Bruce Schmid <duck@freescale.com> +Date: Wed, 5 Dec 2007 14:43:19 -0700 +Subject: [PATCH] USB: add is_dualspeed. + +LTIBName: m5445x-usb-add-dualspeed +Signed-off-by: Duck <duck@freescale.com> +--- + drivers/usb/gadget/mcf5445x_udc.c | 1 + + 1 files changed, 1 insertions(+), 0 deletions(-) + +--- a/drivers/usb/gadget/mcf5445x_udc.c ++++ b/drivers/usb/gadget/mcf5445x_udc.c +@@ -2538,6 +2538,7 @@ static int __init fsl_udc_probe(struct p + * set the fsl_udc->gadget.xxx + */ + udc->gadget.ops = &fsl_gadget_ops; ++ udc->gadget.is_dualspeed = 1; + + /* gadget.ep0 is a pointer */ + udc->gadget.ep0 = &udc->eps[0].ep; diff --git a/target/linux/coldfire/patches/031-m5445x_usb_defconfig.patch b/target/linux/coldfire/patches/031-m5445x_usb_defconfig.patch new file mode 100644 index 0000000000..e39f03f735 --- /dev/null +++ b/target/linux/coldfire/patches/031-m5445x_usb_defconfig.patch @@ -0,0 +1,273 @@ +From 023b850e67316fbf595bf0cda13f02fabca1f29d Mon Sep 17 00:00:00 2001 +From: Bruce Schmid <duck@freescale.com> +Date: Fri, 7 Dec 2007 10:30:46 -0700 +Subject: [PATCH] USB: add default USB settings + +LTIBName: m5445x-usb-defconfig +Signed-off-by: Duck <duck@freescale.com> +--- + arch/m68k/configs/m54455evb_defconfig | 175 +++++++++++++++++++++++++++++++-- + 1 files changed, 165 insertions(+), 10 deletions(-) + +--- a/arch/m68k/configs/m54455evb_defconfig ++++ b/arch/m68k/configs/m54455evb_defconfig +@@ -1,7 +1,7 @@ + # + # Automatically generated make config: don't edit + # Linux kernel version: 2.6.23 +-# Tue Nov 27 23:42:38 2007 ++# Thu Dec 6 12:14:18 2007 + # + CONFIG_M68K=y + CONFIG_MMU=y +@@ -347,6 +347,7 @@ CONFIG_BLK_DEV=y + CONFIG_BLK_DEV_LOOP=y + # CONFIG_BLK_DEV_CRYPTOLOOP is not set + # CONFIG_BLK_DEV_NBD is not set ++# CONFIG_BLK_DEV_UB is not set + CONFIG_BLK_DEV_RAM=y + CONFIG_BLK_DEV_RAM_COUNT=16 + CONFIG_BLK_DEV_RAM_SIZE=64000 +@@ -361,7 +362,7 @@ CONFIG_MISC_DEVICES=y + # SCSI device support + # + # CONFIG_RAID_ATTRS is not set +-CONFIG_SCSI=m ++CONFIG_SCSI=y + CONFIG_SCSI_DMA=y + # CONFIG_SCSI_TGT is not set + # CONFIG_SCSI_NETLINK is not set +@@ -370,7 +371,7 @@ CONFIG_SCSI_PROC_FS=y + # + # SCSI support type (disk, tape, CD-ROM) + # +-CONFIG_BLK_DEV_SD=m ++CONFIG_BLK_DEV_SD=y + # CONFIG_CHR_DEV_ST is not set + # CONFIG_CHR_DEV_OSST is not set + # CONFIG_BLK_DEV_SR is not set +@@ -380,7 +381,7 @@ CONFIG_BLK_DEV_SD=m + # + # Some SCSI devices (e.g. CD jukebox) support multiple LUNs + # +-# CONFIG_SCSI_MULTI_LUN is not set ++CONFIG_SCSI_MULTI_LUN=y + # CONFIG_SCSI_CONSTANTS is not set + # CONFIG_SCSI_LOGGING is not set + # CONFIG_SCSI_SCAN_ASYNC is not set +@@ -420,6 +421,26 @@ CONFIG_NETDEV_10000=y + # + # CONFIG_WLAN_PRE80211 is not set + # CONFIG_WLAN_80211 is not set ++ ++# ++# USB Network Adapters ++# ++# CONFIG_USB_CATC is not set ++# CONFIG_USB_KAWETH is not set ++CONFIG_USB_PEGASUS=m ++CONFIG_USB_RTL8150=m ++CONFIG_USB_USBNET_MII=m ++CONFIG_USB_USBNET=m ++CONFIG_USB_NET_AX8817X=m ++CONFIG_USB_NET_CDCETHER=m ++# CONFIG_USB_NET_DM9601 is not set ++# CONFIG_USB_NET_GL620A is not set ++# CONFIG_USB_NET_NET1080 is not set ++# CONFIG_USB_NET_PLUSB is not set ++# CONFIG_USB_NET_MCS7830 is not set ++# CONFIG_USB_NET_RNDIS_HOST is not set ++# CONFIG_USB_NET_CDC_SUBSET is not set ++# CONFIG_USB_NET_ZAURUS is not set + # CONFIG_WAN is not set + # CONFIG_PPP is not set + # CONFIG_SLIP is not set +@@ -446,13 +467,19 @@ CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 + CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 + # CONFIG_INPUT_JOYDEV is not set + # CONFIG_INPUT_TSDEV is not set +-# CONFIG_INPUT_EVDEV is not set ++CONFIG_INPUT_EVDEV=y + # CONFIG_INPUT_EVBUG is not set + + # + # Input Device Drivers + # +-# CONFIG_INPUT_KEYBOARD is not set ++CONFIG_INPUT_KEYBOARD=y ++# CONFIG_KEYBOARD_ATKBD is not set ++# CONFIG_KEYBOARD_SUNKBD is not set ++# CONFIG_KEYBOARD_LKKBD is not set ++# CONFIG_KEYBOARD_XTKBD is not set ++# CONFIG_KEYBOARD_NEWTON is not set ++# CONFIG_KEYBOARD_STOWAWAY is not set + # CONFIG_INPUT_MOUSE is not set + # CONFIG_INPUT_JOYSTICK is not set + # CONFIG_INPUT_TABLET is not set +@@ -534,6 +561,7 @@ CONFIG_SPI_COLDFIRE_SSI_AUDIO=y + # CONFIG_VIDEO_DEV is not set + # CONFIG_DVB_CORE is not set + CONFIG_DAB=y ++# CONFIG_USB_DABUSB is not set + + # + # Graphics support +@@ -560,19 +588,144 @@ CONFIG_DUMMY_CONSOLE=y + CONFIG_HID_SUPPORT=y + CONFIG_HID=y + CONFIG_HID_DEBUG=y ++ ++# ++# USB Input Devices ++# ++CONFIG_USB_HID=y ++# CONFIG_USB_HIDINPUT_POWERBOOK is not set ++# CONFIG_HID_FF is not set ++# CONFIG_USB_HIDDEV is not set + CONFIG_USB_SUPPORT=y +-# CONFIG_USB_ARCH_HAS_HCD is not set ++CONFIG_USB_ARCH_HAS_HCD=y + # CONFIG_USB_ARCH_HAS_OHCI is not set +-# CONFIG_USB_ARCH_HAS_EHCI is not set ++CONFIG_USB_ARCH_HAS_EHCI=y ++CONFIG_USB=y ++# CONFIG_USB_DEBUG is not set ++ ++# ++# Miscellaneous USB options ++# ++CONFIG_USB_DEVICEFS=y ++# CONFIG_USB_DEVICE_CLASS is not set ++# CONFIG_USB_DYNAMIC_MINORS is not set ++# CONFIG_USB_OTG is not set ++ ++# ++# USB Host Controller Drivers ++# ++CONFIG_USB_EHCI_HCD=m ++CONFIG_USB_EHCI_SPLIT_ISO=y ++CONFIG_USB_EHCI_ROOT_HUB_TT=y ++# CONFIG_USB_EHCI_TT_NEWSCHED is not set ++CONFIG_USB_EHCI_BIG_ENDIAN_MMIO=y ++CONFIG_USB_EHCI_BIG_ENDIAN_DESC=y ++# CONFIG_USB_ISP116X_HCD is not set ++# CONFIG_USB_SL811_HCD is not set ++# CONFIG_USB_R8A66597_HCD is not set ++CONFIG_USB_M5445X_ULPI=y ++# CONFIG_USB_M5445X_FSLS is not set ++ ++# ++# USB Device Class drivers ++# ++# CONFIG_USB_ACM is not set ++# CONFIG_USB_PRINTER is not set + + # + # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' + # + + # ++# may also be needed; see USB_STORAGE Help for more information ++# ++CONFIG_USB_STORAGE=y ++# CONFIG_USB_STORAGE_DEBUG is not set ++# CONFIG_USB_STORAGE_DATAFAB is not set ++# CONFIG_USB_STORAGE_FREECOM is not set ++# CONFIG_USB_STORAGE_DPCM is not set ++# CONFIG_USB_STORAGE_USBAT is not set ++# CONFIG_USB_STORAGE_SDDR09 is not set ++# CONFIG_USB_STORAGE_SDDR55 is not set ++# CONFIG_USB_STORAGE_JUMPSHOT is not set ++# CONFIG_USB_STORAGE_ALAUDA is not set ++# CONFIG_USB_STORAGE_ONETOUCH is not set ++# CONFIG_USB_STORAGE_KARMA is not set ++# CONFIG_USB_LIBUSUAL is not set ++ ++# ++# USB Imaging devices ++# ++# CONFIG_USB_MDC800 is not set ++# CONFIG_USB_MICROTEK is not set ++# CONFIG_USB_MON is not set ++ ++# ++# USB port drivers ++# ++ ++# ++# USB Serial Converter support ++# ++# CONFIG_USB_SERIAL is not set ++ ++# ++# USB Miscellaneous drivers ++# ++# CONFIG_USB_EMI62 is not set ++# CONFIG_USB_EMI26 is not set ++# CONFIG_USB_ADUTUX is not set ++# CONFIG_USB_AUERSWALD is not set ++# CONFIG_USB_RIO500 is not set ++# CONFIG_USB_LEGOTOWER is not set ++# CONFIG_USB_LCD is not set ++# CONFIG_USB_BERRY_CHARGE is not set ++# CONFIG_USB_LED is not set ++# CONFIG_USB_CYPRESS_CY7C63 is not set ++# CONFIG_USB_CYTHERM is not set ++# CONFIG_USB_PHIDGET is not set ++# CONFIG_USB_IDMOUSE is not set ++# CONFIG_USB_FTDI_ELAN is not set ++# CONFIG_USB_APPLEDISPLAY is not set ++# CONFIG_USB_SISUSBVGA is not set ++# CONFIG_USB_LD is not set ++# CONFIG_USB_TRANCEVIBRATOR is not set ++# CONFIG_USB_IOWARRIOR is not set ++# CONFIG_USB_TEST is not set ++ ++# ++# USB DSL modem support ++# ++ ++# + # USB Gadget Support + # +-# CONFIG_USB_GADGET is not set ++CONFIG_USB_GADGET=m ++# CONFIG_USB_GADGET_DEBUG is not set ++# CONFIG_USB_GADGET_DEBUG_FILES is not set ++CONFIG_USB_GADGET_SELECTED=y ++# CONFIG_USB_GADGET_AMD5536UDC is not set ++# CONFIG_USB_GADGET_FSL_USB2 is not set ++# CONFIG_USB_GADGET_NET2280 is not set ++# CONFIG_USB_GADGET_PXA2XX is not set ++# CONFIG_USB_GADGET_M66592 is not set ++CONFIG_USB_GADGET_MCF5445X=y ++CONFIG_USB_MCF5445X=m ++# CONFIG_USB_GADGET_GOKU is not set ++# CONFIG_USB_GADGET_LH7A40X is not set ++# CONFIG_USB_GADGET_OMAP is not set ++# CONFIG_USB_GADGET_S3C2410 is not set ++# CONFIG_USB_GADGET_AT91 is not set ++# CONFIG_USB_GADGET_DUMMY_HCD is not set ++CONFIG_USB_GADGET_DUALSPEED=y ++# CONFIG_USB_ZERO is not set ++CONFIG_USB_ETH=m ++CONFIG_USB_ETH_RNDIS=y ++CONFIG_USB_GADGETFS=m ++CONFIG_USB_FILE_STORAGE=m ++# CONFIG_USB_FILE_STORAGE_TEST is not set ++# CONFIG_USB_G_SERIAL is not set ++# CONFIG_USB_MIDI_GADGET is not set + # CONFIG_MMC is not set + # CONFIG_NEW_LEDS is not set + # CONFIG_RTC_CLASS is not set +@@ -603,7 +756,9 @@ CONFIG_USB_SUPPORT=y + # + # File systems + # +-# CONFIG_EXT2_FS is not set ++CONFIG_EXT2_FS=y ++# CONFIG_EXT2_FS_XATTR is not set ++# CONFIG_EXT2_FS_XIP is not set + CONFIG_EXT3_FS=y + CONFIG_EXT3_FS_XATTR=y + # CONFIG_EXT3_FS_POSIX_ACL is not set diff --git a/target/linux/coldfire/patches/032-m5445x_edma_update.patch b/target/linux/coldfire/patches/032-m5445x_edma_update.patch new file mode 100644 index 0000000000..17f2becbd0 --- /dev/null +++ b/target/linux/coldfire/patches/032-m5445x_edma_update.patch @@ -0,0 +1,553 @@ +From 7b5b08d99d5362e9c36fd7d42d6c06c2a848266c Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Sun, 9 Dec 2007 02:21:19 -0700 +Subject: [PATCH] Update EDMA. + +LTIBName: m5445x-edma-update +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + drivers/spi/coldfire_edma.c | 261 +++++++++++++++++++++++--------------- + include/asm-m68k/coldfire_edma.h | 9 +- + include/asm-m68k/mcf5445x_edma.h | 28 +++- + 3 files changed, 188 insertions(+), 110 deletions(-) + +--- a/drivers/spi/coldfire_edma.c ++++ b/drivers/spi/coldfire_edma.c +@@ -20,76 +20,91 @@ + #include <linux/cdev.h> + #include <linux/seq_file.h> + #include <linux/proc_fs.h> ++#ifdef CONFIG_M54455 + #include <asm/mcf5445x_edma.h> + #include <asm/mcf5445x_intc.h> ++#endif /* CONFIG_M54455 */ + #include <asm/coldfire_edma.h> + +- +-/* callback handler data for each TCD */ ++/* ++ * Callback handler data for each TCD ++ */ + struct edma_isr_record { +- edma_irq_handler irq_handler; /* interrupt handler */ +- edma_error_handler error_handler; /* error interrupt handler */ +- void* dev; /* device used for the channel */ +- int allocated; /* busy flag */ +- spinlock_t *lock; /* spin lock (if needs to be locked in interrupt) */ +- const char* device_id; /* device id string, used in proc file system */ ++ edma_irq_handler irq_handler; /* interrupt handler */ ++ edma_error_handler error_handler; /* error interrupt handler */ ++ void *arg; /* argument to pass back */ ++ int allocated; /* busy flag */ ++ spinlock_t *lock; /* spin lock (optional) */ ++ const char *device_id; /* dev id string, used in procfs */ + }; + +-/* device structure */ ++/* ++ * Device structure ++ */ + struct coldfire_edma_dev { +- struct cdev cdev; /* character device */ +- struct edma_isr_record dma_interrupt_handlers[EDMA_CHANNELS]; /* channel handlers */ ++ struct cdev cdev; /* character device */ ++ struct edma_isr_record dma_interrupt_handlers[EDMA_CHANNELS]; + }; + + /* allocated major device number */ + static int coldfire_dma_major; ++ + /* device driver structure */ +-static struct coldfire_edma_dev* devp = NULL; ++static struct coldfire_edma_dev *devp = NULL; + + /* device driver file operations */ + struct file_operations coldfire_edma_fops = { + .owner = THIS_MODULE, + }; + +-/* eDMA channel interrupt handler */ ++/** ++ * dmaisr - eDMA channel interrupt handler ++ * @irq: interrupt number ++ * @dev_id: argument ++ */ + static int dmaisr(int irq, void *dev_id) + { + int channel = irq - EDMA_INT_CONTROLLER_BASE - EDMA_INT_CHANNEL_BASE; + int result = IRQ_HANDLED; + +- if (devp!=NULL && devp->dma_interrupt_handlers[channel].lock) { +- spin_lock(devp->dma_interrupt_handlers[channel].lock); +- } ++ if ((devp != NULL) && ++ (devp->dma_interrupt_handlers[channel].irq_handler)) { ++ /* call user irq handler */ ++ if (devp->dma_interrupt_handlers[channel].lock) ++ spin_lock(devp->dma_interrupt_handlers[channel].lock); ++ ++ result = devp->dma_interrupt_handlers[channel].irq_handler( ++ channel, devp->dma_interrupt_handlers[channel].arg); + +- if (devp!=NULL && devp->dma_interrupt_handlers[channel].irq_handler) { +- result = devp->dma_interrupt_handlers[channel].irq_handler(channel, +- devp->dma_interrupt_handlers[channel].dev); ++ if (devp->dma_interrupt_handlers[channel].lock) ++ spin_unlock(devp->dma_interrupt_handlers[channel].lock); + } else { ++ /* no irq handler so just ack it */ + confirm_edma_interrupt_handled(channel); +- printk(EDMA_DRIVER_NAME ": No handler for DMA channel %d\n", channel); +- } +- +- if (devp!=NULL && devp->dma_interrupt_handlers[channel].lock) { +- spin_unlock(devp->dma_interrupt_handlers[channel].lock); ++ printk(EDMA_DRIVER_NAME ": No handler for DMA channel %d\n", ++ channel); + } + + return result; + } + +-/* eDMA error interrupt handler */ ++/** ++ * dma_error_isr - eDMA error interrupt handler ++ * @irq: interrupt number ++ * @dev_id: argument ++ */ + static int dma_error_isr(int irq, void* dev_id) + { + u16 err; + int i; + + err = MCF_EDMA_ERR; +- for (i=0;i<EDMA_CHANNELS;i++) { ++ for (i=0; i<EDMA_CHANNELS; i++) { + if (err & (1<<i)) { +- if (devp!=NULL && devp->dma_interrupt_handlers[i].error_handler) { +- devp->dma_interrupt_handlers[i].error_handler(i, devp->dma_interrupt_handlers[i].dev); +- } else { ++ if (devp!=NULL && devp->dma_interrupt_handlers[i].error_handler) ++ devp->dma_interrupt_handlers[i].error_handler(i, devp->dma_interrupt_handlers[i].arg); ++ else + printk(KERN_WARNING EDMA_DRIVER_NAME ": DMA error on channel %d\n", i); +- } + } + } + +@@ -97,11 +112,26 @@ static int dma_error_isr(int irq, void* + return IRQ_HANDLED; + } + +-/* sets channel parameters */ ++/** ++ * set_edma_params - Set transfer control descriptor (TCD) ++ * @channel: channel number ++ * @source: source address ++ * @dest: destination address ++ * @attr: attributes ++ * @soff: source offset ++ * @nbytes: number of bytes to be transfered in minor loop ++ * @slast: last source address adjustment ++ * @citer: major loop count ++ * @biter: beginning minor loop count ++ * @doff: destination offset ++ * @dlast_sga: last destination address adjustment ++ * @major_int: generate interrupt after each major loop ++ * @disable_req: disable DMA request after major loop ++ */ + void set_edma_params(int channel, u32 source, u32 dest, +- u32 attr, u32 soff, u32 nbytes, u32 slast, +- u32 citer, u32 biter, u32 doff, u32 dlast_sga, +- int major_int, int disable_req) ++ u32 attr, u32 soff, u32 nbytes, u32 slast, ++ u32 citer, u32 biter, u32 doff, u32 dlast_sga, ++ int major_int, int disable_req) + { + + if (channel<0 || channel>EDMA_CHANNELS) +@@ -117,45 +147,56 @@ void set_edma_params(int channel, u32 so + MCF_EDMA_TCD_BITER(channel)=MCF_EDMA_TCD_BITER_BITER(biter); + MCF_EDMA_TCD_DOFF(channel) = MCF_EDMA_TCD_DOFF_DOFF(doff); + MCF_EDMA_TCD_DLAST_SGA(channel) = MCF_EDMA_TCD_DLAST_SGA_DLAST_SGA(dlast_sga); ++ + /* interrupt at the end of major loop */ +- if (major_int) { ++ if (major_int) + MCF_EDMA_TCD_CSR(channel) |= MCF_EDMA_TCD_CSR_INT_MAJOR; +- } else { ++ else + MCF_EDMA_TCD_CSR(channel) &= ~MCF_EDMA_TCD_CSR_INT_MAJOR; +- } ++ + /* disable request at the end of major loop of transfer or not*/ +- if (disable_req) { ++ if (disable_req) + MCF_EDMA_TCD_CSR(channel) |= MCF_EDMA_TCD_CSR_D_REQ; +- } else { ++ else + MCF_EDMA_TCD_CSR(channel) &= ~MCF_EDMA_TCD_CSR_D_REQ; +- } +- + } + EXPORT_SYMBOL(set_edma_params); + +-/* init eDMA controller */ ++/** ++ * init_edma - Initialize the eDMA controller ++ */ + void init_edma(void) + { + MCF_EDMA_CR = 0; + } + EXPORT_SYMBOL(init_edma); + +-/* request eDMA channel */ ++/** ++ * request_edma_channel - Request an eDMA channel ++ * @channel: channel number ++ * @handler: dma handler ++ * @error_handler: dma error handler ++ * @arg: argument to pass back ++ * @lock: optional spinlock to hold over interrupt ++ * @device_id: device id ++ * ++ * Returns 0 if success or a negative value if failure ++ */ + int request_edma_channel(int channel, +- edma_irq_handler handler, +- edma_error_handler error_handler, +- void* dev, +- spinlock_t *lock, +- const char* device_id ) ++ edma_irq_handler handler, ++ edma_error_handler error_handler, ++ void *arg, ++ spinlock_t *lock, ++ const char *device_id ) + { + if (devp!=NULL && channel>=0 && channel<=EDMA_CHANNELS) { +- if (devp->dma_interrupt_handlers[channel].allocated) { ++ if (devp->dma_interrupt_handlers[channel].allocated) + return -EBUSY; +- } ++ + devp->dma_interrupt_handlers[channel].allocated = 1; + devp->dma_interrupt_handlers[channel].irq_handler = handler; + devp->dma_interrupt_handlers[channel].error_handler = error_handler; +- devp->dma_interrupt_handlers[channel].dev = dev; ++ devp->dma_interrupt_handlers[channel].arg = arg; + devp->dma_interrupt_handlers[channel].lock = lock; + devp->dma_interrupt_handlers[channel].device_id = device_id; + return 0; +@@ -164,16 +205,22 @@ int request_edma_channel(int channel, + } + EXPORT_SYMBOL(request_edma_channel); + +-/* free eDMA channel */ +-int free_edma_channel(int channel, void* dev) ++/** ++ * free_edma_channel - Free the edma channel ++ * @channel: channel number ++ * @arg: argument created with ++ * ++ * Returns 0 if success or a negative value if failure ++ */ ++int free_edma_channel(int channel, void *arg) + { + if (devp!=NULL && channel>=0 && channel<=EDMA_CHANNELS) { + if (devp->dma_interrupt_handlers[channel].allocated) { +- if (devp->dma_interrupt_handlers[channel].dev != dev) { ++ if (devp->dma_interrupt_handlers[channel].arg != arg) + return -EBUSY; +- } ++ + devp->dma_interrupt_handlers[channel].allocated = 0; +- devp->dma_interrupt_handlers[channel].dev = NULL; ++ devp->dma_interrupt_handlers[channel].arg = NULL; + devp->dma_interrupt_handlers[channel].irq_handler = NULL; + devp->dma_interrupt_handlers[channel].error_handler = NULL; + devp->dma_interrupt_handlers[channel].lock = NULL; +@@ -184,7 +231,9 @@ int free_edma_channel(int channel, void* + } + EXPORT_SYMBOL(free_edma_channel); + +-/* clean-up device driver allocated resources */ ++/** ++ * coldfire_edma_cleanup - cleanup driver allocated resources ++ */ + static void coldfire_edma_cleanup(void) + { + dev_t devno; +@@ -192,13 +241,10 @@ static void coldfire_edma_cleanup(void) + + /* free interrupts/memory */ + if (devp) { +- for (i=0;i<EDMA_CHANNELS;i++) +- { +- MCF_INTC0_SIMR = EDMA_INT_CHANNEL_BASE+i; +- free_irq(EDMA_INT_CHANNEL_BASE+EDMA_INT_CONTROLLER_BASE+i, devp); +- } +- MCF_INTC0_SIMR = EDMA_INT_CHANNEL_BASE+EDMA_CHANNELS; +- free_irq(EDMA_INT_CHANNEL_BASE+EDMA_INT_CONTROLLER_BASE+EDMA_CHANNELS, devp); ++ for (i=0; i<EDMA_CHANNELS; i++) ++ free_irq(EDMA_INT_BASE+i, devp); ++ ++ free_irq(EDMA_INT_BASE+EDMA_INT_ERR, devp); + cdev_del(&devp->cdev); + kfree(devp); + } +@@ -209,30 +255,42 @@ static void coldfire_edma_cleanup(void) + } + + #ifdef CONFIG_PROC_FS +-/* proc file system support */ ++/* ++ * proc file system support ++ */ + + #define FREE_CHANNEL "free" + #define DEVICE_UNKNOWN "device unknown" + ++/** ++ * proc_edma_show - print out proc info ++ * @m: seq_file ++ * @v: ++ */ + static int proc_edma_show(struct seq_file *m, void *v) + { + int i; + +- if (devp==NULL) return 0; ++ if (devp == NULL) ++ return 0; + + for (i = 0 ; i < EDMA_CHANNELS ; i++) { + if (devp->dma_interrupt_handlers[i].allocated) { + if (devp->dma_interrupt_handlers[i].device_id) +- seq_printf(m, "%2d: %s\n", i, devp->dma_interrupt_handlers[i].device_id); ++ seq_printf(m, "%2d: %s\n", i, devp->dma_interrupt_handlers[i].device_id); + else + seq_printf(m, "%2d: %s\n", i, DEVICE_UNKNOWN); +- } else { ++ } else + seq_printf(m, "%2d: %s\n", i, FREE_CHANNEL); +- } + } + return 0; + } + ++/** ++ * proc_edma_open - open the proc file ++ * @inode: inode ptr ++ * @file: file ptr ++ */ + static int proc_edma_open(struct inode *inode, struct file *file) + { + return single_open(file, proc_edma_show, NULL); +@@ -245,6 +303,9 @@ static const struct file_operations proc + .release = single_release, + }; + ++/** ++ * proc_edma_init - initialize proc filesystem ++ */ + static int __init proc_edma_init(void) + { + struct proc_dir_entry *e; +@@ -258,7 +319,9 @@ static int __init proc_edma_init(void) + + #endif + +-/* initializes device driver */ ++/** ++ * coldfire_edma_init - eDMA module init ++ */ + static int __init coldfire_edma_init(void) + { + dev_t dev; +@@ -267,8 +330,9 @@ static int __init coldfire_edma_init(voi + + /* allocate free major number */ + result = alloc_chrdev_region(&dev, DMA_DEV_MINOR, 1, EDMA_DRIVER_NAME); +- if (result<0) { +- printk(KERN_WARNING EDMA_DRIVER_NAME": can't get major %d\n", result); ++ if (result < 0) { ++ printk(KERN_WARNING EDMA_DRIVER_NAME": can't get major %d\n", ++ result); + return result; + } + coldfire_dma_major = MAJOR(dev); +@@ -280,71 +344,68 @@ static int __init coldfire_edma_init(voi + goto fail; + } + +- /* init handlers (no handlers for beggining) */ +- for (i=0;i<EDMA_CHANNELS;i++) { ++ /* init handlers (no handlers for beginning) */ ++ for (i = 0; i < EDMA_CHANNELS; i++) { + devp->dma_interrupt_handlers[i].irq_handler = NULL; + devp->dma_interrupt_handlers[i].error_handler = NULL; +- devp->dma_interrupt_handlers[i].dev = NULL; ++ devp->dma_interrupt_handlers[i].arg = NULL; + devp->dma_interrupt_handlers[i].allocated = 0; + devp->dma_interrupt_handlers[i].lock = NULL; + devp->dma_interrupt_handlers[i].device_id = NULL; + } + +- /* register char device */ ++ /* register char device */ + cdev_init(&devp->cdev, &coldfire_edma_fops); + devp->cdev.owner = THIS_MODULE; + devp->cdev.ops = &coldfire_edma_fops; + result = cdev_add(&devp->cdev, dev, 1); + if (result) { +- printk(KERN_NOTICE EDMA_DRIVER_NAME": Error %d adding coldfire-dma device\n", result); ++ printk(KERN_NOTICE EDMA_DRIVER_NAME ++ ": Error %d adding coldfire-dma device\n", result); + result = -ENODEV; + goto fail; + } + + /* request/enable irq for each eDMA channel */ +- for (i=0;i<EDMA_CHANNELS;i++) +- { +- result = request_irq(EDMA_INT_CHANNEL_BASE+EDMA_INT_CONTROLLER_BASE+i, +- dmaisr, SA_INTERRUPT, EDMA_DRIVER_NAME, devp); ++ for (i = 0; i < EDMA_CHANNELS;i++) { ++ result = request_irq(EDMA_INT_BASE + i, ++ dmaisr, IRQF_DISABLED, ++ EDMA_DRIVER_NAME, devp); + if (result) { +- printk(KERN_WARNING EDMA_DRIVER_NAME": Cannot request irq %d\n", +- EDMA_INT_CHANNEL_BASE+EDMA_INT_CONTROLLER_BASE+i); ++ printk(KERN_WARNING EDMA_DRIVER_NAME ++ ": Cannot request irq %d\n", ++ (EDMA_INT_BASE + EDMA_INT_ERR+i)); + result = -EBUSY; + goto fail; + } +- +- MCF_INTC0_ICR(EDMA_INT_CHANNEL_BASE+i) = EDMA_IRQ_LEVEL; +- MCF_INTC0_CIMR = EDMA_INT_CHANNEL_BASE+i; +- + } + +- /* request error interrupt */ +- result = request_irq(EDMA_INT_CHANNEL_BASE + EDMA_INT_CONTROLLER_BASE + EDMA_CHANNELS, +- dma_error_isr, SA_INTERRUPT, EDMA_DRIVER_NAME, devp); ++ /* request error interrupt */ ++ result = request_irq(EDMA_INT_BASE + EDMA_INT_ERR, ++ dma_error_isr, IRQF_DISABLED, ++ EDMA_DRIVER_NAME, devp); + if (result) { +- printk(KERN_WARNING EDMA_DRIVER_NAME": Cannot request irq %d\n", +- EDMA_INT_CHANNEL_BASE+EDMA_INT_CONTROLLER_BASE+EDMA_CHANNELS); ++ printk(KERN_WARNING EDMA_DRIVER_NAME ++ ": Cannot request irq %d\n", ++ (EDMA_INT_BASE + EDMA_INT_ERR)); + result = -EBUSY; + goto fail; + } + +- /* enable error interrupt in interrupt controller */ +- MCF_INTC0_ICR(EDMA_INT_CHANNEL_BASE+EDMA_CHANNELS) = EDMA_IRQ_LEVEL; +- MCF_INTC0_CIMR = EDMA_INT_CHANNEL_BASE+EDMA_CHANNELS; +- + #ifdef CONFIG_PROC_FS + proc_edma_init(); + #endif + + printk(EDMA_DRIVER_NAME ": initialized successfully\n"); +- + return 0; + fail: + coldfire_edma_cleanup(); + return result; +- + } + ++/** ++ * coldfire_edma_exit - eDMA module exit ++ */ + static void __exit coldfire_edma_exit(void) + { + coldfire_edma_cleanup(); +@@ -354,5 +415,5 @@ module_init(coldfire_edma_init); + module_exit(coldfire_edma_exit); + + MODULE_LICENSE("GPL"); +-MODULE_AUTHOR("Yaroslav Vinogradov, Freescale Inc."); +-MODULE_DESCRIPTION("eDMA library for Coldfire 5445x"); ++MODULE_AUTHOR("Freescale Semiconductor, Inc."); ++MODULE_DESCRIPTION("eDMA library for Coldfire M5445x"); +--- a/include/asm-m68k/coldfire_edma.h ++++ b/include/asm-m68k/coldfire_edma.h +@@ -20,11 +20,14 @@ + #define EDMA_DRIVER_NAME "ColdFire-eDMA" + #define DMA_DEV_MINOR 1 + ++#ifdef CONFIG_M54455 + #define EDMA_INT_CHANNEL_BASE 8 + #define EDMA_INT_CONTROLLER_BASE 64 ++#define EDMA_INT_BASE (EDMA_INT_CHANNEL_BASE + \ ++ EDMA_INT_CONTROLLER_BASE) + #define EDMA_CHANNELS 16 +- +-#define EDMA_IRQ_LEVEL 5 ++#define EDMA_INT_ERR 16 /* edma error interrupt */ ++#endif /* CONFIG_M54455 */ + + typedef irqreturn_t (*edma_irq_handler)(int, void *); + typedef void (*edma_error_handler)(int, void *); +@@ -38,7 +41,7 @@ typedef void (*edma_error_handler)(int, + * nbytes - number of bytes to be transfered in minor loop + * slast - last source address adjustment + * citer - major loop count +- * biter - beggining minor loop count ++ * biter - begining minor loop count + * doff - destination offset + * dlast_sga - last destination address adjustment + * major_int - generate interrupt after each major loop +--- a/include/asm-m68k/mcf5445x_edma.h ++++ b/include/asm-m68k/mcf5445x_edma.h +@@ -11,11 +11,27 @@ + #ifndef __MCF5445X_EDMA_H__ + #define __MCF5445X_EDMA_H__ + +-/********************************************************************* +-* +-* Enhanced DMA (EDMA) +-* +-*********************************************************************/ ++/* ++ * Enhanced DMA (EDMA) ++ */ ++ ++/* Channels */ ++#define MCF_EDMA_CHAN_DREQ0 0 /* External DMA request 0 */ ++#define MCF_EDMA_CHAN_DREQ1 1 /* External DMA request 1 */ ++#define MCF_EDMA_CHAN_UART0_RX 2 /* UART0 Receive */ ++#define MCF_EDMA_CHAN_UART0_TX 3 /* UART0 Transmit */ ++#define MCF_EDMA_CHAN_UART1_RX 4 /* UART1 Receive */ ++#define MCF_EDMA_CHAN_UART1_TX 5 /* UART1 Transmit */ ++#define MCF_EDMA_CHAN_UART2_RX 6 /* UART2 Receive */ ++#define MCF_EDMA_CHAN_UART2_TX 7 /* UART2 Transmit */ ++#define MCF_EDMA_CHAN_TIMER0 8 /* Timer 0 / SSI0 Rx */ ++#define MCF_EDMA_CHAN_TIMER1 9 /* Timer 1 / SSI1 Rx */ ++#define MCF_EDMA_CHAN_TIMER2 10 /* Timer 2 / SSI0 Tx */ ++#define MCF_EDMA_CHAN_TIMER3 11 /* Timer 3 / SSI1 Tx */ ++#define MCF_EDMA_CHAN_DSPI_RX 12 /* DSPI Receive */ ++#define MCF_EDMA_CHAN_DSPI_TX 13 /* DSPI Transmit */ ++#define MCF_EDMA_CHAN_ATA_RX 14 /* ATA Receive */ ++#define MCF_EDMA_CHAN_ATA_TX 15 /* ATA Transmit */ + + /* Register read/write macros */ + #define MCF_EDMA_CR MCF_REG32(0xFC044000) +@@ -1453,6 +1469,4 @@ + #define MCF_EDMA_TCD15_CSR_LINKCH(x) (((x)&0x003F)<<8) + #define MCF_EDMA_TCD15_CSR_BWC(x) (((x)&0x0003)<<14) + +-/********************************************************************/ +- + #endif /* __MCF5445X_EDMA_H__ */ diff --git a/target/linux/coldfire/patches/033-m5445x_ssi_cleanup.patch b/target/linux/coldfire/patches/033-m5445x_ssi_cleanup.patch new file mode 100644 index 0000000000..068323b06d --- /dev/null +++ b/target/linux/coldfire/patches/033-m5445x_ssi_cleanup.patch @@ -0,0 +1,437 @@ +From 98e15babf1e25868d22c024dac6133cc29059d39 Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Sun, 9 Dec 2007 02:24:13 -0700 +Subject: [PATCH] Fix DMA mode and cleanup driver. + +LTIBName: m5445x-ssi-cleanup +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + drivers/spi/ssi_audio.c | 207 ++++++++++++++++++++++++----------------------- + 1 files changed, 104 insertions(+), 103 deletions(-) + +--- a/drivers/spi/ssi_audio.c ++++ b/drivers/spi/ssi_audio.c +@@ -2,7 +2,7 @@ + * MCF5445x audio driver. + * + * Yaroslav Vinogradov yaroslav.vinogradov@freescale.com +- * Copyright Freescale Semiconductor, Inc. 2006 ++ * Copyright Freescale Semiconductor, Inc. 2006, 2007 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by +@@ -25,9 +25,11 @@ + + #include <asm/coldfire.h> + #include <asm/coldfire_edma.h> ++#ifdef CONFIG_M54455 + #include <asm/mcf5445x_ssi.h> + #include <asm/mcf5445x_ccm.h> + #include <asm/mcf5445x_gpio.h> ++#endif + + #define SOUND_DEVICE_NAME "sound" + #define DRIVER_NAME "ssi_audio" +@@ -47,8 +49,8 @@ + + /* TLV320DAC23 audio chip registers */ + +-#define CODEC_LEFT_IN_REG (0x00) +-#define CODEC_RIGHT_IN_REG (0x01) ++#define CODEC_LEFT_IN_REG (0x00) ++#define CODEC_RIGHT_IN_REG (0x01) + #define CODEC_LEFT_HP_VOL_REG (0x02) + #define CODEC_RIGHT_HP_VOL_REG (0x03) + #define CODEC_ANALOG_APATH_REG (0x04) +@@ -57,7 +59,7 @@ + #define CODEC_DIGITAL_IF_FMT_REG (0x07) + #define CODEC_SAMPLE_RATE_REG (0x08) + #define CODEC_DIGITAL_IF_ACT_REG (0x09) +-#define CODEC_RESET_REG (0x0f) ++#define CODEC_RESET_REG (0x0f) + + #define CODEC_SAMPLE_8KHZ (0x0C) + #define CODEC_SAMPLE_16KHZ (0x58) +@@ -71,21 +73,21 @@ + /* DMA transfer size */ + #define DMASIZE (16*1024) + +-/* transmit eDMA channel for SSI channel 0 */ +-#define DMA_TCD 10 +-/* transmit eDMA channel for SSI channel 1 */ +-#define DMA_TCD2 11 ++/* eDMA channel for SSI channel 0 TX */ ++#define DMA_TCD MCF_EDMA_CHAN_TIMER2 ++/* eDMA channel for SSI channel 1 TX */ ++#define DMA_TCD2 MCF_EDMA_CHAN_TIMER3 + + struct ssi_audio { +- struct spi_device *spi; ++ struct spi_device *spi; + u32 speed; + u32 stereo; + u32 bits; + u32 format; +- u8 isopen; +- u8 dmaing; +- u8 ssi_enabled; +- u8 channel; ++ u8 isopen; ++ u8 dmaing; ++ u8 ssi_enabled; ++ u8 channel; + spinlock_t lock; + u8* audio_buf; + }; +@@ -129,7 +131,8 @@ static void ssi_audio_setsamplesize(int + } + + #ifdef AUDIO_DEBUG +- printk(DRIVER_NAME ":ssi_audio_setsamplesize %d %d\n", audio_device->format, audio_device->bits); ++ printk(DRIVER_NAME ":ssi_audio_setsamplesize %d %d\n", ++ audio_device->format, audio_device->bits); + #endif + } + +@@ -157,62 +160,57 @@ void __inline__ ssi_audio_dmarun(void) + { + set_edma_params(DMA_TCD, + #ifdef USE_MMU +- virt_to_phys(&(audio_device->audio_buf[audio_start])), ++ virt_to_phys(&(audio_device->audio_buf[audio_start])), + #else +- (u32)&(audio_device->audio_buf[audio_start]), ++ (u32)&(audio_device->audio_buf[audio_start]), + #endif +- (u32)&MCF_SSI_TX0, +- MCF_EDMA_TCD_ATTR_SSIZE_32BIT | MCF_EDMA_TCD_ATTR_DSIZE_32BIT, +- 8, +- 4, +- 0, +- audio_count/8, +- audio_count/8, +- 0, +- 0, +- 0, // major_int +- 0 // disable_req +- ); ++ (u32)&MCF_SSI_TX0, ++ MCF_EDMA_TCD_ATTR_SSIZE_32BIT | MCF_EDMA_TCD_ATTR_DSIZE_32BIT, ++ 8, ++ 4, ++ 0, ++ audio_count/8, ++ audio_count/8, ++ 0, ++ 0, ++ 0, // major_int ++ 0 // disable_req ++ ); + + set_edma_params(DMA_TCD2, + #ifdef USE_MMU +- virt_to_phys(&(audio_device->audio_buf[audio_start+4])), ++ virt_to_phys(&(audio_device->audio_buf[audio_start+4])), + #else +- (u32)&(audio_device->audio_buf[audio_start+4]), ++ (u32)&(audio_device->audio_buf[audio_start+4]), + #endif +- (u32)&MCF_SSI_TX1, +- MCF_EDMA_TCD_ATTR_SSIZE_32BIT | MCF_EDMA_TCD_ATTR_DSIZE_32BIT, +- 8, +- 4, +- 0, +- audio_count/8, +- audio_count/8, +- 0, +- 0, +- 1, // major_int +- 0 // disable_req +- ); ++ (u32)&MCF_SSI_TX1, ++ MCF_EDMA_TCD_ATTR_SSIZE_32BIT | MCF_EDMA_TCD_ATTR_DSIZE_32BIT, ++ 8, ++ 4, ++ 0, ++ audio_count/8, ++ audio_count/8, ++ 0, ++ 0, ++ 1, // major_int ++ 0 // disable_req ++ ); + + audio_device->dmaing = 1; + audio_txbusy = 1; + + start_edma_transfer(DMA_TCD); + start_edma_transfer(DMA_TCD2); +-#if 0 +- MCF_EDMA_ERQ |= (1<<DMA_TCD) | (1<<DMA_TCD2); +- MCF_EDMA_SSRT = DMA_TCD; +- MCF_EDMA_SSRT = DMA_TCD2; +-#endif +- + } + +-/* +- * Start DMA'ing a new buffer of data if any available. ++/** ++ * ssi_audio_dmabuf - Start DMA'ing a new buffer of data if any available. + */ + static void ssi_audio_dmabuf(void) + { + #ifdef AUDIO_DEBUG +- printk(DRIVER_NAME ":ssi_audio_dmabuf(): append=%x start=%x\n", audio_append, audio_appstart); ++ printk(DRIVER_NAME ":ssi_audio_dmabuf(): append=%x start=%x\n", ++ audio_append, audio_appstart); + #endif + + /* If already running then nothing to do... */ +@@ -241,7 +239,8 @@ static void ssi_audio_dmabuf(void) + } + } + +-void __inline__ stop_dma(void) { ++void __inline__ stop_dma(void) ++{ + stop_edma_transfer(DMA_TCD); + stop_edma_transfer(DMA_TCD2); + } +@@ -283,7 +282,6 @@ static void init_dma(void) + + #endif /* CONFIG_SSIAUDIO_USE_EDMA */ + +- + /* Write CODEC register using SPI + * address - CODEC register address + * data - data to be written into register +@@ -296,7 +294,8 @@ static int codec_write(u8 addr, u16 data + return -ENODEV; + + spi_word = ((addr & 0x7F)<<9)|(data & 0x1FF); +- return spi_write(audio_device->spi, (const u8*)&spi_word, sizeof(spi_word)); ++ return spi_write(audio_device->spi, (const u8*)&spi_word, ++ sizeof(spi_word)); + } + + static inline void enable_ssi(void) +@@ -359,7 +358,7 @@ static void init_audio_codec(void) + codec_write(CODEC_DIGITAL_APATH_REG, 0x007); /* Set A path */ + + /* set sample rate */ +- adjust_codec_speed(); ++ adjust_codec_speed(); + + codec_write(CODEC_LEFT_HP_VOL_REG, 0x075); /* set volume */ + codec_write(CODEC_RIGHT_HP_VOL_REG, 0x075); /* set volume */ +@@ -375,13 +374,12 @@ static void chip_init(void) + #endif + + /* Enable the SSI pins */ +- MCF_GPIO_PAR_SSI = ( 0 +- | MCF_GPIO_PAR_SSI_MCLK +- | MCF_GPIO_PAR_SSI_STXD(3) +- | MCF_GPIO_PAR_SSI_SRXD(3) +- | MCF_GPIO_PAR_SSI_FS(3) +- | MCF_GPIO_PAR_SSI_BCLK(3) ); +- ++ MCF_GPIO_PAR_SSI = (0 ++ | MCF_GPIO_PAR_SSI_MCLK ++ | MCF_GPIO_PAR_SSI_STXD(3) ++ | MCF_GPIO_PAR_SSI_SRXD(3) ++ | MCF_GPIO_PAR_SSI_FS(3) ++ | MCF_GPIO_PAR_SSI_BCLK(3) ); + } + + static void init_ssi(void) +@@ -430,8 +428,8 @@ static void init_ssi(void) + ; + + MCF_SSI_FCSR = 0 +- | MCF_SSI_FCSR_TFWM0(0) +- | MCF_SSI_FCSR_TFWM1(0) ++ | MCF_SSI_FCSR_TFWM0(2) ++ | MCF_SSI_FCSR_TFWM1(2) + ; + + MCF_SSI_IER = 0 // interrupts +@@ -459,9 +457,8 @@ static int ssi_audio_isr(int irq, void * + { + unsigned long *bp; + +- if (audio_txbusy==0) { ++ if (audio_txbusy==0) + return IRQ_HANDLED; +- } + + spin_lock(&(audio_device->lock)); + +@@ -560,7 +557,8 @@ static int ssi_audio_close(struct inode + } + + /* write to audio device */ +-static ssize_t ssi_audio_write(struct file *filp, const char *buf, size_t count, loff_t *ppos) ++static ssize_t ssi_audio_write(struct file *filp, const char *buf, ++ size_t count, loff_t *ppos) + { + unsigned long *dp, *buflp; + unsigned short *bufwp; +@@ -568,10 +566,12 @@ static ssize_t ssi_audio_write(struct fi + unsigned int slen, bufcnt, i, s, e; + + #ifdef AUDIO_DEBUG +- printk(DRIVER_NAME ":ssi_audio_write(buf=%x,count=%d)\n", (int) buf, count); ++ printk(DRIVER_NAME ":ssi_audio_write(buf=%x,count=%d)\n", ++ (int)buf, count); + #endif + +- if (audio_device==NULL) return (-ENODEV); ++ if (audio_device==NULL) ++ return (-ENODEV); + + if (count <= 0) + return 0; +@@ -592,8 +592,8 @@ static ssize_t ssi_audio_write(struct fi + + tryagain: + /* +- * Get a snapshot of buffer, so we can figure out how +- * much data we can fit in... ++ * Get a snapshot of buffer, so we can figure out how ++ * much data we can fit in... + */ + s = audio_start; + e = audio_append; +@@ -613,11 +613,12 @@ tryagain: + goto tryagain; + } + +- /* For DMA we need to have data as 32 bit +- values (since SSI TX register is 32 bit). +- So, the incomming 16 bit data must be put to buffer as 32 bit values. +- Also, the endianess is converted if needed +- */ ++ /* ++ * For DMA we need to have data as 32 bit ++ * values (since SSI TX register is 32 bit). ++ * So, the incoming 16 bit data must be put to buffer as 32 bit values. ++ * Also, the endianess is converted if needed ++ */ + if (audio_device->stereo) { + if (audio_device->bits == 16) { + if (audio_device->format==AFMT_S16_LE) { +@@ -678,16 +679,19 @@ tryagain: + } + + /* ioctl: control the driver */ +-static int ssi_audio_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg) ++static int ssi_audio_ioctl(struct inode *inode, struct file *filp, ++ unsigned int cmd, unsigned long arg) + { +- long val; +- int rc = 0; ++ long val; ++ int rc = 0; + + #ifdef AUDIO_DEBUG +- printk(DRIVER_NAME ":ssi_audio_ioctl(cmd=%x,arg=%x)\n", (int) cmd, (int) arg); ++ printk(DRIVER_NAME ":ssi_audio_ioctl(cmd=%x,arg=%x)\n", ++ (int)cmd, (int)arg); + #endif + +- if (audio_device==NULL) return (-ENODEV); ++ if (audio_device==NULL) ++ return (-ENODEV); + + switch (cmd) { + +@@ -744,8 +748,6 @@ static int ssi_audio_ioctl(struct inode + return rc; + } + +-/****************************************************************************/ +- + struct file_operations ssi_audio_fops = { + open: ssi_audio_open, /* open */ + release: ssi_audio_close, /* close */ +@@ -756,8 +758,8 @@ struct file_operations ssi_audio_fops = + /* initialize audio driver */ + static int __devinit ssi_audio_probe(struct spi_device *spi) + { +- struct ssi_audio *audio; +- int err; ++ struct ssi_audio *audio; ++ int err; + + #ifdef AUDIO_DEBUG + printk(DRIVER_NAME": probe\n"); +@@ -804,7 +806,7 @@ static int __devinit ssi_audio_probe(str + audio->spi = spi; + + #ifndef CONFIG_SSIAUDIO_USE_EDMA +- if (request_irq(spi->irq, ssi_audio_isr, SA_INTERRUPT, spi->dev.bus_id, audio)) { ++ if (request_irq(spi->irq, ssi_audio_isr, IRQF_DISABLED, spi->dev.bus_id, audio)) { + dev_dbg(&spi->dev, "irq %d busy?\n", spi->irq); + err = -EBUSY; + goto err_free_mem; +@@ -813,25 +815,21 @@ static int __devinit ssi_audio_probe(str + #else + /* request 2 eDMA channels since two channel output mode is used */ + if (request_edma_channel(DMA_TCD, +- ssi_audio_dma_handler_empty, +- NULL, +- audio, +- &(audio_device->lock), +- DRIVER_NAME +- )!=0) +- { ++ ssi_audio_dma_handler_empty, ++ NULL, ++ audio, ++ &(audio_device->lock), ++ DRIVER_NAME)!=0) { + dev_dbg(&spi->dev, "DMA channel %d busy?\n", DMA_TCD); + err = -EBUSY; + goto err_free_mem; + } + if (request_edma_channel(DMA_TCD2, +- ssi_audio_dma_handler, +- NULL, +- audio, +- &(audio_device->lock), +- DRIVER_NAME +- )!=0) +- { ++ ssi_audio_dma_handler, ++ NULL, ++ audio, ++ &(audio_device->lock), ++ DRIVER_NAME)!=0) { + dev_dbg(&spi->dev, "DMA channel %d busy?\n", DMA_TCD2); + err = -EBUSY; + goto err_free_mem; +@@ -870,11 +868,13 @@ static int __devexit ssi_audio_remove(st + return 0; + } + +-static int ssi_audio_suspend(struct spi_device *spi, pm_message_t message) { ++static int ssi_audio_suspend(struct spi_device *spi, pm_message_t message) ++{ + return 0; + } + +-static int ssi_audio_resume(struct spi_device *spi) { ++static int ssi_audio_resume(struct spi_device *spi) ++{ + return 0; + } + +@@ -902,5 +902,6 @@ static void __exit ssi_audio_exit(void) + } + module_exit(ssi_audio_exit); + +-MODULE_DESCRIPTION("SSI/I2S Audio Driver"); + MODULE_LICENSE("GPL"); ++MODULE_AUTHOR("Freescale Semiconductor, Inc."); ++MODULE_DESCRIPTION("SSI/I2S Audio Driver"); diff --git a/target/linux/coldfire/patches/034-m5445x_spi_deprecated_api.patch b/target/linux/coldfire/patches/034-m5445x_spi_deprecated_api.patch new file mode 100644 index 0000000000..7e96268cd5 --- /dev/null +++ b/target/linux/coldfire/patches/034-m5445x_spi_deprecated_api.patch @@ -0,0 +1,22 @@ +From b999c1fe5c6e5fa4f7e43fae02f59fc547d18093 Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Sun, 9 Dec 2007 02:24:57 -0700 +Subject: [PATCH] Fix use of deprecated API. + +LTIBName: m5445x-spi-deprecated-api +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + drivers/spi/spi_coldfire.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +--- a/drivers/spi/spi_coldfire.c ++++ b/drivers/spi/spi_coldfire.c +@@ -1311,7 +1311,7 @@ static int coldfire_spi_probe(struct pla + + irq = platform_info->irq_vector; + +- status = request_irq(platform_info->irq_vector, qspi_interrupt, SA_INTERRUPT, dev->bus_id, drv_data); ++ status = request_irq(platform_info->irq_vector, qspi_interrupt, IRQF_DISABLED, dev->bus_id, drv_data); + if (status < 0) { + dev_err(&pdev->dev, "unable to attach ColdFire QSPI interrupt\n"); + goto out_error_master_alloc; diff --git a/target/linux/coldfire/patches/035-mcfv4e_bitops_cleanup.patch b/target/linux/coldfire/patches/035-mcfv4e_bitops_cleanup.patch new file mode 100644 index 0000000000..c4f8cecdbc --- /dev/null +++ b/target/linux/coldfire/patches/035-mcfv4e_bitops_cleanup.patch @@ -0,0 +1,83 @@ +From 898b269952d096ce3f990c51b02457c27e16b83c Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Sun, 9 Dec 2007 02:25:49 -0700 +Subject: [PATCH] Clean up formatting. + +LTIBName: mcfv4e-bitops-cleanup +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + include/asm-m68k/bitops.h | 21 ++++++++++++++------- + 1 files changed, 14 insertions(+), 7 deletions(-) + +--- a/include/asm-m68k/bitops.h ++++ b/include/asm-m68k/bitops.h +@@ -478,7 +478,8 @@ static __inline__ int __constant_coldfir + return retval; + } + #else +-static __inline__ int __constant_coldfire_test_and_set_bit(int nr,volatile void * vaddr) ++static __inline__ int __constant_coldfire_test_and_set_bit(int nr, ++ volatile void *vaddr) + { + char retval; + volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3]; +@@ -516,7 +517,8 @@ static __inline__ void __constant_coldfi + : "+QUd" (*p) : "di" (nr & 7)); + } + #else +-static __inline__ void __constant_coldfire_set_bit(int nr, volatile void * vaddr) ++static __inline__ void __constant_coldfire_set_bit(int nr, ++ volatile void *vaddr) + { + volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3]; + __asm__ __volatile__ ("bset %1,(%3)" +@@ -524,7 +526,8 @@ static __inline__ void __constant_coldfi + } + #endif + +-static __inline__ void __generic_coldfire_set_bit(int nr, volatile void *vaddr) ++static __inline__ void __generic_coldfire_set_bit(int nr, ++ volatile void *vaddr) + { + __asm__ __volatile__ ("bset %1,%0" + : "=m" (((volatile char *)vaddr)[(nr^31) >> 3]) +@@ -552,7 +555,8 @@ static __inline__ int __constant_coldfir + return retval; + } + #else +-static __inline__ int __constant_coldfire_test_and_clear_bit(int nr, volatile void *vaddr) ++static __inline__ int __constant_coldfire_test_and_clear_bit(int nr, ++ volatile void *vaddr) + { + char retval; + volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3]; +@@ -599,7 +603,8 @@ static __inline__ void __constant_coldfi + : "+QUd" (*p) : "id" (nr & 7)); + } + #else +-static __inline__ void __constant_coldfire_clear_bit(int nr, volatile void * vaddr) ++static __inline__ void __constant_coldfire_clear_bit(int nr, ++ volatile void *vaddr) + { + volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3]; + __asm__ __volatile__ ("bclr %1,(%3)" +@@ -636,7 +641,8 @@ static __inline__ int __constant_coldfir + return retval; + } + #else +-static __inline__ int __constant_coldfire_test_and_change_bit(int nr, volatile void * vaddr) ++static __inline__ int __constant_coldfire_test_and_change_bit(int nr, ++ volatile void *vaddr) + { + char retval; + volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3]; +@@ -678,7 +684,8 @@ static __inline__ void __constant_coldfi + : "+QUd" (*p) : "id" (nr & 7)); + } + #else +-static __inline__ void __constant_coldfire_change_bit(int nr, volatile void * vaddr) ++static __inline__ void __constant_coldfire_change_bit(int nr, ++ volatile void *vaddr) + { + volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3]; + __asm__ __volatile__ ("bchg %1,(%3)" diff --git a/target/linux/coldfire/patches/036-m5445x_pci.patch b/target/linux/coldfire/patches/036-m5445x_pci.patch new file mode 100644 index 0000000000..abeaad42c3 --- /dev/null +++ b/target/linux/coldfire/patches/036-m5445x_pci.patch @@ -0,0 +1,251 @@ +From da8e8fe3d6ad5eb9589c8e77e7716e4f7e1a7499 Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Mon, 10 Dec 2007 03:36:05 -0700 +Subject: [PATCH] Coldfire M5445x PCI Bits. + +LTIBName: m5445x-pci +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + arch/m68k/Kconfig | 12 ++++++++++-- + arch/m68k/Makefile | 4 ++++ + arch/m68k/coldfire/config.c | 2 +- + arch/m68k/coldfire/iomap.c | 2 ++ + arch/m68k/coldfire/mcf5445x-devices.c | 9 +++++++++ + arch/m68k/coldfire/mcf5445x-pci.c | 5 +++-- + arch/m68k/coldfire/pci.c | 6 +++--- + arch/m68k/kernel/Makefile | 2 +- + drivers/macintosh/Kconfig | 1 - + drivers/pci/Makefile | 1 + + include/asm-m68k/io.h | 13 ++++++++++++- + include/asm-m68k/pci.h | 2 ++ + 12 files changed, 48 insertions(+), 11 deletions(-) + +--- a/arch/m68k/Kconfig ++++ b/arch/m68k/Kconfig +@@ -11,6 +11,14 @@ config MMU + bool + default y + ++config GENERIC_TIME ++ bool ++ default n ++ ++config GENERIC_CLOCKEVENTS ++ bool ++ default n ++ + config RWSEM_GENERIC_SPINLOCK + bool + default y +@@ -48,7 +56,7 @@ config ARCH_MAY_HAVE_PC_FDC + default y + + config NO_IOPORT +- def_bool y ++ def_bool !M54455 + + config NO_DMA + def_bool SUN3 +@@ -159,7 +167,7 @@ config HADES + + config PCI + bool +- depends on HADES ++ depends on HADES || M54455 + default y + help + Find out whether you have a PCI motherboard. PCI is the name of a +--- a/arch/m68k/Makefile ++++ b/arch/m68k/Makefile +@@ -32,6 +32,10 @@ ifdef CONFIG_SUN3 + LDFLAGS_vmlinux = -N + endif + ++ifdef CONFIG_COLDFIRE ++# LDFLAGS_vmlinux = --verbose ++endif ++ + CHECKFLAGS += -D__mc68000__ + + # without -fno-strength-reduce the 53c7xx.c driver fails ;-( +--- a/arch/m68k/coldfire/config.c ++++ b/arch/m68k/coldfire/config.c +@@ -252,7 +252,7 @@ void __init coldfire_sched_init(irq_hand + MCF_DTIM_DTMR_FRR | MCF_DTIM_DTMR_RST_EN, \ + MCF_DTIM0_DTMR); + +- request_irq(mcf_timervector, handler, SA_INTERRUPT, \ ++ request_irq(mcf_timervector, handler, IRQF_DISABLED, \ + "timer", (void *)MCF_DTIM0_DTMR); + + settimericr(1, mcf_timerlevel); +--- a/arch/m68k/coldfire/iomap.c ++++ b/arch/m68k/coldfire/iomap.c +@@ -12,6 +12,7 @@ + #include <linux/pci.h> + #include <asm/io.h> + ++#if 0 + void __iomem *__attribute__ ((weak)) + ioport_map(unsigned long port, unsigned int len) + { +@@ -52,3 +53,4 @@ void pci_iounmap(struct pci_dev *dev, vo + /* Nothing .. */ + } + EXPORT_SYMBOL(ioport_unmap); ++#endif +--- a/arch/m68k/coldfire/mcf5445x-devices.c ++++ b/arch/m68k/coldfire/mcf5445x-devices.c +@@ -75,10 +75,19 @@ static int ata_get_clk_rate(void) + return MCF_BUSCLK; + } + ++/* JKM -- move these to a header file */ ++#define MCF_IDE_DMA_WATERMARK 32 /* DMA watermark level in bytes */ ++#define MCF_IDE_DMA_BD_NR (512/3/4) /* number of BDs per channel */ ++ + static struct fsl_ata_platform_data ata_data = { + .init = ata_init, + .exit = ata_exit, + .get_clk_rate = ata_get_clk_rate, ++#ifdef CONFIG_PATA_FSL_USE_DMA ++ .udma_mask = 0x0F, /* the board handles up to UDMA3 */ ++ .fifo_alarm = MCF_IDE_DMA_WATERMARK / 2, ++ .max_sg = MCF_IDE_DMA_BD_NR, ++#endif + }; + + static struct resource pata_fsl_resources[] = { +--- a/arch/m68k/coldfire/mcf5445x-pci.c ++++ b/arch/m68k/coldfire/mcf5445x-pci.c +@@ -8,6 +8,7 @@ + */ + + #include <linux/delay.h> ++#include <linux/interrupt.h> + #include <linux/pci.h> + + #include <asm/mcfsim.h> +@@ -76,7 +77,7 @@ void mcf5445x_pci_dumpregs(void); + #endif + + /* +- * static void mcf5445x_conf_device(struct pci_dev *dev) ++ * mcf5445x_conf_device(struct pci_dev *dev) + * + * Machine dependent Configure the given device. + * +@@ -84,7 +85,7 @@ void mcf5445x_pci_dumpregs(void); + * + * dev - the pci device. + */ +-void __init ++void + mcf5445x_conf_device(struct pci_dev *dev) + { + set_fpga(FPGA_PCI_IRQ_ENABLE, 0x0f); +--- a/arch/m68k/coldfire/pci.c ++++ b/arch/m68k/coldfire/pci.c +@@ -56,7 +56,7 @@ struct pci_ops pci_root_ops = { + * + * Initialize the pcibios based on cmd line params. + */ +-char * __init ++char * + pcibios_setup(char *str) + { + if (!strcmp(str, "debug")) { +@@ -124,7 +124,7 @@ pcibios_map_irq(struct pci_dev *dev, u8 + * + * Update a PCI interrupt. + */ +-void __init ++void + pcibios_update_irq(struct pci_dev *dev, int irq) + { + pci_write_config_byte(dev, PCI_INTERRUPT_LINE, irq); +@@ -171,7 +171,7 @@ pcibios_enable_device(struct pci_dev *de + /* + * pcibios_fixup_bus(struct pci_bus *bus) + */ +-void __init ++void + pcibios_fixup_bus(struct pci_bus *bus) + { + struct pci_dev *dev = bus->self; +--- a/arch/m68k/kernel/Makefile ++++ b/arch/m68k/kernel/Makefile +@@ -9,6 +9,7 @@ else + ifndef CONFIG_COLDFIRE + extra-y := head.o vmlinux.lds + obj-y := entry.o signal.o traps.o ints.o ++ obj-$(CONFIG_PCI) += bios32.o + else # CONFIG_COLDFIRE + extra-y := ../coldfire/head.o vmlinux.lds + endif +@@ -19,7 +20,6 @@ obj-y += process.o ptrace.o module.o \ + + devres-y = ../../../kernel/irq/devres.o + +-obj-$(CONFIG_PCI) += bios32.o + obj-y$(CONFIG_MMU_SUN3) += dma.o # no, it's not a typo + + EXTRA_AFLAGS := -traditional +--- a/drivers/macintosh/Kconfig ++++ b/drivers/macintosh/Kconfig +@@ -118,7 +118,6 @@ config PMAC_SMU + + config PMAC_APM_EMU + tristate "APM emulation" +- select APM_EMULATION + depends on ADB_PMU && PM && PPC32 + + config PMAC_MEDIABAY +--- a/drivers/pci/Makefile ++++ b/drivers/pci/Makefile +@@ -39,6 +39,7 @@ obj-$(CONFIG_PPC) += setup-bus.o + obj-$(CONFIG_MIPS) += setup-bus.o setup-irq.o + obj-$(CONFIG_X86_VISWS) += setup-irq.o + obj-$(CONFIG_MN10300) += setup-bus.o ++obj-$(CONFIG_M54455) += setup-bus.o setup-irq.o + + # + # ACPI Related PCI FW Functions +--- a/include/asm-m68k/io.h ++++ b/include/asm-m68k/io.h +@@ -306,7 +306,18 @@ static inline void isa_delay(void) + #define outw(val,port) out_le16((port),(val)) + #define inl(port) in_le32(port) + #define outl(val,port) out_le32((port),(val)) +- ++#define insb(port, buf, nr) \ ++ raw_insb((u8 *)(port), (u8 *)(buf), (nr)) ++#define outsb(port, buf, nr) \ ++ raw_outsb((u8 *)(port), (u8 *)(buf), (nr)) ++#define insw(port, buf, nr) \ ++ raw_insw_swapw((u16 *)(port), (u16 *)(buf), (nr)) ++#define outsw(port, buf, nr) \ ++ raw_outsw_swapw((u16 *)(port), (u16 *)(buf), (nr)) ++#define insl(port, buf, nr) \ ++ raw_insw_swapw((u16 *)(port), (u16 *)(buf), (nr)<<1) ++#define outsl(port, buf, nr) \ ++ raw_outsw_swapw((u16 *)(port), (u16 *)(buf), (nr)<<1) + #else + /* + * kernel with both ISA and PCI compiled in, those have +--- a/include/asm-m68k/pci.h ++++ b/include/asm-m68k/pci.h +@@ -42,11 +42,13 @@ pcibios_penalize_isa_irq(int irq, int ac + /* no dynamic PCI IRQ allocation */ + } + ++#if 0 + static inline void + pcibios_add_platform_entries(struct pci_dev *dev) + { + /* no special handling */ + } ++#endif + + static inline void + pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region, diff --git a/target/linux/coldfire/patches/037-m5445x_edma_callback.patch b/target/linux/coldfire/patches/037-m5445x_edma_callback.patch new file mode 100644 index 0000000000..af2705c63b --- /dev/null +++ b/target/linux/coldfire/patches/037-m5445x_edma_callback.patch @@ -0,0 +1,90 @@ +From acd937ac924aefd22ea9a66ea621ab80a4f9b594 Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Mon, 10 Dec 2007 03:37:19 -0700 +Subject: [PATCH] Update EDMA driver to allow callback/arg changes. + +LTIBName: m5445x-edma-callback +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + drivers/spi/coldfire_edma.c | 27 +++++++++++++++++++++++++++ + include/asm-m68k/coldfire_edma.h | 20 ++++++++++++++++++++ + 2 files changed, 47 insertions(+), 0 deletions(-) + +--- a/drivers/spi/coldfire_edma.c ++++ b/drivers/spi/coldfire_edma.c +@@ -206,6 +206,31 @@ int request_edma_channel(int channel, + EXPORT_SYMBOL(request_edma_channel); + + /** ++ * set_edma_callback - Update the channel callback/arg ++ * @channel: channel number ++ * @handler: dma handler ++ * @error_handler: dma error handler ++ * @arg: argument to pass back ++ * ++ * Returns 0 if success or a negative value if failure ++ */ ++int set_edma_callback(int channel, ++ edma_irq_handler handler, ++ edma_error_handler error_handler, ++ void *arg ) ++{ ++ if (devp!=NULL && channel>=0 && channel<=EDMA_CHANNELS && ++ devp->dma_interrupt_handlers[channel].allocated) { ++ devp->dma_interrupt_handlers[channel].irq_handler = handler; ++ devp->dma_interrupt_handlers[channel].error_handler = error_handler; ++ devp->dma_interrupt_handlers[channel].arg = arg; ++ return 0; ++ } ++ return -EINVAL; ++} ++EXPORT_SYMBOL(set_edma_callback); ++ ++/** + * free_edma_channel - Free the edma channel + * @channel: channel number + * @arg: argument created with +@@ -216,8 +241,10 @@ int free_edma_channel(int channel, void + { + if (devp!=NULL && channel>=0 && channel<=EDMA_CHANNELS) { + if (devp->dma_interrupt_handlers[channel].allocated) { ++#if 0 + if (devp->dma_interrupt_handlers[channel].arg != arg) + return -EBUSY; ++#endif + + devp->dma_interrupt_handlers[channel].allocated = 0; + devp->dma_interrupt_handlers[channel].arg = NULL; +--- a/include/asm-m68k/coldfire_edma.h ++++ b/include/asm-m68k/coldfire_edma.h +@@ -96,10 +96,30 @@ int request_edma_channel(int channel, + void *dev, + spinlock_t *lock, + const char *device_id); ++ ++/** ++ * set_edma_callback - Update the channel callback/arg ++ * @channel: channel number ++ * @handler: dma handler ++ * @error_handler: dma error handler ++ * @arg: argument to pass back ++ * ++ * Returns 0 if success or a negative value if failure ++ */ ++int set_edma_callback(int channel, ++ edma_irq_handler handler, ++ edma_error_handler error_handler, ++ void *arg); + + /* Free eDMA channel + * channel - eDMA TCD number + * dev - device + */ + int free_edma_channel(int channel, void *dev); ++ ++/* ++ * DMA Modes ++ */ ++#define DMA_MODE_READ 0 ++#define DMA_MODE_WRITE 1 + #endif diff --git a/target/linux/coldfire/patches/038-m5445x_audio_rates.patch b/target/linux/coldfire/patches/038-m5445x_audio_rates.patch new file mode 100644 index 0000000000..09e47c4142 --- /dev/null +++ b/target/linux/coldfire/patches/038-m5445x_audio_rates.patch @@ -0,0 +1,77 @@ +From de5f4660856350ac43f642bb7c5adf063fc68287 Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Mon, 10 Dec 2007 13:15:33 -0700 +Subject: [PATCH] Fix to allow playback at other than 44.1. + +LTIBName: m5445x-audio-rates +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + drivers/spi/ssi_audio.c | 34 ++++++++++++++++++++++++---------- + 1 files changed, 24 insertions(+), 10 deletions(-) + +--- a/drivers/spi/ssi_audio.c ++++ b/drivers/spi/ssi_audio.c +@@ -34,7 +34,6 @@ + #define SOUND_DEVICE_NAME "sound" + #define DRIVER_NAME "ssi_audio" + +- + /* #define AUDIO_DEBUG */ + + #ifdef CONFIG_MMU +@@ -315,24 +314,36 @@ static inline void disable_ssi(void) + } + + /* Audio CODEC initialization */ +-/* TODO: also the SSI frequency/dividers must be adjusted */ + static void adjust_codec_speed(void) { + #ifdef AUDIO_DEBUG + printk(DRIVER_NAME ":adjust_codec_speed: %d\n", audio_device->speed); + #endif +- +- if (audio_device->speed == 8000) { ++ disable_ssi(); ++ switch (audio_device->speed) { ++ case 8000: ++ MCF_CCM_CDR = MCF_CCM_CDR_SSIDIV(255); + codec_write(CODEC_SAMPLE_RATE_REG,CODEC_SAMPLE_8KHZ); +- } else if (audio_device->speed == 16000) { ++ break; ++ case 16000: ++ MCF_CCM_CDR = MCF_CCM_CDR_SSIDIV(129); + codec_write(CODEC_SAMPLE_RATE_REG,CODEC_SAMPLE_16KHZ); +- } else if (audio_device->speed == 22000) { ++ break; ++ case 22000: ++ case 22050: ++ MCF_CCM_CDR = MCF_CCM_CDR_SSIDIV(94); + codec_write(CODEC_SAMPLE_RATE_REG,CODEC_SAMPLE_22KHZ); +- } else if (audio_device->speed == 44000 || audio_device->speed == 44100) { ++ break; ++ case 44000: ++ case 44100: ++ MCF_CCM_CDR = MCF_CCM_CDR_SSIDIV(47); + codec_write(CODEC_SAMPLE_RATE_REG,CODEC_SAMPLE_44KHZ); +- } else if (audio_device->speed == 48000) { ++ break; ++ case 48000: ++ MCF_CCM_CDR = MCF_CCM_CDR_SSIDIV(42); + codec_write(CODEC_SAMPLE_RATE_REG,CODEC_SAMPLE_48KHZ); +- } else { +- /* default 44KHz */ ++ break; ++ default: ++ MCF_CCM_CDR = MCF_CCM_CDR_SSIDIV(47); + codec_write(CODEC_SAMPLE_RATE_REG,CODEC_SAMPLE_44KHZ); + } + } +@@ -712,6 +723,9 @@ static int ssi_audio_ioctl(struct inode + case SNDCTL_DSP_SAMPLESIZE: + if (access_ok(VERIFY_READ, (void *) arg, sizeof(val))) { + get_user(val, (unsigned long *) arg); ++#ifdef AUDIO_DEBUG ++ printk(DRIVER_NAME ":ssi_audio_ioctl: SNDCTL_DSP_SAMPLESIZE: %d\n", val); ++#endif + ssi_audio_txdrain(); + ssi_audio_setsamplesize(val); + } else { diff --git a/target/linux/coldfire/patches/039-mcfv4e_kbuild_flags_update.patch b/target/linux/coldfire/patches/039-mcfv4e_kbuild_flags_update.patch new file mode 100644 index 0000000000..e560749569 --- /dev/null +++ b/target/linux/coldfire/patches/039-mcfv4e_kbuild_flags_update.patch @@ -0,0 +1,32 @@ +From ea71d637a9d8606624056fad67d050face9fc03c Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Fri, 15 Feb 2008 15:32:35 -0700 +Subject: [PATCH] Update to use KBUILD_ for CFLAGS and AFLAGS. + +LTIBName: mcfv4e-kbuild-flags-update +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + arch/m68k/Makefile | 5 +++-- + 1 files changed, 3 insertions(+), 2 deletions(-) + +--- a/arch/m68k/Makefile ++++ b/arch/m68k/Makefile +@@ -33,6 +33,7 @@ LDFLAGS_vmlinux = -N + endif + + ifdef CONFIG_COLDFIRE ++# OBJCOPYFLAGS := -R .note -R .note.gnu.build-id -R .comment -S + # LDFLAGS_vmlinux = --verbose + endif + +@@ -59,8 +60,8 @@ endif + endif + + ifdef CONFIG_M54455 +-CFLAGS := $(CFLAGS) -march=isac -mcpu=54455 -msoft-float -g +-AFLAGS := $(AFLAGS) -march=isac -mcpu=54455 -msoft-float ++KBUILD_CFLAGS += -march=isac -mcpu=54455 -msoft-float -g ++KBUILD_AFLAGS += -march=isac -mcpu=54455 -msoft-float + endif + + ifdef CONFIG_KGDB diff --git a/target/linux/coldfire/patches/040-m5445x_usb_header_move.patch b/target/linux/coldfire/patches/040-m5445x_usb_header_move.patch new file mode 100644 index 0000000000..a131d56def --- /dev/null +++ b/target/linux/coldfire/patches/040-m5445x_usb_header_move.patch @@ -0,0 +1,22 @@ +From 9d8ff9acf372506a60b2e54964d230e0a5a95eb1 Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Fri, 15 Feb 2008 15:33:23 -0700 +Subject: [PATCH] Change linux/usb_gadget.h to linux/usb/gadget.h + +LTIBName: m5445x-usb-header-move +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + drivers/usb/gadget/mcf5445x_udc.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +--- a/drivers/usb/gadget/mcf5445x_udc.c ++++ b/drivers/usb/gadget/mcf5445x_udc.c +@@ -57,7 +57,7 @@ + #include <linux/moduleparam.h> + #include <linux/device.h> + #include <linux/usb/ch9.h> +-#include <linux/usb_gadget.h> ++#include <linux/usb/gadget.h> + #include <linux/usb/otg.h> + #include <linux/dma-mapping.h> + #include <linux/dmapool.h> diff --git a/target/linux/coldfire/patches/041-mcfv4e_bitops_lock_hdr.patch b/target/linux/coldfire/patches/041-mcfv4e_bitops_lock_hdr.patch new file mode 100644 index 0000000000..7117629b2b --- /dev/null +++ b/target/linux/coldfire/patches/041-mcfv4e_bitops_lock_hdr.patch @@ -0,0 +1,21 @@ +From ff3d02768c1cbfbc1f0f07db4aef3d500101e4a7 Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Fri, 15 Feb 2008 15:34:06 -0700 +Subject: [PATCH] Add generic lock header. + +LTIBName: mcfv4e-bitops-lock-hdr +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + include/asm-m68k/bitops.h | 1 + + 1 files changed, 1 insertions(+), 0 deletions(-) + +--- a/include/asm-m68k/bitops.h ++++ b/include/asm-m68k/bitops.h +@@ -874,6 +874,7 @@ static __inline__ int fls(int x) + #include <asm-generic/bitops/fls64.h> + #include <asm-generic/bitops/sched.h> + #include <asm-generic/bitops/hweight.h> ++#include <asm-generic/bitops/lock.h> + + #define minix_find_first_zero_bit(addr, size) find_next_zero_bit((addr), \ + (size), 0) diff --git a/target/linux/coldfire/patches/042-m5445x_pata_24_cleanup.patch b/target/linux/coldfire/patches/042-m5445x_pata_24_cleanup.patch new file mode 100644 index 0000000000..0229987781 --- /dev/null +++ b/target/linux/coldfire/patches/042-m5445x_pata_24_cleanup.patch @@ -0,0 +1,49 @@ +From 329eae71bdbe9e30f76164ba3dd5ef0dba932eef Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Fri, 15 Feb 2008 15:34:58 -0700 +Subject: [PATCH] Remove .port_disable and .irq_ack for 2.6.24. + +LTIBName: m5445x-pata-24-cleanup +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + drivers/ata/pata_fsl.c | 15 --------------- + 1 files changed, 0 insertions(+), 15 deletions(-) + +--- a/drivers/ata/pata_fsl.c ++++ b/drivers/ata/pata_fsl.c +@@ -497,19 +497,6 @@ err_out: + } + #endif /* CONFIG_FSL_PATA_USE_DMA */ + +-static u8 pata_fsl_irq_ack(struct ata_port *ap, unsigned int chk_drq) +-{ +- unsigned int bits = chk_drq ? ATA_BUSY | ATA_DRQ : ATA_BUSY; +- u8 status; +- +- status = ata_busy_wait(ap, bits, 1000); +- if (status & bits) +- if (ata_msg_err(ap)) +- printk(KERN_ERR "abnormal status 0x%X\n", status); +- +- return status; +-} +- + static void ata_dummy_noret(struct ata_port *ap) { return; } + + static struct scsi_host_template pata_fsl_sht = { +@@ -538,7 +525,6 @@ static struct ata_port_operations pata_f + .set_dmamode = pata_fsl_set_dmamode, + #endif + +- .port_disable = ata_port_disable, + .tf_load = ata_tf_load, + .tf_read = ata_tf_read, + .check_status = ata_check_status, +@@ -563,7 +549,6 @@ static struct ata_port_operations pata_f + + .irq_clear = ata_dummy_noret, + .irq_on = ata_irq_on, +- .irq_ack = pata_fsl_irq_ack, + + .port_start = pata_fsl_port_start, + diff --git a/target/linux/coldfire/patches/043-m5445x_spi_cdev_remove.patch b/target/linux/coldfire/patches/043-m5445x_spi_cdev_remove.patch new file mode 100644 index 0000000000..077f74d5a0 --- /dev/null +++ b/target/linux/coldfire/patches/043-m5445x_spi_cdev_remove.patch @@ -0,0 +1,31 @@ +From 13e26ba450f92bafe7dde67ad68779eeea65a53f Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Fri, 15 Feb 2008 15:36:04 -0700 +Subject: [PATCH] Remove cdev as the structure has changed for 2.6.24. + +LTIBName: m5445x-spi-cdev-remove +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + drivers/spi/spi_coldfire.c | 4 ++-- + 1 files changed, 2 insertions(+), 2 deletions(-) + +--- a/drivers/spi/spi_coldfire.c ++++ b/drivers/spi/spi_coldfire.c +@@ -1115,7 +1115,7 @@ static int init_queue(struct driver_data + INIT_WORK(&drv_data->pump_messages, pump_messages/*, drv_data*/); + + drv_data->workqueue = create_singlethread_workqueue( +- drv_data->master->cdev.dev->bus_id); ++ drv_data->master->dev.parent->bus_id); + if (drv_data->workqueue == NULL) + return -EBUSY; + +@@ -1223,7 +1223,7 @@ static int coldfire_spi_probe(struct pla + if (!master) + return -ENOMEM; + +- drv_data = class_get_devdata(&master->cdev); ++ drv_data = spi_master_get_devdata(master); + drv_data->master = master; + + INIT_LIST_HEAD(&drv_data->queue); diff --git a/target/linux/coldfire/patches/044-m547x_8x_initial.patch b/target/linux/coldfire/patches/044-m547x_8x_initial.patch new file mode 100644 index 0000000000..e313a36381 --- /dev/null +++ b/target/linux/coldfire/patches/044-m547x_8x_initial.patch @@ -0,0 +1,3403 @@ +From 5b8edb0ea5cafb522e21b2973eaff6298062dd81 Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Thu, 28 Feb 2008 10:56:17 -0700 +Subject: [PATCH] Initial M547x/M548x port. + +LTIBName: m547x-8x-initial +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + arch/m68k/Kconfig | 84 ++++- + arch/m68k/Makefile | 4 + + arch/m68k/coldfire/config.c | 112 +++++- + arch/m68k/coldfire/head.S | 153 ++++++- + arch/m68k/coldfire/ints.c | 78 ++++- + arch/m68k/configs/m5485evb_defconfig | 777 ++++++++++++++++++++++++++++++++++ + drivers/serial/mcfserial.c | 45 ++- + include/asm-m68k/cf_pgalloc.h | 5 + + include/asm-m68k/cfcache.h | 28 ++- + include/asm-m68k/coldfire.h | 7 + + include/asm-m68k/m5485gpio.h | 694 ++++++++++++++++++++++++++++++ + include/asm-m68k/m5485gpt.h | 88 ++++ + include/asm-m68k/m5485psc.h | 474 +++++++++++++++++++++ + include/asm-m68k/m5485sim.h | 219 ++++++++++ + include/asm-m68k/mcfsim.h | 5 + + include/asm-m68k/mcfuart.h | 14 + + include/asm-m68k/mmu_context.h | 72 ++++ + include/asm-m68k/page_offset.h | 5 + + 18 files changed, 2824 insertions(+), 40 deletions(-) + create mode 100644 arch/m68k/configs/m5485evb_defconfig + create mode 100644 include/asm-m68k/m5485gpio.h + create mode 100644 include/asm-m68k/m5485gpt.h + create mode 100644 include/asm-m68k/m5485psc.h + create mode 100644 include/asm-m68k/m5485sim.h + +--- a/arch/m68k/Kconfig ++++ b/arch/m68k/Kconfig +@@ -56,7 +56,7 @@ config ARCH_MAY_HAVE_PC_FDC + default y + + config NO_IOPORT +- def_bool !M54455 ++ def_bool !(M54455 || M547X_8X) + + config NO_DMA + def_bool SUN3 +@@ -319,20 +319,80 @@ config M68060 + config M54455 + bool "MCF54455 support" + depends on COLDFIRE +- default y + help + This option will add support for the MCF54455 processor with mmu. + ++config M547X_8X ++ bool "MCF547x/MCF548x support" ++ depends on COLDFIRE ++ help ++ This option will add support for the MCF547x/MCF548x processor with mmu. ++ ++config M547X ++ bool ++ depends on M547X_8X ++ default n ++ ++config M548X ++ bool ++ depends on M547X_8X ++ default n ++ ++choice ++ prompt "Model" ++ depends on M547X_8X ++ default M5485CFE ++ config M5475AFE ++ bool "MCF5475AFE" ++ select M547X ++ config M5475BFE ++ bool "MCF5475BFE" ++ select M547X ++ config M5475CFE ++ bool "MCF5475CFE" ++ select M547X ++ config M5475DFE ++ bool "MCF5475DFE" ++ select M547X ++ config M5475EFE ++ bool "MCF5475EFE" ++ select M547X ++ config M5475FFE ++ bool "MCF5475FFE" ++ select M547X ++ ++ config M5485AFE ++ bool "MCF5485AFE" ++ select M548X ++ config M5485BFE ++ bool "MCF5485BFE" ++ select M548X ++ config M5485CFE ++ bool "MCF5485CFE" ++ select M548X ++ config M5485DFE ++ bool "MCF5485DFE" ++ select M548X ++ config M5485EFE ++ bool "MCF5485EFE" ++ select M548X ++ config M5485FFE ++ bool "MCF5485FFE" ++ select M548X ++ ++endchoice ++ + config MCFCLK +- int "M54455EVB System Clock" +- depends on M54455 +- default 266666666 ++ int ++ default 266666666 if M54455 ++ default 266000000 if M547X ++ default 200000000 if M548X + help +- System clock for EVB. Usually 266MHz for u-boot and 200MHz for dBUG. ++ Coldfire System clock. + + config MCF_USER_HALT + bool "Coldfire User Halt Enable" +- depends on M54455 ++ depends on M54455 || M547X_8X + default n + help + Enables the HALT instruction in User Mode. +@@ -350,13 +410,15 @@ config MMU_CFV4E + + config SDRAM_BASE + hex +- depends on M54455 +- default 0x40000000 ++ depends on COLDFIRE ++ default 0x40000000 if M54455 ++ default 0x00000000 if M547X_8X + + config SDRAM_SIZE + hex +- depends on M54455 +- default 0x0FFFFFFF ++ depends on COLDFIRE ++ default 0x0FFFFFFF if M54455 ++ default 0x04000000 if M547X_8X + + config NOR_FLASH_BASE + hex "NOR Flash Base Address" +--- a/arch/m68k/Makefile ++++ b/arch/m68k/Makefile +@@ -63,6 +63,10 @@ ifdef CONFIG_M54455 + KBUILD_CFLAGS += -march=isac -mcpu=54455 -msoft-float -g + KBUILD_AFLAGS += -march=isac -mcpu=54455 -msoft-float + endif ++ifdef CONFIG_M547X_8X ++KBUILD_CFLAGS += -mcfv4e -g ++KBUILD_AFLAGS += -mcfv4e ++endif + + ifdef CONFIG_KGDB + # If configured for kgdb support, include debugging infos and keep the +--- a/arch/m68k/coldfire/config.c ++++ b/arch/m68k/coldfire/config.c +@@ -1,8 +1,9 @@ + /* +- * linux/arch/m68k/coldifre/config.c ++ * linux/arch/m68k/coldfire/config.c + * ++ * Kurt Mahan kmahan@freescale.com + * Matt Waddel Matt.Waddel@freescale.com +- * Copyright Freescale Semiconductor, Inc. 2007 ++ * Copyright Freescale Semiconductor, Inc. 2007, 2008 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by +@@ -32,11 +33,16 @@ + #include <asm/movs.h> + #include <asm/page.h> + #include <asm/pgalloc.h> ++ ++#include <asm/mcfsim.h> ++ ++#if 0 + #include <asm/mcf5445x_intc.h> + #include <asm/mcf5445x_sdramc.h> + #include <asm/mcf5445x_fbcs.h> + #include <asm/mcf5445x_dtim.h> + #include <asm/mcf5445x_xbs.h> ++#endif + + /* JKM -- testing */ + #include <linux/pfn.h> +@@ -85,15 +91,21 @@ int __init uboot_commandline(char *boota + { + int len = 0, cmd_line_len; + static struct uboot_record uboot_info; ++ u32 offset = PAGE_OFFSET_RAW - PHYS_OFFSET; + + extern unsigned long uboot_info_stk; + +- /* Add 0x80000000 to get post-remapped kernel memory location */ +- uboot_info.bd_info = (*(u32 *)(uboot_info_stk)) + 0x80000000; +- uboot_info.initrd_start = (*(u32 *)(uboot_info_stk+4)) + 0x80000000; +- uboot_info.initrd_end = (*(u32 *)(uboot_info_stk+8)) + 0x80000000; +- uboot_info.cmd_line_start = (*(u32 *)(uboot_info_stk+12)) + 0x80000000; +- uboot_info.cmd_line_stop = (*(u32 *)(uboot_info_stk+16)) + 0x80000000; ++ /* validate address */ ++ if ((uboot_info_stk < PAGE_OFFSET_RAW) || ++ (uboot_info_stk >= (PAGE_OFFSET_RAW + CONFIG_SDRAM_SIZE))) ++ return 0; ++ ++ /* Add offset to get post-remapped kernel memory location */ ++ uboot_info.bd_info = (*(u32 *)(uboot_info_stk)) + offset; ++ uboot_info.initrd_start = (*(u32 *)(uboot_info_stk+4)) + offset; ++ uboot_info.initrd_end = (*(u32 *)(uboot_info_stk+8)) + offset; ++ uboot_info.cmd_line_start = (*(u32 *)(uboot_info_stk+12)) + offset; ++ uboot_info.cmd_line_stop = (*(u32 *)(uboot_info_stk+16)) + offset; + + cmd_line_len = uboot_info.cmd_line_stop - uboot_info.cmd_line_start; + if ((cmd_line_len > 0) && (cmd_line_len < CL_SIZE-1)) +@@ -106,21 +118,36 @@ int __init uboot_commandline(char *boota + /* + * This routine does things not done in the bootloader. + */ ++#if defined(CONFIG_M54455) + #define DEFAULT_COMMAND_LINE "root=/dev/mtdblock1 rw rootfstype=jffs2 ip=none mtdparts=physmap-flash.0:5M(kernel)ro,-(jffs2)" ++#elif defined(CONFIG_M547X_8X) ++#define DEFAULT_COMMAND_LINE "debug root=/dev/nfs nfsroot=172.27.155.1:/tftpboot/rigo/rootfs/ ip=172.27.155.85:172.27.155.1" ++#endif + asmlinkage void __init cf_early_init(void) + { + struct bi_record *record = (struct bi_record *) &_end; + + extern char _end; + ++#if defined(CONFIG_M54455) + SET_VBR((void *)MCF_RAMBAR1); ++#elif defined(CONFIG_M547X_8X) ++ SET_VBR((void *)MCF_RAMBAR0); ++#endif + + /* Mask all interrupts */ ++#if defined(CONFIG_M54455) + MCF_INTC0_IMRL = 0xFFFFFFFF; + MCF_INTC0_IMRH = 0xFFFFFFFF; + MCF_INTC1_IMRL = 0xFFFFFFFF; + MCF_INTC1_IMRH = 0xFFFFFFFF; ++#elif defined(CONFIG_M547X_8X) ++/* JKM -- ?? */ ++ MCF_IMRL = 0xFFFFFFFF; ++ MCF_IMRH = 0xFFFFFFFF; ++#endif + ++#if defined(CONFIG_M54455) + #if defined(CONFIG_NOR_FLASH_BASE) + MCF_FBCS_CSAR(1) = CONFIG_NOR_FLASH_BASE; + #else +@@ -131,9 +158,10 @@ asmlinkage void __init cf_early_init(voi + /* Init optional SDRAM chip select */ + MCF_SDRAMC_SDCS(1) = (256*1024*1024) | 0x1B; + #endif ++#endif /* CONFIG_M54455 */ + ++#if defined(CONFIG_M54455) + /* Setup SDRAM crossbar(XBS) priorities */ +-printk(KERN_INFO "Bumping USB Priority\n"); + MCF_XBS_PRS2 = (MCF_XBS_PRS_M0(MCF_XBS_PRI_2) | + MCF_XBS_PRS_M1(MCF_XBS_PRI_3) | + MCF_XBS_PRS_M2(MCF_XBS_PRI_4) | +@@ -141,6 +169,7 @@ printk(KERN_INFO "Bumping USB Priority\n + MCF_XBS_PRS_M5(MCF_XBS_PRI_6) | + MCF_XBS_PRS_M6(MCF_XBS_PRI_1) | + MCF_XBS_PRS_M7(MCF_XBS_PRI_7)); ++#endif + + + m68k_machtype = MACH_CFMMU; +@@ -152,6 +181,7 @@ printk(KERN_INFO "Bumping USB Priority\n + m68k_memory[m68k_num_memory].addr = CONFIG_SDRAM_BASE; + m68k_memory[m68k_num_memory++].size = CONFIG_SDRAM_SIZE; + ++#if defined(CONFIG_M54455) + if (!uboot_commandline(m68k_command_line)) { + #if defined(CONFIG_BOOTPARAM) + strncpy(m68k_command_line, CONFIG_BOOTPARAM_STRING, CL_SIZE-1); +@@ -159,6 +189,10 @@ printk(KERN_INFO "Bumping USB Priority\n + strcpy(m68k_command_line, DEFAULT_COMMAND_LINE); + #endif + } ++#else ++/* JKM -- hack until mappings get resolved */ ++ strcpy(m68k_command_line, DEFAULT_COMMAND_LINE); ++#endif + + + #if defined(CONFIG_BLK_DEV_INITRD) +@@ -185,6 +219,7 @@ printk(KERN_INFO "Bumping USB Priority\n + cacr_set(CACHE_INITIAL_MODE); + } + ++#if defined(CONFIG_M54455) + void settimericr(unsigned int timer, unsigned int level) + { + volatile unsigned char *icrp; +@@ -202,6 +237,7 @@ void settimericr(unsigned int timer, uns + coldfire_enable_irq0(irq); + } + } ++#endif + + /* Assembler routines */ + asmlinkage void buserr(void); +@@ -214,7 +250,11 @@ void __init coldfire_trap_init(void) + int i = 0; + e_vector *vectors; + ++#if defined(CONFIG_M54455) + vectors = (e_vector *)MCF_RAMBAR1; ++#elif defined(CONFIG_M547X_8X) ++ vectors = (e_vector *)MCF_RAMBAR0; ++#endif + /* + * There is a common trap handler and common interrupt + * handler that handle almost every vector. We treat +@@ -235,6 +275,8 @@ void __init coldfire_trap_init(void) + vectors[32] = system_call; + } + ++#if defined(CONFIG_M54455) ++ + void coldfire_tick(void) + { + /* Reset the ColdFire timer */ +@@ -285,13 +327,49 @@ unsigned long coldfire_gettimeoffset(voi + return offset; + } + ++#elif defined(CONFIG_M547X_8X) ++ ++void coldfire_tick(void) ++{ ++ /* Reset the ColdFire timer */ ++ MCF_SSR(0) = MCF_SSR_ST; ++} ++ ++void __init coldfire_sched_init(irq_handler_t handler) ++{ ++ int irq = ISC_SLTn(0); ++ ++ MCF_SCR(0) = 0; ++ MCF_ICR(irq) = ILP_SLT0; ++ request_irq(64 + irq, handler, IRQF_DISABLED, "ColdFire Timer 0", NULL); ++ MCF_SLTCNT(0) = MCF_BUSCLK / HZ; ++ MCF_SCR(0) |= MCF_SCR_TEN | MCF_SCR_IEN | MCF_SCR_RUN; ++} ++ ++unsigned long coldfire_gettimeoffset(void) ++{ ++ volatile unsigned long trr, tcn, offset; ++ trr = MCF_SLTCNT(0); ++ tcn = MCF_SCNT(0); ++ ++ offset = (trr - tcn) * ((1000000 >> 3) / HZ) / (trr >> 3); ++ if (MCF_SSR(0) & MCF_SSR_ST) ++ offset += 1000000 / HZ; ++ ++ return offset; ++} ++ ++#endif ++ + void coldfire_reboot(void) + { ++#if defined(CONFIG_M54455) + /* disable interrupts and do a software reset */ + asm("movew #0x2700, %%sr\n\t" + "moveb #0x80, %%d0\n\t" + "moveb %%d0, 0xfc0a0000\n\t" + : : : "%d0"); ++#endif + } + + /* int coldfire_hwclk(int i, struct rtc_time *t) +@@ -305,6 +383,7 @@ static void coldfire_get_model(char *mod + sprintf(model, "Version 4 ColdFire"); + } + ++/* JKM -- Why do we need these? */ + void coldfire_enable_irq(unsigned int vec) + { + unsigned long flags; +@@ -318,13 +397,21 @@ void coldfire_enable_irq(unsigned int ve + + local_irq_save(flags); + irq_enable[vec]++; ++#if defined(CONFIG_M54455) + if (vec < 32) + MCF_INTC0_IMRL &= ~(1 << vec); + else + MCF_INTC0_IMRH &= ~(1 << (vec - 32)); ++#elif defined(CONFIG_M547X_8X) ++ if (vec < 32) ++ MCF_IMRL &= ~(1 << vec); ++ else ++ MCF_IMRH &= ~(1 << (vec - 32)); ++#endif + local_irq_restore(flags); + } + ++/* JKM -- Why do we need these? */ + void coldfire_disable_irq(unsigned int vec) + { + unsigned long flags; +@@ -338,10 +425,17 @@ void coldfire_disable_irq(unsigned int v + + local_irq_save(flags); + if (--irq_enable[vec] == 0) { ++#if defined(CONFIG_M54455) + if (vec < 32) + MCF_INTC0_IMRL |= (1 << vec); + else + MCF_INTC0_IMRH |= (1 << (vec - 32)); ++#elif defined(CONFIG_M547X_8X) ++ if (vec < 32) ++ MCF_IMRL |= (1 << vec); ++ else ++ MCF_IMRH |= (1 << (vec - 32)); ++#endif + + } + local_irq_restore(flags); +--- a/arch/m68k/coldfire/head.S ++++ b/arch/m68k/coldfire/head.S +@@ -2,9 +2,9 @@ + * head.S is the MMU enabled ColdFire specific initial boot code + * + * Ported to ColdFire by +- * Matt Waddel Matt.Waddel@freescale.com +- * Kurt Mahan kmahan@freescale.com +- * Copyright Freescale Semiconductor, Inc. 2007 ++ * Matt Waddel Matt.Waddel@freescale.com ++ * Kurt Mahan kmahan@freescale.com ++ * Copyright Freescale Semiconductor, Inc. 2007, 2008 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by +@@ -52,6 +52,7 @@ + #define __FINIT .previous + #endif + ++/* JKM -- REVISE DOCS FOR RIGO */ + /* + * Setup ACR mappings to provide the following memory map: + * Data +@@ -61,13 +62,20 @@ + * None currently (mapped via TLBs) + */ + ++#if defined(CONFIG_M54455) + #define ACR0_DEFAULT #0xA00FA048 /* ACR0 default value */ + #define ACR1_DEFAULT #0xF00FA040 /* ACR1 default value */ + #define ACR2_DEFAULT #0x00000000 /* ACR2 default value */ + #define ACR3_DEFAULT #0x00000000 /* ACR3 default value */ +- + /* ACR mapping for FPGA (maps 0) */ + #define ACR0_FPGA #0x000FA048 /* ACR0 enable FPGA */ ++#elif defined(CONFIG_M547X_8X) ++#define ACR0_DEFAULT #0xE000C040 /* ACR0 default value */ ++#define ACR1_DEFAULT #0x00000000 /* ACR1 default value */ ++#define ACR2_DEFAULT #0x00000000 /* ACR2 default value */ ++#define ACR3_DEFAULT #0x00000000 /* ACR3 default value */ ++#endif ++ + + /* Several macros to make the writing of subroutines easier: + * - func_start marks the beginning of the routine which setups the frame +@@ -227,7 +235,7 @@ ENTRY(_stext) + + .long BOOTINFOV_MAGIC + .long 0 +-1: jmp __start-0x80000000 ++1: jmp __start-(0xc0000000-CONFIG_SDRAM_BASE) + + .equ kernel_pg_dir,_stext + .equ .,_stext+0x1000 +@@ -237,19 +245,40 @@ ENTRY(_start) + __INIT + ENTRY(__start) + ++/* JKM -- make sure Rigo handles UBOOT */ + /* Save the location of u-boot info - cmd line, bd_info, etc. */ + movel %a7,%a4 /* Don't use %a4 before cf_early_init */ ++/* JKM -- fix to use CONFIG_SDRAM_BASE) */ ++#if defined(CONFIG_M54455) + addl #0x80000004,%a4 /* 0x80000004= 1 stack push + high mem offset */ ++#elif defined(CONFIG_M547X_8X) ++ addl #0xc0000004,%a4 /* 0x80000004= 1 stack push + high mem offset */ ++#endif + ++/* JKM -- fix this to work off of CONFIG_SDRAM_BASE */ + /* Setup initial stack pointer */ ++#if defined(CONFIG_M54455) + movel #0x40001000,%sp ++#elif defined(CONFIG_M547X_8X) ++ movel #0x00001000,%sp ++#endif + + /* Setup usp */ + subl %a0,%a0 + movel %a0,%usp + ++#if defined(CONFIG_M54455) + movel #(MCF_RAMBAR1 + 0x221), %d0 + movec %d0, %rambar1 ++#elif defined(CONFIG_M547X_8X) ++ movel #MCF_MBAR, %d0 ++ movec %d0, %mbar ++ move.l #(MCF_RAMBAR0 + 0x21), %d0 ++ movec %d0, %rambar0 ++ move.l #(MCF_RAMBAR1 + 0x21), %d0 ++ movec %d0, %rambar1 ++#endif ++ + movew #0x2700,%sr + + /* reset cache */ +@@ -278,6 +307,7 @@ ENTRY(__start) + /* If you change the memory size to another value make a matching + change in paging_init(cf-mmu.c) to zones_size[]. */ + ++#if defined(CONFIG_M54455) + /* Map 256MB as code */ + mmu_map (PAGE_OFFSET+0*0x1000000), (PHYS_OFFSET+0*0x1000000), \ + MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC, MMUDR_SP, \ +@@ -383,16 +413,104 @@ ENTRY(__start) + MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \ + 0, MMUDR_LK, %d0 + +- /* Do unity mapping to enable the MMU. Map first 16 MB in place as +- code (delete TLBs after MMU is enabled and we are executing in high +- memory). */ ++#elif defined(CONFIG_M547X_8X) ++ ++ /* Map first 8 MB as code */ ++ mmu_map (PAGE_OFFSET+0*1024*1024), (0*1024*1024), MMUOR_ITLB, 0, \ ++ MMUTR_SG, MMUDR_SZ1M, MMUDR_IC, MMUDR_SP, 0, 0, MMUDR_X, \ ++ MMUDR_LK, %d0 ++ mmu_map (PAGE_OFFSET+1*1024*1024), (1*1024*1024), MMUOR_ITLB, 0, \ ++ MMUTR_SG, MMUDR_SZ1M, MMUDR_IC, MMUDR_SP, 0, 0, MMUDR_X, \ ++ MMUDR_LK, %d0 ++ mmu_map (PAGE_OFFSET+2*1024*1024), (2*1024*1024), MMUOR_ITLB, 0, \ ++ MMUTR_SG, MMUDR_SZ1M, MMUDR_IC, MMUDR_SP, 0, 0, MMUDR_X, \ ++ MMUDR_LK, %d0 ++ mmu_map (PAGE_OFFSET+3*1024*1024), (3*1024*1024), MMUOR_ITLB, 0, \ ++ MMUTR_SG, MMUDR_SZ1M, MMUDR_IC, MMUDR_SP, 0, 0, MMUDR_X, \ ++ MMUDR_LK, %d0 ++ mmu_map (PAGE_OFFSET+4*1024*1024), (4*1024*1024), MMUOR_ITLB, 0, \ ++ MMUTR_SG, MMUDR_SZ1M, MMUDR_IC, MMUDR_SP, 0, 0, MMUDR_X, \ ++ MMUDR_LK, %d0 ++ mmu_map (PAGE_OFFSET+5*1024*1024), (5*1024*1024), MMUOR_ITLB, 0, \ ++ MMUTR_SG, MMUDR_SZ1M, MMUDR_IC, MMUDR_SP, 0, 0, MMUDR_X, \ ++ MMUDR_LK, %d0 ++ mmu_map (PAGE_OFFSET+6*1024*1024), (6*1024*1024), MMUOR_ITLB, 0, \ ++ MMUTR_SG, MMUDR_SZ1M, MMUDR_IC, MMUDR_SP, 0, 0, MMUDR_X, \ ++ MMUDR_LK, %d0 ++ mmu_map (PAGE_OFFSET+7*1024*1024), (7*1024*1024), MMUOR_ITLB, 0, \ ++ MMUTR_SG, MMUDR_SZ1M, MMUDR_IC, MMUDR_SP, 0, 0, MMUDR_X, \ ++ MMUDR_LK, %d0 ++ ++ /* Map first 8 MB as data */ ++ mmu_map (PAGE_OFFSET+0*1024*1024), (0*1024*1024), 0, 0, \ ++ MMUTR_SG, MMUDR_SZ1M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, \ ++ MMUDR_W, 0, MMUDR_LK, %d0 ++ mmu_map (PAGE_OFFSET+1*1024*1024), (1*1024*1024), 0, 0, \ ++ MMUTR_SG, MMUDR_SZ1M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, \ ++ MMUDR_W, 0, MMUDR_LK, %d0 ++ mmu_map (PAGE_OFFSET+2*1024*1024), (2*1024*1024), 0, 0, \ ++ MMUTR_SG, MMUDR_SZ1M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, \ ++ MMUDR_W, 0, MMUDR_LK, %d0 ++ mmu_map (PAGE_OFFSET+3*1024*1024), (3*1024*1024), 0, 0, \ ++ MMUTR_SG, MMUDR_SZ1M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, \ ++ MMUDR_W, 0, MMUDR_LK, %d0 ++ mmu_map (PAGE_OFFSET+4*1024*1024), (4*1024*1024), 0, 0, \ ++ MMUTR_SG, MMUDR_SZ1M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, \ ++ MMUDR_W, 0, MMUDR_LK, %d0 ++ mmu_map (PAGE_OFFSET+5*1024*1024), (5*1024*1024), 0, 0, \ ++ MMUTR_SG, MMUDR_SZ1M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, \ ++ MMUDR_W, 0, MMUDR_LK, %d0 ++ mmu_map (PAGE_OFFSET+6*1024*1024), (6*1024*1024), 0, 0, \ ++ MMUTR_SG, MMUDR_SZ1M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, \ ++ MMUDR_W, 0, MMUDR_LK, %d0 ++ mmu_map (PAGE_OFFSET+7*1024*1024), (7*1024*1024), 0, 0, \ ++ MMUTR_SG, MMUDR_SZ1M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, \ ++ MMUDR_W, 0, MMUDR_LK, %d0 ++#endif ++ /* ++ * Do unity mapping to enable the MMU. Map first chunk of memory ++ * in place as code/data. The TLBs will be deleted after the MMU is ++ * enabled and we are executing in high memory. ++ */ ++ ++#if defined(CONFIG_M54455) ++ /* Map first 16 MB as code */ + mmu_map (PHYS_OFFSET+0*0x1000000), (PHYS_OFFSET+0*0x1000000), \ + MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_INC, MMUDR_SP, 0, \ + 0, MMUDR_X, 0, %d0 +- /* Map first 16 MB as data too. */ ++ /* Map first 16 MB as data too */ + mmu_map (PHYS_OFFSET+0*0x1000000), (PHYS_OFFSET+0*0x1000000), 0, 0, \ + MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \ + 0, 0, %d0 ++#elif defined(CONFIG_M547X_8X) ++ /* Map first 4 MB as code */ ++ mmu_map (0*1024*1024), (0*1024*1024), MMUOR_ITLB, 0, \ ++ MMUTR_SG, MMUDR_SZ1M, MMUDR_IC, MMUDR_SP, 0, 0, \ ++ MMUDR_X, 0, %d0 ++ mmu_map (1*1024*1024), (1*1024*1024), MMUOR_ITLB, 0, \ ++ MMUTR_SG, MMUDR_SZ1M, MMUDR_IC, MMUDR_SP, 0, 0, \ ++ MMUDR_X, 0, %d0 ++ mmu_map (2*1024*1024), (2*1024*1024), MMUOR_ITLB, 0, \ ++ MMUTR_SG, MMUDR_SZ1M, MMUDR_IC, MMUDR_SP, 0, 0, \ ++ MMUDR_X, 0, %d0 ++ mmu_map (3*1024*1024), (3*1024*1024), MMUOR_ITLB, 0, \ ++ MMUTR_SG, MMUDR_SZ1M, MMUDR_IC, MMUDR_SP, 0, 0, \ ++ MMUDR_X, 0, %d0 ++ ++ /* Map first 4 MB as data too */ ++ mmu_map (0*1024*1024), (0*1024*1024), 0, 0, \ ++ MMUTR_SG, MMUDR_SZ1M, MMUDR_DCB, MMUDR_SP, MMUDR_R, \ ++ MMUDR_W, 0, 0, %d0 ++ mmu_map (1*1024*1024), (1*1024*1024), 0, 0, \ ++ MMUTR_SG, MMUDR_SZ1M, MMUDR_DCB, MMUDR_SP, MMUDR_R, \ ++ MMUDR_W, 0, 0, %d0 ++ mmu_map (2*1024*1024), (2*1024*1024), 0, 0, \ ++ MMUTR_SG, MMUDR_SZ1M, MMUDR_DCB, MMUDR_SP, MMUDR_R, \ ++ MMUDR_W, 0, 0, %d0 ++ mmu_map (3*1024*1024), (3*1024*1024), 0, 0, \ ++ MMUTR_SG, MMUDR_SZ1M, MMUDR_DCB, MMUDR_SP, MMUDR_R, \ ++ MMUDR_W, 0, 0, %d0 ++#endif + + /* Turn on MMU */ + movel #(MMUCR_EN),%a0 +@@ -412,9 +530,20 @@ ENTRY(__running_high) + addl #PAGE_OFFSET,%a1 + movel %a1,%a0@ + +- /* Unmap first 16 MB, code and data. */ ++ /* Unmap unity mappings */ ++#if defined(CONFIG_M54455) + mmu_unmap (PHYS_OFFSET+0*0x1000000), MMUOR_ITLB, %d0 + mmu_unmap (PHYS_OFFSET+0*0x1000000), 0, %d0 ++#elif defined(CONFIG_M547X_8X) ++ mmu_unmap (PHYS_OFFSET+0*0x1000000), MMUOR_ITLB, %d0 ++ mmu_unmap (PHYS_OFFSET+1*0x1000000), MMUOR_ITLB, %d0 ++ mmu_unmap (PHYS_OFFSET+2*0x1000000), MMUOR_ITLB, %d0 ++ mmu_unmap (PHYS_OFFSET+3*0x1000000), MMUOR_ITLB, %d0 ++ mmu_unmap (PHYS_OFFSET+0*0x1000000), 0, %d0 ++ mmu_unmap (PHYS_OFFSET+1*0x1000000), 0, %d0 ++ mmu_unmap (PHYS_OFFSET+2*0x1000000), 0, %d0 ++ mmu_unmap (PHYS_OFFSET+3*0x1000000), 0, %d0 ++#endif + + /* Setup initial stack pointer */ + lea init_task,%a2 +@@ -438,8 +567,9 @@ func_start set_context,%d0,(1*4) + movec %d0,%asid + func_return set_context + ++#ifdef CONFIG_M54455 + /* +- * set_fpga(addr,val) ++ * set_fpga(addr,val) on the M54455EVB + * + * Map in 0x00000000 -> 0x0fffffff and then do the write. + */ +@@ -456,6 +586,7 @@ set_fpga: + nop + movew %d1,%sr + rts ++#endif + + .data + .align 4 +--- a/arch/m68k/coldfire/ints.c ++++ b/arch/m68k/coldfire/ints.c +@@ -5,9 +5,10 @@ + * Copyright (C) 1998 D. Jeff Dionne <jeff@lineo.ca>, + * Kenneth Albanowski <kjahds@kjahds.com>, + * Copyright (C) 2000 Lineo Inc. (www.lineo.com) +- * Matt Waddel Matt.Waddel@freescale.com +- * Copyright Freescale Semiconductor, Inc. 2007 +- * Kurt Mahan kmahan@freescale.com ++ * ++ * Copyright Freescale Semiconductor, Inc. 2007, 2008 ++ * Kurt Mahan kmahan@freescale.com ++ * Matt Waddel Matt.Waddel@freescale.com + * + * Based on: + * linux/arch/m68k/kernel/ints.c & +@@ -46,7 +47,7 @@ static int irq_depth[SYS_IRQS]; + /* + * IRQ Controller + */ +-#ifdef CONFIG_M54455 ++#if defined(CONFIG_M54455) + void m5445x_irq_enable(unsigned int irq); + void m5445x_irq_disable(unsigned int irq); + static struct irq_controller m5445x_irq_controller = { +@@ -55,6 +56,17 @@ static struct irq_controller m5445x_irq_ + .enable = m5445x_irq_enable, + .disable = m5445x_irq_disable, + }; ++#elif defined(CONFIG_M547X_8X) ++void m547x_8x_irq_enable(unsigned int irq); ++void m547x_8x_irq_disable(unsigned int irq); ++static struct irq_controller m547x_8x_irq_controller = { ++ .name = "M547X_8X", ++ .lock = SPIN_LOCK_UNLOCKED, ++ .enable = m547x_8x_irq_enable, ++ .disable = m547x_8x_irq_disable, ++}; ++#else ++# error No IRQ controller defined + #endif + + #define POOL_SIZE SYS_IRQS +@@ -75,9 +87,12 @@ void __init init_IRQ(void) + { + int i; + +-#ifdef CONFIG_M54455 ++#if defined(CONFIG_M54455) + for (i = 0; i < SYS_IRQS; i++) + irq_controller[i] = &m5445x_irq_controller; ++#elif defined(CONFIG_M547X_8X) ++ for (i = 0; i < SYS_IRQS; i++) ++ irq_controller[i] = &m547x_8x_irq_controller; + #endif + } + +@@ -381,4 +396,57 @@ void m5445x_irq_disable(unsigned int irq + MCF_INTC1_SIMR = irq; + } + } ++#elif defined(CONFIG_M547X_8X) ++/* ++ * M547X_8X Implementation ++ */ ++void m547x_8x_irq_enable(unsigned int irq) ++{ ++ /* enable the interrupt hardware */ ++ if (irq < 64) ++ return; ++ ++ /* adjust past non-hardware ints */ ++ irq -= 64; ++ ++/* JKM -- re-add EPORT later */ ++#if 0 ++ /* check for eport */ ++ if ((irq > 0) && (irq < 8)) { ++ /* enable eport */ ++ MCF_EPORT_EPPAR &= ~(3 << (irq*2)); /* level */ ++ MCF_EPORT_EPDDR &= ~(1 << irq); /* input */ ++ MCF_EPORT_EPIER |= 1 << irq; /* irq enabled */ ++ } ++#endif ++ ++ if (irq < 32) ++ MCF_IMRL &= ~(1 << irq); ++ else ++ MCF_IMRH &= ~(1 << (irq - 32)); ++} ++ ++void m547x_8x_irq_disable(unsigned int irq) ++{ ++ /* disable the interrupt hardware */ ++ if (irq < 64) ++ return; ++ ++ /* adjust past non-hardware ints */ ++ irq -= 64; ++ ++/* JKM -- re-add EPORT later */ ++#if 0 ++ /* check for eport */ ++ if ((irq > 0) && (irq < 8)) { ++ /* disable eport */ ++ MCF_EPORT_EPIER &= ~(1 << irq); ++ } ++#endif ++ ++ if (irq < 32) ++ MCF_IMRL |= (1 << irq); ++ else ++ MCF_IMRH |= (1 << (irq - 32)); ++} + #endif +--- /dev/null ++++ b/arch/m68k/configs/m5485evb_defconfig +@@ -0,0 +1,777 @@ ++# ++# Automatically generated make config: don't edit ++# Linux kernel version: 2.6.24 ++# Thu Feb 21 00:19:01 2008 ++# ++CONFIG_M68K=y ++CONFIG_MMU=y ++# CONFIG_GENERIC_TIME is not set ++# CONFIG_GENERIC_CLOCKEVENTS is not set ++CONFIG_RWSEM_GENERIC_SPINLOCK=y ++# CONFIG_ARCH_HAS_ILOG2_U32 is not set ++# CONFIG_ARCH_HAS_ILOG2_U64 is not set ++CONFIG_GENERIC_HWEIGHT=y ++CONFIG_GENERIC_CALIBRATE_DELAY=y ++CONFIG_TIME_LOW_RES=y ++CONFIG_GENERIC_IOMAP=y ++# CONFIG_NO_IOPORT is not set ++# CONFIG_NO_DMA is not set ++CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" ++ ++# ++# General setup ++# ++CONFIG_EXPERIMENTAL=y ++CONFIG_BROKEN_ON_SMP=y ++CONFIG_INIT_ENV_ARG_LIMIT=32 ++CONFIG_LOCALVERSION="" ++CONFIG_LOCALVERSION_AUTO=y ++CONFIG_SWAP=y ++CONFIG_SYSVIPC=y ++CONFIG_SYSVIPC_SYSCTL=y ++# CONFIG_POSIX_MQUEUE is not set ++# CONFIG_BSD_PROCESS_ACCT is not set ++# CONFIG_TASKSTATS is not set ++# CONFIG_USER_NS is not set ++# CONFIG_PID_NS is not set ++# CONFIG_AUDIT is not set ++CONFIG_IKCONFIG=y ++CONFIG_IKCONFIG_PROC=y ++CONFIG_LOG_BUF_SHIFT=17 ++# CONFIG_CGROUPS is not set ++CONFIG_FAIR_GROUP_SCHED=y ++CONFIG_FAIR_USER_SCHED=y ++# CONFIG_FAIR_CGROUP_SCHED is not set ++CONFIG_SYSFS_DEPRECATED=y ++# CONFIG_RELAY is not set ++# CONFIG_BLK_DEV_INITRD is not set ++# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set ++CONFIG_SYSCTL=y ++# CONFIG_EMBEDDED is not set ++CONFIG_UID16=y ++CONFIG_SYSCTL_SYSCALL=y ++CONFIG_KALLSYMS=y ++# CONFIG_KALLSYMS_ALL is not set ++# CONFIG_KALLSYMS_EXTRA_PASS is not set ++CONFIG_HOTPLUG=y ++CONFIG_PRINTK=y ++CONFIG_BUG=y ++CONFIG_ELF_CORE=y ++CONFIG_BASE_FULL=y ++CONFIG_FUTEX=y ++CONFIG_ANON_INODES=y ++CONFIG_EPOLL=y ++CONFIG_SIGNALFD=y ++CONFIG_EVENTFD=y ++CONFIG_SHMEM=y ++CONFIG_VM_EVENT_COUNTERS=y ++CONFIG_SLAB=y ++# CONFIG_SLUB is not set ++# CONFIG_SLOB is not set ++CONFIG_SLABINFO=y ++CONFIG_RT_MUTEXES=y ++# CONFIG_TINY_SHMEM is not set ++CONFIG_BASE_SMALL=0 ++CONFIG_MODULES=y ++CONFIG_MODULE_UNLOAD=y ++CONFIG_MODULE_FORCE_UNLOAD=y ++# CONFIG_MODVERSIONS is not set ++# CONFIG_MODULE_SRCVERSION_ALL is not set ++# CONFIG_KMOD is not set ++CONFIG_BLOCK=y ++CONFIG_LBD=y ++# CONFIG_BLK_DEV_IO_TRACE is not set ++# CONFIG_LSF is not set ++# CONFIG_BLK_DEV_BSG is not set ++ ++# ++# IO Schedulers ++# ++CONFIG_IOSCHED_NOOP=y ++CONFIG_IOSCHED_AS=y ++CONFIG_IOSCHED_DEADLINE=y ++CONFIG_IOSCHED_CFQ=y ++# CONFIG_DEFAULT_AS is not set ++# CONFIG_DEFAULT_DEADLINE is not set ++CONFIG_DEFAULT_CFQ=y ++# CONFIG_DEFAULT_NOOP is not set ++CONFIG_DEFAULT_IOSCHED="cfq" ++ ++# ++# Platform dependent setup ++# ++# CONFIG_SUN3 is not set ++CONFIG_COLDFIRE=y ++CONFIG_CFV4E=y ++# CONFIG_AMIGA is not set ++# CONFIG_ATARI is not set ++# CONFIG_MAC is not set ++# CONFIG_APOLLO is not set ++# CONFIG_VME is not set ++# CONFIG_HP300 is not set ++# CONFIG_SUN3X is not set ++# CONFIG_Q40 is not set ++ ++# ++# Processor type ++# ++# CONFIG_M68020 is not set ++# CONFIG_M68030 is not set ++# CONFIG_M68040 is not set ++# CONFIG_M68060 is not set ++# CONFIG_M54455 is not set ++CONFIG_M547X_8X=y ++# CONFIG_M547X is not set ++CONFIG_M548X=y ++# CONFIG_M5475AFE is not set ++# CONFIG_M5475BFE is not set ++# CONFIG_M5475CFE is not set ++# CONFIG_M5475DFE is not set ++# CONFIG_M5475EFE is not set ++# CONFIG_M5475FFE is not set ++# CONFIG_M5485AFE is not set ++# CONFIG_M5485BFE is not set ++CONFIG_M5485CFE=y ++# CONFIG_M5485DFE is not set ++# CONFIG_M5485EFE is not set ++# CONFIG_M5485FFE is not set ++CONFIG_MCFCLK=50000000 ++# CONFIG_MCF_USER_HALT is not set ++CONFIG_MMU_CFV4E=y ++CONFIG_SDRAM_BASE=0x00000000 ++CONFIG_SDRAM_SIZE=0x04000000 ++# CONFIG_M68KFPU_EMU is not set ++CONFIG_ADVANCED=y ++# CONFIG_RMW_INSNS is not set ++CONFIG_SINGLE_MEMORY_CHUNK=y ++# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set ++CONFIG_SELECT_MEMORY_MODEL=y ++CONFIG_FLATMEM_MANUAL=y ++# CONFIG_DISCONTIGMEM_MANUAL is not set ++# CONFIG_SPARSEMEM_MANUAL is not set ++CONFIG_FLATMEM=y ++CONFIG_FLAT_NODE_MEM_MAP=y ++CONFIG_NEED_MULTIPLE_NODES=y ++# CONFIG_SPARSEMEM_STATIC is not set ++# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set ++CONFIG_SPLIT_PTLOCK_CPUS=4 ++# CONFIG_RESOURCES_64BIT is not set ++CONFIG_ZONE_DMA_FLAG=1 ++CONFIG_BOUNCE=y ++CONFIG_VIRT_TO_BUS=y ++ ++# ++# General setup ++# ++CONFIG_BINFMT_ELF=y ++# CONFIG_BINFMT_AOUT is not set ++# CONFIG_BINFMT_MISC is not set ++CONFIG_PROC_HARDWARE=y ++CONFIG_ZONE_DMA=y ++# CONFIG_ARCH_SUPPORTS_MSI is not set ++ ++# ++# Power management options ++# ++# CONFIG_PM is not set ++ ++# ++# Networking ++# ++CONFIG_NET=y ++ ++# ++# Networking options ++# ++CONFIG_PACKET=y ++# CONFIG_PACKET_MMAP is not set ++CONFIG_UNIX=y ++CONFIG_XFRM=y ++# CONFIG_XFRM_USER is not set ++# CONFIG_XFRM_SUB_POLICY is not set ++# CONFIG_XFRM_MIGRATE is not set ++CONFIG_NET_KEY=y ++# CONFIG_NET_KEY_MIGRATE is not set ++CONFIG_INET=y ++# CONFIG_IP_MULTICAST is not set ++CONFIG_IP_ADVANCED_ROUTER=y ++CONFIG_ASK_IP_FIB_HASH=y ++# CONFIG_IP_FIB_TRIE is not set ++CONFIG_IP_FIB_HASH=y ++# CONFIG_IP_MULTIPLE_TABLES is not set ++# CONFIG_IP_ROUTE_MULTIPATH is not set ++# CONFIG_IP_ROUTE_VERBOSE is not set ++CONFIG_IP_PNP=y ++# CONFIG_IP_PNP_DHCP is not set ++# CONFIG_IP_PNP_BOOTP is not set ++# CONFIG_IP_PNP_RARP is not set ++# CONFIG_NET_IPIP is not set ++# CONFIG_NET_IPGRE is not set ++# CONFIG_ARPD is not set ++# CONFIG_SYN_COOKIES is not set ++CONFIG_INET_AH=y ++CONFIG_INET_ESP=y ++# CONFIG_INET_IPCOMP is not set ++# CONFIG_INET_XFRM_TUNNEL is not set ++# CONFIG_INET_TUNNEL is not set ++# CONFIG_INET_XFRM_MODE_TRANSPORT is not set ++# CONFIG_INET_XFRM_MODE_TUNNEL is not set ++# CONFIG_INET_XFRM_MODE_BEET is not set ++# CONFIG_INET_LRO is not set ++CONFIG_INET_DIAG=y ++CONFIG_INET_TCP_DIAG=y ++# CONFIG_TCP_CONG_ADVANCED is not set ++CONFIG_TCP_CONG_CUBIC=y ++CONFIG_DEFAULT_TCP_CONG="cubic" ++# CONFIG_TCP_MD5SIG is not set ++# CONFIG_IPV6 is not set ++# CONFIG_INET6_XFRM_TUNNEL is not set ++# CONFIG_INET6_TUNNEL is not set ++# CONFIG_NETWORK_SECMARK is not set ++# CONFIG_NETFILTER is not set ++# CONFIG_IP_DCCP is not set ++# CONFIG_IP_SCTP is not set ++# CONFIG_TIPC is not set ++# CONFIG_ATM is not set ++# CONFIG_BRIDGE is not set ++# CONFIG_VLAN_8021Q is not set ++# CONFIG_DECNET is not set ++# CONFIG_LLC2 is not set ++# CONFIG_IPX is not set ++# CONFIG_ATALK is not set ++# CONFIG_X25 is not set ++# CONFIG_LAPB is not set ++# CONFIG_ECONET is not set ++# CONFIG_WAN_ROUTER is not set ++# CONFIG_NET_SCHED is not set ++ ++# ++# Network testing ++# ++# CONFIG_NET_PKTGEN is not set ++# CONFIG_HAMRADIO is not set ++# CONFIG_IRDA is not set ++# CONFIG_BT is not set ++# CONFIG_AF_RXRPC is not set ++ ++# ++# Wireless ++# ++# CONFIG_CFG80211 is not set ++# CONFIG_WIRELESS_EXT is not set ++# CONFIG_MAC80211 is not set ++# CONFIG_IEEE80211 is not set ++# CONFIG_RFKILL is not set ++# CONFIG_NET_9P is not set ++ ++# ++# Device Drivers ++# ++ ++# ++# Generic Driver Options ++# ++CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" ++# CONFIG_STANDALONE is not set ++CONFIG_PREVENT_FIRMWARE_BUILD=y ++CONFIG_FW_LOADER=y ++# CONFIG_DEBUG_DRIVER is not set ++# CONFIG_DEBUG_DEVRES is not set ++# CONFIG_SYS_HYPERVISOR is not set ++# CONFIG_CONNECTOR is not set ++# CONFIG_MTD is not set ++# CONFIG_PARPORT is not set ++CONFIG_BLK_DEV=y ++# CONFIG_BLK_DEV_COW_COMMON is not set ++CONFIG_BLK_DEV_LOOP=y ++# CONFIG_BLK_DEV_CRYPTOLOOP is not set ++# CONFIG_BLK_DEV_NBD is not set ++CONFIG_BLK_DEV_RAM=y ++CONFIG_BLK_DEV_RAM_COUNT=16 ++CONFIG_BLK_DEV_RAM_SIZE=64000 ++CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 ++# CONFIG_CDROM_PKTCDVD is not set ++# CONFIG_ATA_OVER_ETH is not set ++CONFIG_MISC_DEVICES=y ++# CONFIG_EEPROM_93CX6 is not set ++# CONFIG_IDE is not set ++ ++# ++# SCSI device support ++# ++# CONFIG_RAID_ATTRS is not set ++CONFIG_SCSI=y ++CONFIG_SCSI_DMA=y ++# CONFIG_SCSI_TGT is not set ++# CONFIG_SCSI_NETLINK is not set ++CONFIG_SCSI_PROC_FS=y ++ ++# ++# SCSI support type (disk, tape, CD-ROM) ++# ++CONFIG_BLK_DEV_SD=y ++# CONFIG_CHR_DEV_ST is not set ++# CONFIG_CHR_DEV_OSST is not set ++# CONFIG_BLK_DEV_SR is not set ++# CONFIG_CHR_DEV_SG is not set ++# CONFIG_CHR_DEV_SCH is not set ++ ++# ++# Some SCSI devices (e.g. CD jukebox) support multiple LUNs ++# ++CONFIG_SCSI_MULTI_LUN=y ++# CONFIG_SCSI_CONSTANTS is not set ++# CONFIG_SCSI_LOGGING is not set ++# CONFIG_SCSI_SCAN_ASYNC is not set ++CONFIG_SCSI_WAIT_SCAN=m ++ ++# ++# SCSI Transports ++# ++# CONFIG_SCSI_SPI_ATTRS is not set ++# CONFIG_SCSI_FC_ATTRS is not set ++# CONFIG_SCSI_ISCSI_ATTRS is not set ++# CONFIG_SCSI_SAS_LIBSAS is not set ++# CONFIG_SCSI_SRP_ATTRS is not set ++# CONFIG_SCSI_LOWLEVEL is not set ++# CONFIG_ATA is not set ++# CONFIG_MD is not set ++CONFIG_NETDEVICES=y ++# CONFIG_NETDEVICES_MULTIQUEUE is not set ++# CONFIG_DUMMY is not set ++# CONFIG_BONDING is not set ++# CONFIG_MACVLAN is not set ++# CONFIG_EQUALIZER is not set ++# CONFIG_TUN is not set ++# CONFIG_VETH is not set ++# CONFIG_PHYLIB is not set ++CONFIG_NET_ETHERNET=y ++CONFIG_MII=y ++# CONFIG_IBM_NEW_EMAC_ZMII is not set ++# CONFIG_IBM_NEW_EMAC_RGMII is not set ++# CONFIG_IBM_NEW_EMAC_TAH is not set ++# CONFIG_IBM_NEW_EMAC_EMAC4 is not set ++# CONFIG_B44 is not set ++# CONFIG_NETDEV_1000 is not set ++# CONFIG_NETDEV_10000 is not set ++ ++# ++# Wireless LAN ++# ++# CONFIG_WLAN_PRE80211 is not set ++# CONFIG_WLAN_80211 is not set ++# CONFIG_WAN is not set ++# CONFIG_PPP is not set ++# CONFIG_SLIP is not set ++# CONFIG_SHAPER is not set ++# CONFIG_NETCONSOLE is not set ++# CONFIG_NETPOLL is not set ++# CONFIG_NET_POLL_CONTROLLER is not set ++# CONFIG_ISDN is not set ++# CONFIG_PHONE is not set ++ ++# ++# Input device support ++# ++CONFIG_INPUT=y ++# CONFIG_INPUT_FF_MEMLESS is not set ++# CONFIG_INPUT_POLLDEV is not set ++ ++# ++# Userland interfaces ++# ++CONFIG_INPUT_MOUSEDEV=y ++# CONFIG_INPUT_MOUSEDEV_PSAUX is not set ++CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 ++CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 ++# CONFIG_INPUT_JOYDEV is not set ++CONFIG_INPUT_EVDEV=y ++# CONFIG_INPUT_EVBUG is not set ++ ++# ++# Input Device Drivers ++# ++CONFIG_INPUT_KEYBOARD=y ++# CONFIG_KEYBOARD_ATKBD is not set ++# CONFIG_KEYBOARD_SUNKBD is not set ++# CONFIG_KEYBOARD_LKKBD is not set ++# CONFIG_KEYBOARD_XTKBD is not set ++# CONFIG_KEYBOARD_NEWTON is not set ++# CONFIG_KEYBOARD_STOWAWAY is not set ++# CONFIG_INPUT_MOUSE is not set ++# CONFIG_INPUT_JOYSTICK is not set ++# CONFIG_INPUT_TABLET is not set ++# CONFIG_INPUT_TOUCHSCREEN is not set ++# CONFIG_INPUT_MISC is not set ++ ++# ++# Hardware I/O ports ++# ++CONFIG_SERIO=y ++CONFIG_SERIO_SERPORT=y ++# CONFIG_SERIO_RAW is not set ++# CONFIG_GAMEPORT is not set ++ ++# ++# Character devices ++# ++CONFIG_VT=y ++CONFIG_VT_CONSOLE=y ++CONFIG_HW_CONSOLE=y ++# CONFIG_VT_HW_CONSOLE_BINDING is not set ++# CONFIG_SERIAL_NONSTANDARD is not set ++ ++# ++# Serial drivers ++# ++# CONFIG_SERIAL_8250 is not set ++ ++# ++# Non-8250 serial port support ++# ++CONFIG_SERIAL_COLDFIRE=y ++CONFIG_UNIX98_PTYS=y ++# CONFIG_LEGACY_PTYS is not set ++# CONFIG_IPMI_HANDLER is not set ++# CONFIG_HW_RANDOM is not set ++# CONFIG_GEN_RTC is not set ++# CONFIG_R3964 is not set ++# CONFIG_RAW_DRIVER is not set ++# CONFIG_TCG_TPM is not set ++# CONFIG_I2C is not set ++ ++# ++# SPI support ++# ++# CONFIG_SPI is not set ++# CONFIG_COLDFIRE_EDMA is not set ++# CONFIG_SPI_MASTER is not set ++# CONFIG_W1 is not set ++# CONFIG_POWER_SUPPLY is not set ++# CONFIG_HWMON is not set ++# CONFIG_WATCHDOG is not set ++ ++# ++# Sonics Silicon Backplane ++# ++CONFIG_SSB_POSSIBLE=y ++# CONFIG_SSB is not set ++ ++# ++# Multifunction device drivers ++# ++# CONFIG_MFD_SM501 is not set ++ ++# ++# Multimedia devices ++# ++# CONFIG_VIDEO_DEV is not set ++# CONFIG_DVB_CORE is not set ++CONFIG_DAB=y ++ ++# ++# Graphics support ++# ++# CONFIG_VGASTATE is not set ++CONFIG_VIDEO_OUTPUT_CONTROL=m ++# CONFIG_FB is not set ++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set ++ ++# ++# Display device support ++# ++# CONFIG_DISPLAY_SUPPORT is not set ++ ++# ++# Console display driver support ++# ++CONFIG_DUMMY_CONSOLE=y ++ ++# ++# Sound ++# ++# CONFIG_SOUND is not set ++CONFIG_HID_SUPPORT=y ++CONFIG_HID=y ++CONFIG_HID_DEBUG=y ++# CONFIG_HIDRAW is not set ++# CONFIG_USB_SUPPORT is not set ++# CONFIG_MMC is not set ++# CONFIG_NEW_LEDS is not set ++# CONFIG_RTC_CLASS is not set ++ ++# ++# Userspace I/O ++# ++# CONFIG_UIO is not set ++ ++# ++# Character devices ++# ++# CONFIG_SERIAL_CONSOLE is not set ++ ++# ++# File systems ++# ++CONFIG_EXT2_FS=y ++# CONFIG_EXT2_FS_XATTR is not set ++# CONFIG_EXT2_FS_XIP is not set ++CONFIG_EXT3_FS=y ++CONFIG_EXT3_FS_XATTR=y ++# CONFIG_EXT3_FS_POSIX_ACL is not set ++# CONFIG_EXT3_FS_SECURITY is not set ++# CONFIG_EXT4DEV_FS is not set ++CONFIG_JBD=y ++CONFIG_FS_MBCACHE=y ++# CONFIG_REISERFS_FS is not set ++# CONFIG_JFS_FS is not set ++# CONFIG_FS_POSIX_ACL is not set ++# CONFIG_XFS_FS is not set ++# CONFIG_GFS2_FS is not set ++# CONFIG_OCFS2_FS is not set ++CONFIG_MINIX_FS=y ++# CONFIG_ROMFS_FS is not set ++# CONFIG_INOTIFY is not set ++# CONFIG_QUOTA is not set ++CONFIG_DNOTIFY=y ++# CONFIG_AUTOFS_FS is not set ++# CONFIG_AUTOFS4_FS is not set ++# CONFIG_FUSE_FS is not set ++ ++# ++# CD-ROM/DVD Filesystems ++# ++# CONFIG_ISO9660_FS is not set ++# CONFIG_UDF_FS is not set ++ ++# ++# DOS/FAT/NT Filesystems ++# ++CONFIG_FAT_FS=y ++CONFIG_MSDOS_FS=y ++CONFIG_VFAT_FS=y ++CONFIG_FAT_DEFAULT_CODEPAGE=437 ++CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" ++CONFIG_NTFS_FS=y ++# CONFIG_NTFS_DEBUG is not set ++CONFIG_NTFS_RW=y ++ ++# ++# Pseudo filesystems ++# ++CONFIG_PROC_FS=y ++# CONFIG_PROC_KCORE is not set ++CONFIG_PROC_SYSCTL=y ++CONFIG_SYSFS=y ++CONFIG_TMPFS=y ++# CONFIG_TMPFS_POSIX_ACL is not set ++# CONFIG_HUGETLB_PAGE is not set ++# CONFIG_CONFIGFS_FS is not set ++ ++# ++# Miscellaneous filesystems ++# ++# CONFIG_ADFS_FS is not set ++# CONFIG_AFFS_FS is not set ++# CONFIG_HFS_FS is not set ++# CONFIG_HFSPLUS_FS is not set ++# CONFIG_BEFS_FS is not set ++# CONFIG_BFS_FS is not set ++# CONFIG_EFS_FS is not set ++# CONFIG_CRAMFS is not set ++# CONFIG_VXFS_FS is not set ++# CONFIG_HPFS_FS is not set ++# CONFIG_QNX4FS_FS is not set ++# CONFIG_SYSV_FS is not set ++# CONFIG_UFS_FS is not set ++CONFIG_NETWORK_FILESYSTEMS=y ++CONFIG_NFS_FS=y ++# CONFIG_NFS_V3 is not set ++# CONFIG_NFS_V4 is not set ++# CONFIG_NFS_DIRECTIO is not set ++# CONFIG_NFSD is not set ++CONFIG_ROOT_NFS=y ++CONFIG_LOCKD=y ++CONFIG_NFS_COMMON=y ++CONFIG_SUNRPC=y ++# CONFIG_SUNRPC_BIND34 is not set ++# CONFIG_RPCSEC_GSS_KRB5 is not set ++# CONFIG_RPCSEC_GSS_SPKM3 is not set ++# CONFIG_SMB_FS is not set ++# CONFIG_CIFS is not set ++# CONFIG_NCP_FS is not set ++# CONFIG_CODA_FS is not set ++# CONFIG_AFS_FS is not set ++ ++# ++# Partition Types ++# ++CONFIG_PARTITION_ADVANCED=y ++# CONFIG_ACORN_PARTITION is not set ++# CONFIG_OSF_PARTITION is not set ++# CONFIG_AMIGA_PARTITION is not set ++# CONFIG_ATARI_PARTITION is not set ++# CONFIG_MAC_PARTITION is not set ++CONFIG_MSDOS_PARTITION=y ++# CONFIG_BSD_DISKLABEL is not set ++# CONFIG_MINIX_SUBPARTITION is not set ++# CONFIG_SOLARIS_X86_PARTITION is not set ++# CONFIG_UNIXWARE_DISKLABEL is not set ++# CONFIG_LDM_PARTITION is not set ++# CONFIG_SGI_PARTITION is not set ++# CONFIG_ULTRIX_PARTITION is not set ++# CONFIG_SUN_PARTITION is not set ++# CONFIG_KARMA_PARTITION is not set ++# CONFIG_EFI_PARTITION is not set ++# CONFIG_SYSV68_PARTITION is not set ++CONFIG_NLS=y ++CONFIG_NLS_DEFAULT="iso8859-1" ++CONFIG_NLS_CODEPAGE_437=y ++# CONFIG_NLS_CODEPAGE_737 is not set ++# CONFIG_NLS_CODEPAGE_775 is not set ++# CONFIG_NLS_CODEPAGE_850 is not set ++# CONFIG_NLS_CODEPAGE_852 is not set ++# CONFIG_NLS_CODEPAGE_855 is not set ++# CONFIG_NLS_CODEPAGE_857 is not set ++# CONFIG_NLS_CODEPAGE_860 is not set ++# CONFIG_NLS_CODEPAGE_861 is not set ++# CONFIG_NLS_CODEPAGE_862 is not set ++# CONFIG_NLS_CODEPAGE_863 is not set ++# CONFIG_NLS_CODEPAGE_864 is not set ++# CONFIG_NLS_CODEPAGE_865 is not set ++# CONFIG_NLS_CODEPAGE_866 is not set ++# CONFIG_NLS_CODEPAGE_869 is not set ++# CONFIG_NLS_CODEPAGE_936 is not set ++# CONFIG_NLS_CODEPAGE_950 is not set ++# CONFIG_NLS_CODEPAGE_932 is not set ++# CONFIG_NLS_CODEPAGE_949 is not set ++# CONFIG_NLS_CODEPAGE_874 is not set ++# CONFIG_NLS_ISO8859_8 is not set ++# CONFIG_NLS_CODEPAGE_1250 is not set ++# CONFIG_NLS_CODEPAGE_1251 is not set ++# CONFIG_NLS_ASCII is not set ++CONFIG_NLS_ISO8859_1=y ++# CONFIG_NLS_ISO8859_2 is not set ++# CONFIG_NLS_ISO8859_3 is not set ++# CONFIG_NLS_ISO8859_4 is not set ++# CONFIG_NLS_ISO8859_5 is not set ++# CONFIG_NLS_ISO8859_6 is not set ++# CONFIG_NLS_ISO8859_7 is not set ++# CONFIG_NLS_ISO8859_9 is not set ++# CONFIG_NLS_ISO8859_13 is not set ++# CONFIG_NLS_ISO8859_14 is not set ++# CONFIG_NLS_ISO8859_15 is not set ++# CONFIG_NLS_KOI8_R is not set ++# CONFIG_NLS_KOI8_U is not set ++CONFIG_NLS_UTF8=y ++# CONFIG_DLM is not set ++CONFIG_INSTRUMENTATION=y ++# CONFIG_PROFILING is not set ++# CONFIG_MARKERS is not set ++ ++# ++# Kernel hacking ++# ++# CONFIG_PRINTK_TIME is not set ++CONFIG_ENABLE_WARN_DEPRECATED=y ++# CONFIG_ENABLE_MUST_CHECK is not set ++# CONFIG_MAGIC_SYSRQ is not set ++# CONFIG_UNUSED_SYMBOLS is not set ++# CONFIG_DEBUG_FS is not set ++# CONFIG_HEADERS_CHECK is not set ++CONFIG_DEBUG_KERNEL=y ++CONFIG_DETECT_SOFTLOCKUP=y ++CONFIG_SCHED_DEBUG=y ++# CONFIG_SCHEDSTATS is not set ++# CONFIG_TIMER_STATS is not set ++CONFIG_DEBUG_SLAB=y ++# CONFIG_DEBUG_SLAB_LEAK is not set ++# CONFIG_DEBUG_RT_MUTEXES is not set ++# CONFIG_RT_MUTEX_TESTER is not set ++# CONFIG_DEBUG_SPINLOCK is not set ++# CONFIG_DEBUG_MUTEXES is not set ++# CONFIG_DEBUG_SPINLOCK_SLEEP is not set ++# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set ++# CONFIG_DEBUG_KOBJECT is not set ++CONFIG_DEBUG_BUGVERBOSE=y ++CONFIG_DEBUG_INFO=y ++# CONFIG_DEBUG_VM is not set ++# CONFIG_DEBUG_LIST is not set ++# CONFIG_DEBUG_SG is not set ++# CONFIG_FRAME_POINTER is not set ++CONFIG_FORCED_INLINING=y ++# CONFIG_BOOT_PRINTK_DELAY is not set ++# CONFIG_RCU_TORTURE_TEST is not set ++# CONFIG_FAULT_INJECTION is not set ++# CONFIG_SAMPLES is not set ++CONFIG_BOOTPARAM=y ++CONFIG_BOOTPARAM_STRING="root=/dev/nfs rw nfsroot=172.27.163.2:/tftpboot/ltib ip=172.27.163.3:172.27.163.2:172.27.255.254:255.255.0.0::eth0:off mtdparts=phys_mapped_flash:16m(User)" ++ ++# ++# CodeTEST Setup ++# ++# CONFIG_CODETEST is not set ++ ++# ++# Security options ++# ++# CONFIG_KEYS is not set ++# CONFIG_SECURITY is not set ++# CONFIG_SECURITY_FILE_CAPABILITIES is not set ++CONFIG_CRYPTO=y ++CONFIG_CRYPTO_ALGAPI=y ++CONFIG_CRYPTO_BLKCIPHER=y ++CONFIG_CRYPTO_HASH=y ++CONFIG_CRYPTO_MANAGER=y ++CONFIG_CRYPTO_HMAC=y ++# CONFIG_CRYPTO_XCBC is not set ++# CONFIG_CRYPTO_NULL is not set ++# CONFIG_CRYPTO_MD4 is not set ++CONFIG_CRYPTO_MD5=y ++CONFIG_CRYPTO_SHA1=y ++# CONFIG_CRYPTO_SHA256 is not set ++# CONFIG_CRYPTO_SHA512 is not set ++# CONFIG_CRYPTO_WP512 is not set ++# CONFIG_CRYPTO_TGR192 is not set ++# CONFIG_CRYPTO_GF128MUL is not set ++# CONFIG_CRYPTO_ECB is not set ++CONFIG_CRYPTO_CBC=y ++# CONFIG_CRYPTO_PCBC is not set ++# CONFIG_CRYPTO_LRW is not set ++# CONFIG_CRYPTO_XTS is not set ++# CONFIG_CRYPTO_CRYPTD is not set ++CONFIG_CRYPTO_DES=y ++# CONFIG_CRYPTO_FCRYPT is not set ++# CONFIG_CRYPTO_BLOWFISH is not set ++# CONFIG_CRYPTO_TWOFISH is not set ++# CONFIG_CRYPTO_SERPENT is not set ++# CONFIG_CRYPTO_AES is not set ++# CONFIG_CRYPTO_CAST5 is not set ++# CONFIG_CRYPTO_CAST6 is not set ++# CONFIG_CRYPTO_TEA is not set ++# CONFIG_CRYPTO_ARC4 is not set ++# CONFIG_CRYPTO_KHAZAD is not set ++# CONFIG_CRYPTO_ANUBIS is not set ++# CONFIG_CRYPTO_SEED is not set ++# CONFIG_CRYPTO_DEFLATE is not set ++# CONFIG_CRYPTO_MICHAEL_MIC is not set ++# CONFIG_CRYPTO_CRC32C is not set ++# CONFIG_CRYPTO_CAMELLIA is not set ++CONFIG_CRYPTO_TEST=m ++# CONFIG_CRYPTO_AUTHENC is not set ++# CONFIG_CRYPTO_HW is not set ++ ++# ++# Library routines ++# ++CONFIG_BITREVERSE=y ++CONFIG_CRC_CCITT=y ++CONFIG_CRC16=y ++# CONFIG_CRC_ITU_T is not set ++CONFIG_CRC32=y ++# CONFIG_CRC7 is not set ++CONFIG_LIBCRC32C=y ++CONFIG_PLIST=y ++CONFIG_HAS_IOMEM=y ++CONFIG_HAS_IOPORT=y ++CONFIG_HAS_DMA=y +--- a/drivers/serial/mcfserial.c ++++ b/drivers/serial/mcfserial.c +@@ -45,6 +45,11 @@ + #include <asm/coldfire.h> + #include <asm/mcfsim.h> + #include <asm/mcfuart.h> ++#if defined(CONFIG_M547X_8X) ++#include <asm/m5485sim.h> ++#include <asm/m5485psc.h> ++#include <asm/m5485gpio.h> ++#endif + #ifdef CONFIG_NETtel + #include <asm/nettel.h> + #endif +@@ -64,7 +69,7 @@ struct timer_list mcfrs_timer_struct; + #define DEFAULT_CBAUD B38400 + #elif defined(CONFIG_MOD5272) || defined(CONFIG_M5208EVB) || \ + defined(CONFIG_M5329EVB) || defined(CONFIG_GILBARCO) || \ +- defined(CONFIG_M54455) ++ defined(CONFIG_M54455) || defined(CONFIG_M547X_8X) + #define CONSOLE_BAUD_RATE 115200 + #define DEFAULT_CBAUD B115200 + #elif defined(CONFIG_ARNEWSH) || defined(CONFIG_FREESCALE) || \ +@@ -97,7 +102,8 @@ static struct tty_driver *mcfrs_serial_d + #undef SERIAL_DEBUG_FLOW + + #if defined(CONFIG_M523x) || defined(CONFIG_M527x) || defined(CONFIG_M528x) || \ +- defined(CONFIG_M520x) || defined(CONFIG_M532x) || defined(CONFIG_M54455) ++ defined(CONFIG_M520x) || defined(CONFIG_M532x) || defined(CONFIG_M54455) || \ ++ defined(CONFIG_M547X_8X) + #define IRQBASE (MCFINT_VECBASE+MCFINT_UART0) + #else + #define IRQBASE 73 +@@ -117,7 +123,11 @@ static struct mcf_serial mcfrs_table[] = + { /* ttyS1 */ + .magic = 0, + .addr = (volatile unsigned char *) (MCF_MBAR+MCFUART_BASE2), ++#if defined(CONFIG_M547X_8X) ++ .irq = IRQBASE-1, ++#else + .irq = IRQBASE+1, ++#endif + .flags = ASYNC_BOOT_AUTOCONF, + }, + #endif +@@ -125,7 +135,11 @@ static struct mcf_serial mcfrs_table[] = + { /* ttyS2 */ + .magic = 0, + .addr = (volatile unsigned char *) (MCF_MBAR+MCFUART_BASE3), ++#if defined(CONFIG_M547X_8X) ++ .irq = IRQBASE-2, ++#else + .irq = IRQBASE+2, ++#endif + .flags = ASYNC_BOOT_AUTOCONF, + }, + #endif +@@ -133,7 +147,11 @@ static struct mcf_serial mcfrs_table[] = + { /* ttyS3 */ + .magic = 0, + .addr = (volatile unsigned char *) (MCF_MBAR+MCFUART_BASE4), ++#if defined(CONFIG_M547X_8X) ++ .irq = IRQBASE-3, ++#else + .irq = IRQBASE+3, ++#endif + .flags = ASYNC_BOOT_AUTOCONF, + }, + #endif +@@ -412,7 +430,12 @@ irqreturn_t mcfrs_interrupt(int irq, voi + struct mcf_serial *info; + unsigned char isr; + ++/* JKM -- revisit! IRQ compute */ ++#if defined(CONFIG_M547X_8X) ++ info = &mcfrs_table[(IRQBASE - irq)]; ++#else + info = &mcfrs_table[(irq - IRQBASE)]; ++#endif + isr = info->addr[MCFUART_UISR] & info->imr; + + if (isr & MCFUART_UIR_RXREADY) +@@ -1621,6 +1644,22 @@ static void mcfrs_irqinit(struct mcf_ser + /* GPIOs also must be initalized, depends on board */ + break; + } ++#elif defined(CONFIG_M547X_8X) ++ volatile unsigned char *uartp; ++ uartp = (volatile unsigned char *)info->addr; ++ ++ if (info->line > 3) { ++ printk("SERIAL: don't know how to handle UART %d interrupt?\n", ++ info->line); ++ return; ++ } ++ ++ /* Set GPIO port register to enable PSC(port) signals */ ++ MCF_PAR_PSCn(info->line) = (0 ++ | MCF_PAR_PSC_TXD ++ | MCF_PAR_PSC_RXD); ++ ++ MCF_ICR(info->irq - 64) = ILP_PSCn(info->line); + #else + volatile unsigned char *icrp, *uartp; + +@@ -1983,7 +2022,7 @@ struct console mcfrs_console = { + + static int __init mcfrs_console_init(void) + { +-#ifndef CONFIG_M54455 ++#if !(defined(CONFIG_M54455) || defined(CONFIG_M547X_8X)) + register_console(&mcfrs_console); + #endif + return 0; +--- a/include/asm-m68k/cf_pgalloc.h ++++ b/include/asm-m68k/cf_pgalloc.h +@@ -1,9 +1,14 @@ + #ifndef M68K_CF_PGALLOC_H + #define M68K_CF_PGALLOC_H + ++/* JKM -- added -- needed? */ ++#include <linux/highmem.h> ++ + #include <asm/coldfire.h> + #include <asm/page.h> + #include <asm/cf_tlbflush.h> ++/* JKM -- added -- needed? */ ++#include <asm/cf_cacheflush.h> + + extern inline void pte_free_kernel(pte_t *pte) + { +--- a/include/asm-m68k/cfcache.h ++++ b/include/asm-m68k/cfcache.h +@@ -70,7 +70,33 @@ + /* cache disabled for testing */ + #define CACHE_INITIAL_MODE (CF_CACR_EUSP) + #endif /* CONFIG_M5445X_DISABLE_CACHE */ +-#endif /* CONFIG_M54455 */ ++ ++#elif defined(CONFIG_M547X_8X) ++/* ++ * M547x/M548x Cache Configuration ++ * - cache line size is 16 bytes ++ * - cache is 4-way set associative ++ * - each cache has 512 sets (128k / 16bytes / 4way) ++ * - I-Cache size is 32KB ++ * - D-Cache size is 32KB ++ */ ++#define ICACHE_SIZE 0x8000 /* instruction - 32k */ ++#define DCACHE_SIZE 0x8000 /* data - 32k */ ++ ++#define CACHE_LINE_SIZE 0x0010 /* 16 bytes */ ++#define CACHE_SETS 0x0200 /* 512 sets */ ++#define CACHE_WAYS 0x0004 /* 4 way */ ++ ++#define CACHE_DISABLE_MODE (CF_CACR_DCINVA+ \ ++ CF_CACR_BCINVA+ \ ++ CF_CACR_ICINVA) ++ ++#define CACHE_INITIAL_MODE (CF_CACR_DEC+ \ ++ CF_CACR_BEC+ \ ++ CF_CACR_IEC+ \ ++ CF_CACR_DESB+ \ ++ CF_CACR_EUSP) ++#endif /* CONFIG_M547X_8X */ + + #ifndef __ASSEMBLY__ + +--- a/include/asm-m68k/coldfire.h ++++ b/include/asm-m68k/coldfire.h +@@ -1,9 +1,16 @@ + #ifndef _COLDFIRE_H_ + #define _COLDFIRE_H_ + ++#if defined(CONFIG_M54455) + #define MCF_MBAR 0x0 + #define MCF_RAMBAR1 0x40000000 + #define MCF_SRAM 0x80000000 ++#elif defined(CONFIG_M547X_8X) ++#define MCF_MBAR 0xE0000000 ++#define MCF_RAMBAR0 0xE3000000 ++#define MCF_RAMBAR1 0xE3001000 ++#endif ++ + #define MCF_CLK CONFIG_MCFCLK + #define MCF_BUSCLK (CONFIG_MCFCLK/2) + +--- /dev/null ++++ b/include/asm-m68k/m5485gpio.h +@@ -0,0 +1,694 @@ ++/* ++ * File: mcf548x_gpio.h ++ * Purpose: Register and bit definitions for the MCF548X ++ * ++ * Notes: ++ * ++ */ ++ ++#ifndef _M5485GPIO_H_ ++#define _M5485GPIO_H_ ++ ++/********************************************************************* ++* ++* General Purpose I/O (GPIO) ++* ++*********************************************************************/ ++ ++/* Register read/write macros */ ++#define MCF_GPIO_PODR_FBCTL MCF_REG08(0x000A00) ++#define MCF_GPIO_PODR_FBCS MCF_REG08(0x000A01) ++#define MCF_GPIO_PODR_DMA MCF_REG08(0x000A02) ++#define MCF_GPIO_PODR_FEC0H MCF_REG08(0x000A04) ++#define MCF_GPIO_PODR_FEC0L MCF_REG08(0x000A05) ++#define MCF_GPIO_PODR_FEC1H MCF_REG08(0x000A06) ++#define MCF_GPIO_PODR_FEC1L MCF_REG08(0x000A07) ++#define MCF_GPIO_PODR_FECI2C MCF_REG08(0x000A08) ++#define MCF_GPIO_PODR_PCIBG MCF_REG08(0x000A09) ++#define MCF_GPIO_PODR_PCIBR MCF_REG08(0x000A0A) ++#define MCF_GPIO_PODR_PSC3PSC2 MCF_REG08(0x000A0C) ++#define MCF_GPIO_PODR_PSC1PSC0 MCF_REG08(0x000A0D) ++#define MCF_GPIO_PODR_DSPI MCF_REG08(0x000A0E) ++#define MCF_GPIO_PDDR_FBCTL MCF_REG08(0x000A10) ++#define MCF_GPIO_PDDR_FBCS MCF_REG08(0x000A11) ++#define MCF_GPIO_PDDR_DMA MCF_REG08(0x000A12) ++#define MCF_GPIO_PDDR_FEC0H MCF_REG08(0x000A14) ++#define MCF_GPIO_PDDR_FEC0L MCF_REG08(0x000A15) ++#define MCF_GPIO_PDDR_FEC1H MCF_REG08(0x000A16) ++#define MCF_GPIO_PDDR_FEC1L MCF_REG08(0x000A17) ++#define MCF_GPIO_PDDR_FECI2C MCF_REG08(0x000A18) ++#define MCF_GPIO_PDDR_PCIBG MCF_REG08(0x000A19) ++#define MCF_GPIO_PDDR_PCIBR MCF_REG08(0x000A1A) ++#define MCF_GPIO_PDDR_PSC3PSC2 MCF_REG08(0x000A1C) ++#define MCF_GPIO_PDDR_PSC1PSC0 MCF_REG08(0x000A1D) ++#define MCF_GPIO_PDDR_DSPI MCF_REG08(0x000A1E) ++#define MCF_GPIO_PPDSDR_FBCTL MCF_REG08(0x000A20) ++#define MCF_GPIO_PPDSDR_FBCS MCF_REG08(0x000A21) ++#define MCF_GPIO_PPDSDR_DMA MCF_REG08(0x000A22) ++#define MCF_GPIO_PPDSDR_FEC0H MCF_REG08(0x000A24) ++#define MCF_GPIO_PPDSDR_FEC0L MCF_REG08(0x000A25) ++#define MCF_GPIO_PPDSDR_FEC1H MCF_REG08(0x000A26) ++#define MCF_GPIO_PPDSDR_FEC1L MCF_REG08(0x000A27) ++#define MCF_GPIO_PPDSDR_FECI2C MCF_REG08(0x000A28) ++#define MCF_GPIO_PPDSDR_PCIBG MCF_REG08(0x000A29) ++#define MCF_GPIO_PPDSDR_PCIBR MCF_REG08(0x000A2A) ++#define MCF_GPIO_PPDSDR_PSC3PSC2 MCF_REG08(0x000A2C) ++#define MCF_GPIO_PPDSDR_PSC1PSC0 MCF_REG08(0x000A2D) ++#define MCF_GPIO_PPDSDR_DSPI MCF_REG08(0x000A2E) ++#define MCF_GPIO_PCLRR_FBCTL MCF_REG08(0x000A30) ++#define MCF_GPIO_PCLRR_FBCS MCF_REG08(0x000A31) ++#define MCF_GPIO_PCLRR_DMA MCF_REG08(0x000A32) ++#define MCF_GPIO_PCLRR_FEC0H MCF_REG08(0x000A34) ++#define MCF_GPIO_PCLRR_FEC0L MCF_REG08(0x000A35) ++#define MCF_GPIO_PCLRR_FEC1H MCF_REG08(0x000A36) ++#define MCF_GPIO_PCLRR_FEC1L MCF_REG08(0x000A37) ++#define MCF_GPIO_PCLRR_FECI2C MCF_REG08(0x000A38) ++#define MCF_GPIO_PCLRR_PCIBG MCF_REG08(0x000A39) ++#define MCF_GPIO_PCLRR_PCIBR MCF_REG08(0x000A3A) ++#define MCF_GPIO_PCLRR_PSC3PSC2 MCF_REG08(0x000A3C) ++#define MCF_GPIO_PCLRR_PSC1PSC0 MCF_REG08(0x000A3D) ++#define MCF_GPIO_PCLRR_DSPI MCF_REG08(0x000A3E) ++#define MCF_GPIO_PAR_FBCTL MCF_REG16(0x000A40) ++#define MCF_GPIO_PAR_FBCS MCF_REG08(0x000A42) ++#define MCF_GPIO_PAR_DMA MCF_REG08(0x000A43) ++#define MCF_GPIO_PAR_FECI2CIRQ MCF_REG16(0x000A44) ++#define MCF_GPIO_PAR_PCIBG MCF_REG16(0x000A48) ++#define MCF_GPIO_PAR_PCIBR MCF_REG16(0x000A4A) ++#define MCF_GPIO_PAR_PSC3 MCF_REG08(0x000A4C) ++#define MCF_GPIO_PAR_PSC2 MCF_REG08(0x000A4D) ++#define MCF_GPIO_PAR_PSC1 MCF_REG08(0x000A4E) ++#define MCF_GPIO_PAR_PSC0 MCF_REG08(0x000A4F) ++#define MCF_GPIO_PAR_DSPI MCF_REG16(0x000A50) ++#define MCF_GPIO_PAR_TIMER MCF_REG08(0x000A52) ++ ++/* Bit definitions and macros for MCF_GPIO_PODR_FBCTL */ ++#define MCF_GPIO_PODR_FBCTL_PODRFBCTL0 (0x01) ++#define MCF_GPIO_PODR_FBCTL_PODRFBCTL1 (0x02) ++#define MCF_GPIO_PODR_FBCTL_PODRFBCTL2 (0x04) ++#define MCF_GPIO_PODR_FBCTL_PODRFBCTL3 (0x08) ++#define MCF_GPIO_PODR_FBCTL_PODRFBCTL4 (0x10) ++#define MCF_GPIO_PODR_FBCTL_PODRFBCTL5 (0x20) ++#define MCF_GPIO_PODR_FBCTL_PODRFBCTL6 (0x40) ++#define MCF_GPIO_PODR_FBCTL_PODRFBCTL7 (0x80) ++ ++/* Bit definitions and macros for MCF_GPIO_PODR_FBCS */ ++#define MCF_GPIO_PODR_FBCS_PODRFBCS1 (0x02) ++#define MCF_GPIO_PODR_FBCS_PODRFBCS2 (0x04) ++#define MCF_GPIO_PODR_FBCS_PODRFBCS3 (0x08) ++#define MCF_GPIO_PODR_FBCS_PODRFBCS4 (0x10) ++#define MCF_GPIO_PODR_FBCS_PODRFBCS5 (0x20) ++ ++/* Bit definitions and macros for MCF_GPIO_PODR_DMA */ ++#define MCF_GPIO_PODR_DMA_PODRDMA0 (0x01) ++#define MCF_GPIO_PODR_DMA_PODRDMA1 (0x02) ++#define MCF_GPIO_PODR_DMA_PODRDMA2 (0x04) ++#define MCF_GPIO_PODR_DMA_PODRDMA3 (0x08) ++ ++/* Bit definitions and macros for MCF_GPIO_PODR_FEC0H */ ++#define MCF_GPIO_PODR_FEC0H_PODRFEC0H0 (0x01) ++#define MCF_GPIO_PODR_FEC0H_PODRFEC0H1 (0x02) ++#define MCF_GPIO_PODR_FEC0H_PODRFEC0H2 (0x04) ++#define MCF_GPIO_PODR_FEC0H_PODRFEC0H3 (0x08) ++#define MCF_GPIO_PODR_FEC0H_PODRFEC0H4 (0x10) ++#define MCF_GPIO_PODR_FEC0H_PODRFEC0H5 (0x20) ++#define MCF_GPIO_PODR_FEC0H_PODRFEC0H6 (0x40) ++#define MCF_GPIO_PODR_FEC0H_PODRFEC0H7 (0x80) ++ ++/* Bit definitions and macros for MCF_GPIO_PODR_FEC0L */ ++#define MCF_GPIO_PODR_FEC0L_PODRFEC0L0 (0x01) ++#define MCF_GPIO_PODR_FEC0L_PODRFEC0L1 (0x02) ++#define MCF_GPIO_PODR_FEC0L_PODRFEC0L2 (0x04) ++#define MCF_GPIO_PODR_FEC0L_PODRFEC0L3 (0x08) ++#define MCF_GPIO_PODR_FEC0L_PODRFEC0L4 (0x10) ++#define MCF_GPIO_PODR_FEC0L_PODRFEC0L5 (0x20) ++#define MCF_GPIO_PODR_FEC0L_PODRFEC0L6 (0x40) ++#define MCF_GPIO_PODR_FEC0L_PODRFEC0L7 (0x80) ++ ++/* Bit definitions and macros for MCF_GPIO_PODR_FEC1H */ ++#define MCF_GPIO_PODR_FEC1H_PODRFEC1H0 (0x01) ++#define MCF_GPIO_PODR_FEC1H_PODRFEC1H1 (0x02) ++#define MCF_GPIO_PODR_FEC1H_PODRFEC1H2 (0x04) ++#define MCF_GPIO_PODR_FEC1H_PODRFEC1H3 (0x08) ++#define MCF_GPIO_PODR_FEC1H_PODRFEC1H4 (0x10) ++#define MCF_GPIO_PODR_FEC1H_PODRFEC1H5 (0x20) ++#define MCF_GPIO_PODR_FEC1H_PODRFEC1H6 (0x40) ++#define MCF_GPIO_PODR_FEC1H_PODRFEC1H7 (0x80) ++ ++/* Bit definitions and macros for MCF_GPIO_PODR_FEC1L */ ++#define MCF_GPIO_PODR_FEC1L_PODRFEC1L0 (0x01) ++#define MCF_GPIO_PODR_FEC1L_PODRFEC1L1 (0x02) ++#define MCF_GPIO_PODR_FEC1L_PODRFEC1L2 (0x04) ++#define MCF_GPIO_PODR_FEC1L_PODRFEC1L3 (0x08) ++#define MCF_GPIO_PODR_FEC1L_PODRFEC1L4 (0x10) ++#define MCF_GPIO_PODR_FEC1L_PODRFEC1L5 (0x20) ++#define MCF_GPIO_PODR_FEC1L_PODRFEC1L6 (0x40) ++#define MCF_GPIO_PODR_FEC1L_PODRFEC1L7 (0x80) ++ ++/* Bit definitions and macros for MCF_GPIO_PODR_FECI2C */ ++#define MCF_GPIO_PODR_FECI2C_PODRFECI2C0 (0x01) ++#define MCF_GPIO_PODR_FECI2C_PODRFECI2C1 (0x02) ++#define MCF_GPIO_PODR_FECI2C_PODRFECI2C2 (0x04) ++#define MCF_GPIO_PODR_FECI2C_PODRFECI2C3 (0x08) ++ ++/* Bit definitions and macros for MCF_GPIO_PODR_PCIBG */ ++#define MCF_GPIO_PODR_PCIBG_PODRPCIBG0 (0x01) ++#define MCF_GPIO_PODR_PCIBG_PODRPCIBG1 (0x02) ++#define MCF_GPIO_PODR_PCIBG_PODRPCIBG2 (0x04) ++#define MCF_GPIO_PODR_PCIBG_PODRPCIBG3 (0x08) ++#define MCF_GPIO_PODR_PCIBG_PODRPCIBG4 (0x10) ++ ++/* Bit definitions and macros for MCF_GPIO_PODR_PCIBR */ ++#define MCF_GPIO_PODR_PCIBR_PODRPCIBR0 (0x01) ++#define MCF_GPIO_PODR_PCIBR_PODRPCIBR1 (0x02) ++#define MCF_GPIO_PODR_PCIBR_PODRPCIBR2 (0x04) ++#define MCF_GPIO_PODR_PCIBR_PODRPCIBR3 (0x08) ++#define MCF_GPIO_PODR_PCIBR_PODRPCIBR4 (0x10) ++ ++/* Bit definitions and macros for MCF_GPIO_PODR_PSC3PSC2 */ ++#define MCF_GPIO_PODR_PSC3PSC2_PODRPSC3PSC20 (0x01) ++#define MCF_GPIO_PODR_PSC3PSC2_PODRPSC3PSC21 (0x02) ++#define MCF_GPIO_PODR_PSC3PSC2_PODRPSC3PSC22 (0x04) ++#define MCF_GPIO_PODR_PSC3PSC2_PODRPSC3PSC23 (0x08) ++#define MCF_GPIO_PODR_PSC3PSC2_PODRPSC3PSC24 (0x10) ++#define MCF_GPIO_PODR_PSC3PSC2_PODRPSC3PSC25 (0x20) ++#define MCF_GPIO_PODR_PSC3PSC2_PODRPSC3PSC26 (0x40) ++#define MCF_GPIO_PODR_PSC3PSC2_PODRPSC3PSC27 (0x80) ++ ++/* Bit definitions and macros for MCF_GPIO_PODR_PSC1PSC0 */ ++#define MCF_GPIO_PODR_PSC1PSC0_PODRPSC1PSC00 (0x01) ++#define MCF_GPIO_PODR_PSC1PSC0_PODRPSC1PSC01 (0x02) ++#define MCF_GPIO_PODR_PSC1PSC0_PODRPSC1PSC02 (0x04) ++#define MCF_GPIO_PODR_PSC1PSC0_PODRPSC1PSC03 (0x08) ++#define MCF_GPIO_PODR_PSC1PSC0_PODRPSC1PSC04 (0x10) ++#define MCF_GPIO_PODR_PSC1PSC0_PODRPSC1PSC05 (0x20) ++#define MCF_GPIO_PODR_PSC1PSC0_PODRPSC1PSC06 (0x40) ++#define MCF_GPIO_PODR_PSC1PSC0_PODRPSC1PSC07 (0x80) ++ ++/* Bit definitions and macros for MCF_GPIO_PODR_DSPI */ ++#define MCF_GPIO_PODR_DSPI_PODRDSPI0 (0x01) ++#define MCF_GPIO_PODR_DSPI_PODRDSPI1 (0x02) ++#define MCF_GPIO_PODR_DSPI_PODRDSPI2 (0x04) ++#define MCF_GPIO_PODR_DSPI_PODRDSPI3 (0x08) ++#define MCF_GPIO_PODR_DSPI_PODRDSPI4 (0x10) ++#define MCF_GPIO_PODR_DSPI_PODRDSPI5 (0x20) ++#define MCF_GPIO_PODR_DSPI_PODRDSPI6 (0x40) ++ ++/* Bit definitions and macros for MCF_GPIO_PDDR_FBCTL */ ++#define MCF_GPIO_PDDR_FBCTL_PDDRFBCTL0 (0x01) ++#define MCF_GPIO_PDDR_FBCTL_PDDRFBCTL1 (0x02) ++#define MCF_GPIO_PDDR_FBCTL_PDDRFBCTL2 (0x04) ++#define MCF_GPIO_PDDR_FBCTL_PDDRFBCTL3 (0x08) ++#define MCF_GPIO_PDDR_FBCTL_PDDRFBCTL4 (0x10) ++#define MCF_GPIO_PDDR_FBCTL_PDDRFBCTL5 (0x20) ++#define MCF_GPIO_PDDR_FBCTL_PDDRFBCTL6 (0x40) ++#define MCF_GPIO_PDDR_FBCTL_PDDRFBCTL7 (0x80) ++ ++/* Bit definitions and macros for MCF_GPIO_PDDR_FBCS */ ++#define MCF_GPIO_PDDR_FBCS_PDDRFBCS1 (0x02) ++#define MCF_GPIO_PDDR_FBCS_PDDRFBCS2 (0x04) ++#define MCF_GPIO_PDDR_FBCS_PDDRFBCS3 (0x08) ++#define MCF_GPIO_PDDR_FBCS_PDDRFBCS4 (0x10) ++#define MCF_GPIO_PDDR_FBCS_PDDRFBCS5 (0x20) ++ ++/* Bit definitions and macros for MCF_GPIO_PDDR_DMA */ ++#define MCF_GPIO_PDDR_DMA_PDDRDMA0 (0x01) ++#define MCF_GPIO_PDDR_DMA_PDDRDMA1 (0x02) ++#define MCF_GPIO_PDDR_DMA_PDDRDMA2 (0x04) ++#define MCF_GPIO_PDDR_DMA_PDDRDMA3 (0x08) ++ ++/* Bit definitions and macros for MCF_GPIO_PDDR_FEC0H */ ++#define MCF_GPIO_PDDR_FEC0H_PDDRFEC0H0 (0x01) ++#define MCF_GPIO_PDDR_FEC0H_PDDRFEC0H1 (0x02) ++#define MCF_GPIO_PDDR_FEC0H_PDDRFEC0H2 (0x04) ++#define MCF_GPIO_PDDR_FEC0H_PDDRFEC0H3 (0x08) ++#define MCF_GPIO_PDDR_FEC0H_PDDRFEC0H4 (0x10) ++#define MCF_GPIO_PDDR_FEC0H_PDDRFEC0H5 (0x20) ++#define MCF_GPIO_PDDR_FEC0H_PDDRFEC0H6 (0x40) ++#define MCF_GPIO_PDDR_FEC0H_PDDRFEC0H7 (0x80) ++ ++/* Bit definitions and macros for MCF_GPIO_PDDR_FEC0L */ ++#define MCF_GPIO_PDDR_FEC0L_PDDRFEC0L0 (0x01) ++#define MCF_GPIO_PDDR_FEC0L_PDDRFEC0L1 (0x02) ++#define MCF_GPIO_PDDR_FEC0L_PDDRFEC0L2 (0x04) ++#define MCF_GPIO_PDDR_FEC0L_PDDRFEC0L3 (0x08) ++#define MCF_GPIO_PDDR_FEC0L_PDDRFEC0L4 (0x10) ++#define MCF_GPIO_PDDR_FEC0L_PDDRFEC0L5 (0x20) ++#define MCF_GPIO_PDDR_FEC0L_PDDRFEC0L6 (0x40) ++#define MCF_GPIO_PDDR_FEC0L_PDDRFEC0L7 (0x80) ++ ++/* Bit definitions and macros for MCF_GPIO_PDDR_FEC1H */ ++#define MCF_GPIO_PDDR_FEC1H_PDDRFEC1H0 (0x01) ++#define MCF_GPIO_PDDR_FEC1H_PDDRFEC1H1 (0x02) ++#define MCF_GPIO_PDDR_FEC1H_PDDRFEC1H2 (0x04) ++#define MCF_GPIO_PDDR_FEC1H_PDDRFEC1H3 (0x08) ++#define MCF_GPIO_PDDR_FEC1H_PDDRFEC1H4 (0x10) ++#define MCF_GPIO_PDDR_FEC1H_PDDRFEC1H5 (0x20) ++#define MCF_GPIO_PDDR_FEC1H_PDDRFEC1H6 (0x40) ++#define MCF_GPIO_PDDR_FEC1H_PDDRFEC1H7 (0x80) ++ ++/* Bit definitions and macros for MCF_GPIO_PDDR_FEC1L */ ++#define MCF_GPIO_PDDR_FEC1L_PDDRFEC1L0 (0x01) ++#define MCF_GPIO_PDDR_FEC1L_PDDRFEC1L1 (0x02) ++#define MCF_GPIO_PDDR_FEC1L_PDDRFEC1L2 (0x04) ++#define MCF_GPIO_PDDR_FEC1L_PDDRFEC1L3 (0x08) ++#define MCF_GPIO_PDDR_FEC1L_PDDRFEC1L4 (0x10) ++#define MCF_GPIO_PDDR_FEC1L_PDDRFEC1L5 (0x20) ++#define MCF_GPIO_PDDR_FEC1L_PDDRFEC1L6 (0x40) ++#define MCF_GPIO_PDDR_FEC1L_PDDRFEC1L7 (0x80) ++ ++/* Bit definitions and macros for MCF_GPIO_PDDR_FECI2C */ ++#define MCF_GPIO_PDDR_FECI2C_PDDRFECI2C0 (0x01) ++#define MCF_GPIO_PDDR_FECI2C_PDDRFECI2C1 (0x02) ++#define MCF_GPIO_PDDR_FECI2C_PDDRFECI2C2 (0x04) ++#define MCF_GPIO_PDDR_FECI2C_PDDRFECI2C3 (0x08) ++ ++/* Bit definitions and macros for MCF_GPIO_PDDR_PCIBG */ ++#define MCF_GPIO_PDDR_PCIBG_PDDRPCIBG0 (0x01) ++#define MCF_GPIO_PDDR_PCIBG_PDDRPCIBG1 (0x02) ++#define MCF_GPIO_PDDR_PCIBG_PDDRPCIBG2 (0x04) ++#define MCF_GPIO_PDDR_PCIBG_PDDRPCIBG3 (0x08) ++#define MCF_GPIO_PDDR_PCIBG_PDDRPCIBG4 (0x10) ++ ++/* Bit definitions and macros for MCF_GPIO_PDDR_PCIBR */ ++#define MCF_GPIO_PDDR_PCIBR_PDDRPCIBR0 (0x01) ++#define MCF_GPIO_PDDR_PCIBR_PDDRPCIBR1 (0x02) ++#define MCF_GPIO_PDDR_PCIBR_PDDRPCIBR2 (0x04) ++#define MCF_GPIO_PDDR_PCIBR_PDDRPCIBR3 (0x08) ++#define MCF_GPIO_PDDR_PCIBR_PDDRPCIBR4 (0x10) ++ ++/* Bit definitions and macros for MCF_GPIO_PDDR_PSC3PSC2 */ ++#define MCF_GPIO_PDDR_PSC3PSC2_PDDRPSC3PSC20 (0x01) ++#define MCF_GPIO_PDDR_PSC3PSC2_PDDRPSC3PSC21 (0x02) ++#define MCF_GPIO_PDDR_PSC3PSC2_PDDRPSC3PSC22 (0x04) ++#define MCF_GPIO_PDDR_PSC3PSC2_PDDRPSC3PSC23 (0x08) ++#define MCF_GPIO_PDDR_PSC3PSC2_PDDRPSC3PSC24 (0x10) ++#define MCF_GPIO_PDDR_PSC3PSC2_PDDRPSC3PSC25 (0x20) ++#define MCF_GPIO_PDDR_PSC3PSC2_PDDRPSC3PSC26 (0x40) ++#define MCF_GPIO_PDDR_PSC3PSC2_PDDRPSC3PSC27 (0x80) ++ ++/* Bit definitions and macros for MCF_GPIO_PDDR_PSC1PSC0 */ ++#define MCF_GPIO_PDDR_PSC1PSC0_PDDRPSC1PSC00 (0x01) ++#define MCF_GPIO_PDDR_PSC1PSC0_PDDRPSC1PSC01 (0x02) ++#define MCF_GPIO_PDDR_PSC1PSC0_PDDRPSC1PSC02 (0x04) ++#define MCF_GPIO_PDDR_PSC1PSC0_PDDRPSC1PSC03 (0x08) ++#define MCF_GPIO_PDDR_PSC1PSC0_PDDRPSC1PSC04 (0x10) ++#define MCF_GPIO_PDDR_PSC1PSC0_PDDRPSC1PSC05 (0x20) ++#define MCF_GPIO_PDDR_PSC1PSC0_PDDRPSC1PSC06 (0x40) ++#define MCF_GPIO_PDDR_PSC1PSC0_PDDRPSC1PSC07 (0x80) ++ ++/* Bit definitions and macros for MCF_GPIO_PDDR_DSPI */ ++#define MCF_GPIO_PDDR_DSPI_PDDRDSPI0 (0x01) ++#define MCF_GPIO_PDDR_DSPI_PDDRDSPI1 (0x02) ++#define MCF_GPIO_PDDR_DSPI_PDDRDSPI2 (0x04) ++#define MCF_GPIO_PDDR_DSPI_PDDRDSPI3 (0x08) ++#define MCF_GPIO_PDDR_DSPI_PDDRDSPI4 (0x10) ++#define MCF_GPIO_PDDR_DSPI_PDDRDSPI5 (0x20) ++#define MCF_GPIO_PDDR_DSPI_PDDRDSPI6 (0x40) ++ ++/* Bit definitions and macros for MCF_GPIO_PPDSDR_FBCTL */ ++#define MCF_GPIO_PPDSDR_FBCTL_PPDSDRFBCTL0 (0x01) ++#define MCF_GPIO_PPDSDR_FBCTL_PPDSDRFBCTL1 (0x02) ++#define MCF_GPIO_PPDSDR_FBCTL_PPDSDRFBCTL2 (0x04) ++#define MCF_GPIO_PPDSDR_FBCTL_PPDSDRFBCTL3 (0x08) ++#define MCF_GPIO_PPDSDR_FBCTL_PPDSDRFBCTL4 (0x10) ++#define MCF_GPIO_PPDSDR_FBCTL_PPDSDRFBCTL5 (0x20) ++#define MCF_GPIO_PPDSDR_FBCTL_PPDSDRFBCTL6 (0x40) ++#define MCF_GPIO_PPDSDR_FBCTL_PPDSDRFBCTL7 (0x80) ++ ++/* Bit definitions and macros for MCF_GPIO_PPDSDR_FBCS */ ++#define MCF_GPIO_PPDSDR_FBCS_PPDSDRFBCS1 (0x02) ++#define MCF_GPIO_PPDSDR_FBCS_PPDSDRFBCS2 (0x04) ++#define MCF_GPIO_PPDSDR_FBCS_PPDSDRFBCS3 (0x08) ++#define MCF_GPIO_PPDSDR_FBCS_PPDSDRFBCS4 (0x10) ++#define MCF_GPIO_PPDSDR_FBCS_PPDSDRFBCS5 (0x20) ++ ++/* Bit definitions and macros for MCF_GPIO_PPDSDR_DMA */ ++#define MCF_GPIO_PPDSDR_DMA_PPDSDRDMA0 (0x01) ++#define MCF_GPIO_PPDSDR_DMA_PPDSDRDMA1 (0x02) ++#define MCF_GPIO_PPDSDR_DMA_PPDSDRDMA2 (0x04) ++#define MCF_GPIO_PPDSDR_DMA_PPDSDRDMA3 (0x08) ++ ++/* Bit definitions and macros for MCF_GPIO_PPDSDR_FEC0H */ ++#define MCF_GPIO_PPDSDR_FEC0H_PPDSDRFEC0H0 (0x01) ++#define MCF_GPIO_PPDSDR_FEC0H_PPDSDRFEC0H1 (0x02) ++#define MCF_GPIO_PPDSDR_FEC0H_PPDSDRFEC0H2 (0x04) ++#define MCF_GPIO_PPDSDR_FEC0H_PPDSDRFEC0H3 (0x08) ++#define MCF_GPIO_PPDSDR_FEC0H_PPDSDRFEC0H4 (0x10) ++#define MCF_GPIO_PPDSDR_FEC0H_PPDSDRFEC0H5 (0x20) ++#define MCF_GPIO_PPDSDR_FEC0H_PPDSDRFEC0H6 (0x40) ++#define MCF_GPIO_PPDSDR_FEC0H_PPDSDRFEC0H7 (0x80) ++ ++/* Bit definitions and macros for MCF_GPIO_PPDSDR_FEC0L */ ++#define MCF_GPIO_PPDSDR_FEC0L_PPDSDRFEC0L0 (0x01) ++#define MCF_GPIO_PPDSDR_FEC0L_PPDSDRFEC0L1 (0x02) ++#define MCF_GPIO_PPDSDR_FEC0L_PPDSDRFEC0L2 (0x04) ++#define MCF_GPIO_PPDSDR_FEC0L_PPDSDRFEC0L3 (0x08) ++#define MCF_GPIO_PPDSDR_FEC0L_PPDSDRFEC0L4 (0x10) ++#define MCF_GPIO_PPDSDR_FEC0L_PPDSDRFEC0L5 (0x20) ++#define MCF_GPIO_PPDSDR_FEC0L_PPDSDRFEC0L6 (0x40) ++#define MCF_GPIO_PPDSDR_FEC0L_PPDSDRFEC0L7 (0x80) ++ ++/* Bit definitions and macros for MCF_GPIO_PPDSDR_FEC1H */ ++#define MCF_GPIO_PPDSDR_FEC1H_PPDSDRFEC1H0 (0x01) ++#define MCF_GPIO_PPDSDR_FEC1H_PPDSDRFEC1H1 (0x02) ++#define MCF_GPIO_PPDSDR_FEC1H_PPDSDRFEC1H2 (0x04) ++#define MCF_GPIO_PPDSDR_FEC1H_PPDSDRFEC1H3 (0x08) ++#define MCF_GPIO_PPDSDR_FEC1H_PPDSDRFEC1H4 (0x10) ++#define MCF_GPIO_PPDSDR_FEC1H_PPDSDRFEC1H5 (0x20) ++#define MCF_GPIO_PPDSDR_FEC1H_PPDSDRFEC1H6 (0x40) ++#define MCF_GPIO_PPDSDR_FEC1H_PPDSDRFEC1H7 (0x80) ++ ++/* Bit definitions and macros for MCF_GPIO_PPDSDR_FEC1L */ ++#define MCF_GPIO_PPDSDR_FEC1L_PPDSDRFEC1L0 (0x01) ++#define MCF_GPIO_PPDSDR_FEC1L_PPDSDRFEC1L1 (0x02) ++#define MCF_GPIO_PPDSDR_FEC1L_PPDSDRFEC1L2 (0x04) ++#define MCF_GPIO_PPDSDR_FEC1L_PPDSDRFEC1L3 (0x08) ++#define MCF_GPIO_PPDSDR_FEC1L_PPDSDRFEC1L4 (0x10) ++#define MCF_GPIO_PPDSDR_FEC1L_PPDSDRFEC1L5 (0x20) ++#define MCF_GPIO_PPDSDR_FEC1L_PPDSDRFEC1L6 (0x40) ++#define MCF_GPIO_PPDSDR_FEC1L_PPDSDRFEC1L7 (0x80) ++ ++/* Bit definitions and macros for MCF_GPIO_PPDSDR_FECI2C */ ++#define MCF_GPIO_PPDSDR_FECI2C_PPDSDRFECI2C0 (0x01) ++#define MCF_GPIO_PPDSDR_FECI2C_PPDSDRFECI2C1 (0x02) ++#define MCF_GPIO_PPDSDR_FECI2C_PPDSDRFECI2C2 (0x04) ++#define MCF_GPIO_PPDSDR_FECI2C_PPDSDRFECI2C3 (0x08) ++ ++/* Bit definitions and macros for MCF_GPIO_PPDSDR_PCIBG */ ++#define MCF_GPIO_PPDSDR_PCIBG_PPDSDRPCIBG0 (0x01) ++#define MCF_GPIO_PPDSDR_PCIBG_PPDSDRPCIBG1 (0x02) ++#define MCF_GPIO_PPDSDR_PCIBG_PPDSDRPCIBG2 (0x04) ++#define MCF_GPIO_PPDSDR_PCIBG_PPDSDRPCIBG3 (0x08) ++#define MCF_GPIO_PPDSDR_PCIBG_PPDSDRPCIBG4 (0x10) ++ ++/* Bit definitions and macros for MCF_GPIO_PPDSDR_PCIBR */ ++#define MCF_GPIO_PPDSDR_PCIBR_PPDSDRPCIBR0 (0x01) ++#define MCF_GPIO_PPDSDR_PCIBR_PPDSDRPCIBR1 (0x02) ++#define MCF_GPIO_PPDSDR_PCIBR_PPDSDRPCIBR2 (0x04) ++#define MCF_GPIO_PPDSDR_PCIBR_PPDSDRPCIBR3 (0x08) ++#define MCF_GPIO_PPDSDR_PCIBR_PPDSDRPCIBR4 (0x10) ++ ++/* Bit definitions and macros for MCF_GPIO_PPDSDR_PSC3PSC2 */ ++#define MCF_GPIO_PPDSDR_PSC3PSC2_PPDSDRPSC3PSC20 (0x01) ++#define MCF_GPIO_PPDSDR_PSC3PSC2_PPDSDRPSC3PSC21 (0x02) ++#define MCF_GPIO_PPDSDR_PSC3PSC2_PPDSDRPSC3PSC22 (0x04) ++#define MCF_GPIO_PPDSDR_PSC3PSC2_PPDSDRPSC3PSC23 (0x08) ++#define MCF_GPIO_PPDSDR_PSC3PSC2_PDDRPSC3PSC24 (0x10) ++#define MCF_GPIO_PPDSDR_PSC3PSC2_PDDRPSC3PSC25 (0x20) ++#define MCF_GPIO_PPDSDR_PSC3PSC2_PPDSDRPSC3PSC26 (0x40) ++#define MCF_GPIO_PPDSDR_PSC3PSC2_PPDSDRPSC3PSC27 (0x80) ++ ++/* Bit definitions and macros for MCF_GPIO_PPDSDR_PSC1PSC0 */ ++#define MCF_GPIO_PPDSDR_PSC1PSC0_PPDSDRPSC1PSC00 (0x01) ++#define MCF_GPIO_PPDSDR_PSC1PSC0_PDDRPSC1PSC01 (0x02) ++#define MCF_GPIO_PPDSDR_PSC1PSC0_PPDSDRPSC1PSC02 (0x04) ++#define MCF_GPIO_PPDSDR_PSC1PSC0_PDDRPSC1PSC03 (0x08) ++#define MCF_GPIO_PPDSDR_PSC1PSC0_PPDSDRPSC1PSC04 (0x10) ++#define MCF_GPIO_PPDSDR_PSC1PSC0_PPDSDRPSC1PSC05 (0x20) ++#define MCF_GPIO_PPDSDR_PSC1PSC0_PPDSDRPSC1PSC06 (0x40) ++#define MCF_GPIO_PPDSDR_PSC1PSC0_PPDSDRPSC1PSC07 (0x80) ++ ++/* Bit definitions and macros for MCF_GPIO_PPDSDR_DSPI */ ++#define MCF_GPIO_PPDSDR_DSPI_PPDSDRDSPI0 (0x01) ++#define MCF_GPIO_PPDSDR_DSPI_PPDSDRDSPI1 (0x02) ++#define MCF_GPIO_PPDSDR_DSPI_PPDSDRDSPI2 (0x04) ++#define MCF_GPIO_PPDSDR_DSPI_PPDSDRDSPI3 (0x08) ++#define MCF_GPIO_PPDSDR_DSPI_PDDRDSPI4 (0x10) ++#define MCF_GPIO_PPDSDR_DSPI_PPDSDRDSPI5 (0x20) ++#define MCF_GPIO_PPDSDR_DSPI_PPDSDRDSPI6 (0x40) ++ ++/* Bit definitions and macros for MCF_GPIO_PCLRR_FBCTL */ ++#define MCF_GPIO_PCLRR_FBCTL_PCLRRFBCTL0 (0x01) ++#define MCF_GPIO_PCLRR_FBCTL_PCLRRFBCTL1 (0x02) ++#define MCF_GPIO_PCLRR_FBCTL_PCLRRFBCTL2 (0x04) ++#define MCF_GPIO_PCLRR_FBCTL_PCLRRFBCTL3 (0x08) ++#define MCF_GPIO_PCLRR_FBCTL_PCLRRFBCTL4 (0x10) ++#define MCF_GPIO_PCLRR_FBCTL_PCLRRFBCTL5 (0x20) ++#define MCF_GPIO_PCLRR_FBCTL_PCLRRFBCTL6 (0x40) ++#define MCF_GPIO_PCLRR_FBCTL_PCLRRFBCTL7 (0x80) ++ ++/* Bit definitions and macros for MCF_GPIO_PCLRR_FBCS */ ++#define MCF_GPIO_PCLRR_FBCS_PCLRRFBCS1 (0x02) ++#define MCF_GPIO_PCLRR_FBCS_PCLRRFBCS2 (0x04) ++#define MCF_GPIO_PCLRR_FBCS_PCLRRFBCS3 (0x08) ++#define MCF_GPIO_PCLRR_FBCS_PCLRRFBCS4 (0x10) ++#define MCF_GPIO_PCLRR_FBCS_PCLRRFBCS5 (0x20) ++ ++/* Bit definitions and macros for MCF_GPIO_PCLRR_DMA */ ++#define MCF_GPIO_PCLRR_DMA_PCLRRDMA0 (0x01) ++#define MCF_GPIO_PCLRR_DMA_PCLRRDMA1 (0x02) ++#define MCF_GPIO_PCLRR_DMA_PCLRRDMA2 (0x04) ++#define MCF_GPIO_PCLRR_DMA_PCLRRDMA3 (0x08) ++ ++/* Bit definitions and macros for MCF_GPIO_PCLRR_FEC0H */ ++#define MCF_GPIO_PCLRR_FEC0H_PCLRRFEC0H0 (0x01) ++#define MCF_GPIO_PCLRR_FEC0H_PCLRRFEC0H1 (0x02) ++#define MCF_GPIO_PCLRR_FEC0H_PCLRRFEC0H2 (0x04) ++#define MCF_GPIO_PCLRR_FEC0H_PCLRRFEC0H3 (0x08) ++#define MCF_GPIO_PCLRR_FEC0H_PCLRRFEC0H4 (0x10) ++#define MCF_GPIO_PCLRR_FEC0H_PCLRRFEC0H5 (0x20) ++#define MCF_GPIO_PCLRR_FEC0H_PCLRRFEC0H6 (0x40) ++#define MCF_GPIO_PCLRR_FEC0H_PCLRRFEC0H7 (0x80) ++ ++/* Bit definitions and macros for MCF_GPIO_PCLRR_FEC0L */ ++#define MCF_GPIO_PCLRR_FEC0L_PCLRRFEC0L0 (0x01) ++#define MCF_GPIO_PCLRR_FEC0L_PODRFEC0L1 (0x02) ++#define MCF_GPIO_PCLRR_FEC0L_PCLRRFEC0L2 (0x04) ++#define MCF_GPIO_PCLRR_FEC0L_PCLRRFEC0L3 (0x08) ++#define MCF_GPIO_PCLRR_FEC0L_PODRFEC0L4 (0x10) ++#define MCF_GPIO_PCLRR_FEC0L_PODRFEC0L5 (0x20) ++#define MCF_GPIO_PCLRR_FEC0L_PODRFEC0L6 (0x40) ++#define MCF_GPIO_PCLRR_FEC0L_PCLRRFEC0L7 (0x80) ++ ++/* Bit definitions and macros for MCF_GPIO_PCLRR_FEC1H */ ++#define MCF_GPIO_PCLRR_FEC1H_PCLRRFEC1H0 (0x01) ++#define MCF_GPIO_PCLRR_FEC1H_PCLRRFEC1H1 (0x02) ++#define MCF_GPIO_PCLRR_FEC1H_PCLRRFEC1H2 (0x04) ++#define MCF_GPIO_PCLRR_FEC1H_PODRFEC1H3 (0x08) ++#define MCF_GPIO_PCLRR_FEC1H_PODRFEC1H4 (0x10) ++#define MCF_GPIO_PCLRR_FEC1H_PCLRRFEC1H5 (0x20) ++#define MCF_GPIO_PCLRR_FEC1H_PCLRRFEC1H6 (0x40) ++#define MCF_GPIO_PCLRR_FEC1H_PCLRRFEC1H7 (0x80) ++ ++/* Bit definitions and macros for MCF_GPIO_PCLRR_FEC1L */ ++#define MCF_GPIO_PCLRR_FEC1L_PCLRRFEC1L0 (0x01) ++#define MCF_GPIO_PCLRR_FEC1L_PCLRRFEC1L1 (0x02) ++#define MCF_GPIO_PCLRR_FEC1L_PCLRRFEC1L2 (0x04) ++#define MCF_GPIO_PCLRR_FEC1L_PCLRRFEC1L3 (0x08) ++#define MCF_GPIO_PCLRR_FEC1L_PODRFEC1L4 (0x10) ++#define MCF_GPIO_PCLRR_FEC1L_PCLRRFEC1L5 (0x20) ++#define MCF_GPIO_PCLRR_FEC1L_PCLRRFEC1L6 (0x40) ++#define MCF_GPIO_PCLRR_FEC1L_PCLRRFEC1L7 (0x80) ++ ++/* Bit definitions and macros for MCF_GPIO_PCLRR_FECI2C */ ++#define MCF_GPIO_PCLRR_FECI2C_PCLRRFECI2C0 (0x01) ++#define MCF_GPIO_PCLRR_FECI2C_PCLRRFECI2C1 (0x02) ++#define MCF_GPIO_PCLRR_FECI2C_PODRFECI2C2 (0x04) ++#define MCF_GPIO_PCLRR_FECI2C_PCLRRFECI2C3 (0x08) ++ ++/* Bit definitions and macros for MCF_GPIO_PCLRR_PCIBG */ ++#define MCF_GPIO_PCLRR_PCIBG_PODRPCIBG0 (0x01) ++#define MCF_GPIO_PCLRR_PCIBG_PODRPCIBG1 (0x02) ++#define MCF_GPIO_PCLRR_PCIBG_PODRPCIBG2 (0x04) ++#define MCF_GPIO_PCLRR_PCIBG_PCLRRPCIBG3 (0x08) ++#define MCF_GPIO_PCLRR_PCIBG_PCLRRPCIBG4 (0x10) ++ ++/* Bit definitions and macros for MCF_GPIO_PCLRR_PCIBR */ ++#define MCF_GPIO_PCLRR_PCIBR_PCLRRPCIBR0 (0x01) ++#define MCF_GPIO_PCLRR_PCIBR_PCLRRPCIBR1 (0x02) ++#define MCF_GPIO_PCLRR_PCIBR_PCLRRPCIBR2 (0x04) ++#define MCF_GPIO_PCLRR_PCIBR_PODRPCIBR3 (0x08) ++#define MCF_GPIO_PCLRR_PCIBR_PODRPCIBR4 (0x10) ++ ++/* Bit definitions and macros for MCF_GPIO_PCLRR_PSC3PSC2 */ ++#define MCF_GPIO_PCLRR_PSC3PSC2_PODRPSC3PSC20 (0x01) ++#define MCF_GPIO_PCLRR_PSC3PSC2_PODRPSC3PSC21 (0x02) ++#define MCF_GPIO_PCLRR_PSC3PSC2_PCLRRPSC3PSC22 (0x04) ++#define MCF_GPIO_PCLRR_PSC3PSC2_PCLRRPSC3PSC23 (0x08) ++#define MCF_GPIO_PCLRR_PSC3PSC2_PCLRRPSC3PSC24 (0x10) ++#define MCF_GPIO_PCLRR_PSC3PSC2_PODRPSC3PSC25 (0x20) ++#define MCF_GPIO_PCLRR_PSC3PSC2_PODRPSC3PSC26 (0x40) ++#define MCF_GPIO_PCLRR_PSC3PSC2_PCLRRPSC3PSC27 (0x80) ++ ++/* Bit definitions and macros for MCF_GPIO_PCLRR_PSC1PSC0 */ ++#define MCF_GPIO_PCLRR_PSC1PSC0_PCLRRPSC1PSC00 (0x01) ++#define MCF_GPIO_PCLRR_PSC1PSC0_PCLRRPSC1PSC01 (0x02) ++#define MCF_GPIO_PCLRR_PSC1PSC0_PCLRRPSC1PSC02 (0x04) ++#define MCF_GPIO_PCLRR_PSC1PSC0_PCLRRPSC1PSC03 (0x08) ++#define MCF_GPIO_PCLRR_PSC1PSC0_PCLRRPSC1PSC04 (0x10) ++#define MCF_GPIO_PCLRR_PSC1PSC0_PCLRRPSC1PSC05 (0x20) ++#define MCF_GPIO_PCLRR_PSC1PSC0_PODRPSC1PSC06 (0x40) ++#define MCF_GPIO_PCLRR_PSC1PSC0_PCLRRPSC1PSC07 (0x80) ++ ++/* Bit definitions and macros for MCF_GPIO_PCLRR_DSPI */ ++#define MCF_GPIO_PCLRR_DSPI_PCLRRDSPI0 (0x01) ++#define MCF_GPIO_PCLRR_DSPI_PCLRRDSPI1 (0x02) ++#define MCF_GPIO_PCLRR_DSPI_PCLRRDSPI2 (0x04) ++#define MCF_GPIO_PCLRR_DSPI_PCLRRDSPI3 (0x08) ++#define MCF_GPIO_PCLRR_DSPI_PCLRRDSPI4 (0x10) ++#define MCF_GPIO_PCLRR_DSPI_PCLRRDSPI5 (0x20) ++#define MCF_GPIO_PCLRR_DSPI_PCLRRDSPI6 (0x40) ++ ++/* Bit definitions and macros for MCF_GPIO_PAR_FBCTL */ ++#define MCF_GPIO_PAR_FBCTL_PAR_TS(x) (((x)&0x0003)<<0) ++#define MCF_GPIO_PAR_FBCTL_PAR_TA (0x0004) ++#define MCF_GPIO_PAR_FBCTL_PAR_RWB (0x0010) ++#define MCF_GPIO_PAR_FBCTL_PAR_OE (0x0040) ++#define MCF_GPIO_PAR_FBCTL_PAR_BWE0 (0x0100) ++#define MCF_GPIO_PAR_FBCTL_PAR_BWE1 (0x0400) ++#define MCF_GPIO_PAR_FBCTL_PAR_BWE2 (0x1000) ++#define MCF_GPIO_PAR_FBCTL_PAR_BWE3 (0x4000) ++#define MCF_GPIO_PAR_FBCTL_PAR_TS_GPIO (0) ++#define MCF_GPIO_PAR_FBCTL_PAR_TS_TBST (2) ++#define MCF_GPIO_PAR_FBCTL_PAR_TS_TS (3) ++ ++/* Bit definitions and macros for MCF_GPIO_PAR_FBCS */ ++#define MCF_GPIO_PAR_FBCS_PAR_CS1 (0x02) ++#define MCF_GPIO_PAR_FBCS_PAR_CS2 (0x04) ++#define MCF_GPIO_PAR_FBCS_PAR_CS3 (0x08) ++#define MCF_GPIO_PAR_FBCS_PAR_CS4 (0x10) ++#define MCF_GPIO_PAR_FBCS_PAR_CS5 (0x20) ++ ++/* Bit definitions and macros for MCF_GPIO_PAR_DMA */ ++#define MCF_GPIO_PAR_DMA_PAR_DREQ0(x) (((x)&0x03)<<0) ++#define MCF_GPIO_PAR_DMA_PAR_DREQ1(x) (((x)&0x03)<<2) ++#define MCF_GPIO_PAR_DMA_PAR_DACK0(x) (((x)&0x03)<<4) ++#define MCF_GPIO_PAR_DMA_PAR_DACK1(x) (((x)&0x03)<<6) ++#define MCF_GPIO_PAR_DMA_PAR_DACKx_GPIO (0) ++#define MCF_GPIO_PAR_DMA_PAR_DACKx_TOUT (2) ++#define MCF_GPIO_PAR_DMA_PAR_DACKx_DACK (3) ++#define MCF_GPIO_PAR_DMA_PAR_DREQx_GPIO (0) ++#define MCF_GPIO_PAR_DMA_PAR_DREQx_TIN (2) ++#define MCF_GPIO_PAR_DMA_PAR_DREQx_DREQ (3) ++ ++/* Bit definitions and macros for MCF_GPIO_PAR_FECI2CIRQ */ ++#define MCF_GPIO_PAR_FECI2CIRQ_PAR_IRQ5 (0x0001) ++#define MCF_GPIO_PAR_FECI2CIRQ_PAR_IRQ6 (0x0002) ++#define MCF_GPIO_PAR_FECI2CIRQ_PAR_SCL (0x0004) ++#define MCF_GPIO_PAR_FECI2CIRQ_PAR_SDA (0x0008) ++#define MCF_GPIO_PAR_FECI2CIRQ_PAR_E1MDC(x) (((x)&0x0003)<<6) ++#define MCF_GPIO_PAR_FECI2CIRQ_PAR_E1MDIO(x) (((x)&0x0003)<<8) ++#define MCF_GPIO_PAR_FECI2CIRQ_PAR_E1MII (0x0400) ++#define MCF_GPIO_PAR_FECI2CIRQ_PAR_E17 (0x0800) ++#define MCF_GPIO_PAR_FECI2CIRQ_PAR_E0MDC (0x1000) ++#define MCF_GPIO_PAR_FECI2CIRQ_PAR_E0MDIO (0x2000) ++#define MCF_GPIO_PAR_FECI2CIRQ_PAR_E0MII (0x4000) ++#define MCF_GPIO_PAR_FECI2CIRQ_PAR_E07 (0x8000) ++#define MCF_GPIO_PAR_FECI2CIRQ_PAR_E1MDIO_CANRX (0x0000) ++#define MCF_GPIO_PAR_FECI2CIRQ_PAR_E1MDIO_SDA (0x0200) ++#define MCF_GPIO_PAR_FECI2CIRQ_PAR_E1MDIO_EMDIO (0x0300) ++#define MCF_GPIO_PAR_FECI2CIRQ_PAR_E1MDC_CANTX (0x0000) ++#define MCF_GPIO_PAR_FECI2CIRQ_PAR_E1MDC_SCL (0x0080) ++#define MCF_GPIO_PAR_FECI2CIRQ_PAR_E1MDC_EMDC (0x00C0) ++ ++/* Bit definitions and macros for MCF_GPIO_PAR_PCIBG */ ++#define MCF_GPIO_PAR_PCIBG_PAR_PCIBG0(x) (((x)&0x0003)<<0) ++#define MCF_GPIO_PAR_PCIBG_PAR_PCIBG1(x) (((x)&0x0003)<<2) ++#define MCF_GPIO_PAR_PCIBG_PAR_PCIBG2(x) (((x)&0x0003)<<4) ++#define MCF_GPIO_PAR_PCIBG_PAR_PCIBG3(x) (((x)&0x0003)<<6) ++#define MCF_GPIO_PAR_PCIBG_PAR_PCIBG4(x) (((x)&0x0003)<<8) ++ ++/* Bit definitions and macros for MCF_GPIO_PAR_PCIBR */ ++#define MCF_GPIO_PAR_PCIBR_PAR_PCIBG0(x) (((x)&0x0003)<<0) ++#define MCF_GPIO_PAR_PCIBR_PAR_PCIBG1(x) (((x)&0x0003)<<2) ++#define MCF_GPIO_PAR_PCIBR_PAR_PCIBG2(x) (((x)&0x0003)<<4) ++#define MCF_GPIO_PAR_PCIBR_PAR_PCIBG3(x) (((x)&0x0003)<<6) ++#define MCF_GPIO_PAR_PCIBR_PAR_PCIBR4(x) (((x)&0x0003)<<8) ++ ++/* Bit definitions and macros for MCF_GPIO_PAR_PSC3 */ ++#define MCF_GPIO_PAR_PSC3_PAR_TXD3 (0x04) ++#define MCF_GPIO_PAR_PSC3_PAR_RXD3 (0x08) ++#define MCF_GPIO_PAR_PSC3_PAR_RTS3(x) (((x)&0x03)<<4) ++#define MCF_GPIO_PAR_PSC3_PAR_CTS3(x) (((x)&0x03)<<6) ++#define MCF_GPIO_PAR_PSC3_PAR_CTS3_GPIO (0x00) ++#define MCF_GPIO_PAR_PSC3_PAR_CTS3_BCLK (0x80) ++#define MCF_GPIO_PAR_PSC3_PAR_CTS3_CTS (0xC0) ++#define MCF_GPIO_PAR_PSC3_PAR_RTS3_GPIO (0x00) ++#define MCF_GPIO_PAR_PSC3_PAR_RTS3_FSYNC (0x20) ++#define MCF_GPIO_PAR_PSC3_PAR_RTS3_RTS (0x30) ++#define MCF_GPIO_PAR_PSC3_PAR_CTS2_CANRX (0x40) ++ ++/* Bit definitions and macros for MCF_GPIO_PAR_PSC2 */ ++#define MCF_GPIO_PAR_PSC2_PAR_TXD2 (0x04) ++#define MCF_GPIO_PAR_PSC2_PAR_RXD2 (0x08) ++#define MCF_GPIO_PAR_PSC2_PAR_RTS2(x) (((x)&0x03)<<4) ++#define MCF_GPIO_PAR_PSC2_PAR_CTS2(x) (((x)&0x03)<<6) ++#define MCF_GPIO_PAR_PSC2_PAR_CTS2_GPIO (0x00) ++#define MCF_GPIO_PAR_PSC2_PAR_CTS2_BCLK (0x80) ++#define MCF_GPIO_PAR_PSC2_PAR_CTS2_CTS (0xC0) ++#define MCF_GPIO_PAR_PSC2_PAR_RTS2_GPIO (0x00) ++#define MCF_GPIO_PAR_PSC2_PAR_RTS2_CANTX (0x10) ++#define MCF_GPIO_PAR_PSC2_PAR_RTS2_FSYNC (0x20) ++#define MCF_GPIO_PAR_PSC2_PAR_RTS2_RTS (0x30) ++#define MCF_GPIO_PAR_PSC2_PAR_RTS2_CANRX (0x40) ++ ++/* Bit definitions and macros for MCF_GPIO_PAR_PSC1 */ ++#define MCF_GPIO_PAR_PSC1_PAR_TXD1 (0x04) ++#define MCF_GPIO_PAR_PSC1_PAR_RXD1 (0x08) ++#define MCF_GPIO_PAR_PSC1_PAR_RTS1(x) (((x)&0x03)<<4) ++#define MCF_GPIO_PAR_PSC1_PAR_CTS1(x) (((x)&0x03)<<6) ++#define MCF_GPIO_PAR_PSC1_PAR_CTS1_GPIO (0x00) ++#define MCF_GPIO_PAR_PSC1_PAR_CTS1_BCLK (0x80) ++#define MCF_GPIO_PAR_PSC1_PAR_CTS1_CTS (0xC0) ++#define MCF_GPIO_PAR_PSC1_PAR_RTS1_GPIO (0x00) ++#define MCF_GPIO_PAR_PSC1_PAR_RTS1_FSYNC (0x20) ++#define MCF_GPIO_PAR_PSC1_PAR_RTS1_RTS (0x30) ++ ++/* Bit definitions and macros for MCF_GPIO_PAR_PSC0 */ ++#define MCF_GPIO_PAR_PSC0_PAR_TXD0 (0x04) ++#define MCF_GPIO_PAR_PSC0_PAR_RXD0 (0x08) ++#define MCF_GPIO_PAR_PSC0_PAR_RTS0(x) (((x)&0x03)<<4) ++#define MCF_GPIO_PAR_PSC0_PAR_CTS0(x) (((x)&0x03)<<6) ++#define MCF_GPIO_PAR_PSC0_PAR_CTS0_GPIO (0x00) ++#define MCF_GPIO_PAR_PSC0_PAR_CTS0_BCLK (0x80) ++#define MCF_GPIO_PAR_PSC0_PAR_CTS0_CTS (0xC0) ++#define MCF_GPIO_PAR_PSC0_PAR_RTS0_GPIO (0x00) ++#define MCF_GPIO_PAR_PSC0_PAR_RTS0_FSYNC (0x20) ++#define MCF_GPIO_PAR_PSC0_PAR_RTS0_RTS (0x30) ++ ++/* Bit definitions and macros for MCF_GPIO_PAR_DSPI */ ++#define MCF_GPIO_PAR_DSPI_PAR_SOUT(x) (((x)&0x0003)<<0) ++#define MCF_GPIO_PAR_DSPI_PAR_SIN(x) (((x)&0x0003)<<2) ++#define MCF_GPIO_PAR_DSPI_PAR_SCK(x) (((x)&0x0003)<<4) ++#define MCF_GPIO_PAR_DSPI_PAR_CS0(x) (((x)&0x0003)<<6) ++#define MCF_GPIO_PAR_DSPI_PAR_CS2(x) (((x)&0x0003)<<8) ++#define MCF_GPIO_PAR_DSPI_PAR_CS3(x) (((x)&0x0003)<<10) ++#define MCF_GPIO_PAR_DSPI_PAR_CS5 (0x1000) ++#define MCF_GPIO_PAR_DSPI_PAR_CS3_GPIO (0x0000) ++#define MCF_GPIO_PAR_DSPI_PAR_CS3_CANTX (0x0400) ++#define MCF_GPIO_PAR_DSPI_PAR_CS3_TOUT (0x0800) ++#define MCF_GPIO_PAR_DSPI_PAR_CS3_DSPICS (0x0C00) ++#define MCF_GPIO_PAR_DSPI_PAR_CS2_GPIO (0x0000) ++#define MCF_GPIO_PAR_DSPI_PAR_CS2_CANTX (0x0100) ++#define MCF_GPIO_PAR_DSPI_PAR_CS2_TOUT (0x0200) ++#define MCF_GPIO_PAR_DSPI_PAR_CS2_DSPICS (0x0300) ++#define MCF_GPIO_PAR_DSPI_PAR_CS0_GPIO (0x0000) ++#define MCF_GPIO_PAR_DSPI_PAR_CS0_FSYNC (0x0040) ++#define MCF_GPIO_PAR_DSPI_PAR_CS0_RTS (0x0080) ++#define MCF_GPIO_PAR_DSPI_PAR_CS0_DSPICS (0x00C0) ++#define MCF_GPIO_PAR_DSPI_PAR_SCK_GPIO (0x0000) ++#define MCF_GPIO_PAR_DSPI_PAR_SCK_BCLK (0x0010) ++#define MCF_GPIO_PAR_DSPI_PAR_SCK_CTS (0x0020) ++#define MCF_GPIO_PAR_DSPI_PAR_SCK_SCK (0x0030) ++#define MCF_GPIO_PAR_DSPI_PAR_SIN_GPIO (0x0000) ++#define MCF_GPIO_PAR_DSPI_PAR_SIN_RXD (0x0008) ++#define MCF_GPIO_PAR_DSPI_PAR_SIN_SIN (0x000C) ++#define MCF_GPIO_PAR_DSPI_PAR_SOUT_GPIO (0x0000) ++#define MCF_GPIO_PAR_DSPI_PAR_SOUT_TXD (0x0002) ++#define MCF_GPIO_PAR_DSPI_PAR_SOUT_SOUT (0x0003) ++ ++/* Bit definitions and macros for MCF_GPIO_PAR_TIMER */ ++#define MCF_GPIO_PAR_TIMER_PAR_TOUT2 (0x01) ++#define MCF_GPIO_PAR_TIMER_PAR_TIN2(x) (((x)&0x03)<<1) ++#define MCF_GPIO_PAR_TIMER_PAR_TOUT3 (0x08) ++#define MCF_GPIO_PAR_TIMER_PAR_TIN3(x) (((x)&0x03)<<4) ++#define MCF_GPIO_PAR_TIMER_PAR_TIN3_CANRX (0x00) ++#define MCF_GPIO_PAR_TIMER_PAR_TIN3_IRQ (0x20) ++#define MCF_GPIO_PAR_TIMER_PAR_TIN3_TIN (0x30) ++#define MCF_GPIO_PAR_TIMER_PAR_TIN2_CANRX (0x00) ++#define MCF_GPIO_PAR_TIMER_PAR_TIN2_IRQ (0x04) ++#define MCF_GPIO_PAR_TIMER_PAR_TIN2_TIN (0x06) ++ ++/********************************************************************/ ++ ++#endif /* _M5485GPIO_H_ */ +--- /dev/null ++++ b/include/asm-m68k/m5485gpt.h +@@ -0,0 +1,88 @@ ++/* ++ * File: mcf548x_gpt.h ++ * Purpose: Register and bit definitions for the MCF548X ++ * ++ * Notes: ++ * ++ */ ++ ++#ifndef __MCF548X_GPT_H__ ++#define __MCF548X_GPT_H__ ++ ++/********************************************************************* ++* ++* General Purpose Timers (GPT) ++* ++*********************************************************************/ ++ ++/* Register read/write macros */ ++#define MCF_GPT_GMS0 MCF_REG32(0x000800) ++#define MCF_GPT_GCIR0 MCF_REG32(0x000804) ++#define MCF_GPT_GPWM0 MCF_REG32(0x000808) ++#define MCF_GPT_GSR0 MCF_REG32(0x00080C) ++#define MCF_GPT_GMS1 MCF_REG32(0x000810) ++#define MCF_GPT_GCIR1 MCF_REG32(0x000814) ++#define MCF_GPT_GPWM1 MCF_REG32(0x000818) ++#define MCF_GPT_GSR1 MCF_REG32(0x00081C) ++#define MCF_GPT_GMS2 MCF_REG32(0x000820) ++#define MCF_GPT_GCIR2 MCF_REG32(0x000824) ++#define MCF_GPT_GPWM2 MCF_REG32(0x000828) ++#define MCF_GPT_GSR2 MCF_REG32(0x00082C) ++#define MCF_GPT_GMS3 MCF_REG32(0x000830) ++#define MCF_GPT_GCIR3 MCF_REG32(0x000834) ++#define MCF_GPT_GPWM3 MCF_REG32(0x000838) ++#define MCF_GPT_GSR3 MCF_REG32(0x00083C) ++#define MCF_GPT_GMS(x) MCF_REG32(0x000800+((x)*0x010)) ++#define MCF_GPT_GCIR(x) MCF_REG32(0x000804+((x)*0x010)) ++#define MCF_GPT_GPWM(x) MCF_REG32(0x000808+((x)*0x010)) ++#define MCF_GPT_GSR(x) MCF_REG32(0x00080C+((x)*0x010)) ++ ++/* Bit definitions and macros for MCF_GPT_GMS */ ++#define MCF_GPT_GMS_TMS(x) (((x)&0x00000007)<<0) ++#define MCF_GPT_GMS_GPIO(x) (((x)&0x00000003)<<4) ++#define MCF_GPT_GMS_IEN (0x00000100) ++#define MCF_GPT_GMS_OD (0x00000200) ++#define MCF_GPT_GMS_SC (0x00000400) ++#define MCF_GPT_GMS_CE (0x00001000) ++#define MCF_GPT_GMS_WDEN (0x00008000) ++#define MCF_GPT_GMS_ICT(x) (((x)&0x00000003)<<16) ++#define MCF_GPT_GMS_OCT(x) (((x)&0x00000003)<<20) ++#define MCF_GPT_GMS_OCPW(x) (((x)&0x000000FF)<<24) ++#define MCF_GPT_GMS_OCT_FRCLOW (0x00000000) ++#define MCF_GPT_GMS_OCT_PULSEHI (0x00100000) ++#define MCF_GPT_GMS_OCT_PULSELO (0x00200000) ++#define MCF_GPT_GMS_OCT_TOGGLE (0x00300000) ++#define MCF_GPT_GMS_ICT_ANY (0x00000000) ++#define MCF_GPT_GMS_ICT_RISE (0x00010000) ++#define MCF_GPT_GMS_ICT_FALL (0x00020000) ++#define MCF_GPT_GMS_ICT_PULSE (0x00030000) ++#define MCF_GPT_GMS_GPIO_INPUT (0x00000000) ++#define MCF_GPT_GMS_GPIO_OUTLO (0x00000020) ++#define MCF_GPT_GMS_GPIO_OUTHI (0x00000030) ++#define MCF_GPT_GMS_TMS_DISABLE (0x00000000) ++#define MCF_GPT_GMS_TMS_INCAPT (0x00000001) ++#define MCF_GPT_GMS_TMS_OUTCAPT (0x00000002) ++#define MCF_GPT_GMS_TMS_PWM (0x00000003) ++#define MCF_GPT_GMS_TMS_GPIO (0x00000004) ++ ++/* Bit definitions and macros for MCF_GPT_GCIR */ ++#define MCF_GPT_GCIR_CNT(x) (((x)&0x0000FFFF)<<0) ++#define MCF_GPT_GCIR_PRE(x) (((x)&0x0000FFFF)<<16) ++ ++/* Bit definitions and macros for MCF_GPT_GPWM */ ++#define MCF_GPT_GPWM_LOAD (0x00000001) ++#define MCF_GPT_GPWM_PWMOP (0x00000100) ++#define MCF_GPT_GPWM_WIDTH(x) (((x)&0x0000FFFF)<<16) ++ ++/* Bit definitions and macros for MCF_GPT_GSR */ ++#define MCF_GPT_GSR_CAPT (0x00000001) ++#define MCF_GPT_GSR_COMP (0x00000002) ++#define MCF_GPT_GSR_PWMP (0x00000004) ++#define MCF_GPT_GSR_TEXP (0x00000008) ++#define MCF_GPT_GSR_PIN (0x00000100) ++#define MCF_GPT_GSR_OVF(x) (((x)&0x00000007)<<12) ++#define MCF_GPT_GSR_CAPTURE(x) (((x)&0x0000FFFF)<<16) ++ ++/********************************************************************/ ++ ++#endif /* __MCF548X_GPT_H__ */ +--- /dev/null ++++ b/include/asm-m68k/m5485psc.h +@@ -0,0 +1,474 @@ ++/* ++ * File: mcf548x_psc.h ++ * Purpose: Register and bit definitions for the MCF548X ++ * ++ * Notes: ++ * ++ */ ++ ++#ifndef __MCF548X_PSC_H__ ++#define __MCF548X_PSC_H__ ++ ++/********************************************************************* ++* ++* Programmable Serial Controller (PSC) ++* ++*********************************************************************/ ++ ++/* Register read/write macros */ ++#define MCF_PSC_MR0 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008600)) ++#define MCF_PSC_SR0 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008604)) ++#define MCF_PSC_CSR0 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008604)) ++#define MCF_PSC_CR0 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008608)) ++#define MCF_PSC_RB0 (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00860C)) ++#define MCF_PSC_TB0 (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00860C)) ++#define MCF_PSC_TB_8BIT0 (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00860C)) ++#define MCF_PSC_TB_16BIT0 (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00860C)) ++#define MCF_PSC_TB_AC970 (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00860C)) ++#define MCF_PSC_IPCR0 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008610)) ++#define MCF_PSC_ACR0 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008610)) ++#define MCF_PSC_ISR0 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008614)) ++#define MCF_PSC_IMR0 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008614)) ++#define MCF_PSC_CTUR0 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008618)) ++#define MCF_PSC_CTLR0 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00861C)) ++#define MCF_PSC_IP0 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008634)) ++#define MCF_PSC_OPSET0 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008638)) ++#define MCF_PSC_OPRESET0 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00863C)) ++#define MCF_PSC_SICR0 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008640)) ++#define MCF_PSC_IRCR10 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008644)) ++#define MCF_PSC_IRCR20 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008648)) ++#define MCF_PSC_IRSDR0 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00864C)) ++#define MCF_PSC_IRMDR0 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008650)) ++#define MCF_PSC_IRFDR0 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008654)) ++#define MCF_PSC_RFCNT0 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008658)) ++#define MCF_PSC_TFCNT0 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00865C)) ++#define MCF_PSC_RFSR0 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008664)) ++#define MCF_PSC_TFSR0 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008684)) ++#define MCF_PSC_RFCR0 (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x008668)) ++#define MCF_PSC_TFCR0 (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x008688)) ++#define MCF_PSC_RFAR0 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00866E)) ++#define MCF_PSC_TFAR0 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00868E)) ++#define MCF_PSC_RFRP0 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008672)) ++#define MCF_PSC_TFRP0 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008692)) ++#define MCF_PSC_RFWP0 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008676)) ++#define MCF_PSC_TFWP0 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008696)) ++#define MCF_PSC_RLRFP0 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00867A)) ++#define MCF_PSC_TLRFP0 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00869A)) ++#define MCF_PSC_RLWFP0 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00867E)) ++#define MCF_PSC_TLWFP0 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00869E)) ++#define MCF_PSC_MR1 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008700)) ++#define MCF_PSC_SR1 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008704)) ++#define MCF_PSC_CSR1 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008704)) ++#define MCF_PSC_CR1 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008708)) ++#define MCF_PSC_RB1 (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00870C)) ++#define MCF_PSC_TB1 (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00870C)) ++#define MCF_PSC_TB_8BIT1 (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00870C)) ++#define MCF_PSC_TB_16BIT1 (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00870C)) ++#define MCF_PSC_TB_AC971 (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00870C)) ++#define MCF_PSC_IPCR1 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008710)) ++#define MCF_PSC_ACR1 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008710)) ++#define MCF_PSC_ISR1 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008714)) ++#define MCF_PSC_IMR1 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008714)) ++#define MCF_PSC_CTUR1 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008718)) ++#define MCF_PSC_CTLR1 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00871C)) ++#define MCF_PSC_IP1 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008734)) ++#define MCF_PSC_OPSET1 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008738)) ++#define MCF_PSC_OPRESET1 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00873C)) ++#define MCF_PSC_SICR1 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008740)) ++#define MCF_PSC_IRCR11 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008744)) ++#define MCF_PSC_IRCR21 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008748)) ++#define MCF_PSC_IRSDR1 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00874C)) ++#define MCF_PSC_IRMDR1 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008750)) ++#define MCF_PSC_IRFDR1 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008754)) ++#define MCF_PSC_RFCNT1 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008758)) ++#define MCF_PSC_TFCNT1 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00875C)) ++#define MCF_PSC_RFSR1 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008764)) ++#define MCF_PSC_TFSR1 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008784)) ++#define MCF_PSC_RFCR1 (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x008768)) ++#define MCF_PSC_TFCR1 (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x008788)) ++#define MCF_PSC_RFAR1 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00876E)) ++#define MCF_PSC_TFAR1 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00878E)) ++#define MCF_PSC_RFRP1 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008772)) ++#define MCF_PSC_TFRP1 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008792)) ++#define MCF_PSC_RFWP1 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008776)) ++#define MCF_PSC_TFWP1 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008796)) ++#define MCF_PSC_RLRFP1 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00877A)) ++#define MCF_PSC_TLRFP1 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00879A)) ++#define MCF_PSC_RLWFP1 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00877E)) ++#define MCF_PSC_TLWFP1 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00879E)) ++#define MCF_PSC_MR2 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008800)) ++#define MCF_PSC_SR2 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008804)) ++#define MCF_PSC_CSR2 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008804)) ++#define MCF_PSC_CR2 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008808)) ++#define MCF_PSC_RB2 (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00880C)) ++#define MCF_PSC_TB2 (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00880C)) ++#define MCF_PSC_TB_8BIT2 (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00880C)) ++#define MCF_PSC_TB_16BIT2 (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00880C)) ++#define MCF_PSC_TB_AC972 (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00880C)) ++#define MCF_PSC_IPCR2 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008810)) ++#define MCF_PSC_ACR2 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008810)) ++#define MCF_PSC_ISR2 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008814)) ++#define MCF_PSC_IMR2 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008814)) ++#define MCF_PSC_CTUR2 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008818)) ++#define MCF_PSC_CTLR2 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00881C)) ++#define MCF_PSC_IP2 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008834)) ++#define MCF_PSC_OPSET2 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008838)) ++#define MCF_PSC_OPRESET2 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00883C)) ++#define MCF_PSC_SICR2 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008840)) ++#define MCF_PSC_IRCR12 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008844)) ++#define MCF_PSC_IRCR22 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008848)) ++#define MCF_PSC_IRSDR2 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00884C)) ++#define MCF_PSC_IRMDR2 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008850)) ++#define MCF_PSC_IRFDR2 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008854)) ++#define MCF_PSC_RFCNT2 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008858)) ++#define MCF_PSC_TFCNT2 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00885C)) ++#define MCF_PSC_RFSR2 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008864)) ++#define MCF_PSC_TFSR2 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008884)) ++#define MCF_PSC_RFCR2 (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x008868)) ++#define MCF_PSC_TFCR2 (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x008888)) ++#define MCF_PSC_RFAR2 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00886E)) ++#define MCF_PSC_TFAR2 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00888E)) ++#define MCF_PSC_RFRP2 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008872)) ++#define MCF_PSC_TFRP2 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008892)) ++#define MCF_PSC_RFWP2 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008876)) ++#define MCF_PSC_TFWP2 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008896)) ++#define MCF_PSC_RLRFP2 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00887A)) ++#define MCF_PSC_TLRFP2 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00889A)) ++#define MCF_PSC_RLWFP2 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00887E)) ++#define MCF_PSC_TLWFP2 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00889E)) ++#define MCF_PSC_MR3 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008900)) ++#define MCF_PSC_SR3 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008904)) ++#define MCF_PSC_CSR3 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008904)) ++#define MCF_PSC_CR3 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008908)) ++#define MCF_PSC_RB3 (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00890C)) ++#define MCF_PSC_TB3 (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00890C)) ++#define MCF_PSC_TB_8BIT3 (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00890C)) ++#define MCF_PSC_TB_16BIT3 (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00890C)) ++#define MCF_PSC_TB_AC973 (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00890C)) ++#define MCF_PSC_IPCR3 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008910)) ++#define MCF_PSC_ACR3 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008910)) ++#define MCF_PSC_ISR3 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008914)) ++#define MCF_PSC_IMR3 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008914)) ++#define MCF_PSC_CTUR3 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008918)) ++#define MCF_PSC_CTLR3 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00891C)) ++#define MCF_PSC_IP3 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008934)) ++#define MCF_PSC_OPSET3 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008938)) ++#define MCF_PSC_OPRESET3 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00893C)) ++#define MCF_PSC_SICR3 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008940)) ++#define MCF_PSC_IRCR13 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008944)) ++#define MCF_PSC_IRCR23 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008948)) ++#define MCF_PSC_IRSDR3 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00894C)) ++#define MCF_PSC_IRMDR3 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008950)) ++#define MCF_PSC_IRFDR3 (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008954)) ++#define MCF_PSC_RFCNT3 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008958)) ++#define MCF_PSC_TFCNT3 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00895C)) ++#define MCF_PSC_RFSR3 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008964)) ++#define MCF_PSC_TFSR3 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008984)) ++#define MCF_PSC_RFCR3 (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x008968)) ++#define MCF_PSC_TFCR3 (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x008988)) ++#define MCF_PSC_RFAR3 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00896E)) ++#define MCF_PSC_TFAR3 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00898E)) ++#define MCF_PSC_RFRP3 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008972)) ++#define MCF_PSC_TFRP3 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008992)) ++#define MCF_PSC_RFWP3 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008976)) ++#define MCF_PSC_TFWP3 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008996)) ++#define MCF_PSC_RLRFP3 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00897A)) ++#define MCF_PSC_TLRFP3 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00899A)) ++#define MCF_PSC_RLWFP3 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00897E)) ++#define MCF_PSC_TLWFP3 (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00899E)) ++#define MCF_PSC_MR(x) (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008600+((x)*0x100))) ++#define MCF_PSC_SR(x) (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008604+((x)*0x100))) ++#define MCF_PSC_CSR(x) (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008604+((x)*0x100))) ++#define MCF_PSC_CR(x) (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008608+((x)*0x100))) ++#define MCF_PSC_RB(x) (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00860C+((x)*0x100))) ++#define MCF_PSC_TB(x) (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00860C+((x)*0x100))) ++#define MCF_PSC_TB_8BIT(x) (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00860C+((x)*0x100))) ++#define MCF_PSC_TB_16BIT(x) (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00860C+((x)*0x100))) ++#define MCF_PSC_TB_AC97(x) (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00860C+((x)*0x100))) ++#define MCF_PSC_IPCR(x) (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008610+((x)*0x100))) ++#define MCF_PSC_ACR(x) (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008610+((x)*0x100))) ++#define MCF_PSC_ISR(x) (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008614+((x)*0x100))) ++#define MCF_PSC_IMR(x) (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008614+((x)*0x100))) ++#define MCF_PSC_CTUR(x) (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008618+((x)*0x100))) ++#define MCF_PSC_CTLR(x) (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00861C+((x)*0x100))) ++#define MCF_PSC_IP(x) (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008634+((x)*0x100))) ++#define MCF_PSC_OPSET(x) (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008638+((x)*0x100))) ++#define MCF_PSC_OPRESET(x) (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00863C+((x)*0x100))) ++#define MCF_PSC_SICR(x) (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008640+((x)*0x100))) ++#define MCF_PSC_IRCR1(x) (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008644+((x)*0x100))) ++#define MCF_PSC_IRCR2(x) (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008648+((x)*0x100))) ++#define MCF_PSC_IRSDR(x) (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00864C+((x)*0x100))) ++#define MCF_PSC_IRMDR(x) (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008650+((x)*0x100))) ++#define MCF_PSC_IRFDR(x) (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008654+((x)*0x100))) ++#define MCF_PSC_RFCNT(x) (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008658+((x)*0x100))) ++#define MCF_PSC_TFCNT(x) (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00865C+((x)*0x100))) ++#define MCF_PSC_RFSR(x) (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008664+((x)*0x100))) ++#define MCF_PSC_TFSR(x) (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008684+((x)*0x100))) ++#define MCF_PSC_RFCR(x) (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x008668+((x)*0x100))) ++#define MCF_PSC_TFCR(x) (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x008688+((x)*0x100))) ++#define MCF_PSC_RFAR(x) (*(volatile uint16_t*)(void*)(MCF_MBAR + (0x00866E)+((x)*0x100))) ++#define MCF_PSC_TFAR(x) (*(volatile uint16_t*)(void*)(MCF_MBAR + (0x00868E)+((x)*0x100))) ++#define MCF_PSC_RFRP(x) (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008672+((x)*0x100))) ++#define MCF_PSC_TFRP(x) (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008692+((x)*0x100))) ++#define MCF_PSC_RFWP(x) (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008676+((x)*0x100))) ++#define MCF_PSC_TFWP(x) (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008696+((x)*0x100))) ++#define MCF_PSC_RLRFP(x) (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00867A+((x)*0x100))) ++#define MCF_PSC_TLRFP(x) (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00869A+((x)*0x100))) ++#define MCF_PSC_RLWFP(x) (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00867E+((x)*0x100))) ++#define MCF_PSC_TLWFP(x) (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00869E+((x)*0x100))) ++ ++/* Bit definitions and macros for MCF_PSC_MR */ ++#define MCF_PSC_MR_BC(x) (((x)&0x03)<<0) ++#define MCF_PSC_MR_PT (0x04) ++#define MCF_PSC_MR_PM(x) (((x)&0x03)<<3) ++#define MCF_PSC_MR_ERR (0x20) ++#define MCF_PSC_MR_RXIRQ (0x40) ++#define MCF_PSC_MR_RXRTS (0x80) ++#define MCF_PSC_MR_SB(x) (((x)&0x0F)<<0) ++#define MCF_PSC_MR_TXCTS (0x10) ++#define MCF_PSC_MR_TXRTS (0x20) ++#define MCF_PSC_MR_CM(x) (((x)&0x03)<<6) ++#define MCF_PSC_MR_PM_MULTI_ADDR (0x1C) ++#define MCF_PSC_MR_PM_MULTI_DATA (0x18) ++#define MCF_PSC_MR_PM_NONE (0x10) ++#define MCF_PSC_MR_PM_FORCE_HI (0x0C) ++#define MCF_PSC_MR_PM_FORCE_LO (0x08) ++#define MCF_PSC_MR_PM_ODD (0x04) ++#define MCF_PSC_MR_PM_EVEN (0x00) ++#define MCF_PSC_MR_BC_5 (0x00) ++#define MCF_PSC_MR_BC_6 (0x01) ++#define MCF_PSC_MR_BC_7 (0x02) ++#define MCF_PSC_MR_BC_8 (0x03) ++#define MCF_PSC_MR_CM_NORMAL (0x00) ++#define MCF_PSC_MR_CM_ECHO (0x40) ++#define MCF_PSC_MR_CM_LOCAL_LOOP (0x80) ++#define MCF_PSC_MR_CM_REMOTE_LOOP (0xC0) ++#define MCF_PSC_MR_SB_STOP_BITS_1 (0x07) ++#define MCF_PSC_MR_SB_STOP_BITS_15 (0x08) ++#define MCF_PSC_MR_SB_STOP_BITS_2 (0x0F) ++ ++/* Bit definitions and macros for MCF_PSC_SR */ ++#define MCF_PSC_SR_ERR (0x0040) ++#define MCF_PSC_SR_CDE_DEOF (0x0080) ++#define MCF_PSC_SR_RXRDY (0x0100) ++#define MCF_PSC_SR_FU (0x0200) ++#define MCF_PSC_SR_TXRDY (0x0400) ++#define MCF_PSC_SR_TXEMP_URERR (0x0800) ++#define MCF_PSC_SR_OE (0x1000) ++#define MCF_PSC_SR_PE_CRCERR (0x2000) ++#define MCF_PSC_SR_FE_PHYERR (0x4000) ++#define MCF_PSC_SR_RB_NEOF (0x8000) ++ ++/* Bit definitions and macros for MCF_PSC_CSR */ ++#define MCF_PSC_CSR_TCSEL(x) (((x)&0x0F)<<0) ++#define MCF_PSC_CSR_RCSEL(x) (((x)&0x0F)<<4) ++#define MCF_PSC_CSR_RCSEL_SYS_CLK (0xD0) ++#define MCF_PSC_CSR_RCSEL_CTM16 (0xE0) ++#define MCF_PSC_CSR_RCSEL_CTM (0xF0) ++#define MCF_PSC_CSR_TCSEL_SYS_CLK (0x0D) ++#define MCF_PSC_CSR_TCSEL_CTM16 (0x0E) ++#define MCF_PSC_CSR_TCSEL_CTM (0x0F) ++ ++/* Bit definitions and macros for MCF_PSC_CR */ ++#define MCF_PSC_CR_RXC(x) (((x)&0x03)<<0) ++#define MCF_PSC_CR_TXC(x) (((x)&0x03)<<2) ++#define MCF_PSC_CR_MISC(x) (((x)&0x07)<<4) ++#define MCF_PSC_CR_NONE (0x00) ++#define MCF_PSC_CR_STOP_BREAK (0x70) ++#define MCF_PSC_CR_START_BREAK (0x60) ++#define MCF_PSC_CR_BKCHGINT (0x50) ++#define MCF_PSC_CR_RESET_ERROR (0x40) ++#define MCF_PSC_CR_RESET_TX (0x30) ++#define MCF_PSC_CR_RESET_RX (0x20) ++#define MCF_PSC_CR_RESET_MR (0x10) ++#define MCF_PSC_CR_TX_DISABLED (0x08) ++#define MCF_PSC_CR_TX_ENABLED (0x04) ++#define MCF_PSC_CR_RX_DISABLED (0x02) ++#define MCF_PSC_CR_RX_ENABLED (0x01) ++ ++/* Bit definitions and macros for MCF_PSC_TB_8BIT */ ++#define MCF_PSC_TB_8BIT_TB3(x) (((x)&0x000000FF)<<0) ++#define MCF_PSC_TB_8BIT_TB2(x) (((x)&0x000000FF)<<8) ++#define MCF_PSC_TB_8BIT_TB1(x) (((x)&0x000000FF)<<16) ++#define MCF_PSC_TB_8BIT_TB0(x) (((x)&0x000000FF)<<24) ++ ++/* Bit definitions and macros for MCF_PSC_TB_16BIT */ ++#define MCF_PSC_TB_16BIT_TB1(x) (((x)&0x0000FFFF)<<0) ++#define MCF_PSC_TB_16BIT_TB0(x) (((x)&0x0000FFFF)<<16) ++ ++/* Bit definitions and macros for MCF_PSC_TB_AC97 */ ++#define MCF_PSC_TB_AC97_SOF (0x00000800) ++#define MCF_PSC_TB_AC97_TB(x) (((x)&0x000FFFFF)<<12) ++ ++/* Bit definitions and macros for MCF_PSC_IPCR */ ++#define MCF_PSC_IPCR_RESERVED (0x0C) ++#define MCF_PSC_IPCR_CTS (0x0D) ++#define MCF_PSC_IPCR_D_CTS (0x1C) ++#define MCF_PSC_IPCR_SYNC (0x8C) ++ ++/* Bit definitions and macros for MCF_PSC_ACR */ ++#define MCF_PSC_ACR_IEC0 (0x01) ++#define MCF_PSC_ACR_CTMS(x) (((x)&0x07)<<4) ++#define MCF_PSC_ACR_BRG (0x80) ++ ++/* Bit definitions and macros for MCF_PSC_ISR */ ++#define MCF_PSC_ISR_ERR (0x0040) ++#define MCF_PSC_ISR_DEOF (0x0080) ++#define MCF_PSC_ISR_TXRDY (0x0100) ++#define MCF_PSC_ISR_RXRDY_FU (0x0200) ++#define MCF_PSC_ISR_DB (0x0400) ++#define MCF_PSC_ISR_IPC (0x8000) ++ ++/* Bit definitions and macros for MCF_PSC_IMR */ ++#define MCF_PSC_IMR_ERR (0x0040) ++#define MCF_PSC_IMR_DEOF (0x0080) ++#define MCF_PSC_IMR_TXRDY (0x0100) ++#define MCF_PSC_IMR_RXRDY_FU (0x0200) ++#define MCF_PSC_IMR_DB (0x0400) ++#define MCF_PSC_IMR_IPC (0x8000) ++ ++/* Bit definitions and macros for MCF_PSC_IP */ ++#define MCF_PSC_IP_CTS (0x01) ++#define MCF_PSC_IP_TGL (0x40) ++#define MCF_PSC_IP_LWPR_B (0x80) ++ ++/* Bit definitions and macros for MCF_PSC_OPSET */ ++#define MCF_PSC_OPSET_RTS (0x01) ++ ++/* Bit definitions and macros for MCF_PSC_OPRESET */ ++#define MCF_PSC_OPRESET_RTS (0x01) ++ ++/* Bit definitions and macros for MCF_PSC_SICR */ ++#define MCF_PSC_SICR_SIM(x) (((x)&0x07)<<0) ++#define MCF_PSC_SICR_SHDIR (0x10) ++#define MCF_PSC_SICR_DTS (0x20) ++#define MCF_PSC_SICR_AWR (0x40) ++#define MCF_PSC_SICR_ACRB (0x80) ++#define MCF_PSC_SICR_SIM_UART (0x00) ++#define MCF_PSC_SICR_SIM_MODEM8 (0x01) ++#define MCF_PSC_SICR_SIM_MODEM16 (0x02) ++#define MCF_PSC_SICR_SIM_AC97 (0x03) ++#define MCF_PSC_SICR_SIM_SIR (0x04) ++#define MCF_PSC_SICR_SIM_MIR (0x05) ++#define MCF_PSC_SICR_SIM_FIR (0x06) ++ ++/* Bit definitions and macros for MCF_PSC_IRCR1 */ ++#define MCF_PSC_IRCR1_SPUL (0x01) ++#define MCF_PSC_IRCR1_SIPEN (0x02) ++#define MCF_PSC_IRCR1_FD (0x04) ++ ++/* Bit definitions and macros for MCF_PSC_IRCR2 */ ++#define MCF_PSC_IRCR2_NXTEOF (0x01) ++#define MCF_PSC_IRCR2_ABORT (0x02) ++#define MCF_PSC_IRCR2_SIPREQ (0x04) ++ ++/* Bit definitions and macros for MCF_PSC_IRMDR */ ++#define MCF_PSC_IRMDR_M_FDIV(x) (((x)&0x7F)<<0) ++#define MCF_PSC_IRMDR_FREQ (0x80) ++ ++/* Bit definitions and macros for MCF_PSC_IRFDR */ ++#define MCF_PSC_IRFDR_F_FDIV(x) (((x)&0x0F)<<0) ++ ++/* Bit definitions and macros for MCF_PSC_RFCNT */ ++#define MCF_PSC_RFCNT_CNT(x) (((x)&0x01FF)<<0) ++ ++/* Bit definitions and macros for MCF_PSC_TFCNT */ ++#define MCF_PSC_TFCNT_CNT(x) (((x)&0x01FF)<<0) ++ ++/* Bit definitions and macros for MCF_PSC_RFSR */ ++#define MCF_PSC_RFSR_EMT (0x0001) ++#define MCF_PSC_RFSR_ALARM (0x0002) ++#define MCF_PSC_RFSR_FU (0x0004) ++#define MCF_PSC_RFSR_FRMRY (0x0008) ++#define MCF_PSC_RFSR_OF (0x0010) ++#define MCF_PSC_RFSR_UF (0x0020) ++#define MCF_PSC_RFSR_RXW (0x0040) ++#define MCF_PSC_RFSR_FAE (0x0080) ++#define MCF_PSC_RFSR_FRM(x) (((x)&0x000F)<<8) ++#define MCF_PSC_RFSR_TAG (0x1000) ++#define MCF_PSC_RFSR_TXW (0x4000) ++#define MCF_PSC_RFSR_IP (0x8000) ++#define MCF_PSC_RFSR_FRM_BYTE0 (0x0800) ++#define MCF_PSC_RFSR_FRM_BYTE1 (0x0400) ++#define MCF_PSC_RFSR_FRM_BYTE2 (0x0200) ++#define MCF_PSC_RFSR_FRM_BYTE3 (0x0100) ++ ++/* Bit definitions and macros for MCF_PSC_TFSR */ ++#define MCF_PSC_TFSR_EMT (0x0001) ++#define MCF_PSC_TFSR_ALARM (0x0002) ++#define MCF_PSC_TFSR_FU (0x0004) ++#define MCF_PSC_TFSR_FRMRY (0x0008) ++#define MCF_PSC_TFSR_OF (0x0010) ++#define MCF_PSC_TFSR_UF (0x0020) ++#define MCF_PSC_TFSR_RXW (0x0040) ++#define MCF_PSC_TFSR_FAE (0x0080) ++#define MCF_PSC_TFSR_FRM(x) (((x)&0x000F)<<8) ++#define MCF_PSC_TFSR_TAG (0x1000) ++#define MCF_PSC_TFSR_TXW (0x4000) ++#define MCF_PSC_TFSR_IP (0x8000) ++#define MCF_PSC_TFSR_FRM_BYTE0 (0x0800) ++#define MCF_PSC_TFSR_FRM_BYTE1 (0x0400) ++#define MCF_PSC_TFSR_FRM_BYTE2 (0x0200) ++#define MCF_PSC_TFSR_FRM_BYTE3 (0x0100) ++ ++/* Bit definitions and macros for MCF_PSC_RFCR */ ++#define MCF_PSC_RFCR_CNTR(x) (((x)&0x0000FFFF)<<0) ++#define MCF_PSC_RFCR_TXW_MSK (0x00040000) ++#define MCF_PSC_RFCR_OF_MSK (0x00080000) ++#define MCF_PSC_RFCR_UF_MSK (0x00100000) ++#define MCF_PSC_RFCR_RXW_MSK (0x00200000) ++#define MCF_PSC_RFCR_FAE_MSK (0x00400000) ++#define MCF_PSC_RFCR_IP_MSK (0x00800000) ++#define MCF_PSC_RFCR_GR(x) (((x)&0x00000007)<<24) ++#define MCF_PSC_RFCR_FRMEN (0x08000000) ++#define MCF_PSC_RFCR_TIMER (0x10000000) ++#define MCF_PSC_RFCR_WRITETAG (0x20000000) ++#define MCF_PSC_RFCR_SHADOW (0x80000000) ++ ++/* Bit definitions and macros for MCF_PSC_TFCR */ ++#define MCF_PSC_TFCR_CNTR(x) (((x)&0x0000FFFF)<<0) ++#define MCF_PSC_TFCR_TXW_MSK (0x00040000) ++#define MCF_PSC_TFCR_OF_MSK (0x00080000) ++#define MCF_PSC_TFCR_UF_MSK (0x00100000) ++#define MCF_PSC_TFCR_RXW_MSK (0x00200000) ++#define MCF_PSC_TFCR_FAE_MSK (0x00400000) ++#define MCF_PSC_TFCR_IP_MSK (0x00800000) ++#define MCF_PSC_TFCR_GR(x) (((x)&0x00000007)<<24) ++#define MCF_PSC_TFCR_FRMEN (0x08000000) ++#define MCF_PSC_TFCR_TIMER (0x10000000) ++#define MCF_PSC_TFCR_WRITETAG (0x20000000) ++#define MCF_PSC_TFCR_SHADOW (0x80000000) ++ ++/* Bit definitions and macros for MCF_PSC_RFAR */ ++#define MCF_PSC_RFAR_ALARM(x) (((x)&0x01FF)<<0) ++ ++/* Bit definitions and macros for MCF_PSC_TFAR */ ++#define MCF_PSC_TFAR_ALARM(x) (((x)&0x01FF)<<0) ++ ++/* Bit definitions and macros for MCF_PSC_RFRP */ ++#define MCF_PSC_RFRP_READ(x) (((x)&0x01FF)<<0) ++ ++/* Bit definitions and macros for MCF_PSC_TFRP */ ++#define MCF_PSC_TFRP_READ(x) (((x)&0x01FF)<<0) ++ ++/* Bit definitions and macros for MCF_PSC_RFWP */ ++#define MCF_PSC_RFWP_WRITE(x) (((x)&0x01FF)<<0) ++ ++/* Bit definitions and macros for MCF_PSC_TFWP */ ++#define MCF_PSC_TFWP_WRITE(x) (((x)&0x01FF)<<0) ++ ++/* Bit definitions and macros for MCF_PSC_RLRFP */ ++#define MCF_PSC_RLRFP_LFP(x) (((x)&0x01FF)<<0) ++ ++/* Bit definitions and macros for MCF_PSC_TLRFP */ ++#define MCF_PSC_TLRFP_LFP(x) (((x)&0x01FF)<<0) ++ ++/* Bit definitions and macros for MCF_PSC_RLWFP */ ++#define MCF_PSC_RLWFP_LFP(x) (((x)&0x01FF)<<0) ++ ++/* Bit definitions and macros for MCF_PSC_TLWFP */ ++#define MCF_PSC_TLWFP_LFP(x) (((x)&0x01FF)<<0) ++ ++/********************************************************************/ ++ ++#endif /* __MCF548X_PSC_H__ */ +--- /dev/null ++++ b/include/asm-m68k/m5485sim.h +@@ -0,0 +1,219 @@ ++/* ++ * m5485sim.h -- ColdFire 547x/548x System Integration Unit support. ++ */ ++ ++#ifndef m5485sim_h ++#define m5485sim_h ++ ++ ++/* ++ * System Integration Unit Registers ++ */ ++#define MCF_SDRAMDS MCF_REG32(0x000004) /* SDRAM Drive Strength */ ++#define MCF_SBCR MCF_REG32(0x000010) /* System Breakpoint Control */ ++#define MCF_CSnCFG(x) MCF_REG32(0x000020+(x*4))/* SDRAM Chip Select X */ ++#define MCF_SECSACR MCF_REG32(0x000038) /* Sequential Access Control */ ++#define MCF_RSR MCF_REG32(0x000044) /* Reset Status */ ++#define MCF_JTAGID MCF_REG32(0x000050) /* JTAG Device Identification */ ++ ++/* ++ * FlexBus Chip Selects Registers ++ */ ++#define MCF_CSARn(x) MCF_REG32(0x000500+(x*0xC)) ++#define MCF_CSMRn(x) MCF_REG32(0x000504+(x*0xC)) ++#define MCF_CSCRn(x) MCF_REG32(0x000508+(x*0xC)) ++ ++/* ++ * Interrupt Controller Registers ++ */ ++#define MCF_IPRH MCF_REG32(0x000700) ++#define MCF_IPRL MCF_REG32(0x000704) ++#define MCF_IMRH MCF_REG32(0x000708) ++#define MCF_IMRL MCF_REG32(0x00070C) ++#define MCF_INTFRCH MCF_REG32(0x000710) ++#define MCF_INTFRCL MCF_REG32(0x000714) ++#define MCF_IRLR MCF_REG08(0x000718) ++#define MCF_IACKLPR MCF_REG08(0x000719) ++#define MCF_SWIACK MCF_REG08(0x0007E0) ++#define MCF_LnIACK(x) MCF_REG08(0x0007E4+((x)*0x004)) ++#define MCF_ICR(x) MCF_REG08(0x000740+((x)*0x001)) ++ ++/* ++ * Slice Timers Registers ++ */ ++#define MCF_SLTCNT(x) MCF_REG32(0x000900+((x)*0x010)) ++#define MCF_SCR(x) MCF_REG32(0x000904+((x)*0x010)) ++#define MCF_SCNT(x) MCF_REG32(0x000908+((x)*0x010)) ++#define MCF_SSR(x) MCF_REG32(0x00090C+((x)*0x010)) ++ ++/* ++ * Interrupt sources ++ */ ++#define ISC_EPORT_Fn(x) (x) /* EPORT Interrupts */ ++#define ISC_USB_EPn(x) (15+(x)) /* USB Endopint */ ++#define ISC_USB_ISR (22) /* USB General source */ ++#define ISC_USB_AISR (22) /* USB core source */ ++#define ISC_DSPI_OVRFW (25) /* DSPI overflow */ ++#define ISC_DSPI_RFOF (26) ++#define ISC_DSPI_RFDF (27) ++#define ISC_DSPI_TFUF (28) ++#define ISC_DSPI_TCF (29) ++#define ISC_DSPI_TFFF (30) ++#define ISC_DSPI_EOQF (31) ++#define ISC_PSCn(x) (35-(x)) ++#define ISC_COMM_TIM (36) ++#define ISC_SEC (37) ++#define ISC_FEC1 (38) ++#define ISC_FEC0 (39) ++#define ISC_I2C (40) ++#define ISC_PCI_ARB (41) ++#define ISC_PCI_CB (42) ++#define ISC_PCI_XLB (43) ++#define ISC_DMA (48) ++#define ISC_CANn_ERR(x) (49+(6*(x))) ++#define ISC_CANn_BUSOFF(x) (50+(6*(x))) ++#define ISC_CANn_MBOR(x) (51+(6*(x))) ++#define ISC_CAN0_WAKEIN (52) ++#define ISC_SLTn(x) (54-(x)) ++#define ISC_GPTn(x) (62-(x)) ++ ++/* ++ * Interrupt level and priorities ++ */ ++#define ILP_TOP (MCF_ICR_IL(5) | MCF_ICR_IP(3)) ++#define ILP_SLT0 (MCF_ICR_IL(5) | MCF_ICR_IP(2)) ++#define ILP_SLT1 (MCF_ICR_IL(5) | MCF_ICR_IP(1)) ++#define ILP_DMA (MCF_ICR_IL(5) | MCF_ICR_IP(0)) ++#define ILP_SEC (MCF_ICR_IL(4) | MCF_ICR_IP(7)) ++#define ILP_FEC0 (MCF_ICR_IL(4) | MCF_ICR_IP(6)) ++#define ILP_FEC1 (MCF_ICR_IL(4) | MCF_ICR_IP(5)) ++#define ILP_PCI_XLB (MCF_ICR_IL(4) | MCF_ICR_IP(4)) ++#define ILP_PCI_ARB (MCF_ICR_IL(4) | MCF_ICR_IP(3)) ++#define ILP_PCI_CB (MCF_ICR_IL(4) | MCF_ICR_IP(2)) ++#define ILP_I2C (MCF_ICR_IL(4) | MCF_ICR_IP(1)) ++ ++#define ILP_USB_EPn(x) (MCF_ICR_IL(3) | MCF_ICR_IP(7-(x))) ++#define ILP_USB_EP0 (MCF_ICR_IL(3) | MCF_ICR_IP(7)) ++#define ILP_USB_EP1 (MCF_ICR_IL(3) | MCF_ICR_IP(6)) ++#define ILP_USB_EP2 (MCF_ICR_IL(3) | MCF_ICR_IP(5)) ++#define ILP_USB_EP3 (MCF_ICR_IL(3) | MCF_ICR_IP(4)) ++#define ILP_USB_EP4 (MCF_ICR_IL(3) | MCF_ICR_IP(3)) ++#define ILP_USB_EP5 (MCF_ICR_IL(3) | MCF_ICR_IP(2)) ++#define ILP_USB_EP6 (MCF_ICR_IL(3) | MCF_ICR_IP(1)) ++#define ILP_USB_ISR (MCF_ICR_IL(3) | MCF_ICR_IP(0)) ++ ++#define ILP_USB_AISR (MCF_ICR_IL(2) | MCF_ICR_IP(7)) ++#define ILP_DSPI_OVRFW (MCF_ICR_IL(2) | MCF_ICR_IP(6)) ++#define ILP_DSPI_RFOF (MCF_ICR_IL(2) | MCF_ICR_IP(5)) ++#define ILP_DSPI_RFDF (MCF_ICR_IL(2) | MCF_ICR_IP(4)) ++#define ILP_DSPI_TFUF (MCF_ICR_IL(2) | MCF_ICR_IP(3)) ++#define ILP_DSPI_TCF (MCF_ICR_IL(2) | MCF_ICR_IP(2)) ++#define ILP_DSPI_TFFF (MCF_ICR_IL(2) | MCF_ICR_IP(1)) ++#define ILP_DSPI_EOQF (MCF_ICR_IL(2) | MCF_ICR_IP(0)) ++ ++#define ILP_COMM_TIM (MCF_ICR_IL(1) | MCF_ICR_IP(7)) ++#define ILP_PSCn(x) (MCF_ICR_IL(1) | MCF_ICR_IP(3-((x)&3))) ++#define ILP_PSC0 (MCF_ICR_IL(1) | MCF_ICR_IP(3)) ++#define ILP_PSC1 (MCF_ICR_IL(1) | MCF_ICR_IP(2)) ++#define ILP_PSC2 (MCF_ICR_IL(1) | MCF_ICR_IP(1)) ++#define ILP_PSC3 (MCF_ICR_IL(1) | MCF_ICR_IP(0)) ++ ++ ++ ++ ++ ++/********************************************************************/ ++ ++/* ++ * System Integration Unit Bitfields ++ */ ++ ++/* SBCR */ ++#define MCF_SBCR_PIN2DSPI (0x08000000) ++#define MCF_SBCR_DMA2CPU (0x10000000) ++#define MCF_SBCR_CPU2DMA (0x20000000) ++#define MCF_SBCR_PIN2DMA (0x40000000) ++#define MCF_SBCR_PIN2CPU (0x80000000) ++ ++/* SECSACR */ ++#define MCF_SECSACR_SEQEN (0x00000001) ++ ++/* RSR */ ++#define MCF_RSR_RST (0x00000001) ++#define MCF_RSR_RSTWD (0x00000002) ++#define MCF_RSR_RSTJTG (0x00000008) ++ ++/* JTAGID */ ++#define MCF_JTAGID_REV (0xF0000000) ++#define MCF_JTAGID_PROCESSOR (0x0FFFFFFF) ++#define MCF_JTAGID_MCF5485 (0x0800C01D) ++#define MCF_JTAGID_MCF5484 (0x0800D01D) ++#define MCF_JTAGID_MCF5483 (0x0800E01D) ++#define MCF_JTAGID_MCF5482 (0x0800F01D) ++#define MCF_JTAGID_MCF5481 (0x0801001D) ++#define MCF_JTAGID_MCF5480 (0x0801101D) ++#define MCF_JTAGID_MCF5475 (0x0801201D) ++#define MCF_JTAGID_MCF5474 (0x0801301D) ++#define MCF_JTAGID_MCF5473 (0x0801401D) ++#define MCF_JTAGID_MCF5472 (0x0801501D) ++#define MCF_JTAGID_MCF5471 (0x0801601D) ++#define MCF_JTAGID_MCF5470 (0x0801701D) ++ ++ ++/* ++ * Interrupt Controller Bitfields ++ */ ++#define MCF_IRLR_IRQ(x) (((x)&0x7F)<<1) ++#define MCF_IACKLPR_PRI(x) (((x)&0x0F)<<0) ++#define MCF_IACKLPR_LEVEL(x) (((x)&0x07)<<4) ++#define MCF_ICR_IP(x) (((x)&0x07)<<0) ++#define MCF_ICR_IL(x) (((x)&0x07)<<3) ++ ++/* ++ * Slice Timers Bitfields ++ */ ++#define MCF_SCR_TEN (0x01000000) ++#define MCF_SCR_IEN (0x02000000) ++#define MCF_SCR_RUN (0x04000000) ++#define MCF_SSR_ST (0x01000000) ++#define MCF_SSR_BE (0x02000000) ++ ++ ++/* ++ * Some needed coldfire registers ++ */ ++#define MCF_PAR_PCIBG MCF_REG16(0x000A48) ++#define MCF_PAR_PCIBR MCF_REG16(0x000A4A) ++#define MCF_PAR_PSCn(x) MCF_REG08(0x000A4F-((x)&0x3)) ++#define MCF_PAR_FECI2CIRQ MCF_REG16(0x000A44) ++#define MCF_EPPAR MCF_REG16(0x000F00) ++#define MCF_EPIER MCF_REG08(0x000F05) ++#define MCF_EPFR MCF_REG08(0x000F0C) ++ ++/* ++ * Some GPIO bitfields ++ */ ++#define MCF_PAR_SDA (0x0008) ++#define MCF_PAR_SCL (0x0004) ++#define MCF_PAR_PSC_TXD (0x04) ++#define MCF_PAR_PSC_RXD (0x08) ++#define MCF_PAR_PSC_RTS(x) (((x)&0x03)<<4) ++#define MCF_PAR_PSC_CTS(x) (((x)&0x03)<<6) ++#define MCF_PAR_PSC_CTS_GPIO (0x00) ++#define MCF_PAR_PSC_CTS_BCLK (0x80) ++#define MCF_PAR_PSC_CTS_CTS (0xC0) ++#define MCF_PAR_PSC_RTS_GPIO (0x00) ++#define MCF_PAR_PSC_RTS_FSYNC (0x20) ++#define MCF_PAR_PSC_RTS_RTS (0x30) ++#define MCF_PAR_PSC_CANRX (0x40) ++ ++ ++/* ++ * Some used coldfire values ++ */ ++#define MCF_EPIER_EPIE(x) (0x01 << (x)) ++#define MCF_EPPAR_EPPAx_FALLING (2) ++#define MCF_EPPAR_EPPA(n,x) (((x)&0x0003) << (2*n)) ++ ++ ++#endif /* m5485sim_h */ +--- a/include/asm-m68k/mcfsim.h ++++ b/include/asm-m68k/mcfsim.h +@@ -20,6 +20,11 @@ + #include <asm/mcf5445x_pci.h> + #include <asm/mcf5445x_pciarb.h> + #include <asm/mcf5445x_eport.h> ++#include <asm/mcf5445x_fbcs.h> ++#include <asm/mcf5445x_xbs.h> ++#include <asm/mcf5445x_dtim.h> ++#elif defined(CONFIG_M547X_8X) ++#include <asm/m5485sim.h> + #endif + + /* +--- a/include/asm-m68k/mcfuart.h ++++ b/include/asm-m68k/mcfuart.h +@@ -22,6 +22,15 @@ + #define MCFUART_BASE3 0xfc068000 /* Base address of UART3 */ + #define MCFINT_VECBASE 64 + #define MCFINT_UART0 26 ++ ++#elif defined(CONFIG_M547X_8X) ++ ++#define MCFUART_BASE1 0x8600 /* Base address of UART1 */ ++#define MCFUART_BASE2 0x8700 /* Base address of UART2 */ ++#define MCFUART_BASE3 0x8800 /* Base address of UART3 */ ++#define MCFUART_BASE4 0x8900 /* Base address of UART4 */ ++#define MCFINT_VECBASE 64 ++#define MCFINT_UART0 35 + #endif + + +@@ -97,6 +106,11 @@ + #define MCFUART_USR_RXFULL 0x02 /* Receiver full */ + #define MCFUART_USR_RXREADY 0x01 /* Receiver ready */ + ++#if defined(CONFIG_M547X_8X) ++#define MCFUART_USR_TXREADY_BN 0x0a ++#define MCFUART_USR_TXEMPTY_BN 0x0b ++#endif ++ + #define MCFUART_USR_RXERR (MCFUART_USR_RXBREAK | MCFUART_USR_RXFRAMING | \ + MCFUART_USR_RXPARITY | MCFUART_USR_RXOVERRUN) + +--- a/include/asm-m68k/mmu_context.h ++++ b/include/asm-m68k/mmu_context.h +@@ -152,6 +152,7 @@ static inline void activate_mm(struct mm + + #else /* CONFIG_COLDFIRE */ + ++#include <asm/coldfire.h> + #include <asm/atomic.h> + #include <asm/bitops.h> + #include <asm/mmu.h> +@@ -227,6 +228,77 @@ static inline void activate_mm(struct mm + #define deactivate_mm(tsk, mm) do { } while (0) + + extern void mmu_context_init(void); ++#if defined(CONFIG_M547X_8X) ++#define prepare_arch_switch(next) load_ksp_mmu(next) ++ ++static inline void load_ksp_mmu(struct task_struct *task) ++{ ++ int flags; ++ struct mm_struct *mm; ++ int asid; ++ pgd_t *pgd; ++ pmd_t *pmd; ++ pte_t *pte; ++ unsigned long mmuar; ++ ++ local_irq_save(flags); ++ mmuar = task->thread.ksp; ++ ++ /* Search for a valid TLB entry, if one is found, don't remap */ ++ *MMUAR = mmuar; ++ *MMUOR = MMUOR_STLB | MMUOR_ADR; ++ if ((*MMUSR) & MMUSR_HIT) ++ goto end; ++ ++ if (mmuar >= PAGE_OFFSET) { ++ mm = &init_mm; ++ } else { ++ printk ("load_ksp_mmu: non-kernel mm found: 0x%08x\n", (unsigned int) task->mm); ++ mm = task->mm; ++ } ++ ++ if (!mm) ++ goto bug; ++ ++ pgd = pgd_offset(mm, mmuar); ++ if (pgd_none(*pgd)) ++ goto bug; ++ ++ pmd = pmd_offset(pgd, mmuar); ++ if (pmd_none(*pmd)) ++ goto bug; ++ ++ pte = (mmuar >= PAGE_OFFSET) ? pte_offset_kernel(pmd, mmuar) ++ : pte_offset_map(pmd, mmuar); ++ if (pte_none(*pte) || !pte_present(*pte)) ++ goto bug; ++ ++ set_pte(pte, pte_mkyoung(*pte)); ++ asid = mm->context & 0xff; ++ if (!pte_dirty(*pte) && mmuar<=PAGE_OFFSET) ++ set_pte(pte, pte_wrprotect(*pte)); ++ ++ *MMUTR = (mmuar & PAGE_MASK) | (asid << CF_ASID_MMU_SHIFT) ++ | (((int)(pte->pte) & (int)CF_PAGE_MMUTR_MASK ) >> CF_PAGE_MMUTR_SHIFT) ++ | MMUTR_V; ++ ++ *MMUDR = (pte_val(*pte) & PAGE_MASK) ++ | ((pte->pte) & CF_PAGE_MMUDR_MASK) ++ | MMUDR_SZ8K | MMUDR_X; ++ ++ *MMUOR = MMUOR_ACC | MMUOR_UAA; ++ asm ("nop"); ++ ++ goto end; ++ ++bug: ++ printk ("ksp load failed: mm=0x%08x ksp=0x%08x\n", (unsigned int) mm, (unsigned int) mmuar); ++ ++end: ++ local_irq_restore(flags); ++} ++ ++#endif /* CONFIG_M547X_8X */ + + #endif /* CONFIG_COLDFIRE */ + #endif +--- a/include/asm-m68k/page_offset.h ++++ b/include/asm-m68k/page_offset.h +@@ -5,7 +5,12 @@ + #elif defined(CONFIG_SUN3) + #define PAGE_OFFSET_RAW 0x0E000000 + #else /* CONFIG_COLDFIRE */ ++#if defined(CONFIG_M54455) + #define PAGE_OFFSET_RAW 0xC0000000 + #define PHYS_OFFSET 0x40000000 ++#elif defined(CONFIG_M547X_8X) ++#define PAGE_OFFSET_RAW 0xC0000000 ++#define PHYS_OFFSET 0x00000000 ++#endif + #endif + diff --git a/target/linux/coldfire/patches/045-m547x_8x_fec_dma.patch b/target/linux/coldfire/patches/045-m547x_8x_fec_dma.patch new file mode 100644 index 0000000000..ed54cbc2c2 --- /dev/null +++ b/target/linux/coldfire/patches/045-m547x_8x_fec_dma.patch @@ -0,0 +1,7283 @@ +From b778a60aba67d29857fc7016c8c2f2d87a23de1f Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Sun, 9 Mar 2008 22:14:05 -0600 +Subject: [PATCH] Add DMA and FEC. + +LTIBName: m547x-8x-fec-dma +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + arch/m68k/Kconfig | 9 + + arch/m68k/coldfire/Makefile | 2 + + arch/m68k/coldfire/dma.c | 537 +++++++++ + drivers/Makefile | 2 + + drivers/dma/MCD_dma.h | 408 +++++++ + drivers/dma/MCD_dmaApi.c | 968 +++++++++++++++++ + drivers/dma/MCD_progCheck.h | 33 + + drivers/dma/MCD_tasks.c | 2452 ++++++++++++++++++++++++++++++++++++++++++ + drivers/dma/MCD_tasksInit.c | 284 +++++ + drivers/dma/MCD_tasksInit.h | 73 ++ + drivers/dma/Makefile | 2 + + drivers/net/Kconfig | 2 + + drivers/net/Makefile | 2 + + drivers/net/fec/Kconfig | 25 + + drivers/net/fec/Makefile | 7 + + drivers/net/fec/fec.c | 1375 +++++++++++++++++++++++ + drivers/net/fec/fec.h | 162 +++ + drivers/net/fec/ks8721.c | 125 +++ + drivers/net/fec/ks8721.h | 21 + + include/asm-m68k/MCD_dma.h | 408 +++++++ + include/asm-m68k/coldfire.h | 1 + + include/asm-m68k/dma.h | 106 ++- + include/asm-m68k/m5485dma.h | 97 ++ + include/asm-m68k/m5485sram.h | 12 + + 24 files changed, 7112 insertions(+), 1 deletions(-) + create mode 100644 arch/m68k/coldfire/dma.c + create mode 100644 drivers/dma/MCD_dma.h + create mode 100644 drivers/dma/MCD_dmaApi.c + create mode 100644 drivers/dma/MCD_progCheck.h + create mode 100644 drivers/dma/MCD_tasks.c + create mode 100644 drivers/dma/MCD_tasksInit.c + create mode 100644 drivers/dma/MCD_tasksInit.h + create mode 100644 drivers/net/fec/Kconfig + create mode 100644 drivers/net/fec/Makefile + create mode 100755 drivers/net/fec/fec.c + create mode 100755 drivers/net/fec/fec.h + create mode 100644 drivers/net/fec/ks8721.c + create mode 100644 drivers/net/fec/ks8721.h + create mode 100644 include/asm-m68k/MCD_dma.h + create mode 100644 include/asm-m68k/m5485dma.h + create mode 100644 include/asm-m68k/m5485sram.h + +--- a/arch/m68k/Kconfig ++++ b/arch/m68k/Kconfig +@@ -141,6 +141,15 @@ config CFV4E + select MMU_CFV4E if MMU + default y + ++config MCD_DMA ++ bool "ColdFire MCD DMA support" ++ depends on CFV4E ++ default y ++ help ++ This enables support for the ColdFire 547x/548x family ++ multichannel DMA support. Many drivers need it. ++ If you want it, say Y ++ + config AMIGA + bool "Amiga support" + depends on !MMU_SUN3 +--- a/arch/m68k/coldfire/Makefile ++++ b/arch/m68k/coldfire/Makefile +@@ -10,3 +10,5 @@ endif + + obj-$(CONFIG_PCI) += pci.o mcf5445x-pci.o iomap.o + obj-$(CONFIG_M54455) += mcf5445x-devices.o ++ ++obj-$(CONFIG_MCD_DMA) += dma.o +--- /dev/null ++++ b/arch/m68k/coldfire/dma.c +@@ -0,0 +1,537 @@ ++#include <linux/kernel.h> ++#include <linux/sched.h> ++#include <linux/mm.h> ++#include <linux/init.h> ++#include <linux/interrupt.h> ++#include <asm/io.h> ++#include <asm/irq.h> ++#include <asm/dma.h> ++#include <asm/coldfire.h> ++#include <asm/m5485sram.h> ++#include <asm/mcfsim.h> ++ ++ ++ ++void dma_interrupt_handler(int irq, void *dev_id, struct pt_regs *regs); ++ ++/* ++ * This global keeps track of which initiators have been ++ * used of the available assignments. Initiators 0-15 are ++ * hardwired. Initiators 16-31 are multiplexed and controlled ++ * via the Initiatior Mux Control Registe (IMCR). The ++ * assigned requestor is stored with the associated initiator ++ * number. ++ */ ++static int used_reqs[32] = { ++ DMA_ALWAYS, DMA_DSPI_RX, DMA_DSPI_TX, DMA_DREQ0, ++ DMA_PSC0_RX, DMA_PSC0_TX, DMA_USBEP0, DMA_USBEP1, ++ DMA_USBEP2, DMA_USBEP3, DMA_PCI_TX, DMA_PCI_RX, ++ DMA_PSC1_RX, DMA_PSC1_TX, DMA_I2C_RX, DMA_I2C_TX, ++ 0, 0, 0, 0, ++ 0, 0, 0, 0, ++ 0, 0, 0, 0, ++ 0, 0, 0, 0 ++}; ++ ++/* ++ * This global keeps track of which channels have been assigned ++ * to tasks. This methology assumes that no single initiator ++ * will be tied to more than one task/channel ++ */ ++static char used_channel[16] = { ++ -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, -1, -1, -1, -1, -1, -1 ++}; ++ ++unsigned int connected_channel[16] = { ++ 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0 ++}; ++ ++/********************************************************************/ ++/* ++ * Attempt to enable the provided Initiator in the Initiator ++ * Mux Control Register ++ * ++ * Parameters: ++ * initiator Initiator identifier ++ * ++ * Return Value: ++ * 1 if unable to make the assignment ++ * 0 successful ++ */ ++int ++dma_set_initiator(int initiator) ++{ ++ switch (initiator) { /* ++ * These initiators are always active ++ */ ++ case DMA_ALWAYS: ++ case DMA_DSPI_RX: ++ case DMA_DSPI_TX: ++ case DMA_DREQ0: ++ case DMA_PSC0_RX: ++ case DMA_PSC0_TX: ++ case DMA_USBEP0: ++ case DMA_USBEP1: ++ case DMA_USBEP2: ++ case DMA_USBEP3: ++ case DMA_PCI_TX: ++ case DMA_PCI_RX: ++ case DMA_PSC1_RX: ++ case DMA_PSC1_TX: ++ case DMA_I2C_RX: ++ case DMA_I2C_TX: ++ break; ++ ++ case DMA_FEC0_RX: ++ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC16(3)) ++ | MCF_DMA_IMCR_SRC16_FEC0RX; ++ used_reqs[16] = DMA_FEC0_RX; ++ break; ++ ++ case DMA_FEC0_TX: ++ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC17(3)) ++ | MCF_DMA_IMCR_SRC17_FEC0TX; ++ used_reqs[17] = DMA_FEC0_TX; ++ break; ++ ++ case DMA_FEC1_RX: ++ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC20(3)) ++ | MCF_DMA_IMCR_SRC20_FEC1RX; ++ used_reqs[20] = DMA_FEC1_RX; ++ break; ++ ++ case DMA_FEC1_TX: ++ if (used_reqs[21] == 0) { ++ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC21(3)) ++ | MCF_DMA_IMCR_SRC21_FEC1TX; ++ used_reqs[21] = DMA_FEC1_TX; ++ } else if (used_reqs[25] == 0) { ++ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC25(3)) ++ | MCF_DMA_IMCR_SRC25_FEC1TX; ++ used_reqs[25] = DMA_FEC1_TX; ++ } else if (used_reqs[31] == 0) { ++ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC31(3)) ++ | MCF_DMA_IMCR_SRC31_FEC1TX; ++ used_reqs[31] = DMA_FEC1_TX; ++ } else /* No empty slots */ ++ return 1; ++ break; ++ ++ case DMA_DREQ1: ++ if (used_reqs[29] == 0) { ++ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC29(3)) ++ | MCF_DMA_IMCR_SRC29_DREQ1; ++ used_reqs[29] = DMA_DREQ1; ++ } else if (used_reqs[21] == 0) { ++ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC21(3)) ++ | MCF_DMA_IMCR_SRC21_DREQ1; ++ used_reqs[21] = DMA_DREQ1; ++ } else /* No empty slots */ ++ return 1; ++ break; ++ ++ case DMA_CTM0: ++ if (used_reqs[24] == 0) { ++ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC24(3)) ++ | MCF_DMA_IMCR_SRC24_CTM0; ++ used_reqs[24] = DMA_CTM0; ++ } else /* No empty slots */ ++ return 1; ++ break; ++ ++ case DMA_CTM1: ++ if (used_reqs[25] == 0) { ++ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC25(3)) ++ | MCF_DMA_IMCR_SRC25_CTM1; ++ used_reqs[25] = DMA_CTM1; ++ } else /* No empty slots */ ++ return 1; ++ break; ++ ++ case DMA_CTM2: ++ if (used_reqs[26] == 0) { ++ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC26(3)) ++ | MCF_DMA_IMCR_SRC26_CTM2; ++ used_reqs[26] = DMA_CTM2; ++ } else /* No empty slots */ ++ return 1; ++ break; ++ ++ case DMA_CTM3: ++ if (used_reqs[27] == 0) { ++ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC27(3)) ++ | MCF_DMA_IMCR_SRC27_CTM3; ++ used_reqs[27] = DMA_CTM3; ++ } else /* No empty slots */ ++ return 1; ++ break; ++ ++ case DMA_CTM4: ++ if (used_reqs[28] == 0) { ++ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC28(3)) ++ | MCF_DMA_IMCR_SRC28_CTM4; ++ used_reqs[28] = DMA_CTM4; ++ } else /* No empty slots */ ++ return 1; ++ break; ++ ++ case DMA_CTM5: ++ if (used_reqs[29] == 0) { ++ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC29(3)) ++ | MCF_DMA_IMCR_SRC29_CTM5; ++ used_reqs[29] = DMA_CTM5; ++ } else /* No empty slots */ ++ return 1; ++ break; ++ ++ case DMA_CTM6: ++ if (used_reqs[30] == 0) { ++ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC30(3)) ++ | MCF_DMA_IMCR_SRC30_CTM6; ++ used_reqs[30] = DMA_CTM6; ++ } else /* No empty slots */ ++ return 1; ++ break; ++ ++ case DMA_CTM7: ++ if (used_reqs[31] == 0) { ++ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC31(3)) ++ | MCF_DMA_IMCR_SRC31_CTM7; ++ used_reqs[31] = DMA_CTM7; ++ } else /* No empty slots */ ++ return 1; ++ break; ++ ++ case DMA_USBEP4: ++ if (used_reqs[26] == 0) { ++ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC26(3)) ++ | MCF_DMA_IMCR_SRC26_USBEP4; ++ used_reqs[26] = DMA_USBEP4; ++ } else /* No empty slots */ ++ return 1; ++ break; ++ ++ case DMA_USBEP5: ++ if (used_reqs[27] == 0) { ++ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC27(3)) ++ | MCF_DMA_IMCR_SRC27_USBEP5; ++ used_reqs[27] = DMA_USBEP5; ++ } else /* No empty slots */ ++ return 1; ++ break; ++ ++ case DMA_USBEP6: ++ if (used_reqs[28] == 0) { ++ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC28(3)) ++ | MCF_DMA_IMCR_SRC28_USBEP6; ++ used_reqs[28] = DMA_USBEP6; ++ } else /* No empty slots */ ++ return 1; ++ break; ++ ++ case DMA_PSC2_RX: ++ if (used_reqs[28] == 0) { ++ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC28(3)) ++ | MCF_DMA_IMCR_SRC28_PSC2RX; ++ used_reqs[28] = DMA_PSC2_RX; ++ } else /* No empty slots */ ++ return 1; ++ break; ++ ++ case DMA_PSC2_TX: ++ if (used_reqs[29] == 0) { ++ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC29(3)) ++ | MCF_DMA_IMCR_SRC29_PSC2TX; ++ used_reqs[29] = DMA_PSC2_TX; ++ } else /* No empty slots */ ++ return 1; ++ break; ++ ++ case DMA_PSC3_RX: ++ if (used_reqs[30] == 0) { ++ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC30(3)) ++ | MCF_DMA_IMCR_SRC30_PSC3RX; ++ used_reqs[30] = DMA_PSC3_RX; ++ } else /* No empty slots */ ++ return 1; ++ break; ++ ++ case DMA_PSC3_TX: ++ if (used_reqs[31] == 0) { ++ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC31(3)) ++ | MCF_DMA_IMCR_SRC31_PSC3TX; ++ used_reqs[31] = DMA_PSC3_TX; ++ } else /* No empty slots */ ++ return 1; ++ break; ++ ++ default: ++ return 1; ++ } ++ return 0; ++} ++ ++/********************************************************************/ ++/* ++ * Return the initiator number for the given requestor ++ * ++ * Parameters: ++ * requestor Initiator/Requestor identifier ++ * ++ * Return Value: ++ * The initiator number (0-31) if initiator has been assigned ++ * 0 (always initiator) otherwise ++ */ ++unsigned int ++dma_get_initiator(int requestor) ++{ ++ u32 i; ++ ++ for (i = 0; i < sizeof (used_reqs); ++i) { ++ if (used_reqs[i] == requestor) ++ return i; ++ } ++ return 0; ++} ++ ++/********************************************************************/ ++/* ++ * Remove the given initiator from the active list ++ * ++ * Parameters: ++ * requestor Initiator/Requestor identifier ++ */ ++void ++dma_remove_initiator(int requestor) ++{ ++ u32 i; ++ ++ for (i = 0; i < sizeof (used_reqs); ++i) { ++ if (used_reqs[i] == requestor) { ++ used_reqs[i] = -1; ++ break; ++ } ++ } ++} ++ ++/********************************************************************/ ++/* ++ * Attempt to find an available channel for FEC and mark is as used ++ * ++ * Parameters: ++ * requestor Initiator/Requestor identifier ++ * ++ * Return Value: ++ * First available channel (from 0 to 5) or -1 if they are all occupied ++ */ ++int ++dma_set_channel_fec(int requestor) ++{ ++ u32 i, t; ++ ++#ifdef CONFIG_FEC_548x_ENABLE_FEC2 ++ t = 4; ++#else ++ t = 2; ++#endif ++ ++ ++ ++ for (i = 0; i < t ; ++i) ++ if (used_channel[i] == -1) { ++ used_channel[i] = requestor; ++ return i; ++ } ++ /* All channels taken */ ++ return -1; ++} ++ ++/********************************************************************/ ++/* ++ * Attempt to find an available channel and mark is as used ++ * ++ * Parameters: ++ * requestor Initiator/Requestor identifier ++ * ++ * Return Value: ++ * First available channel (from 6 to 15) or -1 if they are all occupied ++ */ ++int ++dma_set_channel(int requestor) ++{ ++ u32 i; ++#ifdef CONFIG_NET_FEC2 ++ i = 4; ++#else ++ i = 2; ++#endif ++ ++ for (; i < 16; ++i) ++ if (used_channel[i] == -1) { ++ used_channel[i] = requestor; ++ return i; ++ } ++ ++ /* All channels taken */ ++ return -1; ++} ++ ++/********************************************************************/ ++/* ++ * Return the channel being initiated by the given requestor ++ * ++ * Parameters: ++ * requestor Initiator/Requestor identifier ++ */ ++int ++dma_get_channel(int requestor) ++{ ++ u32 i; ++ ++ for (i = 0; i < sizeof (used_channel); ++i) { ++ if (used_channel[i] == requestor) ++ return i; ++ } ++ return -1; ++} ++ ++/********************************************************************/ ++/* ++ * Connects a channel with reference on your data ++ * ++ * Parameters: ++ * channel channel number ++ * reference addres of your data ++ */ ++int ++dma_connect(int channel, int address) ++{ ++ if ((channel < 16) && (channel >= 0)) ++ connected_channel[channel] = address; ++ else ++ return -1; ++ return 0; ++} ++ ++/********************************************************************/ ++/* ++ * Disconnects a channel with reference on your data ++ * ++ * Parameters: ++ * channel channel number ++*/ ++int ++dma_disconnect(int channel) ++{ ++ if ((channel < 16) && (channel >= 0)) ++ connected_channel[channel] = 0; ++ else ++ return -1; ++ return 0; ++} ++ ++/********************************************************************/ ++/* ++ * Remove the channel being initiated by the given requestor from ++ * the active list ++ * ++ * Parameters: ++ * requestor Initiator/Requestor identifier ++ */ ++void ++dma_remove_channel(int requestor) ++{ ++ u32 i; ++ ++ for (i = 0; i < sizeof (used_channel); ++i) { ++ if (used_channel[i] == requestor) { ++ used_channel[i] = -1; ++ break; ++ } ++ } ++} ++ ++/********************************************************************/ ++/* ++ * This is the catch-all interrupt handler for the mult-channel DMA ++ */ ++volatile u8 dma_iflag[16]; ++u32 tx = 0; ++ ++void ++dma_interrupt_handler(int irq, void *dev_id, struct pt_regs *regs) ++{ ++ u32 i, interrupts/*, mask, temp*/; ++ ++ /* ++ * Determine which interrupt(s) triggered by AND'ing the ++ * pending interrupts with those that aren't masked. ++ */ ++/* mask = MCF_DMA_DIMR; ++ MCF_DMA_DIMR = 0xffffffff; ++*/ ++ interrupts = MCF_DMA_DIPR; ++ MCF_DMA_DIPR |= interrupts; ++// temp = interrupts; ++ ++ //MCF_DMA_DIPR = interrupts; ++ for (i = 0; i < 16; ++i, interrupts >>= 1) ++ if (interrupts & 0x1) ++ if (connected_channel[i] != 0) ++ ((void (*)(void)) (connected_channel[i])) (); ++ ++/* MCF_DMA_DIPR |= temp; ++ MCF_DMA_DIMR = mask;*/ ++} ++ ++void ++dma_remove_channel_by_number(int channel) ++{ ++ if (channel < sizeof (used_channel) && channel >= 0) ++ used_channel[channel] = -1; ++} ++ ++int __devinit ++dma_init() ++{ ++ int result; ++ char *dma_version_str; ++ ++ MCD_getVersion(&dma_version_str); ++ printk("Initialize %s\n", dma_version_str); ++ ++ if (request_irq ++ (64 + ISC_DMA, ++ dma_interrupt_handler, ++ IRQF_DISABLED, ++ "MCD-DMA", ++ NULL)) { ++ printk("Cannot allocate the DMA IRQ(48)\n"); ++ return 1; ++ } ++ ++ MCF_DMA_DIMR = 0; ++ MCF_DMA_DIPR = 0xFFFFFFFF; ++ ++ MCF_ICR(ISC_DMA) = ILP_DMA; ++#if 0 ++// JKM ++ enable_irq( 64 + ISC_DMA ); ++#endif ++ ++ result = ++ MCD_initDma((dmaRegs *) (MCF_MBAR + 0x8000), ++ (void *) SYS_SRAM_DMA_START, MCD_RELOC_TASKS); ++ if (result != MCD_OK) { ++ printk("Cannot perform DMA initialization\n"); ++ free_irq(64 + ISC_DMA, NULL); ++ return 1; ++ } ++ ++ return 0; ++} ++ ++device_initcall(dma_init); ++ +--- a/drivers/Makefile ++++ b/drivers/Makefile +@@ -93,3 +93,5 @@ obj-$(CONFIG_PPC_PS3) += ps3/ + obj-$(CONFIG_OF) += of/ + obj-$(CONFIG_SSB) += ssb/ + obj-$(CONFIG_VIRTIO) += virtio/ ++ ++obj-$(CONFIG_MCD_DMA) += dma/ +--- /dev/null ++++ b/drivers/dma/MCD_dma.h +@@ -0,0 +1,408 @@ ++/********************************************************************* ++ * ++ * Copyright (C) 2004 Motorola, Inc. ++ * MOTOROLA, INC. All Rights Reserved. ++ * You are hereby granted a copyright license to use ++ * the SOFTWARE so long as this entire notice is ++ * retained without alteration in any modified and/or redistributed ++ * versions, and that such modified versions are clearly identified ++ * as such. No licenses are granted by implication, estoppel or ++ * otherwise under any patents or trademarks of Motorola, Inc. This ++ * software is provided on an "AS IS" basis and without warranty. ++ * ++ * To the maximum extent permitted by applicable law, MOTOROLA ++ * DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED, INCLUDING ++ * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR ++ * PURPOSE AND ANY WARRANTY AGAINST INFRINGEMENT WITH REGARD TO THE ++ * SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF) AND ANY ++ * ACCOMPANYING WRITTEN MATERIALS. ++ * ++ * To the maximum extent permitted by applicable law, IN NO EVENT ++ * SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER (INCLUDING ++ * WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS ++ * INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY ++ * LOSS) ARISING OF THE USE OR INABILITY TO USE THE SOFTWARE. ++ * ++ * Motorola assumes no responsibility for the maintenance and support ++ * of this software ++ ********************************************************************/ ++ ++/* ++ * File: MCD_dma.h ++ * Purpose: Main header file for multi-channel DMA API. ++ * ++ * Notes: ++ * ++ * Modifications: ++ */ ++#ifndef _MCD_API_H ++#define _MCD_API_H ++ ++#include <asm/types.h> ++ ++/* ++ * Turn Execution Unit tasks ON (#define) or OFF (#undef) ++ */ ++#undef MCD_INCLUDE_EU ++ ++/* ++ * Number of DMA channels ++ */ ++#define NCHANNELS 16 ++ ++/* ++ * Total number of variants ++ */ ++#ifdef MCD_INCLUDE_EU ++#define NUMOFVARIANTS 6 ++#else ++#define NUMOFVARIANTS 4 ++#endif ++ ++/* ++ * Define sizes of the various tables ++ */ ++#define TASK_TABLE_SIZE (NCHANNELS*32) ++#define VAR_TAB_SIZE (128) ++#define CONTEXT_SAVE_SIZE (128) ++#define FUNCDESC_TAB_SIZE (256) ++ ++#ifdef MCD_INCLUDE_EU ++#define FUNCDESC_TAB_NUM 16 ++#else ++#define FUNCDESC_TAB_NUM 1 ++#endif ++ ++ ++#ifndef DEFINESONLY ++ ++/* ++ * Portability typedefs ++ */ ++ /* ++#ifndef s32 ++typedef int s32; ++#endif ++#ifndef u32 ++typedef unsigned int u32; ++#endif ++#ifndef s16 ++typedef short s16; ++#endif ++#ifndef u16 ++typedef unsigned short u16; ++#endif ++#ifndef s8 ++typedef char s8; ++#endif ++#ifndef u8 ++typedef unsigned char u8; ++#endif ++*/ ++/* ++ * These structures represent the internal registers of the ++ * multi-channel DMA ++ */ ++struct dmaRegs_s { ++ u32 taskbar; /* task table base address register */ ++ u32 currPtr; ++ u32 endPtr; ++ u32 varTablePtr; ++ u16 dma_rsvd0; ++ u16 ptdControl; /* ptd control */ ++ u32 intPending; /* interrupt pending register */ ++ u32 intMask; /* interrupt mask register */ ++ u16 taskControl[16]; /* task control registers */ ++ u8 priority[32]; /* priority registers */ ++ u32 initiatorMux; /* initiator mux control */ ++ u32 taskSize0; /* task size control register 0. */ ++ u32 taskSize1; /* task size control register 1. */ ++ u32 dma_rsvd1; /* reserved */ ++ u32 dma_rsvd2; /* reserved */ ++ u32 debugComp1; /* debug comparator 1 */ ++ u32 debugComp2; /* debug comparator 2 */ ++ u32 debugControl; /* debug control */ ++ u32 debugStatus; /* debug status */ ++ u32 ptdDebug; /* priority task decode debug */ ++ u32 dma_rsvd3[31]; /* reserved */ ++}; ++typedef volatile struct dmaRegs_s dmaRegs; ++ ++#endif ++ ++/* ++ * PTD contrl reg bits ++ */ ++#define PTD_CTL_TSK_PRI 0x8000 ++#define PTD_CTL_COMM_PREFETCH 0x0001 ++ ++/* ++ * Task Control reg bits and field masks ++ */ ++#define TASK_CTL_EN 0x8000 ++#define TASK_CTL_VALID 0x4000 ++#define TASK_CTL_ALWAYS 0x2000 ++#define TASK_CTL_INIT_MASK 0x1f00 ++#define TASK_CTL_ASTRT 0x0080 ++#define TASK_CTL_HIPRITSKEN 0x0040 ++#define TASK_CTL_HLDINITNUM 0x0020 ++#define TASK_CTL_ASTSKNUM_MASK 0x000f ++ ++/* ++ * Priority reg bits and field masks ++ */ ++#define PRIORITY_HLD 0x80 ++#define PRIORITY_PRI_MASK 0x07 ++ ++/* ++ * Debug Control reg bits and field masks ++ */ ++#define DBG_CTL_BLOCK_TASKS_MASK 0xffff0000 ++#define DBG_CTL_AUTO_ARM 0x00008000 ++#define DBG_CTL_BREAK 0x00004000 ++#define DBG_CTL_COMP1_TYP_MASK 0x00003800 ++#define DBG_CTL_COMP2_TYP_MASK 0x00000070 ++#define DBG_CTL_EXT_BREAK 0x00000004 ++#define DBG_CTL_INT_BREAK 0x00000002 ++ ++/* ++ * PTD Debug reg selector addresses ++ * This reg must be written with a value to show the contents of ++ * one of the desired internal register. ++ */ ++#define PTD_DBG_REQ 0x00 /* shows the state of 31 initiators */ ++#define PTD_DBG_TSK_VLD_INIT 0x01 /* shows which 16 tasks are valid and ++ have initiators asserted */ ++ ++ ++/* ++ * General return values ++ */ ++#define MCD_OK 0 ++#define MCD_ERROR -1 ++#define MCD_TABLE_UNALIGNED -2 ++#define MCD_CHANNEL_INVALID -3 ++ ++/* ++ * MCD_initDma input flags ++ */ ++#define MCD_RELOC_TASKS 0x00000001 ++#define MCD_NO_RELOC_TASKS 0x00000000 ++#define MCD_COMM_PREFETCH_EN 0x00000002 /* Commbus Prefetching - MCF547x/548x ONLY */ ++ ++/* ++ * MCD_dmaStatus Status Values for each channel ++ */ ++#define MCD_NO_DMA 1 /* No DMA has been requested since reset */ ++#define MCD_IDLE 2 /* DMA active, but the initiator is currently inactive */ ++#define MCD_RUNNING 3 /* DMA active, and the initiator is currently active */ ++#define MCD_PAUSED 4 /* DMA active but it is currently paused */ ++#define MCD_HALTED 5 /* the most recent DMA has been killed with MCD_killTask() */ ++#define MCD_DONE 6 /* the most recent DMA has completed. */ ++ ++ ++/* ++ * MCD_startDma parameter defines ++ */ ++ ++/* ++ * Constants for the funcDesc parameter ++ */ ++/* Byte swapping: */ ++#define MCD_NO_BYTE_SWAP 0x00045670 /* to disable byte swapping. */ ++#define MCD_BYTE_REVERSE 0x00076540 /* to reverse the bytes of each u32 of the DMAed data. */ ++#define MCD_U16_REVERSE 0x00067450 /* to reverse the 16-bit halves of ++ each 32-bit data value being DMAed.*/ ++#define MCD_U16_BYTE_REVERSE 0x00054760 /* to reverse the byte halves of each ++ 16-bit half of each 32-bit data value DMAed */ ++#define MCD_NO_BIT_REV 0x00000000 /* do not reverse the bits of each byte DMAed. */ ++#define MCD_BIT_REV 0x00088880 /* reverse the bits of each byte DMAed */ ++/* CRCing: */ ++#define MCD_CRC16 0xc0100000 /* to perform CRC-16 on DMAed data. */ ++#define MCD_CRCCCITT 0xc0200000 /* to perform CRC-CCITT on DMAed data. */ ++#define MCD_CRC32 0xc0300000 /* to perform CRC-32 on DMAed data. */ ++#define MCD_CSUMINET 0xc0400000 /* to perform internet checksums on DMAed data.*/ ++#define MCD_NO_CSUM 0xa0000000 /* to perform no checksumming. */ ++ ++#define MCD_FUNC_NOEU1 (MCD_NO_BYTE_SWAP | MCD_NO_BIT_REV | MCD_NO_CSUM) ++#define MCD_FUNC_NOEU2 (MCD_NO_BYTE_SWAP | MCD_NO_CSUM) ++ ++/* ++ * Constants for the flags parameter ++ */ ++#define MCD_TT_FLAGS_RL 0x00000001 /* Read line */ ++#define MCD_TT_FLAGS_CW 0x00000002 /* Combine Writes */ ++#define MCD_TT_FLAGS_SP 0x00000004 /* Speculative prefetch(XLB) MCF547x/548x ONLY */ ++#define MCD_TT_FLAGS_MASK 0x000000ff ++#define MCD_TT_FLAGS_DEF (MCD_TT_FLAGS_RL | MCD_TT_FLAGS_CW) ++ ++#define MCD_SINGLE_DMA 0x00000100 /* Unchained DMA */ ++#define MCD_CHAIN_DMA /* TBD */ ++#define MCD_EU_DMA /* TBD */ ++#define MCD_FECTX_DMA 0x00001000 /* FEC TX ring DMA */ ++#define MCD_FECRX_DMA 0x00002000 /* FEC RX ring DMA */ ++ ++ ++/* these flags are valid for MCD_startDma and the chained buffer descriptors */ ++#define MCD_BUF_READY 0x80000000 /* indicates that this buffer is now under the DMA's control */ ++#define MCD_WRAP 0x20000000 /* to tell the FEC Dmas to wrap to the first BD */ ++#define MCD_INTERRUPT 0x10000000 /* to generate an interrupt after completion of the DMA. */ ++#define MCD_END_FRAME 0x08000000 /* tell the DMA to end the frame when transferring ++ last byte of data in buffer */ ++#define MCD_CRC_RESTART 0x40000000 /* to empty out the accumulated checksum ++ prior to performing the DMA. */ ++ ++/* Defines for the FEC buffer descriptor control/status word*/ ++#define MCD_FEC_BUF_READY 0x8000 ++#define MCD_FEC_WRAP 0x2000 ++#define MCD_FEC_INTERRUPT 0x1000 ++#define MCD_FEC_END_FRAME 0x0800 ++ ++ ++/* ++ * Defines for general intuitiveness ++ */ ++ ++#define MCD_TRUE 1 ++#define MCD_FALSE 0 ++ ++/* ++ * Three different cases for destination and source. ++ */ ++#define MINUS1 -1 ++#define ZERO 0 ++#define PLUS1 1 ++ ++#ifndef DEFINESONLY ++ ++/* Task Table Entry struct*/ ++typedef struct { ++ u32 TDTstart; /* task descriptor table start */ ++ u32 TDTend; /* task descriptor table end */ ++ u32 varTab; /* variable table start */ ++ u32 FDTandFlags; /* function descriptor table start and flags */ ++ volatile u32 descAddrAndStatus; ++ volatile u32 modifiedVarTab; ++ u32 contextSaveSpace; /* context save space start */ ++ u32 literalBases; ++} TaskTableEntry; ++ ++ ++/* Chained buffer descriptor */ ++typedef volatile struct MCD_bufDesc_struct MCD_bufDesc; ++struct MCD_bufDesc_struct { ++ u32 flags; /* flags describing the DMA */ ++ u32 csumResult; /* checksum from checksumming performed since last checksum reset */ ++ s8 *srcAddr; /* the address to move data from */ ++ s8 *destAddr; /* the address to move data to */ ++ s8 *lastDestAddr; /* the last address written to */ ++ u32 dmaSize; /* the number of bytes to transfer independent of the transfer size */ ++ MCD_bufDesc *next; /* next buffer descriptor in chain */ ++ u32 info; /* private information about this descriptor; DMA does not affect it */ ++}; ++ ++/* Progress Query struct */ ++typedef volatile struct MCD_XferProg_struct { ++ s8 *lastSrcAddr; /* the most-recent or last, post-increment source address */ ++ s8 *lastDestAddr; /* the most-recent or last, post-increment destination address */ ++ u32 dmaSize; /* the amount of data transferred for the current buffer */ ++ MCD_bufDesc *currBufDesc;/* pointer to the current buffer descriptor being DMAed */ ++} MCD_XferProg; ++ ++ ++/* FEC buffer descriptor */ ++typedef volatile struct MCD_bufDescFec_struct { ++ u16 statCtrl; ++ u16 length; ++ u32 dataPointer; ++} MCD_bufDescFec; ++ ++ ++/*************************************************************************/ ++/* ++ * API function Prototypes - see MCD_dmaApi.c for further notes ++ */ ++ ++/* ++ * MCD_startDma starts a particular kind of DMA . ++ */ ++int MCD_startDma ( ++ int channel, /* the channel on which to run the DMA */ ++ s8 *srcAddr, /* the address to move data from, or buffer-descriptor address */ ++ s16 srcIncr, /* the amount to increment the source address per transfer */ ++ s8 *destAddr, /* the address to move data to */ ++ s16 destIncr, /* the amount to increment the destination address per transfer */ ++ u32 dmaSize, /* the number of bytes to transfer independent of the transfer size */ ++ u32 xferSize, /* the number bytes in of each data movement (1, 2, or 4) */ ++ u32 initiator, /* what device initiates the DMA */ ++ int priority, /* priority of the DMA */ ++ u32 flags, /* flags describing the DMA */ ++ u32 funcDesc /* a description of byte swapping, bit swapping, and CRC actions */ ++); ++ ++/* ++ * MCD_initDma() initializes the DMA API by setting up a pointer to the DMA ++ * registers, relocating and creating the appropriate task structures, and ++ * setting up some global settings ++ */ ++int MCD_initDma (dmaRegs *sDmaBarAddr, void *taskTableDest, u32 flags); ++ ++/* ++ * MCD_dmaStatus() returns the status of the DMA on the requested channel. ++ */ ++int MCD_dmaStatus (int channel); ++ ++/* ++ * MCD_XferProgrQuery() returns progress of DMA on requested channel ++ */ ++int MCD_XferProgrQuery (int channel, MCD_XferProg *progRep); ++ ++/* ++ * MCD_killDma() halts the DMA on the requested channel, without any ++ * intention of resuming the DMA. ++ */ ++int MCD_killDma (int channel); ++ ++/* ++ * MCD_continDma() continues a DMA which as stopped due to encountering an ++ * unready buffer descriptor. ++ */ ++int MCD_continDma (int channel); ++ ++/* ++ * MCD_pauseDma() pauses the DMA on the given channel ( if any DMA is ++ * running on that channel). ++ */ ++int MCD_pauseDma (int channel); ++ ++/* ++ * MCD_resumeDma() resumes the DMA on a given channel (if any DMA is ++ * running on that channel). ++ */ ++int MCD_resumeDma (int channel); ++ ++/* ++ * MCD_csumQuery provides the checksum/CRC after performing a non-chained DMA ++ */ ++int MCD_csumQuery (int channel, u32 *csum); ++ ++/* ++ * MCD_getCodeSize provides the packed size required by the microcoded task ++ * and structures. ++ */ ++int MCD_getCodeSize(void); ++ ++/* ++ * MCD_getVersion provides a pointer to a version string and returns a ++ * version number. ++ */ ++int MCD_getVersion(char **longVersion); ++ ++/* macro for setting a location in the variable table */ ++#define MCD_SET_VAR(taskTab,idx,value) ((u32 *)(taskTab)->varTab)[idx] = value ++ /* Note that MCD_SET_VAR() is invoked many times in firing up a DMA function, ++ so I'm avoiding surrounding it with "do {} while(0)" */ ++ ++#endif /* DEFINESONLY */ ++ ++#endif /* _MCD_API_H */ +--- /dev/null ++++ b/drivers/dma/MCD_dmaApi.c +@@ -0,0 +1,968 @@ ++/********************************************************************* ++ * ++ * Copyright (C) 2004 Motorola, Inc. ++ * MOTOROLA, INC. All Rights Reserved. ++ * You are hereby granted a copyright license to use ++ * the SOFTWARE so long as this entire notice is ++ * retained without alteration in any modified and/or redistributed ++ * versions, and that such modified versions are clearly identified ++ * as such. No licenses are granted by implication, estoppel or ++ * otherwise under any patents or trademarks of Motorola, Inc. This ++ * software is provided on an "AS IS" basis and without warranty. ++ * ++ * To the maximum extent permitted by applicable law, MOTOROLA ++ * DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED, INCLUDING ++ * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR ++ * PURPOSE AND ANY WARRANTY AGAINST INFRINGEMENT WITH REGARD TO THE ++ * SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF) AND ANY ++ * ACCOMPANYING WRITTEN MATERIALS. ++ * ++ * To the maximum extent permitted by applicable law, IN NO EVENT ++ * SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER (INCLUDING ++ * WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS ++ * INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY ++ * LOSS) ARISING OF THE USE OR INABILITY TO USE THE SOFTWARE. ++ * ++ * Motorola assumes no responsibility for the maintenance and support ++ * of this software ++ ********************************************************************/ ++ ++/* ++ * File: MCD_dmaApi.c ++ * Purpose: Main C file for multi-channel DMA API. ++ * ++ * Notes: ++ * ++ * ++ * Modifications: ++ * ++ * ++ */ ++#include <asm/types.h> ++#include <asm/MCD_dma.h> ++#include <asm/virtconvert.h> ++#include "MCD_tasksInit.h" ++#include "MCD_progCheck.h" ++ ++/********************************************************************/ ++/* ++ * This is an API-internal pointer to the DMA's registers ++ */ ++dmaRegs *MCD_dmaBar; ++ ++/* ++ * These are the real and model task tables as generated by the ++ * build process ++ */ ++extern TaskTableEntry MCD_realTaskTableSrc[NCHANNELS]; ++extern TaskTableEntry MCD_modelTaskTableSrc[NUMOFVARIANTS]; ++ ++/* ++ * However, this (usually) gets relocated to on-chip SRAM, at which ++ * point we access them as these tables ++ */ ++volatile TaskTableEntry *MCD_taskTable; ++TaskTableEntry *MCD_modelTaskTable; ++ ++ ++/* ++ * MCD_chStatus[] is an array of status indicators for remembering ++ * whether a DMA has ever been attempted on each channel, pausing ++ * status, etc. ++ */ ++static int MCD_chStatus[NCHANNELS] = ++{ ++ MCD_NO_DMA, MCD_NO_DMA, MCD_NO_DMA, MCD_NO_DMA, ++ MCD_NO_DMA, MCD_NO_DMA, MCD_NO_DMA, MCD_NO_DMA, ++ MCD_NO_DMA, MCD_NO_DMA, MCD_NO_DMA, MCD_NO_DMA, ++ MCD_NO_DMA, MCD_NO_DMA, MCD_NO_DMA, MCD_NO_DMA ++}; ++ ++/* ++ * Prototypes for local functions ++ */ ++static void MCD_memcpy (int *dest, int *src, u32 size); ++static void MCD_resmActions (int channel); ++ ++/* ++ * Buffer descriptors used for storage of progress info for single Dmas ++ * Also used as storage for the DMA for CRCs for single DMAs ++ * Otherwise, the DMA does not parse these buffer descriptors ++ */ ++#ifdef MCD_INCLUDE_EU ++extern MCD_bufDesc MCD_singleBufDescs[NCHANNELS]; ++#else ++MCD_bufDesc MCD_singleBufDescs[NCHANNELS]; ++#endif ++MCD_bufDesc *MCD_relocBuffDesc; ++ ++ ++/* ++ * Defines for the debug control register's functions ++ */ ++#define DBG_CTL_COMP1_TASK (0x00002000) /* have comparator 1 look for a task # */ ++#define DBG_CTL_ENABLE (DBG_CTL_AUTO_ARM | \ ++ DBG_CTL_BREAK | \ ++ DBG_CTL_INT_BREAK | \ ++ DBG_CTL_COMP1_TASK) ++#define DBG_CTL_DISABLE (DBG_CTL_AUTO_ARM | \ ++ DBG_CTL_INT_BREAK | \ ++ DBG_CTL_COMP1_TASK) ++#define DBG_KILL_ALL_STAT (0xFFFFFFFF) ++ ++/* ++ * Offset to context save area where progress info is stored ++ */ ++#define CSAVE_OFFSET 10 ++ ++/* ++ * Defines for Byte Swapping ++ */ ++#define MCD_BYTE_SWAP_KILLER 0xFFF8888F ++#define MCD_NO_BYTE_SWAP_ATALL 0x00040000 ++ ++/* ++ * Execution Unit Identifiers ++ */ ++#define MAC 0 /* legacy - not used */ ++#define LUAC 1 /* legacy - not used */ ++#define CRC 2 /* legacy - not used */ ++#define LURC 3 /* Logic Unit with CRC */ ++ ++/* ++ * Task Identifiers ++ */ ++#define TASK_CHAINNOEU 0 ++#define TASK_SINGLENOEU 1 ++#ifdef MCD_INCLUDE_EU ++#define TASK_CHAINEU 2 ++#define TASK_SINGLEEU 3 ++#define TASK_FECRX 4 ++#define TASK_FECTX 5 ++#else ++#define TASK_CHAINEU 0 ++#define TASK_SINGLEEU 1 ++#define TASK_FECRX 2 ++#define TASK_FECTX 3 ++#endif ++ ++/* ++ * Structure to remember which variant is on which channel ++ * TBD- need this? ++ */ ++typedef struct MCD_remVariants_struct MCD_remVariant; ++struct MCD_remVariants_struct ++{ ++ int remDestRsdIncr[NCHANNELS]; /* -1,0,1 */ ++ int remSrcRsdIncr[NCHANNELS]; /* -1,0,1 */ ++ s16 remDestIncr[NCHANNELS]; /* DestIncr */ ++ s16 remSrcIncr[NCHANNELS]; /* srcIncr */ ++ u32 remXferSize[NCHANNELS]; /* xferSize */ ++}; ++ ++/* ++ * Structure to remember the startDma parameters for each channel ++ */ ++MCD_remVariant MCD_remVariants; ++/********************************************************************/ ++/* ++ * Function: MCD_initDma ++ * Purpose: Initializes the DMA API by setting up a pointer to the DMA ++ * registers, relocating and creating the appropriate task ++ * structures, and setting up some global settings ++ * Arguments: ++ * dmaBarAddr - pointer to the multichannel DMA registers ++ * taskTableDest - location to move DMA task code and structs to ++ * flags - operational parameters ++ * Return Value: ++ * MCD_TABLE_UNALIGNED if taskTableDest is not 512-byte aligned ++ * MCD_OK otherwise ++ */ ++extern u32 MCD_funcDescTab0[]; ++ ++int MCD_initDma (dmaRegs *dmaBarAddr, void *taskTableDest, u32 flags) ++{ ++ int i; ++ TaskTableEntry *entryPtr; ++ ++ /* setup the local pointer to register set */ ++ MCD_dmaBar = dmaBarAddr; ++ ++ /* do we need to move/create a task table */ ++ if ((flags & MCD_RELOC_TASKS) != 0) ++ { ++ int fixedSize; ++ u32 *fixedPtr; ++ /*int *tablePtr = taskTableDest;TBD*/ ++ int varTabsOffset, funcDescTabsOffset, contextSavesOffset; ++ int taskDescTabsOffset; ++ int taskTableSize, varTabsSize, funcDescTabsSize, contextSavesSize; ++ int taskDescTabSize; ++ ++ int i; ++ ++ /* check if physical address is aligned on 512 byte boundary */ ++ if (((u32)taskTableDest & 0x000001ff) != 0) ++ return(MCD_TABLE_UNALIGNED); ++ ++ MCD_taskTable = taskTableDest; /* set up local pointer to task Table */ ++ ++ /* ++ * Create a task table: ++ * - compute aligned base offsets for variable tables and ++ * function descriptor tables, then ++ * - loop through the task table and setup the pointers ++ * - copy over model task table with the the actual task descriptor ++ * tables ++ */ ++ ++ taskTableSize = NCHANNELS * sizeof(TaskTableEntry); ++ /* align variable tables to size */ ++ varTabsOffset = taskTableSize + (u32)taskTableDest; ++ if ((varTabsOffset & (VAR_TAB_SIZE - 1)) != 0) ++ varTabsOffset = (varTabsOffset + VAR_TAB_SIZE) & (~VAR_TAB_SIZE); ++ /* align function descriptor tables */ ++ varTabsSize = NCHANNELS * VAR_TAB_SIZE; ++ funcDescTabsOffset = varTabsOffset + varTabsSize; ++ ++ if ((funcDescTabsOffset & (FUNCDESC_TAB_SIZE - 1)) != 0) ++ funcDescTabsOffset = (funcDescTabsOffset + FUNCDESC_TAB_SIZE) & ++ (~FUNCDESC_TAB_SIZE); ++ ++ funcDescTabsSize = FUNCDESC_TAB_NUM * FUNCDESC_TAB_SIZE; ++ contextSavesOffset = funcDescTabsOffset + funcDescTabsSize; ++ contextSavesSize = (NCHANNELS * CONTEXT_SAVE_SIZE); ++ fixedSize = taskTableSize + varTabsSize + funcDescTabsSize + ++ contextSavesSize; ++ ++ /* zero the thing out */ ++ fixedPtr = (u32 *)taskTableDest; ++ for (i = 0;i<(fixedSize/4);i++) ++ fixedPtr[i] = 0; ++ ++ entryPtr = (TaskTableEntry*)MCD_taskTable; ++ /* set up fixed pointers */ ++ for (i = 0; i < NCHANNELS; i++) ++ { ++ entryPtr[i].varTab = (u32)varTabsOffset; /* update ptr to local value */ ++ entryPtr[i].FDTandFlags = (u32)funcDescTabsOffset | MCD_TT_FLAGS_DEF; ++ entryPtr[i].contextSaveSpace = (u32)contextSavesOffset; ++ varTabsOffset += VAR_TAB_SIZE; ++#ifdef MCD_INCLUDE_EU /* if not there is only one, just point to the same one */ ++ funcDescTabsOffset += FUNCDESC_TAB_SIZE; ++#endif ++ contextSavesOffset += CONTEXT_SAVE_SIZE; ++ } ++ /* copy over the function descriptor table */ ++ for ( i = 0; i < FUNCDESC_TAB_NUM; i++) ++ { ++ MCD_memcpy((void*)(entryPtr[i].FDTandFlags & ~MCD_TT_FLAGS_MASK), ++ (void*)MCD_funcDescTab0, FUNCDESC_TAB_SIZE); ++ } ++ ++ /* copy model task table to where the context saves stuff leaves off*/ ++ MCD_modelTaskTable = (TaskTableEntry*)contextSavesOffset; ++ ++ MCD_memcpy ((void*)MCD_modelTaskTable, (void*)MCD_modelTaskTableSrc, ++ NUMOFVARIANTS * sizeof(TaskTableEntry)); ++ ++ entryPtr = MCD_modelTaskTable; /* point to local version of ++ model task table */ ++ taskDescTabsOffset = (u32)MCD_modelTaskTable + ++ (NUMOFVARIANTS * sizeof(TaskTableEntry)); ++ ++ /* copy actual task code and update TDT ptrs in local model task table */ ++ for (i = 0; i < NUMOFVARIANTS; i++) ++ { ++ taskDescTabSize = entryPtr[i].TDTend - entryPtr[i].TDTstart + 4; ++ MCD_memcpy ((void*)taskDescTabsOffset, (void*)entryPtr[i].TDTstart, taskDescTabSize); ++ entryPtr[i].TDTstart = (u32)taskDescTabsOffset; ++ taskDescTabsOffset += taskDescTabSize; ++ entryPtr[i].TDTend = (u32)taskDescTabsOffset - 4; ++ } ++#ifdef MCD_INCLUDE_EU /* Tack single DMA BDs onto end of code so API controls ++ where they are since DMA might write to them */ ++ MCD_relocBuffDesc = (MCD_bufDesc*)(entryPtr[NUMOFVARIANTS - 1].TDTend + 4); ++#else /* DMA does not touch them so they can be wherever and we don't need to ++ waste SRAM on them */ ++ MCD_relocBuffDesc = MCD_singleBufDescs; ++#endif ++ } ++ else ++ { ++ /* point the would-be relocated task tables and the ++ buffer descriptors to the ones the linker generated */ ++ ++ if (((u32)MCD_realTaskTableSrc & 0x000001ff) != 0) ++ return(MCD_TABLE_UNALIGNED); ++ ++ /* need to add code to make sure that every thing else is aligned properly TBD*/ ++ /* this is problematic if we init more than once or after running tasks, ++ need to add variable to see if we have aleady init'd */ ++ entryPtr = MCD_realTaskTableSrc; ++ for (i = 0; i < NCHANNELS; i++) ++ { ++ if (((entryPtr[i].varTab & (VAR_TAB_SIZE - 1)) != 0) || ++ ((entryPtr[i].FDTandFlags & (FUNCDESC_TAB_SIZE - 1)) != 0)) ++ return(MCD_TABLE_UNALIGNED); ++ } ++ ++ MCD_taskTable = MCD_realTaskTableSrc; ++ MCD_modelTaskTable = MCD_modelTaskTableSrc; ++ MCD_relocBuffDesc = MCD_singleBufDescs; ++ } ++ ++ ++ /* Make all channels as totally inactive, and remember them as such: */ ++ ++ MCD_dmaBar->taskbar = (u32) MCD_taskTable; ++ for (i = 0; i < NCHANNELS; i++) ++ { ++ MCD_dmaBar->taskControl[i] = 0x0; ++ MCD_chStatus[i] = MCD_NO_DMA; ++ } ++ ++ /* Set up pausing mechanism to inactive state: */ ++ MCD_dmaBar->debugComp1 = 0; /* no particular values yet for either comparator registers */ ++ MCD_dmaBar->debugComp2 = 0; ++ MCD_dmaBar->debugControl = DBG_CTL_DISABLE; ++ MCD_dmaBar->debugStatus = DBG_KILL_ALL_STAT; ++ ++ /* enable or disable commbus prefetch, really need an ifdef or ++ something to keep from trying to set this in the 8220 */ ++ if ((flags & MCD_COMM_PREFETCH_EN) != 0) ++ MCD_dmaBar->ptdControl &= ~PTD_CTL_COMM_PREFETCH; ++ else ++ MCD_dmaBar->ptdControl |= PTD_CTL_COMM_PREFETCH; ++ ++ return(MCD_OK); ++} ++/*********************** End of MCD_initDma() ***********************/ ++ ++/********************************************************************/ ++/* Function: MCD_dmaStatus ++ * Purpose: Returns the status of the DMA on the requested channel ++ * Arguments: channel - channel number ++ * Returns: Predefined status indicators ++ */ ++int MCD_dmaStatus (int channel) ++{ ++ u16 tcrValue; ++ ++ if((channel < 0) || (channel >= NCHANNELS)) ++ return(MCD_CHANNEL_INVALID); ++ ++ tcrValue = MCD_dmaBar->taskControl[channel]; ++ if ((tcrValue & TASK_CTL_EN) == 0) ++ { /* nothing running */ ++ /* if last reported with task enabled */ ++ if ( MCD_chStatus[channel] == MCD_RUNNING ++ || MCD_chStatus[channel] == MCD_IDLE) ++ MCD_chStatus[channel] = MCD_DONE; ++ } ++ else /* something is running */ ++ { ++ /* There are three possibilities: paused, running or idle. */ ++ if ( MCD_chStatus[channel] == MCD_RUNNING ++ || MCD_chStatus[channel] == MCD_IDLE) ++ { ++ MCD_dmaBar->ptdDebug = PTD_DBG_TSK_VLD_INIT; ++ /* This register is selected to know which initiator is ++ actually asserted. */ ++ if ((MCD_dmaBar->ptdDebug >> channel ) & 0x1 ) ++ MCD_chStatus[channel] = MCD_RUNNING; ++ else ++ MCD_chStatus[channel] = MCD_IDLE; ++ /* do not change the status if it is already paused. */ ++ } ++ } ++ return MCD_chStatus[channel]; ++} ++/******************** End of MCD_dmaStatus() ************************/ ++ ++/********************************************************************/ ++/* Function: MCD_startDma ++ * Ppurpose: Starts a particular kind of DMA ++ * Arguments: see below ++ * Returns: MCD_CHANNEL_INVALID if channel is invalid, else MCD_OK ++ */ ++ ++int MCD_startDma ( ++ int channel, /* the channel on which to run the DMA */ ++ s8 *srcAddr, /* the address to move data from, or physical buffer-descriptor address */ ++ s16 srcIncr, /* the amount to increment the source address per transfer */ ++ s8 *destAddr, /* the address to move data to */ ++ s16 destIncr, /* the amount to increment the destination address per transfer */ ++ u32 dmaSize, /* the number of bytes to transfer independent of the transfer size */ ++ u32 xferSize, /* the number bytes in of each data movement (1, 2, or 4) */ ++ u32 initiator, /* what device initiates the DMA */ ++ int priority, /* priority of the DMA */ ++ u32 flags, /* flags describing the DMA */ ++ u32 funcDesc /* a description of byte swapping, bit swapping, and CRC actions */ ++#ifdef MCD_NEED_ADDR_TRANS ++ s8 *srcAddrVirt /* virtual buffer descriptor address TBD*/ ++#endif ++) ++{ ++ int srcRsdIncr, destRsdIncr; ++ int *cSave; ++ short xferSizeIncr; ++ int tcrCount = 0; ++#ifdef MCD_INCLUDE_EU ++ u32 *realFuncArray; ++#endif ++ ++ if((channel < 0) || (channel >= NCHANNELS)) ++ return(MCD_CHANNEL_INVALID); ++ ++ /* tbd - need to determine the proper response to a bad funcDesc when not ++ including EU functions, for now, assign a benign funcDesc, but maybe ++ should return an error */ ++#ifndef MCD_INCLUDE_EU ++ funcDesc = MCD_FUNC_NOEU1; ++#endif ++ ++#ifdef MCD_DEBUG ++printf("startDma:Setting up params\n"); ++#endif ++ /* Set us up for task-wise priority. We don't technically need to do this on every start, but ++ since the register involved is in the same longword as other registers that users are in control ++ of, setting it more than once is probably preferable. That since the documentation doesn't seem ++ to be completely consistent about the nature of the PTD control register. */ ++ MCD_dmaBar->ptdControl |= (u16) 0x8000; ++#if 1 /* Not sure what we need to keep here rtm TBD */ ++ /* Calculate additional parameters to the regular DMA calls. */ ++ srcRsdIncr = srcIncr < 0 ? -1 : (srcIncr > 0 ? 1 : 0); ++ destRsdIncr = destIncr < 0 ? -1 : (destIncr > 0 ? 1 : 0); ++ ++ xferSizeIncr = (xferSize & 0xffff) | 0x20000000; ++ ++ /* Remember for each channel which variant is running. */ ++ MCD_remVariants.remSrcRsdIncr[channel] = srcRsdIncr; ++ MCD_remVariants.remDestRsdIncr[channel] = destRsdIncr; ++ MCD_remVariants.remDestIncr[channel] = destIncr; ++ MCD_remVariants.remSrcIncr[channel] = srcIncr; ++ MCD_remVariants.remXferSize[channel] = xferSize; ++#endif ++ ++ cSave = (int*)(MCD_taskTable[channel].contextSaveSpace) + CSAVE_OFFSET + CURRBD; ++ ++#ifdef MCD_INCLUDE_EU /* may move this to EU specific calls */ ++ realFuncArray = (u32 *) (MCD_taskTable[channel].FDTandFlags & 0xffffff00); ++ /* Modify the LURC's normal and byte-residue-loop functions according to parameter. */ ++ realFuncArray[(LURC*16)] = xferSize == 4 ? ++ funcDesc : xferSize == 2 ? ++ funcDesc & 0xfffff00f : funcDesc & 0xffff000f; ++ realFuncArray[(LURC*16+1)] = (funcDesc & MCD_BYTE_SWAP_KILLER) | MCD_NO_BYTE_SWAP_ATALL; ++#endif ++ /* Write the initiator field in the TCR, and also set the initiator-hold ++ bit. Note that,due to a hardware quirk, this could collide with an ++ MDE access to the initiator-register file, so we have to verify that the write ++ reads back correctly. */ ++ ++ MCD_dmaBar->taskControl[channel] = ++ (initiator << 8) | TASK_CTL_HIPRITSKEN | TASK_CTL_HLDINITNUM; ++ ++ while(((MCD_dmaBar->taskControl[channel] & 0x1fff) != ++ ((initiator << 8) | TASK_CTL_HIPRITSKEN | TASK_CTL_HLDINITNUM)) && ++ (tcrCount < 1000)) ++ { ++ tcrCount++; ++ /*MCD_dmaBar->ptd_tcr[channel] = (initiator << 8) | 0x0020;*/ ++ MCD_dmaBar->taskControl[channel] = ++ (initiator << 8) | TASK_CTL_HIPRITSKEN | TASK_CTL_HLDINITNUM; ++ } ++ ++ MCD_dmaBar->priority[channel] = (u8)priority & PRIORITY_PRI_MASK; ++ /* should be albe to handle this stuff with only one write to ts reg - tbd */ ++ if (channel < 8 && channel >= 0) ++ { ++ MCD_dmaBar->taskSize0 &= ~(0xf << (7-channel)*4); ++ MCD_dmaBar->taskSize0 |= (xferSize & 3) << (((7 - channel)*4) + 2); ++ MCD_dmaBar->taskSize0 |= (xferSize & 3) << ((7 - channel)*4); ++ } ++ else ++ { ++ MCD_dmaBar->taskSize1 &= ~(0xf << (15-channel)*4); ++ MCD_dmaBar->taskSize1 |= (xferSize & 3) << (((15 - channel)*4) + 2); ++ MCD_dmaBar->taskSize1 |= (xferSize & 3) << ((15 - channel)*4); ++ } ++ ++ /* setup task table flags/options which mostly control the line buffers */ ++ MCD_taskTable[channel].FDTandFlags &= ~MCD_TT_FLAGS_MASK; ++ MCD_taskTable[channel].FDTandFlags |= (MCD_TT_FLAGS_MASK & flags); ++ ++ if (flags & MCD_FECTX_DMA) ++ { ++ /* TDTStart and TDTEnd */ ++ MCD_taskTable[channel].TDTstart = MCD_modelTaskTable[TASK_FECTX].TDTstart; ++ MCD_taskTable[channel].TDTend = MCD_modelTaskTable[TASK_FECTX].TDTend; ++ MCD_startDmaENetXmit(srcAddr, srcAddr, destAddr, MCD_taskTable, channel); ++ } ++ else if (flags & MCD_FECRX_DMA) ++ { ++ /* TDTStart and TDTEnd */ ++ MCD_taskTable[channel].TDTstart = MCD_modelTaskTable[TASK_FECRX].TDTstart; ++ MCD_taskTable[channel].TDTend = MCD_modelTaskTable[TASK_FECRX].TDTend; ++ MCD_startDmaENetRcv(srcAddr, srcAddr, destAddr, MCD_taskTable, channel); ++ } ++ else if(flags & MCD_SINGLE_DMA) ++ { ++ /* this buffer descriptor is used for storing off initial parameters for later ++ progress query calculation and for the DMA to write the resulting checksum ++ The DMA does not use this to determine how to operate, that info is passed ++ with the init routine*/ ++ MCD_relocBuffDesc[channel].srcAddr = srcAddr; ++ MCD_relocBuffDesc[channel].destAddr = destAddr; ++ MCD_relocBuffDesc[channel].lastDestAddr = destAddr; /* definitely not its final value */ ++ MCD_relocBuffDesc[channel].dmaSize = dmaSize; ++ MCD_relocBuffDesc[channel].flags = 0; /* not used */ ++ MCD_relocBuffDesc[channel].csumResult = 0; /* not used */ ++ MCD_relocBuffDesc[channel].next = 0; /* not used */ ++ ++ /* Initialize the progress-querying stuff to show no progress:*/ ++ ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[SRCPTR + CSAVE_OFFSET] = (int)srcAddr; ++ ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[DESTPTR + CSAVE_OFFSET] = (int)destAddr; ++ ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[DCOUNT + CSAVE_OFFSET] = 0; ++ ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[CURRBD + CSAVE_OFFSET] = ++ (u32) &(MCD_relocBuffDesc[channel]); ++ /* tbd - need to keep the user from trying to call the EU routine ++ when MCD_INCLUDE_EU is not defined */ ++ if( funcDesc == MCD_FUNC_NOEU1 || funcDesc == MCD_FUNC_NOEU2) ++ { ++ /* TDTStart and TDTEnd */ ++ MCD_taskTable[channel].TDTstart = MCD_modelTaskTable[TASK_SINGLENOEU].TDTstart; ++ MCD_taskTable[channel].TDTend = MCD_modelTaskTable[TASK_SINGLENOEU].TDTend; ++ MCD_startDmaSingleNoEu(srcAddr, srcIncr, destAddr, destIncr, dmaSize, dmaSize, ++ xferSizeIncr, flags, (int *)&(MCD_relocBuffDesc[channel]), cSave, ++ MCD_taskTable, channel); ++ } ++ else ++ { ++ /* TDTStart and TDTEnd */ ++ MCD_taskTable[channel].TDTstart = MCD_modelTaskTable[TASK_SINGLEEU].TDTstart; ++ MCD_taskTable[channel].TDTend = MCD_modelTaskTable[TASK_SINGLEEU].TDTend; ++ MCD_startDmaSingleEu(srcAddr, srcIncr, destAddr, destIncr, dmaSize, dmaSize, ++ xferSizeIncr, flags, (int *)&(MCD_relocBuffDesc[channel]), cSave, ++ MCD_taskTable, channel); ++ } ++ } ++ else ++ { /* chained DMAS */ ++ /* Initialize the progress-querying stuff to show no progress:*/ ++#if 1 /* (!defined(MCD_NEED_ADDR_TRANS)) */ ++ ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[SRCPTR + CSAVE_OFFSET] ++ = (int)((MCD_bufDesc*) phys_to_virt(srcAddr))->srcAddr; ++ ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[DESTPTR + CSAVE_OFFSET] ++ = (int)((MCD_bufDesc*) phys_to_virt(srcAddr))->destAddr; ++#else /* if using address translation, need the virtual addr of the first buffdesc */ ++ ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[SRCPTR + CSAVE_OFFSET] ++ = (int)((MCD_bufDesc*) srcAddrVirt)->srcAddr; ++ ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[DESTPTR + CSAVE_OFFSET] ++ = (int)((MCD_bufDesc*) srcAddrVirt)->destAddr; ++#endif ++ ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[DCOUNT + CSAVE_OFFSET] = 0; ++ ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[CURRBD + CSAVE_OFFSET] = (u32) srcAddr; ++ ++ if( funcDesc == MCD_FUNC_NOEU1 || funcDesc == MCD_FUNC_NOEU2) ++ { ++ /*TDTStart and TDTEnd*/ ++ MCD_taskTable[channel].TDTstart = MCD_modelTaskTable[TASK_CHAINNOEU].TDTstart; ++ MCD_taskTable[channel].TDTend = MCD_modelTaskTable[TASK_CHAINNOEU].TDTend; ++ MCD_startDmaChainNoEu((int *)srcAddr, srcIncr, destIncr, xferSize, ++ xferSizeIncr, cSave, MCD_taskTable, channel); ++ } ++ else ++ { ++ /*TDTStart and TDTEnd*/ ++ MCD_taskTable[channel].TDTstart = MCD_modelTaskTable[TASK_CHAINEU].TDTstart; ++ MCD_taskTable[channel].TDTend = MCD_modelTaskTable[TASK_CHAINEU].TDTend; ++ MCD_startDmaChainEu((int *)srcAddr, srcIncr, destIncr, xferSize, ++ xferSizeIncr, cSave, MCD_taskTable, channel); ++ } ++ } ++ MCD_chStatus[channel] = MCD_IDLE; ++ return(MCD_OK); ++} ++ ++/************************ End of MCD_startDma() *********************/ ++ ++/********************************************************************/ ++/* Function: MCD_XferProgrQuery ++ * Purpose: Returns progress of DMA on requested channel ++ * Arguments: channel - channel to retrieve progress for ++ * progRep - pointer to user supplied MCD_XferProg struct ++ * Returns: MCD_CHANNEL_INVALID if channel is invalid, else MCD_OK ++ * ++ * Notes: ++ * MCD_XferProgrQuery() upon completing or after aborting a DMA, or ++ * while the DMA is in progress, this function returns the first ++ * DMA-destination address not (or not yet) used in the DMA. When ++ * encountering a non-ready buffer descriptor, the information for ++ * the last completed descriptor is returned. ++ * ++ * MCD_XferProgQuery() has to avoid the possibility of getting ++ * partially-updated information in the event that we should happen ++ * to query DMA progress just as the DMA is updating it. It does that ++ * by taking advantage of the fact context is not saved frequently for ++ * the most part. We therefore read it at least twice until we get the ++ * same information twice in a row. ++ * ++ * Because a small, but not insignificant, amount of time is required ++ * to write out the progress-query information, especially upon ++ * completion of the DMA, it would be wise to guarantee some time lag ++ * between successive readings of the progress-query information. ++ */ ++ ++/* ++ * How many iterations of the loop below to execute to stabilize values ++ */ ++#define STABTIME 0 ++ ++int MCD_XferProgrQuery (int channel, MCD_XferProg *progRep) ++{ ++ MCD_XferProg prevRep; ++ int again; /* true if we are to try again to get consistent results */ ++ int i; /* used as a time-waste counter */ ++ int destDiffBytes; /* Total number of bytes that we think actually got xfered. */ ++ int numIterations; /* number of iterations */ ++ int bytesNotXfered; /* bytes that did not get xfered. */ ++ s8 *LWAlignedInitDestAddr, *LWAlignedCurrDestAddr; ++ int subModVal, addModVal; /* Mode values to added and subtracted from the ++ final destAddr */ ++ ++ if((channel < 0) || (channel >= NCHANNELS)) ++ return(MCD_CHANNEL_INVALID); ++ ++ /* Read a trial value for the progress-reporting values*/ ++ prevRep.lastSrcAddr = ++ (s8 *) ((volatile int*) MCD_taskTable[channel].contextSaveSpace)[SRCPTR + CSAVE_OFFSET]; ++ prevRep.lastDestAddr = ++ (s8 *) ((volatile int*) MCD_taskTable[channel].contextSaveSpace)[DESTPTR + CSAVE_OFFSET]; ++ prevRep.dmaSize = ((volatile int*) MCD_taskTable[channel].contextSaveSpace)[DCOUNT + CSAVE_OFFSET]; ++ prevRep.currBufDesc = ++ (MCD_bufDesc*) ((volatile int*) MCD_taskTable[channel].contextSaveSpace)[CURRBD + CSAVE_OFFSET]; ++ /* Repeatedly reread those values until they match previous values: */ ++ do { ++ /* Waste a little bit of time to ensure stability: */ ++ for (i = 0; i < STABTIME; i++) ++ i += i >> 2; /* make sure this loop does something so that it doesn't get optimized out */ ++ /* Check them again: */ ++ progRep->lastSrcAddr = ++ (s8 *) ((volatile int*) MCD_taskTable[channel].contextSaveSpace)[SRCPTR + CSAVE_OFFSET]; ++ progRep->lastDestAddr = ++ (s8 *) ((volatile int*) MCD_taskTable[channel].contextSaveSpace)[DESTPTR + CSAVE_OFFSET]; ++ progRep->dmaSize = ((volatile int*) MCD_taskTable[channel].contextSaveSpace)[DCOUNT + CSAVE_OFFSET]; ++ progRep->currBufDesc = ++ (MCD_bufDesc*) ((volatile int*) MCD_taskTable[channel].contextSaveSpace)[CURRBD + CSAVE_OFFSET]; ++ /* See if they match: */ ++ if ( prevRep.lastSrcAddr != progRep->lastSrcAddr ++ || prevRep.lastDestAddr != progRep->lastDestAddr ++ || prevRep.dmaSize != progRep->dmaSize ++ || prevRep.currBufDesc != progRep->currBufDesc) ++ { ++ /* If they don't match, remember previous values and try again:*/ ++ prevRep.lastSrcAddr = progRep->lastSrcAddr; ++ prevRep.lastDestAddr = progRep->lastDestAddr; ++ prevRep.dmaSize = progRep->dmaSize; ++ prevRep.currBufDesc = progRep->currBufDesc; ++ again = MCD_TRUE; ++ } ++ else ++ again = MCD_FALSE; ++ } while (again == MCD_TRUE); ++ ++ ++ /* Update the dCount, srcAddr and destAddr */ ++ /* To calculate dmaCount, we consider destination address. C ++ overs M1,P1,Z for destination */ ++ switch(MCD_remVariants.remDestRsdIncr[channel]) { ++ case MINUS1: ++ subModVal = ((int)progRep->lastDestAddr) & ((MCD_remVariants.remXferSize[channel]) - 1); ++ addModVal = ((int)progRep->currBufDesc->destAddr) & ((MCD_remVariants.remXferSize[channel]) - 1); ++ LWAlignedInitDestAddr = (progRep->currBufDesc->destAddr) - addModVal; ++ LWAlignedCurrDestAddr = (progRep->lastDestAddr) - subModVal; ++ destDiffBytes = LWAlignedInitDestAddr - LWAlignedCurrDestAddr; ++ bytesNotXfered = (destDiffBytes/MCD_remVariants.remDestIncr[channel]) * ++ ( MCD_remVariants.remDestIncr[channel] ++ + MCD_remVariants.remXferSize[channel]); ++ progRep->dmaSize = destDiffBytes - bytesNotXfered + addModVal - subModVal; ++ break; ++ case ZERO: ++ progRep->lastDestAddr = progRep->currBufDesc->destAddr; ++ break; ++ case PLUS1: ++ /* This value has to be subtracted from the final calculated dCount. */ ++ subModVal = ((int)progRep->currBufDesc->destAddr) & ((MCD_remVariants.remXferSize[channel]) - 1); ++ /* These bytes are already in lastDestAddr. */ ++ addModVal = ((int)progRep->lastDestAddr) & ((MCD_remVariants.remXferSize[channel]) - 1); ++ LWAlignedInitDestAddr = (progRep->currBufDesc->destAddr) - subModVal; ++ LWAlignedCurrDestAddr = (progRep->lastDestAddr) - addModVal; ++ destDiffBytes = (progRep->lastDestAddr - LWAlignedInitDestAddr); ++ numIterations = ( LWAlignedCurrDestAddr - LWAlignedInitDestAddr)/MCD_remVariants.remDestIncr[channel]; ++ bytesNotXfered = numIterations * ++ ( MCD_remVariants.remDestIncr[channel] ++ - MCD_remVariants.remXferSize[channel]); ++ progRep->dmaSize = destDiffBytes - bytesNotXfered - subModVal; ++ break; ++ default: ++ break; ++ } ++ ++ /* This covers M1,P1,Z for source */ ++ switch(MCD_remVariants.remSrcRsdIncr[channel]) { ++ case MINUS1: ++ progRep->lastSrcAddr = ++ progRep->currBufDesc->srcAddr + ++ ( MCD_remVariants.remSrcIncr[channel] * ++ (progRep->dmaSize/MCD_remVariants.remXferSize[channel])); ++ break; ++ case ZERO: ++ progRep->lastSrcAddr = progRep->currBufDesc->srcAddr; ++ break; ++ case PLUS1: ++ progRep->lastSrcAddr = ++ progRep->currBufDesc->srcAddr + ++ ( MCD_remVariants.remSrcIncr[channel] * ++ (progRep->dmaSize/MCD_remVariants.remXferSize[channel])); ++ break; ++ default: break; ++ } ++ ++ return(MCD_OK); ++} ++/******************* End of MCD_XferProgrQuery() ********************/ ++ ++/********************************************************************/ ++/* MCD_resmActions() does the majority of the actions of a DMA resume. ++ * It is called from MCD_killDma() and MCD_resumeDma(). It has to be ++ * a separate function because the kill function has to negate the task ++ * enable before resuming it, but the resume function has to do nothing ++ * if there is no DMA on that channel (i.e., if the enable bit is 0). ++ */ ++static void MCD_resmActions (int channel) ++{ ++ MCD_dmaBar->debugControl = DBG_CTL_DISABLE; ++ MCD_dmaBar->debugStatus = MCD_dmaBar->debugStatus; ++ MCD_dmaBar->ptdDebug = PTD_DBG_TSK_VLD_INIT; /* This register is selected to know ++ which initiator is actually asserted. */ ++ if((MCD_dmaBar->ptdDebug >> channel ) & 0x1) ++ MCD_chStatus[channel] = MCD_RUNNING; ++ else ++ MCD_chStatus[channel] = MCD_IDLE; ++} ++/********************* End of MCD_resmActions() *********************/ ++ ++/********************************************************************/ ++/* Function: MCD_killDma ++ * Purpose: Halt the DMA on the requested channel, without any ++ * intention of resuming the DMA. ++ * Arguments: channel - requested channel ++ * Returns: MCD_CHANNEL_INVALID if channel is invalid, else MCD_OK ++ * ++ * Notes: ++ * A DMA may be killed from any state, including paused state, and it ++ * always goes to the MCD_HALTED state even if it is killed while in ++ * the MCD_NO_DMA or MCD_IDLE states. ++ */ ++int MCD_killDma (int channel) ++{ ++ /* MCD_XferProg progRep; */ ++ ++ if((channel < 0) || (channel >= NCHANNELS)) ++ return(MCD_CHANNEL_INVALID); ++ ++ MCD_dmaBar->taskControl[channel] = 0x0; ++ MCD_resumeDma (channel); ++ /* ++ * This must be after the write to the TCR so that the task doesn't ++ * start up again momentarily, and before the status assignment so ++ * as to override whatever MCD_resumeDma() may do to the channel ++ * status. ++ */ ++ MCD_chStatus[channel] = MCD_HALTED; ++ ++ /* ++ * Update the current buffer descriptor's lastDestAddr field ++ * ++ * MCD_XferProgrQuery (channel, &progRep); ++ * progRep.currBufDesc->lastDestAddr = progRep.lastDestAddr; ++ */ ++ return(MCD_OK); ++} ++/************************ End of MCD_killDma() **********************/ ++ ++/********************************************************************/ ++/* Function: MCD_continDma ++ * Purpose: Continue a DMA which as stopped due to encountering an ++ * unready buffer descriptor. ++ * Arguments: channel - channel to continue the DMA on ++ * Returns: MCD_CHANNEL_INVALID if channel is invalid, else MCD_OK ++ * ++ * Notes: ++ * This routine does not check to see if there is a task which can ++ * be continued. Also this routine should not be used with single DMAs. ++ */ ++int MCD_continDma (int channel) ++{ ++ if((channel < 0) || (channel >= NCHANNELS)) ++ return(MCD_CHANNEL_INVALID); ++ ++ MCD_dmaBar->taskControl[channel] |= TASK_CTL_EN; ++ MCD_chStatus[channel] = MCD_RUNNING; ++ ++ return(MCD_OK); ++} ++/********************** End of MCD_continDma() **********************/ ++ ++/********************************************************************* ++ * MCD_pauseDma() and MCD_resumeDma() below use the DMA's debug unit ++ * to freeze a task and resume it. We freeze a task by breakpointing ++ * on the stated task. That is, not any specific place in the task, ++ * but any time that task executes. In particular, when that task ++ * executes, we want to freeze that task and only that task. ++ * ++ * The bits of the debug control register influence interrupts vs. ++ * breakpoints as follows: ++ * - Bits 14 and 0 enable or disable debug functions. If enabled, you ++ * will get the interrupt but you may or may not get a breakpoint. ++ * - Bits 2 and 1 decide whether you also get a breakpoint in addition ++ * to an interrupt. ++ * ++ * The debug unit can do these actions in response to either internally ++ * detected breakpoint conditions from the comparators, or in response ++ * to the external breakpoint pin, or both. ++ * - Bits 14 and 1 perform the above-described functions for ++ * internally-generated conditions, i.e., the debug comparators. ++ * - Bits 0 and 2 perform the above-described functions for external ++ * conditions, i.e., the breakpoint external pin. ++ * ++ * Note that, although you "always" get the interrupt when you turn ++ * the debug functions, the interrupt can nevertheless, if desired, be ++ * masked by the corresponding bit in the PTD's IMR. Note also that ++ * this means that bits 14 and 0 must enable debug functions before ++ * bits 1 and 2, respectively, have any effect. ++ * ++ * NOTE: It's extremely important to not pause more than one DMA channel ++ * at a time. ++ ********************************************************************/ ++ ++/********************************************************************/ ++/* Function: MCD_pauseDma ++ * Purpose: Pauses the DMA on a given channel (if any DMA is running ++ * on that channel). ++ * Arguments: channel ++ * Returns: MCD_CHANNEL_INVALID if channel is invalid, else MCD_OK ++ */ ++int MCD_pauseDma (int channel) ++{ ++ /* MCD_XferProg progRep; */ ++ ++ if((channel < 0) || (channel >= NCHANNELS)) ++ return(MCD_CHANNEL_INVALID); ++ ++ if (MCD_dmaBar->taskControl[channel] & TASK_CTL_EN) ++ { ++ MCD_dmaBar->debugComp1 = channel; ++ MCD_dmaBar->debugControl = DBG_CTL_ENABLE | (1 << (channel + 16)); ++ MCD_chStatus[channel] = MCD_PAUSED; ++ ++ /* ++ * Update the current buffer descriptor's lastDestAddr field ++ * ++ * MCD_XferProgrQuery (channel, &progRep); ++ * progRep.currBufDesc->lastDestAddr = progRep.lastDestAddr; ++ */ ++ } ++ return(MCD_OK); ++} ++/************************* End of MCD_pauseDma() ********************/ ++ ++/********************************************************************/ ++/* Function: MCD_resumeDma ++ * Purpose: Resumes the DMA on a given channel (if any DMA is ++ * running on that channel). ++ * Arguments: channel - channel on which to resume DMA ++ * Returns: MCD_CHANNEL_INVALID if channel is invalid, else MCD_OK ++ */ ++int MCD_resumeDma (int channel) ++{ ++ if((channel < 0) || (channel >= NCHANNELS)) ++ return(MCD_CHANNEL_INVALID); ++ ++ if (MCD_dmaBar->taskControl[channel] & TASK_CTL_EN) ++ MCD_resmActions (channel); ++ ++ return(MCD_OK); ++} ++/************************ End of MCD_resumeDma() ********************/ ++ ++/********************************************************************/ ++/* Function: MCD_csumQuery ++ * Purpose: Provide the checksum after performing a non-chained DMA ++ * Arguments: channel - channel to report on ++ * csum - pointer to where to write the checksum/CRC ++ * Returns: MCD_ERROR if the channel is invalid, else MCD_OK ++ * ++ * Notes: ++ * ++ */ ++int MCD_csumQuery (int channel, u32 *csum) ++{ ++#ifdef MCD_INCLUDE_EU ++ if((channel < 0) || (channel >= NCHANNELS)) ++ return(MCD_CHANNEL_INVALID); ++ ++ *csum = MCD_relocBuffDesc[channel].csumResult; ++ return(MCD_OK); ++#else ++ return(MCD_ERROR); ++#endif ++} ++/*********************** End of MCD_resumeDma() *********************/ ++ ++/********************************************************************/ ++/* Function: MCD_getCodeSize ++ * Purpose: Provide the size requirements of the microcoded tasks ++ * Returns: Size in bytes ++ */ ++int MCD_getCodeSize(void) ++{ ++#ifdef MCD_INCLUDE_EU ++ return(0x2b5c); ++#else ++ return(0x173c); ++#endif ++} ++/********************** End of MCD_getCodeSize() ********************/ ++ ++/********************************************************************/ ++/* Function: MCD_getVersion ++ * Purpose: Provide the version string and number ++ * Arguments: longVersion - user supplied pointer to a pointer to a char ++ * which points to the version string ++ * Returns: Version number and version string (by reference) ++ */ ++char MCD_versionString[] = "Multi-channel DMA API Alpha v0.3 (2004-04-26)"; ++#define MCD_REV_MAJOR 0x00 ++#define MCD_REV_MINOR 0x03 ++ ++int MCD_getVersion(char **longVersion) ++{ ++ *longVersion = MCD_versionString; ++ return((MCD_REV_MAJOR << 8) | MCD_REV_MINOR); ++} ++/********************** End of MCD_getVersion() *********************/ ++ ++/********************************************************************/ ++/* Private version of memcpy() ++ * Note that everything this is used for is longword-aligned. ++ */ ++static void MCD_memcpy (int *dest, int *src, u32 size) ++{ ++ u32 i; ++ ++ for (i = 0; i < size; i += sizeof(int), dest++, src++) ++ *dest = *src; ++} ++/********************************************************************/ +--- /dev/null ++++ b/drivers/dma/MCD_progCheck.h +@@ -0,0 +1,33 @@ ++/********************************************************************* ++ * ++ * Copyright (C) 2004 Motorola, Inc. ++ * MOTOROLA, INC. All Rights Reserved. ++ * You are hereby granted a copyright license to use ++ * the SOFTWARE so long as this entire notice is ++ * retained without alteration in any modified and/or redistributed ++ * versions, and that such modified versions are clearly identified ++ * as such. No licenses are granted by implication, estoppel or ++ * otherwise under any patents or trademarks of Motorola, Inc. This ++ * software is provided on an "AS IS" basis and without warranty. ++ * ++ * To the maximum extent permitted by applicable law, MOTOROLA ++ * DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED, INCLUDING ++ * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR ++ * PURPOSE AND ANY WARRANTY AGAINST INFRINGEMENT WITH REGARD TO THE ++ * SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF) AND ANY ++ * ACCOMPANYING WRITTEN MATERIALS. ++ * ++ * To the maximum extent permitted by applicable law, IN NO EVENT ++ * SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER (INCLUDING ++ * WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS ++ * INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY ++ * LOSS) ARISING OF THE USE OR INABILITY TO USE THE SOFTWARE. ++ * ++ * Motorola assumes no responsibility for the maintenance and support ++ * of this software ++ ********************************************************************/ ++ /* This file is autogenerated. Do not change */ ++#define CURRBD 4 ++#define DCOUNT 6 ++#define DESTPTR 5 ++#define SRCPTR 7 +--- /dev/null ++++ b/drivers/dma/MCD_tasks.c +@@ -0,0 +1,2452 @@ ++/********************************************************************* ++ * ++ * Copyright (C) 2004 Motorola, Inc. ++ * MOTOROLA, INC. All Rights Reserved. ++ * You are hereby granted a copyright license to use ++ * the SOFTWARE so long as this entire notice is ++ * retained without alteration in any modified and/or redistributed ++ * versions, and that such modified versions are clearly identified ++ * as such. No licenses are granted by implication, estoppel or ++ * otherwise under any patents or trademarks of Motorola, Inc. This ++ * software is provided on an "AS IS" basis and without warranty. ++ * ++ * To the maximum extent permitted by applicable law, MOTOROLA ++ * DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED, INCLUDING ++ * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR ++ * PURPOSE AND ANY WARRANTY AGAINST INFRINGEMENT WITH REGARD TO THE ++ * SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF) AND ANY ++ * ACCOMPANYING WRITTEN MATERIALS. ++ * ++ * To the maximum extent permitted by applicable law, IN NO EVENT ++ * SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER (INCLUDING ++ * WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS ++ * INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY ++ * LOSS) ARISING OF THE USE OR INABILITY TO USE THE SOFTWARE. ++ * ++ * Motorola assumes no responsibility for the maintenance and support ++ * of this software ++ ********************************************************************/ ++/* ++ * File: MCD_tasks.c ++ * Purpose: Contains task code and structures for Multi-channel DMA ++ * ++ * Notes: ++ * ++ * ++ * Modifications: ++ * ++ * ++ */ ++ ++#include <asm/MCD_dma.h> ++ ++u32 MCD_varTab0[]; ++u32 MCD_varTab1[]; ++u32 MCD_varTab2[]; ++u32 MCD_varTab3[]; ++u32 MCD_varTab4[]; ++u32 MCD_varTab5[]; ++u32 MCD_varTab6[]; ++u32 MCD_varTab7[]; ++u32 MCD_varTab8[]; ++u32 MCD_varTab9[]; ++u32 MCD_varTab10[]; ++u32 MCD_varTab11[]; ++u32 MCD_varTab12[]; ++u32 MCD_varTab13[]; ++u32 MCD_varTab14[]; ++u32 MCD_varTab15[]; ++ ++u32 MCD_funcDescTab0[]; ++#ifdef MCD_INCLUDE_EU ++u32 MCD_funcDescTab1[]; ++u32 MCD_funcDescTab2[]; ++u32 MCD_funcDescTab3[]; ++u32 MCD_funcDescTab4[]; ++u32 MCD_funcDescTab5[]; ++u32 MCD_funcDescTab6[]; ++u32 MCD_funcDescTab7[]; ++u32 MCD_funcDescTab8[]; ++u32 MCD_funcDescTab9[]; ++u32 MCD_funcDescTab10[]; ++u32 MCD_funcDescTab11[]; ++u32 MCD_funcDescTab12[]; ++u32 MCD_funcDescTab13[]; ++u32 MCD_funcDescTab14[]; ++u32 MCD_funcDescTab15[]; ++#endif ++ ++u32 MCD_contextSave0[]; ++u32 MCD_contextSave1[]; ++u32 MCD_contextSave2[]; ++u32 MCD_contextSave3[]; ++u32 MCD_contextSave4[]; ++u32 MCD_contextSave5[]; ++u32 MCD_contextSave6[]; ++u32 MCD_contextSave7[]; ++u32 MCD_contextSave8[]; ++u32 MCD_contextSave9[]; ++u32 MCD_contextSave10[]; ++u32 MCD_contextSave11[]; ++u32 MCD_contextSave12[]; ++u32 MCD_contextSave13[]; ++u32 MCD_contextSave14[]; ++u32 MCD_contextSave15[]; ++ ++u32 MCD_realTaskTableSrc[] = ++{ ++ 0x00000000, ++ 0x00000000, ++ (u32)MCD_varTab0, /* Task 0 Variable Table */ ++ (u32)MCD_funcDescTab0, /* Task 0 Function Descriptor Table & Flags */ ++ 0x00000000, ++ 0x00000000, ++ (u32)MCD_contextSave0, /* Task 0 context save space */ ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ (u32)MCD_varTab1, /* Task 1 Variable Table */ ++#ifdef MCD_INCLUDE_EU ++ (u32)MCD_funcDescTab1, /* Task 1 Function Descriptor Table & Flags */ ++#else ++ (u32)MCD_funcDescTab0, /* Task 0 Function Descriptor Table & Flags */ ++#endif ++ 0x00000000, ++ 0x00000000, ++ (u32)MCD_contextSave1, /* Task 1 context save space */ ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ (u32)MCD_varTab2, /* Task 2 Variable Table */ ++#ifdef MCD_INCLUDE_EU ++ (u32)MCD_funcDescTab2, /* Task 2 Function Descriptor Table & Flags */ ++#else ++ (u32)MCD_funcDescTab0, /* Task 0 Function Descriptor Table & Flags */ ++#endif ++ 0x00000000, ++ 0x00000000, ++ (u32)MCD_contextSave2, /* Task 2 context save space */ ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ (u32)MCD_varTab3, /* Task 3 Variable Table */ ++#ifdef MCD_INCLUDE_EU ++ (u32)MCD_funcDescTab3, /* Task 3 Function Descriptor Table & Flags */ ++#else ++ (u32)MCD_funcDescTab0, /* Task 0 Function Descriptor Table & Flags */ ++#endif ++ 0x00000000, ++ 0x00000000, ++ (u32)MCD_contextSave3, /* Task 3 context save space */ ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ (u32)MCD_varTab4, /* Task 4 Variable Table */ ++#ifdef MCD_INCLUDE_EU ++ (u32)MCD_funcDescTab4, /* Task 4 Function Descriptor Table & Flags */ ++#else ++ (u32)MCD_funcDescTab0, /* Task 0 Function Descriptor Table & Flags */ ++#endif ++ 0x00000000, ++ 0x00000000, ++ (u32)MCD_contextSave4, /* Task 4 context save space */ ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ (u32)MCD_varTab5, /* Task 5 Variable Table */ ++#ifdef MCD_INCLUDE_EU ++ (u32)MCD_funcDescTab5, /* Task 5 Function Descriptor Table & Flags */ ++#else ++ (u32)MCD_funcDescTab0, /* Task 0 Function Descriptor Table & Flags */ ++#endif ++ 0x00000000, ++ 0x00000000, ++ (u32)MCD_contextSave5, /* Task 5 context save space */ ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ (u32)MCD_varTab6, /* Task 6 Variable Table */ ++#ifdef MCD_INCLUDE_EU ++ (u32)MCD_funcDescTab6, /* Task 6 Function Descriptor Table & Flags */ ++#else ++ (u32)MCD_funcDescTab0, /* Task 0 Function Descriptor Table & Flags */ ++#endif ++ 0x00000000, ++ 0x00000000, ++ (u32)MCD_contextSave6, /* Task 6 context save space */ ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ (u32)MCD_varTab7, /* Task 7 Variable Table */ ++#ifdef MCD_INCLUDE_EU ++ (u32)MCD_funcDescTab7, /* Task 7 Function Descriptor Table & Flags */ ++#else ++ (u32)MCD_funcDescTab0, /* Task 0 Function Descriptor Table & Flags */ ++#endif ++ 0x00000000, ++ 0x00000000, ++ (u32)MCD_contextSave7, /* Task 7 context save space */ ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ (u32)MCD_varTab8, /* Task 8 Variable Table */ ++#ifdef MCD_INCLUDE_EU ++ (u32)MCD_funcDescTab8, /* Task 8 Function Descriptor Table & Flags */ ++#else ++ (u32)MCD_funcDescTab0, /* Task 0 Function Descriptor Table & Flags */ ++#endif ++ 0x00000000, ++ 0x00000000, ++ (u32)MCD_contextSave8, /* Task 8 context save space */ ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ (u32)MCD_varTab9, /* Task 9 Variable Table */ ++#ifdef MCD_INCLUDE_EU ++ (u32)MCD_funcDescTab9, /* Task 9 Function Descriptor Table & Flags */ ++#else ++ (u32)MCD_funcDescTab0, /* Task 0 Function Descriptor Table & Flags */ ++#endif ++ 0x00000000, ++ 0x00000000, ++ (u32)MCD_contextSave9, /* Task 9 context save space */ ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ (u32)MCD_varTab10, /* Task 10 Variable Table */ ++#ifdef MCD_INCLUDE_EU ++ (u32)MCD_funcDescTab10, /* Task 10 Function Descriptor Table & Flags */ ++#else ++ (u32)MCD_funcDescTab0, /* Task 0 Function Descriptor Table & Flags */ ++#endif ++ 0x00000000, ++ 0x00000000, ++ (u32)MCD_contextSave10, /* Task 10 context save space */ ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ (u32)MCD_varTab11, /* Task 11 Variable Table */ ++#ifdef MCD_INCLUDE_EU ++ (u32)MCD_funcDescTab11, /* Task 11 Function Descriptor Table & Flags */ ++#else ++ (u32)MCD_funcDescTab0, /* Task 0 Function Descriptor Table & Flags */ ++#endif ++ 0x00000000, ++ 0x00000000, ++ (u32)MCD_contextSave11, /* Task 11 context save space */ ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ (u32)MCD_varTab12, /* Task 12 Variable Table */ ++#ifdef MCD_INCLUDE_EU ++ (u32)MCD_funcDescTab12, /* Task 12 Function Descriptor Table & Flags */ ++#else ++ (u32)MCD_funcDescTab0, /* Task 0 Function Descriptor Table & Flags */ ++#endif ++ 0x00000000, ++ 0x00000000, ++ (u32)MCD_contextSave12, /* Task 12 context save space */ ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ (u32)MCD_varTab13, /* Task 13 Variable Table */ ++#ifdef MCD_INCLUDE_EU ++ (u32)MCD_funcDescTab13, /* Task 13 Function Descriptor Table & Flags */ ++#else ++ (u32)MCD_funcDescTab0, /* Task 0 Function Descriptor Table & Flags */ ++#endif ++ 0x00000000, ++ 0x00000000, ++ (u32)MCD_contextSave13, /* Task 13 context save space */ ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ (u32)MCD_varTab14, /* Task 14 Variable Table */ ++#ifdef MCD_INCLUDE_EU ++ (u32)MCD_funcDescTab14, /* Task 14 Function Descriptor Table & Flags */ ++#else ++ (u32)MCD_funcDescTab0, /* Task 0 Function Descriptor Table & Flags */ ++#endif ++ 0x00000000, ++ 0x00000000, ++ (u32)MCD_contextSave14, /* Task 14 context save space */ ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ (u32)MCD_varTab15, /* Task 15 Variable Table */ ++#ifdef MCD_INCLUDE_EU ++ (u32)MCD_funcDescTab15, /* Task 15 Function Descriptor Table & Flags */ ++#else ++ (u32)MCD_funcDescTab0, /* Task 0 Function Descriptor Table & Flags */ ++#endif ++ 0x00000000, ++ 0x00000000, ++ (u32)MCD_contextSave15, /* Task 15 context save space */ ++ 0x00000000, ++}; ++ ++ ++u32 MCD_varTab0[] = ++{ /* Task 0 Variable Table */ ++ 0x00000000, /* var[0] */ ++ 0x00000000, /* var[1] */ ++ 0x00000000, /* var[2] */ ++ 0x00000000, /* var[3] */ ++ 0x00000000, /* var[4] */ ++ 0x00000000, /* var[5] */ ++ 0x00000000, /* var[6] */ ++ 0x00000000, /* var[7] */ ++ 0x00000000, /* var[8] */ ++ 0x00000000, /* var[9] */ ++ 0x00000000, /* var[10] */ ++ 0x00000000, /* var[11] */ ++ 0x00000000, /* var[12] */ ++ 0x00000000, /* var[13] */ ++ 0x00000000, /* var[14] */ ++ 0x00000000, /* var[15] */ ++ 0x00000000, /* var[16] */ ++ 0x00000000, /* var[17] */ ++ 0x00000000, /* var[18] */ ++ 0x00000000, /* var[19] */ ++ 0x00000000, /* var[20] */ ++ 0x00000000, /* var[21] */ ++ 0x00000000, /* var[22] */ ++ 0x00000000, /* var[23] */ ++ 0xe0000000, /* inc[0] */ ++ 0x20000000, /* inc[1] */ ++ 0x2000ffff, /* inc[2] */ ++ 0x00000000, /* inc[3] */ ++ 0x00000000, /* inc[4] */ ++ 0x00000000, /* inc[5] */ ++ 0x00000000, /* inc[6] */ ++ 0x00000000, /* inc[7] */ ++}; ++ ++ ++u32 MCD_varTab1[] = ++{ /* Task 1 Variable Table */ ++ 0x00000000, /* var[0] */ ++ 0x00000000, /* var[1] */ ++ 0x00000000, /* var[2] */ ++ 0x00000000, /* var[3] */ ++ 0x00000000, /* var[4] */ ++ 0x00000000, /* var[5] */ ++ 0x00000000, /* var[6] */ ++ 0x00000000, /* var[7] */ ++ 0x00000000, /* var[8] */ ++ 0x00000000, /* var[9] */ ++ 0x00000000, /* var[10] */ ++ 0x00000000, /* var[11] */ ++ 0x00000000, /* var[12] */ ++ 0x00000000, /* var[13] */ ++ 0x00000000, /* var[14] */ ++ 0x00000000, /* var[15] */ ++ 0x00000000, /* var[16] */ ++ 0x00000000, /* var[17] */ ++ 0x00000000, /* var[18] */ ++ 0x00000000, /* var[19] */ ++ 0x00000000, /* var[20] */ ++ 0x00000000, /* var[21] */ ++ 0x00000000, /* var[22] */ ++ 0x00000000, /* var[23] */ ++ 0xe0000000, /* inc[0] */ ++ 0x20000000, /* inc[1] */ ++ 0x2000ffff, /* inc[2] */ ++ 0x00000000, /* inc[3] */ ++ 0x00000000, /* inc[4] */ ++ 0x00000000, /* inc[5] */ ++ 0x00000000, /* inc[6] */ ++ 0x00000000, /* inc[7] */ ++}; ++ ++u32 MCD_varTab2[]= ++{ /* Task 2 Variable Table */ ++ 0x00000000, /* var[0] */ ++ 0x00000000, /* var[1] */ ++ 0x00000000, /* var[2] */ ++ 0x00000000, /* var[3] */ ++ 0x00000000, /* var[4] */ ++ 0x00000000, /* var[5] */ ++ 0x00000000, /* var[6] */ ++ 0x00000000, /* var[7] */ ++ 0x00000000, /* var[8] */ ++ 0x00000000, /* var[9] */ ++ 0x00000000, /* var[10] */ ++ 0x00000000, /* var[11] */ ++ 0x00000000, /* var[12] */ ++ 0x00000000, /* var[13] */ ++ 0x00000000, /* var[14] */ ++ 0x00000000, /* var[15] */ ++ 0x00000000, /* var[16] */ ++ 0x00000000, /* var[17] */ ++ 0x00000000, /* var[18] */ ++ 0x00000000, /* var[19] */ ++ 0x00000000, /* var[20] */ ++ 0x00000000, /* var[21] */ ++ 0x00000000, /* var[22] */ ++ 0x00000000, /* var[23] */ ++ 0xe0000000, /* inc[0] */ ++ 0x20000000, /* inc[1] */ ++ 0x2000ffff, /* inc[2] */ ++ 0x00000000, /* inc[3] */ ++ 0x00000000, /* inc[4] */ ++ 0x00000000, /* inc[5] */ ++ 0x00000000, /* inc[6] */ ++ 0x00000000, /* inc[7] */ ++}; ++ ++u32 MCD_varTab3[]= ++{ /* Task 3 Variable Table */ ++ 0x00000000, /* var[0] */ ++ 0x00000000, /* var[1] */ ++ 0x00000000, /* var[2] */ ++ 0x00000000, /* var[3] */ ++ 0x00000000, /* var[4] */ ++ 0x00000000, /* var[5] */ ++ 0x00000000, /* var[6] */ ++ 0x00000000, /* var[7] */ ++ 0x00000000, /* var[8] */ ++ 0x00000000, /* var[9] */ ++ 0x00000000, /* var[10] */ ++ 0x00000000, /* var[11] */ ++ 0x00000000, /* var[12] */ ++ 0x00000000, /* var[13] */ ++ 0x00000000, /* var[14] */ ++ 0x00000000, /* var[15] */ ++ 0x00000000, /* var[16] */ ++ 0x00000000, /* var[17] */ ++ 0x00000000, /* var[18] */ ++ 0x00000000, /* var[19] */ ++ 0x00000000, /* var[20] */ ++ 0x00000000, /* var[21] */ ++ 0x00000000, /* var[22] */ ++ 0x00000000, /* var[23] */ ++ 0xe0000000, /* inc[0] */ ++ 0x20000000, /* inc[1] */ ++ 0x2000ffff, /* inc[2] */ ++ 0x00000000, /* inc[3] */ ++ 0x00000000, /* inc[4] */ ++ 0x00000000, /* inc[5] */ ++ 0x00000000, /* inc[6] */ ++ 0x00000000, /* inc[7] */ ++}; ++ ++u32 MCD_varTab4[]= ++{ /* Task 4 Variable Table */ ++ 0x00000000, /* var[0] */ ++ 0x00000000, /* var[1] */ ++ 0x00000000, /* var[2] */ ++ 0x00000000, /* var[3] */ ++ 0x00000000, /* var[4] */ ++ 0x00000000, /* var[5] */ ++ 0x00000000, /* var[6] */ ++ 0x00000000, /* var[7] */ ++ 0x00000000, /* var[8] */ ++ 0x00000000, /* var[9] */ ++ 0x00000000, /* var[10] */ ++ 0x00000000, /* var[11] */ ++ 0x00000000, /* var[12] */ ++ 0x00000000, /* var[13] */ ++ 0x00000000, /* var[14] */ ++ 0x00000000, /* var[15] */ ++ 0x00000000, /* var[16] */ ++ 0x00000000, /* var[17] */ ++ 0x00000000, /* var[18] */ ++ 0x00000000, /* var[19] */ ++ 0x00000000, /* var[20] */ ++ 0x00000000, /* var[21] */ ++ 0x00000000, /* var[22] */ ++ 0x00000000, /* var[23] */ ++ 0xe0000000, /* inc[0] */ ++ 0x20000000, /* inc[1] */ ++ 0x2000ffff, /* inc[2] */ ++ 0x00000000, /* inc[3] */ ++ 0x00000000, /* inc[4] */ ++ 0x00000000, /* inc[5] */ ++ 0x00000000, /* inc[6] */ ++ 0x00000000, /* inc[7] */ ++}; ++ ++u32 MCD_varTab5[]= ++{ /* Task 5 Variable Table */ ++ 0x00000000, /* var[0] */ ++ 0x00000000, /* var[1] */ ++ 0x00000000, /* var[2] */ ++ 0x00000000, /* var[3] */ ++ 0x00000000, /* var[4] */ ++ 0x00000000, /* var[5] */ ++ 0x00000000, /* var[6] */ ++ 0x00000000, /* var[7] */ ++ 0x00000000, /* var[8] */ ++ 0x00000000, /* var[9] */ ++ 0x00000000, /* var[10] */ ++ 0x00000000, /* var[11] */ ++ 0x00000000, /* var[12] */ ++ 0x00000000, /* var[13] */ ++ 0x00000000, /* var[14] */ ++ 0x00000000, /* var[15] */ ++ 0x00000000, /* var[16] */ ++ 0x00000000, /* var[17] */ ++ 0x00000000, /* var[18] */ ++ 0x00000000, /* var[19] */ ++ 0x00000000, /* var[20] */ ++ 0x00000000, /* var[21] */ ++ 0x00000000, /* var[22] */ ++ 0x00000000, /* var[23] */ ++ 0xe0000000, /* inc[0] */ ++ 0x20000000, /* inc[1] */ ++ 0x2000ffff, /* inc[2] */ ++ 0x00000000, /* inc[3] */ ++ 0x00000000, /* inc[4] */ ++ 0x00000000, /* inc[5] */ ++ 0x00000000, /* inc[6] */ ++ 0x00000000, /* inc[7] */ ++}; ++ ++u32 MCD_varTab6[]= ++{ /* Task 6 Variable Table */ ++ 0x00000000, /* var[0] */ ++ 0x00000000, /* var[1] */ ++ 0x00000000, /* var[2] */ ++ 0x00000000, /* var[3] */ ++ 0x00000000, /* var[4] */ ++ 0x00000000, /* var[5] */ ++ 0x00000000, /* var[6] */ ++ 0x00000000, /* var[7] */ ++ 0x00000000, /* var[8] */ ++ 0x00000000, /* var[9] */ ++ 0x00000000, /* var[10] */ ++ 0x00000000, /* var[11] */ ++ 0x00000000, /* var[12] */ ++ 0x00000000, /* var[13] */ ++ 0x00000000, /* var[14] */ ++ 0x00000000, /* var[15] */ ++ 0x00000000, /* var[16] */ ++ 0x00000000, /* var[17] */ ++ 0x00000000, /* var[18] */ ++ 0x00000000, /* var[19] */ ++ 0x00000000, /* var[20] */ ++ 0x00000000, /* var[21] */ ++ 0x00000000, /* var[22] */ ++ 0x00000000, /* var[23] */ ++ 0xe0000000, /* inc[0] */ ++ 0x20000000, /* inc[1] */ ++ 0x2000ffff, /* inc[2] */ ++ 0x00000000, /* inc[3] */ ++ 0x00000000, /* inc[4] */ ++ 0x00000000, /* inc[5] */ ++ 0x00000000, /* inc[6] */ ++ 0x00000000, /* inc[7] */ ++}; ++ ++u32 MCD_varTab7[]= ++{ /* Task 7 Variable Table */ ++ 0x00000000, /* var[0] */ ++ 0x00000000, /* var[1] */ ++ 0x00000000, /* var[2] */ ++ 0x00000000, /* var[3] */ ++ 0x00000000, /* var[4] */ ++ 0x00000000, /* var[5] */ ++ 0x00000000, /* var[6] */ ++ 0x00000000, /* var[7] */ ++ 0x00000000, /* var[8] */ ++ 0x00000000, /* var[9] */ ++ 0x00000000, /* var[10] */ ++ 0x00000000, /* var[11] */ ++ 0x00000000, /* var[12] */ ++ 0x00000000, /* var[13] */ ++ 0x00000000, /* var[14] */ ++ 0x00000000, /* var[15] */ ++ 0x00000000, /* var[16] */ ++ 0x00000000, /* var[17] */ ++ 0x00000000, /* var[18] */ ++ 0x00000000, /* var[19] */ ++ 0x00000000, /* var[20] */ ++ 0x00000000, /* var[21] */ ++ 0x00000000, /* var[22] */ ++ 0x00000000, /* var[23] */ ++ 0xe0000000, /* inc[0] */ ++ 0x20000000, /* inc[1] */ ++ 0x2000ffff, /* inc[2] */ ++ 0x00000000, /* inc[3] */ ++ 0x00000000, /* inc[4] */ ++ 0x00000000, /* inc[5] */ ++ 0x00000000, /* inc[6] */ ++ 0x00000000, /* inc[7] */ ++}; ++ ++u32 MCD_varTab8[]= ++{ /* Task 8 Variable Table */ ++ 0x00000000, /* var[0] */ ++ 0x00000000, /* var[1] */ ++ 0x00000000, /* var[2] */ ++ 0x00000000, /* var[3] */ ++ 0x00000000, /* var[4] */ ++ 0x00000000, /* var[5] */ ++ 0x00000000, /* var[6] */ ++ 0x00000000, /* var[7] */ ++ 0x00000000, /* var[8] */ ++ 0x00000000, /* var[9] */ ++ 0x00000000, /* var[10] */ ++ 0x00000000, /* var[11] */ ++ 0x00000000, /* var[12] */ ++ 0x00000000, /* var[13] */ ++ 0x00000000, /* var[14] */ ++ 0x00000000, /* var[15] */ ++ 0x00000000, /* var[16] */ ++ 0x00000000, /* var[17] */ ++ 0x00000000, /* var[18] */ ++ 0x00000000, /* var[19] */ ++ 0x00000000, /* var[20] */ ++ 0x00000000, /* var[21] */ ++ 0x00000000, /* var[22] */ ++ 0x00000000, /* var[23] */ ++ 0xe0000000, /* inc[0] */ ++ 0x20000000, /* inc[1] */ ++ 0x2000ffff, /* inc[2] */ ++ 0x00000000, /* inc[3] */ ++ 0x00000000, /* inc[4] */ ++ 0x00000000, /* inc[5] */ ++ 0x00000000, /* inc[6] */ ++ 0x00000000, /* inc[7] */ ++}; ++ ++u32 MCD_varTab9[]= ++{ /* Task 9 Variable Table */ ++ 0x00000000, /* var[0] */ ++ 0x00000000, /* var[1] */ ++ 0x00000000, /* var[2] */ ++ 0x00000000, /* var[3] */ ++ 0x00000000, /* var[4] */ ++ 0x00000000, /* var[5] */ ++ 0x00000000, /* var[6] */ ++ 0x00000000, /* var[7] */ ++ 0x00000000, /* var[8] */ ++ 0x00000000, /* var[9] */ ++ 0x00000000, /* var[10] */ ++ 0x00000000, /* var[11] */ ++ 0x00000000, /* var[12] */ ++ 0x00000000, /* var[13] */ ++ 0x00000000, /* var[14] */ ++ 0x00000000, /* var[15] */ ++ 0x00000000, /* var[16] */ ++ 0x00000000, /* var[17] */ ++ 0x00000000, /* var[18] */ ++ 0x00000000, /* var[19] */ ++ 0x00000000, /* var[20] */ ++ 0x00000000, /* var[21] */ ++ 0x00000000, /* var[22] */ ++ 0x00000000, /* var[23] */ ++ 0xe0000000, /* inc[0] */ ++ 0x20000000, /* inc[1] */ ++ 0x2000ffff, /* inc[2] */ ++ 0x00000000, /* inc[3] */ ++ 0x00000000, /* inc[4] */ ++ 0x00000000, /* inc[5] */ ++ 0x00000000, /* inc[6] */ ++ 0x00000000, /* inc[7] */ ++}; ++ ++u32 MCD_varTab10[]= ++{ /* Task 10 Variable Table */ ++ 0x00000000, /* var[0] */ ++ 0x00000000, /* var[1] */ ++ 0x00000000, /* var[2] */ ++ 0x00000000, /* var[3] */ ++ 0x00000000, /* var[4] */ ++ 0x00000000, /* var[5] */ ++ 0x00000000, /* var[6] */ ++ 0x00000000, /* var[7] */ ++ 0x00000000, /* var[8] */ ++ 0x00000000, /* var[9] */ ++ 0x00000000, /* var[10] */ ++ 0x00000000, /* var[11] */ ++ 0x00000000, /* var[12] */ ++ 0x00000000, /* var[13] */ ++ 0x00000000, /* var[14] */ ++ 0x00000000, /* var[15] */ ++ 0x00000000, /* var[16] */ ++ 0x00000000, /* var[17] */ ++ 0x00000000, /* var[18] */ ++ 0x00000000, /* var[19] */ ++ 0x00000000, /* var[20] */ ++ 0x00000000, /* var[21] */ ++ 0x00000000, /* var[22] */ ++ 0x00000000, /* var[23] */ ++ 0xe0000000, /* inc[0] */ ++ 0x20000000, /* inc[1] */ ++ 0x2000ffff, /* inc[2] */ ++ 0x00000000, /* inc[3] */ ++ 0x00000000, /* inc[4] */ ++ 0x00000000, /* inc[5] */ ++ 0x00000000, /* inc[6] */ ++ 0x00000000, /* inc[7] */ ++}; ++ ++u32 MCD_varTab11[]= ++{ /* Task 11 Variable Table */ ++ 0x00000000, /* var[0] */ ++ 0x00000000, /* var[1] */ ++ 0x00000000, /* var[2] */ ++ 0x00000000, /* var[3] */ ++ 0x00000000, /* var[4] */ ++ 0x00000000, /* var[5] */ ++ 0x00000000, /* var[6] */ ++ 0x00000000, /* var[7] */ ++ 0x00000000, /* var[8] */ ++ 0x00000000, /* var[9] */ ++ 0x00000000, /* var[10] */ ++ 0x00000000, /* var[11] */ ++ 0x00000000, /* var[12] */ ++ 0x00000000, /* var[13] */ ++ 0x00000000, /* var[14] */ ++ 0x00000000, /* var[15] */ ++ 0x00000000, /* var[16] */ ++ 0x00000000, /* var[17] */ ++ 0x00000000, /* var[18] */ ++ 0x00000000, /* var[19] */ ++ 0x00000000, /* var[20] */ ++ 0x00000000, /* var[21] */ ++ 0x00000000, /* var[22] */ ++ 0x00000000, /* var[23] */ ++ 0xe0000000, /* inc[0] */ ++ 0x20000000, /* inc[1] */ ++ 0x2000ffff, /* inc[2] */ ++ 0x00000000, /* inc[3] */ ++ 0x00000000, /* inc[4] */ ++ 0x00000000, /* inc[5] */ ++ 0x00000000, /* inc[6] */ ++ 0x00000000, /* inc[7] */ ++}; ++ ++u32 MCD_varTab12[]= ++{ /* Task 12 Variable Table */ ++ 0x00000000, /* var[0] */ ++ 0x00000000, /* var[1] */ ++ 0x00000000, /* var[2] */ ++ 0x00000000, /* var[3] */ ++ 0x00000000, /* var[4] */ ++ 0x00000000, /* var[5] */ ++ 0x00000000, /* var[6] */ ++ 0x00000000, /* var[7] */ ++ 0x00000000, /* var[8] */ ++ 0x00000000, /* var[9] */ ++ 0x00000000, /* var[10] */ ++ 0x00000000, /* var[11] */ ++ 0x00000000, /* var[12] */ ++ 0x00000000, /* var[13] */ ++ 0x00000000, /* var[14] */ ++ 0x00000000, /* var[15] */ ++ 0x00000000, /* var[16] */ ++ 0x00000000, /* var[17] */ ++ 0x00000000, /* var[18] */ ++ 0x00000000, /* var[19] */ ++ 0x00000000, /* var[20] */ ++ 0x00000000, /* var[21] */ ++ 0x00000000, /* var[22] */ ++ 0x00000000, /* var[23] */ ++ 0xe0000000, /* inc[0] */ ++ 0x20000000, /* inc[1] */ ++ 0x2000ffff, /* inc[2] */ ++ 0x00000000, /* inc[3] */ ++ 0x00000000, /* inc[4] */ ++ 0x00000000, /* inc[5] */ ++ 0x00000000, /* inc[6] */ ++ 0x00000000, /* inc[7] */ ++}; ++ ++u32 MCD_varTab13[]= ++{ /* Task 13 Variable Table */ ++ 0x00000000, /* var[0] */ ++ 0x00000000, /* var[1] */ ++ 0x00000000, /* var[2] */ ++ 0x00000000, /* var[3] */ ++ 0x00000000, /* var[4] */ ++ 0x00000000, /* var[5] */ ++ 0x00000000, /* var[6] */ ++ 0x00000000, /* var[7] */ ++ 0x00000000, /* var[8] */ ++ 0x00000000, /* var[9] */ ++ 0x00000000, /* var[10] */ ++ 0x00000000, /* var[11] */ ++ 0x00000000, /* var[12] */ ++ 0x00000000, /* var[13] */ ++ 0x00000000, /* var[14] */ ++ 0x00000000, /* var[15] */ ++ 0x00000000, /* var[16] */ ++ 0x00000000, /* var[17] */ ++ 0x00000000, /* var[18] */ ++ 0x00000000, /* var[19] */ ++ 0x00000000, /* var[20] */ ++ 0x00000000, /* var[21] */ ++ 0x00000000, /* var[22] */ ++ 0x00000000, /* var[23] */ ++ 0xe0000000, /* inc[0] */ ++ 0x20000000, /* inc[1] */ ++ 0x2000ffff, /* inc[2] */ ++ 0x00000000, /* inc[3] */ ++ 0x00000000, /* inc[4] */ ++ 0x00000000, /* inc[5] */ ++ 0x00000000, /* inc[6] */ ++ 0x00000000, /* inc[7] */ ++}; ++ ++u32 MCD_varTab14[]= ++{ /* Task 14 Variable Table */ ++ 0x00000000, /* var[0] */ ++ 0x00000000, /* var[1] */ ++ 0x00000000, /* var[2] */ ++ 0x00000000, /* var[3] */ ++ 0x00000000, /* var[4] */ ++ 0x00000000, /* var[5] */ ++ 0x00000000, /* var[6] */ ++ 0x00000000, /* var[7] */ ++ 0x00000000, /* var[8] */ ++ 0x00000000, /* var[9] */ ++ 0x00000000, /* var[10] */ ++ 0x00000000, /* var[11] */ ++ 0x00000000, /* var[12] */ ++ 0x00000000, /* var[13] */ ++ 0x00000000, /* var[14] */ ++ 0x00000000, /* var[15] */ ++ 0x00000000, /* var[16] */ ++ 0x00000000, /* var[17] */ ++ 0x00000000, /* var[18] */ ++ 0x00000000, /* var[19] */ ++ 0x00000000, /* var[20] */ ++ 0x00000000, /* var[21] */ ++ 0x00000000, /* var[22] */ ++ 0x00000000, /* var[23] */ ++ 0xe0000000, /* inc[0] */ ++ 0x20000000, /* inc[1] */ ++ 0x2000ffff, /* inc[2] */ ++ 0x00000000, /* inc[3] */ ++ 0x00000000, /* inc[4] */ ++ 0x00000000, /* inc[5] */ ++ 0x00000000, /* inc[6] */ ++ 0x00000000, /* inc[7] */ ++}; ++ ++u32 MCD_varTab15[]= ++{ /* Task 15 Variable Table */ ++ 0x00000000, /* var[0] */ ++ 0x00000000, /* var[1] */ ++ 0x00000000, /* var[2] */ ++ 0x00000000, /* var[3] */ ++ 0x00000000, /* var[4] */ ++ 0x00000000, /* var[5] */ ++ 0x00000000, /* var[6] */ ++ 0x00000000, /* var[7] */ ++ 0x00000000, /* var[8] */ ++ 0x00000000, /* var[9] */ ++ 0x00000000, /* var[10] */ ++ 0x00000000, /* var[11] */ ++ 0x00000000, /* var[12] */ ++ 0x00000000, /* var[13] */ ++ 0x00000000, /* var[14] */ ++ 0x00000000, /* var[15] */ ++ 0x00000000, /* var[16] */ ++ 0x00000000, /* var[17] */ ++ 0x00000000, /* var[18] */ ++ 0x00000000, /* var[19] */ ++ 0x00000000, /* var[20] */ ++ 0x00000000, /* var[21] */ ++ 0x00000000, /* var[22] */ ++ 0x00000000, /* var[23] */ ++ 0xe0000000, /* inc[0] */ ++ 0x20000000, /* inc[1] */ ++ 0x2000ffff, /* inc[2] */ ++ 0x00000000, /* inc[3] */ ++ 0x00000000, /* inc[4] */ ++ 0x00000000, /* inc[5] */ ++ 0x00000000, /* inc[6] */ ++ 0x00000000, /* inc[7] */ ++}; ++ ++u32 MCD_funcDescTab0[]= ++{ /* Task 0 Function Descriptor Table */ ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0xa0045670, /* mainFunc(), EU# 3 */ ++ 0xa0000000, /* rsduFunc(), EU# 3 */ ++ 0xa0000000, /* crcAccumVal(), EU# 3 */ ++ 0x20000000, /* setCrcAccum(), EU# 3 */ ++ 0x21800000, /* and(), EU# 3 */ ++ 0x21e00000, /* or(), EU# 3 */ ++ 0x20400000, /* add(), EU# 3 */ ++ 0x20500000, /* sub(), EU# 3 */ ++ 0x205a0000, /* andNot(), EU# 3 */ ++ 0x202fa000, /* andReadyBit(), EU# 3 */ ++ 0x202f9000, /* andNotReadyBit(), EU# 3 */ ++ 0x202ea000, /* andWrapBit(), EU# 3 */ ++ 0x202da000, /* andEndFrameBit(), EU# 3 */ ++ 0x202e2000, /* andInterruptBit(), EU# 3 */ ++ 0x202f2000, /* andLoopBit(), EU# 3 */ ++ 0x2020a000, /* andCrcRestartBit(), EU# 3 */ ++}; ++ ++#ifdef MCD_INCLUDE_EU ++u32 MCD_funcDescTab1[]= ++{ /* Task 1 Function Descriptor Table */ ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0xa0045670, /* mainFunc(), EU# 3 */ ++ 0xa0000000, /* rsduFunc(), EU# 3 */ ++ 0xa0000000, /* crcAccumVal(), EU# 3 */ ++ 0x20000000, /* setCrcAccum(), EU# 3 */ ++ 0x21800000, /* and(), EU# 3 */ ++ 0x21e00000, /* or(), EU# 3 */ ++ 0x20400000, /* add(), EU# 3 */ ++ 0x20500000, /* sub(), EU# 3 */ ++ 0x205a0000, /* andNot(), EU# 3 */ ++ 0x202fa000, /* andReadyBit(), EU# 3 */ ++ 0x202f9000, /* andNotReadyBit(), EU# 3 */ ++ 0x202ea000, /* andWrapBit(), EU# 3 */ ++ 0x202da000, /* andEndFrameBit(), EU# 3 */ ++ 0x202e2000, /* andInterruptBit(), EU# 3 */ ++ 0x202f2000, /* andLoopBit(), EU# 3 */ ++ 0x2020a000, /* andCrcRestartBit(), EU# 3 */ ++}; ++ ++u32 MCD_funcDescTab2[]= ++{ /* Task 2 Function Descriptor Table */ ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0xa0045670, /* mainFunc(), EU# 3 */ ++ 0xa0000000, /* rsduFunc(), EU# 3 */ ++ 0xa0000000, /* crcAccumVal(), EU# 3 */ ++ 0x20000000, /* setCrcAccum(), EU# 3 */ ++ 0x21800000, /* and(), EU# 3 */ ++ 0x21e00000, /* or(), EU# 3 */ ++ 0x20400000, /* add(), EU# 3 */ ++ 0x20500000, /* sub(), EU# 3 */ ++ 0x205a0000, /* andNot(), EU# 3 */ ++ 0x202fa000, /* andReadyBit(), EU# 3 */ ++ 0x202f9000, /* andNotReadyBit(), EU# 3 */ ++ 0x202ea000, /* andWrapBit(), EU# 3 */ ++ 0x202da000, /* andEndFrameBit(), EU# 3 */ ++ 0x202e2000, /* andInterruptBit(), EU# 3 */ ++ 0x202f2000, /* andLoopBit(), EU# 3 */ ++ 0x2020a000, /* andCrcRestartBit(), EU# 3 */ ++}; ++ ++u32 MCD_funcDescTab3[]= ++{ /* Task 3 Function Descriptor Table */ ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0xa0045670, /* mainFunc(), EU# 3 */ ++ 0xa0000000, /* rsduFunc(), EU# 3 */ ++ 0xa0000000, /* crcAccumVal(), EU# 3 */ ++ 0x20000000, /* setCrcAccum(), EU# 3 */ ++ 0x21800000, /* and(), EU# 3 */ ++ 0x21e00000, /* or(), EU# 3 */ ++ 0x20400000, /* add(), EU# 3 */ ++ 0x20500000, /* sub(), EU# 3 */ ++ 0x205a0000, /* andNot(), EU# 3 */ ++ 0x202fa000, /* andReadyBit(), EU# 3 */ ++ 0x202f9000, /* andNotReadyBit(), EU# 3 */ ++ 0x202ea000, /* andWrapBit(), EU# 3 */ ++ 0x202da000, /* andEndFrameBit(), EU# 3 */ ++ 0x202e2000, /* andInterruptBit(), EU# 3 */ ++ 0x202f2000, /* andLoopBit(), EU# 3 */ ++ 0x2020a000, /* andCrcRestartBit(), EU# 3 */ ++}; ++ ++u32 MCD_funcDescTab4[]= ++{ /* Task 4 Function Descriptor Table */ ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0xa0045670, /* mainFunc(), EU# 3 */ ++ 0xa0000000, /* rsduFunc(), EU# 3 */ ++ 0xa0000000, /* crcAccumVal(), EU# 3 */ ++ 0x20000000, /* setCrcAccum(), EU# 3 */ ++ 0x21800000, /* and(), EU# 3 */ ++ 0x21e00000, /* or(), EU# 3 */ ++ 0x20400000, /* add(), EU# 3 */ ++ 0x20500000, /* sub(), EU# 3 */ ++ 0x205a0000, /* andNot(), EU# 3 */ ++ 0x202fa000, /* andReadyBit(), EU# 3 */ ++ 0x202f9000, /* andNotReadyBit(), EU# 3 */ ++ 0x202ea000, /* andWrapBit(), EU# 3 */ ++ 0x202da000, /* andEndFrameBit(), EU# 3 */ ++ 0x202e2000, /* andInterruptBit(), EU# 3 */ ++ 0x202f2000, /* andLoopBit(), EU# 3 */ ++ 0x2020a000, /* andCrcRestartBit(), EU# 3 */ ++}; ++ ++u32 MCD_funcDescTab5[]= ++{ /* Task 5 Function Descriptor Table */ ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0xa0045670, /* mainFunc(), EU# 3 */ ++ 0xa0000000, /* rsduFunc(), EU# 3 */ ++ 0xa0000000, /* crcAccumVal(), EU# 3 */ ++ 0x20000000, /* setCrcAccum(), EU# 3 */ ++ 0x21800000, /* and(), EU# 3 */ ++ 0x21e00000, /* or(), EU# 3 */ ++ 0x20400000, /* add(), EU# 3 */ ++ 0x20500000, /* sub(), EU# 3 */ ++ 0x205a0000, /* andNot(), EU# 3 */ ++ 0x202fa000, /* andReadyBit(), EU# 3 */ ++ 0x202f9000, /* andNotReadyBit(), EU# 3 */ ++ 0x202ea000, /* andWrapBit(), EU# 3 */ ++ 0x202da000, /* andEndFrameBit(), EU# 3 */ ++ 0x202e2000, /* andInterruptBit(), EU# 3 */ ++ 0x202f2000, /* andLoopBit(), EU# 3 */ ++ 0x2020a000, /* andCrcRestartBit(), EU# 3 */ ++}; ++ ++u32 MCD_funcDescTab6[]= ++{ /* Task 6 Function Descriptor Table */ ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0xa0045670, /* mainFunc(), EU# 3 */ ++ 0xa0000000, /* rsduFunc(), EU# 3 */ ++ 0xa0000000, /* crcAccumVal(), EU# 3 */ ++ 0x20000000, /* setCrcAccum(), EU# 3 */ ++ 0x21800000, /* and(), EU# 3 */ ++ 0x21e00000, /* or(), EU# 3 */ ++ 0x20400000, /* add(), EU# 3 */ ++ 0x20500000, /* sub(), EU# 3 */ ++ 0x205a0000, /* andNot(), EU# 3 */ ++ 0x202fa000, /* andReadyBit(), EU# 3 */ ++ 0x202f9000, /* andNotReadyBit(), EU# 3 */ ++ 0x202ea000, /* andWrapBit(), EU# 3 */ ++ 0x202da000, /* andEndFrameBit(), EU# 3 */ ++ 0x202e2000, /* andInterruptBit(), EU# 3 */ ++ 0x202f2000, /* andLoopBit(), EU# 3 */ ++ 0x2020a000, /* andCrcRestartBit(), EU# 3 */ ++}; ++ ++u32 MCD_funcDescTab7[]= ++{ /* Task 7 Function Descriptor Table */ ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0xa0045670, /* mainFunc(), EU# 3 */ ++ 0xa0000000, /* rsduFunc(), EU# 3 */ ++ 0xa0000000, /* crcAccumVal(), EU# 3 */ ++ 0x20000000, /* setCrcAccum(), EU# 3 */ ++ 0x21800000, /* and(), EU# 3 */ ++ 0x21e00000, /* or(), EU# 3 */ ++ 0x20400000, /* add(), EU# 3 */ ++ 0x20500000, /* sub(), EU# 3 */ ++ 0x205a0000, /* andNot(), EU# 3 */ ++ 0x202fa000, /* andReadyBit(), EU# 3 */ ++ 0x202f9000, /* andNotReadyBit(), EU# 3 */ ++ 0x202ea000, /* andWrapBit(), EU# 3 */ ++ 0x202da000, /* andEndFrameBit(), EU# 3 */ ++ 0x202e2000, /* andInterruptBit(), EU# 3 */ ++ 0x202f2000, /* andLoopBit(), EU# 3 */ ++ 0x2020a000, /* andCrcRestartBit(), EU# 3 */ ++}; ++ ++u32 MCD_funcDescTab8[]= ++{ /* Task 8 Function Descriptor Table */ ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0xa0045670, /* mainFunc(), EU# 3 */ ++ 0xa0000000, /* rsduFunc(), EU# 3 */ ++ 0xa0000000, /* crcAccumVal(), EU# 3 */ ++ 0x20000000, /* setCrcAccum(), EU# 3 */ ++ 0x21800000, /* and(), EU# 3 */ ++ 0x21e00000, /* or(), EU# 3 */ ++ 0x20400000, /* add(), EU# 3 */ ++ 0x20500000, /* sub(), EU# 3 */ ++ 0x205a0000, /* andNot(), EU# 3 */ ++ 0x202fa000, /* andReadyBit(), EU# 3 */ ++ 0x202f9000, /* andNotReadyBit(), EU# 3 */ ++ 0x202ea000, /* andWrapBit(), EU# 3 */ ++ 0x202da000, /* andEndFrameBit(), EU# 3 */ ++ 0x202e2000, /* andInterruptBit(), EU# 3 */ ++ 0x202f2000, /* andLoopBit(), EU# 3 */ ++ 0x2020a000, /* andCrcRestartBit(), EU# 3 */ ++}; ++ ++u32 MCD_funcDescTab9[]= ++{ /* Task 9 Function Descriptor Table */ ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0xa0045670, /* mainFunc(), EU# 3 */ ++ 0xa0000000, /* rsduFunc(), EU# 3 */ ++ 0xa0000000, /* crcAccumVal(), EU# 3 */ ++ 0x20000000, /* setCrcAccum(), EU# 3 */ ++ 0x21800000, /* and(), EU# 3 */ ++ 0x21e00000, /* or(), EU# 3 */ ++ 0x20400000, /* add(), EU# 3 */ ++ 0x20500000, /* sub(), EU# 3 */ ++ 0x205a0000, /* andNot(), EU# 3 */ ++ 0x202fa000, /* andReadyBit(), EU# 3 */ ++ 0x202f9000, /* andNotReadyBit(), EU# 3 */ ++ 0x202ea000, /* andWrapBit(), EU# 3 */ ++ 0x202da000, /* andEndFrameBit(), EU# 3 */ ++ 0x202e2000, /* andInterruptBit(), EU# 3 */ ++ 0x202f2000, /* andLoopBit(), EU# 3 */ ++ 0x2020a000, /* andCrcRestartBit(), EU# 3 */ ++}; ++ ++u32 MCD_funcDescTab10[]= ++{ /* Task 10 Function Descriptor Table */ ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0xa0045670, /* mainFunc(), EU# 3 */ ++ 0xa0000000, /* rsduFunc(), EU# 3 */ ++ 0xa0000000, /* crcAccumVal(), EU# 3 */ ++ 0x20000000, /* setCrcAccum(), EU# 3 */ ++ 0x21800000, /* and(), EU# 3 */ ++ 0x21e00000, /* or(), EU# 3 */ ++ 0x20400000, /* add(), EU# 3 */ ++ 0x20500000, /* sub(), EU# 3 */ ++ 0x205a0000, /* andNot(), EU# 3 */ ++ 0x202fa000, /* andReadyBit(), EU# 3 */ ++ 0x202f9000, /* andNotReadyBit(), EU# 3 */ ++ 0x202ea000, /* andWrapBit(), EU# 3 */ ++ 0x202da000, /* andEndFrameBit(), EU# 3 */ ++ 0x202e2000, /* andInterruptBit(), EU# 3 */ ++ 0x202f2000, /* andLoopBit(), EU# 3 */ ++ 0x2020a000, /* andCrcRestartBit(), EU# 3 */ ++}; ++ ++u32 MCD_funcDescTab11[]= ++{ /* Task 11 Function Descriptor Table */ ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0xa0045670, /* mainFunc(), EU# 3 */ ++ 0xa0000000, /* rsduFunc(), EU# 3 */ ++ 0xa0000000, /* crcAccumVal(), EU# 3 */ ++ 0x20000000, /* setCrcAccum(), EU# 3 */ ++ 0x21800000, /* and(), EU# 3 */ ++ 0x21e00000, /* or(), EU# 3 */ ++ 0x20400000, /* add(), EU# 3 */ ++ 0x20500000, /* sub(), EU# 3 */ ++ 0x205a0000, /* andNot(), EU# 3 */ ++ 0x202fa000, /* andReadyBit(), EU# 3 */ ++ 0x202f9000, /* andNotReadyBit(), EU# 3 */ ++ 0x202ea000, /* andWrapBit(), EU# 3 */ ++ 0x202da000, /* andEndFrameBit(), EU# 3 */ ++ 0x202e2000, /* andInterruptBit(), EU# 3 */ ++ 0x202f2000, /* andLoopBit(), EU# 3 */ ++ 0x2020a000, /* andCrcRestartBit(), EU# 3 */ ++}; ++ ++u32 MCD_funcDescTab12[]= ++{ /* Task 12 Function Descriptor Table */ ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0xa0045670, /* mainFunc(), EU# 3 */ ++ 0xa0000000, /* rsduFunc(), EU# 3 */ ++ 0xa0000000, /* crcAccumVal(), EU# 3 */ ++ 0x20000000, /* setCrcAccum(), EU# 3 */ ++ 0x21800000, /* and(), EU# 3 */ ++ 0x21e00000, /* or(), EU# 3 */ ++ 0x20400000, /* add(), EU# 3 */ ++ 0x20500000, /* sub(), EU# 3 */ ++ 0x205a0000, /* andNot(), EU# 3 */ ++ 0x202fa000, /* andReadyBit(), EU# 3 */ ++ 0x202f9000, /* andNotReadyBit(), EU# 3 */ ++ 0x202ea000, /* andWrapBit(), EU# 3 */ ++ 0x202da000, /* andEndFrameBit(), EU# 3 */ ++ 0x202e2000, /* andInterruptBit(), EU# 3 */ ++ 0x202f2000, /* andLoopBit(), EU# 3 */ ++ 0x2020a000, /* andCrcRestartBit(), EU# 3 */ ++}; ++ ++u32 MCD_funcDescTab13[]= ++{ /* Task 13 Function Descriptor Table */ ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0xa0045670, /* mainFunc(), EU# 3 */ ++ 0xa0000000, /* rsduFunc(), EU# 3 */ ++ 0xa0000000, /* crcAccumVal(), EU# 3 */ ++ 0x20000000, /* setCrcAccum(), EU# 3 */ ++ 0x21800000, /* and(), EU# 3 */ ++ 0x21e00000, /* or(), EU# 3 */ ++ 0x20400000, /* add(), EU# 3 */ ++ 0x20500000, /* sub(), EU# 3 */ ++ 0x205a0000, /* andNot(), EU# 3 */ ++ 0x202fa000, /* andReadyBit(), EU# 3 */ ++ 0x202f9000, /* andNotReadyBit(), EU# 3 */ ++ 0x202ea000, /* andWrapBit(), EU# 3 */ ++ 0x202da000, /* andEndFrameBit(), EU# 3 */ ++ 0x202e2000, /* andInterruptBit(), EU# 3 */ ++ 0x202f2000, /* andLoopBit(), EU# 3 */ ++ 0x2020a000, /* andCrcRestartBit(), EU# 3 */ ++}; ++ ++u32 MCD_funcDescTab14[]= ++{ /* Task 14 Function Descriptor Table */ ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0xa0045670, /* mainFunc(), EU# 3 */ ++ 0xa0000000, /* rsduFunc(), EU# 3 */ ++ 0xa0000000, /* crcAccumVal(), EU# 3 */ ++ 0x20000000, /* setCrcAccum(), EU# 3 */ ++ 0x21800000, /* and(), EU# 3 */ ++ 0x21e00000, /* or(), EU# 3 */ ++ 0x20400000, /* add(), EU# 3 */ ++ 0x20500000, /* sub(), EU# 3 */ ++ 0x205a0000, /* andNot(), EU# 3 */ ++ 0x202fa000, /* andReadyBit(), EU# 3 */ ++ 0x202f9000, /* andNotReadyBit(), EU# 3 */ ++ 0x202ea000, /* andWrapBit(), EU# 3 */ ++ 0x202da000, /* andEndFrameBit(), EU# 3 */ ++ 0x202e2000, /* andInterruptBit(), EU# 3 */ ++ 0x202f2000, /* andLoopBit(), EU# 3 */ ++ 0x2020a000, /* andCrcRestartBit(), EU# 3 */ ++}; ++ ++u32 MCD_funcDescTab15[]= ++{ /* Task 15 Function Descriptor Table */ ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0xa0045670, /* mainFunc(), EU# 3 */ ++ 0xa0000000, /* rsduFunc(), EU# 3 */ ++ 0xa0000000, /* crcAccumVal(), EU# 3 */ ++ 0x20000000, /* setCrcAccum(), EU# 3 */ ++ 0x21800000, /* and(), EU# 3 */ ++ 0x21e00000, /* or(), EU# 3 */ ++ 0x20400000, /* add(), EU# 3 */ ++ 0x20500000, /* sub(), EU# 3 */ ++ 0x205a0000, /* andNot(), EU# 3 */ ++ 0x202fa000, /* andReadyBit(), EU# 3 */ ++ 0x202f9000, /* andNotReadyBit(), EU# 3 */ ++ 0x202ea000, /* andWrapBit(), EU# 3 */ ++ 0x202da000, /* andEndFrameBit(), EU# 3 */ ++ 0x202e2000, /* andInterruptBit(), EU# 3 */ ++ 0x202f2000, /* andLoopBit(), EU# 3 */ ++ 0x2020a000, /* andCrcRestartBit(), EU# 3 */ ++}; ++#endif /*MCD_INCLUDE_EU*/ ++ ++u32 MCD_contextSave0[128]; /* Task 0 context save space */ ++u32 MCD_contextSave1[128]; /* Task 1 context save space */ ++u32 MCD_contextSave2[128]; /* Task 2 context save space */ ++u32 MCD_contextSave3[128]; /* Task 3 context save space */ ++u32 MCD_contextSave4[128]; /* Task 4 context save space */ ++u32 MCD_contextSave5[128]; /* Task 5 context save space */ ++u32 MCD_contextSave6[128]; /* Task 6 context save space */ ++u32 MCD_contextSave7[128]; /* Task 7 context save space */ ++u32 MCD_contextSave8[128]; /* Task 8 context save space */ ++u32 MCD_contextSave9[128]; /* Task 9 context save space */ ++u32 MCD_contextSave10[128]; /* Task 10 context save space */ ++u32 MCD_contextSave11[128]; /* Task 11 context save space */ ++u32 MCD_contextSave12[128]; /* Task 12 context save space */ ++u32 MCD_contextSave13[128]; /* Task 13 context save space */ ++u32 MCD_contextSave14[128]; /* Task 14 context save space */ ++u32 MCD_contextSave15[128]; /* Task 15 context save space */ ++ ++/* Task Descriptor Tables - the guts */ ++u32 MCD_ChainNoEu_TDT[]; ++u32 MCD_SingleNoEu_TDT[]; ++#ifdef MCD_INCLUDE_EU ++u32 MCD_ChainEu_TDT[]; ++u32 MCD_SingleEu_TDT[]; ++#endif ++u32 MCD_ENetRcv_TDT[]; ++u32 MCD_ENetXmit_TDT[]; ++ ++u32 MCD_modelTaskTableSrc[]= ++{ ++ (u32)MCD_ChainNoEu_TDT, ++ (u32)&((u8*)MCD_ChainNoEu_TDT)[0x00000178], ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ (u32)MCD_SingleNoEu_TDT, ++ (u32)&((u8*)MCD_SingleNoEu_TDT)[0x000000d4], ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++#ifdef MCD_INCLUDE_EU ++ (u32)MCD_ChainEu_TDT, ++ (u32)&((u8*)MCD_ChainEu_TDT)[0x00000180], ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ (u32)MCD_SingleEu_TDT, ++ (u32)&((u8*)MCD_SingleEu_TDT)[0x000000dc], ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++#endif ++ (u32)MCD_ENetRcv_TDT, ++ (u32)&((u8*)MCD_ENetRcv_TDT)[0x0000009C], ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ (u32)MCD_ENetXmit_TDT, ++ (u32)&((u8*)MCD_ENetXmit_TDT)[0x000000d0], ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++ 0x00000000, ++}; ++ ++u32 MCD_ChainNoEu_TDT[]= ++{ ++ 0x80004000, /* 0000(:370): LCDEXT: idx0 = 0x00000000; ; */ ++ 0x8118801b, /* 0004(:370): LCD: idx1 = var2; idx1 once var0; idx1 += inc3 */ ++ 0xb8ca0018, /* 0008(:371): LCD: idx2 = *(idx1 + var20); idx2 once var0; idx2 += inc3 */ ++ 0x10004b10, /* 000C(:372): DRD1A: var18 = idx2; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x7000000c, /* 0010(:373): DRD2A: EU0=0 EU1=0 EU2=0 EU3=12 EXT MORE init=0 WS=0 RS=0 */ ++ 0x024cf89f, /* 0014(:373): DRD2B1: var9 = EU3(); EU3(idx2) */ ++ 0x60000009, /* 0018(:374): DRD2A: EU0=0 EU1=0 EU2=0 EU3=9 EXT init=0 WS=0 RS=0 */ ++ 0x080cf89f, /* 001C(:374): DRD2B1: idx0 = EU3(); EU3(idx2) */ ++ 0x000001f8, /* 0020(:0): NOP */ ++ 0x98180524, /* 0024(:378): LCD: idx0 = idx0; idx0 != var20; idx0 += inc4 */ ++ 0x8118801b, /* 0028(:380): LCD: idx1 = var2; idx1 once var0; idx1 += inc3 */ ++ 0xf8ca001a, /* 002C(:381): LCDEXT: idx2 = *(idx1 + var20 + 8); idx2 once var0; idx2 += inc3 */ ++ 0xb8ca601b, /* 0030(:382): LCD: idx3 = *(idx1 + var20 + 12); ; idx3 += inc3 */ ++ 0x10004310, /* 0034(:384): DRD1A: var16 = idx2; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x00001718, /* 0038(:385): DRD1A: var5 = idx3; FN=0 init=0 WS=0 RS=0 */ ++ 0xb8ca001d, /* 003C(:387): LCD: idx2 = *(idx1 + var20 + 20); idx2 once var0; idx2 += inc3 */ ++ 0x10001f10, /* 0040(:388): DRD1A: var7 = idx2; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x60000007, /* 0044(:389): DRD2A: EU0=0 EU1=0 EU2=0 EU3=7 EXT init=0 WS=0 RS=0 */ ++ 0x020cf893, /* 0048(:389): DRD2B1: var8 = EU3(); EU3(idx2,var19) */ ++ 0x98ca001c, /* 004C(:391): LCD: idx2 = idx1 + var20 + 4; idx2 once var0; idx2 += inc3 */ ++ 0x00000710, /* 0050(:392): DRD1A: var1 = idx2; FN=0 init=0 WS=0 RS=0 */ ++ 0x98ca8018, /* 0054(:393): LCD: idx2 = idx1 + var21; idx2 once var0; idx2 += inc3 */ ++ 0x10002b10, /* 0058(:394): DRD1A: var10 = idx2; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x0000c828, /* 005C(:395): DRD1A: *idx2 = var5; FN=0 init=0 WS=0 RS=0 */ ++ 0x000001f8, /* 0060(:0): NOP */ ++ 0xc14ae018, /* 0064(:399): LCDEXT: idx1 = var2 + var21; ; idx1 += inc3 */ ++ 0xc004a51d, /* 0068(:399): LCDEXT: idx2 = var0, idx3 = var9; idx3 == var20; idx2 += inc3, idx3 += inc5 */ ++ 0x811a601b, /* 006C(:400): LCD: idx4 = var2; ; idx4 += inc3 */ ++ 0xc28a21c2, /* 0070(:403): LCDEXT: idx5 = var5, idx6 = var20; idx6 < var7; idx5 += inc0, idx6 += inc2 */ ++ 0x881be009, /* 0074(:403): LCD: idx7 = var16; ; idx7 += inc1 */ ++ 0x03fed7b8, /* 0078(:406): DRD1A: *idx7; FN=0 init=31 WS=3 RS=3 */ ++ 0xda9b001b, /* 007C(:408): LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */ ++ 0x9b9be01b, /* 0080(:408): LCD: idx7 = idx7; ; idx7 += inc3 */ ++ 0x1000cb20, /* 0084(:409): DRD1A: *idx2 = idx4; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x70000006, /* 0088(:410): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ ++ 0x088cf896, /* 008C(:410): DRD2B1: idx2 = EU3(); EU3(idx2,var22) */ ++ 0x1000cb28, /* 0090(:411): DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x70000006, /* 0094(:412): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ ++ 0x088cf896, /* 0098(:412): DRD2B1: idx2 = EU3(); EU3(idx2,var22) */ ++ 0x1000cb30, /* 009C(:413): DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x70000006, /* 00A0(:414): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ ++ 0x088cf896, /* 00A4(:414): DRD2B1: idx2 = EU3(); EU3(idx2,var22) */ ++ 0x1000cb38, /* 00A8(:415): DRD1A: *idx2 = idx7; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x0000c728, /* 00AC(:416): DRD1A: *idx1 = idx5; FN=0 init=0 WS=0 RS=0 */ ++ 0x000001f8, /* 00B0(:0): NOP */ ++ 0xc14ae018, /* 00B4(:420): LCDEXT: idx1 = var2 + var21; ; idx1 += inc3 */ ++ 0xc004a5dd, /* 00B8(:420): LCDEXT: idx2 = var0, idx3 = var9; idx3 == var23; idx2 += inc3, idx3 += inc5 */ ++ 0x811a601b, /* 00BC(:421): LCD: idx4 = var2; ; idx4 += inc3 */ ++ 0xda9b001b, /* 00C0(:424): LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */ ++ 0x9b9be01b, /* 00C4(:424): LCD: idx7 = idx7; ; idx7 += inc3 */ ++ 0x0000d3a0, /* 00C8(:425): DRD1A: *idx4; FN=0 init=0 WS=0 RS=0 */ ++ 0xc28a21c2, /* 00CC(:427): LCDEXT: idx5 = var5, idx6 = var20; idx6 < var7; idx5 += inc0, idx6 += inc2 */ ++ 0x881be009, /* 00D0(:427): LCD: idx7 = var16; ; idx7 += inc1 */ ++ 0x0bfed7b8, /* 00D4(:430): DRD1A: *idx7; FN=0 TFD init=31 WS=3 RS=3 */ ++ 0xda9b001b, /* 00D8(:432): LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */ ++ 0x9b9be01b, /* 00DC(:432): LCD: idx7 = idx7; ; idx7 += inc3 */ ++ 0x1000cb20, /* 00E0(:433): DRD1A: *idx2 = idx4; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x70000006, /* 00E4(:434): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ ++ 0x088cf896, /* 00E8(:434): DRD2B1: idx2 = EU3(); EU3(idx2,var22) */ ++ 0x1000cb28, /* 00EC(:435): DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x70000006, /* 00F0(:436): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ ++ 0x088cf896, /* 00F4(:436): DRD2B1: idx2 = EU3(); EU3(idx2,var22) */ ++ 0x1000cb30, /* 00F8(:437): DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x70000006, /* 00FC(:438): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ ++ 0x088cf896, /* 0100(:438): DRD2B1: idx2 = EU3(); EU3(idx2,var22) */ ++ 0x1000cb38, /* 0104(:439): DRD1A: *idx2 = idx7; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x0000c728, /* 0108(:440): DRD1A: *idx1 = idx5; FN=0 init=0 WS=0 RS=0 */ ++ 0x000001f8, /* 010C(:0): NOP */ ++ 0x8118801b, /* 0110(:444): LCD: idx1 = var2; idx1 once var0; idx1 += inc3 */ ++ 0x8a19001b, /* 0114(:446): LCD: idx2 = var20; idx2 once var0; idx2 += inc3 */ ++ 0x6000000e, /* 0118(:447): DRD2A: EU0=0 EU1=0 EU2=0 EU3=14 EXT init=0 WS=0 RS=0 */ ++ 0x088cf49f, /* 011C(:447): DRD2B1: idx2 = EU3(); EU3(var18) */ ++ 0xd9190536, /* 0120(:448): LCDEXT: idx2 = idx2; idx2 == var20; idx2 += inc6 */ ++ 0x98ca0018, /* 0124(:448): LCD: idx3 = idx1 + var20; idx3 once var0; idx3 += inc3 */ ++ 0x6000000a, /* 0128(:450): DRD2A: EU0=0 EU1=0 EU2=0 EU3=10 EXT init=0 WS=0 RS=0 */ ++ 0x0cccfcdf, /* 012C(:450): DRD2B1: *idx3 = EU3(); EU3(*idx3) */ ++ 0x000001f8, /* 0130(:0): NOP */ ++ 0xa14a001e, /* 0134(:453): LCD: idx1 = *(var2 + var20 + 24); idx1 once var0; idx1 += inc3 */ ++ 0x10000b08, /* 0138(:454): DRD1A: var2 = idx1; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x10002c90, /* 013C(:455): DRD1A: var11 = var18; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0xb8ca0018, /* 0140(:456): LCD: idx2 = *(idx1 + var20); idx2 once var0; idx2 += inc3 */ ++ 0x10004b10, /* 0144(:457): DRD1A: var18 = idx2; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x70000009, /* 0148(:458): DRD2A: EU0=0 EU1=0 EU2=0 EU3=9 EXT MORE init=0 WS=0 RS=0 */ ++ 0x080cf89f, /* 014C(:458): DRD2B1: idx0 = EU3(); EU3(idx2) */ ++ 0x6000000c, /* 0150(:459): DRD2A: EU0=0 EU1=0 EU2=0 EU3=12 EXT init=0 WS=0 RS=0 */ ++ 0x024cf89f, /* 0154(:459): DRD2B1: var9 = EU3(); EU3(idx2) */ ++ 0x000001f8, /* 0158(:0): NOP */ ++ 0x8a18801b, /* 015C(:465): LCD: idx1 = var20; idx1 once var0; idx1 += inc3 */ ++ 0x7000000d, /* 0160(:466): DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT MORE init=0 WS=0 RS=0 */ ++ 0x084cf2df, /* 0164(:466): DRD2B1: idx1 = EU3(); EU3(var11) */ ++ 0xd899053f, /* 0168(:467): LCDEXT: idx2 = idx1; idx2 > var20; idx2 += inc7 */ ++ 0x8019801b, /* 016C(:467): LCD: idx3 = var0; idx3 once var0; idx3 += inc3 */ ++ 0x040001f8, /* 0170(:468): DRD1A: FN=0 INT init=0 WS=0 RS=0 */ ++ 0x000001f8, /* 0174(:0): NOP */ ++ 0x000001f8, /* 0178(:0): NOP */ ++}; ++u32 MCD_SingleNoEu_TDT[]= ++{ ++ 0x8318001b, /* 0000(:646): LCD: idx0 = var6; idx0 once var0; idx0 += inc3 */ ++ 0x7000000c, /* 0004(:647): DRD2A: EU0=0 EU1=0 EU2=0 EU3=12 EXT MORE init=0 WS=0 RS=0 */ ++ 0x080cf81f, /* 0008(:647): DRD2B1: idx0 = EU3(); EU3(idx0) */ ++ 0x8318801b, /* 000C(:648): LCD: idx1 = var6; idx1 once var0; idx1 += inc3 */ ++ 0x6000000d, /* 0010(:649): DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT init=0 WS=0 RS=0 */ ++ 0x084cf85f, /* 0014(:649): DRD2B1: idx1 = EU3(); EU3(idx1) */ ++ 0x000001f8, /* 0018(:0): NOP */ ++ 0x8498001b, /* 001C(:653): LCD: idx0 = var9; idx0 once var0; idx0 += inc3 */ ++ 0x7000000c, /* 0020(:654): DRD2A: EU0=0 EU1=0 EU2=0 EU3=12 EXT MORE init=0 WS=0 RS=0 */ ++ 0x020cf81f, /* 0024(:654): DRD2B1: var8 = EU3(); EU3(idx0) */ ++ 0x6000000d, /* 0028(:655): DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT init=0 WS=0 RS=0 */ ++ 0x028cf81f, /* 002C(:655): DRD2B1: var10 = EU3(); EU3(idx0) */ ++ 0xc404601b, /* 0030(:658): LCDEXT: idx0 = var8, idx1 = var8; ; idx0 += inc3, idx1 += inc3 */ ++ 0xc00423dc, /* 0034(:658): LCDEXT: idx2 = var0, idx3 = var8; idx3 == var15; idx2 += inc3, idx3 += inc4 */ ++ 0x809a601b, /* 0038(:659): LCD: idx4 = var1; ; idx4 += inc3 */ ++ 0xc207a182, /* 003C(:662): LCDEXT: idx5 = var4, idx6 = var15; idx6 < var6; idx5 += inc0, idx6 += inc2 */ ++ 0x869be009, /* 0040(:662): LCD: idx7 = var13; ; idx7 += inc1 */ ++ 0x03fed7b8, /* 0044(:665): DRD1A: *idx7; FN=0 init=31 WS=3 RS=3 */ ++ 0xda9b001b, /* 0048(:667): LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */ ++ 0x9b9be01b, /* 004C(:667): LCD: idx7 = idx7; ; idx7 += inc3 */ ++ 0x70000006, /* 0050(:669): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ ++ 0x088cf890, /* 0054(:669): DRD2B1: idx2 = EU3(); EU3(idx2,var16) */ ++ 0x1000cb28, /* 0058(:670): DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x70000006, /* 005C(:671): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ ++ 0x088cf890, /* 0060(:671): DRD2B1: idx2 = EU3(); EU3(idx2,var16) */ ++ 0x1000cb30, /* 0064(:672): DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x70000006, /* 0068(:673): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ ++ 0x088cf890, /* 006C(:673): DRD2B1: idx2 = EU3(); EU3(idx2,var16) */ ++ 0x0000cb38, /* 0070(:674): DRD1A: *idx2 = idx7; FN=0 init=0 WS=0 RS=0 */ ++ 0x000001f8, /* 0074(:0): NOP */ ++ 0xc404601b, /* 0078(:678): LCDEXT: idx0 = var8, idx1 = var8; ; idx0 += inc3, idx1 += inc3 */ ++ 0xc004245c, /* 007C(:678): LCDEXT: idx2 = var0, idx3 = var8; idx3 == var17; idx2 += inc3, idx3 += inc4 */ ++ 0x809a601b, /* 0080(:679): LCD: idx4 = var1; ; idx4 += inc3 */ ++ 0xda9b001b, /* 0084(:682): LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */ ++ 0x9b9be01b, /* 0088(:682): LCD: idx7 = idx7; ; idx7 += inc3 */ ++ 0x0000d3a0, /* 008C(:683): DRD1A: *idx4; FN=0 init=0 WS=0 RS=0 */ ++ 0xc207a182, /* 0090(:685): LCDEXT: idx5 = var4, idx6 = var15; idx6 < var6; idx5 += inc0, idx6 += inc2 */ ++ 0x869be009, /* 0094(:685): LCD: idx7 = var13; ; idx7 += inc1 */ ++ 0x0bfed7b8, /* 0098(:688): DRD1A: *idx7; FN=0 TFD init=31 WS=3 RS=3 */ ++ 0xda9b001b, /* 009C(:690): LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */ ++ 0x9b9be01b, /* 00A0(:690): LCD: idx7 = idx7; ; idx7 += inc3 */ ++ 0x70000006, /* 00A4(:692): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ ++ 0x088cf890, /* 00A8(:692): DRD2B1: idx2 = EU3(); EU3(idx2,var16) */ ++ 0x1000cb28, /* 00AC(:693): DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x70000006, /* 00B0(:694): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ ++ 0x088cf890, /* 00B4(:694): DRD2B1: idx2 = EU3(); EU3(idx2,var16) */ ++ 0x1000cb30, /* 00B8(:695): DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x70000006, /* 00BC(:696): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ ++ 0x088cf890, /* 00C0(:696): DRD2B1: idx2 = EU3(); EU3(idx2,var16) */ ++ 0x0000cb38, /* 00C4(:697): DRD1A: *idx2 = idx7; FN=0 init=0 WS=0 RS=0 */ ++ 0x000001f8, /* 00C8(:0): NOP */ ++ 0xc51803ed, /* 00CC(:701): LCDEXT: idx0 = var10; idx0 > var15; idx0 += inc5 */ ++ 0x8018801b, /* 00D0(:701): LCD: idx1 = var0; idx1 once var0; idx1 += inc3 */ ++ 0x040001f8, /* 00D4(:702): DRD1A: FN=0 INT init=0 WS=0 RS=0 */ ++}; ++#ifdef MCD_INCLUDE_EU ++u32 MCD_ChainEu_TDT[]= ++{ ++ 0x80004000, /* 0000(:928): LCDEXT: idx0 = 0x00000000; ; */ ++ 0x8118801b, /* 0004(:928): LCD: idx1 = var2; idx1 once var0; idx1 += inc3 */ ++ 0xb8ca0018, /* 0008(:929): LCD: idx2 = *(idx1 + var20); idx2 once var0; idx2 += inc3 */ ++ 0x10004b10, /* 000C(:930): DRD1A: var18 = idx2; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x7000000c, /* 0010(:931): DRD2A: EU0=0 EU1=0 EU2=0 EU3=12 EXT MORE init=0 WS=0 RS=0 */ ++ 0x024cf89f, /* 0014(:931): DRD2B1: var9 = EU3(); EU3(idx2) */ ++ 0x60000009, /* 0018(:932): DRD2A: EU0=0 EU1=0 EU2=0 EU3=9 EXT init=0 WS=0 RS=0 */ ++ 0x080cf89f, /* 001C(:932): DRD2B1: idx0 = EU3(); EU3(idx2) */ ++ 0x000001f8, /* 0020(:0): NOP */ ++ 0x98180524, /* 0024(:936): LCD: idx0 = idx0; idx0 != var20; idx0 += inc4 */ ++ 0x8118801b, /* 0028(:938): LCD: idx1 = var2; idx1 once var0; idx1 += inc3 */ ++ 0xf8ca001a, /* 002C(:939): LCDEXT: idx2 = *(idx1 + var20 + 8); idx2 once var0; idx2 += inc3 */ ++ 0xb8ca601b, /* 0030(:940): LCD: idx3 = *(idx1 + var20 + 12); ; idx3 += inc3 */ ++ 0x10004310, /* 0034(:942): DRD1A: var16 = idx2; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x00001718, /* 0038(:943): DRD1A: var5 = idx3; FN=0 init=0 WS=0 RS=0 */ ++ 0xb8ca001d, /* 003C(:945): LCD: idx2 = *(idx1 + var20 + 20); idx2 once var0; idx2 += inc3 */ ++ 0x10001f10, /* 0040(:946): DRD1A: var7 = idx2; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x60000007, /* 0044(:947): DRD2A: EU0=0 EU1=0 EU2=0 EU3=7 EXT init=0 WS=0 RS=0 */ ++ 0x020cf893, /* 0048(:947): DRD2B1: var8 = EU3(); EU3(idx2,var19) */ ++ 0x98ca001c, /* 004C(:949): LCD: idx2 = idx1 + var20 + 4; idx2 once var0; idx2 += inc3 */ ++ 0x00000710, /* 0050(:950): DRD1A: var1 = idx2; FN=0 init=0 WS=0 RS=0 */ ++ 0x98ca8018, /* 0054(:951): LCD: idx2 = idx1 + var21; idx2 once var0; idx2 += inc3 */ ++ 0x10002b10, /* 0058(:952): DRD1A: var10 = idx2; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x0000c828, /* 005C(:953): DRD1A: *idx2 = var5; FN=0 init=0 WS=0 RS=0 */ ++ 0x000001f8, /* 0060(:0): NOP */ ++ 0xc14ae018, /* 0064(:957): LCDEXT: idx1 = var2 + var21; ; idx1 += inc3 */ ++ 0xc004a51d, /* 0068(:957): LCDEXT: idx2 = var0, idx3 = var9; idx3 == var20; idx2 += inc3, idx3 += inc5 */ ++ 0x811a601b, /* 006C(:958): LCD: idx4 = var2; ; idx4 += inc3 */ ++ 0xc28a21c2, /* 0070(:961): LCDEXT: idx5 = var5, idx6 = var20; idx6 < var7; idx5 += inc0, idx6 += inc2 */ ++ 0x881be009, /* 0074(:961): LCD: idx7 = var16; ; idx7 += inc1 */ ++ 0x63fe0000, /* 0078(:964): DRD2A: EU0=0 EU1=0 EU2=0 EU3=0 EXT init=31 WS=3 RS=3 */ ++ 0x0d4cfddf, /* 007C(:964): DRD2B1: *idx5 = EU3(); EU3(*idx7) */ ++ 0xda9b001b, /* 0080(:966): LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */ ++ 0x9b9be01b, /* 0084(:966): LCD: idx7 = idx7; ; idx7 += inc3 */ ++ 0x1000cb20, /* 0088(:967): DRD1A: *idx2 = idx4; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x70000006, /* 008C(:968): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ ++ 0x088cf896, /* 0090(:968): DRD2B1: idx2 = EU3(); EU3(idx2,var22) */ ++ 0x1000cb28, /* 0094(:969): DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x70000006, /* 0098(:970): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ ++ 0x088cf896, /* 009C(:970): DRD2B1: idx2 = EU3(); EU3(idx2,var22) */ ++ 0x1000cb30, /* 00A0(:971): DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x70000006, /* 00A4(:972): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ ++ 0x088cf896, /* 00A8(:972): DRD2B1: idx2 = EU3(); EU3(idx2,var22) */ ++ 0x1000cb38, /* 00AC(:973): DRD1A: *idx2 = idx7; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x0000c728, /* 00B0(:974): DRD1A: *idx1 = idx5; FN=0 init=0 WS=0 RS=0 */ ++ 0x000001f8, /* 00B4(:0): NOP */ ++ 0xc14ae018, /* 00B8(:978): LCDEXT: idx1 = var2 + var21; ; idx1 += inc3 */ ++ 0xc004a5dd, /* 00BC(:978): LCDEXT: idx2 = var0, idx3 = var9; idx3 == var23; idx2 += inc3, idx3 += inc5 */ ++ 0x811a601b, /* 00C0(:979): LCD: idx4 = var2; ; idx4 += inc3 */ ++ 0xda9b001b, /* 00C4(:982): LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */ ++ 0x9b9be01b, /* 00C8(:982): LCD: idx7 = idx7; ; idx7 += inc3 */ ++ 0x0000d3a0, /* 00CC(:983): DRD1A: *idx4; FN=0 init=0 WS=0 RS=0 */ ++ 0xc28a21c2, /* 00D0(:985): LCDEXT: idx5 = var5, idx6 = var20; idx6 < var7; idx5 += inc0, idx6 += inc2 */ ++ 0x881be009, /* 00D4(:985): LCD: idx7 = var16; ; idx7 += inc1 */ ++ 0x6bfe0000, /* 00D8(:988): DRD2A: EU0=0 EU1=0 EU2=0 EU3=0 TFD EXT init=31 WS=3 RS=3 */ ++ 0x0d4cfddf, /* 00DC(:988): DRD2B1: *idx5 = EU3(); EU3(*idx7) */ ++ 0xda9b001b, /* 00E0(:990): LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */ ++ 0x9b9be01b, /* 00E4(:990): LCD: idx7 = idx7; ; idx7 += inc3 */ ++ 0x1000cb20, /* 00E8(:991): DRD1A: *idx2 = idx4; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x70000006, /* 00EC(:992): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ ++ 0x088cf896, /* 00F0(:992): DRD2B1: idx2 = EU3(); EU3(idx2,var22) */ ++ 0x1000cb28, /* 00F4(:993): DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x70000006, /* 00F8(:994): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ ++ 0x088cf896, /* 00FC(:994): DRD2B1: idx2 = EU3(); EU3(idx2,var22) */ ++ 0x1000cb30, /* 0100(:995): DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x70000006, /* 0104(:996): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ ++ 0x088cf896, /* 0108(:996): DRD2B1: idx2 = EU3(); EU3(idx2,var22) */ ++ 0x1000cb38, /* 010C(:997): DRD1A: *idx2 = idx7; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x0000c728, /* 0110(:998): DRD1A: *idx1 = idx5; FN=0 init=0 WS=0 RS=0 */ ++ 0x000001f8, /* 0114(:0): NOP */ ++ 0x8118801b, /* 0118(:1002): LCD: idx1 = var2; idx1 once var0; idx1 += inc3 */ ++ 0x8a19001b, /* 011C(:1004): LCD: idx2 = var20; idx2 once var0; idx2 += inc3 */ ++ 0x6000000e, /* 0120(:1005): DRD2A: EU0=0 EU1=0 EU2=0 EU3=14 EXT init=0 WS=0 RS=0 */ ++ 0x088cf49f, /* 0124(:1005): DRD2B1: idx2 = EU3(); EU3(var18) */ ++ 0xd9190536, /* 0128(:1006): LCDEXT: idx2 = idx2; idx2 == var20; idx2 += inc6 */ ++ 0x98ca0018, /* 012C(:1006): LCD: idx3 = idx1 + var20; idx3 once var0; idx3 += inc3 */ ++ 0x6000000a, /* 0130(:1008): DRD2A: EU0=0 EU1=0 EU2=0 EU3=10 EXT init=0 WS=0 RS=0 */ ++ 0x0cccfcdf, /* 0134(:1008): DRD2B1: *idx3 = EU3(); EU3(*idx3) */ ++ 0x000001f8, /* 0138(:0): NOP */ ++ 0xa14a001e, /* 013C(:1011): LCD: idx1 = *(var2 + var20 + 24); idx1 once var0; idx1 += inc3 */ ++ 0x10000b08, /* 0140(:1012): DRD1A: var2 = idx1; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x10002c90, /* 0144(:1013): DRD1A: var11 = var18; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0xb8ca0018, /* 0148(:1014): LCD: idx2 = *(idx1 + var20); idx2 once var0; idx2 += inc3 */ ++ 0x10004b10, /* 014C(:1015): DRD1A: var18 = idx2; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x70000009, /* 0150(:1016): DRD2A: EU0=0 EU1=0 EU2=0 EU3=9 EXT MORE init=0 WS=0 RS=0 */ ++ 0x080cf89f, /* 0154(:1016): DRD2B1: idx0 = EU3(); EU3(idx2) */ ++ 0x6000000c, /* 0158(:1017): DRD2A: EU0=0 EU1=0 EU2=0 EU3=12 EXT init=0 WS=0 RS=0 */ ++ 0x024cf89f, /* 015C(:1017): DRD2B1: var9 = EU3(); EU3(idx2) */ ++ 0x000001f8, /* 0160(:0): NOP */ ++ 0x8a18801b, /* 0164(:1023): LCD: idx1 = var20; idx1 once var0; idx1 += inc3 */ ++ 0x7000000d, /* 0168(:1024): DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT MORE init=0 WS=0 RS=0 */ ++ 0x084cf2df, /* 016C(:1024): DRD2B1: idx1 = EU3(); EU3(var11) */ ++ 0xd899053f, /* 0170(:1025): LCDEXT: idx2 = idx1; idx2 > var20; idx2 += inc7 */ ++ 0x8019801b, /* 0174(:1025): LCD: idx3 = var0; idx3 once var0; idx3 += inc3 */ ++ 0x040001f8, /* 0178(:1026): DRD1A: FN=0 INT init=0 WS=0 RS=0 */ ++ 0x000001f8, /* 017C(:0): NOP */ ++ 0x000001f8, /* 0180(:0): NOP */ ++}; ++u32 MCD_SingleEu_TDT[]= ++{ ++ 0x8318001b, /* 0000(:1204): LCD: idx0 = var6; idx0 once var0; idx0 += inc3 */ ++ 0x7000000c, /* 0004(:1205): DRD2A: EU0=0 EU1=0 EU2=0 EU3=12 EXT MORE init=0 WS=0 RS=0 */ ++ 0x080cf81f, /* 0008(:1205): DRD2B1: idx0 = EU3(); EU3(idx0) */ ++ 0x8318801b, /* 000C(:1206): LCD: idx1 = var6; idx1 once var0; idx1 += inc3 */ ++ 0x6000000d, /* 0010(:1207): DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT init=0 WS=0 RS=0 */ ++ 0x084cf85f, /* 0014(:1207): DRD2B1: idx1 = EU3(); EU3(idx1) */ ++ 0x000001f8, /* 0018(:0): NOP */ ++ 0x8498001b, /* 001C(:1211): LCD: idx0 = var9; idx0 once var0; idx0 += inc3 */ ++ 0x7000000c, /* 0020(:1212): DRD2A: EU0=0 EU1=0 EU2=0 EU3=12 EXT MORE init=0 WS=0 RS=0 */ ++ 0x020cf81f, /* 0024(:1212): DRD2B1: var8 = EU3(); EU3(idx0) */ ++ 0x6000000d, /* 0028(:1213): DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT init=0 WS=0 RS=0 */ ++ 0x028cf81f, /* 002C(:1213): DRD2B1: var10 = EU3(); EU3(idx0) */ ++ 0xc404601b, /* 0030(:1216): LCDEXT: idx0 = var8, idx1 = var8; ; idx0 += inc3, idx1 += inc3 */ ++ 0xc00423dc, /* 0034(:1216): LCDEXT: idx2 = var0, idx3 = var8; idx3 == var15; idx2 += inc3, idx3 += inc4 */ ++ 0x809a601b, /* 0038(:1217): LCD: idx4 = var1; ; idx4 += inc3 */ ++ 0xc207a182, /* 003C(:1220): LCDEXT: idx5 = var4, idx6 = var15; idx6 < var6; idx5 += inc0, idx6 += inc2 */ ++ 0x869be009, /* 0040(:1220): LCD: idx7 = var13; ; idx7 += inc1 */ ++ 0x63fe0000, /* 0044(:1223): DRD2A: EU0=0 EU1=0 EU2=0 EU3=0 EXT init=31 WS=3 RS=3 */ ++ 0x0d4cfddf, /* 0048(:1223): DRD2B1: *idx5 = EU3(); EU3(*idx7) */ ++ 0xda9b001b, /* 004C(:1225): LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */ ++ 0x9b9be01b, /* 0050(:1225): LCD: idx7 = idx7; ; idx7 += inc3 */ ++ 0x70000006, /* 0054(:1227): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ ++ 0x088cf890, /* 0058(:1227): DRD2B1: idx2 = EU3(); EU3(idx2,var16) */ ++ 0x1000cb28, /* 005C(:1228): DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x70000006, /* 0060(:1229): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ ++ 0x088cf890, /* 0064(:1229): DRD2B1: idx2 = EU3(); EU3(idx2,var16) */ ++ 0x1000cb30, /* 0068(:1230): DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x70000006, /* 006C(:1231): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ ++ 0x088cf890, /* 0070(:1231): DRD2B1: idx2 = EU3(); EU3(idx2,var16) */ ++ 0x0000cb38, /* 0074(:1232): DRD1A: *idx2 = idx7; FN=0 init=0 WS=0 RS=0 */ ++ 0x000001f8, /* 0078(:0): NOP */ ++ 0xc404601b, /* 007C(:1236): LCDEXT: idx0 = var8, idx1 = var8; ; idx0 += inc3, idx1 += inc3 */ ++ 0xc004245c, /* 0080(:1236): LCDEXT: idx2 = var0, idx3 = var8; idx3 == var17; idx2 += inc3, idx3 += inc4 */ ++ 0x809a601b, /* 0084(:1237): LCD: idx4 = var1; ; idx4 += inc3 */ ++ 0xda9b001b, /* 0088(:1240): LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */ ++ 0x9b9be01b, /* 008C(:1240): LCD: idx7 = idx7; ; idx7 += inc3 */ ++ 0x0000d3a0, /* 0090(:1241): DRD1A: *idx4; FN=0 init=0 WS=0 RS=0 */ ++ 0xc207a182, /* 0094(:1243): LCDEXT: idx5 = var4, idx6 = var15; idx6 < var6; idx5 += inc0, idx6 += inc2 */ ++ 0x869be009, /* 0098(:1243): LCD: idx7 = var13; ; idx7 += inc1 */ ++ 0x6bfe0000, /* 009C(:1246): DRD2A: EU0=0 EU1=0 EU2=0 EU3=0 TFD EXT init=31 WS=3 RS=3 */ ++ 0x0d4cfddf, /* 00A0(:1246): DRD2B1: *idx5 = EU3(); EU3(*idx7) */ ++ 0xda9b001b, /* 00A4(:1248): LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */ ++ 0x9b9be01b, /* 00A8(:1248): LCD: idx7 = idx7; ; idx7 += inc3 */ ++ 0x70000006, /* 00AC(:1250): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ ++ 0x088cf890, /* 00B0(:1250): DRD2B1: idx2 = EU3(); EU3(idx2,var16) */ ++ 0x1000cb28, /* 00B4(:1251): DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x70000006, /* 00B8(:1252): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ ++ 0x088cf890, /* 00BC(:1252): DRD2B1: idx2 = EU3(); EU3(idx2,var16) */ ++ 0x1000cb30, /* 00C0(:1253): DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x70000006, /* 00C4(:1254): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ ++ 0x088cf890, /* 00C8(:1254): DRD2B1: idx2 = EU3(); EU3(idx2,var16) */ ++ 0x0000cb38, /* 00CC(:1255): DRD1A: *idx2 = idx7; FN=0 init=0 WS=0 RS=0 */ ++ 0x000001f8, /* 00D0(:0): NOP */ ++ 0xc51803ed, /* 00D4(:1259): LCDEXT: idx0 = var10; idx0 > var15; idx0 += inc5 */ ++ 0x8018801b, /* 00D8(:1259): LCD: idx1 = var0; idx1 once var0; idx1 += inc3 */ ++ 0x040001f8, /* 00DC(:1260): DRD1A: FN=0 INT init=0 WS=0 RS=0 */ ++}; ++#endif ++u32 MCD_ENetRcv_TDT[]= ++{ ++ 0x80004000, /* 0000(:1334): LCDEXT: idx0 = 0x00000000; ; */ ++ 0x82188000, /* 0004(:1334): LCD: idx1 = var4; idx1 once var0; idx1 += inc0 */ ++ 0x10000788, /* 0008(:1335): DRD1A: var1 = *idx1; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x60000009, /* 000C(:1336): DRD2A: EU0=0 EU1=0 EU2=0 EU3=9 EXT init=0 WS=0 RS=0 */ ++ 0x080cf05f, /* 0010(:1336): DRD2B1: idx0 = EU3(); EU3(var1) */ ++ 0x98180249, /* 0014(:1339): LCD: idx0 = idx0; idx0 != var9; idx0 += inc1 */ ++ 0x82448004, /* 0018(:1341): LCD: idx1 = var4 + var9 + 4; idx1 once var0; idx1 += inc0 */ ++ 0x7000000d, /* 001C(:1342): DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT MORE init=0 WS=0 RS=0 */ ++ 0x014cf05f, /* 0020(:1342): DRD2B1: var5 = EU3(); EU3(var1) */ ++ 0x7000000b, /* 0024(:1343): DRD2A: EU0=0 EU1=0 EU2=0 EU3=11 EXT MORE init=0 WS=0 RS=0 */ ++ 0x020cf05f, /* 0028(:1343): DRD2B1: var8 = EU3(); EU3(var1) */ ++ 0x70000004, /* 002C(:1344): DRD2A: EU0=0 EU1=0 EU2=0 EU3=4 EXT MORE init=0 WS=0 RS=0 */ ++ 0x018cf04a, /* 0030(:1344): DRD2B1: var6 = EU3(); EU3(var1,var10) */ ++ 0x70000004, /* 0034(:1345): DRD2A: EU0=0 EU1=0 EU2=0 EU3=4 EXT MORE init=0 WS=0 RS=0 */ ++ 0x004cf04b, /* 0038(:1345): DRD2B1: var1 = EU3(); EU3(var1,var11) */ ++ 0x00000b88, /* 003C(:1348): DRD1A: var2 = *idx1; FN=0 init=0 WS=0 RS=0 */ ++ 0xc4838190, /* 0040(:1351): LCDEXT: idx1 = var9, idx2 = var7; idx1 < var6; idx1 += inc2, idx2 += inc0 */ ++ 0x8119e012, /* 0044(:1351): LCD: idx3 = var2; ; idx3 += inc2 */ ++ 0x03e0cf90, /* 0048(:1354): DRD1A: *idx3 = *idx2; FN=0 init=31 WS=0 RS=0 */ ++ 0x81188000, /* 004C(:1357): LCD: idx1 = var2; idx1 once var0; idx1 += inc0 */ ++ 0x000ac788, /* 0050(:1358): DRD1A: *idx1 = *idx1; FN=0 init=0 WS=1 RS=1 */ ++ 0xc4838000, /* 0054(:1360): LCDEXT: idx1 = var9, idx2 = var7; idx1 once var0; idx1 += inc0, idx2 += inc0 */ ++ 0x8219e000, /* 0058(:1360): LCD: idx3 = var4; ; idx3 += inc0 */ ++ 0x70000004, /* 005C(:1368): DRD2A: EU0=0 EU1=0 EU2=0 EU3=4 EXT MORE init=0 WS=0 RS=0 */ ++ 0x084cfc8c, /* 0060(:1368): DRD2B1: idx1 = EU3(); EU3(*idx2,var12) */ ++ 0x60000005, /* 0064(:1371): DRD2A: EU0=0 EU1=0 EU2=0 EU3=5 EXT init=0 WS=0 RS=0 */ ++ 0x0cccf841, /* 0068(:1371): DRD2B1: *idx3 = EU3(); EU3(idx1,var1) */ ++ 0x82468000, /* 006C(:1377): LCD: idx1 = var4 + var13; idx1 once var0; idx1 += inc0 */ ++ 0xc419025b, /* 0070(:1379): LCDEXT: idx2 = var8; idx2 > var9; idx2 += inc3 */ ++ 0x80198000, /* 0074(:1379): LCD: idx3 = var0; idx3 once var0; idx3 += inc0 */ ++ 0x00008400, /* 0078(:1380): DRD1A: idx1 = var0; FN=0 init=0 WS=0 RS=0 */ ++ 0x00001308, /* 007C(:1381): DRD1A: var4 = idx1; FN=0 init=0 WS=0 RS=0 */ ++ 0x82188000, /* 0080(:1384): LCD: idx1 = var4; idx1 once var0; idx1 += inc0 */ ++ 0x10000788, /* 0084(:1385): DRD1A: var1 = *idx1; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x60000009, /* 0088(:1386): DRD2A: EU0=0 EU1=0 EU2=0 EU3=9 EXT init=0 WS=0 RS=0 */ ++ 0x080cf05f, /* 008C(:1386): DRD2B1: idx0 = EU3(); EU3(var1) */ ++ 0xc2988249, /* 0090(:1389): LCDEXT: idx1 = var5; idx1 != var9; idx1 += inc1 */ ++ 0x80190000, /* 0094(:1389): LCD: idx2 = var0; idx2 once var0; idx2 += inc0 */ ++ 0x040001f8, /* 0098(:1390): DRD1A: FN=0 INT init=0 WS=0 RS=0 */ ++ 0x000001f8, /* 009C(:0): NOP */ ++}; ++u32 MCD_ENetXmit_TDT[]= ++{ ++ 0x80004000, /* 0000(:1465): LCDEXT: idx0 = 0x00000000; ; */ ++ 0x81988000, /* 0004(:1465): LCD: idx1 = var3; idx1 once var0; idx1 += inc0 */ ++ 0x10000788, /* 0008(:1466): DRD1A: var1 = *idx1; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x60000009, /* 000C(:1467): DRD2A: EU0=0 EU1=0 EU2=0 EU3=9 EXT init=0 WS=0 RS=0 */ ++ 0x080cf05f, /* 0010(:1467): DRD2B1: idx0 = EU3(); EU3(var1) */ ++ 0x98180309, /* 0014(:1470): LCD: idx0 = idx0; idx0 != var12; idx0 += inc1 */ ++ 0x80004003, /* 0018(:1472): LCDEXT: idx1 = 0x00000003; ; */ ++ 0x81c60004, /* 001C(:1472): LCD: idx2 = var3 + var12 + 4; idx2 once var0; idx2 += inc0 */ ++ 0x7000000d, /* 0020(:1473): DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT MORE init=0 WS=0 RS=0 */ ++ 0x014cf05f, /* 0024(:1473): DRD2B1: var5 = EU3(); EU3(var1) */ ++ 0x7000000b, /* 0028(:1474): DRD2A: EU0=0 EU1=0 EU2=0 EU3=11 EXT MORE init=0 WS=0 RS=0 */ ++ 0x028cf05f, /* 002C(:1474): DRD2B1: var10 = EU3(); EU3(var1) */ ++ 0x7000000c, /* 0030(:1475): DRD2A: EU0=0 EU1=0 EU2=0 EU3=12 EXT MORE init=0 WS=0 RS=0 */ ++ 0x018cf05f, /* 0034(:1475): DRD2B1: var6 = EU3(); EU3(var1) */ ++ 0x70000004, /* 0038(:1476): DRD2A: EU0=0 EU1=0 EU2=0 EU3=4 EXT MORE init=0 WS=0 RS=0 */ ++ 0x01ccf04d, /* 003C(:1476): DRD2B1: var7 = EU3(); EU3(var1,var13) */ ++ 0x10000b90, /* 0040(:1477): DRD1A: var2 = *idx2; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x60000004, /* 0044(:1478): DRD2A: EU0=0 EU1=0 EU2=0 EU3=4 EXT init=0 WS=0 RS=0 */ ++ 0x020cf0a1, /* 0048(:1478): DRD2B1: var8 = EU3(); EU3(var2,idx1) */ ++ 0xc3188312, /* 004C(:1481): LCDEXT: idx1 = var6; idx1 > var12; idx1 += inc2 */ ++ 0x83c70000, /* 0050(:1481): LCD: idx2 = var7 + var14; idx2 once var0; idx2 += inc0 */ ++ 0x00001f10, /* 0054(:1482): DRD1A: var7 = idx2; FN=0 init=0 WS=0 RS=0 */ ++ 0xc583a3c3, /* 0058(:1484): LCDEXT: idx1 = var11, idx2 = var7; idx2 >= var15; idx1 += inc0, idx2 += inc3 */ ++ 0x81042325, /* 005C(:1484): LCD: idx3 = var2, idx4 = var8; idx4 == var12; idx3 += inc4, idx4 += inc5 */ ++ 0x03e0c798, /* 0060(:1489): DRD1A: *idx1 = *idx3; FN=0 init=31 WS=0 RS=0 */ ++ 0xd8990000, /* 0064(:1492): LCDEXT: idx1 = idx1, idx2 = idx2; idx1 once var0; idx1 += inc0, idx2 += inc0 */ ++ 0x9999e000, /* 0068(:1492): LCD: idx3 = idx3; ; idx3 += inc0 */ ++ 0x000acf98, /* 006C(:1493): DRD1A: *idx3 = *idx3; FN=0 init=0 WS=1 RS=1 */ ++ 0xd8992306, /* 0070(:1495): LCDEXT: idx1 = idx1, idx2 = idx2; idx2 > var12; idx1 += inc0, idx2 += inc6 */ ++ 0x9999e03f, /* 0074(:1495): LCD: idx3 = idx3; ; idx3 += inc7 */ ++ 0x03eac798, /* 0078(:1498): DRD1A: *idx1 = *idx3; FN=0 init=31 WS=1 RS=1 */ ++ 0xd8990000, /* 007C(:1501): LCDEXT: idx1 = idx1, idx2 = idx2; idx1 once var0; idx1 += inc0, idx2 += inc0 */ ++ 0x9999e000, /* 0080(:1501): LCD: idx3 = idx3; ; idx3 += inc0 */ ++ 0x000acf98, /* 0084(:1502): DRD1A: *idx3 = *idx3; FN=0 init=0 WS=1 RS=1 */ ++ 0xd8990000, /* 0088(:1504): LCDEXT: idx1 = idx1, idx2 = idx2; idx1 once var0; idx1 += inc0, idx2 += inc0 */ ++ 0x99832302, /* 008C(:1504): LCD: idx3 = idx3, idx4 = var6; idx4 > var12; idx3 += inc0, idx4 += inc2 */ ++ 0x0beac798, /* 0090(:1507): DRD1A: *idx1 = *idx3; FN=0 TFD init=31 WS=1 RS=1 */ ++ 0x81988000, /* 0094(:1509): LCD: idx1 = var3; idx1 once var0; idx1 += inc0 */ ++ 0x6000000a, /* 0098(:1510): DRD2A: EU0=0 EU1=0 EU2=0 EU3=10 EXT init=0 WS=0 RS=0 */ ++ 0x0c4cfc5f, /* 009C(:1510): DRD2B1: *idx1 = EU3(); EU3(*idx1) */ ++ 0x81c80000, /* 00A0(:1512): LCD: idx1 = var3 + var16; idx1 once var0; idx1 += inc0 */ ++ 0xc5190312, /* 00A4(:1514): LCDEXT: idx2 = var10; idx2 > var12; idx2 += inc2 */ ++ 0x80198000, /* 00A8(:1514): LCD: idx3 = var0; idx3 once var0; idx3 += inc0 */ ++ 0x00008400, /* 00AC(:1515): DRD1A: idx1 = var0; FN=0 init=0 WS=0 RS=0 */ ++ 0x00000f08, /* 00B0(:1516): DRD1A: var3 = idx1; FN=0 init=0 WS=0 RS=0 */ ++ 0x81988000, /* 00B4(:1519): LCD: idx1 = var3; idx1 once var0; idx1 += inc0 */ ++ 0x10000788, /* 00B8(:1520): DRD1A: var1 = *idx1; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x60000009, /* 00BC(:1521): DRD2A: EU0=0 EU1=0 EU2=0 EU3=9 EXT init=0 WS=0 RS=0 */ ++ 0x080cf05f, /* 00C0(:1521): DRD2B1: idx0 = EU3(); EU3(var1) */ ++ 0xc2988309, /* 00C4(:1524): LCDEXT: idx1 = var5; idx1 != var12; idx1 += inc1 */ ++ 0x80190000, /* 00C8(:1524): LCD: idx2 = var0; idx2 once var0; idx2 += inc0 */ ++ 0x040001f8, /* 00CC(:1525): DRD1A: FN=0 INT init=0 WS=0 RS=0 */ ++ 0x000001f8, /* 00D0(:0): NOP */ ++}; ++ +--- /dev/null ++++ b/drivers/dma/MCD_tasksInit.c +@@ -0,0 +1,284 @@ ++/********************************************************************* ++ * ++ * Copyright (C) 2004 Motorola, Inc. ++ * MOTOROLA, INC. All Rights Reserved. ++ * You are hereby granted a copyright license to use ++ * the SOFTWARE so long as this entire notice is ++ * retained without alteration in any modified and/or redistributed ++ * versions, and that such modified versions are clearly identified ++ * as such. No licenses are granted by implication, estoppel or ++ * otherwise under any patents or trademarks of Motorola, Inc. This ++ * software is provided on an "AS IS" basis and without warranty. ++ * ++ * To the maximum extent permitted by applicable law, MOTOROLA ++ * DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED, INCLUDING ++ * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR ++ * PURPOSE AND ANY WARRANTY AGAINST INFRINGEMENT WITH REGARD TO THE ++ * SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF) AND ANY ++ * ACCOMPANYING WRITTEN MATERIALS. ++ * ++ * To the maximum extent permitted by applicable law, IN NO EVENT ++ * SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER (INCLUDING ++ * WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS ++ * INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY ++ * LOSS) ARISING OF THE USE OR INABILITY TO USE THE SOFTWARE. ++ * ++ * Motorola assumes no responsibility for the maintenance and support ++ * of this software ++ ********************************************************************/ ++/* ++ * Do not edit! ++ */ ++ /* ++ * File: MCD_tasksInit.c ++ * Purpose: Function for initialize variable tables of different ++ * types of tasks. ++ * ++ * Notes: ++ * ++ * ++ * Modifications: ++ * ++ * ++ */ ++ ++#include <asm/MCD_dma.h> ++ ++extern dmaRegs *MCD_dmaBar; ++ ++/* ++ * Task 0 ++ */ ++ ++void MCD_startDmaChainNoEu(int *currBD, short srcIncr, short destIncr, int xferSize, short xferSizeIncr, int *cSave, volatile TaskTableEntry *taskTable, int channel) ++{ ++ ++ MCD_SET_VAR(taskTable+channel, 2, (u32)currBD); /* var[2] */ ++ MCD_SET_VAR(taskTable+channel, 25, (u32)(0xe000 << 16) | (0xffff & srcIncr)); /* inc[1] */ ++ MCD_SET_VAR(taskTable+channel, 24, (u32)(0xe000 << 16) | (0xffff & destIncr)); /* inc[0] */ ++ MCD_SET_VAR(taskTable+channel, 19, (u32)xferSize); /* var[19] */ ++ MCD_SET_VAR(taskTable+channel, 26, (u32)(0x2000 << 16) | (0xffff & xferSizeIncr)); /* inc[2] */ ++ MCD_SET_VAR(taskTable+channel, 0, (u32)cSave); /* var[0] */ ++ MCD_SET_VAR(taskTable+channel, 1, (u32)0x00000000); /* var[1] */ ++ MCD_SET_VAR(taskTable+channel, 3, (u32)0x00000000); /* var[3] */ ++ MCD_SET_VAR(taskTable+channel, 4, (u32)0x00000000); /* var[4] */ ++ MCD_SET_VAR(taskTable+channel, 5, (u32)0x00000000); /* var[5] */ ++ MCD_SET_VAR(taskTable+channel, 6, (u32)0x00000000); /* var[6] */ ++ MCD_SET_VAR(taskTable+channel, 7, (u32)0x00000000); /* var[7] */ ++ MCD_SET_VAR(taskTable+channel, 8, (u32)0x00000000); /* var[8] */ ++ MCD_SET_VAR(taskTable+channel, 9, (u32)0x00000000); /* var[9] */ ++ MCD_SET_VAR(taskTable+channel, 10, (u32)0x00000000); /* var[10] */ ++ MCD_SET_VAR(taskTable+channel, 11, (u32)0x00000000); /* var[11] */ ++ MCD_SET_VAR(taskTable+channel, 12, (u32)0x00000000); /* var[12] */ ++ MCD_SET_VAR(taskTable+channel, 13, (u32)0x00000000); /* var[13] */ ++ MCD_SET_VAR(taskTable+channel, 14, (u32)0x00000000); /* var[14] */ ++ MCD_SET_VAR(taskTable+channel, 15, (u32)0x00000000); /* var[15] */ ++ MCD_SET_VAR(taskTable+channel, 16, (u32)0x00000000); /* var[16] */ ++ MCD_SET_VAR(taskTable+channel, 17, (u32)0x00000000); /* var[17] */ ++ MCD_SET_VAR(taskTable+channel, 18, (u32)0x00000000); /* var[18] */ ++ MCD_SET_VAR(taskTable+channel, 20, (u32)0x00000000); /* var[20] */ ++ MCD_SET_VAR(taskTable+channel, 21, (u32)0x00000010); /* var[21] */ ++ MCD_SET_VAR(taskTable+channel, 22, (u32)0x00000004); /* var[22] */ ++ MCD_SET_VAR(taskTable+channel, 23, (u32)0x00000080); /* var[23] */ ++ MCD_SET_VAR(taskTable+channel, 27, (u32)0x00000000); /* inc[3] */ ++ MCD_SET_VAR(taskTable+channel, 28, (u32)0x60000000); /* inc[4] */ ++ MCD_SET_VAR(taskTable+channel, 29, (u32)0x80000001); /* inc[5] */ ++ MCD_SET_VAR(taskTable+channel, 30, (u32)0x80000000); /* inc[6] */ ++ MCD_SET_VAR(taskTable+channel, 31, (u32)0x40000000); /* inc[7] */ ++ ++ /* Set the task's Enable bit in its Task Control Register */ ++ MCD_dmaBar->taskControl[channel] |= (u16)0x8000; /* add a MACRO HERE TBD*/ ++ ++ ++} ++ ++ ++/* ++ * Task 1 ++ */ ++ ++void MCD_startDmaSingleNoEu(char *srcAddr, short srcIncr, char *destAddr, short destIncr, int dmaSize, int dmaSizeMXferSize, short xferSizeIncr, int flags, int *currBD, int *cSave, volatile TaskTableEntry *taskTable, int channel) ++{ ++ ++ MCD_SET_VAR(taskTable+channel, 13, (u32)srcAddr); /* var[13] */ ++ MCD_SET_VAR(taskTable+channel, 25, (u32)(0xe000 << 16) | (0xffff & srcIncr)); /* inc[1] */ ++ MCD_SET_VAR(taskTable+channel, 4, (u32)destAddr); /* var[4] */ ++ MCD_SET_VAR(taskTable+channel, 24, (u32)(0xe000 << 16) | (0xffff & destIncr)); /* inc[0] */ ++ MCD_SET_VAR(taskTable+channel, 6, (u32)dmaSize); /* var[6] */ ++ MCD_SET_VAR(taskTable+channel, 7, (u32)dmaSizeMXferSize); /* var[7] */ ++ MCD_SET_VAR(taskTable+channel, 26, (u32)(0x2000 << 16) | (0xffff & xferSizeIncr)); /* inc[2] */ ++ MCD_SET_VAR(taskTable+channel, 9, (u32)flags); /* var[9] */ ++ MCD_SET_VAR(taskTable+channel, 1, (u32)currBD); /* var[1] */ ++ MCD_SET_VAR(taskTable+channel, 0, (u32)cSave); /* var[0] */ ++ MCD_SET_VAR(taskTable+channel, 2, (u32)0x00000000); /* var[2] */ ++ MCD_SET_VAR(taskTable+channel, 3, (u32)0x00000000); /* var[3] */ ++ MCD_SET_VAR(taskTable+channel, 5, (u32)0x00000000); /* var[5] */ ++ MCD_SET_VAR(taskTable+channel, 8, (u32)0x00000000); /* var[8] */ ++ MCD_SET_VAR(taskTable+channel, 10, (u32)0x00000000); /* var[10] */ ++ MCD_SET_VAR(taskTable+channel, 11, (u32)0x00000000); /* var[11] */ ++ MCD_SET_VAR(taskTable+channel, 12, (u32)0x00000000); /* var[12] */ ++ MCD_SET_VAR(taskTable+channel, 14, (u32)0x00000000); /* var[14] */ ++ MCD_SET_VAR(taskTable+channel, 15, (u32)0x00000000); /* var[15] */ ++ MCD_SET_VAR(taskTable+channel, 16, (u32)0x00000004); /* var[16] */ ++ MCD_SET_VAR(taskTable+channel, 17, (u32)0x00000080); /* var[17] */ ++ MCD_SET_VAR(taskTable+channel, 27, (u32)0x00000000); /* inc[3] */ ++ MCD_SET_VAR(taskTable+channel, 28, (u32)0x80000001); /* inc[4] */ ++ MCD_SET_VAR(taskTable+channel, 29, (u32)0x40000000); /* inc[5] */ ++ ++ ++ /* enable the task */ ++ MCD_dmaBar->taskControl[channel] |= (u16)0x8000; /* add a MACRO HERE TBD*/ ++} ++ ++ ++/* ++ * Task 2 ++ */ ++ ++void MCD_startDmaChainEu(int *currBD, short srcIncr, short destIncr, int xferSize, short xferSizeIncr, int *cSave, volatile TaskTableEntry *taskTable, int channel) ++{ ++ ++ MCD_SET_VAR(taskTable+channel, 2, (u32)currBD); /* var[2] */ ++ MCD_SET_VAR(taskTable+channel, 25, (u32)(0xe000 << 16) | (0xffff & srcIncr)); /* inc[1] */ ++ MCD_SET_VAR(taskTable+channel, 24, (u32)(0xe000 << 16) | (0xffff & destIncr)); /* inc[0] */ ++ MCD_SET_VAR(taskTable+channel, 19, (u32)xferSize); /* var[19] */ ++ MCD_SET_VAR(taskTable+channel, 26, (u32)(0x2000 << 16) | (0xffff & xferSizeIncr)); /* inc[2] */ ++ MCD_SET_VAR(taskTable+channel, 0, (u32)cSave); /* var[0] */ ++ MCD_SET_VAR(taskTable+channel, 1, (u32)0x00000000); /* var[1] */ ++ MCD_SET_VAR(taskTable+channel, 3, (u32)0x00000000); /* var[3] */ ++ MCD_SET_VAR(taskTable+channel, 4, (u32)0x00000000); /* var[4] */ ++ MCD_SET_VAR(taskTable+channel, 5, (u32)0x00000000); /* var[5] */ ++ MCD_SET_VAR(taskTable+channel, 6, (u32)0x00000000); /* var[6] */ ++ MCD_SET_VAR(taskTable+channel, 7, (u32)0x00000000); /* var[7] */ ++ MCD_SET_VAR(taskTable+channel, 8, (u32)0x00000000); /* var[8] */ ++ MCD_SET_VAR(taskTable+channel, 9, (u32)0x00000000); /* var[9] */ ++ MCD_SET_VAR(taskTable+channel, 10, (u32)0x00000000); /* var[10] */ ++ MCD_SET_VAR(taskTable+channel, 11, (u32)0x00000000); /* var[11] */ ++ MCD_SET_VAR(taskTable+channel, 12, (u32)0x00000000); /* var[12] */ ++ MCD_SET_VAR(taskTable+channel, 13, (u32)0x00000000); /* var[13] */ ++ MCD_SET_VAR(taskTable+channel, 14, (u32)0x00000000); /* var[14] */ ++ MCD_SET_VAR(taskTable+channel, 15, (u32)0x00000000); /* var[15] */ ++ MCD_SET_VAR(taskTable+channel, 16, (u32)0x00000000); /* var[16] */ ++ MCD_SET_VAR(taskTable+channel, 17, (u32)0x00000000); /* var[17] */ ++ MCD_SET_VAR(taskTable+channel, 18, (u32)0x00000000); /* var[18] */ ++ MCD_SET_VAR(taskTable+channel, 20, (u32)0x00000000); /* var[20] */ ++ MCD_SET_VAR(taskTable+channel, 21, (u32)0x00000010); /* var[21] */ ++ MCD_SET_VAR(taskTable+channel, 22, (u32)0x00000004); /* var[22] */ ++ MCD_SET_VAR(taskTable+channel, 23, (u32)0x00000080); /* var[23] */ ++ MCD_SET_VAR(taskTable+channel, 27, (u32)0x00000000); /* inc[3] */ ++ MCD_SET_VAR(taskTable+channel, 28, (u32)0x60000000); /* inc[4] */ ++ MCD_SET_VAR(taskTable+channel, 29, (u32)0x80000001); /* inc[5] */ ++ MCD_SET_VAR(taskTable+channel, 30, (u32)0x80000000); /* inc[6] */ ++ MCD_SET_VAR(taskTable+channel, 31, (u32)0x40000000); /* inc[7] */ ++ ++ /*enable the task*/ ++ MCD_dmaBar->taskControl[channel] |= (u16)0x8000; /* add a MACRO HERE TBD*/ ++} ++ ++ ++/* ++ * Task 3 ++ */ ++ ++void MCD_startDmaSingleEu(char *srcAddr, short srcIncr, char *destAddr, short destIncr, int dmaSize, int dmaSizeMXferSize, short xferSizeIncr, int flags, int *currBD, int *cSave, volatile TaskTableEntry *taskTable, int channel) ++{ ++ ++ MCD_SET_VAR(taskTable+channel, 13, (u32)srcAddr); /* var[13] */ ++ MCD_SET_VAR(taskTable+channel, 25, (u32)(0xe000 << 16) | (0xffff & srcIncr)); /* inc[1] */ ++ MCD_SET_VAR(taskTable+channel, 4, (u32)destAddr); /* var[4] */ ++ MCD_SET_VAR(taskTable+channel, 24, (u32)(0xe000 << 16) | (0xffff & destIncr)); /* inc[0] */ ++ MCD_SET_VAR(taskTable+channel, 6, (u32)dmaSize); /* var[6] */ ++ MCD_SET_VAR(taskTable+channel, 7, (u32)dmaSizeMXferSize); /* var[7] */ ++ MCD_SET_VAR(taskTable+channel, 26, (u32)(0x2000 << 16) | (0xffff & xferSizeIncr)); /* inc[2] */ ++ MCD_SET_VAR(taskTable+channel, 9, (u32)flags); /* var[9] */ ++ MCD_SET_VAR(taskTable+channel, 1, (u32)currBD); /* var[1] */ ++ MCD_SET_VAR(taskTable+channel, 0, (u32)cSave); /* var[0] */ ++ MCD_SET_VAR(taskTable+channel, 2, (u32)0x00000000); /* var[2] */ ++ MCD_SET_VAR(taskTable+channel, 3, (u32)0x00000000); /* var[3] */ ++ MCD_SET_VAR(taskTable+channel, 5, (u32)0x00000000); /* var[5] */ ++ MCD_SET_VAR(taskTable+channel, 8, (u32)0x00000000); /* var[8] */ ++ MCD_SET_VAR(taskTable+channel, 10, (u32)0x00000000); /* var[10] */ ++ MCD_SET_VAR(taskTable+channel, 11, (u32)0x00000000); /* var[11] */ ++ MCD_SET_VAR(taskTable+channel, 12, (u32)0x00000000); /* var[12] */ ++ MCD_SET_VAR(taskTable+channel, 14, (u32)0x00000000); /* var[14] */ ++ MCD_SET_VAR(taskTable+channel, 15, (u32)0x00000000); /* var[15] */ ++ MCD_SET_VAR(taskTable+channel, 16, (u32)0x00000004); /* var[16] */ ++ MCD_SET_VAR(taskTable+channel, 17, (u32)0x00000080); /* var[17] */ ++ MCD_SET_VAR(taskTable+channel, 27, (u32)0x00000000); /* inc[3] */ ++ MCD_SET_VAR(taskTable+channel, 28, (u32)0x80000001); /* inc[4] */ ++ MCD_SET_VAR(taskTable+channel, 29, (u32)0x40000000); /* inc[5] */ ++ ++ /*enable the task*/ ++ MCD_dmaBar->taskControl[channel] |= (u16)0x8000; /* add a MACRO HERE TBD*/ ++ ++} ++ ++ ++/* ++ * Task 4 ++ */ ++ ++void MCD_startDmaENetRcv(char *bDBase, char *currBD, char *rcvFifoPtr, volatile TaskTableEntry *taskTable, int channel) ++{ ++ ++ MCD_SET_VAR(taskTable+channel, 0, (u32)bDBase); /* var[0] */ ++ MCD_SET_VAR(taskTable+channel, 4, (u32)currBD); /* var[4] */ ++ MCD_SET_VAR(taskTable+channel, 7, (u32)rcvFifoPtr); /* var[7] */ ++ MCD_SET_VAR(taskTable+channel, 1, (u32)0x00000000); /* var[1] */ ++ MCD_SET_VAR(taskTable+channel, 2, (u32)0x00000000); /* var[2] */ ++ MCD_SET_VAR(taskTable+channel, 3, (u32)0x00000000); /* var[3] */ ++ MCD_SET_VAR(taskTable+channel, 5, (u32)0x00000000); /* var[5] */ ++ MCD_SET_VAR(taskTable+channel, 6, (u32)0x00000000); /* var[6] */ ++ MCD_SET_VAR(taskTable+channel, 8, (u32)0x00000000); /* var[8] */ ++ MCD_SET_VAR(taskTable+channel, 9, (u32)0x00000000); /* var[9] */ ++ MCD_SET_VAR(taskTable+channel, 10, (u32)0x0000ffff); /* var[10] */ ++ MCD_SET_VAR(taskTable+channel, 11, (u32)0x30000000); /* var[11] */ ++ MCD_SET_VAR(taskTable+channel, 12, (u32)0x0fffffff); /* var[12] */ ++ MCD_SET_VAR(taskTable+channel, 13, (u32)0x00000008); /* var[13] */ ++ MCD_SET_VAR(taskTable+channel, 24, (u32)0x00000000); /* inc[0] */ ++ MCD_SET_VAR(taskTable+channel, 25, (u32)0x60000000); /* inc[1] */ ++ MCD_SET_VAR(taskTable+channel, 26, (u32)0x20000004); /* inc[2] */ ++ MCD_SET_VAR(taskTable+channel, 27, (u32)0x40000000); /* inc[3] */ ++ /*enable the task*/ ++ MCD_dmaBar->taskControl[channel] |= (u16)0x8000; /* add a MACRO HERE TBD*/ ++ ++} ++ ++ ++/* ++ * Task 5 ++ */ ++ ++void MCD_startDmaENetXmit(char *bDBase, char *currBD, char *xmitFifoPtr, volatile TaskTableEntry *taskTable, int channel) ++{ ++ ++ MCD_SET_VAR(taskTable+channel, 0, (u32)bDBase); /* var[0] */ ++ MCD_SET_VAR(taskTable+channel, 3, (u32)currBD); /* var[3] */ ++ MCD_SET_VAR(taskTable+channel, 11, (u32)xmitFifoPtr); /* var[11] */ ++ MCD_SET_VAR(taskTable+channel, 1, (u32)0x00000000); /* var[1] */ ++ MCD_SET_VAR(taskTable+channel, 2, (u32)0x00000000); /* var[2] */ ++ MCD_SET_VAR(taskTable+channel, 4, (u32)0x00000000); /* var[4] */ ++ MCD_SET_VAR(taskTable+channel, 5, (u32)0x00000000); /* var[5] */ ++ MCD_SET_VAR(taskTable+channel, 6, (u32)0x00000000); /* var[6] */ ++ MCD_SET_VAR(taskTable+channel, 7, (u32)0x00000000); /* var[7] */ ++ MCD_SET_VAR(taskTable+channel, 8, (u32)0x00000000); /* var[8] */ ++ MCD_SET_VAR(taskTable+channel, 9, (u32)0x00000000); /* var[9] */ ++ MCD_SET_VAR(taskTable+channel, 10, (u32)0x00000000); /* var[10] */ ++ MCD_SET_VAR(taskTable+channel, 12, (u32)0x00000000); /* var[12] */ ++ MCD_SET_VAR(taskTable+channel, 13, (u32)0x0000ffff); /* var[13] */ ++ MCD_SET_VAR(taskTable+channel, 14, (u32)0xffffffff); /* var[14] */ ++ MCD_SET_VAR(taskTable+channel, 15, (u32)0x00000004); /* var[15] */ ++ MCD_SET_VAR(taskTable+channel, 16, (u32)0x00000008); /* var[16] */ ++ MCD_SET_VAR(taskTable+channel, 24, (u32)0x00000000); /* inc[0] */ ++ MCD_SET_VAR(taskTable+channel, 25, (u32)0x60000000); /* inc[1] */ ++ MCD_SET_VAR(taskTable+channel, 26, (u32)0x40000000); /* inc[2] */ ++ MCD_SET_VAR(taskTable+channel, 27, (u32)0xc000fffc); /* inc[3] */ ++ MCD_SET_VAR(taskTable+channel, 28, (u32)0xe0000004); /* inc[4] */ ++ MCD_SET_VAR(taskTable+channel, 29, (u32)0x80000000); /* inc[5] */ ++ MCD_SET_VAR(taskTable+channel, 30, (u32)0x4000ffff); /* inc[6] */ ++ MCD_SET_VAR(taskTable+channel, 31, (u32)0xe0000001); /* inc[7] */ ++ ++ /*enable the task*/ ++ MCD_dmaBar->taskControl[channel] |= (u16)0x8000; /* add a MACRO HERE TBD*/ ++ ++} +--- /dev/null ++++ b/drivers/dma/MCD_tasksInit.h +@@ -0,0 +1,73 @@ ++/********************************************************************* ++ * ++ * Copyright (C) 2004 Motorola, Inc. ++ * MOTOROLA, INC. All Rights Reserved. ++ * You are hereby granted a copyright license to use ++ * the SOFTWARE so long as this entire notice is ++ * retained without alteration in any modified and/or redistributed ++ * versions, and that such modified versions are clearly identified ++ * as such. No licenses are granted by implication, estoppel or ++ * otherwise under any patents or trademarks of Motorola, Inc. This ++ * software is provided on an "AS IS" basis and without warranty. ++ * ++ * To the maximum extent permitted by applicable law, MOTOROLA ++ * DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED, INCLUDING ++ * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR ++ * PURPOSE AND ANY WARRANTY AGAINST INFRINGEMENT WITH REGARD TO THE ++ * SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF) AND ANY ++ * ACCOMPANYING WRITTEN MATERIALS. ++ * ++ * To the maximum extent permitted by applicable law, IN NO EVENT ++ * SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER (INCLUDING ++ * WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS ++ * INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY ++ * LOSS) ARISING OF THE USE OR INABILITY TO USE THE SOFTWARE. ++ * ++ * Motorola assumes no responsibility for the maintenance and support ++ * of this software ++ ********************************************************************/ ++#ifndef MCD_TSK_INIT_H ++#define MCD_TSK_INIT_H 1 ++ ++/* ++ * Do not edit! ++ */ ++ ++ ++ ++/* ++ * Task 0 ++ */ ++void MCD_startDmaChainNoEu(int *currBD, short srcIncr, short destIncr, int xferSize, short xferSizeIncr, int *cSave, volatile TaskTableEntry *taskTable, int channel); ++ ++ ++/* ++ * Task 1 ++ */ ++void MCD_startDmaSingleNoEu(char *srcAddr, short srcIncr, char *destAddr, short destIncr, int dmaSize, int dmaSizeMXferSize, short xferSizeIncr, int flags, int *currBD, int *cSave, volatile TaskTableEntry *taskTable, int channel); ++ ++ ++/* ++ * Task 2 ++ */ ++void MCD_startDmaChainEu(int *currBD, short srcIncr, short destIncr, int xferSize, short xferSizeIncr, int *cSave, volatile TaskTableEntry *taskTable, int channel); ++ ++ ++/* ++ * Task 3 ++ */ ++void MCD_startDmaSingleEu(char *srcAddr, short srcIncr, char *destAddr, short destIncr, int dmaSize, int dmaSizeMXferSize, short xferSizeIncr, int flags, int *currBD, int *cSave, volatile TaskTableEntry *taskTable, int channel); ++ ++ ++/* ++ * Task 4 ++ */ ++void MCD_startDmaENetRcv(char *bDBase, char *currBD, char *rcvFifoPtr, volatile TaskTableEntry *taskTable, int channel); ++ ++ ++/* ++ * Task 5 ++ */ ++void MCD_startDmaENetXmit(char *bDBase, char *currBD, char *xmitFifoPtr, volatile TaskTableEntry *taskTable, int channel); ++ ++#endif /* MCD_TSK_INIT_H */ +--- a/drivers/dma/Makefile ++++ b/drivers/dma/Makefile +@@ -4,3 +4,5 @@ obj-$(CONFIG_INTEL_IOATDMA) += ioatdma.o + ioatdma-objs := ioat.o ioat_dma.o ioat_dca.o + obj-$(CONFIG_INTEL_IOP_ADMA) += iop-adma.o + obj-$(CONFIG_FSL_DMA) += fsldma.o ++obj-$(CONFIG_MCD_DMA) += mcddma.o ++mcddma-objs := MCD_dmaApi.o MCD_tasks.o MCD_tasksInit.o +--- a/drivers/net/Kconfig ++++ b/drivers/net/Kconfig +@@ -351,6 +351,8 @@ config MACB + + source "drivers/net/arm/Kconfig" + ++source "drivers/net/fec/Kconfig" ++ + config AX88796 + tristate "ASIX AX88796 NE2000 clone support" + depends on ARM || MIPS || SUPERH +--- a/drivers/net/Makefile ++++ b/drivers/net/Makefile +@@ -226,6 +226,8 @@ obj-$(CONFIG_ENC28J60) += enc28j60.o + + obj-$(CONFIG_MACB) += macb.o + ++obj-$(CONFIG_FEC_548x) += fec/ ++ + obj-$(CONFIG_ARM) += arm/ + obj-$(CONFIG_DEV_APPLETALK) += appletalk/ + obj-$(CONFIG_TR) += tokenring/ +--- /dev/null ++++ b/drivers/net/fec/Kconfig +@@ -0,0 +1,25 @@ ++config FEC_548x ++ tristate "MCF547x/MCF548x Fast Ethernet Controller support" ++ depends on M547X_8X ++ help ++ The MCF547x and MCF548x have a built-in Fast Ethernet Controller. ++ Saying Y here will include support for this device in the kernel. ++ ++ To compile this driver as a module, choose M here: the module ++ will be called fecm. ++ ++config FEC_548x_AUTO_NEGOTIATION ++ bool "Enable Auto-Negotiation" ++ depends on FEC_548x ++ help ++ This option enables the FEC to automatically detect the ++ half/full duplex mode and the network speed at initialization ++ If you want this, say Y. ++ ++config FEC_548x_ENABLE_FEC2 ++ bool "Enable the second FEC" ++ depends on FEC_548x ++ help ++ This enables the second FEC on the 547x/548x. If you want to use ++ it, say Y. ++ +--- /dev/null ++++ b/drivers/net/fec/Makefile +@@ -0,0 +1,7 @@ ++# ++# Makefile for the FEC ethernet driver ++# ++ ++obj-$(CONFIG_FEC_548x) += fecm.o ++ ++fecm-objs := fec.o ks8721.o +--- /dev/null ++++ b/drivers/net/fec/fec.c +@@ -0,0 +1,1375 @@ ++/* ++ * Performance and stability improvements: (C) Copyright 2008, ++ * Daniel Krueger, SYSTEC electronic GmbH ++ * ++ * Code crunched to get it to work on 2.6.24 -- FEC cleanup coming ++ * soon -- Kurt Mahan ++ * ++ */ ++#include <linux/module.h> ++#include <linux/kernel.h> ++#include <linux/string.h> ++#include <linux/ptrace.h> ++#include <linux/errno.h> ++#include <linux/ioport.h> ++#include <linux/slab.h> ++#include <linux/interrupt.h> ++#include <linux/pci.h> ++#include <linux/init.h> ++#include <linux/delay.h> ++#include <linux/netdevice.h> ++#include <linux/etherdevice.h> ++#include <linux/skbuff.h> ++#include <linux/spinlock.h> ++#include <linux/workqueue.h> ++#include <linux/bitops.h> ++ ++#include <asm/coldfire.h> ++#include <asm/mcfsim.h> ++ ++#include <asm/dma.h> ++#include <asm/MCD_dma.h> ++#include <asm/m5485sram.h> ++#include <asm/virtconvert.h> ++#include <asm/irq.h> ++ ++#include "fec.h" ++#include "ks8721.h" ++ ++#ifdef CONFIG_FEC_548x_ENABLE_FEC2 ++#define FEC_MAX_PORTS 2 ++#define FEC_2 ++#else ++#define FEC_MAX_PORTS 1 ++#undef FEC_2 ++#endif ++ ++#define VERSION "0.13" ++MODULE_DESCRIPTION( "DMA Fast Ethernet Controller driver ver " VERSION); ++ ++// Private structure ++struct fec_priv { ++ struct net_device *netdev; /* owning net device */ ++ void* fecpriv_txbuf[FEC_TX_BUF_NUMBER]; //Array of transmission buffers ++ MCD_bufDescFec *fecpriv_txdesc; // Array of transmission descriptors ++ volatile unsigned int fecpriv_current_tx; // Inex of the transmission descriptor that is used by DMA ++ volatile unsigned int fecpriv_next_tx; // Inex of the transmission descriptor that can be used for new data ++ unsigned int fecpriv_current_rx; // Index of the reception descriptor that is used by DMA ++ MCD_bufDescFec *fecpriv_rxdesc; // Array of reception descriptors ++// unsigned char *fecpriv_rxbuf; // Address of reception buffers ++ struct sk_buff *askb_rx[FEC_RX_BUF_NUMBER]; // Array of reception skb structure pointers ++ unsigned int fecpriv_initiator_rx; // Reception DMA initiator ++ unsigned int fecpriv_initiator_tx; // Transmission DMA initiator ++ int fecpriv_fec_rx_channel; // DMA reception channel ++ int fecpriv_fec_tx_channel; // DMA transmission channel ++ int fecpriv_rx_requestor; // DMA reception requestor ++ int fecpriv_tx_requestor; // DMA transmission requestor ++ void *fecpriv_interrupt_fec_rx_handler; // DMA reception handler ++ void *fecpriv_interrupt_fec_tx_handler; // DMA transmission handler ++ unsigned char *fecpriv_mac_addr; // Private copy of FEC address ++ struct net_device_stats fecpriv_stat; // Pointer to the statistical information ++ spinlock_t fecpriv_lock; ++ int fecpriv_rxflag; ++ struct tasklet_struct fecpriv_tasklet_reinit; ++ int index; ++}; ++ ++struct net_device *fec_dev[FEC_MAX_PORTS]; ++ ++// FEC functions ++int __init fec_init(void); ++struct net_device_stats *fec_get_stat(struct net_device *dev); ++ ++int fec_open(struct net_device *dev); ++int fec_close(struct net_device *nd); ++int fec_tx(struct sk_buff *skb, struct net_device *dev); ++void fec_set_multicast_list(struct net_device *nd); ++int fec_set_mac_address(struct net_device *dev, void *p); ++void fec_tx_timeout(struct net_device *dev); ++void fec_interrupt_fec_tx_handler(struct net_device *dev); ++void fec_interrupt_fec_rx_handler(struct net_device *dev); ++irqreturn_t fec_interrupt_handler(int irq, void *dev_id); ++void fec_interrupt_fec_tx_handler_fec0(void); ++void fec_interrupt_fec_rx_handler_fec0(void); ++void fec_interrupt_fec_reinit(unsigned long data); ++ ++unsigned char fec_mac_addr_fec0[6] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x50 }; // Default address of FEC0 ++ ++#ifdef FEC_2 ++unsigned char fec_mac_addr_fec1[6] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x51 }; // Default address of FEC1 ++#endif ++ ++#ifndef MODULE ++int fec_str_to_mac( char *str_mac, unsigned char* addr); ++int __init fec_mac_setup0 (char *s); ++#endif ++ ++ ++#ifdef FEC_2 ++void fec_interrupt_fec_tx_handler_fec1(void); ++void fec_interrupt_fec_rx_handler_fec1(void); ++ ++#ifndef MODULE ++int __init fec_mac_setup1 (char *s); ++#endif ++ ++#endif ++int fec_read_mii(unsigned int base_addr, unsigned int pa, unsigned int ra, unsigned int *data); ++int fec_write_mii(unsigned int base_addr, unsigned int pa, unsigned int ra, unsigned int data); ++ ++module_init(fec_init); ++/* module_exit(fec_cleanup); */ ++__setup("mac0=", fec_mac_setup0); ++ ++#ifdef FEC_2 ++__setup("mac1=", fec_mac_setup1); ++#endif ++ ++/* ++ * Initialize a FEC device ++ */ ++int fec_enet_init(struct net_device *dev) ++{ ++ static int index = 0; ++ struct fec_priv *fp = netdev_priv(dev); ++ int i; ++ ++ fp->index = index; ++ fp->netdev = dev; ++ fec_dev[ index ] = dev; ++printk(KERN_INFO "FEI: index=%d\n", index); ++ ++ if (index == 0) { ++ /* disable fec0 */ ++ FEC_ECR(FEC_BASE_ADDR_FEC0) = FEC_ECR_DISABLE; ++ ++ /* setup the interrupt handler */ ++ dev->irq = 64 + ISC_FEC0; ++ ++ if (request_irq(dev->irq, fec_interrupt_handler, ++ IRQF_DISABLED, "ColdFire FEC 0", dev)) { ++ dev->irq = 0; ++ printk("Cannot allocate FEC0 IRQ\n"); ++ } else { ++ /* interrupt priority and level */ ++ MCF_ICR(ISC_FEC0) = ILP_FEC0; ++ } ++ ++ /* fec base address */ ++ dev->base_addr = FEC_BASE_ADDR_FEC0; ++ ++ /* requestor numbers */ ++ fp->fecpriv_rx_requestor = DMA_FEC0_RX; ++ fp->fecpriv_tx_requestor = DMA_FEC0_TX; ++ ++ /* fec0 handlers */ ++ fp->fecpriv_interrupt_fec_rx_handler = fec_interrupt_fec_rx_handler_fec0; ++ fp->fecpriv_interrupt_fec_tx_handler = fec_interrupt_fec_tx_handler_fec0; ++ ++ /* tx descriptors */ ++ fp->fecpriv_txdesc = (void*)FEC_TX_DESC_FEC0; ++ ++ /* rx descriptors */ ++ fp->fecpriv_rxdesc = (void*)FEC_RX_DESC_FEC0; ++ ++printk(KERN_INFO "FEI: txdesc=0x%p rxdesc=0x%p\n", fp->fecpriv_txdesc, fp->fecpriv_rxdesc); ++ ++ /* mac addr */ ++ fp->fecpriv_mac_addr = fec_mac_addr_fec0; ++ } ++ else { ++ /* disable fec1 */ ++ FEC_ECR(FEC_BASE_ADDR_FEC1) = FEC_ECR_DISABLE; ++#ifdef FEC_2 ++ /* setup the interrupt handler */ ++ dev->irq = 64 + ISC_FEC1; ++ ++ if (request_irq(dev->irq, fec_interrupt_handler, ++ IRQF_DISABLED, "ColdFire FEC 1", dev)) { ++ dev->irq = 0; ++ printk("Cannot allocate FEC1 IRQ\n"); ++ } else { ++ /* interrupt priority and level */ ++ MCF_ICR(ISC_FEC1) = ILP_FEC1; ++ } ++ ++ /* fec base address */ ++ dev->base_addr = FEC_BASE_ADDR_FEC1; ++ ++ /* requestor numbers */ ++ fp->fecpriv_rx_requestor = DMA_FEC1_RX; ++ fp->fecpriv_tx_requestor = DMA_FEC1_TX; ++ ++ /* fec1 handlers */ ++ fp->fecpriv_interrupt_fec_rx_handler = fec_interrupt_fec_rx_handler_fec1; ++ fp->fecpriv_interrupt_fec_tx_handler = fec_interrupt_fec_tx_handler_fec1; ++ ++ /* tx descriptors */ ++ fp->fecpriv_txdesc = (void*)FEC_TX_DESC_FEC1; ++ ++ /* rx descriptors */ ++ fp->fecpriv_rxdesc = (void*)FEC_RX_DESC_FEC1; ++ ++ /* mac addr */ ++ fp->fecpriv_mac_addr = fec_mac_addr_fec1; ++#endif ++ } ++ ++printk(KERN_INFO "FEI: index=%d base_addr=0x%lx\n", index, dev->base_addr); ++ ++ /* clear MIB */ ++ memset((void *) (dev->base_addr + 0x200), 0, FEC_MIB_LEN); ++ ++ /* clear the statistics structure */ ++ memset((void *) &(fp->fecpriv_stat), 0, ++ sizeof(struct net_device_stats)); ++ ++ /* grab the FEC initiators */ ++ dma_set_initiator(fp->fecpriv_tx_requestor); ++ fp->fecpriv_initiator_tx = dma_get_initiator(fp->fecpriv_tx_requestor); ++ dma_set_initiator(fp->fecpriv_rx_requestor); ++ fp->fecpriv_initiator_rx = dma_get_initiator(fp->fecpriv_rx_requestor); ++ ++ /* reset the DMA channels */ ++ fp->fecpriv_fec_rx_channel = -1; ++ fp->fecpriv_fec_tx_channel = -1; ++ ++ for (i = 0; i < FEC_RX_BUF_NUMBER; i++) ++ fp->askb_rx[i] = NULL; ++ ++ /* initialize the pointers to the socket buffers */ ++ for (i = 0; i < FEC_TX_BUF_NUMBER; i++) ++ fp->fecpriv_txbuf[i] = NULL; ++ ++ ether_setup(dev); ++ ++ dev->open = fec_open; ++ dev->stop = fec_close; ++ dev->hard_start_xmit = fec_tx; ++ dev->get_stats = fec_get_stat; ++ dev->set_multicast_list = fec_set_multicast_list; ++ dev->set_mac_address = fec_set_mac_address; ++ dev->tx_timeout = fec_tx_timeout; ++ dev->watchdog_timeo = FEC_TX_TIMEOUT * HZ; ++ ++ memcpy(dev->dev_addr, fp->fecpriv_mac_addr, ETH_ALEN); ++ ++ spin_lock_init(&fp->fecpriv_lock); ++ ++ // Initialize FEC/I2C/IRQ Pin Assignment Register ++ FEC_GPIO_PAR_FECI2CIRQ &= 0xF; ++ FEC_GPIO_PAR_FECI2CIRQ |= FEC_FECI2CIRQ; ++ ++ index++; ++ return 0; ++} ++ ++/* ++ * Module Initialization ++ */ ++int __init fec_init(void) ++{ ++ struct net_device *dev; ++ int i; ++ int err; ++ DECLARE_MAC_BUF(mac); ++ ++ printk(KERN_INFO "FEC ENET (DMA) Version .00\n"); ++ ++ ++ for (i = 0; i < FEC_MAX_PORTS; i++) { ++ dev = alloc_etherdev(sizeof(struct fec_priv)); ++ if (!dev) ++ return -ENOMEM; ++ err = fec_enet_init(dev); ++ if (err) { ++ free_netdev(dev); ++ continue; ++ } ++ if (register_netdev(dev) != 0) { ++ free_netdev(dev); ++ return -EIO; ++ } ++ ++ printk(KERN_INFO "%s: ethernet %s\n", ++ dev->name, print_mac(mac, dev->dev_addr)); ++ } ++ return 0; ++} ++ ++/* ++ * Stop a device ++ */ ++void fec_stop(struct net_device *dev) ++{ ++ struct fec_priv *fp = netdev_priv(dev); ++ ++ dma_remove_initiator(fp->fecpriv_initiator_tx); ++ dma_remove_initiator(fp->fecpriv_initiator_rx); ++ ++ if (dev->irq) ++ free_irq(dev->irq, dev); ++} ++ ++/************************************************************************ ++* NAME: fec_open ++* ++* DESCRIPTION: This function performs the initialization of ++* of FEC and corresponding KS8721 transiver ++* ++* RETURNS: If no error occurs, this function returns zero. ++*************************************************************************/ ++ ++int fec_open(struct net_device *dev) ++{ ++ struct fec_priv *fp = netdev_priv(dev); ++ unsigned long base_addr = (unsigned long) dev->base_addr; ++ int fduplex; ++ int i; ++ int channel; ++ int error_code = -EBUSY; ++ ++printk(KERN_INFO "FECOPEN: index=%d\n", fp->index); ++ ++ //Receive the DMA channels ++ channel = dma_set_channel_fec(fp->fecpriv_rx_requestor); ++ ++ if (channel == -1) ++ { ++ printk("Dma channel cannot be reserved\n"); ++ goto ERRORS; ++ } ++ ++ fp->fecpriv_fec_rx_channel = channel; ++ ++ dma_connect(channel, (int) fp->fecpriv_interrupt_fec_rx_handler); ++ ++ channel = dma_set_channel_fec(fp->fecpriv_tx_requestor); ++ ++ if (channel == -1) ++ { ++ printk("Dma channel cannot be reserved\n"); ++ goto ERRORS; ++ } ++printk(KERN_INFO "FECOPEN2\n"); ++ ++ fp->fecpriv_fec_tx_channel = channel; ++ ++ dma_connect(channel, (int) fp->fecpriv_interrupt_fec_tx_handler); ++ ++ // init tasklet for controller reinitialization ++ tasklet_init(&fp->fecpriv_tasklet_reinit, fec_interrupt_fec_reinit, (unsigned long) dev); ++printk(KERN_INFO "FECOPEN3\n"); ++ ++ // Reset FIFOs ++ FEC_FECFRST(base_addr) |= FEC_SW_RST | FEC_RST_CTL; ++ FEC_FECFRST(base_addr) &= ~FEC_SW_RST; ++ ++ // Reset and disable FEC ++ FEC_ECR(base_addr) = FEC_ECR_RESET; ++ ++ // Wait ++ udelay(10); ++ ++ // Clear all events ++ FEC_EIR(base_addr) = FEC_EIR_CLEAR; ++ ++ // Reset FIFO status ++ FEC_FECTFSR(base_addr) = FEC_FECTFSR_MSK; ++ FEC_FECRFSR(base_addr) = FEC_FECRFSR_MSK; ++ ++#if 0 ++/* JKM -- move into HW init */ ++ // Copy the default address to the device structure ++ memcpy(dev->dev_addr, fp->fecpriv_mac_addr, ETH_ALEN); ++#endif ++ ++ // Set the default address ++ FEC_PALR(base_addr) = (fp->fecpriv_mac_addr[0] << 24) | (fp->fecpriv_mac_addr[1] << 16) | (fp->fecpriv_mac_addr[2] << 8) | fp->fecpriv_mac_addr[3]; ++ FEC_PAUR(base_addr) = (fp->fecpriv_mac_addr[4] << 24) | (fp->fecpriv_mac_addr[5] << 16) | 0x8808; ++ ++ // Reset the group address descriptor ++ FEC_GALR(base_addr) = 0x00000000; ++ FEC_GAUR(base_addr) = 0x00000000; ++ ++ // Reset the individual address descriptor ++ FEC_IALR(base_addr) = 0x00000000; ++ FEC_IAUR(base_addr) = 0x00000000; ++ ++ // Set the receive control register ++ FEC_RCR(base_addr) = FEC_RCR_MAX_FRM_SIZE | FEC_RCR_MII; ++ ++ // Set the receive FIFO control register ++// FEC_FECRFCR(base_addr) = FEC_FECRFCR_FRM | FEC_FECRFCR_GR | FEC_FECRFCR_MSK; ++ FEC_FECRFCR(base_addr) = FEC_FECRFCR_FRM | FEC_FECRFCR_GR ++ | (FEC_FECRFCR_MSK // disable all but ... ++ & ~FEC_FECRFCR_FAE // enable frame accept error ++ & ~FEC_FECRFCR_RXW // enable receive wait condition ++// & ~FEC_FECRFCR_UF // enable FIFO underflow ++ ); ++ ++ //Set the receive FIFO alarm register ++ FEC_FECRFAR(base_addr) = FEC_FECRFAR_ALARM; ++ ++ // Set the transmit FIFO control register ++// FEC_FECTFCR(base_addr) = FEC_FECTFCR_FRM | FEC_FECTFCR_GR | FEC_FECTFCR_MSK; ++ FEC_FECTFCR(base_addr) = FEC_FECTFCR_FRM | FEC_FECTFCR_GR ++ | (FEC_FECTFCR_MSK // disable all but ... ++ & ~FEC_FECTFCR_FAE // enable frame accept error ++// & ~FEC_FECTFCR_TXW // enable transmit wait condition ++// & ~FEC_FECTFCR_UF // enable FIFO underflow ++ & ~FEC_FECTFCR_OF); // enable FIFO overflow ++ ++ //Set the transmit FIFO alarm register ++ FEC_FECTFAR(base_addr) = FEC_FECTFAR_ALARM; ++ ++ // Set the Tx FIFO watermark ++ FEC_FECTFWR(base_addr) = FEC_FECTFWR_XWMRK; ++ ++ // Enable the transmitter to append the CRC ++ FEC_CTCWR(base_addr) = FEC_CTCWR_TFCW_CRC; ++ ++ // Enable the ethernet interrupts ++// FEC_EIMR(base_addr) = FEC_EIMR_MASK; ++ FEC_EIMR(base_addr) = FEC_EIMR_DISABLE ++ | FEC_EIR_LC ++ | FEC_EIR_RL ++ | FEC_EIR_HBERR ++ | FEC_EIR_XFUN ++ | FEC_EIR_XFERR ++ | FEC_EIR_RFERR ++ ; ++printk(KERN_INFO "FECOPEN4\n"); ++ ++#ifdef CONFIG_FEC_548x_AUTO_NEGOTIATION ++ if ((error_code = init_transceiver(base_addr, &fduplex)) != 0) ++ { ++ printk("Initialization of the transceiver is failed\n"); ++ goto ERRORS; ++ } ++#else ++ fduplex = 1; ++#endif ++printk(KERN_INFO "FECOPEN5\n"); ++ ++ if (fduplex) ++ // Enable the full duplex mode ++ FEC_TCR(base_addr) = FEC_TCR_FDEN | FEC_TCR_HBC; ++ else ++ // Disable reception of frames while transmitting ++ FEC_RCR(base_addr) |= FEC_RCR_DRT; ++ ++ // Enable MIB ++ FEC_MIBC(base_addr) = FEC_MIBC_ENABLE; ++ ++ // Enable FEC ++ FEC_ECR(base_addr) |= FEC_ECR_ETHEREN; ++ ++ // Initialize transmission descriptors and start DMA for the transmission ++ for (i = 0; i < FEC_TX_BUF_NUMBER; i++) ++ fp->fecpriv_txdesc[i].statCtrl = MCD_FEC_INTERRUPT; ++printk(KERN_INFO "FECOPEN6\n"); ++ ++ fp->fecpriv_txdesc[i - 1].statCtrl |= MCD_FEC_WRAP; ++ ++ fp->fecpriv_current_tx = fp->fecpriv_next_tx = 0; ++ ++ MCD_startDma(fp->fecpriv_fec_tx_channel, (char *) fp->fecpriv_txdesc, 0, ++ (unsigned char *) &(FEC_FECTFDR(base_addr)), 0, ++ FEC_MAX_FRM_SIZE, 0, fp->fecpriv_initiator_tx, ++ FEC_TX_DMA_PRI, MCD_FECTX_DMA | MCD_INTERRUPT, ++ MCD_NO_CSUM | MCD_NO_BYTE_SWAP); ++ ++ // Initialize reception descriptors and start DMA for the reception ++ for (i = 0; i < FEC_RX_BUF_NUMBER; i++) ++ { ++ fp->askb_rx[i] = alloc_skb(FEC_MAXBUF_SIZE + 16, GFP_DMA); ++ if (!fp->askb_rx[i]) ++ { ++ fp->fecpriv_rxdesc[i].dataPointer = 0; ++ fp->fecpriv_rxdesc[i].statCtrl = 0; ++ fp->fecpriv_rxdesc[i].length = 0; ++ } ++ else ++ { ++ skb_reserve(fp->askb_rx[i], 16); ++ fp->askb_rx[i]->dev = dev; ++ fp->fecpriv_rxdesc[i].dataPointer = (unsigned int) virt_to_phys(fp->askb_rx[i]->tail); ++ fp->fecpriv_rxdesc[i].statCtrl = MCD_FEC_BUF_READY | MCD_FEC_INTERRUPT; ++ fp->fecpriv_rxdesc[i].length = FEC_MAXBUF_SIZE; ++ } ++ } ++printk(KERN_INFO "FECOPEN7\n"); ++ ++ fp->fecpriv_rxdesc[i - 1].statCtrl |= MCD_FEC_WRAP; ++ fp->fecpriv_current_rx = 0; ++ ++ // flush entire data cache before restarting the DMA ++#if 0 ++/* JKM -- currently running with cache turned off */ ++ DcacheFlushInvalidate(); ++#endif ++ ++ MCD_startDma(fp->fecpriv_fec_rx_channel, (char *) fp->fecpriv_rxdesc, 0, ++ (unsigned char *) &(FEC_FECRFDR(base_addr)), 0, ++ FEC_MAX_FRM_SIZE, 0, fp->fecpriv_initiator_rx, ++ FEC_RX_DMA_PRI, MCD_FECRX_DMA | MCD_INTERRUPT, ++ MCD_NO_CSUM | MCD_NO_BYTE_SWAP); ++ ++ netif_start_queue(dev); ++ ++// MOD_INC_USE_COUNT; ++printk(KERN_INFO "FECOPEN: finished\n"); ++ ++ return 0; ++ ++ERRORS: ++ ++ // Remove the channels and return with the error code ++ if (fp->fecpriv_fec_rx_channel != -1) ++ { ++ dma_disconnect(fp->fecpriv_fec_rx_channel); ++ dma_remove_channel_by_number(fp->fecpriv_fec_rx_channel); ++ fp->fecpriv_fec_rx_channel = -1; ++ } ++ ++ if (fp->fecpriv_fec_tx_channel != -1) ++ { ++ dma_disconnect(fp->fecpriv_fec_tx_channel); ++ dma_remove_channel_by_number(fp->fecpriv_fec_tx_channel); ++ fp->fecpriv_fec_tx_channel = -1; ++ } ++ ++ return error_code; ++ ++} ++ ++/************************************************************************ ++* NAME: fec_close ++* ++* DESCRIPTION: This function performs the graceful stop of the ++* transmission and disables FEC ++* ++* RETURNS: This function always returns zero. ++*************************************************************************/ ++int fec_close(struct net_device *dev) ++{ ++ //Receive the pointer to the private structure ++ struct fec_priv *fp = netdev_priv(dev); ++ ++ // Receive the base address ++ unsigned long base_addr = (unsigned long) dev->base_addr; ++ ++ unsigned long time; ++ ++ int i; ++ ++ netif_stop_queue(dev); ++ ++ // Perform the graceful stop ++ FEC_TCR(base_addr) |= FEC_TCR_GTS; ++ ++ time = jiffies; ++ ++ // Wait for the graceful stop ++ while (!(FEC_EIR(base_addr) & FEC_EIR_GRA) && jiffies - time < FEC_GR_TIMEOUT * HZ) ++ schedule(); ++ ++ // Disable FEC ++ FEC_ECR(base_addr) = FEC_ECR_DISABLE; ++ ++ // Reset the DMA channels ++ spin_lock_irq(&fp->fecpriv_lock); ++ MCD_killDma(fp->fecpriv_fec_tx_channel); ++ spin_unlock_irq(&fp->fecpriv_lock); ++ dma_remove_channel_by_number(fp->fecpriv_fec_tx_channel); ++ dma_disconnect(fp->fecpriv_fec_tx_channel); ++ fp->fecpriv_fec_tx_channel = -1; ++ ++ for (i = 0; i < FEC_TX_BUF_NUMBER; i++) ++ if (fp->fecpriv_txbuf[i]) ++ { ++ kfree(fp->fecpriv_txbuf[i]); ++ fp->fecpriv_txbuf[i] = NULL; ++ } ++ ++ spin_lock_irq(&fp->fecpriv_lock); ++ MCD_killDma(fp->fecpriv_fec_rx_channel); ++ spin_unlock_irq(&fp->fecpriv_lock); ++ ++ dma_remove_channel_by_number(fp->fecpriv_fec_rx_channel); ++ dma_disconnect(fp->fecpriv_fec_rx_channel); ++ fp->fecpriv_fec_rx_channel = -1; ++ ++ for (i = 0; i < FEC_RX_BUF_NUMBER; i++) ++ { ++ if (fp->askb_rx[i]) ++ { ++ kfree_skb(fp->askb_rx[i]); ++ fp->askb_rx[i] = NULL; ++ } ++ } ++// MOD_DEC_USE_COUNT; ++ ++ return 0; ++} ++ ++/************************************************************************ ++* +NAME: fec_get_stat ++* ++* RETURNS: This function returns the statistical information. ++*************************************************************************/ ++struct net_device_stats * fec_get_stat(struct net_device *dev) ++{ ++ ++ //Receive the pointer to the private structure ++ struct fec_priv *fp = netdev_priv(dev); ++ ++ // Receive the base address ++ unsigned long base_addr = dev->base_addr; ++ ++ // Receive the statistical information ++ fp->fecpriv_stat.rx_packets = FECSTAT_RMON_R_PACKETS(base_addr); ++ fp->fecpriv_stat.tx_packets = FECSTAT_RMON_T_PACKETS(base_addr); ++ fp->fecpriv_stat.rx_bytes = FECSTAT_RMON_R_OCTETS(base_addr); ++ fp->fecpriv_stat.tx_bytes = FECSTAT_RMON_T_OCTETS(base_addr); ++ ++ fp->fecpriv_stat.multicast = FECSTAT_RMON_R_MC_PKT(base_addr); ++ fp->fecpriv_stat.collisions = FECSTAT_RMON_T_COL(base_addr); ++ ++ fp->fecpriv_stat.rx_length_errors = FECSTAT_RMON_R_UNDERSIZE(base_addr) + FECSTAT_RMON_R_OVERSIZE(base_addr) + FECSTAT_RMON_R_FRAG(base_addr) + FECSTAT_RMON_R_JAB(base_addr); ++ fp->fecpriv_stat.rx_crc_errors = FECSTAT_IEEE_R_CRC(base_addr); ++ fp->fecpriv_stat.rx_frame_errors = FECSTAT_IEEE_R_ALIGN(base_addr); ++ fp->fecpriv_stat.rx_over_errors = FECSTAT_IEEE_R_MACERR(base_addr); ++ ++ fp->fecpriv_stat.tx_carrier_errors = FECSTAT_IEEE_T_CSERR(base_addr); ++ fp->fecpriv_stat.tx_fifo_errors = FECSTAT_IEEE_T_MACERR(base_addr); ++ fp->fecpriv_stat.tx_window_errors = FECSTAT_IEEE_T_LCOL(base_addr); ++ ++ // I hope that one frame doesn't have more than one error ++ fp->fecpriv_stat.rx_errors = fp->fecpriv_stat.rx_length_errors + fp->fecpriv_stat.rx_crc_errors + fp->fecpriv_stat.rx_frame_errors + fp->fecpriv_stat.rx_over_errors + fp->fecpriv_stat.rx_dropped; ++ fp->fecpriv_stat.tx_errors = fp->fecpriv_stat.tx_carrier_errors + fp->fecpriv_stat.tx_fifo_errors + fp->fecpriv_stat.tx_window_errors + fp->fecpriv_stat.tx_aborted_errors + fp->fecpriv_stat.tx_heartbeat_errors + fp->fecpriv_stat.tx_dropped; ++ ++ return &fp->fecpriv_stat; ++} ++ ++/************************************************************************ ++* NAME: fec_set_multicast_list ++* ++* DESCRIPTION: This function sets the frame filtering parameters ++*************************************************************************/ ++void fec_set_multicast_list(struct net_device *dev) ++{ ++ // Pointer to the address list ++ struct dev_mc_list *dmi; ++ ++ unsigned int crc, data; ++ int i, j, k; ++ ++ // Receive the base address ++ unsigned long base_addr = (unsigned long) dev->base_addr; ++ ++ if (dev->flags & IFF_PROMISC || dev->flags & IFF_ALLMULTI) ++ { ++ // Allow all incoming frames ++ FEC_GALR(base_addr) = 0xFFFFFFFF; ++ FEC_GAUR(base_addr) = 0xFFFFFFFF; ++ return; ++ } ++ // Reset the group address register ++ FEC_GALR(base_addr) = 0x00000000; ++ FEC_GAUR(base_addr) = 0x00000000; ++ ++ // Process all addresses ++ for (i = 0, dmi = dev->mc_list; i < dev->mc_count; i++, dmi = dmi->next) ++ { ++ // Processing must be only for the group addresses ++ if (!(dmi->dmi_addr[0] & 1)) ++ continue; ++ ++ // Calculate crc value for the current address ++ crc = 0xFFFFFFFF; ++ for (j = 0; j < dmi->dmi_addrlen; j++) ++ { ++ ++ for (k = 0, data = dmi->dmi_addr[j]; k < 8; k++, data >>= 1) ++ { ++ if ((crc ^ data) & 1) ++ crc = (crc >> 1) ^ FEC_CRCPOL; ++ else ++ crc >>= 1; ++ ++ } ++ ++ } ++ ++ // Add this value ++ crc >>= 26; ++ crc &= 0x3F; ++ if (crc > 31) ++ FEC_GAUR(base_addr) |= 0x1 << (crc - 32); ++ else ++ FEC_GALR(base_addr) |= 0x1 << crc; ++ ++ } ++ ++} ++ ++/************************************************************************ ++* NAME: fec_set_mac_address ++* ++* DESCRIPTION: This function sets the MAC address ++*************************************************************************/ ++int fec_set_mac_address(struct net_device *dev, void *p) ++{ ++ //Receive the pointer to the private structure ++ struct fec_priv *fp = netdev_priv(dev); ++ ++ // Receive the base address ++ unsigned long base_addr = (unsigned long) dev->base_addr; ++ ++ struct sockaddr *addr = p; ++ ++ if (netif_running(dev)) ++ return -EBUSY; ++ ++ // Copy a new address to the device structure ++ memcpy(dev->dev_addr, addr->sa_data, dev->addr_len); ++ ++ // Copy a new address to the private structure ++ memcpy(fp->fecpriv_mac_addr, addr->sa_data, 6); ++ ++ // Set the address to the registers ++ FEC_PALR(base_addr) = (fp->fecpriv_mac_addr[0] << 24) | (fp->fecpriv_mac_addr[1] << 16) | (fp->fecpriv_mac_addr[2] << 8) | fp->fecpriv_mac_addr[3]; ++ FEC_PAUR(base_addr) = (fp->fecpriv_mac_addr[4] << 24) | (fp->fecpriv_mac_addr[5] << 16) | 0x8808; ++ ++ return 0; ++} ++ ++/************************************************************************ ++* NAME: fec_tx ++* ++* DESCRIPTION: This function starts transmission of the frame using DMA ++* ++* RETURNS: This function always returns zero. ++*************************************************************************/ ++int fec_tx(struct sk_buff *skb, struct net_device *dev) ++{ ++ ++ //Receive the pointer to the private structure ++ struct fec_priv *fp = netdev_priv(dev); ++ ++ void *data, *data_aligned; ++ int offset; ++ ++printk(KERN_INFO "fec_tx\n"); ++ data = kmalloc(skb->len + 15, GFP_DMA | GFP_ATOMIC); ++ ++ if (!data) ++ { ++ fp->fecpriv_stat.tx_dropped++; ++ dev_kfree_skb(skb); ++ return 0; ++ } ++ ++ offset = (((unsigned long)virt_to_phys(data) + 15) & 0xFFFFFFF0) - (unsigned long)virt_to_phys(data); ++ data_aligned = (void*)((unsigned long)data + offset); ++ memcpy(data_aligned, skb->data, skb->len); ++ ++ // flush data cache before initializing the descriptor and starting DMA ++#if 0 ++/* JKM -- currently running with cache turned off */ ++ DcacheFlushInvalidateCacheBlock((void*)virt_to_phys(data_aligned), skb->len); ++#endif ++ ++ spin_lock_irq(&fp->fecpriv_lock); ++ ++ // Initialize the descriptor ++ fp->fecpriv_txbuf[fp->fecpriv_next_tx] = data; ++ fp->fecpriv_txdesc[fp->fecpriv_next_tx].dataPointer = (unsigned int) virt_to_phys(data_aligned); ++ fp->fecpriv_txdesc[fp->fecpriv_next_tx].length = skb->len; ++ fp->fecpriv_txdesc[fp->fecpriv_next_tx].statCtrl |= (MCD_FEC_END_FRAME | MCD_FEC_BUF_READY); ++ fp->fecpriv_next_tx = (fp->fecpriv_next_tx + 1) & FEC_TX_INDEX_MASK; ++ ++ if (fp->fecpriv_txbuf[fp->fecpriv_current_tx] && fp->fecpriv_current_tx == fp->fecpriv_next_tx) ++ netif_stop_queue(dev); ++ ++ spin_unlock_irq(&fp->fecpriv_lock); ++ ++ // Tell the DMA to continue the transmission ++ MCD_continDma(fp->fecpriv_fec_tx_channel); ++ ++ dev_kfree_skb(skb); ++ ++ dev->trans_start = jiffies; ++ ++ return 0; ++} ++ ++/************************************************************************ ++* NAME: fec_tx_timeout ++* ++* DESCRIPTION: If the interrupt processing of received frames was lost ++* and DMA stopped the reception, this function clears ++* the transmission descriptors and starts DMA ++* ++*************************************************************************/ ++void fec_tx_timeout(struct net_device *dev) ++{ ++ int i; ++ struct fec_priv *fp = netdev_priv(dev); ++ unsigned long base_addr = (unsigned long) dev->base_addr; ++ ++printk(KERN_INFO "fec_tx_timeout\n"); ++ spin_lock_irq(&fp->fecpriv_lock); ++ MCD_killDma(fp->fecpriv_fec_tx_channel); ++ for (i = 0; i < FEC_TX_BUF_NUMBER; i++) ++ { ++ if (fp->fecpriv_txbuf[i]) ++ { ++ ++ kfree(fp->fecpriv_txbuf[i]); ++ fp->fecpriv_txbuf[i] = NULL; ++ ++ } ++ fp->fecpriv_txdesc[i].statCtrl = MCD_FEC_INTERRUPT; ++ } ++ fp->fecpriv_txdesc[i - 1].statCtrl |= MCD_FEC_WRAP; ++ ++ fp->fecpriv_current_tx = fp->fecpriv_next_tx = 0; ++ ++ // Reset FIFOs ++ FEC_FECFRST(base_addr) |= FEC_SW_RST; ++ FEC_FECFRST(base_addr) &= ~FEC_SW_RST; ++ ++ // Reset and disable FEC ++// FEC_ECR(base_addr) = FEC_ECR_RESET; ++ ++ // Enable FEC ++ FEC_ECR(base_addr) |= FEC_ECR_ETHEREN; ++ ++ MCD_startDma(fp->fecpriv_fec_tx_channel, (char *) fp->fecpriv_txdesc, 0, ++ (unsigned char *) &(FEC_FECTFDR(base_addr)), 0, ++ FEC_MAX_FRM_SIZE, 0, fp->fecpriv_initiator_tx, ++ FEC_TX_DMA_PRI, MCD_FECTX_DMA | MCD_INTERRUPT, ++ MCD_NO_CSUM | MCD_NO_BYTE_SWAP); ++ ++ spin_unlock_irq(&fp->fecpriv_lock); ++ ++ netif_wake_queue(dev); ++ ++} ++ ++/************************************************************************ ++* NAME: fec_read_mii ++* ++* DESCRIPTION: This function reads the value from the MII register ++* ++* RETURNS: If no error occurs, this function returns zero. ++*************************************************************************/ ++int fec_read_mii(unsigned int base_addr, unsigned int pa, unsigned int ra, unsigned int *data) ++{ ++ unsigned long time; ++ ++ // Clear the MII interrupt bit ++ FEC_EIR(base_addr) = FEC_EIR_MII; ++ ++ // Write to the MII management frame register ++ FEC_MMFR(base_addr) = FEC_MMFR_READ | (pa << 23) | (ra << 18); ++ ++ time = jiffies; ++ ++ // Wait for the reading ++ while (!(FEC_EIR(base_addr) & FEC_EIR_MII)) ++ { ++ if (jiffies - time > FEC_MII_TIMEOUT * HZ) ++ return -ETIME; ++ schedule(); ++ } ++ ++ // Clear the MII interrupt bit ++ FEC_EIR(base_addr) = FEC_EIR_MII; ++ ++ *data = FEC_MMFR(base_addr) & 0x0000FFFF; ++ ++ return 0; ++} ++ ++/************************************************************************ ++* NAME: fec_write_mii ++* ++* DESCRIPTION: This function writes the value to the MII register ++* ++* RETURNS: If no error occurs, this function returns zero. ++*************************************************************************/ ++int fec_write_mii(unsigned int base_addr, unsigned int pa, unsigned int ra, unsigned int data) ++{ ++ unsigned long time; ++ ++ // Clear the MII interrupt bit ++ FEC_EIR(base_addr) = FEC_EIR_MII; ++ ++ // Write to the MII management frame register ++ FEC_MMFR(base_addr) = FEC_MMFR_WRITE | (pa << 23) | (ra << 18) | data; ++ ++ time = jiffies; ++ ++ // Wait for the writing ++ ++ while (!(FEC_EIR(base_addr) & FEC_EIR_MII)) ++ { ++ if (jiffies - time > FEC_MII_TIMEOUT * HZ) ++ return -ETIME; ++ ++ schedule(); ++ } ++ ++ // Clear the MII interrupt bit ++ FEC_EIR(base_addr) = FEC_EIR_MII; ++ ++ return 0; ++} ++ ++/************************************************************************ ++* NAME: fec_interrupt_tx_handler ++* ++* DESCRIPTION: This function is called when the data ++* transmission from the buffer to the FEC is completed. ++* ++*************************************************************************/ ++void fec_interrupt_fec_tx_handler(struct net_device *dev) ++{ ++ struct fec_priv *fp = netdev_priv(dev); ++ ++printk(KERN_INFO "fectxint\n"); ++ //Release the socket buffer ++ if(fp->fecpriv_txbuf[fp->fecpriv_current_tx]) ++ { ++ kfree(fp->fecpriv_txbuf[fp->fecpriv_current_tx]); ++ fp->fecpriv_txbuf[fp->fecpriv_current_tx] = NULL; ++ } ++ fp->fecpriv_current_tx = (fp->fecpriv_current_tx + 1) & FEC_TX_INDEX_MASK; ++ ++ if (MCD_dmaStatus(fp->fecpriv_fec_tx_channel) == MCD_DONE) ++ for (; fp->fecpriv_current_tx != fp->fecpriv_next_tx; fp->fecpriv_current_tx = (fp->fecpriv_current_tx + 1) & FEC_TX_INDEX_MASK) ++ { ++ if(fp->fecpriv_txbuf[fp->fecpriv_current_tx]) ++ { ++ kfree(fp->fecpriv_txbuf[fp->fecpriv_current_tx]); ++ fp->fecpriv_txbuf[fp->fecpriv_current_tx] = NULL; ++ } ++ } ++ ++ if (netif_queue_stopped(dev)) ++ netif_wake_queue(dev); ++ ++} ++ ++/************************************************************************ ++* NAME: fec_interrupt_rx_handler ++* ++* DESCRIPTION: This function is called when the data ++* reception from the FEC to the reception buffer is completed. ++* ++*************************************************************************/ ++void fec_interrupt_fec_rx_handler(struct net_device *dev) ++{ ++ struct fec_priv *fp = netdev_priv(dev); ++ struct sk_buff *skb; ++ ++printk(KERN_INFO "fecrxint\n"); ++ fp->fecpriv_rxflag = 1; ++/* ++ // Some buffers can be missed ++ if(!(fp->fecpriv_rxdesc[fp->fecpriv_current_rx].statCtrl & MCD_FEC_END_FRAME)) ++ { ++ // Find a valid index ++ for(i = 0; i < FEC_RX_BUF_NUMBER && !(fp->fecpriv_rxdesc[fp->fecpriv_current_rx].statCtrl & MCD_FEC_END_FRAME); i++, fp->fecpriv_current_rx = (fp->fecpriv_current_rx + 1) & FEC_RX_INDEX_MASK); ++ ++ if(i == FEC_RX_BUF_NUMBER) ++ { ++ // There are no data to process ++ // Tell the DMA to continue the reception ++ MCD_continDma(fp->fecpriv_fec_rx_channel); ++ ++ fp->fecpriv_rxflag = 0; ++ ++ return; ++ } ++ } ++*/ ++ for (; fp->fecpriv_rxdesc[fp->fecpriv_current_rx].statCtrl & MCD_FEC_END_FRAME; fp->fecpriv_current_rx = (fp->fecpriv_current_rx + 1) & FEC_RX_INDEX_MASK) ++ { ++ if( (fp->fecpriv_rxdesc[fp->fecpriv_current_rx].length <= FEC_MAXBUF_SIZE) && ++ (fp->fecpriv_rxdesc[fp->fecpriv_current_rx].length > 4)) // --tym-- ++ { ++ skb = fp->askb_rx[fp->fecpriv_current_rx]; ++ if (!skb) ++ { ++ fp->fecpriv_stat.rx_dropped++; ++ } ++ else ++ { ++ // flush data cache before initializing the descriptor and starting DMA ++// DcacheFlushInvalidateCacheBlock((void*)virt_to_phys(fp->askb_rx[fp->fecpriv_current_rx]->tail), fp->askb_rx[fp->fecpriv_current_rx]->len); ++ ++ skb_put(skb, fp->fecpriv_rxdesc[fp->fecpriv_current_rx].length - 4); ++// skb->dev = dev; ++ skb->protocol = eth_type_trans(skb, dev); ++ netif_rx(skb); ++ } ++ fp->fecpriv_rxdesc[fp->fecpriv_current_rx].statCtrl &= ~MCD_FEC_END_FRAME; ++ // allocate new skbuff ++ fp->askb_rx[fp->fecpriv_current_rx] = alloc_skb(FEC_MAXBUF_SIZE + 16, /*GFP_ATOMIC |*/ GFP_DMA); ++ if (!fp->askb_rx[fp->fecpriv_current_rx]) ++ { ++ fp->fecpriv_rxdesc[fp->fecpriv_current_rx].dataPointer = 0; ++ fp->fecpriv_rxdesc[fp->fecpriv_current_rx].length = 0; ++ fp->fecpriv_stat.rx_dropped++; ++ } ++ else ++ { ++ skb_reserve(fp->askb_rx[fp->fecpriv_current_rx], 16); ++ fp->askb_rx[fp->fecpriv_current_rx]->dev = dev; ++ ++ // flush data cache before initializing the descriptor and starting DMA ++#if 0 ++/* JKM -- currently running with cache turned off */ ++ DcacheFlushInvalidateCacheBlock((void*)virt_to_phys(fp->askb_rx[fp->fecpriv_current_rx]->tail), FEC_MAXBUF_SIZE); ++#endif ++ ++ fp->fecpriv_rxdesc[fp->fecpriv_current_rx].dataPointer = (unsigned int) virt_to_phys(fp->askb_rx[fp->fecpriv_current_rx]->tail); ++ fp->fecpriv_rxdesc[fp->fecpriv_current_rx].length = FEC_MAXBUF_SIZE; ++ fp->fecpriv_rxdesc[fp->fecpriv_current_rx].statCtrl |= MCD_FEC_BUF_READY; ++ ++ // flush data cache before initializing the descriptor and starting DMA ++// DcacheFlushInvalidateCacheBlock((void*)virt_to_phys(fp->askb_rx[fp->fecpriv_current_rx]->tail), FEC_MAXBUF_SIZE); ++ } ++ } ++ ++ } ++ ++ // Tell the DMA to continue the reception ++ MCD_continDma(fp->fecpriv_fec_rx_channel); ++ ++ fp->fecpriv_rxflag = 0; ++ ++} ++ ++/************************************************************************ ++* NAME: fec_interrupt_handler ++* ++* DESCRIPTION: This function is called when some special errors occur ++* ++*************************************************************************/ ++irqreturn_t fec_interrupt_handler(int irq, void *dev_id) ++{ ++ ++ struct net_device *dev = (struct net_device *)dev_id; ++ struct fec_priv *fp = netdev_priv(dev); ++ unsigned long base_addr = (unsigned long) dev->base_addr; ++ unsigned long events; ++ ++printk(KERN_INFO "fecerrint\n"); ++ // Read and clear the events ++ events = FEC_EIR(base_addr) & FEC_EIMR(base_addr); ++ ++ if (events & FEC_EIR_HBERR) ++ { ++ fp->fecpriv_stat.tx_heartbeat_errors++; ++ FEC_EIR(base_addr) = FEC_EIR_HBERR; ++ } ++ ++ // receive/transmit FIFO error ++ if (((events & FEC_EIR_RFERR) != 0) || ((events & FEC_EIR_XFERR) != 0)) ++ { ++ // kill DMA receive channel ++ MCD_killDma (fp->fecpriv_fec_rx_channel); ++ // kill running transmission by DMA ++ MCD_killDma (fp->fecpriv_fec_tx_channel); ++ ++ // Reset FIFOs ++ FEC_FECFRST(base_addr) |= FEC_SW_RST; ++ FEC_FECFRST(base_addr) &= ~FEC_SW_RST; ++ ++ // reset receive FIFO status register ++ FEC_FECRFSR(base_addr) = FEC_FECRFSR_FAE ++ | FEC_FECRFSR_RXW ++ | FEC_FECRFSR_UF; ++ ++ // reset transmit FIFO status register ++ FEC_FECTFSR(base_addr) = FEC_FECTFSR_FAE ++ | FEC_FECTFSR_TXW ++ | FEC_FECTFSR_UF ++ | FEC_FECTFSR_OF; ++ ++ // reset RFERR and XFERR event ++ FEC_EIR(base_addr) = FEC_EIR_RFERR | FEC_EIR_XFERR; ++ ++ // stop queue ++ netif_stop_queue(dev); ++ ++ // execute reinitialization as tasklet ++ tasklet_schedule(&fp->fecpriv_tasklet_reinit); ++ ++ fp->fecpriv_stat.rx_dropped++; ++ ++ } ++ ++ // transmit FIFO underrun ++ if ((events & FEC_EIR_XFUN) != 0) ++ { ++ // reset XFUN event ++ FEC_EIR(base_addr) = FEC_EIR_XFUN; ++ fp->fecpriv_stat.tx_aborted_errors++; ++ } ++ ++ // late collision ++ if ((events & FEC_EIR_LC) != 0) ++ { ++ // reset LC event ++ FEC_EIR(base_addr) = FEC_EIR_LC; ++ fp->fecpriv_stat.tx_aborted_errors++; ++ } ++ ++ // collision retry limit ++ if ((events & FEC_EIR_RL) != 0) ++ { ++ // reset RL event ++ FEC_EIR(base_addr) = FEC_EIR_RL; ++ fp->fecpriv_stat.tx_aborted_errors++; ++ } ++ ++ return 0; ++} ++ ++/************************************************************************ ++* NAME: fec_interrupt_reinit ++* ++* DESCRIPTION: This function is called from interrupt handler ++* when controller must be reinitialized. ++* ++*************************************************************************/ ++void fec_interrupt_fec_reinit(unsigned long data) ++{ ++ int i; ++ struct net_device *dev = (struct net_device*)data; ++ struct fec_priv *fp = netdev_priv(dev); ++ unsigned long base_addr = (unsigned long) dev->base_addr; ++ ++printk(KERN_INFO "fecreinit\n"); ++ // Initialize reception descriptors and start DMA for the reception ++ for (i = 0; i < FEC_RX_BUF_NUMBER; i++) ++ { ++ if (!fp->askb_rx[i]) ++ { ++ fp->askb_rx[i] = alloc_skb(FEC_MAXBUF_SIZE + 16, GFP_ATOMIC | GFP_DMA); ++ if (!fp->askb_rx[i]) ++ { ++ fp->fecpriv_rxdesc[i].dataPointer = 0; ++ fp->fecpriv_rxdesc[i].statCtrl = 0; ++ fp->fecpriv_rxdesc[i].length = 0; ++ continue; ++ } ++ fp->askb_rx[i]->dev = dev; ++ skb_reserve(fp->askb_rx[i], 16); ++ } ++ fp->fecpriv_rxdesc[i].dataPointer = (unsigned int) virt_to_phys(fp->askb_rx[i]->tail); ++ fp->fecpriv_rxdesc[i].statCtrl = MCD_FEC_BUF_READY | MCD_FEC_INTERRUPT; ++ fp->fecpriv_rxdesc[i].length = FEC_MAXBUF_SIZE; ++ } ++ ++ fp->fecpriv_rxdesc[i - 1].statCtrl |= MCD_FEC_WRAP; ++ fp->fecpriv_current_rx = 0; ++ ++ // restart frame transmission ++ for (i = 0; i < FEC_TX_BUF_NUMBER; i++) ++ { ++ if (fp->fecpriv_txbuf[i]) ++ { ++ ++ kfree(fp->fecpriv_txbuf[i]); ++ fp->fecpriv_txbuf[i] = NULL; ++ fp->fecpriv_stat.tx_dropped++; ++ } ++ fp->fecpriv_txdesc[i].statCtrl = MCD_FEC_INTERRUPT; ++ } ++ fp->fecpriv_txdesc[i - 1].statCtrl |= MCD_FEC_WRAP; ++ fp->fecpriv_current_tx = fp->fecpriv_next_tx = 0; ++ ++ // flush entire data cache before restarting the DMA ++#if 0 ++/* JKM -- currently running with cache turned off */ ++ DcacheFlushInvalidate(); ++#endif ++ ++ // restart DMA from beginning ++ MCD_startDma(fp->fecpriv_fec_rx_channel, ++ (char *) fp->fecpriv_rxdesc, 0, ++ (unsigned char *) &(FEC_FECRFDR(base_addr)), 0, ++ FEC_MAX_FRM_SIZE, 0, fp->fecpriv_initiator_rx, ++ FEC_RX_DMA_PRI, MCD_FECRX_DMA | MCD_INTERRUPT, ++ MCD_NO_CSUM | MCD_NO_BYTE_SWAP); ++ ++ MCD_startDma(fp->fecpriv_fec_tx_channel, (char *) fp->fecpriv_txdesc, 0, ++ (unsigned char *) &(FEC_FECTFDR(base_addr)), 0, ++ FEC_MAX_FRM_SIZE, 0, fp->fecpriv_initiator_tx, ++ FEC_TX_DMA_PRI, MCD_FECTX_DMA | MCD_INTERRUPT, ++ MCD_NO_CSUM | MCD_NO_BYTE_SWAP); ++ ++ // Enable FEC ++ FEC_ECR(base_addr) |= FEC_ECR_ETHEREN; ++ ++ netif_wake_queue(dev); ++ ++} ++ ++/************************************************************************ ++* NAME: fec_interrupt_tx_handler_fec0 ++* ++* DESCRIPTION: This is the DMA interrupt handler using for FEC0 ++* transmission. ++* ++*************************************************************************/ ++void fec_interrupt_fec_tx_handler_fec0(void) ++{ ++ fec_interrupt_fec_tx_handler(fec_dev[0]); ++} ++ ++#ifdef FEC_2 ++/************************************************************************ ++* NAME: fec_interrupt_tx_handler_fec1 ++* ++* DESCRIPTION: This is the DMA interrupt handler using for the FEC1 ++* transmission. ++* ++*************************************************************************/ ++void fec_interrupt_fec_tx_handler_fec1(void) ++{ ++ fec_interrupt_fec_tx_handler(fec_dev[1]); ++} ++#endif ++ ++/************************************************************************ ++* NAME: fec_interrupt_rx_handler_fec0 ++* ++* DESCRIPTION: This is the DMA interrupt handler using for the FEC0 ++* reception. ++* ++*************************************************************************/ ++void fec_interrupt_fec_rx_handler_fec0(void) ++{ ++ fec_interrupt_fec_rx_handler(fec_dev[0]); ++} ++ ++#ifdef FEC_2 ++/************************************************************************ ++* NAME: fec_interrupt_rx_handler_fec1 ++* ++* DESCRIPTION: This is the DMA interrupt handler using for the FEC1 ++* reception. ++* ++*************************************************************************/ ++void fec_interrupt_fec_rx_handler_fec1(void) ++{ ++ fec_interrupt_fec_rx_handler(fec_dev[1]); ++} ++ ++#endif ++#ifndef MODULE ++ ++/************************************************************************ ++* NAME: fec_mac_setup0 ++* ++* DESCRIPTION: This function sets the MAC address of FEC0 from command line ++* ++*************************************************************************/ ++int __init fec_mac_setup0(char *s) ++{ ++ if(!s || !*s) ++ return 1; ++ ++ if(fec_str_to_mac(s, fec_mac_addr_fec0)) ++ printk("The MAC address of FEC0 cannot be set from command line"); ++ return 1; ++ ++} ++ ++#ifdef FEC_2 ++ ++/************************************************************************ ++* NAME: fec_mac_setup1 ++* ++* DESCRIPTION: This function sets the MAC address of FEC1 from command line ++* ++*************************************************************************/ ++int __init fec_mac_setup1(char *s) ++{ ++ if(!s || !*s) ++ return 1; ++ ++ ++ if(fec_str_to_mac(s, fec_mac_addr_fec1)) ++ printk("The MAC address of FEC1 cannot be set from command line"); ++ return 1; ++ ++} ++#endif ++ ++/************************************************************************ ++* NAME: fec_str_to_mac ++* ++* DESCRIPTION: This function interprets the character string into MAC addr ++* ++*************************************************************************/ ++int fec_str_to_mac( char *str_mac, unsigned char* addr) ++{ ++ unsigned long val; ++ char c; ++ unsigned long octet[6], *octetptr = octet; ++ int i; ++again: ++ ++ val = 0; ++ while ((c = *str_mac) != '\0') ++ { ++ if ((c>='0')&&(c<='9')) ++ { ++ val = (val * 16) + (c - '0'); ++ str_mac++; ++ continue; ++ } ++ else ++ if (((c>='a')&&(c<='f'))||((c>='A')&&(c<='F'))) ++ { ++ val = (val << 4) + (c + 10 - (((c>='a')&&(c<='f')) ? 'a' : 'A')); ++ str_mac++; ++ continue; ++ } ++ break; ++ } ++ if (*str_mac == ':') ++ { ++ *octetptr++ = val, str_mac++; ++ if (octetptr >= octet + 6) ++ return 1; ++ goto again; ++ } ++ ++ //Check for trailing characters. ++ if (*str_mac && !(*str_mac==' ')) ++ return 1; ++ *octetptr++ = val; ++ ++ if ((octetptr - octet)==6) ++ { ++ for(i=0;i<=6;i++) ++ addr[i]=octet[i]; ++ } ++ else ++ return 1; ++ ++ return 0; ++ ++} ++#endif +--- /dev/null ++++ b/drivers/net/fec/fec.h +@@ -0,0 +1,162 @@ ++ ++#define FEC_BASE_ADDR_FEC0 ((unsigned int)MCF_MBAR + 0x9000) ++#define FEC_BASE_ADDR_FEC1 ((unsigned int)MCF_MBAR + 0x9800) ++ ++//#define FEC_INTC_IMRH_INT_MASK38 (0x00000040) ++//#define FEC_INTC_IMRH_INT_MASK39 (0x00000080) ++//#define FEC_INTC_ICR_FEC0 (0x30) ++//#define FEC_INTC_ICR_FEC1 (0x31) ++#define FEC_FECI2CIRQ (0xFFC0) ++#define FEC_GPIO_PAR_FECI2CIRQ *(volatile unsigned short*)((unsigned int)MCF_MBAR + 0xA44) ++//#define FEC_INTC_ICRn(x) (*(volatile unsigned char *)(void*)((unsigned int) MCF_MBAR + 0x000740+((x)*0x001))) ++//#define FEC_INTC_IMRH *(volatile unsigned int*)((unsigned int)MCF_MBAR + 0x000708) ++ ++#define FEC_ECR_DISABLE (0x00000000) ++ ++#define FEC_ECR(x) *(volatile unsigned int *)(x + 0x024) ++#define FEC_EIR(x) *(volatile unsigned int*)(x + 0x004) ++#define FEC_PALR(x) *(volatile unsigned int*)(x + 0x0E4) ++#define FEC_PAUR(x) *(volatile unsigned int*)(x + 0x0E8) ++#define FEC_IALR(x) *(volatile unsigned int*)(x + 0x11C) ++#define FEC_IAUR(x) *(volatile unsigned int*)(x + 0x118) ++#define FEC_GALR(x) *(volatile unsigned int*)(x + 0x124) ++#define FEC_GAUR(x) *(volatile unsigned int*)(x + 0x120) ++#define FEC_RCR(x) *(volatile unsigned int*)(x + 0x084) ++#define FEC_FECRFCR(x) *(volatile unsigned int*)(x + 0x18C) ++#define FEC_FECRFAR(x) *(volatile unsigned int*)(x + 0x198) ++#define FEC_FECTFCR(x) *(volatile unsigned int*)(x + 0x1AC) ++#define FEC_FECTFAR(x) *(volatile unsigned int*)(x + 0x1B8) ++#define FEC_FECTFWR(x) *(volatile unsigned int*)(x + 0x144) ++#define FEC_CTCWR(x) *(volatile unsigned int*)(x + 0x1C8) ++#define FEC_EIMR(x) *(volatile unsigned int*)(x + 0x008) ++#define FEC_TCR(x) *(volatile unsigned int*)(x + 0x0C4) ++#define FEC_MIBC(x) *(volatile unsigned int*)(x + 0x064) ++#define FEC_MSCR(x) *(volatile unsigned int*)(x + 0x044) ++#define FEC_FECTFDR(x) *(volatile unsigned int*)(x + 0x1A4) ++#define FEC_FECRFDR(x) *(volatile unsigned int*)(x + 0x184) ++#define FEC_FECTFSR(x) *(volatile unsigned int*)(x + 0x1A8) ++#define FEC_FECRFSR(x) *(volatile unsigned int*)(x + 0x188) ++#define FECSTAT_RMON_R_PACKETS(x) *(volatile unsigned int*)(x + 0x284) ++#define FECSTAT_RMON_T_PACKETS(x) *(volatile unsigned int*)(x + 0x204) ++#define FECSTAT_RMON_R_OCTETS(x) *(volatile unsigned int*)(x + 0x2C4) ++#define FECSTAT_RMON_T_OCTETS(x) *(volatile unsigned int*)(x + 0x244) ++#define FECSTAT_RMON_R_UNDERSIZE(x) *(volatile unsigned int*)(x + 0x294) ++#define FECSTAT_RMON_R_OVERSIZE(x) *(volatile unsigned int*)(x + 0x298) ++#define FECSTAT_RMON_R_FRAG(x) *(volatile unsigned int*)(x + 0x29C) ++#define FECSTAT_RMON_R_JAB(x) *(volatile unsigned int*)(x + 0x2A0) ++#define FECSTAT_RMON_R_MC_PKT(x) *(volatile unsigned int*)(x + 0x28C) ++#define FECSTAT_RMON_T_COL(x) *(volatile unsigned int*)(x + 0x224) ++#define FECSTAT_IEEE_R_ALIGN(x) *(volatile unsigned int*)(x + 0x2D4) ++#define FECSTAT_IEEE_R_CRC(x) *(volatile unsigned int*)(x + 0x2D0) ++#define FECSTAT_IEEE_R_MACERR(x) *(volatile unsigned int*)(x + 0x2D8) ++#define FECSTAT_IEEE_T_CSERR(x) *(volatile unsigned int*)(x + 0x268) ++#define FECSTAT_IEEE_T_MACERR(x) *(volatile unsigned int*)(x + 0x264) ++#define FECSTAT_IEEE_T_LCOL(x) *(volatile unsigned int*)(x + 0x25C) ++#define FECSTAT_IEEE_R_OCTETS_OK(x) *(volatile unsigned int*)(x + 0x2E0) ++#define FECSTAT_IEEE_T_OCTETS_OK(x) *(volatile unsigned int*)(x + 0x274) ++#define FECSTAT_IEEE_R_DROP(x) *(volatile unsigned int*)(x + 0x2C8) ++#define FECSTAT_IEEE_T_DROP(x) *(volatile unsigned int*)(x + 0x248) ++#define FECSTAT_IEEE_R_FRAME_OK(x) *(volatile unsigned int*)(x + 0x2CC) ++#define FECSTAT_IEEE_T_FRAME_OK(x) *(volatile unsigned int*)(x + 0x24C) ++#define FEC_MMFR(x) *(volatile unsigned int*)(x + 0x040) ++#define FEC_FECFRST(x) *(volatile unsigned int*)(x + 0x1C4) ++ ++#define FEC_MAX_FRM_SIZE (1518) ++#define FEC_MAXBUF_SIZE (1520) ++ ++// Register values ++#define FEC_ECR_RESET (0x00000001) ++#define FEC_EIR_CLEAR (0xFFFFFFFF) ++#define FEC_EIR_RL (0x00100000) ++#define FEC_EIR_HBERR (0x80000000) ++#define FEC_EIR_BABR (0x40000000) // babbling receive error ++#define FEC_EIR_BABT (0x20000000) // babbling transmit error ++#define FEC_EIR_TXF (0x08000000) // transmit frame interrupt ++#define FEC_EIR_MII (0x00800000) // MII interrupt ++#define FEC_EIR_LC (0x00200000) // late collision ++#define FEC_EIR_XFUN (0x00080000) // transmit FIFO underrun ++#define FEC_EIR_XFERR (0x00040000) // transmit FIFO error ++#define FEC_EIR_RFERR (0x00020000) // receive FIFO error ++#define FEC_RCR_MAX_FRM_SIZE (FEC_MAX_FRM_SIZE << 16) ++#define FEC_RCR_MII (0x00000004) ++#define FEC_FECRFCR_FAE (0x00400000) // frame accept error ++#define FEC_FECRFCR_RXW (0x00200000) // receive wait condition ++#define FEC_FECRFCR_UF (0x00100000) // receive FIFO underflow ++#define FEC_FECRFCR_FRM (0x08000000) ++#define FEC_FECRFCR_GR (0x7 << 24) ++ ++#define FEC_EIMR_DISABLE (0x00000000) ++ ++#define FEC_FECRFAR_ALARM (0x300) ++#define FEC_FECTFCR_FRM (0x08000000) ++#define FEC_FECTFCR_GR (0x7 << 24) ++#define FEC_FECTFCR_FAE (0x00400000) // frame accept error ++#define FEC_FECTFCR_TXW (0x00040000) // transmit wait condition ++#define FEC_FECTFCR_UF (0x00100000) // transmit FIFO underflow ++#define FEC_FECTFCR_OF (0x00080000) // transmit FIFO overflow ++ ++#define FEC_FECTFAR_ALARM (0x100) ++#define FEC_FECTFWR_XWMRK (0x00000000) ++ ++#define FEC_FECTFSR_MSK (0xC0B00000) ++#define FEC_FECTFSR_TXW (0x40000000) // transmit wait condition ++#define FEC_FECTFSR_FAE (0x00800000) // frame accept error ++#define FEC_FECTFSR_UF (0x00200000) // transmit FIFO underflow ++#define FEC_FECTFSR_OF (0x00100000) // transmit FIFO overflow ++ ++#define FEC_FECRFSR_MSK (0x80F00000) ++#define FEC_FECRFSR_FAE (0x00800000) // frame accept error ++#define FEC_FECRFSR_RXW (0x00400000) // receive wait condition ++#define FEC_FECRFSR_UF (0x00200000) // receive FIFO underflow ++ ++#define FEC_CTCWR_TFCW_CRC (0x03000000) ++#define FEC_TCR_FDEN (0x00000004) ++#define FEC_TCR_HBC (0x00000002) ++#define FEC_RCR_DRT (0x00000002) ++#define FEC_EIMR_MASK (FEC_EIR_RL | FEC_EIR_HBERR) ++#define FEC_ECR_ETHEREN (0x00000002) ++#define FEC_FECTFCR_MSK (0x00FC0000) ++#define FEC_FECRFCR_MSK (0x00F80000) ++#define FEC_EIR_GRA (0x10000000) ++#define FEC_TCR_GTS (0x00000001) ++#define FEC_MIBC_ENABLE (0x00000000) ++#define FEC_MIB_LEN (228) ++#define FEC_PHY_ADDR (0x01) ++ ++#define FEC_RX_DMA_PRI (6) ++#define FEC_TX_DMA_PRI (6) ++ ++#define FEC_TX_BUF_NUMBER (8) ++#define FEC_RX_BUF_NUMBER (64) ++ ++#define FEC_TX_INDEX_MASK (0x7) ++#define FEC_RX_INDEX_MASK (0x3f) ++ ++#define FEC_RX_DESC_FEC0 SYS_SRAM_FEC_START ++#define FEC_TX_DESC_FEC0 FEC_RX_DESC_FEC0 + FEC_RX_BUF_NUMBER * sizeof(MCD_bufDescFec) ++ ++#define FEC_RX_DESC_FEC1 SYS_SRAM_FEC_START + SYS_SRAM_FEC_SIZE/2 ++#define FEC_TX_DESC_FEC1 FEC_RX_DESC_FEC1 + FEC_RX_BUF_NUMBER * sizeof(MCD_bufDescFec) ++ ++#define FEC_EIR_MII (0x00800000) ++#define FEC_MMFR_READ (0x60020000) ++#define FEC_MMFR_WRITE (0x50020000) ++ ++#define FEC_FLAGS_RX (0x00000001) ++ ++#define FEC_CRCPOL (0xEDB88320) ++ ++#define FEC_MII_TIMEOUT (2) ++#define FEC_GR_TIMEOUT (1) ++#define FEC_TX_TIMEOUT (1) ++#define FEC_RX_TIMEOUT (1) ++ ++#define FEC_SW_RST 0x2000000 ++#define FEC_RST_CTL 0x1000000 ++ ++int fec_read_mii(unsigned int base_addr, unsigned int pa, unsigned int ra, ++ unsigned int *data); ++int fec_write_mii(unsigned int base_addr, unsigned int pa, unsigned int ra, ++ unsigned int data); ++ ++#define init_transceiver ks8721_init_transceiver +--- /dev/null ++++ b/drivers/net/fec/ks8721.c +@@ -0,0 +1,125 @@ ++#include <linux/module.h> ++#include <linux/kernel.h> ++#include <linux/string.h> ++#include <linux/ptrace.h> ++#include <linux/errno.h> ++#include <linux/ioport.h> ++#include <linux/slab.h> ++#include <linux/interrupt.h> ++#include <linux/pci.h> ++#include <linux/init.h> ++#include <linux/delay.h> ++#include <linux/netdevice.h> ++#include <linux/etherdevice.h> ++#include <linux/skbuff.h> ++#include <linux/spinlock.h> ++#include <linux/workqueue.h> ++#include <linux/bitops.h> ++ ++#if 0 ++#include <linux/config.h> ++#include <linux/sched.h> ++#include <linux/errno.h> ++#include <asm/coldfire.h> ++#endif ++#include <asm/coldfire.h> ++#include <asm/mcfsim.h> ++ ++#include "fec.h" ++#include "ks8721.h" ++ ++#ifdef CONFIG_FEC_548x_AUTO_NEGOTIATION ++#define KS8721_AUTO_NEGOTIATION_ENABLE ++#endif ++ ++/************************************************************************ ++* +NAME: ks8721_init_transceiver ++* ++* DESCRIPTION: This function initializes the transceiver ++* ++* RETURNS: If no error occurs, this function returns zero. ++* Otherwise, it returns 1 ++*************************************************************************/ ++ ++int ks8721_init_transceiver(unsigned long base_addr, int *fduplex) ++{ ++ ++ int data; ++ unsigned long time; ++ int flag = 1; ++ ++ int result; ++ ++ // Set the frequency of MII ++ FEC_MSCR(base_addr) = FEC_MII_SPEED; ++ ++ // Reset ++ if ((result = fec_write_mii(base_addr, FEC_PHY_ADDR, KS8721_CTRL, KS8721_CTRL_RESET))) ++ return result; ++ ++ // Read back ++ if ((result = fec_read_mii(base_addr, FEC_PHY_ADDR, KS8721_CTRL, &data)) != 0) ++ return result; ++ ++ // If reset bit is set, return ++ if (data & KS8721_CTRL_RESET) ++ return -ETIME; ++ ++#ifdef KS8721_AUTO_NEGOTIATION_ENABLE ++ ++ // Disable the auto-negotiation ++ if ((result = fec_write_mii(base_addr, FEC_PHY_ADDR, KS8721_CTRL, 0)) != 0) ++ return result; ++ ++ // Set the auto-negotiation advertisement register ++ if ((result = fec_write_mii(base_addr, FEC_PHY_ADDR, KS8721_ANADV, KS8721_ANADV_ADV_ALL)) != 0) ++ return result; ++ ++ // Enable the auto-negotiation ++ if ((result = fec_write_mii(base_addr, FEC_PHY_ADDR, KS8721_CTRL, KS8721_CTRL_AN_ENABLE)) != 0) ++ return result; ++ ++ // Read PHY status register ++ if ((result = fec_read_mii(base_addr, FEC_PHY_ADDR, KS8721_STAT, &data)) != 0) ++ return result; ++ // Set the current time ++ time = jiffies; ++ ++ // Wait for the auto-negotiation completion ++ while (!(data & KS8721_STAT_ANCOMPLETE)) ++ { ++ ++ if (jiffies - time > KS8721_TIMEOUT * HZ) ++ { ++ flag = 0; ++ break; ++ } ++ ++ schedule(); ++ ++ // Read PHY status register ++ if ((result = fec_read_mii(base_addr, FEC_PHY_ADDR, KS8721_STAT, &data)) != 0) ++ return result; ++ } ++ ++ if (flag) ++ { ++ // Set the duplex flag ++ if (data & KS8721_STAT_FDUPLEX) ++ *fduplex = 1; ++ else ++ *fduplex = 0; ++ ++ return 0; ++ } ++ ++#endif ++ ++ // Set the default mode (Full duplex, 100 Mbps) ++ if ((result = fec_write_mii(base_addr, FEC_PHY_ADDR, KS8721_CTRL, KS8721_CTRL_DEFAULT_MODE)) != 0) ++ return result; ++ *fduplex = KS8721_CTRL_DEFAULT_MODE & 0x100; ++ ++ return 0; ++ ++} +--- /dev/null ++++ b/drivers/net/fec/ks8721.h +@@ -0,0 +1,21 @@ ++ ++#define FEC_MII_SPEED (((unsigned int)(MCF_BUSCLK / 5000000)) << 1) ++ ++// Numbers of the transceiver registers ++#define KS8721_CTRL 0x00 ++#define KS8721_ANADV 0x04 ++#define KS8721_STAT 0x01 ++ ++// Register values ++#define KS8721_CTRL_RESET 0x8000 ++#define KS8721_ANADV_ADV_ALL 0x01E1 ++#define KS8721_CTRL_AN_ENABLE 0x1280 ++#define KS8721_CTRL_DEFAULT_MODE 0x2100 ++#define KS8721_STAT_ANCOMPLETE 0x0020 ++#define KS8721_STAT_LINK 0x0004 ++#define KS8721_STAT_FDUPLEX 0x5000 ++ ++// Timeout for the auto-negotiation mode ++#define KS8721_TIMEOUT 5 ++ ++int ks8721_init_transceiver(unsigned long base_addr, int *fduplex); +--- /dev/null ++++ b/include/asm-m68k/MCD_dma.h +@@ -0,0 +1,408 @@ ++/********************************************************************* ++ * ++ * Copyright (C) 2004 Motorola, Inc. ++ * MOTOROLA, INC. All Rights Reserved. ++ * You are hereby granted a copyright license to use ++ * the SOFTWARE so long as this entire notice is ++ * retained without alteration in any modified and/or redistributed ++ * versions, and that such modified versions are clearly identified ++ * as such. No licenses are granted by implication, estoppel or ++ * otherwise under any patents or trademarks of Motorola, Inc. This ++ * software is provided on an "AS IS" basis and without warranty. ++ * ++ * To the maximum extent permitted by applicable law, MOTOROLA ++ * DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED, INCLUDING ++ * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR ++ * PURPOSE AND ANY WARRANTY AGAINST INFRINGEMENT WITH REGARD TO THE ++ * SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF) AND ANY ++ * ACCOMPANYING WRITTEN MATERIALS. ++ * ++ * To the maximum extent permitted by applicable law, IN NO EVENT ++ * SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER (INCLUDING ++ * WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS ++ * INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY ++ * LOSS) ARISING OF THE USE OR INABILITY TO USE THE SOFTWARE. ++ * ++ * Motorola assumes no responsibility for the maintenance and support ++ * of this software ++ ********************************************************************/ ++ ++/* ++ * File: MCD_dma.h ++ * Purpose: Main header file for multi-channel DMA API. ++ * ++ * Notes: ++ * ++ * Modifications: ++ */ ++#ifndef _MCD_API_H ++#define _MCD_API_H ++ ++#include <asm/types.h> ++ ++/* ++ * Turn Execution Unit tasks ON (#define) or OFF (#undef) ++ */ ++#undef MCD_INCLUDE_EU ++ ++/* ++ * Number of DMA channels ++ */ ++#define NCHANNELS 16 ++ ++/* ++ * Total number of variants ++ */ ++#ifdef MCD_INCLUDE_EU ++#define NUMOFVARIANTS 6 ++#else ++#define NUMOFVARIANTS 4 ++#endif ++ ++/* ++ * Define sizes of the various tables ++ */ ++#define TASK_TABLE_SIZE (NCHANNELS*32) ++#define VAR_TAB_SIZE (128) ++#define CONTEXT_SAVE_SIZE (128) ++#define FUNCDESC_TAB_SIZE (256) ++ ++#ifdef MCD_INCLUDE_EU ++#define FUNCDESC_TAB_NUM 16 ++#else ++#define FUNCDESC_TAB_NUM 1 ++#endif ++ ++ ++#ifndef DEFINESONLY ++ ++/* ++ * Portability typedefs ++ */ ++ /* ++#ifndef s32 ++typedef int s32; ++#endif ++#ifndef u32 ++typedef unsigned int u32; ++#endif ++#ifndef s16 ++typedef short s16; ++#endif ++#ifndef u16 ++typedef unsigned short u16; ++#endif ++#ifndef s8 ++typedef char s8; ++#endif ++#ifndef u8 ++typedef unsigned char u8; ++#endif ++*/ ++/* ++ * These structures represent the internal registers of the ++ * multi-channel DMA ++ */ ++struct dmaRegs_s { ++ u32 taskbar; /* task table base address register */ ++ u32 currPtr; ++ u32 endPtr; ++ u32 varTablePtr; ++ u16 dma_rsvd0; ++ u16 ptdControl; /* ptd control */ ++ u32 intPending; /* interrupt pending register */ ++ u32 intMask; /* interrupt mask register */ ++ u16 taskControl[16]; /* task control registers */ ++ u8 priority[32]; /* priority registers */ ++ u32 initiatorMux; /* initiator mux control */ ++ u32 taskSize0; /* task size control register 0. */ ++ u32 taskSize1; /* task size control register 1. */ ++ u32 dma_rsvd1; /* reserved */ ++ u32 dma_rsvd2; /* reserved */ ++ u32 debugComp1; /* debug comparator 1 */ ++ u32 debugComp2; /* debug comparator 2 */ ++ u32 debugControl; /* debug control */ ++ u32 debugStatus; /* debug status */ ++ u32 ptdDebug; /* priority task decode debug */ ++ u32 dma_rsvd3[31]; /* reserved */ ++}; ++typedef volatile struct dmaRegs_s dmaRegs; ++ ++#endif ++ ++/* ++ * PTD contrl reg bits ++ */ ++#define PTD_CTL_TSK_PRI 0x8000 ++#define PTD_CTL_COMM_PREFETCH 0x0001 ++ ++/* ++ * Task Control reg bits and field masks ++ */ ++#define TASK_CTL_EN 0x8000 ++#define TASK_CTL_VALID 0x4000 ++#define TASK_CTL_ALWAYS 0x2000 ++#define TASK_CTL_INIT_MASK 0x1f00 ++#define TASK_CTL_ASTRT 0x0080 ++#define TASK_CTL_HIPRITSKEN 0x0040 ++#define TASK_CTL_HLDINITNUM 0x0020 ++#define TASK_CTL_ASTSKNUM_MASK 0x000f ++ ++/* ++ * Priority reg bits and field masks ++ */ ++#define PRIORITY_HLD 0x80 ++#define PRIORITY_PRI_MASK 0x07 ++ ++/* ++ * Debug Control reg bits and field masks ++ */ ++#define DBG_CTL_BLOCK_TASKS_MASK 0xffff0000 ++#define DBG_CTL_AUTO_ARM 0x00008000 ++#define DBG_CTL_BREAK 0x00004000 ++#define DBG_CTL_COMP1_TYP_MASK 0x00003800 ++#define DBG_CTL_COMP2_TYP_MASK 0x00000070 ++#define DBG_CTL_EXT_BREAK 0x00000004 ++#define DBG_CTL_INT_BREAK 0x00000002 ++ ++/* ++ * PTD Debug reg selector addresses ++ * This reg must be written with a value to show the contents of ++ * one of the desired internal register. ++ */ ++#define PTD_DBG_REQ 0x00 /* shows the state of 31 initiators */ ++#define PTD_DBG_TSK_VLD_INIT 0x01 /* shows which 16 tasks are valid and ++ have initiators asserted */ ++ ++ ++/* ++ * General return values ++ */ ++#define MCD_OK 0 ++#define MCD_ERROR -1 ++#define MCD_TABLE_UNALIGNED -2 ++#define MCD_CHANNEL_INVALID -3 ++ ++/* ++ * MCD_initDma input flags ++ */ ++#define MCD_RELOC_TASKS 0x00000001 ++#define MCD_NO_RELOC_TASKS 0x00000000 ++#define MCD_COMM_PREFETCH_EN 0x00000002 /* Commbus Prefetching - MCF547x/548x ONLY */ ++ ++/* ++ * MCD_dmaStatus Status Values for each channel ++ */ ++#define MCD_NO_DMA 1 /* No DMA has been requested since reset */ ++#define MCD_IDLE 2 /* DMA active, but the initiator is currently inactive */ ++#define MCD_RUNNING 3 /* DMA active, and the initiator is currently active */ ++#define MCD_PAUSED 4 /* DMA active but it is currently paused */ ++#define MCD_HALTED 5 /* the most recent DMA has been killed with MCD_killTask() */ ++#define MCD_DONE 6 /* the most recent DMA has completed. */ ++ ++ ++/* ++ * MCD_startDma parameter defines ++ */ ++ ++/* ++ * Constants for the funcDesc parameter ++ */ ++/* Byte swapping: */ ++#define MCD_NO_BYTE_SWAP 0x00045670 /* to disable byte swapping. */ ++#define MCD_BYTE_REVERSE 0x00076540 /* to reverse the bytes of each u32 of the DMAed data. */ ++#define MCD_U16_REVERSE 0x00067450 /* to reverse the 16-bit halves of ++ each 32-bit data value being DMAed.*/ ++#define MCD_U16_BYTE_REVERSE 0x00054760 /* to reverse the byte halves of each ++ 16-bit half of each 32-bit data value DMAed */ ++#define MCD_NO_BIT_REV 0x00000000 /* do not reverse the bits of each byte DMAed. */ ++#define MCD_BIT_REV 0x00088880 /* reverse the bits of each byte DMAed */ ++/* CRCing: */ ++#define MCD_CRC16 0xc0100000 /* to perform CRC-16 on DMAed data. */ ++#define MCD_CRCCCITT 0xc0200000 /* to perform CRC-CCITT on DMAed data. */ ++#define MCD_CRC32 0xc0300000 /* to perform CRC-32 on DMAed data. */ ++#define MCD_CSUMINET 0xc0400000 /* to perform internet checksums on DMAed data.*/ ++#define MCD_NO_CSUM 0xa0000000 /* to perform no checksumming. */ ++ ++#define MCD_FUNC_NOEU1 (MCD_NO_BYTE_SWAP | MCD_NO_BIT_REV | MCD_NO_CSUM) ++#define MCD_FUNC_NOEU2 (MCD_NO_BYTE_SWAP | MCD_NO_CSUM) ++ ++/* ++ * Constants for the flags parameter ++ */ ++#define MCD_TT_FLAGS_RL 0x00000001 /* Read line */ ++#define MCD_TT_FLAGS_CW 0x00000002 /* Combine Writes */ ++#define MCD_TT_FLAGS_SP 0x00000004 /* Speculative prefetch(XLB) MCF547x/548x ONLY */ ++#define MCD_TT_FLAGS_MASK 0x000000ff ++#define MCD_TT_FLAGS_DEF (MCD_TT_FLAGS_RL | MCD_TT_FLAGS_CW) ++ ++#define MCD_SINGLE_DMA 0x00000100 /* Unchained DMA */ ++#define MCD_CHAIN_DMA /* TBD */ ++#define MCD_EU_DMA /* TBD */ ++#define MCD_FECTX_DMA 0x00001000 /* FEC TX ring DMA */ ++#define MCD_FECRX_DMA 0x00002000 /* FEC RX ring DMA */ ++ ++ ++/* these flags are valid for MCD_startDma and the chained buffer descriptors */ ++#define MCD_BUF_READY 0x80000000 /* indicates that this buffer is now under the DMA's control */ ++#define MCD_WRAP 0x20000000 /* to tell the FEC Dmas to wrap to the first BD */ ++#define MCD_INTERRUPT 0x10000000 /* to generate an interrupt after completion of the DMA. */ ++#define MCD_END_FRAME 0x08000000 /* tell the DMA to end the frame when transferring ++ last byte of data in buffer */ ++#define MCD_CRC_RESTART 0x40000000 /* to empty out the accumulated checksum ++ prior to performing the DMA. */ ++ ++/* Defines for the FEC buffer descriptor control/status word*/ ++#define MCD_FEC_BUF_READY 0x8000 ++#define MCD_FEC_WRAP 0x2000 ++#define MCD_FEC_INTERRUPT 0x1000 ++#define MCD_FEC_END_FRAME 0x0800 ++ ++ ++/* ++ * Defines for general intuitiveness ++ */ ++ ++#define MCD_TRUE 1 ++#define MCD_FALSE 0 ++ ++/* ++ * Three different cases for destination and source. ++ */ ++#define MINUS1 -1 ++#define ZERO 0 ++#define PLUS1 1 ++ ++#ifndef DEFINESONLY ++ ++/* Task Table Entry struct*/ ++typedef struct { ++ u32 TDTstart; /* task descriptor table start */ ++ u32 TDTend; /* task descriptor table end */ ++ u32 varTab; /* variable table start */ ++ u32 FDTandFlags; /* function descriptor table start and flags */ ++ volatile u32 descAddrAndStatus; ++ volatile u32 modifiedVarTab; ++ u32 contextSaveSpace; /* context save space start */ ++ u32 literalBases; ++} TaskTableEntry; ++ ++ ++/* Chained buffer descriptor */ ++typedef volatile struct MCD_bufDesc_struct MCD_bufDesc; ++struct MCD_bufDesc_struct { ++ u32 flags; /* flags describing the DMA */ ++ u32 csumResult; /* checksum from checksumming performed since last checksum reset */ ++ s8 *srcAddr; /* the address to move data from */ ++ s8 *destAddr; /* the address to move data to */ ++ s8 *lastDestAddr; /* the last address written to */ ++ u32 dmaSize; /* the number of bytes to transfer independent of the transfer size */ ++ MCD_bufDesc *next; /* next buffer descriptor in chain */ ++ u32 info; /* private information about this descriptor; DMA does not affect it */ ++}; ++ ++/* Progress Query struct */ ++typedef volatile struct MCD_XferProg_struct { ++ s8 *lastSrcAddr; /* the most-recent or last, post-increment source address */ ++ s8 *lastDestAddr; /* the most-recent or last, post-increment destination address */ ++ u32 dmaSize; /* the amount of data transferred for the current buffer */ ++ MCD_bufDesc *currBufDesc;/* pointer to the current buffer descriptor being DMAed */ ++} MCD_XferProg; ++ ++ ++/* FEC buffer descriptor */ ++typedef volatile struct MCD_bufDescFec_struct { ++ u16 statCtrl; ++ u16 length; ++ u32 dataPointer; ++} MCD_bufDescFec; ++ ++ ++/*************************************************************************/ ++/* ++ * API function Prototypes - see MCD_dmaApi.c for further notes ++ */ ++ ++/* ++ * MCD_startDma starts a particular kind of DMA . ++ */ ++int MCD_startDma ( ++ int channel, /* the channel on which to run the DMA */ ++ s8 *srcAddr, /* the address to move data from, or buffer-descriptor address */ ++ s16 srcIncr, /* the amount to increment the source address per transfer */ ++ s8 *destAddr, /* the address to move data to */ ++ s16 destIncr, /* the amount to increment the destination address per transfer */ ++ u32 dmaSize, /* the number of bytes to transfer independent of the transfer size */ ++ u32 xferSize, /* the number bytes in of each data movement (1, 2, or 4) */ ++ u32 initiator, /* what device initiates the DMA */ ++ int priority, /* priority of the DMA */ ++ u32 flags, /* flags describing the DMA */ ++ u32 funcDesc /* a description of byte swapping, bit swapping, and CRC actions */ ++); ++ ++/* ++ * MCD_initDma() initializes the DMA API by setting up a pointer to the DMA ++ * registers, relocating and creating the appropriate task structures, and ++ * setting up some global settings ++ */ ++int MCD_initDma (dmaRegs *sDmaBarAddr, void *taskTableDest, u32 flags); ++ ++/* ++ * MCD_dmaStatus() returns the status of the DMA on the requested channel. ++ */ ++int MCD_dmaStatus (int channel); ++ ++/* ++ * MCD_XferProgrQuery() returns progress of DMA on requested channel ++ */ ++int MCD_XferProgrQuery (int channel, MCD_XferProg *progRep); ++ ++/* ++ * MCD_killDma() halts the DMA on the requested channel, without any ++ * intention of resuming the DMA. ++ */ ++int MCD_killDma (int channel); ++ ++/* ++ * MCD_continDma() continues a DMA which as stopped due to encountering an ++ * unready buffer descriptor. ++ */ ++int MCD_continDma (int channel); ++ ++/* ++ * MCD_pauseDma() pauses the DMA on the given channel ( if any DMA is ++ * running on that channel). ++ */ ++int MCD_pauseDma (int channel); ++ ++/* ++ * MCD_resumeDma() resumes the DMA on a given channel (if any DMA is ++ * running on that channel). ++ */ ++int MCD_resumeDma (int channel); ++ ++/* ++ * MCD_csumQuery provides the checksum/CRC after performing a non-chained DMA ++ */ ++int MCD_csumQuery (int channel, u32 *csum); ++ ++/* ++ * MCD_getCodeSize provides the packed size required by the microcoded task ++ * and structures. ++ */ ++int MCD_getCodeSize(void); ++ ++/* ++ * MCD_getVersion provides a pointer to a version string and returns a ++ * version number. ++ */ ++int MCD_getVersion(char **longVersion); ++ ++/* macro for setting a location in the variable table */ ++#define MCD_SET_VAR(taskTab,idx,value) ((u32 *)(taskTab)->varTab)[idx] = value ++ /* Note that MCD_SET_VAR() is invoked many times in firing up a DMA function, ++ so I'm avoiding surrounding it with "do {} while(0)" */ ++ ++#endif /* DEFINESONLY */ ++ ++#endif /* _MCD_API_H */ +--- a/include/asm-m68k/coldfire.h ++++ b/include/asm-m68k/coldfire.h +@@ -7,6 +7,7 @@ + #define MCF_SRAM 0x80000000 + #elif defined(CONFIG_M547X_8X) + #define MCF_MBAR 0xE0000000 ++#define MCF_MMUBAR 0xE1000000 + #define MCF_RAMBAR0 0xE3000000 + #define MCF_RAMBAR1 0xE3001000 + #endif +--- a/include/asm-m68k/dma.h ++++ b/include/asm-m68k/dma.h +@@ -1,16 +1,120 @@ + #ifndef _M68K_DMA_H + #define _M68K_DMA_H 1 + +- + /* it's useless on the m68k, but unfortunately needed by the new + bootmem allocator (but this should do it for this) */ + #define MAX_DMA_ADDRESS PAGE_OFFSET + ++#ifndef CONFIG_COLDFIRE + #define MAX_DMA_CHANNELS 8 + + extern int request_dma(unsigned int dmanr, const char * device_id); /* reserve a DMA channel */ + extern void free_dma(unsigned int dmanr); /* release it again */ + ++#else /* not (defined(CONFIG_MCF5474) || defined(CONFIG_MCF5484) || defined(CONFIG_MCF5475) || defined(CONFIG_MCF5485)) */ ++ ++/************************************************ ++ * Multichannel DMA definitions * ++ ************************************************/ ++#ifdef CONFIG_MCD_DMA ++#include <asm/MCD_dma.h> ++#include <asm/m5485dma.h> ++ ++struct scatterlist; ++ ++#define MAX_DMA_CHANNELS NCHANNELS ++/* ++ * identifiers for each initiator/requestor ++ */ ++#define DMA_ALWAYS (0) ++#define DMA_DSPI_RX (1) ++#define DMA_DSPI_TX (2) ++#define DMA_DREQ0 (3) ++#define DMA_PSC0_RX (4) ++#define DMA_PSC0_TX (5) ++#define DMA_USBEP0 (6) ++#define DMA_USBEP1 (7) ++#define DMA_USBEP2 (8) ++#define DMA_USBEP3 (9) ++#define DMA_PCI_TX (10) ++#define DMA_PCI_RX (11) ++#define DMA_PSC1_RX (12) ++#define DMA_PSC1_TX (13) ++#define DMA_I2C_RX (14) ++#define DMA_I2C_TX (15) ++#define DMA_FEC0_RX (16) ++#define DMA_FEC0_TX (17) ++#define DMA_FEC1_RX (18) ++#define DMA_FEC1_TX (19) ++#define DMA_DREQ1 (20) ++#define DMA_CTM0 (21) ++#define DMA_CTM1 (22) ++#define DMA_CTM2 (23) ++#define DMA_CTM3 (24) ++#define DMA_CTM4 (25) ++#define DMA_CTM5 (26) ++#define DMA_CTM6 (27) ++#define DMA_CTM7 (28) ++#define DMA_USBEP4 (29) ++#define DMA_USBEP5 (30) ++#define DMA_USBEP6 (31) ++#define DMA_PSC2_RX (32) ++#define DMA_PSC2_TX (33) ++#define DMA_PSC3_RX (34) ++#define DMA_PSC3_TX (35) ++#define DMA_FEC_RX(x) ((x == 0) ? DMA_FEC0_RX : DMA_FEC1_RX) ++#define DMA_FEC_TX(x) ((x == 0) ? DMA_FEC0_TX : DMA_FEC1_TX) ++ ++int dma_set_initiator(int); ++unsigned int dma_get_initiator(int); ++void dma_remove_initiator(int); ++int dma_set_channel(int); ++int dma_get_channel(int); ++void dma_remove_channel(int); ++int dma_set_channel_fec(int requestor); ++int dma_connect(int channel, int address); ++int dma_disconnect(int channel); ++void dma_remove_channel_by_number(int channel); ++int dma_init(void); ++ ++#endif /* CONFIG_MCD_DMA */ ++ ++extern spinlock_t dma_spin_lock; ++ ++static __inline__ unsigned long claim_dma_lock(void) ++{ ++ unsigned long flags; ++ spin_lock_irqsave(&dma_spin_lock, flags); ++ return flags; ++} ++ ++static __inline__ void release_dma_lock(unsigned long flags) ++{ ++ spin_unlock_irqrestore(&dma_spin_lock, flags); ++} ++ ++ ++/* ++ * Linux standard DMA stuff ++ */ ++#if 0 ++int request_dma(unsigned int channel, const char * device_id); ++void free_dma(unsigned int channel); ++void enable_dma(unsigned int channel); ++void disable_dma(unsigned int channel); ++int dma_channel_active(unsigned int channel); ++void set_dma_sg(unsigned int channel, struct scatterlist *sg, int nr_sg); ++void set_dma_page(unsigned int channel, char pagenr); ++void set_dma_addr(unsigned int channel, unsigned long physaddr); ++void set_dma_count(unsigned int channel, unsigned long count); ++void set_dma_mode(unsigned int channel, unsigned int mode); ++void set_dma_speed(unsigned int channel, int cycle_ns); ++int get_dma_residue(unsigned int channel); ++#endif ++#define clear_dma_ff(channel) ++ ++#endif /* not (defined(CONFIG_MCF5474) || defined(CONFIG_MCF5484) || defined(CONFIG_MCF5475) || defined(CONFIG_MCF5485)) */ ++ + #ifdef CONFIG_PCI + extern int isa_dma_bridge_buggy; + #else +--- /dev/null ++++ b/include/asm-m68k/m5485dma.h +@@ -0,0 +1,97 @@ ++/* ++ * m5485dma.h -- ColdFire 547x/548x DMA controller support. ++ */ ++#ifndef __MCF548X_DMA_H__ ++#define __MCF548X_DMA_H__ ++ ++ ++/* Register read/write macros */ ++#define MCF_DMA_DIPR (*(volatile u32*)(void*)(MCF_MBAR+0x008014)) ++#define MCF_DMA_DIMR (*(volatile u32*)(void*)(MCF_MBAR+0x008018)) ++#define MCF_DMA_IMCR (*(volatile u32*)(void*)(MCF_MBAR+0x00805C)) ++ ++/* Bit definitions and macros for MCF_DMA_DIPR */ ++#define MCF_DMA_DIPR_TASK0 (0x00000001) ++#define MCF_DMA_DIPR_TASK1 (0x00000002) ++#define MCF_DMA_DIPR_TASK2 (0x00000004) ++#define MCF_DMA_DIPR_TASK3 (0x00000008) ++#define MCF_DMA_DIPR_TASK4 (0x00000010) ++#define MCF_DMA_DIPR_TASK5 (0x00000020) ++#define MCF_DMA_DIPR_TASK6 (0x00000040) ++#define MCF_DMA_DIPR_TASK7 (0x00000080) ++#define MCF_DMA_DIPR_TASK8 (0x00000100) ++#define MCF_DMA_DIPR_TASK9 (0x00000200) ++#define MCF_DMA_DIPR_TASK10 (0x00000400) ++#define MCF_DMA_DIPR_TASK11 (0x00000800) ++#define MCF_DMA_DIPR_TASK12 (0x00001000) ++#define MCF_DMA_DIPR_TASK13 (0x00002000) ++#define MCF_DMA_DIPR_TASK14 (0x00004000) ++#define MCF_DMA_DIPR_TASK15 (0x00008000) ++ ++/* Bit definitions and macros for MCF_DMA_DIMR */ ++#define MCF_DMA_DIMR_TASK0 (0x00000001) ++#define MCF_DMA_DIMR_TASK1 (0x00000002) ++#define MCF_DMA_DIMR_TASK2 (0x00000004) ++#define MCF_DMA_DIMR_TASK3 (0x00000008) ++#define MCF_DMA_DIMR_TASK4 (0x00000010) ++#define MCF_DMA_DIMR_TASK5 (0x00000020) ++#define MCF_DMA_DIMR_TASK6 (0x00000040) ++#define MCF_DMA_DIMR_TASK7 (0x00000080) ++#define MCF_DMA_DIMR_TASK8 (0x00000100) ++#define MCF_DMA_DIMR_TASK9 (0x00000200) ++#define MCF_DMA_DIMR_TASK10 (0x00000400) ++#define MCF_DMA_DIMR_TASK11 (0x00000800) ++#define MCF_DMA_DIMR_TASK12 (0x00001000) ++#define MCF_DMA_DIMR_TASK13 (0x00002000) ++#define MCF_DMA_DIMR_TASK14 (0x00004000) ++#define MCF_DMA_DIMR_TASK15 (0x00008000) ++ ++/* Bit definitions and macros for MCF_DMA_IMCR */ ++#define MCF_DMA_IMCR_SRC16(x) (((x)&0x00000003)<<0) ++#define MCF_DMA_IMCR_SRC17(x) (((x)&0x00000003)<<2) ++#define MCF_DMA_IMCR_SRC18(x) (((x)&0x00000003)<<4) ++#define MCF_DMA_IMCR_SRC19(x) (((x)&0x00000003)<<6) ++#define MCF_DMA_IMCR_SRC20(x) (((x)&0x00000003)<<8) ++#define MCF_DMA_IMCR_SRC21(x) (((x)&0x00000003)<<10) ++#define MCF_DMA_IMCR_SRC22(x) (((x)&0x00000003)<<12) ++#define MCF_DMA_IMCR_SRC23(x) (((x)&0x00000003)<<14) ++#define MCF_DMA_IMCR_SRC24(x) (((x)&0x00000003)<<16) ++#define MCF_DMA_IMCR_SRC25(x) (((x)&0x00000003)<<18) ++#define MCF_DMA_IMCR_SRC26(x) (((x)&0x00000003)<<20) ++#define MCF_DMA_IMCR_SRC27(x) (((x)&0x00000003)<<22) ++#define MCF_DMA_IMCR_SRC28(x) (((x)&0x00000003)<<24) ++#define MCF_DMA_IMCR_SRC29(x) (((x)&0x00000003)<<26) ++#define MCF_DMA_IMCR_SRC30(x) (((x)&0x00000003)<<28) ++#define MCF_DMA_IMCR_SRC31(x) (((x)&0x00000003)<<30) ++#define MCF_DMA_IMCR_SRC16_FEC0RX (0x00000000) ++#define MCF_DMA_IMCR_SRC17_FEC0TX (0x00000000) ++#define MCF_DMA_IMCR_SRC18_FEC0RX (0x00000020) ++#define MCF_DMA_IMCR_SRC19_FEC0TX (0x00000080) ++#define MCF_DMA_IMCR_SRC20_FEC1RX (0x00000100) ++#define MCF_DMA_IMCR_SRC21_DREQ1 (0x00000000) ++#define MCF_DMA_IMCR_SRC21_FEC1TX (0x00000400) ++#define MCF_DMA_IMCR_SRC22_FEC0RX (0x00001000) ++#define MCF_DMA_IMCR_SRC23_FEC0TX (0x00004000) ++#define MCF_DMA_IMCR_SRC24_CTM0 (0x00010000) ++#define MCF_DMA_IMCR_SRC24_FEC1RX (0x00020000) ++#define MCF_DMA_IMCR_SRC25_CTM1 (0x00040000) ++#define MCF_DMA_IMCR_SRC25_FEC1TX (0x00080000) ++#define MCF_DMA_IMCR_SRC26_USBEP4 (0x00000000) ++#define MCF_DMA_IMCR_SRC26_CTM2 (0x00200000) ++#define MCF_DMA_IMCR_SRC27_USBEP5 (0x00000000) ++#define MCF_DMA_IMCR_SRC27_CTM3 (0x00800000) ++#define MCF_DMA_IMCR_SRC28_USBEP6 (0x00000000) ++#define MCF_DMA_IMCR_SRC28_CTM4 (0x01000000) ++#define MCF_DMA_IMCR_SRC28_DREQ1 (0x02000000) ++#define MCF_DMA_IMCR_SRC28_PSC2RX (0x03000000) ++#define MCF_DMA_IMCR_SRC29_DREQ1 (0x04000000) ++#define MCF_DMA_IMCR_SRC29_CTM5 (0x08000000) ++#define MCF_DMA_IMCR_SRC29_PSC2TX (0x0C000000) ++#define MCF_DMA_IMCR_SRC30_FEC1RX (0x00000000) ++#define MCF_DMA_IMCR_SRC30_CTM6 (0x10000000) ++#define MCF_DMA_IMCR_SRC30_PSC3RX (0x30000000) ++#define MCF_DMA_IMCR_SRC31_FEC1TX (0x00000000) ++#define MCF_DMA_IMCR_SRC31_CTM7 (0x80000000) ++#define MCF_DMA_IMCR_SRC31_PSC3TX (0xC0000000) ++ ++#endif /* __MCF548X_DMA_H__ */ +--- /dev/null ++++ b/include/asm-m68k/m5485sram.h +@@ -0,0 +1,12 @@ ++#ifndef SYS_SRAM_H ++#define SYS_SRAM_H ++ ++ ++#define SYS_SRAM_DMA_START MCF_MBAR + 0x10000 ++#define SYS_SRAM_DMA_SIZE 8192 ++#define SYS_SRAM_FEC_START SYS_SRAM_DMA_START + SYS_SRAM_DMA_SIZE ++#define SYS_SRAM_FEC_SIZE 2048 ++#define SYS_SRAM_SEC_START SYS_SRAM_FEC_START + SYS_SRAM_FEC_SIZE ++#define SYS_SRAM_SEC_SIZE 1280 ++ ++#endif /* SYS_SRAM_H */ diff --git a/target/linux/coldfire/patches/046-mcfv4e_kern_to_phys.patch b/target/linux/coldfire/patches/046-mcfv4e_kern_to_phys.patch new file mode 100644 index 0000000000..b11178978d --- /dev/null +++ b/target/linux/coldfire/patches/046-mcfv4e_kern_to_phys.patch @@ -0,0 +1,1614 @@ +From 13fc0abf4b5da6f18dea15fd31697655615a79fc Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Wed, 12 Mar 2008 15:39:03 -0600 +Subject: [PATCH] Move kernel to physical sdram base address. + +Work based on the patches from Systec GMBH. Also DMA support, +uBoot integration, FEC fixes, and assorted cleanups. + +Uber patch needs to be split up. + +LTIBName: mcfv4e-kern-to-phys +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + arch/m68k/coldfire/config.c | 102 ++----- + arch/m68k/coldfire/dma.c | 7 +- + arch/m68k/coldfire/entry.S | 10 + + arch/m68k/coldfire/head.S | 53 +++- + arch/m68k/coldfire/mcf5445x-devices.c | 2 + + arch/m68k/coldfire/mcf5445x-pci.c | 3 + + arch/m68k/coldfire/signal.c | 3 + + arch/m68k/configs/m5485evb_defconfig | 79 +++++- + arch/m68k/mm/cache.c | 4 +- + arch/m68k/mm/cf-mmu.c | 28 ++- + arch/m68k/mm/memory.c | 8 +- + drivers/net/fec/fec.c | 20 +- + include/asm-m68k/bootinfo.h | 59 +++- + include/asm-m68k/cf_cacheflush.h | 547 +++++++++++---------------------- + include/asm-m68k/cf_pgalloc.h | 5 +- + include/asm-m68k/cf_pgtable.h | 2 +- + include/asm-m68k/cfcache.h | 6 + + include/asm-m68k/page.h | 8 + + include/asm-m68k/page_offset.h | 25 +- + 19 files changed, 446 insertions(+), 525 deletions(-) + +--- a/arch/m68k/coldfire/config.c ++++ b/arch/m68k/coldfire/config.c +@@ -23,7 +23,6 @@ + #include <asm/coldfire.h> + #include <asm/cfcache.h> + #include <asm/cacheflush.h> +-#include <asm/bootinfo.h> + #include <asm/io.h> + #include <asm/cfmmu.h> + #include <asm/setup.h> +@@ -36,7 +35,14 @@ + + #include <asm/mcfsim.h> + +-#if 0 ++#if defined(CONFIG_M54455) ++#define UBOOT_EXTRA_CLOCKS ++#elif defined(CONFIG_M547X_8X) ++#define UBOOT_PCI ++#endif ++#include <asm/bootinfo.h> ++ ++#ifdef CONFIG_M54455 + #include <asm/mcf5445x_intc.h> + #include <asm/mcf5445x_sdramc.h> + #include <asm/mcf5445x_fbcs.h> +@@ -44,10 +50,6 @@ + #include <asm/mcf5445x_xbs.h> + #endif + +-/* JKM -- testing */ +-#include <linux/pfn.h> +-/* JKM */ +- + extern int get_irq_list(struct seq_file *p, void *v); + extern char _text, _end; + extern char _etext, _edata, __init_begin, __init_end; +@@ -58,6 +60,10 @@ extern unsigned long availmem; + static int irq_enable[NR_IRQS]; + unsigned long num_pages; + ++/* ethernet mac addresses from uboot */ ++unsigned char uboot_enet0[6]; ++unsigned char uboot_enet1[6]; ++ + void coldfire_sort_memrec(void) + { + int i, j; +@@ -87,6 +93,9 @@ void coldfire_sort_memrec(void) + } + } + ++/* ++ * UBoot Handler ++ */ + int __init uboot_commandline(char *bootargs) + { + int len = 0, cmd_line_len; +@@ -101,12 +110,17 @@ int __init uboot_commandline(char *boota + return 0; + + /* Add offset to get post-remapped kernel memory location */ +- uboot_info.bd_info = (*(u32 *)(uboot_info_stk)) + offset; ++ uboot_info.bdi = (struct bd_info *)((*(u32 *)(uboot_info_stk)) + offset); + uboot_info.initrd_start = (*(u32 *)(uboot_info_stk+4)) + offset; + uboot_info.initrd_end = (*(u32 *)(uboot_info_stk+8)) + offset; + uboot_info.cmd_line_start = (*(u32 *)(uboot_info_stk+12)) + offset; + uboot_info.cmd_line_stop = (*(u32 *)(uboot_info_stk+16)) + offset; + ++ /* copy over mac addresses */ ++ memcpy(uboot_enet0, uboot_info.bdi->bi_enet0addr, 6); ++ memcpy(uboot_enet1, uboot_info.bdi->bi_enet1addr, 6); ++ ++ /* copy command line */ + cmd_line_len = uboot_info.cmd_line_stop - uboot_info.cmd_line_start; + if ((cmd_line_len > 0) && (cmd_line_len < CL_SIZE-1)) + len = (int)strncpy(bootargs, (char *)uboot_info.cmd_line_start,\ +@@ -121,7 +135,7 @@ int __init uboot_commandline(char *boota + #if defined(CONFIG_M54455) + #define DEFAULT_COMMAND_LINE "root=/dev/mtdblock1 rw rootfstype=jffs2 ip=none mtdparts=physmap-flash.0:5M(kernel)ro,-(jffs2)" + #elif defined(CONFIG_M547X_8X) +-#define DEFAULT_COMMAND_LINE "debug root=/dev/nfs nfsroot=172.27.155.1:/tftpboot/rigo/rootfs/ ip=172.27.155.85:172.27.155.1" ++#define DEFAULT_COMMAND_LINE "debug root=/dev/nfs rw nfsroot=172.27.155.1:/tftpboot/rigo/rootfs/ ip=172.27.155.85:172.27.155.1" + #endif + asmlinkage void __init cf_early_init(void) + { +@@ -142,7 +156,6 @@ asmlinkage void __init cf_early_init(voi + MCF_INTC1_IMRL = 0xFFFFFFFF; + MCF_INTC1_IMRH = 0xFFFFFFFF; + #elif defined(CONFIG_M547X_8X) +-/* JKM -- ?? */ + MCF_IMRL = 0xFFFFFFFF; + MCF_IMRH = 0xFFFFFFFF; + #endif +@@ -170,7 +183,6 @@ asmlinkage void __init cf_early_init(voi + MCF_XBS_PRS_M6(MCF_XBS_PRI_1) | + MCF_XBS_PRS_M7(MCF_XBS_PRI_7)); + #endif +- + + m68k_machtype = MACH_CFMMU; + m68k_fputype = FPU_CFV4E; +@@ -181,7 +193,6 @@ asmlinkage void __init cf_early_init(voi + m68k_memory[m68k_num_memory].addr = CONFIG_SDRAM_BASE; + m68k_memory[m68k_num_memory++].size = CONFIG_SDRAM_SIZE; + +-#if defined(CONFIG_M54455) + if (!uboot_commandline(m68k_command_line)) { + #if defined(CONFIG_BOOTPARAM) + strncpy(m68k_command_line, CONFIG_BOOTPARAM_STRING, CL_SIZE-1); +@@ -189,11 +200,6 @@ asmlinkage void __init cf_early_init(voi + strcpy(m68k_command_line, DEFAULT_COMMAND_LINE); + #endif + } +-#else +-/* JKM -- hack until mappings get resolved */ +- strcpy(m68k_command_line, DEFAULT_COMMAND_LINE); +-#endif +- + + #if defined(CONFIG_BLK_DEV_INITRD) + /* add initrd image */ +@@ -372,75 +378,11 @@ void coldfire_reboot(void) + #endif + } + +-/* int coldfire_hwclk(int i, struct rtc_time *t) +-{ +- printk ("Real time clock needs porting.\n"); +- return 0; +-}*/ +- + static void coldfire_get_model(char *model) + { + sprintf(model, "Version 4 ColdFire"); + } + +-/* JKM -- Why do we need these? */ +-void coldfire_enable_irq(unsigned int vec) +-{ +- unsigned long flags; +- +- vec -= 64; +- +- if (((int)vec < 0) || (vec > 63)) { +- printk(KERN_WARNING "enable_irq %d failed\n", vec); +- return; +- } +- +- local_irq_save(flags); +- irq_enable[vec]++; +-#if defined(CONFIG_M54455) +- if (vec < 32) +- MCF_INTC0_IMRL &= ~(1 << vec); +- else +- MCF_INTC0_IMRH &= ~(1 << (vec - 32)); +-#elif defined(CONFIG_M547X_8X) +- if (vec < 32) +- MCF_IMRL &= ~(1 << vec); +- else +- MCF_IMRH &= ~(1 << (vec - 32)); +-#endif +- local_irq_restore(flags); +-} +- +-/* JKM -- Why do we need these? */ +-void coldfire_disable_irq(unsigned int vec) +-{ +- unsigned long flags; +- +- vec -= 64; +- +- if (((int)vec < 0) || (vec > 63)) { +- printk(KERN_WARNING "disable_irq %d failed\n", vec); +- return; +- } +- +- local_irq_save(flags); +- if (--irq_enable[vec] == 0) { +-#if defined(CONFIG_M54455) +- if (vec < 32) +- MCF_INTC0_IMRL |= (1 << vec); +- else +- MCF_INTC0_IMRH |= (1 << (vec - 32)); +-#elif defined(CONFIG_M547X_8X) +- if (vec < 32) +- MCF_IMRL |= (1 << vec); +- else +- MCF_IMRH |= (1 << (vec - 32)); +-#endif +- +- } +- local_irq_restore(flags); +-} +- + static void __init + coldfire_bootmem_alloc(unsigned long memory_start, unsigned long memory_end) + { +--- a/arch/m68k/coldfire/dma.c ++++ b/arch/m68k/coldfire/dma.c +@@ -516,13 +516,8 @@ dma_init() + MCF_DMA_DIPR = 0xFFFFFFFF; + + MCF_ICR(ISC_DMA) = ILP_DMA; +-#if 0 +-// JKM +- enable_irq( 64 + ISC_DMA ); +-#endif + +- result = +- MCD_initDma((dmaRegs *) (MCF_MBAR + 0x8000), ++ result = MCD_initDma((dmaRegs *) (MCF_MBAR + 0x8000), + (void *) SYS_SRAM_DMA_START, MCD_RELOC_TASKS); + if (result != MCD_OK) { + printk("Cannot perform DMA initialization\n"); +--- a/arch/m68k/coldfire/entry.S ++++ b/arch/m68k/coldfire/entry.S +@@ -10,6 +10,8 @@ + * Kurt Mahan kmahan@freescale.com + * Copyright Freescale Semiconductor, Inc. 2007 + * ++ * Modify irq status in buserr -- (c) Copyright 2008, SYSTEM electronic Gmbh ++ * + * Based on: + * + * arch/m68knommu/platform/5307/entry.S & +@@ -77,7 +79,15 @@ sw_usp: + .globl inthandler + + ENTRY(buserr) ++#ifdef CONFIG_COLDFIRE_FOO ++ movew #0x2700,%sr /* lock interrupts */ ++#endif + SAVE_ALL_INT ++#ifdef CONFIG_COLDFIRE_FOO ++ movew PT_SR(%sp),%d3 /* get original %sr */ ++ oril #0x2000,%d3 /* set supervisor mode in it */ ++ movew %d3,%sr /* recover irq state */ ++#endif + GET_CURRENT(%d0) + movel %sp,%sp@- /* stack frame pointer argument */ + jsr buserr_c +--- a/arch/m68k/coldfire/head.S ++++ b/arch/m68k/coldfire/head.S +@@ -5,6 +5,7 @@ + * Matt Waddel Matt.Waddel@freescale.com + * Kurt Mahan kmahan@freescale.com + * Copyright Freescale Semiconductor, Inc. 2007, 2008 ++ * Phys kernel mapping Copyright Daniel Krueger, SYSTEC electornic GmbH 2008 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by +@@ -52,7 +53,7 @@ + #define __FINIT .previous + #endif + +-/* JKM -- REVISE DOCS FOR RIGO */ ++/* JKM -- REVISE DOCS FOR RIGO and PHYS MAPPING */ + /* + * Setup ACR mappings to provide the following memory map: + * Data +@@ -62,10 +63,17 @@ + * None currently (mapped via TLBs) + */ + ++#if CONFIG_SDRAM_BASE != PAGE_BASE + #if defined(CONFIG_M54455) ++#if 0 + #define ACR0_DEFAULT #0xA00FA048 /* ACR0 default value */ ++#endif ++#define ACR0_DEFAULT #0x400FA028 /* ACR0 default value */ + #define ACR1_DEFAULT #0xF00FA040 /* ACR1 default value */ ++#if 0 + #define ACR2_DEFAULT #0x00000000 /* ACR2 default value */ ++#endif ++#define ACR2_DEFAULT #0x400FA028 /* ACR2 default value */ + #define ACR3_DEFAULT #0x00000000 /* ACR3 default value */ + /* ACR mapping for FPGA (maps 0) */ + #define ACR0_FPGA #0x000FA048 /* ACR0 enable FPGA */ +@@ -76,6 +84,16 @@ + #define ACR3_DEFAULT #0x00000000 /* ACR3 default value */ + #endif + ++#else ++#if defined(CONFIG_M54455) ++#elif defined(CONFIG_M547X_8X) ++#define ACR0_DEFAULT #0xE000C040 /* ACR0 default value */ ++#define ACR1_DEFAULT #0x000FA008 /* ACR1 default value */ ++#define ACR2_DEFAULT #0x00000000 /* ACR2 default value */ ++#define ACR3_DEFAULT #0x000FA008 /* ACR3 default value */ ++#endif ++#endif ++ + + /* Several macros to make the writing of subroutines easier: + * - func_start marks the beginning of the routine which setups the frame +@@ -153,6 +171,7 @@ func_define putn,1 + #endif + .endm + ++#if CONFIG_SDRAM_BASE != PAGE_OFFSET + /* + mmu_map - creates a new TLB entry + +@@ -222,6 +241,7 @@ func_define putn,1 + movew \temp_data_reg, (MMUOR) + 1: + .endm /* mmu_unmap */ ++#endif /* CONFIG_SDRAM_BASE != PAGE_OFFSET */ + + /* .text */ + .section ".text.head","ax" +@@ -235,7 +255,11 @@ ENTRY(_stext) + + .long BOOTINFOV_MAGIC + .long 0 ++#if CONFIG_SDRAM_BASE != PAGE_OFFSET + 1: jmp __start-(0xc0000000-CONFIG_SDRAM_BASE) ++#else ++1: jmp __start ++#endif + + .equ kernel_pg_dir,_stext + .equ .,_stext+0x1000 +@@ -244,24 +268,13 @@ ENTRY(_start) + jra __start + __INIT + ENTRY(__start) +- +-/* JKM -- make sure Rigo handles UBOOT */ + /* Save the location of u-boot info - cmd line, bd_info, etc. */ + movel %a7,%a4 /* Don't use %a4 before cf_early_init */ +-/* JKM -- fix to use CONFIG_SDRAM_BASE) */ +-#if defined(CONFIG_M54455) +- addl #0x80000004,%a4 /* 0x80000004= 1 stack push + high mem offset */ +-#elif defined(CONFIG_M547X_8X) +- addl #0xc0000004,%a4 /* 0x80000004= 1 stack push + high mem offset */ +-#endif ++ addl #0x00000004,%a4 /* offset past top */ ++ addl #(PAGE_OFFSET-CONFIG_SDRAM_BASE),%a4 /* high mem offset */ + +-/* JKM -- fix this to work off of CONFIG_SDRAM_BASE */ + /* Setup initial stack pointer */ +-#if defined(CONFIG_M54455) +- movel #0x40001000,%sp +-#elif defined(CONFIG_M547X_8X) +- movel #0x00001000,%sp +-#endif ++ movel #CONFIG_SDRAM_BASE+0x1000,%sp + + /* Setup usp */ + subl %a0,%a0 +@@ -297,16 +310,21 @@ ENTRY(__start) + /* setup ACRs */ + movel ACR0_DEFAULT, %d0 /* ACR0 (DATA) setup */ + movec %d0, %acr0 ++ nop + movel ACR1_DEFAULT, %d0 /* ACR1 (DATA) setup */ + movec %d0, %acr1 ++ nop + movel ACR2_DEFAULT, %d0 /* ACR2 (CODE) setup */ + movec %d0, %acr2 ++ nop + movel ACR3_DEFAULT, %d0 /* ACR3 (CODE) setup */ + movec %d0, %acr3 ++ nop + + /* If you change the memory size to another value make a matching + change in paging_init(cf-mmu.c) to zones_size[]. */ + ++#if CONFIG_SDRAM_BASE != PAGE_OFFSET + #if defined(CONFIG_M54455) + /* Map 256MB as code */ + mmu_map (PAGE_OFFSET+0*0x1000000), (PHYS_OFFSET+0*0x1000000), \ +@@ -511,6 +529,7 @@ ENTRY(__start) + MMUTR_SG, MMUDR_SZ1M, MMUDR_DCB, MMUDR_SP, MMUDR_R, \ + MMUDR_W, 0, 0, %d0 + #endif ++#endif /* CONFIG_SDRAM_BASE != PAGE_OFFSET */ + + /* Turn on MMU */ + movel #(MMUCR_EN),%a0 +@@ -531,6 +550,7 @@ ENTRY(__running_high) + movel %a1,%a0@ + + /* Unmap unity mappings */ ++#if CONFIG_SDRAM_BASE != PAGE_OFFSET + #if defined(CONFIG_M54455) + mmu_unmap (PHYS_OFFSET+0*0x1000000), MMUOR_ITLB, %d0 + mmu_unmap (PHYS_OFFSET+0*0x1000000), 0, %d0 +@@ -544,6 +564,7 @@ ENTRY(__running_high) + mmu_unmap (PHYS_OFFSET+2*0x1000000), 0, %d0 + mmu_unmap (PHYS_OFFSET+3*0x1000000), 0, %d0 + #endif ++#endif /* CONFIG_SDRAM_BASE != PAGE_OFFSET */ + + /* Setup initial stack pointer */ + lea init_task,%a2 +@@ -574,6 +595,7 @@ func_return set_context + * Map in 0x00000000 -> 0x0fffffff and then do the write. + */ + set_fpga: ++#if 0 + movew %sr,%d1 + movew #0x2700,%sr + movel ACR0_FPGA, %d0 +@@ -585,6 +607,7 @@ set_fpga: + movec %d0, %acr0 + nop + movew %d1,%sr ++#endif + rts + #endif + +--- a/arch/m68k/coldfire/mcf5445x-devices.c ++++ b/arch/m68k/coldfire/mcf5445x-devices.c +@@ -127,7 +127,9 @@ static inline void mcf5445x_init_pata(vo + static int __init mcf5445x_init_devices(void) + { + printk(KERN_INFO "MCF5445x INIT_DEVICES\n"); ++#if 0 + mcf5445x_init_pata(); ++#endif + + return 0; + } +--- a/arch/m68k/coldfire/mcf5445x-pci.c ++++ b/arch/m68k/coldfire/mcf5445x-pci.c +@@ -236,6 +236,8 @@ mcf5445x_pci_arb_interrupt(int irq, void + int __init + init_mcf5445x_pci(void) + { ++ return 0; ++#if 0 + /* + * Initialize the PCI core + */ +@@ -331,6 +333,7 @@ init_mcf5445x_pci(void) + raw_pci_ops = &mcf5445x_pci_ops; + + return 0; ++#endif + } + + /* +--- a/arch/m68k/coldfire/signal.c ++++ b/arch/m68k/coldfire/signal.c +@@ -608,7 +608,10 @@ static inline int rt_setup_ucontext(stru + + static inline void push_cache(unsigned long vaddr) + { ++#if 0 ++// JKM -- need to add into the old cpushl cache stuff + cf_cache_push(__pa(vaddr), 8); ++#endif + } + + static inline void __user * +--- a/arch/m68k/configs/m5485evb_defconfig ++++ b/arch/m68k/configs/m5485evb_defconfig +@@ -1,7 +1,7 @@ + # + # Automatically generated make config: don't edit + # Linux kernel version: 2.6.24 +-# Thu Feb 21 00:19:01 2008 ++# Wed Mar 5 16:05:25 2008 + # + CONFIG_M68K=y + CONFIG_MMU=y +@@ -103,6 +103,7 @@ CONFIG_DEFAULT_IOSCHED="cfq" + # CONFIG_SUN3 is not set + CONFIG_COLDFIRE=y + CONFIG_CFV4E=y ++CONFIG_MCD_DMA=y + # CONFIG_AMIGA is not set + # CONFIG_ATARI is not set + # CONFIG_MAC is not set +@@ -135,7 +136,7 @@ CONFIG_M5485CFE=y + # CONFIG_M5485DFE is not set + # CONFIG_M5485EFE is not set + # CONFIG_M5485FFE is not set +-CONFIG_MCFCLK=50000000 ++CONFIG_MCFCLK=200000000 + # CONFIG_MCF_USER_HALT is not set + CONFIG_MMU_CFV4E=y + CONFIG_SDRAM_BASE=0x00000000 +@@ -279,7 +280,73 @@ CONFIG_FW_LOADER=y + # CONFIG_DEBUG_DEVRES is not set + # CONFIG_SYS_HYPERVISOR is not set + # CONFIG_CONNECTOR is not set +-# CONFIG_MTD is not set ++CONFIG_MTD=y ++# CONFIG_MTD_DEBUG is not set ++# CONFIG_MTD_CONCAT is not set ++CONFIG_MTD_PARTITIONS=y ++# CONFIG_MTD_REDBOOT_PARTS is not set ++CONFIG_MTD_CMDLINE_PARTS=y ++ ++# ++# User Modules And Translation Layers ++# ++# CONFIG_MTD_CHAR is not set ++CONFIG_MTD_BLKDEVS=y ++CONFIG_MTD_BLOCK=y ++# CONFIG_FTL is not set ++# CONFIG_NFTL is not set ++# CONFIG_INFTL is not set ++# CONFIG_RFD_FTL is not set ++# CONFIG_SSFDC is not set ++# CONFIG_MTD_OOPS is not set ++ ++# ++# RAM/ROM/Flash chip drivers ++# ++# CONFIG_MTD_CFI is not set ++# CONFIG_MTD_JEDECPROBE is not set ++CONFIG_MTD_MAP_BANK_WIDTH_1=y ++CONFIG_MTD_MAP_BANK_WIDTH_2=y ++CONFIG_MTD_MAP_BANK_WIDTH_4=y ++# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set ++# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set ++# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set ++CONFIG_MTD_CFI_I1=y ++CONFIG_MTD_CFI_I2=y ++# CONFIG_MTD_CFI_I4 is not set ++# CONFIG_MTD_CFI_I8 is not set ++CONFIG_MTD_RAM=y ++CONFIG_MTD_ROM=y ++# CONFIG_MTD_ABSENT is not set ++ ++# ++# Mapping drivers for chip access ++# ++# CONFIG_MTD_COMPLEX_MAPPINGS is not set ++# CONFIG_MTD_PHYSMAP is not set ++# CONFIG_MTD_PLATRAM is not set ++ ++# ++# Self-contained MTD device drivers ++# ++# CONFIG_MTD_SLRAM is not set ++# CONFIG_MTD_PHRAM is not set ++# CONFIG_MTD_MTDRAM is not set ++# CONFIG_MTD_BLOCK2MTD is not set ++ ++# ++# Disk-On-Chip Device Drivers ++# ++# CONFIG_MTD_DOC2000 is not set ++# CONFIG_MTD_DOC2001 is not set ++# CONFIG_MTD_DOC2001PLUS is not set ++# CONFIG_MTD_NAND is not set ++# CONFIG_MTD_ONENAND is not set ++ ++# ++# UBI - Unsorted block images ++# ++# CONFIG_MTD_UBI is not set + # CONFIG_PARPORT is not set + CONFIG_BLK_DEV=y + # CONFIG_BLK_DEV_COW_COMMON is not set +@@ -347,6 +414,9 @@ CONFIG_NETDEVICES=y + # CONFIG_PHYLIB is not set + CONFIG_NET_ETHERNET=y + CONFIG_MII=y ++CONFIG_FEC_548x=y ++CONFIG_FEC_548x_AUTO_NEGOTIATION=y ++# CONFIG_FEC_548x_ENABLE_FEC2 is not set + # CONFIG_IBM_NEW_EMAC_ZMII is not set + # CONFIG_IBM_NEW_EMAC_RGMII is not set + # CONFIG_IBM_NEW_EMAC_TAH is not set +@@ -530,7 +600,7 @@ CONFIG_FS_MBCACHE=y + # CONFIG_GFS2_FS is not set + # CONFIG_OCFS2_FS is not set + CONFIG_MINIX_FS=y +-# CONFIG_ROMFS_FS is not set ++CONFIG_ROMFS_FS=y + # CONFIG_INOTIFY is not set + # CONFIG_QUOTA is not set + CONFIG_DNOTIFY=y +@@ -578,6 +648,7 @@ CONFIG_TMPFS=y + # CONFIG_BEFS_FS is not set + # CONFIG_BFS_FS is not set + # CONFIG_EFS_FS is not set ++# CONFIG_JFFS2_FS is not set + # CONFIG_CRAMFS is not set + # CONFIG_VXFS_FS is not set + # CONFIG_HPFS_FS is not set +--- a/arch/m68k/mm/cache.c ++++ b/arch/m68k/mm/cache.c +@@ -81,7 +81,9 @@ static unsigned long virt_to_phys_slow(u + void flush_icache_range(unsigned long address, unsigned long endaddr) + { + #ifdef CONFIG_COLDFIRE +- cf_icache_flush_range(address, endaddr); ++// JKM -- hack until new cpushl stuff is in ++// cf_icache_flush_range(address, endaddr); ++ flush_icache(); + #else /* !CONFIG_COLDFIRE */ + + if (CPU_IS_040_OR_060) { +--- a/arch/m68k/mm/cf-mmu.c ++++ b/arch/m68k/mm/cf-mmu.c +@@ -35,6 +35,12 @@ + #include <asm/coldfire.h> + #include <asm/tlbflush.h> + ++#if PAGE_OFFSET == CONFIG_SDRAM_BASE ++#define KERNRAM(x) ((x >= PAGE_OFFSET) && (x < (PAGE_OFFSET + CONFIG_SDRAM_SIZE))) ++#else ++#define KERNRAM(x) (x >= PAGE_OFFSET) ++#endif ++ + mm_context_t next_mmu_context; + unsigned long context_map[LAST_CONTEXT / BITS_PER_LONG + 1]; + +@@ -53,10 +59,16 @@ extern char __init_begin, __init_end; + + void free_initmem(void) + { ++#if 0 + unsigned long addr; + unsigned long start = (unsigned long)&__init_begin; + unsigned long end = (unsigned long)&__init_end; + ++/* ++ * JKM -- revisit -- the latest round of vmlinux.lds changes has caused ++ * a little grief with how init areas are handled. With the new toolchain ++ * release I'll fix this. ++ */ + printk(KERN_INFO "free_initmem: __init_begin = 0x%lx __init_end = 0x%lx\n", start, end); + + addr = (unsigned long)&__init_begin; +@@ -67,6 +79,7 @@ void free_initmem(void) + free_page(addr); + totalram_pages++; + } ++#endif + } + + /* Coldfire paging_init derived from sun3 */ +@@ -149,8 +162,8 @@ int cf_tlb_miss(struct pt_regs *regs, in + mmuar = ( dtlb ) ? regs->mmuar + : regs->pc + (extension_word * sizeof(long)); + +- mm = (!user_mode(regs) && (mmuar >= PAGE_OFFSET)) ? &init_mm +- : current->mm; ++ mm = (!user_mode(regs) && KERNRAM(mmuar)) ? &init_mm : current->mm; ++ + if (!mm) { + local_irq_restore(flags); + return (-1); +@@ -167,9 +180,9 @@ int cf_tlb_miss(struct pt_regs *regs, in + local_irq_restore(flags); + return (-1); + } +- +- pte = (mmuar >= PAGE_OFFSET) ? pte_offset_kernel(pmd, mmuar) +- : pte_offset_map(pmd, mmuar); ++ ++ pte = (KERNRAM(mmuar)) ? pte_offset_kernel(pmd, mmuar) ++ : pte_offset_map(pmd, mmuar); + if (pte_none(*pte) || !pte_present(*pte)) { + local_irq_restore(flags); + return (-1); +@@ -185,7 +198,7 @@ int cf_tlb_miss(struct pt_regs *regs, in + + set_pte(pte, pte_mkyoung(*pte)); + asid = mm->context & 0xff; +- if (!pte_dirty(*pte) && mmuar<=PAGE_OFFSET) ++ if (!pte_dirty(*pte) && !KERNRAM(mmuar)) + set_pte(pte, pte_wrprotect(*pte)); + + *MMUTR = (mmuar & PAGE_MASK) | (asid << CF_ASID_MMU_SHIFT) +@@ -201,7 +214,8 @@ int cf_tlb_miss(struct pt_regs *regs, in + else + *MMUOR = MMUOR_ITLB | MMUOR_ACC | MMUOR_UAA; + +- asm ("nop"); ++ asm("nop"); ++ + /*printk("cf_tlb_miss: va=%lx, pa=%lx\n", (mmuar & PAGE_MASK), + (pte_val(*pte) & PAGE_MASK));*/ + local_irq_restore(flags); +--- a/arch/m68k/mm/memory.c ++++ b/arch/m68k/mm/memory.c +@@ -206,7 +206,9 @@ static inline void pushcl040(unsigned lo + void cache_clear (unsigned long paddr, int len) + { + #ifdef CONFIG_COLDFIRE +- cf_cache_clear(paddr, len); ++// JKM -- revise to use proper caching ++// cf_cache_clear(paddr, len); ++ flush_bcache(); + #else + if (CPU_IS_040_OR_060) { + int tmp; +@@ -257,7 +259,9 @@ EXPORT_SYMBOL(cache_clear); + void cache_push (unsigned long paddr, int len) + { + #ifdef CONFIG_COLDFIRE +- cf_cache_push(paddr, len); ++// JKM -- revise to use proper caching ++// cf_cache_push(paddr, len); ++ flush_bcache(); + #else + if (CPU_IS_040_OR_060) { + int tmp = PAGE_SIZE; +--- a/drivers/net/fec/fec.c ++++ b/drivers/net/fec/fec.c +@@ -99,6 +99,9 @@ unsigned char fec_mac_addr_fec0[6] = { 0 + unsigned char fec_mac_addr_fec1[6] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x51 }; // Default address of FEC1 + #endif + ++extern unsigned char uboot_enet0[]; ++extern unsigned char uboot_enet1[]; ++ + #ifndef MODULE + int fec_str_to_mac( char *str_mac, unsigned char* addr); + int __init fec_mac_setup0 (char *s); +@@ -175,6 +178,12 @@ printk(KERN_INFO "FEI: index=%d\n", inde + printk(KERN_INFO "FEI: txdesc=0x%p rxdesc=0x%p\n", fp->fecpriv_txdesc, fp->fecpriv_rxdesc); + + /* mac addr */ ++ if (uboot_enet0[0] || uboot_enet0[1] || uboot_enet0[2] || ++ uboot_enet0[3] || uboot_enet0[4] || uboot_enet0[5]) { ++ /* use uboot enet 0 addr */ ++ memcpy(fec_mac_addr_fec0, uboot_enet0, 6); ++ } ++ + fp->fecpriv_mac_addr = fec_mac_addr_fec0; + } + else { +@@ -211,6 +220,11 @@ printk(KERN_INFO "FEI: txdesc=0x%p rxde + fp->fecpriv_rxdesc = (void*)FEC_RX_DESC_FEC1; + + /* mac addr */ ++ if (uboot_enet1[0] || uboot_enet1[1] || uboot_enet1[2] || ++ uboot_enet1[3] || uboot_enet1[4] || uboot_enet1[5]) { ++ /* use uboot enet 1 addr */ ++ memcpy(fec_mac_addr_fec1, uboot_enet1, 6); ++ } + fp->fecpriv_mac_addr = fec_mac_addr_fec1; + #endif + } +@@ -762,7 +776,6 @@ int fec_tx(struct sk_buff *skb, struct n + void *data, *data_aligned; + int offset; + +-printk(KERN_INFO "fec_tx\n"); + data = kmalloc(skb->len + 15, GFP_DMA | GFP_ATOMIC); + + if (!data) +@@ -820,7 +833,6 @@ void fec_tx_timeout(struct net_device *d + struct fec_priv *fp = netdev_priv(dev); + unsigned long base_addr = (unsigned long) dev->base_addr; + +-printk(KERN_INFO "fec_tx_timeout\n"); + spin_lock_irq(&fp->fecpriv_lock); + MCD_killDma(fp->fecpriv_fec_tx_channel); + for (i = 0; i < FEC_TX_BUF_NUMBER; i++) +@@ -941,7 +953,6 @@ void fec_interrupt_fec_tx_handler(struct + { + struct fec_priv *fp = netdev_priv(dev); + +-printk(KERN_INFO "fectxint\n"); + //Release the socket buffer + if(fp->fecpriv_txbuf[fp->fecpriv_current_tx]) + { +@@ -977,7 +988,6 @@ void fec_interrupt_fec_rx_handler(struct + struct fec_priv *fp = netdev_priv(dev); + struct sk_buff *skb; + +-printk(KERN_INFO "fecrxint\n"); + fp->fecpriv_rxflag = 1; + /* + // Some buffers can be missed +@@ -1070,7 +1080,6 @@ irqreturn_t fec_interrupt_handler(int ir + unsigned long base_addr = (unsigned long) dev->base_addr; + unsigned long events; + +-printk(KERN_INFO "fecerrint\n"); + // Read and clear the events + events = FEC_EIR(base_addr) & FEC_EIMR(base_addr); + +@@ -1157,7 +1166,6 @@ void fec_interrupt_fec_reinit(unsigned l + struct fec_priv *fp = netdev_priv(dev); + unsigned long base_addr = (unsigned long) dev->base_addr; + +-printk(KERN_INFO "fecreinit\n"); + // Initialize reception descriptors and start DMA for the reception + for (i = 0; i < FEC_RX_BUF_NUMBER; i++) + { +--- a/include/asm-m68k/bootinfo.h ++++ b/include/asm-m68k/bootinfo.h +@@ -19,11 +19,59 @@ + ** Redesign of the boot information structure; renamed to bootinfo.h again + ** 27/11/96 Geert Uytterhoeven: + ** Backwards compatibility with bootinfo interface version 1.0 ++** 12/03/08 Kurt Mahan ++** Copy the bd_info structure from uboot1.3.2/include/asm-m68k/u-boot.h ++** into this file. The original author is Wolfgang Denk, ++** DENX Software Engineering, wd@denx.de. + */ + + #ifndef _M68K_BOOTINFO_H + #define _M68K_BOOTINFO_H + ++#ifndef __ASSEMBLY__ ++/* ++ * UBoot Support ++ * ++ * bd_info structure from uboot1.3.2/include/asm-m68k/u-boot.h ++ */ ++struct bd_info { ++ unsigned long bi_memstart; /* start of DRAM memory */ ++ unsigned long bi_memsize; /* size of DRAM memory in bytes */ ++ unsigned long bi_flashstart; /* start of FLASH memory */ ++ unsigned long bi_flashsize; /* size of FLASH memory */ ++ unsigned long bi_flashoffset; /* reserved area for startup monitor */ ++ unsigned long bi_sramstart; /* start of SRAM memory */ ++ unsigned long bi_sramsize; /* size of SRAM memory */ ++ unsigned long bi_mbar_base; /* base of internal registers */ ++ unsigned long bi_bootflags; /* boot / reboot flag (for LynxOS) */ ++ unsigned long bi_boot_params; /* where this board expects params */ ++ unsigned long bi_ip_addr; /* IP Address */ ++ unsigned char bi_enet0addr[6]; /* Ethernet 0 mac address */ ++ unsigned short bi_ethspeed; /* Ethernet speed in Mbps */ ++ unsigned long bi_intfreq; /* Internal Freq, in MHz */ ++ unsigned long bi_busfreq; /* Bus Freq, in MHz */ ++#ifdef UBOOT_PCI ++ unsigned long bi_pcifreq; /* pci Freq in MHz */ ++#endif ++#ifdef UBOOT_EXTRA_CLOCK ++ unsigned long bi_inpfreq; /* input Freq in MHz */ ++ unsigned long bi_vcofreq; /* vco Freq in MHz */ ++ unsigned long bi_flbfreq; /* Flexbus Freq in MHz */ ++#endif ++ unsigned long bi_baudrate; /* Console Baudrate */ ++ unsigned char bi_enet1addr[6]; /* eth1 mac address */ ++ unsigned char bi_enet2addr[6]; /* eth2 mac address */ ++ unsigned char bi_enet3addr[6]; /* eth3 mac address */ ++}; ++ ++struct uboot_record { ++ struct bd_info *bdi; ++ unsigned long initrd_start; ++ unsigned long initrd_end; ++ unsigned long cmd_line_start; ++ unsigned long cmd_line_stop; ++}; ++#endif /* __ASSEMBLY__ */ + + /* + * Bootinfo definitions +@@ -49,17 +97,6 @@ struct bi_record { + #endif /* __ASSEMBLY__ */ + + +-#ifndef __ASSEMBLY__ +- +-struct uboot_record { +- unsigned long bd_info; +- unsigned long initrd_start; +- unsigned long initrd_end; +- unsigned long cmd_line_start; +- unsigned long cmd_line_stop; +-}; +- +-#endif /* __ASSEMBLY__ */ + + + /* +--- a/include/asm-m68k/cf_cacheflush.h ++++ b/include/asm-m68k/cf_cacheflush.h +@@ -1,335 +1,92 @@ +-/* +- * include/asm-m68k/cf_cacheflush.h - Coldfire Cache +- * +- * Based on include/asm-m68k/cacheflush.h +- * +- * Coldfire pieces by: +- * Kurt Mahan kmahan@freescale.com +- * +- * Copyright Freescale Semiconductor, Inc. 2007 +- * +- * This program is free software; you can redistribute it and/or modify it +- * under the terms of the GNU General Public License as published by the +- * Free Software Foundation; either version 2 of the License, or (at your +- * option) any later version. +- */ + #ifndef M68K_CF_CACHEFLUSH_H + #define M68K_CF_CACHEFLUSH_H + + #include <asm/cfcache.h> +- + /* +- * Coldfire Cache Model +- * +- * The Coldfire processors use a Harvard architecture cache configured +- * as four-way set associative. The cache does not implement bus snooping +- * so cache coherency with other masters must be maintained in software. +- * +- * The cache is managed via the CPUSHL instruction in conjunction with +- * bits set in the CACR (cache control register). Currently the code +- * uses the CPUSHL enhancement which adds the ability to +- * invalidate/clear/push a cacheline by physical address. This feature +- * is designated in the Hardware Configuration Register [D1-CPES]. +- * +- * CACR Bits: +- * DPI[28] cpushl invalidate disable for d-cache +- * IDPI[12] cpushl invalidate disable for i-cache +- * SPA[14] cpushl search by physical address +- * IVO[20] cpushl invalidate only +- * +- * Random Terminology: +- * * invalidate = reset the cache line's valid bit +- * * push = generate a line-sized store of the data if its contents are marked +- * as modifed (the modified flag is cleared after the store) +- * * clear = push + invalidate +- */ +- +-/** +- * flush_icache - Flush all of the instruction cache +- */ +-static inline void flush_icache(void) +-{ +- asm volatile("nop\n" +- "moveq%.l #0,%%d0\n" +- "moveq%.l #0,%%d1\n" +- "move%.l %%d0,%%a0\n" +- "1:\n" +- "cpushl %%ic,(%%a0)\n" +- "add%.l #0x0010,%%a0\n" +- "addq%.l #1,%%d1\n" +- "cmpi%.l %0,%%d1\n" +- "bne 1b\n" +- "moveq%.l #0,%%d1\n" +- "addq%.l #1,%%d0\n" +- "move%.l %%d0,%%a0\n" +- "cmpi%.l #4,%%d0\n" +- "bne 1b\n" +- : : "i" (CACHE_SETS) +- : "a0", "d0", "d1"); +-} +- +-/** +- * flush_dcache - Flush all of the data cache +- */ +-static inline void flush_dcache(void) +-{ +- asm volatile("nop\n" +- "moveq%.l #0,%%d0\n" +- "moveq%.l #0,%%d1\n" +- "move%.l %%d0,%%a0\n" +- "1:\n" +- "cpushl %%dc,(%%a0)\n" +- "add%.l #0x0010,%%a0\n" +- "addq%.l #1,%%d1\n" +- "cmpi%.l %0,%%d1\n" +- "bne 1b\n" +- "moveq%.l #0,%%d1\n" +- "addq%.l #1,%%d0\n" +- "move%.l %%d0,%%a0\n" +- "cmpi%.l #4,%%d0\n" +- "bne 1b\n" +- : : "i" (CACHE_SETS) +- : "a0", "d0", "d1"); +-} +- +-/** +- * flush_bcache - Flush all of both caches ++ * Cache handling functions + */ +-static inline void flush_bcache(void) +-{ +- asm volatile("nop\n" +- "moveq%.l #0,%%d0\n" +- "moveq%.l #0,%%d1\n" +- "move%.l %%d0,%%a0\n" +- "1:\n" +- "cpushl %%bc,(%%a0)\n" +- "add%.l #0x0010,%%a0\n" +- "addq%.l #1,%%d1\n" +- "cmpi%.l %0,%%d1\n" +- "bne 1b\n" +- "moveq%.l #0,%%d1\n" +- "addq%.l #1,%%d0\n" +- "move%.l %%d0,%%a0\n" +- "cmpi%.l #4,%%d0\n" +- "bne 1b\n" +- : : "i" (CACHE_SETS) +- : "a0", "d0", "d1"); +-} + +-/** +- * cf_cache_clear - invalidate cache +- * @paddr: starting physical address +- * @len: number of bytes +- * +- * Invalidate cache lines starting at paddr for len bytes. +- * Those lines are not pushed. +- */ +-static inline void cf_cache_clear(unsigned long paddr, int len) +-{ +- /* number of lines */ +- len = (len + (CACHE_LINE_SIZE-1)) / CACHE_LINE_SIZE; +- if (len == 0) +- return; +- +- /* align on set boundary */ +- paddr &= 0xfffffff0; +- +- asm volatile("nop\n" +- "move%.l %2,%%d0\n" +- "or%.l %3,%%d0\n" +- "movec %%d0,%%cacr\n" +- "move%.l %0,%%a0\n" +- "move%.l %1,%%d0\n" +- "1:\n" +- "cpushl %%bc,(%%a0)\n" +- "lea 0x10(%%a0),%%a0\n" +- "subq%.l #1,%%d0\n" +- "bne%.b 1b\n" +- "movec %2,%%cacr\n" +- : : "a" (paddr), "r" (len), +- "r" (shadow_cacr), +- "i" (CF_CACR_SPA+CF_CACR_IVO) +- : "a0", "d0"); +-} +- +-/** +- * cf_cache_push - Push dirty cache out with no invalidate +- * @paddr: starting physical address +- * @len: number of bytes +- * +- * Push the any dirty lines starting at paddr for len bytes. +- * Those lines are not invalidated. +- */ +-static inline void cf_cache_push(unsigned long paddr, int len) +-{ +- /* number of lines */ +- len = (len + (CACHE_LINE_SIZE-1)) / CACHE_LINE_SIZE; +- if (len == 0) +- return; +- +- /* align on set boundary */ +- paddr &= 0xfffffff0; +- +- asm volatile("nop\n" +- "move%.l %2,%%d0\n" +- "or%.l %3,%%d0\n" +- "movec %%d0,%%cacr\n" +- "move%.l %0,%%a0\n" +- "move%.l %1,%%d0\n" +- "1:\n" +- "cpushl %%bc,(%%a0)\n" +- "lea 0x10(%%a0),%%a0\n" +- "subq%.l #1,%%d0\n" +- "bne.b 1b\n" +- "movec %2,%%cacr\n" +- : : "a" (paddr), "r" (len), +- "r" (shadow_cacr), +- "i" (CF_CACR_SPA+CF_CACR_DPI+CF_CACR_IDPI) +- : "a0", "d0"); +-} ++#define flush_icache() \ ++({ \ ++ unsigned long set; \ ++ unsigned long start_set; \ ++ unsigned long end_set; \ ++ \ ++ start_set = 0; \ ++ end_set = (unsigned long)LAST_DCACHE_ADDR; \ ++ \ ++ for (set = start_set; set <= end_set; set += (0x10 - 3)) { \ ++ asm volatile("cpushl %%ic,(%0)\n" \ ++ "\taddq%.l #1,%0\n" \ ++ "\tcpushl %%ic,(%0)\n" \ ++ "\taddq%.l #1,%0\n" \ ++ "\tcpushl %%ic,(%0)\n" \ ++ "\taddq%.l #1,%0\n" \ ++ "\tcpushl %%ic,(%0)" : "=a" (set) : "a" (set)); \ ++ } \ ++}) ++ ++#define flush_dcache() \ ++({ \ ++ unsigned long set; \ ++ unsigned long start_set; \ ++ unsigned long end_set; \ ++ \ ++ start_set = 0; \ ++ end_set = (unsigned long)LAST_DCACHE_ADDR; \ ++ \ ++ for (set = start_set; set <= end_set; set += (0x10 - 3)) { \ ++ asm volatile("cpushl %%dc,(%0)\n" \ ++ "\taddq%.l #1,%0\n" \ ++ "\tcpushl %%dc,(%0)\n" \ ++ "\taddq%.l #1,%0\n" \ ++ "\tcpushl %%dc,(%0)\n" \ ++ "\taddq%.l #1,%0\n" \ ++ "\tcpushl %%dc,(%0)" : "=a" (set) : "a" (set)); \ ++ } \ ++}) ++ ++#define flush_bcache() \ ++({ \ ++ unsigned long set; \ ++ unsigned long start_set; \ ++ unsigned long end_set; \ ++ \ ++ start_set = 0; \ ++ end_set = (unsigned long)LAST_DCACHE_ADDR; \ ++ \ ++ for (set = start_set; set <= end_set; set += (0x10 - 3)) { \ ++ asm volatile("cpushl %%bc,(%0)\n" \ ++ "\taddq%.l #1,%0\n" \ ++ "\tcpushl %%bc,(%0)\n" \ ++ "\taddq%.l #1,%0\n" \ ++ "\tcpushl %%bc,(%0)\n" \ ++ "\taddq%.l #1,%0\n" \ ++ "\tcpushl %%bc,(%0)" : "=a" (set) : "a" (set)); \ ++ } \ ++}) + +-/** +- * cf_cache_flush - Push dirty cache out and invalidate +- * @paddr: starting physical address +- * @len: number of bytes +- * +- * Push the any dirty lines starting at paddr for len bytes and +- * invalidate those lines. ++/* ++ * invalidate the cache for the specified memory range. ++ * It starts at the physical address specified for ++ * the given number of bytes. + */ +-static inline void cf_cache_flush(unsigned long paddr, int len) +-{ +- /* number of lines */ +- len = (len + (CACHE_LINE_SIZE-1)) / CACHE_LINE_SIZE; +- if (len == 0) +- return; +- +- /* align on set boundary */ +- paddr &= 0xfffffff0; +- +- asm volatile("nop\n" +- "move%.l %2,%%d0\n" +- "or%.l %3,%%d0\n" +- "movec %%d0,%%cacr\n" +- "move%.l %0,%%a0\n" +- "move%.l %1,%%d0\n" +- "1:\n" +- "cpushl %%bc,(%%a0)\n" +- "lea 0x10(%%a0),%%a0\n" +- "subq%.l #1,%%d0\n" +- "bne.b 1b\n" +- "movec %2,%%cacr\n" +- : : "a" (paddr), "r" (len), +- "r" (shadow_cacr), +- "i" (CF_CACR_SPA) +- : "a0", "d0"); +-} +- +-/** +- * cf_cache_flush_range - Push dirty data/inst cache in range out and invalidate +- * @vstart - starting virtual address +- * @vend: ending virtual address +- * +- * Push the any dirty data/instr lines starting at paddr for len bytes and +- * invalidate those lines. ++extern void cache_clear(unsigned long paddr, int len); ++/* ++ * push any dirty cache in the specified memory range. ++ * It starts at the physical address specified for ++ * the given number of bytes. + */ +-static inline void cf_cache_flush_range(unsigned long vstart, unsigned long vend) +-{ +- int len; +- +- /* align on set boundary */ +- vstart &= 0xfffffff0; +- vend = PAGE_ALIGN((vend + (CACHE_LINE_SIZE-1))) & 0xfffffff0; +- len = vend - vstart; +- if (len == 0) +- return; +- vstart = __pa(vstart); +- vend = vstart + len; +- +- asm volatile("nop\n" +- "move%.l %2,%%d0\n" +- "or%.l %3,%%d0\n" +- "movec %%d0,%%cacr\n" +- "move%.l %0,%%a0\n" +- "move%.l %1,%%a1\n" +- "1:\n" +- "cpushl %%bc,(%%a0)\n" +- "lea 0x10(%%a0),%%a0\n" +- "cmpa%.l %%a0,%%a1\n" +- "bne.b 1b\n" +- "movec %2,%%cacr\n" +- : /* no return */ +- : "a" (vstart), "a" (vend), +- "r" (shadow_cacr), +- "i" (CF_CACR_SPA) +- : "a0", "a1", "d0"); +-} ++extern void cache_push(unsigned long paddr, int len); + +-/** +- * cf_dcache_flush_range - Push dirty data cache in range out and invalidate +- * @vstart - starting virtual address +- * @vend: ending virtual address +- * +- * Push the any dirty data lines starting at paddr for len bytes and +- * invalidate those lines. ++/* ++ * push and invalidate pages in the specified user virtual ++ * memory range. + */ +-static inline void cf_dcache_flush_range(unsigned long vstart, unsigned long vend) +-{ +- /* align on set boundary */ +- vstart &= 0xfffffff0; +- vend = (vend + (CACHE_LINE_SIZE-1)) & 0xfffffff0; +- +- asm volatile("nop\n" +- "move%.l %2,%%d0\n" +- "or%.l %3,%%d0\n" +- "movec %%d0,%%cacr\n" +- "move%.l %0,%%a0\n" +- "move%.l %1,%%a1\n" +- "1:\n" +- "cpushl %%dc,(%%a0)\n" +- "lea 0x10(%%a0),%%a0\n" +- "cmpa%.l %%a0,%%a1\n" +- "bne.b 1b\n" +- "movec %2,%%cacr\n" +- : /* no return */ +- : "a" (__pa(vstart)), "a" (__pa(vend)), +- "r" (shadow_cacr), +- "i" (CF_CACR_SPA) +- : "a0", "a1", "d0"); +-} ++extern void cache_push_v(unsigned long vaddr, int len); + +-/** +- * cf_icache_flush_range - Push dirty inst cache in range out and invalidate +- * @vstart - starting virtual address +- * @vend: ending virtual address +- * +- * Push the any dirty instr lines starting at paddr for len bytes and +- * invalidate those lines. This should just be an invalidate since you +- * shouldn't be able to have dirty instruction cache. +- */ +-static inline void cf_icache_flush_range(unsigned long vstart, unsigned long vend) +-{ +- /* align on set boundary */ +- vstart &= 0xfffffff0; +- vend = (vend + (CACHE_LINE_SIZE-1)) & 0xfffffff0; +- +- asm volatile("nop\n" +- "move%.l %2,%%d0\n" +- "or%.l %3,%%d0\n" +- "movec %%d0,%%cacr\n" +- "move%.l %0,%%a0\n" +- "move%.l %1,%%a1\n" +- "1:\n" +- "cpushl %%ic,(%%a0)\n" +- "lea 0x10(%%a0),%%a0\n" +- "cmpa%.l %%a0,%%a1\n" +- "bne.b 1b\n" +- "movec %2,%%cacr\n" +- : /* no return */ +- : "a" (__pa(vstart)), "a" (__pa(vend)), +- "r" (shadow_cacr), +- "i" (CF_CACR_SPA) +- : "a0", "a1", "d0"); +-} ++/* This is needed whenever the virtual mapping of the current ++ process changes. */ + + /** + * flush_cache_mm - Flush an mm_struct +@@ -343,6 +100,8 @@ static inline void flush_cache_mm(struct + + #define flush_cache_dup_mm(mm) flush_cache_mm(mm) + ++#define flush_cache_all() flush_bcache() ++ + /** + * flush_cache_range - Flush a cache range + * @vma: vma struct +@@ -356,7 +115,8 @@ static inline void flush_cache_range(str + unsigned long start, unsigned long end) + { + if (vma->vm_mm == current->mm) +- cf_cache_flush_range(start, end); ++ flush_bcache(); ++// cf_cache_flush_range(start, end); + } + + /** +@@ -372,76 +132,113 @@ static inline void flush_cache_page(stru + unsigned long vmaddr, unsigned long pfn) + { + if (vma->vm_mm == current->mm) +- cf_cache_flush_range(vmaddr, vmaddr+PAGE_SIZE); ++ flush_bcache(); ++// cf_cache_flush_range(vmaddr, vmaddr+PAGE_SIZE); + } + +-/** +- * __flush_page_to_ram - Push a page out of the cache +- * @vaddr: Virtual address at start of page +- * +- * Push the page at kernel virtual address *vaddr* and clear +- * the icache. +- */ +-static inline void __flush_page_to_ram(void *vaddr) +-{ +- asm volatile("nop\n" +- "move%.l %2,%%d0\n" +- "or%.l %3,%%d0\n" +- "movec %%d0,%%cacr\n" +- "move%.l %0,%%d0\n" +- "and%.l #0xfffffff0,%%d0\n" +- "move%.l %%d0,%%a0\n" +- "move%.l %1,%%d0\n" +- "1:\n" +- "cpushl %%bc,(%%a0)\n" +- "lea 0x10(%%a0),%%a0\n" +- "subq%.l #1,%%d0\n" +- "bne.b 1b\n" +- "movec %2,%%cacr\n" +- : : "a" (__pa(vaddr)), "i" (PAGE_SIZE / CACHE_LINE_SIZE), +- "r" (shadow_cacr), "i" (CF_CACR_SPA) +- : "a0", "d0"); ++/* Push the page at kernel virtual address and clear the icache */ ++/* RZ: use cpush %bc instead of cpush %dc, cinv %ic */ ++#define flush_page_to_ram(page) __flush_page_to_ram((void *) page_address(page)) ++extern inline void __flush_page_to_ram(void *address) ++{ ++ unsigned long set; ++ unsigned long start_set; ++ unsigned long end_set; ++ unsigned long addr = (unsigned long) address; ++ ++ addr &= ~(PAGE_SIZE - 1); /* round down to page start address */ ++ ++ start_set = addr & _ICACHE_SET_MASK; ++ end_set = (addr + PAGE_SIZE-1) & _ICACHE_SET_MASK; ++ ++ if (start_set > end_set) { ++ /* from the begining to the lowest address */ ++ for (set = 0; set <= end_set; set += (0x10 - 3)) { ++ asm volatile("cpushl %%bc,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%bc,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%bc,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%bc,(%0)" : "=a" (set) : "a" (set)); ++ } ++ /* next loop will finish the cache ie pass the hole */ ++ end_set = LAST_ICACHE_ADDR; ++ } ++ for (set = start_set; set <= end_set; set += (0x10 - 3)) { ++ asm volatile("cpushl %%bc,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%bc,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%bc,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%bc,(%0)" : "=a" (set) : "a" (set)); ++ } ++} ++ ++/* Use __flush_page_to_ram() for flush_dcache_page all values are same - MW */ ++#define flush_dcache_page(page) \ ++ __flush_page_to_ram((void *) page_address(page)) ++#define flush_icache_page(vma,pg) \ ++ __flush_page_to_ram((void *) page_address(pg)) ++#define flush_icache_user_range(adr,len) do { } while (0) ++/* NL */ ++#define flush_icache_user_page(vma,page,addr,len) do { } while (0) ++ ++/* Push n pages at kernel virtual address and clear the icache */ ++/* RZ: use cpush %bc instead of cpush %dc, cinv %ic */ ++extern inline void flush_icache_range (unsigned long address, ++ unsigned long endaddr) ++{ ++ unsigned long set; ++ unsigned long start_set; ++ unsigned long end_set; ++ ++ start_set = address & _ICACHE_SET_MASK; ++ end_set = endaddr & _ICACHE_SET_MASK; ++ ++ if (start_set > end_set) { ++ /* from the begining to the lowest address */ ++ for (set = 0; set <= end_set; set += (0x10 - 3)) { ++ asm volatile("cpushl %%ic,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%ic,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%ic,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%ic,(%0)" : "=a" (set) : "a" (set)); ++ } ++ /* next loop will finish the cache ie pass the hole */ ++ end_set = LAST_ICACHE_ADDR; ++ } ++ for (set = start_set; set <= end_set; set += (0x10 - 3)) { ++ asm volatile("cpushl %%ic,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%ic,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%ic,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%ic,(%0)" : "=a" (set) : "a" (set)); ++ } + } + +-/* +- * Various defines for the kernel. +- */ +- +-extern void cache_clear(unsigned long paddr, int len); +-extern void cache_push(unsigned long paddr, int len); +-extern void flush_icache_range(unsigned long address, unsigned long endaddr); +- +-#define flush_cache_all() flush_bcache() +-#define flush_cache_vmap(start, end) flush_bcache() +-#define flush_cache_vunmap(start, end) flush_bcache() +- +-#define flush_dcache_range(vstart, vend) cf_dcache_flush_range(vstart, vend) +-#define flush_dcache_page(page) __flush_page_to_ram(page_address(page)) +-#define flush_dcache_mmap_lock(mapping) do { } while (0) +-#define flush_dcache_mmap_unlock(mapping) do { } while (0) +- +-#define flush_icache_page(vma, page) __flush_page_to_ram(page_address(page)) +- +-/** +- * copy_to_user_page - Copy memory to user page +- */ + static inline void copy_to_user_page(struct vm_area_struct *vma, + struct page *page, unsigned long vaddr, + void *dst, void *src, int len) + { + memcpy(dst, src, len); +- cf_cache_flush(page_to_phys(page), PAGE_SIZE); ++ flush_icache_user_page(vma, page, vaddr, len); + } +- +-/** +- * copy_from_user_page - Copy memory from user page +- */ + static inline void copy_from_user_page(struct vm_area_struct *vma, + struct page *page, unsigned long vaddr, + void *dst, void *src, int len) + { +- cf_cache_flush(page_to_phys(page), PAGE_SIZE); + memcpy(dst, src, len); + } + ++#define flush_cache_vmap(start, end) flush_cache_all() ++#define flush_cache_vunmap(start, end) flush_cache_all() ++#define flush_dcache_mmap_lock(mapping) do { } while (0) ++#define flush_dcache_mmap_unlock(mapping) do { } while (0) ++ + #endif /* M68K_CF_CACHEFLUSH_H */ +--- a/include/asm-m68k/cf_pgalloc.h ++++ b/include/asm-m68k/cf_pgalloc.h +@@ -1,13 +1,9 @@ + #ifndef M68K_CF_PGALLOC_H + #define M68K_CF_PGALLOC_H + +-/* JKM -- added -- needed? */ +-#include <linux/highmem.h> +- + #include <asm/coldfire.h> + #include <asm/page.h> + #include <asm/cf_tlbflush.h> +-/* JKM -- added -- needed? */ + #include <asm/cf_cacheflush.h> + + extern inline void pte_free_kernel(pte_t *pte) +@@ -41,6 +37,7 @@ extern inline pmd_t *pmd_alloc_kernel(pg + + #define pmd_populate(mm, pmd, page) (pmd_val(*pmd) = \ + (unsigned long)(page_address(page))) ++ + #define pmd_populate_kernel(mm, pmd, pte) (pmd_val(*pmd) = (unsigned long)(pte)) + + static inline void __pte_free_tlb(struct mmu_gather *tlb, struct page *page) +--- a/include/asm-m68k/cf_pgtable.h ++++ b/include/asm-m68k/cf_pgtable.h +@@ -341,7 +341,7 @@ static inline pte_t pgoff_to_pte(unsigne + #define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) }) + #define __swp_entry_to_pte(x) (__pte((x).val)) + +-#define pmd_page(pmd) virt_to_page(__pmd_page(pmd)) ++#define pmd_page(pmd) (pfn_to_page(pmd_val(pmd) >> PAGE_SHIFT)) + + #define pte_offset_map(pmdp, address) ((pte_t *)__pmd_page(*pmdp) + \ + __pte_offset(address)) +--- a/include/asm-m68k/cfcache.h ++++ b/include/asm-m68k/cfcache.h +@@ -87,6 +87,12 @@ + #define CACHE_SETS 0x0200 /* 512 sets */ + #define CACHE_WAYS 0x0004 /* 4 way */ + ++/* in for the old cpushl caching code */ ++#define _DCACHE_SET_MASK ((DCACHE_SIZE/64-1)<<CACHE_WAYS) ++#define _ICACHE_SET_MASK ((ICACHE_SIZE/64-1)<<CACHE_WAYS) ++#define LAST_DCACHE_ADDR _DCACHE_SET_MASK ++#define LAST_ICACHE_ADDR _ICACHE_SET_MASK ++ + #define CACHE_DISABLE_MODE (CF_CACR_DCINVA+ \ + CF_CACR_BCINVA+ \ + CF_CACR_ICINVA) +--- a/include/asm-m68k/page.h ++++ b/include/asm-m68k/page.h +@@ -123,13 +123,21 @@ extern unsigned long m68k_memoffset; + #if defined(CONFIG_COLDFIRE) + static inline unsigned long ___pa(void *vaddr) + { ++#if CONFIG_SDRAM_BASE != PAGE_OFFSET + return (((unsigned long)vaddr & 0x0fffffff) + CONFIG_SDRAM_BASE); ++#else ++ return (unsigned long)vaddr; ++#endif + } + #define __pa(vaddr) ___pa((void *)(vaddr)) + + static inline void *__va(unsigned long paddr) + { ++#if CONFIG_SDRAM_BASE != PAGE_OFFSET + return (void *)((paddr & 0x0fffffff) + PAGE_OFFSET); ++#else ++ return (void *)paddr; ++#endif + } + + #else +--- a/include/asm-m68k/page_offset.h ++++ b/include/asm-m68k/page_offset.h +@@ -1,16 +1,15 @@ ++/* ++ * Page and physical memory maps. ++ */ ++#if defined(CONFIG_SUN3) ++#define PAGE_OFFSET_RAW 0x0E000000 ++ ++#elif defined(CONFIG_M54455) || defined(CONFIG_M547X_8X) ++#define PHYS_OFFSET CONFIG_SDRAM_BASE ++#define PAGE_OFFSET_RAW (PHYS_OFFSET) ++/* #define PAGE_OFFSET_RAW 0xC0000000 */ + +-/* This handles the memory map.. */ +-#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE) ++#else ++/* default */ + #define PAGE_OFFSET_RAW 0x00000000 +-#elif defined(CONFIG_SUN3) +-#define PAGE_OFFSET_RAW 0x0E000000 +-#else /* CONFIG_COLDFIRE */ +-#if defined(CONFIG_M54455) +-#define PAGE_OFFSET_RAW 0xC0000000 +-#define PHYS_OFFSET 0x40000000 +-#elif defined(CONFIG_M547X_8X) +-#define PAGE_OFFSET_RAW 0xC0000000 +-#define PHYS_OFFSET 0x00000000 + #endif +-#endif +- diff --git a/target/linux/coldfire/patches/047-m547x_8x_fec_cleanup.patch b/target/linux/coldfire/patches/047-m547x_8x_fec_cleanup.patch new file mode 100644 index 0000000000..9c36804e39 --- /dev/null +++ b/target/linux/coldfire/patches/047-m547x_8x_fec_cleanup.patch @@ -0,0 +1,1223 @@ +From 5bac5f471fb1124c51a5811757c54174f6224e7e Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Wed, 12 Mar 2008 17:13:29 -0600 +Subject: [PATCH] Clean up FEC DMA driver. + +LTIBName: m547x-8x-fec-cleanup +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + drivers/net/fec/fec.c | 611 +++++++++++++++++++++--------------------------- + 1 files changed, 267 insertions(+), 344 deletions(-) + +--- a/drivers/net/fec/fec.c ++++ b/drivers/net/fec/fec.c +@@ -4,7 +4,6 @@ + * + * Code crunched to get it to work on 2.6.24 -- FEC cleanup coming + * soon -- Kurt Mahan +- * + */ + #include <linux/module.h> + #include <linux/kernel.h> +@@ -44,42 +43,40 @@ + #undef FEC_2 + #endif + +-#define VERSION "0.13" ++#define VERSION "0.20" + MODULE_DESCRIPTION( "DMA Fast Ethernet Controller driver ver " VERSION); + +-// Private structure ++/* fec private */ + struct fec_priv { + struct net_device *netdev; /* owning net device */ +- void* fecpriv_txbuf[FEC_TX_BUF_NUMBER]; //Array of transmission buffers +- MCD_bufDescFec *fecpriv_txdesc; // Array of transmission descriptors +- volatile unsigned int fecpriv_current_tx; // Inex of the transmission descriptor that is used by DMA +- volatile unsigned int fecpriv_next_tx; // Inex of the transmission descriptor that can be used for new data +- unsigned int fecpriv_current_rx; // Index of the reception descriptor that is used by DMA +- MCD_bufDescFec *fecpriv_rxdesc; // Array of reception descriptors +-// unsigned char *fecpriv_rxbuf; // Address of reception buffers +- struct sk_buff *askb_rx[FEC_RX_BUF_NUMBER]; // Array of reception skb structure pointers +- unsigned int fecpriv_initiator_rx; // Reception DMA initiator +- unsigned int fecpriv_initiator_tx; // Transmission DMA initiator +- int fecpriv_fec_rx_channel; // DMA reception channel +- int fecpriv_fec_tx_channel; // DMA transmission channel +- int fecpriv_rx_requestor; // DMA reception requestor +- int fecpriv_tx_requestor; // DMA transmission requestor +- void *fecpriv_interrupt_fec_rx_handler; // DMA reception handler +- void *fecpriv_interrupt_fec_tx_handler; // DMA transmission handler +- unsigned char *fecpriv_mac_addr; // Private copy of FEC address +- struct net_device_stats fecpriv_stat; // Pointer to the statistical information ++ void* fecpriv_txbuf[FEC_TX_BUF_NUMBER]; /* tx buffer ptrs */ ++ MCD_bufDescFec *fecpriv_txdesc; /* tx descriptor ptrs */ ++ volatile unsigned int fecpriv_current_tx; /* current tx desc index */ ++ volatile unsigned int fecpriv_next_tx; /* next tx desc index */ ++ unsigned int fecpriv_current_rx; /* current rx desc index */ ++ MCD_bufDescFec *fecpriv_rxdesc; /* rx descriptor ptrs */ ++ struct sk_buff *askb_rx[FEC_RX_BUF_NUMBER]; /* rx SKB ptrs */ ++ unsigned int fecpriv_initiator_rx; /* rx dma initiator */ ++ unsigned int fecpriv_initiator_tx; /* tx dma initiator */ ++ int fecpriv_fec_rx_channel; /* rx dma channel */ ++ int fecpriv_fec_tx_channel; /* tx dma channel */ ++ int fecpriv_rx_requestor; /* rx dma requestor */ ++ int fecpriv_tx_requestor; /* tx dma requestor */ ++ void *fecpriv_interrupt_fec_rx_handler; /* dma rx handler */ ++ void *fecpriv_interrupt_fec_tx_handler; /* dma tx handler */ ++ unsigned char *fecpriv_mac_addr; /* private fec mac addr */ ++ struct net_device_stats fecpriv_stat; /* stats ptr */ + spinlock_t fecpriv_lock; + int fecpriv_rxflag; + struct tasklet_struct fecpriv_tasklet_reinit; +- int index; ++ int index; /* fec hw number */ + }; + + struct net_device *fec_dev[FEC_MAX_PORTS]; + +-// FEC functions ++/* FEC functions */ + int __init fec_init(void); + struct net_device_stats *fec_get_stat(struct net_device *dev); +- + int fec_open(struct net_device *dev); + int fec_close(struct net_device *nd); + int fec_tx(struct sk_buff *skb, struct net_device *dev); +@@ -93,10 +90,12 @@ void fec_interrupt_fec_tx_handler_fec0(v + void fec_interrupt_fec_rx_handler_fec0(void); + void fec_interrupt_fec_reinit(unsigned long data); + +-unsigned char fec_mac_addr_fec0[6] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x50 }; // Default address of FEC0 ++/* default fec0 address */ ++unsigned char fec_mac_addr_fec0[6] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x50 }; + + #ifdef FEC_2 +-unsigned char fec_mac_addr_fec1[6] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x51 }; // Default address of FEC1 ++/* default fec1 address */ ++unsigned char fec_mac_addr_fec1[6] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x51 }; + #endif + + extern unsigned char uboot_enet0[]; +@@ -111,17 +110,18 @@ int __init fec_mac_setup0 (char *s); + #ifdef FEC_2 + void fec_interrupt_fec_tx_handler_fec1(void); + void fec_interrupt_fec_rx_handler_fec1(void); ++#endif + + #ifndef MODULE + int __init fec_mac_setup1 (char *s); + #endif + +-#endif + int fec_read_mii(unsigned int base_addr, unsigned int pa, unsigned int ra, unsigned int *data); + int fec_write_mii(unsigned int base_addr, unsigned int pa, unsigned int ra, unsigned int data); + + module_init(fec_init); + /* module_exit(fec_cleanup); */ ++ + __setup("mac0=", fec_mac_setup0); + + #ifdef FEC_2 +@@ -140,7 +140,6 @@ int fec_enet_init(struct net_device *dev + fp->index = index; + fp->netdev = dev; + fec_dev[ index ] = dev; +-printk(KERN_INFO "FEI: index=%d\n", index); + + if (index == 0) { + /* disable fec0 */ +@@ -175,8 +174,6 @@ printk(KERN_INFO "FEI: index=%d\n", inde + /* rx descriptors */ + fp->fecpriv_rxdesc = (void*)FEC_RX_DESC_FEC0; + +-printk(KERN_INFO "FEI: txdesc=0x%p rxdesc=0x%p\n", fp->fecpriv_txdesc, fp->fecpriv_rxdesc); +- + /* mac addr */ + if (uboot_enet0[0] || uboot_enet0[1] || uboot_enet0[2] || + uboot_enet0[3] || uboot_enet0[4] || uboot_enet0[5]) { +@@ -229,8 +226,6 @@ printk(KERN_INFO "FEI: txdesc=0x%p rxde + #endif + } + +-printk(KERN_INFO "FEI: index=%d base_addr=0x%lx\n", index, dev->base_addr); +- + /* clear MIB */ + memset((void *) (dev->base_addr + 0x200), 0, FEC_MIB_LEN); + +@@ -288,8 +283,7 @@ int __init fec_init(void) + int err; + DECLARE_MAC_BUF(mac); + +- printk(KERN_INFO "FEC ENET (DMA) Version .00\n"); +- ++ printk(KERN_INFO "FEC ENET (DMA) Version %s\n", VERSION); + + for (i = 0; i < FEC_MAX_PORTS; i++) { + dev = alloc_etherdev(sizeof(struct fec_priv)); +@@ -333,7 +327,6 @@ void fec_stop(struct net_device *dev) + * + * RETURNS: If no error occurs, this function returns zero. + *************************************************************************/ +- + int fec_open(struct net_device *dev) + { + struct fec_priv *fp = netdev_priv(dev); +@@ -343,13 +336,10 @@ int fec_open(struct net_device *dev) + int channel; + int error_code = -EBUSY; + +-printk(KERN_INFO "FECOPEN: index=%d\n", fp->index); +- +- //Receive the DMA channels ++ /* Receive the DMA channels */ + channel = dma_set_channel_fec(fp->fecpriv_rx_requestor); + +- if (channel == -1) +- { ++ if (channel == -1) { + printk("Dma channel cannot be reserved\n"); + goto ERRORS; + } +@@ -360,60 +350,54 @@ printk(KERN_INFO "FECOPEN: index=%d\n", + + channel = dma_set_channel_fec(fp->fecpriv_tx_requestor); + +- if (channel == -1) +- { ++ if (channel == -1) { + printk("Dma channel cannot be reserved\n"); + goto ERRORS; + } +-printk(KERN_INFO "FECOPEN2\n"); + + fp->fecpriv_fec_tx_channel = channel; + + dma_connect(channel, (int) fp->fecpriv_interrupt_fec_tx_handler); + +- // init tasklet for controller reinitialization ++ /* init tasklet for controller reinitialization */ + tasklet_init(&fp->fecpriv_tasklet_reinit, fec_interrupt_fec_reinit, (unsigned long) dev); +-printk(KERN_INFO "FECOPEN3\n"); + +- // Reset FIFOs ++ /* Reset FIFOs */ + FEC_FECFRST(base_addr) |= FEC_SW_RST | FEC_RST_CTL; + FEC_FECFRST(base_addr) &= ~FEC_SW_RST; + +- // Reset and disable FEC ++ /* Reset and disable FEC */ + FEC_ECR(base_addr) = FEC_ECR_RESET; + +- // Wait + udelay(10); + +- // Clear all events ++ /* Clear all events */ + FEC_EIR(base_addr) = FEC_EIR_CLEAR; + +- // Reset FIFO status ++ /* Reset FIFO status */ + FEC_FECTFSR(base_addr) = FEC_FECTFSR_MSK; + FEC_FECRFSR(base_addr) = FEC_FECRFSR_MSK; + +-#if 0 +-/* JKM -- move into HW init */ +- // Copy the default address to the device structure +- memcpy(dev->dev_addr, fp->fecpriv_mac_addr, ETH_ALEN); +-#endif ++ /* Set the default address */ ++ FEC_PALR(base_addr) = (fp->fecpriv_mac_addr[0] << 24) | ++ (fp->fecpriv_mac_addr[1] << 16) | ++ (fp->fecpriv_mac_addr[2] << 8) | ++ fp->fecpriv_mac_addr[3]; ++ FEC_PAUR(base_addr) = (fp->fecpriv_mac_addr[4] << 24) | ++ (fp->fecpriv_mac_addr[5] << 16) | 0x8808; + +- // Set the default address +- FEC_PALR(base_addr) = (fp->fecpriv_mac_addr[0] << 24) | (fp->fecpriv_mac_addr[1] << 16) | (fp->fecpriv_mac_addr[2] << 8) | fp->fecpriv_mac_addr[3]; +- FEC_PAUR(base_addr) = (fp->fecpriv_mac_addr[4] << 24) | (fp->fecpriv_mac_addr[5] << 16) | 0x8808; +- +- // Reset the group address descriptor ++ /* Reset the group address descriptor */ + FEC_GALR(base_addr) = 0x00000000; + FEC_GAUR(base_addr) = 0x00000000; + +- // Reset the individual address descriptor ++ /* Reset the individual address descriptor */ + FEC_IALR(base_addr) = 0x00000000; + FEC_IAUR(base_addr) = 0x00000000; + +- // Set the receive control register ++ /* Set the receive control register */ + FEC_RCR(base_addr) = FEC_RCR_MAX_FRM_SIZE | FEC_RCR_MII; + +- // Set the receive FIFO control register ++ /* Set the receive FIFO control register */ + // FEC_FECRFCR(base_addr) = FEC_FECRFCR_FRM | FEC_FECRFCR_GR | FEC_FECRFCR_MSK; + FEC_FECRFCR(base_addr) = FEC_FECRFCR_FRM | FEC_FECRFCR_GR + | (FEC_FECRFCR_MSK // disable all but ... +@@ -422,10 +406,10 @@ printk(KERN_INFO "FECOPEN3\n"); + // & ~FEC_FECRFCR_UF // enable FIFO underflow + ); + +- //Set the receive FIFO alarm register ++ /* Set the receive FIFO alarm register */ + FEC_FECRFAR(base_addr) = FEC_FECRFAR_ALARM; + +- // Set the transmit FIFO control register ++ /* Set the transmit FIFO control register */ + // FEC_FECTFCR(base_addr) = FEC_FECTFCR_FRM | FEC_FECTFCR_GR | FEC_FECTFCR_MSK; + FEC_FECTFCR(base_addr) = FEC_FECTFCR_FRM | FEC_FECTFCR_GR + | (FEC_FECTFCR_MSK // disable all but ... +@@ -434,16 +418,16 @@ printk(KERN_INFO "FECOPEN3\n"); + // & ~FEC_FECTFCR_UF // enable FIFO underflow + & ~FEC_FECTFCR_OF); // enable FIFO overflow + +- //Set the transmit FIFO alarm register ++ /* Set the transmit FIFO alarm register */ + FEC_FECTFAR(base_addr) = FEC_FECTFAR_ALARM; + +- // Set the Tx FIFO watermark ++ /* Set the Tx FIFO watermark */ + FEC_FECTFWR(base_addr) = FEC_FECTFWR_XWMRK; + +- // Enable the transmitter to append the CRC ++ /* Enable the transmitter to append the CRC */ + FEC_CTCWR(base_addr) = FEC_CTCWR_TFCW_CRC; + +- // Enable the ethernet interrupts ++ /* Enable the ethernet interrupts */ + // FEC_EIMR(base_addr) = FEC_EIMR_MASK; + FEC_EIMR(base_addr) = FEC_EIMR_DISABLE + | FEC_EIR_LC +@@ -453,9 +437,16 @@ printk(KERN_INFO "FECOPEN3\n"); + | FEC_EIR_XFERR + | FEC_EIR_RFERR + ; +-printk(KERN_INFO "FECOPEN4\n"); + +-#ifdef CONFIG_FEC_548x_AUTO_NEGOTIATION ++/* ++ * JKM -- ++ * ++ * There's a problem with the PHY initialization code -- ++ * for now assume uboot left it in an initialized state. ++ */ ++// printk(KERN_INFO "FECOPEN: starting auto-negotiation\n"); ++// #ifdef CONFIG_FEC_548x_AUTO_NEGOTIATION ++#if 0 + if ((error_code = init_transceiver(base_addr, &fduplex)) != 0) + { + printk("Initialization of the transceiver is failed\n"); +@@ -464,25 +455,24 @@ printk(KERN_INFO "FECOPEN4\n"); + #else + fduplex = 1; + #endif +-printk(KERN_INFO "FECOPEN5\n"); ++// printk(KERN_INFO "FECOPEN: done with auto-negotiation\n"); + + if (fduplex) +- // Enable the full duplex mode ++ /* Enable the full duplex mode */ + FEC_TCR(base_addr) = FEC_TCR_FDEN | FEC_TCR_HBC; + else +- // Disable reception of frames while transmitting ++ /* Disable reception of frames while transmitting */ + FEC_RCR(base_addr) |= FEC_RCR_DRT; + +- // Enable MIB ++ /* Enable MIB */ + FEC_MIBC(base_addr) = FEC_MIBC_ENABLE; + +- // Enable FEC ++ /* Enable FEC */ + FEC_ECR(base_addr) |= FEC_ECR_ETHEREN; + +- // Initialize transmission descriptors and start DMA for the transmission ++ /* Initialize tx descriptors and start DMA for the transmission */ + for (i = 0; i < FEC_TX_BUF_NUMBER; i++) + fp->fecpriv_txdesc[i].statCtrl = MCD_FEC_INTERRUPT; +-printk(KERN_INFO "FECOPEN6\n"); + + fp->fecpriv_txdesc[i - 1].statCtrl |= MCD_FEC_WRAP; + +@@ -494,31 +484,27 @@ printk(KERN_INFO "FECOPEN6\n"); + FEC_TX_DMA_PRI, MCD_FECTX_DMA | MCD_INTERRUPT, + MCD_NO_CSUM | MCD_NO_BYTE_SWAP); + +- // Initialize reception descriptors and start DMA for the reception +- for (i = 0; i < FEC_RX_BUF_NUMBER; i++) +- { ++ /* Initialize rx descriptors and start DMA for the reception */ ++ for (i = 0; i < FEC_RX_BUF_NUMBER; i++) { + fp->askb_rx[i] = alloc_skb(FEC_MAXBUF_SIZE + 16, GFP_DMA); +- if (!fp->askb_rx[i]) +- { +- fp->fecpriv_rxdesc[i].dataPointer = 0; +- fp->fecpriv_rxdesc[i].statCtrl = 0; +- fp->fecpriv_rxdesc[i].length = 0; ++ if (!fp->askb_rx[i]) { ++ fp->fecpriv_rxdesc[i].dataPointer = 0; ++ fp->fecpriv_rxdesc[i].statCtrl = 0; ++ fp->fecpriv_rxdesc[i].length = 0; + } +- else +- { +- skb_reserve(fp->askb_rx[i], 16); ++ else { ++ skb_reserve(fp->askb_rx[i], 16); + fp->askb_rx[i]->dev = dev; +- fp->fecpriv_rxdesc[i].dataPointer = (unsigned int) virt_to_phys(fp->askb_rx[i]->tail); +- fp->fecpriv_rxdesc[i].statCtrl = MCD_FEC_BUF_READY | MCD_FEC_INTERRUPT; +- fp->fecpriv_rxdesc[i].length = FEC_MAXBUF_SIZE; +- } ++ fp->fecpriv_rxdesc[i].dataPointer = (unsigned int) virt_to_phys(fp->askb_rx[i]->tail); ++ fp->fecpriv_rxdesc[i].statCtrl = MCD_FEC_BUF_READY | MCD_FEC_INTERRUPT; ++ fp->fecpriv_rxdesc[i].length = FEC_MAXBUF_SIZE; ++ } + } +-printk(KERN_INFO "FECOPEN7\n"); + + fp->fecpriv_rxdesc[i - 1].statCtrl |= MCD_FEC_WRAP; + fp->fecpriv_current_rx = 0; + +- // flush entire data cache before restarting the DMA ++ /* flush entire data cache before restarting the DMA */ + #if 0 + /* JKM -- currently running with cache turned off */ + DcacheFlushInvalidate(); +@@ -531,31 +517,24 @@ printk(KERN_INFO "FECOPEN7\n"); + MCD_NO_CSUM | MCD_NO_BYTE_SWAP); + + netif_start_queue(dev); +- +-// MOD_INC_USE_COUNT; +-printk(KERN_INFO "FECOPEN: finished\n"); +- + return 0; + + ERRORS: + +- // Remove the channels and return with the error code +- if (fp->fecpriv_fec_rx_channel != -1) +- { ++ /* Remove the channels and return with the error code */ ++ if (fp->fecpriv_fec_rx_channel != -1) { + dma_disconnect(fp->fecpriv_fec_rx_channel); + dma_remove_channel_by_number(fp->fecpriv_fec_rx_channel); + fp->fecpriv_fec_rx_channel = -1; + } + +- if (fp->fecpriv_fec_tx_channel != -1) +- { ++ if (fp->fecpriv_fec_tx_channel != -1) { + dma_disconnect(fp->fecpriv_fec_tx_channel); + dma_remove_channel_by_number(fp->fecpriv_fec_tx_channel); + fp->fecpriv_fec_tx_channel = -1; + } + + return error_code; +- + } + + /************************************************************************ +@@ -568,31 +547,26 @@ ERRORS: + *************************************************************************/ + int fec_close(struct net_device *dev) + { +- //Receive the pointer to the private structure + struct fec_priv *fp = netdev_priv(dev); +- +- // Receive the base address + unsigned long base_addr = (unsigned long) dev->base_addr; +- + unsigned long time; +- + int i; + + netif_stop_queue(dev); + +- // Perform the graceful stop ++ /* Perform the graceful stop */ + FEC_TCR(base_addr) |= FEC_TCR_GTS; + + time = jiffies; + +- // Wait for the graceful stop ++ /* Wait for the graceful stop */ + while (!(FEC_EIR(base_addr) & FEC_EIR_GRA) && jiffies - time < FEC_GR_TIMEOUT * HZ) + schedule(); + +- // Disable FEC ++ /* Disable FEC */ + FEC_ECR(base_addr) = FEC_ECR_DISABLE; + +- // Reset the DMA channels ++ /* Reset the DMA channels */ + spin_lock_irq(&fp->fecpriv_lock); + MCD_killDma(fp->fecpriv_fec_tx_channel); + spin_unlock_irq(&fp->fecpriv_lock); +@@ -600,12 +574,12 @@ int fec_close(struct net_device *dev) + dma_disconnect(fp->fecpriv_fec_tx_channel); + fp->fecpriv_fec_tx_channel = -1; + +- for (i = 0; i < FEC_TX_BUF_NUMBER; i++) +- if (fp->fecpriv_txbuf[i]) +- { ++ for (i = 0; i < FEC_TX_BUF_NUMBER; i++) { ++ if (fp->fecpriv_txbuf[i]) { + kfree(fp->fecpriv_txbuf[i]); + fp->fecpriv_txbuf[i] = NULL; + } ++ } + + spin_lock_irq(&fp->fecpriv_lock); + MCD_killDma(fp->fecpriv_fec_rx_channel); +@@ -615,15 +589,12 @@ int fec_close(struct net_device *dev) + dma_disconnect(fp->fecpriv_fec_rx_channel); + fp->fecpriv_fec_rx_channel = -1; + +- for (i = 0; i < FEC_RX_BUF_NUMBER; i++) +- { +- if (fp->askb_rx[i]) +- { +- kfree_skb(fp->askb_rx[i]); +- fp->askb_rx[i] = NULL; +- } ++ for (i = 0; i < FEC_RX_BUF_NUMBER; i++) { ++ if (fp->askb_rx[i]) { ++ kfree_skb(fp->askb_rx[i]); ++ fp->askb_rx[i] = NULL; ++ } + } +-// MOD_DEC_USE_COUNT; + + return 0; + } +@@ -635,14 +606,10 @@ int fec_close(struct net_device *dev) + *************************************************************************/ + struct net_device_stats * fec_get_stat(struct net_device *dev) + { +- +- //Receive the pointer to the private structure + struct fec_priv *fp = netdev_priv(dev); +- +- // Receive the base address + unsigned long base_addr = dev->base_addr; + +- // Receive the statistical information ++ /* Receive the statistical information */ + fp->fecpriv_stat.rx_packets = FECSTAT_RMON_R_PACKETS(base_addr); + fp->fecpriv_stat.tx_packets = FECSTAT_RMON_T_PACKETS(base_addr); + fp->fecpriv_stat.rx_bytes = FECSTAT_RMON_R_OCTETS(base_addr); +@@ -651,7 +618,10 @@ struct net_device_stats * fec_get_stat(s + fp->fecpriv_stat.multicast = FECSTAT_RMON_R_MC_PKT(base_addr); + fp->fecpriv_stat.collisions = FECSTAT_RMON_T_COL(base_addr); + +- fp->fecpriv_stat.rx_length_errors = FECSTAT_RMON_R_UNDERSIZE(base_addr) + FECSTAT_RMON_R_OVERSIZE(base_addr) + FECSTAT_RMON_R_FRAG(base_addr) + FECSTAT_RMON_R_JAB(base_addr); ++ fp->fecpriv_stat.rx_length_errors = FECSTAT_RMON_R_UNDERSIZE(base_addr) + ++ FECSTAT_RMON_R_OVERSIZE(base_addr) + ++ FECSTAT_RMON_R_FRAG(base_addr) + ++ FECSTAT_RMON_R_JAB(base_addr); + fp->fecpriv_stat.rx_crc_errors = FECSTAT_IEEE_R_CRC(base_addr); + fp->fecpriv_stat.rx_frame_errors = FECSTAT_IEEE_R_ALIGN(base_addr); + fp->fecpriv_stat.rx_over_errors = FECSTAT_IEEE_R_MACERR(base_addr); +@@ -660,9 +630,18 @@ struct net_device_stats * fec_get_stat(s + fp->fecpriv_stat.tx_fifo_errors = FECSTAT_IEEE_T_MACERR(base_addr); + fp->fecpriv_stat.tx_window_errors = FECSTAT_IEEE_T_LCOL(base_addr); + +- // I hope that one frame doesn't have more than one error +- fp->fecpriv_stat.rx_errors = fp->fecpriv_stat.rx_length_errors + fp->fecpriv_stat.rx_crc_errors + fp->fecpriv_stat.rx_frame_errors + fp->fecpriv_stat.rx_over_errors + fp->fecpriv_stat.rx_dropped; +- fp->fecpriv_stat.tx_errors = fp->fecpriv_stat.tx_carrier_errors + fp->fecpriv_stat.tx_fifo_errors + fp->fecpriv_stat.tx_window_errors + fp->fecpriv_stat.tx_aborted_errors + fp->fecpriv_stat.tx_heartbeat_errors + fp->fecpriv_stat.tx_dropped; ++ /* I hope that one frame doesn't have more than one error */ ++ fp->fecpriv_stat.rx_errors = fp->fecpriv_stat.rx_length_errors + ++ fp->fecpriv_stat.rx_crc_errors + ++ fp->fecpriv_stat.rx_frame_errors + ++ fp->fecpriv_stat.rx_over_errors + ++ fp->fecpriv_stat.rx_dropped; ++ fp->fecpriv_stat.tx_errors = fp->fecpriv_stat.tx_carrier_errors + ++ fp->fecpriv_stat.tx_fifo_errors + ++ fp->fecpriv_stat.tx_window_errors + ++ fp->fecpriv_stat.tx_aborted_errors + ++ fp->fecpriv_stat.tx_heartbeat_errors + ++ fp->fecpriv_stat.tx_dropped; + + return &fp->fecpriv_stat; + } +@@ -674,59 +653,47 @@ struct net_device_stats * fec_get_stat(s + *************************************************************************/ + void fec_set_multicast_list(struct net_device *dev) + { +- // Pointer to the address list + struct dev_mc_list *dmi; +- + unsigned int crc, data; + int i, j, k; +- +- // Receive the base address + unsigned long base_addr = (unsigned long) dev->base_addr; + +- if (dev->flags & IFF_PROMISC || dev->flags & IFF_ALLMULTI) +- { +- // Allow all incoming frames ++ if (dev->flags & IFF_PROMISC || dev->flags & IFF_ALLMULTI) { ++ /* Allow all incoming frames */ + FEC_GALR(base_addr) = 0xFFFFFFFF; + FEC_GAUR(base_addr) = 0xFFFFFFFF; + return; + } +- // Reset the group address register ++ ++ /* Reset the group address register */ + FEC_GALR(base_addr) = 0x00000000; + FEC_GAUR(base_addr) = 0x00000000; + +- // Process all addresses +- for (i = 0, dmi = dev->mc_list; i < dev->mc_count; i++, dmi = dmi->next) +- { +- // Processing must be only for the group addresses ++ /* Process all addresses */ ++ for (i = 0, dmi = dev->mc_list; i < dev->mc_count; i++, dmi = dmi->next) { ++ /* Processing must be only for the group addresses */ + if (!(dmi->dmi_addr[0] & 1)) + continue; + +- // Calculate crc value for the current address ++ /* Calculate crc value for the current address */ + crc = 0xFFFFFFFF; +- for (j = 0; j < dmi->dmi_addrlen; j++) +- { +- +- for (k = 0, data = dmi->dmi_addr[j]; k < 8; k++, data >>= 1) +- { ++ for (j = 0; j < dmi->dmi_addrlen; j++) { ++ for (k = 0, data = dmi->dmi_addr[j]; k < 8; k++, data >>= 1) { + if ((crc ^ data) & 1) + crc = (crc >> 1) ^ FEC_CRCPOL; + else + crc >>= 1; +- + } +- + } + +- // Add this value ++ /* Add this value */ + crc >>= 26; + crc &= 0x3F; + if (crc > 31) + FEC_GAUR(base_addr) |= 0x1 << (crc - 32); + else + FEC_GALR(base_addr) |= 0x1 << crc; +- + } +- + } + + /************************************************************************ +@@ -736,26 +703,27 @@ void fec_set_multicast_list(struct net_d + *************************************************************************/ + int fec_set_mac_address(struct net_device *dev, void *p) + { +- //Receive the pointer to the private structure + struct fec_priv *fp = netdev_priv(dev); +- +- // Receive the base address + unsigned long base_addr = (unsigned long) dev->base_addr; +- + struct sockaddr *addr = p; + + if (netif_running(dev)) + return -EBUSY; + +- // Copy a new address to the device structure ++ /* Copy a new address to the device structure */ + memcpy(dev->dev_addr, addr->sa_data, dev->addr_len); + +- // Copy a new address to the private structure ++ /* Copy a new address to the private structure */ + memcpy(fp->fecpriv_mac_addr, addr->sa_data, 6); + +- // Set the address to the registers +- FEC_PALR(base_addr) = (fp->fecpriv_mac_addr[0] << 24) | (fp->fecpriv_mac_addr[1] << 16) | (fp->fecpriv_mac_addr[2] << 8) | fp->fecpriv_mac_addr[3]; +- FEC_PAUR(base_addr) = (fp->fecpriv_mac_addr[4] << 24) | (fp->fecpriv_mac_addr[5] << 16) | 0x8808; ++ /* Set the address to the registers */ ++ FEC_PALR(base_addr) = (fp->fecpriv_mac_addr[0] << 24) | ++ (fp->fecpriv_mac_addr[1] << 16) | ++ (fp->fecpriv_mac_addr[2] << 8) | ++ fp->fecpriv_mac_addr[3]; ++ FEC_PAUR(base_addr) = (fp->fecpriv_mac_addr[4] << 24) | ++ (fp->fecpriv_mac_addr[5] << 16) | ++ 0x8808; + + return 0; + } +@@ -769,27 +737,24 @@ int fec_set_mac_address(struct net_devic + *************************************************************************/ + int fec_tx(struct sk_buff *skb, struct net_device *dev) + { +- +- //Receive the pointer to the private structure + struct fec_priv *fp = netdev_priv(dev); +- + void *data, *data_aligned; + int offset; + + data = kmalloc(skb->len + 15, GFP_DMA | GFP_ATOMIC); + +- if (!data) +- { ++ if (!data) { + fp->fecpriv_stat.tx_dropped++; + dev_kfree_skb(skb); + return 0; + } + +- offset = (((unsigned long)virt_to_phys(data) + 15) & 0xFFFFFFF0) - (unsigned long)virt_to_phys(data); ++ offset = (((unsigned long)virt_to_phys(data) + 15) & 0xFFFFFFF0) - ++ (unsigned long)virt_to_phys(data); + data_aligned = (void*)((unsigned long)data + offset); + memcpy(data_aligned, skb->data, skb->len); + +- // flush data cache before initializing the descriptor and starting DMA ++ /* flush data cache before initializing the descriptor and starting DMA */ + #if 0 + /* JKM -- currently running with cache turned off */ + DcacheFlushInvalidateCacheBlock((void*)virt_to_phys(data_aligned), skb->len); +@@ -797,7 +762,7 @@ int fec_tx(struct sk_buff *skb, struct n + + spin_lock_irq(&fp->fecpriv_lock); + +- // Initialize the descriptor ++ /* Initialize the descriptor */ + fp->fecpriv_txbuf[fp->fecpriv_next_tx] = data; + fp->fecpriv_txdesc[fp->fecpriv_next_tx].dataPointer = (unsigned int) virt_to_phys(data_aligned); + fp->fecpriv_txdesc[fp->fecpriv_next_tx].length = skb->len; +@@ -809,7 +774,7 @@ int fec_tx(struct sk_buff *skb, struct n + + spin_unlock_irq(&fp->fecpriv_lock); + +- // Tell the DMA to continue the transmission ++ /* Tell the DMA to continue the transmission */ + MCD_continDma(fp->fecpriv_fec_tx_channel); + + dev_kfree_skb(skb); +@@ -835,14 +800,10 @@ void fec_tx_timeout(struct net_device *d + + spin_lock_irq(&fp->fecpriv_lock); + MCD_killDma(fp->fecpriv_fec_tx_channel); +- for (i = 0; i < FEC_TX_BUF_NUMBER; i++) +- { +- if (fp->fecpriv_txbuf[i]) +- { +- ++ for (i = 0; i < FEC_TX_BUF_NUMBER; i++) { ++ if (fp->fecpriv_txbuf[i]) { + kfree(fp->fecpriv_txbuf[i]); + fp->fecpriv_txbuf[i] = NULL; +- + } + fp->fecpriv_txdesc[i].statCtrl = MCD_FEC_INTERRUPT; + } +@@ -850,14 +811,14 @@ void fec_tx_timeout(struct net_device *d + + fp->fecpriv_current_tx = fp->fecpriv_next_tx = 0; + +- // Reset FIFOs ++ /* Reset FIFOs */ + FEC_FECFRST(base_addr) |= FEC_SW_RST; + FEC_FECFRST(base_addr) &= ~FEC_SW_RST; + +- // Reset and disable FEC ++ /* Reset and disable FEC */ + // FEC_ECR(base_addr) = FEC_ECR_RESET; + +- // Enable FEC ++ /* Enable FEC */ + FEC_ECR(base_addr) |= FEC_ECR_ETHEREN; + + MCD_startDma(fp->fecpriv_fec_tx_channel, (char *) fp->fecpriv_txdesc, 0, +@@ -883,23 +844,22 @@ int fec_read_mii(unsigned int base_addr, + { + unsigned long time; + +- // Clear the MII interrupt bit ++ /* Clear the MII interrupt bit */ + FEC_EIR(base_addr) = FEC_EIR_MII; + +- // Write to the MII management frame register ++ /* Write to the MII management frame register */ + FEC_MMFR(base_addr) = FEC_MMFR_READ | (pa << 23) | (ra << 18); + + time = jiffies; + +- // Wait for the reading +- while (!(FEC_EIR(base_addr) & FEC_EIR_MII)) +- { ++ /* Wait for the reading */ ++ while (!(FEC_EIR(base_addr) & FEC_EIR_MII)) { + if (jiffies - time > FEC_MII_TIMEOUT * HZ) + return -ETIME; + schedule(); + } + +- // Clear the MII interrupt bit ++ /* Clear the MII interrupt bit */ + FEC_EIR(base_addr) = FEC_EIR_MII; + + *data = FEC_MMFR(base_addr) & 0x0000FFFF; +@@ -918,25 +878,22 @@ int fec_write_mii(unsigned int base_addr + { + unsigned long time; + +- // Clear the MII interrupt bit ++ /* Clear the MII interrupt bit */ + FEC_EIR(base_addr) = FEC_EIR_MII; + +- // Write to the MII management frame register ++ /* Write to the MII management frame register */ + FEC_MMFR(base_addr) = FEC_MMFR_WRITE | (pa << 23) | (ra << 18) | data; + + time = jiffies; + +- // Wait for the writing +- +- while (!(FEC_EIR(base_addr) & FEC_EIR_MII)) +- { ++ /* Wait for the writing */ ++ while (!(FEC_EIR(base_addr) & FEC_EIR_MII)) { + if (jiffies - time > FEC_MII_TIMEOUT * HZ) + return -ETIME; +- + schedule(); + } + +- // Clear the MII interrupt bit ++ /* Clear the MII interrupt bit */ + FEC_EIR(base_addr) = FEC_EIR_MII; + + return 0; +@@ -953,27 +910,24 @@ void fec_interrupt_fec_tx_handler(struct + { + struct fec_priv *fp = netdev_priv(dev); + +- //Release the socket buffer +- if(fp->fecpriv_txbuf[fp->fecpriv_current_tx]) +- { ++ /* Release the socket buffer */ ++ if(fp->fecpriv_txbuf[fp->fecpriv_current_tx]) { + kfree(fp->fecpriv_txbuf[fp->fecpriv_current_tx]); + fp->fecpriv_txbuf[fp->fecpriv_current_tx] = NULL; + } + fp->fecpriv_current_tx = (fp->fecpriv_current_tx + 1) & FEC_TX_INDEX_MASK; + +- if (MCD_dmaStatus(fp->fecpriv_fec_tx_channel) == MCD_DONE) +- for (; fp->fecpriv_current_tx != fp->fecpriv_next_tx; fp->fecpriv_current_tx = (fp->fecpriv_current_tx + 1) & FEC_TX_INDEX_MASK) +- { +- if(fp->fecpriv_txbuf[fp->fecpriv_current_tx]) +- { ++ if (MCD_dmaStatus(fp->fecpriv_fec_tx_channel) == MCD_DONE) { ++ for (; fp->fecpriv_current_tx != fp->fecpriv_next_tx; fp->fecpriv_current_tx = (fp->fecpriv_current_tx + 1) & FEC_TX_INDEX_MASK) { ++ if(fp->fecpriv_txbuf[fp->fecpriv_current_tx]) { + kfree(fp->fecpriv_txbuf[fp->fecpriv_current_tx]); + fp->fecpriv_txbuf[fp->fecpriv_current_tx] = NULL; + } + } ++ } + + if (netif_queue_stopped(dev)) + netif_wake_queue(dev); +- + } + + /************************************************************************ +@@ -1008,49 +962,41 @@ void fec_interrupt_fec_rx_handler(struct + } + } + */ +- for (; fp->fecpriv_rxdesc[fp->fecpriv_current_rx].statCtrl & MCD_FEC_END_FRAME; fp->fecpriv_current_rx = (fp->fecpriv_current_rx + 1) & FEC_RX_INDEX_MASK) +- { ++ for (; fp->fecpriv_rxdesc[fp->fecpriv_current_rx].statCtrl & MCD_FEC_END_FRAME; fp->fecpriv_current_rx = (fp->fecpriv_current_rx + 1) & FEC_RX_INDEX_MASK) { + if( (fp->fecpriv_rxdesc[fp->fecpriv_current_rx].length <= FEC_MAXBUF_SIZE) && +- (fp->fecpriv_rxdesc[fp->fecpriv_current_rx].length > 4)) // --tym-- +- { ++ (fp->fecpriv_rxdesc[fp->fecpriv_current_rx].length > 4)) { /* --tym-- */ + skb = fp->askb_rx[fp->fecpriv_current_rx]; + if (!skb) +- { +- fp->fecpriv_stat.rx_dropped++; +- } +- else +- { +- // flush data cache before initializing the descriptor and starting DMA ++ fp->fecpriv_stat.rx_dropped++; ++ else { ++ /* flush data cache before initializing the descriptor and starting DMA */ + // DcacheFlushInvalidateCacheBlock((void*)virt_to_phys(fp->askb_rx[fp->fecpriv_current_rx]->tail), fp->askb_rx[fp->fecpriv_current_rx]->len); + + skb_put(skb, fp->fecpriv_rxdesc[fp->fecpriv_current_rx].length - 4); +-// skb->dev = dev; + skb->protocol = eth_type_trans(skb, dev); + netif_rx(skb); +- } +- fp->fecpriv_rxdesc[fp->fecpriv_current_rx].statCtrl &= ~MCD_FEC_END_FRAME; +- // allocate new skbuff ++ } ++ fp->fecpriv_rxdesc[fp->fecpriv_current_rx].statCtrl &= ~MCD_FEC_END_FRAME; ++ /* allocate new skbuff */ + fp->askb_rx[fp->fecpriv_current_rx] = alloc_skb(FEC_MAXBUF_SIZE + 16, /*GFP_ATOMIC |*/ GFP_DMA); +- if (!fp->askb_rx[fp->fecpriv_current_rx]) +- { +- fp->fecpriv_rxdesc[fp->fecpriv_current_rx].dataPointer = 0; +- fp->fecpriv_rxdesc[fp->fecpriv_current_rx].length = 0; +- fp->fecpriv_stat.rx_dropped++; +- } +- else +- { +- skb_reserve(fp->askb_rx[fp->fecpriv_current_rx], 16); +- fp->askb_rx[fp->fecpriv_current_rx]->dev = dev; ++ if (!fp->askb_rx[fp->fecpriv_current_rx]) { ++ fp->fecpriv_rxdesc[fp->fecpriv_current_rx].dataPointer = 0; ++ fp->fecpriv_rxdesc[fp->fecpriv_current_rx].length = 0; ++ fp->fecpriv_stat.rx_dropped++; ++ } ++ else { ++ skb_reserve(fp->askb_rx[fp->fecpriv_current_rx], 16); ++ fp->askb_rx[fp->fecpriv_current_rx]->dev = dev; + +- // flush data cache before initializing the descriptor and starting DMA ++ /* flush data cache before initializing the descriptor and starting DMA */ + #if 0 + /* JKM -- currently running with cache turned off */ +- DcacheFlushInvalidateCacheBlock((void*)virt_to_phys(fp->askb_rx[fp->fecpriv_current_rx]->tail), FEC_MAXBUF_SIZE); ++ DcacheFlushInvalidateCacheBlock((void*)virt_to_phys(fp->askb_rx[fp->fecpriv_current_rx]->tail), FEC_MAXBUF_SIZE); + #endif + + fp->fecpriv_rxdesc[fp->fecpriv_current_rx].dataPointer = (unsigned int) virt_to_phys(fp->askb_rx[fp->fecpriv_current_rx]->tail); + fp->fecpriv_rxdesc[fp->fecpriv_current_rx].length = FEC_MAXBUF_SIZE; +- fp->fecpriv_rxdesc[fp->fecpriv_current_rx].statCtrl |= MCD_FEC_BUF_READY; ++ fp->fecpriv_rxdesc[fp->fecpriv_current_rx].statCtrl |= MCD_FEC_BUF_READY; + + // flush data cache before initializing the descriptor and starting DMA + // DcacheFlushInvalidateCacheBlock((void*)virt_to_phys(fp->askb_rx[fp->fecpriv_current_rx]->tail), FEC_MAXBUF_SIZE); +@@ -1059,11 +1005,10 @@ void fec_interrupt_fec_rx_handler(struct + + } + +- // Tell the DMA to continue the reception ++ /* Tell the DMA to continue the reception */ + MCD_continDma(fp->fecpriv_fec_rx_channel); + + fp->fecpriv_rxflag = 0; +- + } + + /************************************************************************ +@@ -1080,76 +1025,70 @@ irqreturn_t fec_interrupt_handler(int ir + unsigned long base_addr = (unsigned long) dev->base_addr; + unsigned long events; + +- // Read and clear the events ++ /* Read and clear the events */ + events = FEC_EIR(base_addr) & FEC_EIMR(base_addr); + +- if (events & FEC_EIR_HBERR) +- { ++ if (events & FEC_EIR_HBERR) { + fp->fecpriv_stat.tx_heartbeat_errors++; +- FEC_EIR(base_addr) = FEC_EIR_HBERR; ++ FEC_EIR(base_addr) = FEC_EIR_HBERR; + } + +- // receive/transmit FIFO error +- if (((events & FEC_EIR_RFERR) != 0) || ((events & FEC_EIR_XFERR) != 0)) +- { +- // kill DMA receive channel +- MCD_killDma (fp->fecpriv_fec_rx_channel); +- // kill running transmission by DMA +- MCD_killDma (fp->fecpriv_fec_tx_channel); +- +- // Reset FIFOs +- FEC_FECFRST(base_addr) |= FEC_SW_RST; +- FEC_FECFRST(base_addr) &= ~FEC_SW_RST; +- +- // reset receive FIFO status register +- FEC_FECRFSR(base_addr) = FEC_FECRFSR_FAE +- | FEC_FECRFSR_RXW +- | FEC_FECRFSR_UF; +- +- // reset transmit FIFO status register +- FEC_FECTFSR(base_addr) = FEC_FECTFSR_FAE +- | FEC_FECTFSR_TXW +- | FEC_FECTFSR_UF +- | FEC_FECTFSR_OF; ++ /* receive/transmit FIFO error */ ++ if (((events & FEC_EIR_RFERR) != 0) || ((events & FEC_EIR_XFERR) != 0)) { ++ /* kill DMA receive channel */ ++ MCD_killDma (fp->fecpriv_fec_rx_channel); + +- // reset RFERR and XFERR event +- FEC_EIR(base_addr) = FEC_EIR_RFERR | FEC_EIR_XFERR; ++ /* kill running transmission by DMA */ ++ MCD_killDma (fp->fecpriv_fec_tx_channel); + +- // stop queue +- netif_stop_queue(dev); +- +- // execute reinitialization as tasklet +- tasklet_schedule(&fp->fecpriv_tasklet_reinit); ++ /* Reset FIFOs */ ++ FEC_FECFRST(base_addr) |= FEC_SW_RST; ++ FEC_FECFRST(base_addr) &= ~FEC_SW_RST; + +- fp->fecpriv_stat.rx_dropped++; ++ /* reset receive FIFO status register */ ++ FEC_FECRFSR(base_addr) = FEC_FECRFSR_FAE | ++ FEC_FECRFSR_RXW | ++ FEC_FECRFSR_UF; + +- } ++ /* reset transmit FIFO status register */ ++ FEC_FECTFSR(base_addr) = FEC_FECTFSR_FAE | ++ FEC_FECTFSR_TXW | ++ FEC_FECTFSR_UF | ++ FEC_FECTFSR_OF; + +- // transmit FIFO underrun +- if ((events & FEC_EIR_XFUN) != 0) +- { +- // reset XFUN event +- FEC_EIR(base_addr) = FEC_EIR_XFUN; +- fp->fecpriv_stat.tx_aborted_errors++; +- } ++ /* reset RFERR and XFERR event */ ++ FEC_EIR(base_addr) = FEC_EIR_RFERR | FEC_EIR_XFERR; ++ ++ /* stop queue */ ++ netif_stop_queue(dev); ++ ++ /* execute reinitialization as tasklet */ ++ tasklet_schedule(&fp->fecpriv_tasklet_reinit); ++ ++ fp->fecpriv_stat.rx_dropped++; ++ } + +- // late collision +- if ((events & FEC_EIR_LC) != 0) +- { +- // reset LC event +- FEC_EIR(base_addr) = FEC_EIR_LC; ++ /* transmit FIFO underrun */ ++ if ((events & FEC_EIR_XFUN) != 0) { ++ /* reset XFUN event */ ++ FEC_EIR(base_addr) = FEC_EIR_XFUN; + fp->fecpriv_stat.tx_aborted_errors++; +- } ++ } + +- // collision retry limit +- if ((events & FEC_EIR_RL) != 0) +- { +- // reset RL event +- FEC_EIR(base_addr) = FEC_EIR_RL; ++ /* late collision */ ++ if ((events & FEC_EIR_LC) != 0) { ++ /* reset LC event */ ++ FEC_EIR(base_addr) = FEC_EIR_LC; + fp->fecpriv_stat.tx_aborted_errors++; +- } ++ } + +- return 0; ++ /* collision retry limit */ ++ if ((events & FEC_EIR_RL) != 0) { ++ /* reset RL event */ ++ FEC_EIR(base_addr) = FEC_EIR_RL; ++ fp->fecpriv_stat.tx_aborted_errors++; ++ } ++ return 0; + } + + /************************************************************************ +@@ -1166,52 +1105,46 @@ void fec_interrupt_fec_reinit(unsigned l + struct fec_priv *fp = netdev_priv(dev); + unsigned long base_addr = (unsigned long) dev->base_addr; + +- // Initialize reception descriptors and start DMA for the reception +- for (i = 0; i < FEC_RX_BUF_NUMBER; i++) +- { +- if (!fp->askb_rx[i]) +- { +- fp->askb_rx[i] = alloc_skb(FEC_MAXBUF_SIZE + 16, GFP_ATOMIC | GFP_DMA); +- if (!fp->askb_rx[i]) +- { +- fp->fecpriv_rxdesc[i].dataPointer = 0; +- fp->fecpriv_rxdesc[i].statCtrl = 0; +- fp->fecpriv_rxdesc[i].length = 0; +- continue; +- } ++ /* Initialize reception descriptors and start DMA for the reception */ ++ for (i = 0; i < FEC_RX_BUF_NUMBER; i++) { ++ if (!fp->askb_rx[i]) { ++ fp->askb_rx[i] = alloc_skb(FEC_MAXBUF_SIZE + 16, GFP_ATOMIC | GFP_DMA); ++ if (!fp->askb_rx[i]) { ++ fp->fecpriv_rxdesc[i].dataPointer = 0; ++ fp->fecpriv_rxdesc[i].statCtrl = 0; ++ fp->fecpriv_rxdesc[i].length = 0; ++ continue; ++ } + fp->askb_rx[i]->dev = dev; +- skb_reserve(fp->askb_rx[i], 16); +- } +- fp->fecpriv_rxdesc[i].dataPointer = (unsigned int) virt_to_phys(fp->askb_rx[i]->tail); ++ skb_reserve(fp->askb_rx[i], 16); ++ } ++ fp->fecpriv_rxdesc[i].dataPointer = (unsigned int) virt_to_phys(fp->askb_rx[i]->tail); + fp->fecpriv_rxdesc[i].statCtrl = MCD_FEC_BUF_READY | MCD_FEC_INTERRUPT; +- fp->fecpriv_rxdesc[i].length = FEC_MAXBUF_SIZE; ++ fp->fecpriv_rxdesc[i].length = FEC_MAXBUF_SIZE; + } + + fp->fecpriv_rxdesc[i - 1].statCtrl |= MCD_FEC_WRAP; + fp->fecpriv_current_rx = 0; + +- // restart frame transmission +- for (i = 0; i < FEC_TX_BUF_NUMBER; i++) +- { +- if (fp->fecpriv_txbuf[i]) +- { +- ++ /* restart frame transmission */ ++ for (i = 0; i < FEC_TX_BUF_NUMBER; i++) { ++ if (fp->fecpriv_txbuf[i]) { + kfree(fp->fecpriv_txbuf[i]); + fp->fecpriv_txbuf[i] = NULL; +- fp->fecpriv_stat.tx_dropped++; ++ fp->fecpriv_stat.tx_dropped++; + } + fp->fecpriv_txdesc[i].statCtrl = MCD_FEC_INTERRUPT; + } + fp->fecpriv_txdesc[i - 1].statCtrl |= MCD_FEC_WRAP; + fp->fecpriv_current_tx = fp->fecpriv_next_tx = 0; + +- // flush entire data cache before restarting the DMA ++ /* flush entire data cache before restarting the DMA */ + #if 0 + /* JKM -- currently running with cache turned off */ + DcacheFlushInvalidate(); + #endif + +- // restart DMA from beginning ++ /* restart DMA from beginning */ + MCD_startDma(fp->fecpriv_fec_rx_channel, + (char *) fp->fecpriv_rxdesc, 0, + (unsigned char *) &(FEC_FECRFDR(base_addr)), 0, +@@ -1225,11 +1158,10 @@ void fec_interrupt_fec_reinit(unsigned l + FEC_TX_DMA_PRI, MCD_FECTX_DMA | MCD_INTERRUPT, + MCD_NO_CSUM | MCD_NO_BYTE_SWAP); + +- // Enable FEC +- FEC_ECR(base_addr) |= FEC_ECR_ETHEREN; ++ /* Enable FEC */ ++ FEC_ECR(base_addr) |= FEC_ECR_ETHEREN; + + netif_wake_queue(dev); +- + } + + /************************************************************************ +@@ -1284,8 +1216,8 @@ void fec_interrupt_fec_rx_handler_fec1(v + } + + #endif +-#ifndef MODULE + ++#ifndef MODULE + /************************************************************************ + * NAME: fec_mac_setup0 + * +@@ -1300,7 +1232,6 @@ int __init fec_mac_setup0(char *s) + if(fec_str_to_mac(s, fec_mac_addr_fec0)) + printk("The MAC address of FEC0 cannot be set from command line"); + return 1; +- + } + + #ifdef FEC_2 +@@ -1316,11 +1247,9 @@ int __init fec_mac_setup1(char *s) + if(!s || !*s) + return 1; + +- + if(fec_str_to_mac(s, fec_mac_addr_fec1)) + printk("The MAC address of FEC1 cannot be set from command line"); + return 1; +- + } + #endif + +@@ -1332,52 +1261,46 @@ int __init fec_mac_setup1(char *s) + *************************************************************************/ + int fec_str_to_mac( char *str_mac, unsigned char* addr) + { +- unsigned long val; ++ unsigned long val; + char c; + unsigned long octet[6], *octetptr = octet; + int i; +-again: + ++again: + val = 0; +- while ((c = *str_mac) != '\0') +- { +- if ((c>='0')&&(c<='9')) +- { ++ while ((c = *str_mac) != '\0') { ++ if ((c>='0')&&(c<='9')) { + val = (val * 16) + (c - '0'); + str_mac++; + continue; + } +- else +- if (((c>='a')&&(c<='f'))||((c>='A')&&(c<='F'))) +- { ++ else if (((c>='a')&&(c<='f'))||((c>='A')&&(c<='F'))) { + val = (val << 4) + (c + 10 - (((c>='a')&&(c<='f')) ? 'a' : 'A')); + str_mac++; + continue; + } + break; + } +- if (*str_mac == ':') +- { ++ if (*str_mac == ':') { + *octetptr++ = val, str_mac++; + if (octetptr >= octet + 6) + return 1; + goto again; + } + +- //Check for trailing characters. ++ /* Check for trailing characters */ + if (*str_mac && !(*str_mac==' ')) + return 1; ++ + *octetptr++ = val; + +- if ((octetptr - octet)==6) +- { +- for(i=0;i<=6;i++) +- addr[i]=octet[i]; ++ if ((octetptr - octet)==6) { ++ for(i=0;i<=6;i++) ++ addr[i]=octet[i]; + } +- else ++ else + return 1; + + return 0; +- + } + #endif diff --git a/target/linux/coldfire/patches/048-m547x_8x_internal_rename.patch b/target/linux/coldfire/patches/048-m547x_8x_internal_rename.patch new file mode 100644 index 0000000000..eda1df0ae6 --- /dev/null +++ b/target/linux/coldfire/patches/048-m547x_8x_internal_rename.patch @@ -0,0 +1,22 @@ +From 62c2649ed2362a5f0478df60d56ed35414ac81ea Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Thu, 13 Mar 2008 22:06:35 -0600 +Subject: [PATCH] Change internal name rigo to m548x_7x + +LTIBName: m547x-8x-internal-rename +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + arch/m68k/coldfire/head.S | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +--- a/arch/m68k/coldfire/head.S ++++ b/arch/m68k/coldfire/head.S +@@ -53,7 +53,7 @@ + #define __FINIT .previous + #endif + +-/* JKM -- REVISE DOCS FOR RIGO and PHYS MAPPING */ ++/* JKM -- REVISE DOCS FOR M547x_8x and PHYS MAPPING */ + /* + * Setup ACR mappings to provide the following memory map: + * Data diff --git a/target/linux/coldfire/patches/049-mcfv4e_linker_bss_cleanup.patch b/target/linux/coldfire/patches/049-mcfv4e_linker_bss_cleanup.patch new file mode 100644 index 0000000000..06a68aa584 --- /dev/null +++ b/target/linux/coldfire/patches/049-mcfv4e_linker_bss_cleanup.patch @@ -0,0 +1,72 @@ +From 4e16f08c800d57b986217e0d39d4a06b5bdf641d Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Wed, 19 Mar 2008 17:37:44 -0600 +Subject: [PATCH] Move BSS section in linker script and zero it on boot. + +To work with the latest round of toolchains the bss section +in the linker script needed to be moved to the end (due to +the linker thinking there were overlapping sections). + +The BSS section needs to be manually zeroed. + +LTIBName: mcfv4e-linker-bss-cleanup +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + arch/m68k/coldfire/head.S | 11 +++++++++++ + arch/m68k/coldfire/vmlinux-cf.lds | 11 ++++++++--- + 2 files changed, 19 insertions(+), 3 deletions(-) + +--- a/arch/m68k/coldfire/head.S ++++ b/arch/m68k/coldfire/head.S +@@ -321,6 +321,17 @@ ENTRY(__start) + movec %d0, %acr3 + nop + ++#ifdef CONFIG_COLDFIRE ++/* zero bss */ ++ lea _sbss,%a0 ++ lea _ebss,%a1 ++ clrl %d0 ++_loop_bss: ++ movel %d0,(%a0)+ ++ cmpl %a0,%a1 ++ bne _loop_bss ++#endif ++ + /* If you change the memory size to another value make a matching + change in paging_init(cf-mmu.c) to zones_size[]. */ + +--- a/arch/m68k/coldfire/vmlinux-cf.lds ++++ b/arch/m68k/coldfire/vmlinux-cf.lds +@@ -51,9 +51,6 @@ SECTIONS + CONSTRUCTORS + } :data + +- .bss : AT(ADDR(.bss) - LOAD_OFFSET) { /* BSS */ +- *(.bss) +- } + + . = ALIGN(16); + .data.cacheline_aligned : AT(ADDR(.data.cacheline_aligned) - LOAD_OFFSET ) { +@@ -62,6 +59,8 @@ SECTIONS + + _edata = .; /* End of data section */ + ++ NOTES /* support ld --build-id */ ++ + . = ALIGN(8192); /* Initrd */ + .init.text : AT(ADDR(.init.text) - LOAD_OFFSET) { + __init_begin = .; +@@ -111,6 +110,12 @@ SECTIONS + *(.data.init_task) /* The initial task and kernel stack */ + } + ++ _sbss = .; ++ .bss : AT(ADDR(.bss) - LOAD_OFFSET) { /* BSS */ ++ *(.bss) ++ } ++ _ebss = .; ++ + _end = . ; + + /* Sections to be discarded */ diff --git a/target/linux/coldfire/patches/050-mcfv4e_irq_magic_bit.patch b/target/linux/coldfire/patches/050-mcfv4e_irq_magic_bit.patch new file mode 100644 index 0000000000..61d746b701 --- /dev/null +++ b/target/linux/coldfire/patches/050-mcfv4e_irq_magic_bit.patch @@ -0,0 +1,31 @@ +From 3487b77acbb12f4174f46237f942918651b23aa7 Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Tue, 15 Apr 2008 17:14:55 -0600 +Subject: [PATCH] Fix setting low 31 interrupts to deal with magic bit 0 + of the IMRL register. + +LTIBName: mcfv4e-irq-magic-bit +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + arch/m68k/coldfire/ints.c | 9 ++++++--- + 1 files changed, 6 insertions(+), 3 deletions(-) + +--- a/arch/m68k/coldfire/ints.c ++++ b/arch/m68k/coldfire/ints.c +@@ -420,10 +420,13 @@ void m547x_8x_irq_enable(unsigned int ir + } + #endif + +- if (irq < 32) +- MCF_IMRL &= ~(1 << irq); +- else ++ if (irq < 32) { ++ /* *grumble* don't set low bit of IMRL */ ++ MCF_IMRL &= (~(1 << irq) & 0xfffffffe); ++ } ++ else { + MCF_IMRH &= ~(1 << (irq - 32)); ++ } + } + + void m547x_8x_irq_disable(unsigned int irq) diff --git a/target/linux/coldfire/patches/051-m547x_8x_mcdma_1.0.patch b/target/linux/coldfire/patches/051-m547x_8x_mcdma_1.0.patch new file mode 100644 index 0000000000..817fb1b6cf --- /dev/null +++ b/target/linux/coldfire/patches/051-m547x_8x_mcdma_1.0.patch @@ -0,0 +1,3726 @@ +From 6c9df5dff79b6d09d1a31681067e7fbd85285f80 Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Wed, 30 Apr 2008 12:22:03 -0600 +Subject: [PATCH] Update MultiChannel DMA to code version 1.0. + +Changes since previous: +- Updated FEC RX task to work around bug where it would not update + the RX buffer descriptors correctly and adjusted size accordingly. +- Added flag MCD_TT_FLAGS_PI for use with DSPI on MCD547x/8x. +- Fixed cleanup of paused tasks in MCD_killDma. +- Cosmetic changes to cleanup MCD_dmaApi.c. + +LTIBName: m547x-8x-mcdma-1.0 +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + arch/m68k/coldfire/Makefile | 3 +- + arch/m68k/coldfire/dma.c | 532 ---- + arch/m68k/coldfire/m547x_8x-dma.c | 516 ++++ + drivers/dma/MCD_dma.h | 786 +++--- + drivers/dma/MCD_dmaApi.c | 417 ++-- + drivers/dma/MCD_progCheck.h | 45 +- + drivers/dma/MCD_tasks.c | 4917 +++++++++++++++++++------------------ + drivers/dma/MCD_tasksInit.c | 402 ++-- + drivers/dma/MCD_tasksInit.h | 49 +- + 9 files changed, 3785 insertions(+), 3882 deletions(-) + delete mode 100644 arch/m68k/coldfire/dma.c + create mode 100644 arch/m68k/coldfire/m547x_8x-dma.c + +--- a/arch/m68k/coldfire/Makefile ++++ b/arch/m68k/coldfire/Makefile +@@ -10,5 +10,4 @@ endif + + obj-$(CONFIG_PCI) += pci.o mcf5445x-pci.o iomap.o + obj-$(CONFIG_M54455) += mcf5445x-devices.o +- +-obj-$(CONFIG_MCD_DMA) += dma.o ++obj-$(CONFIG_MCD_DMA) += m547x_8x-dma.o +--- a/arch/m68k/coldfire/dma.c ++++ /dev/null +@@ -1,532 +0,0 @@ +-#include <linux/kernel.h> +-#include <linux/sched.h> +-#include <linux/mm.h> +-#include <linux/init.h> +-#include <linux/interrupt.h> +-#include <asm/io.h> +-#include <asm/irq.h> +-#include <asm/dma.h> +-#include <asm/coldfire.h> +-#include <asm/m5485sram.h> +-#include <asm/mcfsim.h> +- +- +- +-void dma_interrupt_handler(int irq, void *dev_id, struct pt_regs *regs); +- +-/* +- * This global keeps track of which initiators have been +- * used of the available assignments. Initiators 0-15 are +- * hardwired. Initiators 16-31 are multiplexed and controlled +- * via the Initiatior Mux Control Registe (IMCR). The +- * assigned requestor is stored with the associated initiator +- * number. +- */ +-static int used_reqs[32] = { +- DMA_ALWAYS, DMA_DSPI_RX, DMA_DSPI_TX, DMA_DREQ0, +- DMA_PSC0_RX, DMA_PSC0_TX, DMA_USBEP0, DMA_USBEP1, +- DMA_USBEP2, DMA_USBEP3, DMA_PCI_TX, DMA_PCI_RX, +- DMA_PSC1_RX, DMA_PSC1_TX, DMA_I2C_RX, DMA_I2C_TX, +- 0, 0, 0, 0, +- 0, 0, 0, 0, +- 0, 0, 0, 0, +- 0, 0, 0, 0 +-}; +- +-/* +- * This global keeps track of which channels have been assigned +- * to tasks. This methology assumes that no single initiator +- * will be tied to more than one task/channel +- */ +-static char used_channel[16] = { +- -1, -1, -1, -1, -1, -1, -1, -1, +- -1, -1, -1, -1, -1, -1, -1, -1 +-}; +- +-unsigned int connected_channel[16] = { +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0 +-}; +- +-/********************************************************************/ +-/* +- * Attempt to enable the provided Initiator in the Initiator +- * Mux Control Register +- * +- * Parameters: +- * initiator Initiator identifier +- * +- * Return Value: +- * 1 if unable to make the assignment +- * 0 successful +- */ +-int +-dma_set_initiator(int initiator) +-{ +- switch (initiator) { /* +- * These initiators are always active +- */ +- case DMA_ALWAYS: +- case DMA_DSPI_RX: +- case DMA_DSPI_TX: +- case DMA_DREQ0: +- case DMA_PSC0_RX: +- case DMA_PSC0_TX: +- case DMA_USBEP0: +- case DMA_USBEP1: +- case DMA_USBEP2: +- case DMA_USBEP3: +- case DMA_PCI_TX: +- case DMA_PCI_RX: +- case DMA_PSC1_RX: +- case DMA_PSC1_TX: +- case DMA_I2C_RX: +- case DMA_I2C_TX: +- break; +- +- case DMA_FEC0_RX: +- MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC16(3)) +- | MCF_DMA_IMCR_SRC16_FEC0RX; +- used_reqs[16] = DMA_FEC0_RX; +- break; +- +- case DMA_FEC0_TX: +- MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC17(3)) +- | MCF_DMA_IMCR_SRC17_FEC0TX; +- used_reqs[17] = DMA_FEC0_TX; +- break; +- +- case DMA_FEC1_RX: +- MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC20(3)) +- | MCF_DMA_IMCR_SRC20_FEC1RX; +- used_reqs[20] = DMA_FEC1_RX; +- break; +- +- case DMA_FEC1_TX: +- if (used_reqs[21] == 0) { +- MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC21(3)) +- | MCF_DMA_IMCR_SRC21_FEC1TX; +- used_reqs[21] = DMA_FEC1_TX; +- } else if (used_reqs[25] == 0) { +- MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC25(3)) +- | MCF_DMA_IMCR_SRC25_FEC1TX; +- used_reqs[25] = DMA_FEC1_TX; +- } else if (used_reqs[31] == 0) { +- MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC31(3)) +- | MCF_DMA_IMCR_SRC31_FEC1TX; +- used_reqs[31] = DMA_FEC1_TX; +- } else /* No empty slots */ +- return 1; +- break; +- +- case DMA_DREQ1: +- if (used_reqs[29] == 0) { +- MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC29(3)) +- | MCF_DMA_IMCR_SRC29_DREQ1; +- used_reqs[29] = DMA_DREQ1; +- } else if (used_reqs[21] == 0) { +- MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC21(3)) +- | MCF_DMA_IMCR_SRC21_DREQ1; +- used_reqs[21] = DMA_DREQ1; +- } else /* No empty slots */ +- return 1; +- break; +- +- case DMA_CTM0: +- if (used_reqs[24] == 0) { +- MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC24(3)) +- | MCF_DMA_IMCR_SRC24_CTM0; +- used_reqs[24] = DMA_CTM0; +- } else /* No empty slots */ +- return 1; +- break; +- +- case DMA_CTM1: +- if (used_reqs[25] == 0) { +- MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC25(3)) +- | MCF_DMA_IMCR_SRC25_CTM1; +- used_reqs[25] = DMA_CTM1; +- } else /* No empty slots */ +- return 1; +- break; +- +- case DMA_CTM2: +- if (used_reqs[26] == 0) { +- MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC26(3)) +- | MCF_DMA_IMCR_SRC26_CTM2; +- used_reqs[26] = DMA_CTM2; +- } else /* No empty slots */ +- return 1; +- break; +- +- case DMA_CTM3: +- if (used_reqs[27] == 0) { +- MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC27(3)) +- | MCF_DMA_IMCR_SRC27_CTM3; +- used_reqs[27] = DMA_CTM3; +- } else /* No empty slots */ +- return 1; +- break; +- +- case DMA_CTM4: +- if (used_reqs[28] == 0) { +- MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC28(3)) +- | MCF_DMA_IMCR_SRC28_CTM4; +- used_reqs[28] = DMA_CTM4; +- } else /* No empty slots */ +- return 1; +- break; +- +- case DMA_CTM5: +- if (used_reqs[29] == 0) { +- MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC29(3)) +- | MCF_DMA_IMCR_SRC29_CTM5; +- used_reqs[29] = DMA_CTM5; +- } else /* No empty slots */ +- return 1; +- break; +- +- case DMA_CTM6: +- if (used_reqs[30] == 0) { +- MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC30(3)) +- | MCF_DMA_IMCR_SRC30_CTM6; +- used_reqs[30] = DMA_CTM6; +- } else /* No empty slots */ +- return 1; +- break; +- +- case DMA_CTM7: +- if (used_reqs[31] == 0) { +- MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC31(3)) +- | MCF_DMA_IMCR_SRC31_CTM7; +- used_reqs[31] = DMA_CTM7; +- } else /* No empty slots */ +- return 1; +- break; +- +- case DMA_USBEP4: +- if (used_reqs[26] == 0) { +- MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC26(3)) +- | MCF_DMA_IMCR_SRC26_USBEP4; +- used_reqs[26] = DMA_USBEP4; +- } else /* No empty slots */ +- return 1; +- break; +- +- case DMA_USBEP5: +- if (used_reqs[27] == 0) { +- MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC27(3)) +- | MCF_DMA_IMCR_SRC27_USBEP5; +- used_reqs[27] = DMA_USBEP5; +- } else /* No empty slots */ +- return 1; +- break; +- +- case DMA_USBEP6: +- if (used_reqs[28] == 0) { +- MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC28(3)) +- | MCF_DMA_IMCR_SRC28_USBEP6; +- used_reqs[28] = DMA_USBEP6; +- } else /* No empty slots */ +- return 1; +- break; +- +- case DMA_PSC2_RX: +- if (used_reqs[28] == 0) { +- MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC28(3)) +- | MCF_DMA_IMCR_SRC28_PSC2RX; +- used_reqs[28] = DMA_PSC2_RX; +- } else /* No empty slots */ +- return 1; +- break; +- +- case DMA_PSC2_TX: +- if (used_reqs[29] == 0) { +- MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC29(3)) +- | MCF_DMA_IMCR_SRC29_PSC2TX; +- used_reqs[29] = DMA_PSC2_TX; +- } else /* No empty slots */ +- return 1; +- break; +- +- case DMA_PSC3_RX: +- if (used_reqs[30] == 0) { +- MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC30(3)) +- | MCF_DMA_IMCR_SRC30_PSC3RX; +- used_reqs[30] = DMA_PSC3_RX; +- } else /* No empty slots */ +- return 1; +- break; +- +- case DMA_PSC3_TX: +- if (used_reqs[31] == 0) { +- MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC31(3)) +- | MCF_DMA_IMCR_SRC31_PSC3TX; +- used_reqs[31] = DMA_PSC3_TX; +- } else /* No empty slots */ +- return 1; +- break; +- +- default: +- return 1; +- } +- return 0; +-} +- +-/********************************************************************/ +-/* +- * Return the initiator number for the given requestor +- * +- * Parameters: +- * requestor Initiator/Requestor identifier +- * +- * Return Value: +- * The initiator number (0-31) if initiator has been assigned +- * 0 (always initiator) otherwise +- */ +-unsigned int +-dma_get_initiator(int requestor) +-{ +- u32 i; +- +- for (i = 0; i < sizeof (used_reqs); ++i) { +- if (used_reqs[i] == requestor) +- return i; +- } +- return 0; +-} +- +-/********************************************************************/ +-/* +- * Remove the given initiator from the active list +- * +- * Parameters: +- * requestor Initiator/Requestor identifier +- */ +-void +-dma_remove_initiator(int requestor) +-{ +- u32 i; +- +- for (i = 0; i < sizeof (used_reqs); ++i) { +- if (used_reqs[i] == requestor) { +- used_reqs[i] = -1; +- break; +- } +- } +-} +- +-/********************************************************************/ +-/* +- * Attempt to find an available channel for FEC and mark is as used +- * +- * Parameters: +- * requestor Initiator/Requestor identifier +- * +- * Return Value: +- * First available channel (from 0 to 5) or -1 if they are all occupied +- */ +-int +-dma_set_channel_fec(int requestor) +-{ +- u32 i, t; +- +-#ifdef CONFIG_FEC_548x_ENABLE_FEC2 +- t = 4; +-#else +- t = 2; +-#endif +- +- +- +- for (i = 0; i < t ; ++i) +- if (used_channel[i] == -1) { +- used_channel[i] = requestor; +- return i; +- } +- /* All channels taken */ +- return -1; +-} +- +-/********************************************************************/ +-/* +- * Attempt to find an available channel and mark is as used +- * +- * Parameters: +- * requestor Initiator/Requestor identifier +- * +- * Return Value: +- * First available channel (from 6 to 15) or -1 if they are all occupied +- */ +-int +-dma_set_channel(int requestor) +-{ +- u32 i; +-#ifdef CONFIG_NET_FEC2 +- i = 4; +-#else +- i = 2; +-#endif +- +- for (; i < 16; ++i) +- if (used_channel[i] == -1) { +- used_channel[i] = requestor; +- return i; +- } +- +- /* All channels taken */ +- return -1; +-} +- +-/********************************************************************/ +-/* +- * Return the channel being initiated by the given requestor +- * +- * Parameters: +- * requestor Initiator/Requestor identifier +- */ +-int +-dma_get_channel(int requestor) +-{ +- u32 i; +- +- for (i = 0; i < sizeof (used_channel); ++i) { +- if (used_channel[i] == requestor) +- return i; +- } +- return -1; +-} +- +-/********************************************************************/ +-/* +- * Connects a channel with reference on your data +- * +- * Parameters: +- * channel channel number +- * reference addres of your data +- */ +-int +-dma_connect(int channel, int address) +-{ +- if ((channel < 16) && (channel >= 0)) +- connected_channel[channel] = address; +- else +- return -1; +- return 0; +-} +- +-/********************************************************************/ +-/* +- * Disconnects a channel with reference on your data +- * +- * Parameters: +- * channel channel number +-*/ +-int +-dma_disconnect(int channel) +-{ +- if ((channel < 16) && (channel >= 0)) +- connected_channel[channel] = 0; +- else +- return -1; +- return 0; +-} +- +-/********************************************************************/ +-/* +- * Remove the channel being initiated by the given requestor from +- * the active list +- * +- * Parameters: +- * requestor Initiator/Requestor identifier +- */ +-void +-dma_remove_channel(int requestor) +-{ +- u32 i; +- +- for (i = 0; i < sizeof (used_channel); ++i) { +- if (used_channel[i] == requestor) { +- used_channel[i] = -1; +- break; +- } +- } +-} +- +-/********************************************************************/ +-/* +- * This is the catch-all interrupt handler for the mult-channel DMA +- */ +-volatile u8 dma_iflag[16]; +-u32 tx = 0; +- +-void +-dma_interrupt_handler(int irq, void *dev_id, struct pt_regs *regs) +-{ +- u32 i, interrupts/*, mask, temp*/; +- +- /* +- * Determine which interrupt(s) triggered by AND'ing the +- * pending interrupts with those that aren't masked. +- */ +-/* mask = MCF_DMA_DIMR; +- MCF_DMA_DIMR = 0xffffffff; +-*/ +- interrupts = MCF_DMA_DIPR; +- MCF_DMA_DIPR |= interrupts; +-// temp = interrupts; +- +- //MCF_DMA_DIPR = interrupts; +- for (i = 0; i < 16; ++i, interrupts >>= 1) +- if (interrupts & 0x1) +- if (connected_channel[i] != 0) +- ((void (*)(void)) (connected_channel[i])) (); +- +-/* MCF_DMA_DIPR |= temp; +- MCF_DMA_DIMR = mask;*/ +-} +- +-void +-dma_remove_channel_by_number(int channel) +-{ +- if (channel < sizeof (used_channel) && channel >= 0) +- used_channel[channel] = -1; +-} +- +-int __devinit +-dma_init() +-{ +- int result; +- char *dma_version_str; +- +- MCD_getVersion(&dma_version_str); +- printk("Initialize %s\n", dma_version_str); +- +- if (request_irq +- (64 + ISC_DMA, +- dma_interrupt_handler, +- IRQF_DISABLED, +- "MCD-DMA", +- NULL)) { +- printk("Cannot allocate the DMA IRQ(48)\n"); +- return 1; +- } +- +- MCF_DMA_DIMR = 0; +- MCF_DMA_DIPR = 0xFFFFFFFF; +- +- MCF_ICR(ISC_DMA) = ILP_DMA; +- +- result = MCD_initDma((dmaRegs *) (MCF_MBAR + 0x8000), +- (void *) SYS_SRAM_DMA_START, MCD_RELOC_TASKS); +- if (result != MCD_OK) { +- printk("Cannot perform DMA initialization\n"); +- free_irq(64 + ISC_DMA, NULL); +- return 1; +- } +- +- return 0; +-} +- +-device_initcall(dma_init); +- +--- /dev/null ++++ b/arch/m68k/coldfire/m547x_8x-dma.c +@@ -0,0 +1,516 @@ ++/* ++ * arch/m68k/coldfire/m547x_8x-dma.c ++ * ++ * Coldfire M547x/M548x DMA ++ * ++ * Copyright (c) 2008 Freescale Semiconductor, Inc. ++ * Kurt Mahan <kmahan@freescale.com> ++ * ++ * This code is based on patches from the Freescale M547x_8x BSP ++ * release mcf547x_8x-20070107-ltib.iso ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++#include <linux/kernel.h> ++#include <linux/sched.h> ++#include <linux/mm.h> ++#include <linux/init.h> ++#include <linux/interrupt.h> ++#include <asm/io.h> ++#include <asm/irq.h> ++#include <asm/dma.h> ++#include <asm/coldfire.h> ++#include <asm/m5485sram.h> ++#include <asm/mcfsim.h> ++ ++/* ++ * This global keeps track of which initiators have been ++ * used of the available assignments. Initiators 0-15 are ++ * hardwired. Initiators 16-31 are multiplexed and controlled ++ * via the Initiatior Mux Control Registe (IMCR). The ++ * assigned requestor is stored with the associated initiator ++ * number. ++ */ ++static int used_reqs[32] = { ++ DMA_ALWAYS, DMA_DSPI_RX, DMA_DSPI_TX, DMA_DREQ0, ++ DMA_PSC0_RX, DMA_PSC0_TX, DMA_USBEP0, DMA_USBEP1, ++ DMA_USBEP2, DMA_USBEP3, DMA_PCI_TX, DMA_PCI_RX, ++ DMA_PSC1_RX, DMA_PSC1_TX, DMA_I2C_RX, DMA_I2C_TX, ++ 0, 0, 0, 0, ++ 0, 0, 0, 0, ++ 0, 0, 0, 0, ++ 0, 0, 0, 0 ++}; ++ ++/* ++ * This global keeps track of which channels have been assigned ++ * to tasks. This methology assumes that no single initiator ++ * will be tied to more than one task/channel ++ */ ++static char used_channel[16] = { ++ -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, -1, -1, -1, -1, -1, -1 ++}; ++ ++unsigned int connected_channel[16] = { ++ 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0 ++}; ++ ++/** ++ * dma_set_initiator - enable initiator ++ * @initiator: initiator identifier ++ * ++ * Returns 0 of successful, non-zero otherwise ++ * ++ * Attempt to enable the provided Initiator in the Initiator ++ * Mux Control Register. ++ */ ++int dma_set_initiator(int initiator) ++{ ++ switch (initiator) { ++ case DMA_ALWAYS: ++ case DMA_DSPI_RX: ++ case DMA_DSPI_TX: ++ case DMA_DREQ0: ++ case DMA_PSC0_RX: ++ case DMA_PSC0_TX: ++ case DMA_USBEP0: ++ case DMA_USBEP1: ++ case DMA_USBEP2: ++ case DMA_USBEP3: ++ case DMA_PCI_TX: ++ case DMA_PCI_RX: ++ case DMA_PSC1_RX: ++ case DMA_PSC1_TX: ++ case DMA_I2C_RX: ++ case DMA_I2C_TX: ++ /* ++ * These initiators are always active ++ */ ++ break; ++ ++ case DMA_FEC0_RX: ++ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC16(3)) ++ | MCF_DMA_IMCR_SRC16_FEC0RX; ++ used_reqs[16] = DMA_FEC0_RX; ++ break; ++ ++ case DMA_FEC0_TX: ++ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC17(3)) ++ | MCF_DMA_IMCR_SRC17_FEC0TX; ++ used_reqs[17] = DMA_FEC0_TX; ++ break; ++ ++ case DMA_FEC1_RX: ++ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC20(3)) ++ | MCF_DMA_IMCR_SRC20_FEC1RX; ++ used_reqs[20] = DMA_FEC1_RX; ++ break; ++ ++ case DMA_FEC1_TX: ++ if (used_reqs[21] == 0) { ++ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC21(3)) ++ | MCF_DMA_IMCR_SRC21_FEC1TX; ++ used_reqs[21] = DMA_FEC1_TX; ++ } else if (used_reqs[25] == 0) { ++ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC25(3)) ++ | MCF_DMA_IMCR_SRC25_FEC1TX; ++ used_reqs[25] = DMA_FEC1_TX; ++ } else if (used_reqs[31] == 0) { ++ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC31(3)) ++ | MCF_DMA_IMCR_SRC31_FEC1TX; ++ used_reqs[31] = DMA_FEC1_TX; ++ } else /* No empty slots */ ++ return 1; ++ break; ++ ++ case DMA_DREQ1: ++ if (used_reqs[29] == 0) { ++ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC29(3)) ++ | MCF_DMA_IMCR_SRC29_DREQ1; ++ used_reqs[29] = DMA_DREQ1; ++ } else if (used_reqs[21] == 0) { ++ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC21(3)) ++ | MCF_DMA_IMCR_SRC21_DREQ1; ++ used_reqs[21] = DMA_DREQ1; ++ } else /* No empty slots */ ++ return 1; ++ break; ++ ++ case DMA_CTM0: ++ if (used_reqs[24] == 0) { ++ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC24(3)) ++ | MCF_DMA_IMCR_SRC24_CTM0; ++ used_reqs[24] = DMA_CTM0; ++ } else /* No empty slots */ ++ return 1; ++ break; ++ ++ case DMA_CTM1: ++ if (used_reqs[25] == 0) { ++ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC25(3)) ++ | MCF_DMA_IMCR_SRC25_CTM1; ++ used_reqs[25] = DMA_CTM1; ++ } else /* No empty slots */ ++ return 1; ++ break; ++ ++ case DMA_CTM2: ++ if (used_reqs[26] == 0) { ++ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC26(3)) ++ | MCF_DMA_IMCR_SRC26_CTM2; ++ used_reqs[26] = DMA_CTM2; ++ } else /* No empty slots */ ++ return 1; ++ break; ++ ++ case DMA_CTM3: ++ if (used_reqs[27] == 0) { ++ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC27(3)) ++ | MCF_DMA_IMCR_SRC27_CTM3; ++ used_reqs[27] = DMA_CTM3; ++ } else /* No empty slots */ ++ return 1; ++ break; ++ ++ case DMA_CTM4: ++ if (used_reqs[28] == 0) { ++ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC28(3)) ++ | MCF_DMA_IMCR_SRC28_CTM4; ++ used_reqs[28] = DMA_CTM4; ++ } else /* No empty slots */ ++ return 1; ++ break; ++ ++ case DMA_CTM5: ++ if (used_reqs[29] == 0) { ++ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC29(3)) ++ | MCF_DMA_IMCR_SRC29_CTM5; ++ used_reqs[29] = DMA_CTM5; ++ } else /* No empty slots */ ++ return 1; ++ break; ++ ++ case DMA_CTM6: ++ if (used_reqs[30] == 0) { ++ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC30(3)) ++ | MCF_DMA_IMCR_SRC30_CTM6; ++ used_reqs[30] = DMA_CTM6; ++ } else /* No empty slots */ ++ return 1; ++ break; ++ ++ case DMA_CTM7: ++ if (used_reqs[31] == 0) { ++ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC31(3)) ++ | MCF_DMA_IMCR_SRC31_CTM7; ++ used_reqs[31] = DMA_CTM7; ++ } else /* No empty slots */ ++ return 1; ++ break; ++ ++ case DMA_USBEP4: ++ if (used_reqs[26] == 0) { ++ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC26(3)) ++ | MCF_DMA_IMCR_SRC26_USBEP4; ++ used_reqs[26] = DMA_USBEP4; ++ } else /* No empty slots */ ++ return 1; ++ break; ++ ++ case DMA_USBEP5: ++ if (used_reqs[27] == 0) { ++ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC27(3)) ++ | MCF_DMA_IMCR_SRC27_USBEP5; ++ used_reqs[27] = DMA_USBEP5; ++ } else /* No empty slots */ ++ return 1; ++ break; ++ ++ case DMA_USBEP6: ++ if (used_reqs[28] == 0) { ++ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC28(3)) ++ | MCF_DMA_IMCR_SRC28_USBEP6; ++ used_reqs[28] = DMA_USBEP6; ++ } else /* No empty slots */ ++ return 1; ++ break; ++ ++ case DMA_PSC2_RX: ++ if (used_reqs[28] == 0) { ++ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC28(3)) ++ | MCF_DMA_IMCR_SRC28_PSC2RX; ++ used_reqs[28] = DMA_PSC2_RX; ++ } else /* No empty slots */ ++ return 1; ++ break; ++ ++ case DMA_PSC2_TX: ++ if (used_reqs[29] == 0) { ++ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC29(3)) ++ | MCF_DMA_IMCR_SRC29_PSC2TX; ++ used_reqs[29] = DMA_PSC2_TX; ++ } else /* No empty slots */ ++ return 1; ++ break; ++ ++ case DMA_PSC3_RX: ++ if (used_reqs[30] == 0) { ++ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC30(3)) ++ | MCF_DMA_IMCR_SRC30_PSC3RX; ++ used_reqs[30] = DMA_PSC3_RX; ++ } else /* No empty slots */ ++ return 1; ++ break; ++ ++ case DMA_PSC3_TX: ++ if (used_reqs[31] == 0) { ++ MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC31(3)) ++ | MCF_DMA_IMCR_SRC31_PSC3TX; ++ used_reqs[31] = DMA_PSC3_TX; ++ } else /* No empty slots */ ++ return 1; ++ break; ++ ++ default: ++ return 1; ++ } ++ return 0; ++} ++ ++/** ++ * dma_get_initiator - get the initiator for the given requestor ++ * @requestor: initiator identifier ++ * ++ * Returns initiator number (0-31) if assigned or just 0 ++ */ ++unsigned int dma_get_initiator(int requestor) ++{ ++ u32 i; ++ ++ for (i = 0; i < sizeof(used_reqs); ++i) { ++ if (used_reqs[i] == requestor) ++ return i; ++ } ++ return 0; ++} ++ ++/** ++ * dma_remove_initiator - remove the given initiator from active list ++ * @requestor: requestor to remove ++ */ ++void dma_remove_initiator(int requestor) ++{ ++ u32 i; ++ ++ for (i = 0; i < sizeof(used_reqs); ++i) { ++ if (used_reqs[i] == requestor) { ++ used_reqs[i] = -1; ++ break; ++ } ++ } ++} ++ ++/** ++ * dma_set_channel_fec: find available channel for fec and mark ++ * @requestor: initiator/requestor identifier ++ * ++ * Returns first avaialble channel (0-5) or -1 if all occupied ++ */ ++int dma_set_channel_fec(int requestor) ++{ ++ u32 i, t; ++ ++#ifdef CONFIG_FEC_548x_ENABLE_FEC2 ++ t = 4; ++#else ++ t = 2; ++#endif ++ ++ for (i = 0; i < t ; ++i) { ++ if (used_channel[i] == -1) { ++ used_channel[i] = requestor; ++ return i; ++ } ++ } ++ /* All channels taken */ ++ return -1; ++} ++ ++/** ++ * dma_set_channel - find an available channel and mark as used ++ * @requestor: initiator/requestor identifier ++ * ++ * Returns first available channel (6-15) or -1 if all occupied ++ */ ++int dma_set_channel(int requestor) ++{ ++ u32 i; ++#ifdef CONFIG_NET_FEC2 ++ i = 4; ++#else ++ i = 2; ++#endif ++ ++ for (; i < 16; ++i) ++ if (used_channel[i] == -1) { ++ used_channel[i] = requestor; ++ return i; ++ } ++ ++ /* All channels taken */ ++ return -1; ++} ++ ++/** ++ * dma_get_channel - get the channel being initiated by the requestor ++ * @requestor: initiator/requestor identifier ++ * ++ * Returns Initiator for requestor or -1 if not found ++ */ ++int dma_get_channel(int requestor) ++{ ++ u32 i; ++ ++ for (i = 0; i < sizeof(used_channel); ++i) { ++ if (used_channel[i] == requestor) ++ return i; ++ } ++ return -1; ++} ++ ++/** ++ * dma_connect - connect a channel with reference on data ++ * @channel: channel number ++ * @address: reference address of data ++ * ++ * Returns 0 if success or -1 if invalid channel ++ */ ++int dma_connect(int channel, int address) ++{ ++ if ((channel < 16) && (channel >= 0)) { ++ connected_channel[channel] = address; ++ return 0; ++ } ++ return -1; ++} ++ ++/** ++ * dma_disconnect - disconnect a channel ++ * @channel: channel number ++ * ++ * Returns 0 if success or -1 if invalid channel ++ */ ++int dma_disconnect(int channel) ++{ ++ if ((channel < 16) && (channel >= 0)) { ++ connected_channel[channel] = 0; ++ return 0; ++ } ++ return -1; ++} ++ ++/** ++ * dma_remove_channel - remove channel from the active list ++ * @requestor: initiator/requestor identifier ++ */ ++void dma_remove_channel(int requestor) ++{ ++ u32 i; ++ ++ for (i = 0; i < sizeof(used_channel); ++i) { ++ if (used_channel[i] == requestor) { ++ used_channel[i] = -1; ++ break; ++ } ++ } ++} ++ ++/** ++ * dma_interrupt_handler - dma interrupt handler ++ * @irq: interrupt number ++ * @dev_id: data ++ * ++ * Returns IRQ_HANDLED ++ */ ++irqreturn_t dma_interrupt_handler(int irq, void *dev_id) ++{ ++ u32 i, interrupts; ++ ++ /* ++ * Determine which interrupt(s) triggered by AND'ing the ++ * pending interrupts with those that aren't masked. ++ */ ++ interrupts = MCF_DMA_DIPR; ++ MCF_DMA_DIPR |= interrupts; ++ ++ for (i = 0; i < 16; ++i, interrupts >>= 1) { ++ if (interrupts & 0x1) ++ if (connected_channel[i] != 0) ++ ((void (*)(void)) (connected_channel[i])) (); ++ } ++ ++ return IRQ_HANDLED; ++} ++ ++/** ++ * dma_remove_channel_by_number - clear dma channel ++ * @channel: channel number to clear ++ */ ++void dma_remove_channel_by_number(int channel) ++{ ++ if ((channel < sizeof(used_channel)) && (channel >= 0)) ++ used_channel[channel] = -1; ++} ++ ++/** ++ * dma_init - initialize the dma subsystem ++ * ++ * Returns 0 if success non-zero if failure ++ * ++ * Handles the DMA initialization during device setup. ++ */ ++int __devinit dma_init() ++{ ++ int result; ++ char *dma_version_str; ++ ++ MCD_getVersion(&dma_version_str); ++ printk(KERN_INFO "m547x_8x DMA: Initialize %s\n", dma_version_str); ++ ++ /* attempt to setup dma interrupt handler */ ++ if (request_irq(64 + ISC_DMA, dma_interrupt_handler, IRQF_DISABLED, ++ "MCD-DMA", NULL)) { ++ printk(KERN_ERR "MCD-DMA: Cannot allocate the DMA IRQ(48)\n"); ++ return 1; ++ } ++ ++ MCF_DMA_DIMR = 0; ++ MCF_DMA_DIPR = 0xFFFFFFFF; ++ ++ MCF_ICR(ISC_DMA) = ILP_DMA; ++ ++ result = MCD_initDma((dmaRegs *) (MCF_MBAR + 0x8000), ++ (void *) SYS_SRAM_DMA_START, MCD_RELOC_TASKS); ++ if (result != MCD_OK) { ++ printk(KERN_ERR "MCD-DMA: Cannot perform DMA initialization\n"); ++ free_irq(64 + ISC_DMA, NULL); ++ return 1; ++ } ++ ++ return 0; ++} ++device_initcall(dma_init); +--- a/drivers/dma/MCD_dma.h ++++ b/drivers/dma/MCD_dma.h +@@ -1,45 +1,27 @@ +-/********************************************************************* +- * +- * Copyright (C) 2004 Motorola, Inc. +- * MOTOROLA, INC. All Rights Reserved. +- * You are hereby granted a copyright license to use +- * the SOFTWARE so long as this entire notice is +- * retained without alteration in any modified and/or redistributed +- * versions, and that such modified versions are clearly identified +- * as such. No licenses are granted by implication, estoppel or +- * otherwise under any patents or trademarks of Motorola, Inc. This +- * software is provided on an "AS IS" basis and without warranty. ++/* ++ * drivers/dma/MCD_dma.h + * +- * To the maximum extent permitted by applicable law, MOTOROLA +- * DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED, INCLUDING +- * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR +- * PURPOSE AND ANY WARRANTY AGAINST INFRINGEMENT WITH REGARD TO THE +- * SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF) AND ANY +- * ACCOMPANYING WRITTEN MATERIALS. ++ * Copyright (C) 2004-2008 Freescale Semiconductor, Inc. ++ * Kurt Mahan <kmahan@freescale.com> + * +- * To the maximum extent permitted by applicable law, IN NO EVENT +- * SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER (INCLUDING +- * WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS +- * INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY +- * LOSS) ARISING OF THE USE OR INABILITY TO USE THE SOFTWARE. ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of ++ * the License, or (at your option) any later version. + * +- * Motorola assumes no responsibility for the maintenance and support +- * of this software +- ********************************************************************/ +- +-/* +- * File: MCD_dma.h +- * Purpose: Main header file for multi-channel DMA API. ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. + * +- * Notes: +- * +- * Modifications: ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++ * MA 02111-1307 USA + */ + #ifndef _MCD_API_H + #define _MCD_API_H + +-#include <asm/types.h> +- + /* + * Turn Execution Unit tasks ON (#define) or OFF (#undef) + */ +@@ -79,26 +61,13 @@ + /* + * Portability typedefs + */ +- /* +-#ifndef s32 + typedef int s32; +-#endif +-#ifndef u32 + typedef unsigned int u32; +-#endif +-#ifndef s16 + typedef short s16; +-#endif +-#ifndef u16 + typedef unsigned short u16; +-#endif +-#ifndef s8 + typedef char s8; +-#endif +-#ifndef u8 + typedef unsigned char u8; +-#endif +-*/ ++ + /* + * These structures represent the internal registers of the + * multi-channel DMA +@@ -233,6 +202,7 @@ typedef volatile struct dmaRegs_s dmaReg + #define MCD_TT_FLAGS_RL 0x00000001 /* Read line */ + #define MCD_TT_FLAGS_CW 0x00000002 /* Combine Writes */ + #define MCD_TT_FLAGS_SP 0x00000004 /* Speculative prefetch(XLB) MCF547x/548x ONLY */ ++#define MCD_TT_FLAGS_PI 0x00000040 /* Precise Increment */ + #define MCD_TT_FLAGS_MASK 0x000000ff + #define MCD_TT_FLAGS_DEF (MCD_TT_FLAGS_RL | MCD_TT_FLAGS_CW) + +--- a/drivers/dma/MCD_dmaApi.c ++++ b/drivers/dma/MCD_dmaApi.c +@@ -1,46 +1,26 @@ +-/********************************************************************* +- * +- * Copyright (C) 2004 Motorola, Inc. +- * MOTOROLA, INC. All Rights Reserved. +- * You are hereby granted a copyright license to use +- * the SOFTWARE so long as this entire notice is +- * retained without alteration in any modified and/or redistributed +- * versions, and that such modified versions are clearly identified +- * as such. No licenses are granted by implication, estoppel or +- * otherwise under any patents or trademarks of Motorola, Inc. This +- * software is provided on an "AS IS" basis and without warranty. +- * +- * To the maximum extent permitted by applicable law, MOTOROLA +- * DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED, INCLUDING +- * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR +- * PURPOSE AND ANY WARRANTY AGAINST INFRINGEMENT WITH REGARD TO THE +- * SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF) AND ANY +- * ACCOMPANYING WRITTEN MATERIALS. +- * +- * To the maximum extent permitted by applicable law, IN NO EVENT +- * SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER (INCLUDING +- * WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS +- * INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY +- * LOSS) ARISING OF THE USE OR INABILITY TO USE THE SOFTWARE. +- * +- * Motorola assumes no responsibility for the maintenance and support +- * of this software +- ********************************************************************/ +- + /* +- * File: MCD_dmaApi.c +- * Purpose: Main C file for multi-channel DMA API. +- * +- * Notes: ++ * drivers/dma/MCD_dmaApi.c + * ++ * Copyright (C) 2004-2008 Freescale Semiconductor, Inc. ++ * Kurt Mahan <kmahan@freescale.com> + * +- * Modifications: ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of ++ * the License, or (at your option) any later version. + * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. + * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++ * MA 02111-1307 USA + */ +-#include <asm/types.h> +-#include <asm/MCD_dma.h> +-#include <asm/virtconvert.h> ++ ++#include "MCD_dma.h" + #include "MCD_tasksInit.h" + #include "MCD_progCheck.h" + +@@ -148,7 +128,6 @@ MCD_bufDesc *MCD_relocBuffDesc; + + /* + * Structure to remember which variant is on which channel +- * TBD- need this? + */ + typedef struct MCD_remVariants_struct MCD_remVariant; + struct MCD_remVariants_struct +@@ -164,6 +143,7 @@ struct MCD_remVariants_struct + * Structure to remember the startDma parameters for each channel + */ + MCD_remVariant MCD_remVariants; ++ + /********************************************************************/ + /* + * Function: MCD_initDma +@@ -185,15 +165,14 @@ int MCD_initDma (dmaRegs *dmaBarAddr, vo + int i; + TaskTableEntry *entryPtr; + +- /* setup the local pointer to register set */ ++ /* Setup the local pointer to register set */ + MCD_dmaBar = dmaBarAddr; + +- /* do we need to move/create a task table */ ++ /* Do we need to move/create a task table */ + if ((flags & MCD_RELOC_TASKS) != 0) + { + int fixedSize; + u32 *fixedPtr; +- /*int *tablePtr = taskTableDest;TBD*/ + int varTabsOffset, funcDescTabsOffset, contextSavesOffset; + int taskDescTabsOffset; + int taskTableSize, varTabsSize, funcDescTabsSize, contextSavesSize; +@@ -201,7 +180,7 @@ int MCD_initDma (dmaRegs *dmaBarAddr, vo + + int i; + +- /* check if physical address is aligned on 512 byte boundary */ ++ /* Check if physical address is aligned on 512 byte boundary */ + if (((u32)taskTableDest & 0x000001ff) != 0) + return(MCD_TABLE_UNALIGNED); + +@@ -215,13 +194,12 @@ int MCD_initDma (dmaRegs *dmaBarAddr, vo + * - copy over model task table with the the actual task descriptor + * tables + */ +- + taskTableSize = NCHANNELS * sizeof(TaskTableEntry); +- /* align variable tables to size */ ++ /* Align variable tables to size */ + varTabsOffset = taskTableSize + (u32)taskTableDest; + if ((varTabsOffset & (VAR_TAB_SIZE - 1)) != 0) + varTabsOffset = (varTabsOffset + VAR_TAB_SIZE) & (~VAR_TAB_SIZE); +- /* align function descriptor tables */ ++ /* Align function descriptor tables */ + varTabsSize = NCHANNELS * VAR_TAB_SIZE; + funcDescTabsOffset = varTabsOffset + varTabsSize; + +@@ -235,13 +213,13 @@ int MCD_initDma (dmaRegs *dmaBarAddr, vo + fixedSize = taskTableSize + varTabsSize + funcDescTabsSize + + contextSavesSize; + +- /* zero the thing out */ ++ /* Zero the thing out */ + fixedPtr = (u32 *)taskTableDest; + for (i = 0;i<(fixedSize/4);i++) + fixedPtr[i] = 0; + + entryPtr = (TaskTableEntry*)MCD_taskTable; +- /* set up fixed pointers */ ++ /* Set up fixed pointers */ + for (i = 0; i < NCHANNELS; i++) + { + entryPtr[i].varTab = (u32)varTabsOffset; /* update ptr to local value */ +@@ -253,25 +231,25 @@ int MCD_initDma (dmaRegs *dmaBarAddr, vo + #endif + contextSavesOffset += CONTEXT_SAVE_SIZE; + } +- /* copy over the function descriptor table */ ++ /* Copy over the function descriptor table */ + for ( i = 0; i < FUNCDESC_TAB_NUM; i++) + { + MCD_memcpy((void*)(entryPtr[i].FDTandFlags & ~MCD_TT_FLAGS_MASK), + (void*)MCD_funcDescTab0, FUNCDESC_TAB_SIZE); + } + +- /* copy model task table to where the context saves stuff leaves off*/ ++ /* Copy model task table to where the context save stuff leaves off */ + MCD_modelTaskTable = (TaskTableEntry*)contextSavesOffset; + + MCD_memcpy ((void*)MCD_modelTaskTable, (void*)MCD_modelTaskTableSrc, + NUMOFVARIANTS * sizeof(TaskTableEntry)); + +- entryPtr = MCD_modelTaskTable; /* point to local version of +- model task table */ ++ /* Point to local version of model task table */ ++ entryPtr = MCD_modelTaskTable; + taskDescTabsOffset = (u32)MCD_modelTaskTable + + (NUMOFVARIANTS * sizeof(TaskTableEntry)); + +- /* copy actual task code and update TDT ptrs in local model task table */ ++ /* Copy actual task code and update TDT ptrs in local model task table */ + for (i = 0; i < NUMOFVARIANTS; i++) + { + taskDescTabSize = entryPtr[i].TDTend - entryPtr[i].TDTstart + 4; +@@ -280,25 +258,29 @@ int MCD_initDma (dmaRegs *dmaBarAddr, vo + taskDescTabsOffset += taskDescTabSize; + entryPtr[i].TDTend = (u32)taskDescTabsOffset - 4; + } +-#ifdef MCD_INCLUDE_EU /* Tack single DMA BDs onto end of code so API controls +- where they are since DMA might write to them */ ++#ifdef MCD_INCLUDE_EU ++ /* ++ * Tack single DMA BDs onto end of code so API controls where ++ * they are since DMA might write to them ++ */ + MCD_relocBuffDesc = (MCD_bufDesc*)(entryPtr[NUMOFVARIANTS - 1].TDTend + 4); +-#else /* DMA does not touch them so they can be wherever and we don't need to +- waste SRAM on them */ ++#else ++ /* ++ * DMA does not touch them so they can be wherever and we don't need to ++ * waste SRAM on them ++ */ + MCD_relocBuffDesc = MCD_singleBufDescs; + #endif + } + else + { +- /* point the would-be relocated task tables and the +- buffer descriptors to the ones the linker generated */ +- ++ /* ++ * Point the would-be relocated task tables and the buffer descriptors ++ * to the ones the linker generated ++ */ + if (((u32)MCD_realTaskTableSrc & 0x000001ff) != 0) + return(MCD_TABLE_UNALIGNED); + +- /* need to add code to make sure that every thing else is aligned properly TBD*/ +- /* this is problematic if we init more than once or after running tasks, +- need to add variable to see if we have aleady init'd */ + entryPtr = MCD_realTaskTableSrc; + for (i = 0; i < NCHANNELS; i++) + { +@@ -312,9 +294,7 @@ int MCD_initDma (dmaRegs *dmaBarAddr, vo + MCD_relocBuffDesc = MCD_singleBufDescs; + } + +- +- /* Make all channels as totally inactive, and remember them as such: */ +- ++ /* Make all channels inactive, and remember them as such: */ + MCD_dmaBar->taskbar = (u32) MCD_taskTable; + for (i = 0; i < NCHANNELS; i++) + { +@@ -323,13 +303,12 @@ int MCD_initDma (dmaRegs *dmaBarAddr, vo + } + + /* Set up pausing mechanism to inactive state: */ +- MCD_dmaBar->debugComp1 = 0; /* no particular values yet for either comparator registers */ ++ MCD_dmaBar->debugComp1 = 0; + MCD_dmaBar->debugComp2 = 0; + MCD_dmaBar->debugControl = DBG_CTL_DISABLE; + MCD_dmaBar->debugStatus = DBG_KILL_ALL_STAT; + +- /* enable or disable commbus prefetch, really need an ifdef or +- something to keep from trying to set this in the 8220 */ ++ /* Enable or disable commbus prefetch */ + if ((flags & MCD_COMM_PREFETCH_EN) != 0) + MCD_dmaBar->ptdControl &= ~PTD_CTL_COMM_PREFETCH; + else +@@ -354,8 +333,7 @@ int MCD_dmaStatus (int channel) + + tcrValue = MCD_dmaBar->taskControl[channel]; + if ((tcrValue & TASK_CTL_EN) == 0) +- { /* nothing running */ +- /* if last reported with task enabled */ ++ { /* Nothing running if last reported with task enabled */ + if ( MCD_chStatus[channel] == MCD_RUNNING + || MCD_chStatus[channel] == MCD_IDLE) + MCD_chStatus[channel] = MCD_DONE; +@@ -367,13 +345,12 @@ int MCD_dmaStatus (int channel) + || MCD_chStatus[channel] == MCD_IDLE) + { + MCD_dmaBar->ptdDebug = PTD_DBG_TSK_VLD_INIT; +- /* This register is selected to know which initiator is +- actually asserted. */ ++ /* Determine which initiator is asserted. */ + if ((MCD_dmaBar->ptdDebug >> channel ) & 0x1 ) + MCD_chStatus[channel] = MCD_RUNNING; + else + MCD_chStatus[channel] = MCD_IDLE; +- /* do not change the status if it is already paused. */ ++ /* Do not change the status if it is already paused */ + } + } + return MCD_chStatus[channel]; +@@ -414,67 +391,86 @@ int MCD_startDma ( + + if((channel < 0) || (channel >= NCHANNELS)) + return(MCD_CHANNEL_INVALID); +- +- /* tbd - need to determine the proper response to a bad funcDesc when not +- including EU functions, for now, assign a benign funcDesc, but maybe +- should return an error */ ++ + #ifndef MCD_INCLUDE_EU + funcDesc = MCD_FUNC_NOEU1; + #endif +- ++ + #ifdef MCD_DEBUG + printf("startDma:Setting up params\n"); + #endif +- /* Set us up for task-wise priority. We don't technically need to do this on every start, but +- since the register involved is in the same longword as other registers that users are in control +- of, setting it more than once is probably preferable. That since the documentation doesn't seem +- to be completely consistent about the nature of the PTD control register. */ ++ ++ /* Enable task-wise priority */ + MCD_dmaBar->ptdControl |= (u16) 0x8000; +-#if 1 /* Not sure what we need to keep here rtm TBD */ ++ + /* Calculate additional parameters to the regular DMA calls. */ + srcRsdIncr = srcIncr < 0 ? -1 : (srcIncr > 0 ? 1 : 0); + destRsdIncr = destIncr < 0 ? -1 : (destIncr > 0 ? 1 : 0); +- + xferSizeIncr = (xferSize & 0xffff) | 0x20000000; + +- /* Remember for each channel which variant is running. */ ++ /* Remember which variant is running for each channel */ + MCD_remVariants.remSrcRsdIncr[channel] = srcRsdIncr; + MCD_remVariants.remDestRsdIncr[channel] = destRsdIncr; + MCD_remVariants.remDestIncr[channel] = destIncr; + MCD_remVariants.remSrcIncr[channel] = srcIncr; + MCD_remVariants.remXferSize[channel] = xferSize; +-#endif + +- cSave = (int*)(MCD_taskTable[channel].contextSaveSpace) + CSAVE_OFFSET + CURRBD; ++ cSave = (int*)(MCD_taskTable[channel].contextSaveSpace) ++ + CSAVE_OFFSET ++ + CURRBD; + +-#ifdef MCD_INCLUDE_EU /* may move this to EU specific calls */ ++#ifdef MCD_INCLUDE_EU + realFuncArray = (u32 *) (MCD_taskTable[channel].FDTandFlags & 0xffffff00); +- /* Modify the LURC's normal and byte-residue-loop functions according to parameter. */ +- realFuncArray[(LURC*16)] = xferSize == 4 ? +- funcDesc : xferSize == 2 ? +- funcDesc & 0xfffff00f : funcDesc & 0xffff000f; +- realFuncArray[(LURC*16+1)] = (funcDesc & MCD_BYTE_SWAP_KILLER) | MCD_NO_BYTE_SWAP_ATALL; +-#endif +- /* Write the initiator field in the TCR, and also set the initiator-hold +- bit. Note that,due to a hardware quirk, this could collide with an +- MDE access to the initiator-register file, so we have to verify that the write +- reads back correctly. */ + +- MCD_dmaBar->taskControl[channel] = +- (initiator << 8) | TASK_CTL_HIPRITSKEN | TASK_CTL_HLDINITNUM; ++ /* ++ * Modify the LURC's normal and byte-residue-loop functions ++ * according to parameter. ++ */ ++ switch (xferSize) ++ { ++ case 4: ++ realFuncArray[(LURC*16)] = funcDesc; ++ break; ++ case 2: ++ realFuncArray[(LURC*16)] = funcDesc & 0xfffff00f; ++ break; ++ case 1: ++ default: ++ realFuncArray[(LURC*16)] = funcDesc & 0xffff000f; ++ break; ++ } + ++ realFuncArray[(LURC*16+1)] = 0 ++ | (funcDesc & MCD_BYTE_SWAP_KILLER) ++ | MCD_NO_BYTE_SWAP_ATALL; ++#endif ++ ++ /* Write the initiator field in the TCR and set the initiator-hold bit*/ ++ MCD_dmaBar->taskControl[channel] = 0 ++ | (initiator << 8) ++ | TASK_CTL_HIPRITSKEN ++ | TASK_CTL_HLDINITNUM; ++ ++ /* ++ * Current versions of the MPC8220 MCD have a hardware quirk that could ++ * cause the write to the TCR to collide with an MDE access to the ++ * initiator-register file, so we have to verify that the write occurred ++ * correctly by reading back the value. On MCF547x/8x devices and any ++ * future revisions of the MPC8220, this loop will not be entered. ++ */ + while(((MCD_dmaBar->taskControl[channel] & 0x1fff) != + ((initiator << 8) | TASK_CTL_HIPRITSKEN | TASK_CTL_HLDINITNUM)) && + (tcrCount < 1000)) + { + tcrCount++; +- /*MCD_dmaBar->ptd_tcr[channel] = (initiator << 8) | 0x0020;*/ +- MCD_dmaBar->taskControl[channel] = +- (initiator << 8) | TASK_CTL_HIPRITSKEN | TASK_CTL_HLDINITNUM; ++ MCD_dmaBar->taskControl[channel] = 0 ++ | (initiator << 8) ++ | TASK_CTL_HIPRITSKEN ++ | TASK_CTL_HLDINITNUM; + } + + MCD_dmaBar->priority[channel] = (u8)priority & PRIORITY_PRI_MASK; +- /* should be albe to handle this stuff with only one write to ts reg - tbd */ ++ + if (channel < 8 && channel >= 0) + { + MCD_dmaBar->taskSize0 &= ~(0xf << (7-channel)*4); +@@ -488,7 +484,7 @@ printf("startDma:Setting up params\n"); + MCD_dmaBar->taskSize1 |= (xferSize & 3) << ((15 - channel)*4); + } + +- /* setup task table flags/options which mostly control the line buffers */ ++ /* Setup task table flags/options */ + MCD_taskTable[channel].FDTandFlags &= ~MCD_TT_FLAGS_MASK; + MCD_taskTable[channel].FDTandFlags |= (MCD_TT_FLAGS_MASK & flags); + +@@ -508,79 +504,86 @@ printf("startDma:Setting up params\n"); + } + else if(flags & MCD_SINGLE_DMA) + { +- /* this buffer descriptor is used for storing off initial parameters for later +- progress query calculation and for the DMA to write the resulting checksum +- The DMA does not use this to determine how to operate, that info is passed +- with the init routine*/ ++ /* ++ * This buffer descriptor is used for storing off initial parameters ++ * for later progress query calculation and for the DMA to write the ++ * resulting checksum. The DMA does not use this to determine how to ++ * operate, that info is passed with the init routine ++ */ + MCD_relocBuffDesc[channel].srcAddr = srcAddr; + MCD_relocBuffDesc[channel].destAddr = destAddr; +- MCD_relocBuffDesc[channel].lastDestAddr = destAddr; /* definitely not its final value */ ++ MCD_relocBuffDesc[channel].lastDestAddr = destAddr; + MCD_relocBuffDesc[channel].dmaSize = dmaSize; + MCD_relocBuffDesc[channel].flags = 0; /* not used */ + MCD_relocBuffDesc[channel].csumResult = 0; /* not used */ + MCD_relocBuffDesc[channel].next = 0; /* not used */ + + /* Initialize the progress-querying stuff to show no progress:*/ +- ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[SRCPTR + CSAVE_OFFSET] = (int)srcAddr; +- ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[DESTPTR + CSAVE_OFFSET] = (int)destAddr; +- ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[DCOUNT + CSAVE_OFFSET] = 0; +- ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[CURRBD + CSAVE_OFFSET] = +- (u32) &(MCD_relocBuffDesc[channel]); +- /* tbd - need to keep the user from trying to call the EU routine +- when MCD_INCLUDE_EU is not defined */ ++ ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[SRCPTR + CSAVE_OFFSET] ++ = (int)srcAddr; ++ ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[DESTPTR + CSAVE_OFFSET] ++ = (int)destAddr; ++ ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[DCOUNT + CSAVE_OFFSET] ++ = 0; ++ ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[CURRBD + CSAVE_OFFSET] ++ = (u32) &(MCD_relocBuffDesc[channel]); ++ + if( funcDesc == MCD_FUNC_NOEU1 || funcDesc == MCD_FUNC_NOEU2) + { +- /* TDTStart and TDTEnd */ +- MCD_taskTable[channel].TDTstart = MCD_modelTaskTable[TASK_SINGLENOEU].TDTstart; +- MCD_taskTable[channel].TDTend = MCD_modelTaskTable[TASK_SINGLENOEU].TDTend; +- MCD_startDmaSingleNoEu(srcAddr, srcIncr, destAddr, destIncr, dmaSize, dmaSize, +- xferSizeIncr, flags, (int *)&(MCD_relocBuffDesc[channel]), cSave, +- MCD_taskTable, channel); ++ /* TDTStart and TDTEnd */ ++ MCD_taskTable[channel].TDTstart = MCD_modelTaskTable[TASK_SINGLENOEU].TDTstart; ++ MCD_taskTable[channel].TDTend = MCD_modelTaskTable[TASK_SINGLENOEU].TDTend; ++ MCD_startDmaSingleNoEu(srcAddr, srcIncr, destAddr, destIncr, dmaSize, ++ xferSizeIncr, flags, (int *)&(MCD_relocBuffDesc[channel]), ++ cSave, MCD_taskTable, channel); + } + else + { +- /* TDTStart and TDTEnd */ +- MCD_taskTable[channel].TDTstart = MCD_modelTaskTable[TASK_SINGLEEU].TDTstart; +- MCD_taskTable[channel].TDTend = MCD_modelTaskTable[TASK_SINGLEEU].TDTend; +- MCD_startDmaSingleEu(srcAddr, srcIncr, destAddr, destIncr, dmaSize, dmaSize, +- xferSizeIncr, flags, (int *)&(MCD_relocBuffDesc[channel]), cSave, +- MCD_taskTable, channel); ++ /* TDTStart and TDTEnd */ ++ MCD_taskTable[channel].TDTstart = MCD_modelTaskTable[TASK_SINGLEEU].TDTstart; ++ MCD_taskTable[channel].TDTend = MCD_modelTaskTable[TASK_SINGLEEU].TDTend; ++ MCD_startDmaSingleEu(srcAddr, srcIncr, destAddr, destIncr, dmaSize, ++ xferSizeIncr, flags, (int *)&(MCD_relocBuffDesc[channel]), ++ cSave, MCD_taskTable, channel); + } + } +- else +- { /* chained DMAS */ ++ else /* Chained DMA */ ++ { + /* Initialize the progress-querying stuff to show no progress:*/ + #if 1 /* (!defined(MCD_NEED_ADDR_TRANS)) */ + ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[SRCPTR + CSAVE_OFFSET] +- = (int)((MCD_bufDesc*) phys_to_virt(srcAddr))->srcAddr; ++ = (int)((MCD_bufDesc*) srcAddr)->srcAddr; + ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[DESTPTR + CSAVE_OFFSET] +- = (int)((MCD_bufDesc*) phys_to_virt(srcAddr))->destAddr; ++ = (int)((MCD_bufDesc*) srcAddr)->destAddr; + #else /* if using address translation, need the virtual addr of the first buffdesc */ + ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[SRCPTR + CSAVE_OFFSET] + = (int)((MCD_bufDesc*) srcAddrVirt)->srcAddr; + ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[DESTPTR + CSAVE_OFFSET] + = (int)((MCD_bufDesc*) srcAddrVirt)->destAddr; + #endif +- ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[DCOUNT + CSAVE_OFFSET] = 0; +- ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[CURRBD + CSAVE_OFFSET] = (u32) srcAddr; ++ ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[DCOUNT + CSAVE_OFFSET] ++ = 0; ++ ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[CURRBD + CSAVE_OFFSET] ++ = (u32) srcAddr; + + if( funcDesc == MCD_FUNC_NOEU1 || funcDesc == MCD_FUNC_NOEU2) + { +- /*TDTStart and TDTEnd*/ +- MCD_taskTable[channel].TDTstart = MCD_modelTaskTable[TASK_CHAINNOEU].TDTstart; +- MCD_taskTable[channel].TDTend = MCD_modelTaskTable[TASK_CHAINNOEU].TDTend; +- MCD_startDmaChainNoEu((int *)srcAddr, srcIncr, destIncr, xferSize, ++ /* TDTStart and TDTEnd */ ++ MCD_taskTable[channel].TDTstart = MCD_modelTaskTable[TASK_CHAINNOEU].TDTstart; ++ MCD_taskTable[channel].TDTend = MCD_modelTaskTable[TASK_CHAINNOEU].TDTend; ++ MCD_startDmaChainNoEu((int *)srcAddr, srcIncr, destIncr, xferSize, + xferSizeIncr, cSave, MCD_taskTable, channel); + } + else + { +- /*TDTStart and TDTEnd*/ +- MCD_taskTable[channel].TDTstart = MCD_modelTaskTable[TASK_CHAINEU].TDTstart; +- MCD_taskTable[channel].TDTend = MCD_modelTaskTable[TASK_CHAINEU].TDTend; +- MCD_startDmaChainEu((int *)srcAddr, srcIncr, destIncr, xferSize, ++ /* TDTStart and TDTEnd */ ++ MCD_taskTable[channel].TDTstart = MCD_modelTaskTable[TASK_CHAINEU].TDTstart; ++ MCD_taskTable[channel].TDTend = MCD_modelTaskTable[TASK_CHAINEU].TDTend; ++ MCD_startDmaChainEu((int *)srcAddr, srcIncr, destIncr, xferSize, + xferSizeIncr, cSave, MCD_taskTable, channel); + } + } ++ + MCD_chStatus[channel] = MCD_IDLE; + return(MCD_OK); + } +@@ -597,7 +600,7 @@ printf("startDma:Setting up params\n"); + * Notes: + * MCD_XferProgrQuery() upon completing or after aborting a DMA, or + * while the DMA is in progress, this function returns the first +- * DMA-destination address not (or not yet) used in the DMA. When ++ * DMA-destination address not (or not yet) used in the DMA. When + * encountering a non-ready buffer descriptor, the information for + * the last completed descriptor is returned. + * +@@ -642,11 +645,13 @@ int MCD_XferProgrQuery (int channel, MCD + prevRep.dmaSize = ((volatile int*) MCD_taskTable[channel].contextSaveSpace)[DCOUNT + CSAVE_OFFSET]; + prevRep.currBufDesc = + (MCD_bufDesc*) ((volatile int*) MCD_taskTable[channel].contextSaveSpace)[CURRBD + CSAVE_OFFSET]; ++ + /* Repeatedly reread those values until they match previous values: */ + do { +- /* Waste a little bit of time to ensure stability: */ ++ /* Take a little bit of time to ensure stability: */ + for (i = 0; i < STABTIME; i++) +- i += i >> 2; /* make sure this loop does something so that it doesn't get optimized out */ ++ i += i >> 2; /* make sure this loop does something so that it ++ doesn't get optimized out */ + /* Check them again: */ + progRep->lastSrcAddr = + (s8 *) ((volatile int*) MCD_taskTable[channel].contextSaveSpace)[SRCPTR + CSAVE_OFFSET]; +@@ -655,31 +660,33 @@ int MCD_XferProgrQuery (int channel, MCD + progRep->dmaSize = ((volatile int*) MCD_taskTable[channel].contextSaveSpace)[DCOUNT + CSAVE_OFFSET]; + progRep->currBufDesc = + (MCD_bufDesc*) ((volatile int*) MCD_taskTable[channel].contextSaveSpace)[CURRBD + CSAVE_OFFSET]; +- /* See if they match: */ +- if ( prevRep.lastSrcAddr != progRep->lastSrcAddr +- || prevRep.lastDestAddr != progRep->lastDestAddr +- || prevRep.dmaSize != progRep->dmaSize +- || prevRep.currBufDesc != progRep->currBufDesc) +- { +- /* If they don't match, remember previous values and try again:*/ +- prevRep.lastSrcAddr = progRep->lastSrcAddr; +- prevRep.lastDestAddr = progRep->lastDestAddr; +- prevRep.dmaSize = progRep->dmaSize; +- prevRep.currBufDesc = progRep->currBufDesc; +- again = MCD_TRUE; +- } +- else ++ ++ /* See if they match: */ ++ if ( prevRep.lastSrcAddr != progRep->lastSrcAddr ++ || prevRep.lastDestAddr != progRep->lastDestAddr ++ || prevRep.dmaSize != progRep->dmaSize ++ || prevRep.currBufDesc != progRep->currBufDesc) ++ { ++ /* If they don't match, remember previous values and try again:*/ ++ prevRep.lastSrcAddr = progRep->lastSrcAddr; ++ prevRep.lastDestAddr = progRep->lastDestAddr; ++ prevRep.dmaSize = progRep->dmaSize; ++ prevRep.currBufDesc = progRep->currBufDesc; ++ again = MCD_TRUE; ++ } ++ else + again = MCD_FALSE; + } while (again == MCD_TRUE); + + +- /* Update the dCount, srcAddr and destAddr */ +- /* To calculate dmaCount, we consider destination address. C +- overs M1,P1,Z for destination */ +- switch(MCD_remVariants.remDestRsdIncr[channel]) { ++ /* Update dmaSize and lastDestAddr */ ++ switch(MCD_remVariants.remDestRsdIncr[channel]) ++ { + case MINUS1: +- subModVal = ((int)progRep->lastDestAddr) & ((MCD_remVariants.remXferSize[channel]) - 1); +- addModVal = ((int)progRep->currBufDesc->destAddr) & ((MCD_remVariants.remXferSize[channel]) - 1); ++ subModVal = ((int)progRep->lastDestAddr) ++ & ((MCD_remVariants.remXferSize[channel]) - 1); ++ addModVal = ((int)progRep->currBufDesc->destAddr) ++ & ((MCD_remVariants.remXferSize[channel]) - 1); + LWAlignedInitDestAddr = (progRep->currBufDesc->destAddr) - addModVal; + LWAlignedCurrDestAddr = (progRep->lastDestAddr) - subModVal; + destDiffBytes = LWAlignedInitDestAddr - LWAlignedCurrDestAddr; +@@ -692,25 +699,28 @@ int MCD_XferProgrQuery (int channel, MCD + progRep->lastDestAddr = progRep->currBufDesc->destAddr; + break; + case PLUS1: +- /* This value has to be subtracted from the final calculated dCount. */ +- subModVal = ((int)progRep->currBufDesc->destAddr) & ((MCD_remVariants.remXferSize[channel]) - 1); ++ /* This value has to be subtracted from the final calculated dmaSize. */ ++ subModVal = ((int)progRep->currBufDesc->destAddr) ++ & ((MCD_remVariants.remXferSize[channel]) - 1); + /* These bytes are already in lastDestAddr. */ +- addModVal = ((int)progRep->lastDestAddr) & ((MCD_remVariants.remXferSize[channel]) - 1); ++ addModVal = ((int)progRep->lastDestAddr) ++ & ((MCD_remVariants.remXferSize[channel]) - 1); + LWAlignedInitDestAddr = (progRep->currBufDesc->destAddr) - subModVal; + LWAlignedCurrDestAddr = (progRep->lastDestAddr) - addModVal; + destDiffBytes = (progRep->lastDestAddr - LWAlignedInitDestAddr); + numIterations = ( LWAlignedCurrDestAddr - LWAlignedInitDestAddr)/MCD_remVariants.remDestIncr[channel]; + bytesNotXfered = numIterations * +- ( MCD_remVariants.remDestIncr[channel] +- - MCD_remVariants.remXferSize[channel]); +- progRep->dmaSize = destDiffBytes - bytesNotXfered - subModVal; +- break; ++ (MCD_remVariants.remDestIncr[channel] ++ - MCD_remVariants.remXferSize[channel]); ++ progRep->dmaSize = destDiffBytes - bytesNotXfered - subModVal; ++ break; + default: +- break; ++ break; + } + + /* This covers M1,P1,Z for source */ +- switch(MCD_remVariants.remSrcRsdIncr[channel]) { ++ switch(MCD_remVariants.remSrcRsdIncr[channel]) ++ { + case MINUS1: + progRep->lastSrcAddr = + progRep->currBufDesc->srcAddr + +@@ -720,13 +730,14 @@ int MCD_XferProgrQuery (int channel, MCD + case ZERO: + progRep->lastSrcAddr = progRep->currBufDesc->srcAddr; + break; +- case PLUS1: ++ case PLUS1: + progRep->lastSrcAddr = + progRep->currBufDesc->srcAddr + + ( MCD_remVariants.remSrcIncr[channel] * + (progRep->dmaSize/MCD_remVariants.remXferSize[channel])); +- break; +- default: break; ++ break; ++ default: ++ break; + } + + return(MCD_OK); +@@ -744,8 +755,10 @@ static void MCD_resmActions (int channel + { + MCD_dmaBar->debugControl = DBG_CTL_DISABLE; + MCD_dmaBar->debugStatus = MCD_dmaBar->debugStatus; +- MCD_dmaBar->ptdDebug = PTD_DBG_TSK_VLD_INIT; /* This register is selected to know +- which initiator is actually asserted. */ ++ ++ /* Determine which initiators are asserted */ ++ MCD_dmaBar->ptdDebug = PTD_DBG_TSK_VLD_INIT; ++ + if((MCD_dmaBar->ptdDebug >> channel ) & 0x1) + MCD_chStatus[channel] = MCD_RUNNING; + else +@@ -767,27 +780,20 @@ static void MCD_resmActions (int channel + */ + int MCD_killDma (int channel) + { +- /* MCD_XferProg progRep; */ +- + if((channel < 0) || (channel >= NCHANNELS)) + return(MCD_CHANNEL_INVALID); + + MCD_dmaBar->taskControl[channel] = 0x0; +- MCD_resumeDma (channel); +- /* +- * This must be after the write to the TCR so that the task doesn't +- * start up again momentarily, and before the status assignment so +- * as to override whatever MCD_resumeDma() may do to the channel +- * status. +- */ ++ ++ /* Clean up after a paused task */ ++ if (MCD_chStatus[channel] == MCD_PAUSED) ++ { ++ MCD_dmaBar->debugControl = DBG_CTL_DISABLE; ++ MCD_dmaBar->debugStatus = MCD_dmaBar->debugStatus; ++ } ++ + MCD_chStatus[channel] = MCD_HALTED; + +- /* +- * Update the current buffer descriptor's lastDestAddr field +- * +- * MCD_XferProgrQuery (channel, &progRep); +- * progRep.currBufDesc->lastDestAddr = progRep.lastDestAddr; +- */ + return(MCD_OK); + } + /************************ End of MCD_killDma() **********************/ +@@ -843,7 +849,7 @@ int MCD_continDma (int channel) + * this means that bits 14 and 0 must enable debug functions before + * bits 1 and 2, respectively, have any effect. + * +- * NOTE: It's extremely important to not pause more than one DMA channel ++ * NOTE: It's extremely important to not pause more than one DMA channel + * at a time. + ********************************************************************/ + +@@ -856,8 +862,6 @@ int MCD_continDma (int channel) + */ + int MCD_pauseDma (int channel) + { +- /* MCD_XferProg progRep; */ +- + if((channel < 0) || (channel >= NCHANNELS)) + return(MCD_CHANNEL_INVALID); + +@@ -866,13 +870,6 @@ int MCD_pauseDma (int channel) + MCD_dmaBar->debugComp1 = channel; + MCD_dmaBar->debugControl = DBG_CTL_ENABLE | (1 << (channel + 16)); + MCD_chStatus[channel] = MCD_PAUSED; +- +- /* +- * Update the current buffer descriptor's lastDestAddr field +- * +- * MCD_XferProgrQuery (channel, &progRep); +- * progRep.currBufDesc->lastDestAddr = progRep.lastDestAddr; +- */ + } + return(MCD_OK); + } +@@ -929,9 +926,9 @@ int MCD_csumQuery (int channel, u32 *csu + int MCD_getCodeSize(void) + { + #ifdef MCD_INCLUDE_EU +- return(0x2b5c); ++ return(0x2b64); + #else +- return(0x173c); ++ return(0x1744); + #endif + } + /********************** End of MCD_getCodeSize() ********************/ +@@ -943,9 +940,9 @@ int MCD_getCodeSize(void) + * which points to the version string + * Returns: Version number and version string (by reference) + */ +-char MCD_versionString[] = "Multi-channel DMA API Alpha v0.3 (2004-04-26)"; +-#define MCD_REV_MAJOR 0x00 +-#define MCD_REV_MINOR 0x03 ++char MCD_versionString[] = "Multi-channel DMA API v1.0"; ++#define MCD_REV_MAJOR 0x01 ++#define MCD_REV_MINOR 0x00 + + int MCD_getVersion(char **longVersion) + { +--- a/drivers/dma/MCD_progCheck.h ++++ b/drivers/dma/MCD_progCheck.h +@@ -1,32 +1,27 @@ +-/********************************************************************* ++/* ++ * drivers/dma/MCD_progCheck.h + * +- * Copyright (C) 2004 Motorola, Inc. +- * MOTOROLA, INC. All Rights Reserved. +- * You are hereby granted a copyright license to use +- * the SOFTWARE so long as this entire notice is +- * retained without alteration in any modified and/or redistributed +- * versions, and that such modified versions are clearly identified +- * as such. No licenses are granted by implication, estoppel or +- * otherwise under any patents or trademarks of Motorola, Inc. This +- * software is provided on an "AS IS" basis and without warranty. ++ * Copyright (C) 2004-2008 Freescale Semiconductor, Inc. ++ * Kurt Mahan <kmahan@freescale.com> + * +- * To the maximum extent permitted by applicable law, MOTOROLA +- * DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED, INCLUDING +- * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR +- * PURPOSE AND ANY WARRANTY AGAINST INFRINGEMENT WITH REGARD TO THE +- * SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF) AND ANY +- * ACCOMPANYING WRITTEN MATERIALS. ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of ++ * the License, or (at your option) any later version. + * +- * To the maximum extent permitted by applicable law, IN NO EVENT +- * SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER (INCLUDING +- * WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS +- * INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY +- * LOSS) ARISING OF THE USE OR INABILITY TO USE THE SOFTWARE. ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. + * +- * Motorola assumes no responsibility for the maintenance and support +- * of this software +- ********************************************************************/ +- /* This file is autogenerated. Do not change */ ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++ * MA 02111-1307 USA ++ */ ++ ++/* This file is autogenerated. Do not change */ ++ + #define CURRBD 4 + #define DCOUNT 6 + #define DESTPTR 5 +--- a/drivers/dma/MCD_tasks.c ++++ b/drivers/dma/MCD_tasks.c +@@ -1,44 +1,26 @@ +-/********************************************************************* +- * +- * Copyright (C) 2004 Motorola, Inc. +- * MOTOROLA, INC. All Rights Reserved. +- * You are hereby granted a copyright license to use +- * the SOFTWARE so long as this entire notice is +- * retained without alteration in any modified and/or redistributed +- * versions, and that such modified versions are clearly identified +- * as such. No licenses are granted by implication, estoppel or +- * otherwise under any patents or trademarks of Motorola, Inc. This +- * software is provided on an "AS IS" basis and without warranty. +- * +- * To the maximum extent permitted by applicable law, MOTOROLA +- * DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED, INCLUDING +- * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR +- * PURPOSE AND ANY WARRANTY AGAINST INFRINGEMENT WITH REGARD TO THE +- * SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF) AND ANY +- * ACCOMPANYING WRITTEN MATERIALS. +- * +- * To the maximum extent permitted by applicable law, IN NO EVENT +- * SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER (INCLUDING +- * WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS +- * INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY +- * LOSS) ARISING OF THE USE OR INABILITY TO USE THE SOFTWARE. +- * +- * Motorola assumes no responsibility for the maintenance and support +- * of this software +- ********************************************************************/ + /* +- * File: MCD_tasks.c +- * Purpose: Contains task code and structures for Multi-channel DMA +- * +- * Notes: ++ * drivers/dma/MCD_tasks.c + * ++ * Copyright (C) 2004-2008 Freescale Semiconductor, Inc. ++ * Kurt Mahan <kmahan@freescale.com> + * +- * Modifications: ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of ++ * the License, or (at your option) any later version. + * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. + * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++ * MA 02111-1307 USA + */ + +-#include <asm/MCD_dma.h> ++#include "MCD_dma.h" + + u32 MCD_varTab0[]; + u32 MCD_varTab1[]; +@@ -922,13 +904,13 @@ u32 MCD_funcDescTab0[]= + 0x20400000, /* add(), EU# 3 */ + 0x20500000, /* sub(), EU# 3 */ + 0x205a0000, /* andNot(), EU# 3 */ ++ 0x20a00000, /* shiftR(), EU# 3 */ + 0x202fa000, /* andReadyBit(), EU# 3 */ + 0x202f9000, /* andNotReadyBit(), EU# 3 */ + 0x202ea000, /* andWrapBit(), EU# 3 */ +- 0x202da000, /* andEndFrameBit(), EU# 3 */ ++ 0x202da000, /* andLastBit(), EU# 3 */ + 0x202e2000, /* andInterruptBit(), EU# 3 */ +- 0x202f2000, /* andLoopBit(), EU# 3 */ +- 0x2020a000, /* andCrcRestartBit(), EU# 3 */ ++ 0x202f2000, /* andCrcRestartBit(), EU# 3 */ + }; + + #ifdef MCD_INCLUDE_EU +@@ -991,13 +973,13 @@ u32 MCD_funcDescTab1[]= + 0x20400000, /* add(), EU# 3 */ + 0x20500000, /* sub(), EU# 3 */ + 0x205a0000, /* andNot(), EU# 3 */ ++ 0x20a00000, /* shiftR(), EU# 3 */ + 0x202fa000, /* andReadyBit(), EU# 3 */ + 0x202f9000, /* andNotReadyBit(), EU# 3 */ + 0x202ea000, /* andWrapBit(), EU# 3 */ +- 0x202da000, /* andEndFrameBit(), EU# 3 */ ++ 0x202da000, /* andLastBit(), EU# 3 */ + 0x202e2000, /* andInterruptBit(), EU# 3 */ +- 0x202f2000, /* andLoopBit(), EU# 3 */ +- 0x2020a000, /* andCrcRestartBit(), EU# 3 */ ++ 0x202f2000, /* andCrcRestartBit(), EU# 3 */ + }; + + u32 MCD_funcDescTab2[]= +@@ -1059,13 +1041,13 @@ u32 MCD_funcDescTab2[]= + 0x20400000, /* add(), EU# 3 */ + 0x20500000, /* sub(), EU# 3 */ + 0x205a0000, /* andNot(), EU# 3 */ ++ 0x20a00000, /* shiftR(), EU# 3 */ + 0x202fa000, /* andReadyBit(), EU# 3 */ + 0x202f9000, /* andNotReadyBit(), EU# 3 */ + 0x202ea000, /* andWrapBit(), EU# 3 */ +- 0x202da000, /* andEndFrameBit(), EU# 3 */ ++ 0x202da000, /* andLastBit(), EU# 3 */ + 0x202e2000, /* andInterruptBit(), EU# 3 */ +- 0x202f2000, /* andLoopBit(), EU# 3 */ +- 0x2020a000, /* andCrcRestartBit(), EU# 3 */ ++ 0x202f2000, /* andCrcRestartBit(), EU# 3 */ + }; + + u32 MCD_funcDescTab3[]= +@@ -1127,13 +1109,13 @@ u32 MCD_funcDescTab3[]= + 0x20400000, /* add(), EU# 3 */ + 0x20500000, /* sub(), EU# 3 */ + 0x205a0000, /* andNot(), EU# 3 */ ++ 0x20a00000, /* shiftR(), EU# 3 */ + 0x202fa000, /* andReadyBit(), EU# 3 */ + 0x202f9000, /* andNotReadyBit(), EU# 3 */ + 0x202ea000, /* andWrapBit(), EU# 3 */ +- 0x202da000, /* andEndFrameBit(), EU# 3 */ ++ 0x202da000, /* andLastBit(), EU# 3 */ + 0x202e2000, /* andInterruptBit(), EU# 3 */ +- 0x202f2000, /* andLoopBit(), EU# 3 */ +- 0x2020a000, /* andCrcRestartBit(), EU# 3 */ ++ 0x202f2000, /* andCrcRestartBit(), EU# 3 */ + }; + + u32 MCD_funcDescTab4[]= +@@ -1195,13 +1177,13 @@ u32 MCD_funcDescTab4[]= + 0x20400000, /* add(), EU# 3 */ + 0x20500000, /* sub(), EU# 3 */ + 0x205a0000, /* andNot(), EU# 3 */ ++ 0x20a00000, /* shiftR(), EU# 3 */ + 0x202fa000, /* andReadyBit(), EU# 3 */ + 0x202f9000, /* andNotReadyBit(), EU# 3 */ + 0x202ea000, /* andWrapBit(), EU# 3 */ +- 0x202da000, /* andEndFrameBit(), EU# 3 */ ++ 0x202da000, /* andLastBit(), EU# 3 */ + 0x202e2000, /* andInterruptBit(), EU# 3 */ +- 0x202f2000, /* andLoopBit(), EU# 3 */ +- 0x2020a000, /* andCrcRestartBit(), EU# 3 */ ++ 0x202f2000, /* andCrcRestartBit(), EU# 3 */ + }; + + u32 MCD_funcDescTab5[]= +@@ -1263,13 +1245,13 @@ u32 MCD_funcDescTab5[]= + 0x20400000, /* add(), EU# 3 */ + 0x20500000, /* sub(), EU# 3 */ + 0x205a0000, /* andNot(), EU# 3 */ ++ 0x20a00000, /* shiftR(), EU# 3 */ + 0x202fa000, /* andReadyBit(), EU# 3 */ + 0x202f9000, /* andNotReadyBit(), EU# 3 */ + 0x202ea000, /* andWrapBit(), EU# 3 */ +- 0x202da000, /* andEndFrameBit(), EU# 3 */ ++ 0x202da000, /* andLastBit(), EU# 3 */ + 0x202e2000, /* andInterruptBit(), EU# 3 */ +- 0x202f2000, /* andLoopBit(), EU# 3 */ +- 0x2020a000, /* andCrcRestartBit(), EU# 3 */ ++ 0x202f2000, /* andCrcRestartBit(), EU# 3 */ + }; + + u32 MCD_funcDescTab6[]= +@@ -1331,13 +1313,13 @@ u32 MCD_funcDescTab6[]= + 0x20400000, /* add(), EU# 3 */ + 0x20500000, /* sub(), EU# 3 */ + 0x205a0000, /* andNot(), EU# 3 */ ++ 0x20a00000, /* shiftR(), EU# 3 */ + 0x202fa000, /* andReadyBit(), EU# 3 */ + 0x202f9000, /* andNotReadyBit(), EU# 3 */ + 0x202ea000, /* andWrapBit(), EU# 3 */ +- 0x202da000, /* andEndFrameBit(), EU# 3 */ ++ 0x202da000, /* andLastBit(), EU# 3 */ + 0x202e2000, /* andInterruptBit(), EU# 3 */ +- 0x202f2000, /* andLoopBit(), EU# 3 */ +- 0x2020a000, /* andCrcRestartBit(), EU# 3 */ ++ 0x202f2000, /* andCrcRestartBit(), EU# 3 */ + }; + + u32 MCD_funcDescTab7[]= +@@ -1399,13 +1381,13 @@ u32 MCD_funcDescTab7[]= + 0x20400000, /* add(), EU# 3 */ + 0x20500000, /* sub(), EU# 3 */ + 0x205a0000, /* andNot(), EU# 3 */ ++ 0x20a00000, /* shiftR(), EU# 3 */ + 0x202fa000, /* andReadyBit(), EU# 3 */ + 0x202f9000, /* andNotReadyBit(), EU# 3 */ + 0x202ea000, /* andWrapBit(), EU# 3 */ +- 0x202da000, /* andEndFrameBit(), EU# 3 */ ++ 0x202da000, /* andLastBit(), EU# 3 */ + 0x202e2000, /* andInterruptBit(), EU# 3 */ +- 0x202f2000, /* andLoopBit(), EU# 3 */ +- 0x2020a000, /* andCrcRestartBit(), EU# 3 */ ++ 0x202f2000, /* andCrcRestartBit(), EU# 3 */ + }; + + u32 MCD_funcDescTab8[]= +@@ -1467,13 +1449,13 @@ u32 MCD_funcDescTab8[]= + 0x20400000, /* add(), EU# 3 */ + 0x20500000, /* sub(), EU# 3 */ + 0x205a0000, /* andNot(), EU# 3 */ ++ 0x20a00000, /* shiftR(), EU# 3 */ + 0x202fa000, /* andReadyBit(), EU# 3 */ + 0x202f9000, /* andNotReadyBit(), EU# 3 */ + 0x202ea000, /* andWrapBit(), EU# 3 */ +- 0x202da000, /* andEndFrameBit(), EU# 3 */ ++ 0x202da000, /* andLastBit(), EU# 3 */ + 0x202e2000, /* andInterruptBit(), EU# 3 */ +- 0x202f2000, /* andLoopBit(), EU# 3 */ +- 0x2020a000, /* andCrcRestartBit(), EU# 3 */ ++ 0x202f2000, /* andCrcRestartBit(), EU# 3 */ + }; + + u32 MCD_funcDescTab9[]= +@@ -1535,13 +1517,13 @@ u32 MCD_funcDescTab9[]= + 0x20400000, /* add(), EU# 3 */ + 0x20500000, /* sub(), EU# 3 */ + 0x205a0000, /* andNot(), EU# 3 */ ++ 0x20a00000, /* shiftR(), EU# 3 */ + 0x202fa000, /* andReadyBit(), EU# 3 */ + 0x202f9000, /* andNotReadyBit(), EU# 3 */ + 0x202ea000, /* andWrapBit(), EU# 3 */ +- 0x202da000, /* andEndFrameBit(), EU# 3 */ ++ 0x202da000, /* andLastBit(), EU# 3 */ + 0x202e2000, /* andInterruptBit(), EU# 3 */ +- 0x202f2000, /* andLoopBit(), EU# 3 */ +- 0x2020a000, /* andCrcRestartBit(), EU# 3 */ ++ 0x202f2000, /* andCrcRestartBit(), EU# 3 */ + }; + + u32 MCD_funcDescTab10[]= +@@ -1603,13 +1585,13 @@ u32 MCD_funcDescTab10[]= + 0x20400000, /* add(), EU# 3 */ + 0x20500000, /* sub(), EU# 3 */ + 0x205a0000, /* andNot(), EU# 3 */ ++ 0x20a00000, /* shiftR(), EU# 3 */ + 0x202fa000, /* andReadyBit(), EU# 3 */ + 0x202f9000, /* andNotReadyBit(), EU# 3 */ + 0x202ea000, /* andWrapBit(), EU# 3 */ +- 0x202da000, /* andEndFrameBit(), EU# 3 */ ++ 0x202da000, /* andLastBit(), EU# 3 */ + 0x202e2000, /* andInterruptBit(), EU# 3 */ +- 0x202f2000, /* andLoopBit(), EU# 3 */ +- 0x2020a000, /* andCrcRestartBit(), EU# 3 */ ++ 0x202f2000, /* andCrcRestartBit(), EU# 3 */ + }; + + u32 MCD_funcDescTab11[]= +@@ -1671,13 +1653,13 @@ u32 MCD_funcDescTab11[]= + 0x20400000, /* add(), EU# 3 */ + 0x20500000, /* sub(), EU# 3 */ + 0x205a0000, /* andNot(), EU# 3 */ ++ 0x20a00000, /* shiftR(), EU# 3 */ + 0x202fa000, /* andReadyBit(), EU# 3 */ + 0x202f9000, /* andNotReadyBit(), EU# 3 */ + 0x202ea000, /* andWrapBit(), EU# 3 */ +- 0x202da000, /* andEndFrameBit(), EU# 3 */ ++ 0x202da000, /* andLastBit(), EU# 3 */ + 0x202e2000, /* andInterruptBit(), EU# 3 */ +- 0x202f2000, /* andLoopBit(), EU# 3 */ +- 0x2020a000, /* andCrcRestartBit(), EU# 3 */ ++ 0x202f2000, /* andCrcRestartBit(), EU# 3 */ + }; + + u32 MCD_funcDescTab12[]= +@@ -1739,13 +1721,13 @@ u32 MCD_funcDescTab12[]= + 0x20400000, /* add(), EU# 3 */ + 0x20500000, /* sub(), EU# 3 */ + 0x205a0000, /* andNot(), EU# 3 */ ++ 0x20a00000, /* shiftR(), EU# 3 */ + 0x202fa000, /* andReadyBit(), EU# 3 */ + 0x202f9000, /* andNotReadyBit(), EU# 3 */ + 0x202ea000, /* andWrapBit(), EU# 3 */ +- 0x202da000, /* andEndFrameBit(), EU# 3 */ ++ 0x202da000, /* andLastBit(), EU# 3 */ + 0x202e2000, /* andInterruptBit(), EU# 3 */ +- 0x202f2000, /* andLoopBit(), EU# 3 */ +- 0x2020a000, /* andCrcRestartBit(), EU# 3 */ ++ 0x202f2000, /* andCrcRestartBit(), EU# 3 */ + }; + + u32 MCD_funcDescTab13[]= +@@ -1807,13 +1789,13 @@ u32 MCD_funcDescTab13[]= + 0x20400000, /* add(), EU# 3 */ + 0x20500000, /* sub(), EU# 3 */ + 0x205a0000, /* andNot(), EU# 3 */ ++ 0x20a00000, /* shiftR(), EU# 3 */ + 0x202fa000, /* andReadyBit(), EU# 3 */ + 0x202f9000, /* andNotReadyBit(), EU# 3 */ + 0x202ea000, /* andWrapBit(), EU# 3 */ +- 0x202da000, /* andEndFrameBit(), EU# 3 */ ++ 0x202da000, /* andLastBit(), EU# 3 */ + 0x202e2000, /* andInterruptBit(), EU# 3 */ +- 0x202f2000, /* andLoopBit(), EU# 3 */ +- 0x2020a000, /* andCrcRestartBit(), EU# 3 */ ++ 0x202f2000, /* andCrcRestartBit(), EU# 3 */ + }; + + u32 MCD_funcDescTab14[]= +@@ -1875,13 +1857,13 @@ u32 MCD_funcDescTab14[]= + 0x20400000, /* add(), EU# 3 */ + 0x20500000, /* sub(), EU# 3 */ + 0x205a0000, /* andNot(), EU# 3 */ ++ 0x20a00000, /* shiftR(), EU# 3 */ + 0x202fa000, /* andReadyBit(), EU# 3 */ + 0x202f9000, /* andNotReadyBit(), EU# 3 */ + 0x202ea000, /* andWrapBit(), EU# 3 */ +- 0x202da000, /* andEndFrameBit(), EU# 3 */ ++ 0x202da000, /* andLastBit(), EU# 3 */ + 0x202e2000, /* andInterruptBit(), EU# 3 */ +- 0x202f2000, /* andLoopBit(), EU# 3 */ +- 0x2020a000, /* andCrcRestartBit(), EU# 3 */ ++ 0x202f2000, /* andCrcRestartBit(), EU# 3 */ + }; + + u32 MCD_funcDescTab15[]= +@@ -1943,13 +1925,13 @@ u32 MCD_funcDescTab15[]= + 0x20400000, /* add(), EU# 3 */ + 0x20500000, /* sub(), EU# 3 */ + 0x205a0000, /* andNot(), EU# 3 */ ++ 0x20a00000, /* shiftR(), EU# 3 */ + 0x202fa000, /* andReadyBit(), EU# 3 */ + 0x202f9000, /* andNotReadyBit(), EU# 3 */ + 0x202ea000, /* andWrapBit(), EU# 3 */ +- 0x202da000, /* andEndFrameBit(), EU# 3 */ ++ 0x202da000, /* andLastBit(), EU# 3 */ + 0x202e2000, /* andInterruptBit(), EU# 3 */ +- 0x202f2000, /* andLoopBit(), EU# 3 */ +- 0x2020a000, /* andCrcRestartBit(), EU# 3 */ ++ 0x202f2000, /* andCrcRestartBit(), EU# 3 */ + }; + #endif /*MCD_INCLUDE_EU*/ + +@@ -1970,7 +1952,6 @@ u32 MCD_contextSave13[128]; /* Task 13 c + u32 MCD_contextSave14[128]; /* Task 14 context save space */ + u32 MCD_contextSave15[128]; /* Task 15 context save space */ + +-/* Task Descriptor Tables - the guts */ + u32 MCD_ChainNoEu_TDT[]; + u32 MCD_SingleNoEu_TDT[]; + #ifdef MCD_INCLUDE_EU +@@ -1983,7 +1964,7 @@ u32 MCD_ENetXmit_TDT[]; + u32 MCD_modelTaskTableSrc[]= + { + (u32)MCD_ChainNoEu_TDT, +- (u32)&((u8*)MCD_ChainNoEu_TDT)[0x00000178], ++ (u32)&((u8*)MCD_ChainNoEu_TDT)[0x0000016c], + 0x00000000, + 0x00000000, + 0x00000000, +@@ -2000,7 +1981,7 @@ u32 MCD_modelTaskTableSrc[]= + 0x00000000, + #ifdef MCD_INCLUDE_EU + (u32)MCD_ChainEu_TDT, +- (u32)&((u8*)MCD_ChainEu_TDT)[0x00000180], ++ (u32)&((u8*)MCD_ChainEu_TDT)[0x000001b4], + 0x00000000, + 0x00000000, + 0x00000000, +@@ -2008,7 +1989,7 @@ u32 MCD_modelTaskTableSrc[]= + 0x00000000, + 0x00000000, + (u32)MCD_SingleEu_TDT, +- (u32)&((u8*)MCD_SingleEu_TDT)[0x000000dc], ++ (u32)&((u8*)MCD_SingleEu_TDT)[0x00000124], + 0x00000000, + 0x00000000, + 0x00000000, +@@ -2017,7 +1998,7 @@ u32 MCD_modelTaskTableSrc[]= + 0x00000000, + #endif + (u32)MCD_ENetRcv_TDT, +- (u32)&((u8*)MCD_ENetRcv_TDT)[0x0000009C], ++ (u32)&((u8*)MCD_ENetRcv_TDT)[0x000000a4], + 0x00000000, + 0x00000000, + 0x00000000, +@@ -2033,420 +2014,452 @@ u32 MCD_modelTaskTableSrc[]= + 0x00000000, + 0x00000000, + }; +- + u32 MCD_ChainNoEu_TDT[]= + { + 0x80004000, /* 0000(:370): LCDEXT: idx0 = 0x00000000; ; */ + 0x8118801b, /* 0004(:370): LCD: idx1 = var2; idx1 once var0; idx1 += inc3 */ +- 0xb8ca0018, /* 0008(:371): LCD: idx2 = *(idx1 + var20); idx2 once var0; idx2 += inc3 */ +- 0x10004b10, /* 000C(:372): DRD1A: var18 = idx2; FN=0 MORE init=0 WS=0 RS=0 */ +- 0x7000000c, /* 0010(:373): DRD2A: EU0=0 EU1=0 EU2=0 EU3=12 EXT MORE init=0 WS=0 RS=0 */ +- 0x024cf89f, /* 0014(:373): DRD2B1: var9 = EU3(); EU3(idx2) */ +- 0x60000009, /* 0018(:374): DRD2A: EU0=0 EU1=0 EU2=0 EU3=9 EXT init=0 WS=0 RS=0 */ ++ 0xb8c60018, /* 0008(:371): LCD: idx2 = *(idx1 + var12); idx2 once var0; idx2 += inc3 */ ++ 0x10002b10, /* 000C(:372): DRD1A: var10 = idx2; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x7000000d, /* 0010(:373): DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT MORE init=0 WS=0 RS=0 */ ++ 0x018cf89f, /* 0014(:373): DRD2B1: var6 = EU3(); EU3(idx2) */ ++ 0x6000000a, /* 0018(:374): DRD2A: EU0=0 EU1=0 EU2=0 EU3=10 EXT init=0 WS=0 RS=0 */ + 0x080cf89f, /* 001C(:374): DRD2B1: idx0 = EU3(); EU3(idx2) */ + 0x000001f8, /* 0020(:0): NOP */ +- 0x98180524, /* 0024(:378): LCD: idx0 = idx0; idx0 != var20; idx0 += inc4 */ ++ 0x98180364, /* 0024(:378): LCD: idx0 = idx0; idx0 == var13; idx0 += inc4 */ + 0x8118801b, /* 0028(:380): LCD: idx1 = var2; idx1 once var0; idx1 += inc3 */ +- 0xf8ca001a, /* 002C(:381): LCDEXT: idx2 = *(idx1 + var20 + 8); idx2 once var0; idx2 += inc3 */ +- 0xb8ca601b, /* 0030(:382): LCD: idx3 = *(idx1 + var20 + 12); ; idx3 += inc3 */ +- 0x10004310, /* 0034(:384): DRD1A: var16 = idx2; FN=0 MORE init=0 WS=0 RS=0 */ +- 0x00001718, /* 0038(:385): DRD1A: var5 = idx3; FN=0 init=0 WS=0 RS=0 */ +- 0xb8ca001d, /* 003C(:387): LCD: idx2 = *(idx1 + var20 + 20); idx2 once var0; idx2 += inc3 */ +- 0x10001f10, /* 0040(:388): DRD1A: var7 = idx2; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0xf8c6001a, /* 002C(:381): LCDEXT: idx2 = *(idx1 + var12 + 8); idx2 once var0; idx2 += inc3 */ ++ 0xb8c6601b, /* 0030(:382): LCD: idx3 = *(idx1 + var12 + 12); ; idx3 += inc3 */ ++ 0x10002710, /* 0034(:384): DRD1A: var9 = idx2; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x00000f18, /* 0038(:385): DRD1A: var3 = idx3; FN=0 init=0 WS=0 RS=0 */ ++ 0xb8c6001d, /* 003C(:387): LCD: idx2 = *(idx1 + var12 + 20); idx2 once var0; idx2 += inc3 */ ++ 0x10001310, /* 0040(:388): DRD1A: var4 = idx2; FN=0 MORE init=0 WS=0 RS=0 */ + 0x60000007, /* 0044(:389): DRD2A: EU0=0 EU1=0 EU2=0 EU3=7 EXT init=0 WS=0 RS=0 */ +- 0x020cf893, /* 0048(:389): DRD2B1: var8 = EU3(); EU3(idx2,var19) */ +- 0x98ca001c, /* 004C(:391): LCD: idx2 = idx1 + var20 + 4; idx2 once var0; idx2 += inc3 */ ++ 0x014cf88b, /* 0048(:389): DRD2B1: var5 = EU3(); EU3(idx2,var11) */ ++ 0x98c6001c, /* 004C(:391): LCD: idx2 = idx1 + var12 + 4; idx2 once var0; idx2 += inc3 */ + 0x00000710, /* 0050(:392): DRD1A: var1 = idx2; FN=0 init=0 WS=0 RS=0 */ +- 0x98ca8018, /* 0054(:393): LCD: idx2 = idx1 + var21; idx2 once var0; idx2 += inc3 */ +- 0x10002b10, /* 0058(:394): DRD1A: var10 = idx2; FN=0 MORE init=0 WS=0 RS=0 */ +- 0x0000c828, /* 005C(:395): DRD1A: *idx2 = var5; FN=0 init=0 WS=0 RS=0 */ ++ 0x98c70018, /* 0054(:393): LCD: idx2 = idx1 + var14; idx2 once var0; idx2 += inc3 */ ++ 0x10001f10, /* 0058(:394): DRD1A: var7 = idx2; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x0000c818, /* 005C(:395): DRD1A: *idx2 = var3; FN=0 init=0 WS=0 RS=0 */ + 0x000001f8, /* 0060(:0): NOP */ +- 0xc14ae018, /* 0064(:399): LCDEXT: idx1 = var2 + var21; ; idx1 += inc3 */ +- 0xc004a51d, /* 0068(:399): LCDEXT: idx2 = var0, idx3 = var9; idx3 == var20; idx2 += inc3, idx3 += inc5 */ ++ 0xc1476018, /* 0064(:399): LCDEXT: idx1 = var2 + var14; ; idx1 += inc3 */ ++ 0xc003231d, /* 0068(:399): LCDEXT: idx2 = var0, idx3 = var6; idx3 == var12; idx2 += inc3, idx3 += inc5 */ + 0x811a601b, /* 006C(:400): LCD: idx4 = var2; ; idx4 += inc3 */ +- 0xc28a21c2, /* 0070(:403): LCDEXT: idx5 = var5, idx6 = var20; idx6 < var7; idx5 += inc0, idx6 += inc2 */ +- 0x881be009, /* 0074(:403): LCD: idx7 = var16; ; idx7 += inc1 */ ++ 0xc1862102, /* 0070(:403): LCDEXT: idx5 = var3, idx6 = var12; idx6 < var4; idx5 += inc0, idx6 += inc2 */ ++ 0x849be009, /* 0074(:403): LCD: idx7 = var9; ; idx7 += inc1 */ + 0x03fed7b8, /* 0078(:406): DRD1A: *idx7; FN=0 init=31 WS=3 RS=3 */ + 0xda9b001b, /* 007C(:408): LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */ + 0x9b9be01b, /* 0080(:408): LCD: idx7 = idx7; ; idx7 += inc3 */ + 0x1000cb20, /* 0084(:409): DRD1A: *idx2 = idx4; FN=0 MORE init=0 WS=0 RS=0 */ + 0x70000006, /* 0088(:410): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ +- 0x088cf896, /* 008C(:410): DRD2B1: idx2 = EU3(); EU3(idx2,var22) */ ++ 0x088cf88f, /* 008C(:410): DRD2B1: idx2 = EU3(); EU3(idx2,var15) */ + 0x1000cb28, /* 0090(:411): DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */ + 0x70000006, /* 0094(:412): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ +- 0x088cf896, /* 0098(:412): DRD2B1: idx2 = EU3(); EU3(idx2,var22) */ ++ 0x088cf88f, /* 0098(:412): DRD2B1: idx2 = EU3(); EU3(idx2,var15) */ + 0x1000cb30, /* 009C(:413): DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */ + 0x70000006, /* 00A0(:414): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ +- 0x088cf896, /* 00A4(:414): DRD2B1: idx2 = EU3(); EU3(idx2,var22) */ ++ 0x088cf88f, /* 00A4(:414): DRD2B1: idx2 = EU3(); EU3(idx2,var15) */ + 0x1000cb38, /* 00A8(:415): DRD1A: *idx2 = idx7; FN=0 MORE init=0 WS=0 RS=0 */ + 0x0000c728, /* 00AC(:416): DRD1A: *idx1 = idx5; FN=0 init=0 WS=0 RS=0 */ + 0x000001f8, /* 00B0(:0): NOP */ +- 0xc14ae018, /* 00B4(:420): LCDEXT: idx1 = var2 + var21; ; idx1 += inc3 */ +- 0xc004a5dd, /* 00B8(:420): LCDEXT: idx2 = var0, idx3 = var9; idx3 == var23; idx2 += inc3, idx3 += inc5 */ ++ 0xc1476018, /* 00B4(:420): LCDEXT: idx1 = var2 + var14; ; idx1 += inc3 */ ++ 0xc003241d, /* 00B8(:420): LCDEXT: idx2 = var0, idx3 = var6; idx3 == var16; idx2 += inc3, idx3 += inc5 */ + 0x811a601b, /* 00BC(:421): LCD: idx4 = var2; ; idx4 += inc3 */ + 0xda9b001b, /* 00C0(:424): LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */ + 0x9b9be01b, /* 00C4(:424): LCD: idx7 = idx7; ; idx7 += inc3 */ + 0x0000d3a0, /* 00C8(:425): DRD1A: *idx4; FN=0 init=0 WS=0 RS=0 */ +- 0xc28a21c2, /* 00CC(:427): LCDEXT: idx5 = var5, idx6 = var20; idx6 < var7; idx5 += inc0, idx6 += inc2 */ +- 0x881be009, /* 00D0(:427): LCD: idx7 = var16; ; idx7 += inc1 */ ++ 0xc1862102, /* 00CC(:427): LCDEXT: idx5 = var3, idx6 = var12; idx6 < var4; idx5 += inc0, idx6 += inc2 */ ++ 0x849be009, /* 00D0(:427): LCD: idx7 = var9; ; idx7 += inc1 */ + 0x0bfed7b8, /* 00D4(:430): DRD1A: *idx7; FN=0 TFD init=31 WS=3 RS=3 */ + 0xda9b001b, /* 00D8(:432): LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */ + 0x9b9be01b, /* 00DC(:432): LCD: idx7 = idx7; ; idx7 += inc3 */ + 0x1000cb20, /* 00E0(:433): DRD1A: *idx2 = idx4; FN=0 MORE init=0 WS=0 RS=0 */ + 0x70000006, /* 00E4(:434): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ +- 0x088cf896, /* 00E8(:434): DRD2B1: idx2 = EU3(); EU3(idx2,var22) */ ++ 0x088cf88f, /* 00E8(:434): DRD2B1: idx2 = EU3(); EU3(idx2,var15) */ + 0x1000cb28, /* 00EC(:435): DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */ + 0x70000006, /* 00F0(:436): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ +- 0x088cf896, /* 00F4(:436): DRD2B1: idx2 = EU3(); EU3(idx2,var22) */ ++ 0x088cf88f, /* 00F4(:436): DRD2B1: idx2 = EU3(); EU3(idx2,var15) */ + 0x1000cb30, /* 00F8(:437): DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */ + 0x70000006, /* 00FC(:438): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ +- 0x088cf896, /* 0100(:438): DRD2B1: idx2 = EU3(); EU3(idx2,var22) */ ++ 0x088cf88f, /* 0100(:438): DRD2B1: idx2 = EU3(); EU3(idx2,var15) */ + 0x1000cb38, /* 0104(:439): DRD1A: *idx2 = idx7; FN=0 MORE init=0 WS=0 RS=0 */ + 0x0000c728, /* 0108(:440): DRD1A: *idx1 = idx5; FN=0 init=0 WS=0 RS=0 */ + 0x000001f8, /* 010C(:0): NOP */ + 0x8118801b, /* 0110(:444): LCD: idx1 = var2; idx1 once var0; idx1 += inc3 */ +- 0x8a19001b, /* 0114(:446): LCD: idx2 = var20; idx2 once var0; idx2 += inc3 */ +- 0x6000000e, /* 0118(:447): DRD2A: EU0=0 EU1=0 EU2=0 EU3=14 EXT init=0 WS=0 RS=0 */ +- 0x088cf49f, /* 011C(:447): DRD2B1: idx2 = EU3(); EU3(var18) */ +- 0xd9190536, /* 0120(:448): LCDEXT: idx2 = idx2; idx2 == var20; idx2 += inc6 */ +- 0x98ca0018, /* 0124(:448): LCD: idx3 = idx1 + var20; idx3 once var0; idx3 += inc3 */ +- 0x6000000a, /* 0128(:450): DRD2A: EU0=0 EU1=0 EU2=0 EU3=10 EXT init=0 WS=0 RS=0 */ +- 0x0cccfcdf, /* 012C(:450): DRD2B1: *idx3 = EU3(); EU3(*idx3) */ +- 0x000001f8, /* 0130(:0): NOP */ +- 0xa14a001e, /* 0134(:453): LCD: idx1 = *(var2 + var20 + 24); idx1 once var0; idx1 += inc3 */ +- 0x10000b08, /* 0138(:454): DRD1A: var2 = idx1; FN=0 MORE init=0 WS=0 RS=0 */ +- 0x10002c90, /* 013C(:455): DRD1A: var11 = var18; FN=0 MORE init=0 WS=0 RS=0 */ +- 0xb8ca0018, /* 0140(:456): LCD: idx2 = *(idx1 + var20); idx2 once var0; idx2 += inc3 */ +- 0x10004b10, /* 0144(:457): DRD1A: var18 = idx2; FN=0 MORE init=0 WS=0 RS=0 */ +- 0x70000009, /* 0148(:458): DRD2A: EU0=0 EU1=0 EU2=0 EU3=9 EXT MORE init=0 WS=0 RS=0 */ +- 0x080cf89f, /* 014C(:458): DRD2B1: idx0 = EU3(); EU3(idx2) */ +- 0x6000000c, /* 0150(:459): DRD2A: EU0=0 EU1=0 EU2=0 EU3=12 EXT init=0 WS=0 RS=0 */ +- 0x024cf89f, /* 0154(:459): DRD2B1: var9 = EU3(); EU3(idx2) */ +- 0x000001f8, /* 0158(:0): NOP */ +- 0x8a18801b, /* 015C(:465): LCD: idx1 = var20; idx1 once var0; idx1 += inc3 */ +- 0x7000000d, /* 0160(:466): DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT MORE init=0 WS=0 RS=0 */ +- 0x084cf2df, /* 0164(:466): DRD2B1: idx1 = EU3(); EU3(var11) */ +- 0xd899053f, /* 0168(:467): LCDEXT: idx2 = idx1; idx2 > var20; idx2 += inc7 */ +- 0x8019801b, /* 016C(:467): LCD: idx3 = var0; idx3 once var0; idx3 += inc3 */ +- 0x040001f8, /* 0170(:468): DRD1A: FN=0 INT init=0 WS=0 RS=0 */ +- 0x000001f8, /* 0174(:0): NOP */ +- 0x000001f8, /* 0178(:0): NOP */ ++ 0xd8c60018, /* 0114(:446): LCDEXT: idx2 = idx1 + var12; idx2 once var0; idx2 += inc3 */ ++ 0x98c6601c, /* 0118(:446): LCD: idx3 = idx1 + var12 + 4; ; idx3 += inc3 */ ++ 0x6000000b, /* 011C(:447): DRD2A: EU0=0 EU1=0 EU2=0 EU3=11 EXT init=0 WS=0 RS=0 */ ++ 0x0c8cfc9f, /* 0120(:447): DRD2B1: *idx2 = EU3(); EU3(*idx2) */ ++ 0x000001f8, /* 0124(:0): NOP */ ++ 0xa146001e, /* 0128(:450): LCD: idx1 = *(var2 + var12 + 24); idx1 once var0; idx1 += inc3 */ ++ 0x10000b08, /* 012C(:451): DRD1A: var2 = idx1; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x10002050, /* 0130(:452): DRD1A: var8 = var10; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0xb8c60018, /* 0134(:453): LCD: idx2 = *(idx1 + var12); idx2 once var0; idx2 += inc3 */ ++ 0x10002b10, /* 0138(:454): DRD1A: var10 = idx2; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x7000000a, /* 013C(:455): DRD2A: EU0=0 EU1=0 EU2=0 EU3=10 EXT MORE init=0 WS=0 RS=0 */ ++ 0x080cf89f, /* 0140(:455): DRD2B1: idx0 = EU3(); EU3(idx2) */ ++ 0x6000000d, /* 0144(:456): DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT init=0 WS=0 RS=0 */ ++ 0x018cf89f, /* 0148(:456): DRD2B1: var6 = EU3(); EU3(idx2) */ ++ 0x000001f8, /* 014C(:0): NOP */ ++ 0x8618801b, /* 0150(:462): LCD: idx1 = var12; idx1 once var0; idx1 += inc3 */ ++ 0x7000000e, /* 0154(:463): DRD2A: EU0=0 EU1=0 EU2=0 EU3=14 EXT MORE init=0 WS=0 RS=0 */ ++ 0x084cf21f, /* 0158(:463): DRD2B1: idx1 = EU3(); EU3(var8) */ ++ 0xd8990336, /* 015C(:464): LCDEXT: idx2 = idx1; idx2 > var12; idx2 += inc6 */ ++ 0x8019801b, /* 0160(:464): LCD: idx3 = var0; idx3 once var0; idx3 += inc3 */ ++ 0x040001f8, /* 0164(:465): DRD1A: FN=0 INT init=0 WS=0 RS=0 */ ++ 0x000001f8, /* 0168(:0): NOP */ ++ 0x000001f8, /* 016C(:0): NOP */ + }; + u32 MCD_SingleNoEu_TDT[]= + { +- 0x8318001b, /* 0000(:646): LCD: idx0 = var6; idx0 once var0; idx0 += inc3 */ +- 0x7000000c, /* 0004(:647): DRD2A: EU0=0 EU1=0 EU2=0 EU3=12 EXT MORE init=0 WS=0 RS=0 */ +- 0x080cf81f, /* 0008(:647): DRD2B1: idx0 = EU3(); EU3(idx0) */ +- 0x8318801b, /* 000C(:648): LCD: idx1 = var6; idx1 once var0; idx1 += inc3 */ +- 0x6000000d, /* 0010(:649): DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT init=0 WS=0 RS=0 */ +- 0x084cf85f, /* 0014(:649): DRD2B1: idx1 = EU3(); EU3(idx1) */ ++ 0x8198001b, /* 0000(:657): LCD: idx0 = var3; idx0 once var0; idx0 += inc3 */ ++ 0x7000000d, /* 0004(:658): DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT MORE init=0 WS=0 RS=0 */ ++ 0x080cf81f, /* 0008(:658): DRD2B1: idx0 = EU3(); EU3(idx0) */ ++ 0x8198801b, /* 000C(:659): LCD: idx1 = var3; idx1 once var0; idx1 += inc3 */ ++ 0x6000000e, /* 0010(:660): DRD2A: EU0=0 EU1=0 EU2=0 EU3=14 EXT init=0 WS=0 RS=0 */ ++ 0x084cf85f, /* 0014(:660): DRD2B1: idx1 = EU3(); EU3(idx1) */ + 0x000001f8, /* 0018(:0): NOP */ +- 0x8498001b, /* 001C(:653): LCD: idx0 = var9; idx0 once var0; idx0 += inc3 */ +- 0x7000000c, /* 0020(:654): DRD2A: EU0=0 EU1=0 EU2=0 EU3=12 EXT MORE init=0 WS=0 RS=0 */ +- 0x020cf81f, /* 0024(:654): DRD2B1: var8 = EU3(); EU3(idx0) */ +- 0x6000000d, /* 0028(:655): DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT init=0 WS=0 RS=0 */ +- 0x028cf81f, /* 002C(:655): DRD2B1: var10 = EU3(); EU3(idx0) */ +- 0xc404601b, /* 0030(:658): LCDEXT: idx0 = var8, idx1 = var8; ; idx0 += inc3, idx1 += inc3 */ +- 0xc00423dc, /* 0034(:658): LCDEXT: idx2 = var0, idx3 = var8; idx3 == var15; idx2 += inc3, idx3 += inc4 */ +- 0x809a601b, /* 0038(:659): LCD: idx4 = var1; ; idx4 += inc3 */ +- 0xc207a182, /* 003C(:662): LCDEXT: idx5 = var4, idx6 = var15; idx6 < var6; idx5 += inc0, idx6 += inc2 */ +- 0x869be009, /* 0040(:662): LCD: idx7 = var13; ; idx7 += inc1 */ +- 0x03fed7b8, /* 0044(:665): DRD1A: *idx7; FN=0 init=31 WS=3 RS=3 */ +- 0xda9b001b, /* 0048(:667): LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */ +- 0x9b9be01b, /* 004C(:667): LCD: idx7 = idx7; ; idx7 += inc3 */ +- 0x70000006, /* 0050(:669): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ +- 0x088cf890, /* 0054(:669): DRD2B1: idx2 = EU3(); EU3(idx2,var16) */ +- 0x1000cb28, /* 0058(:670): DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */ +- 0x70000006, /* 005C(:671): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ +- 0x088cf890, /* 0060(:671): DRD2B1: idx2 = EU3(); EU3(idx2,var16) */ +- 0x1000cb30, /* 0064(:672): DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */ +- 0x70000006, /* 0068(:673): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ +- 0x088cf890, /* 006C(:673): DRD2B1: idx2 = EU3(); EU3(idx2,var16) */ +- 0x0000cb38, /* 0070(:674): DRD1A: *idx2 = idx7; FN=0 init=0 WS=0 RS=0 */ ++ 0x8298001b, /* 001C(:664): LCD: idx0 = var5; idx0 once var0; idx0 += inc3 */ ++ 0x7000000d, /* 0020(:665): DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT MORE init=0 WS=0 RS=0 */ ++ 0x010cf81f, /* 0024(:665): DRD2B1: var4 = EU3(); EU3(idx0) */ ++ 0x6000000e, /* 0028(:666): DRD2A: EU0=0 EU1=0 EU2=0 EU3=14 EXT init=0 WS=0 RS=0 */ ++ 0x018cf81f, /* 002C(:666): DRD2B1: var6 = EU3(); EU3(idx0) */ ++ 0xc202601b, /* 0030(:669): LCDEXT: idx0 = var4, idx1 = var4; ; idx0 += inc3, idx1 += inc3 */ ++ 0xc002221c, /* 0034(:669): LCDEXT: idx2 = var0, idx3 = var4; idx3 == var8; idx2 += inc3, idx3 += inc4 */ ++ 0x809a601b, /* 0038(:670): LCD: idx4 = var1; ; idx4 += inc3 */ ++ 0xc10420c2, /* 003C(:673): LCDEXT: idx5 = var2, idx6 = var8; idx6 < var3; idx5 += inc0, idx6 += inc2 */ ++ 0x839be009, /* 0040(:673): LCD: idx7 = var7; ; idx7 += inc1 */ ++ 0x03fed7b8, /* 0044(:676): DRD1A: *idx7; FN=0 init=31 WS=3 RS=3 */ ++ 0xda9b001b, /* 0048(:678): LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */ ++ 0x9b9be01b, /* 004C(:678): LCD: idx7 = idx7; ; idx7 += inc3 */ ++ 0x70000006, /* 0050(:680): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ ++ 0x088cf889, /* 0054(:680): DRD2B1: idx2 = EU3(); EU3(idx2,var9) */ ++ 0x1000cb28, /* 0058(:681): DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x70000006, /* 005C(:682): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ ++ 0x088cf889, /* 0060(:682): DRD2B1: idx2 = EU3(); EU3(idx2,var9) */ ++ 0x1000cb30, /* 0064(:683): DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x70000006, /* 0068(:684): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ ++ 0x088cf889, /* 006C(:684): DRD2B1: idx2 = EU3(); EU3(idx2,var9) */ ++ 0x0000cb38, /* 0070(:685): DRD1A: *idx2 = idx7; FN=0 init=0 WS=0 RS=0 */ + 0x000001f8, /* 0074(:0): NOP */ +- 0xc404601b, /* 0078(:678): LCDEXT: idx0 = var8, idx1 = var8; ; idx0 += inc3, idx1 += inc3 */ +- 0xc004245c, /* 007C(:678): LCDEXT: idx2 = var0, idx3 = var8; idx3 == var17; idx2 += inc3, idx3 += inc4 */ +- 0x809a601b, /* 0080(:679): LCD: idx4 = var1; ; idx4 += inc3 */ +- 0xda9b001b, /* 0084(:682): LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */ +- 0x9b9be01b, /* 0088(:682): LCD: idx7 = idx7; ; idx7 += inc3 */ +- 0x0000d3a0, /* 008C(:683): DRD1A: *idx4; FN=0 init=0 WS=0 RS=0 */ +- 0xc207a182, /* 0090(:685): LCDEXT: idx5 = var4, idx6 = var15; idx6 < var6; idx5 += inc0, idx6 += inc2 */ +- 0x869be009, /* 0094(:685): LCD: idx7 = var13; ; idx7 += inc1 */ +- 0x0bfed7b8, /* 0098(:688): DRD1A: *idx7; FN=0 TFD init=31 WS=3 RS=3 */ +- 0xda9b001b, /* 009C(:690): LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */ +- 0x9b9be01b, /* 00A0(:690): LCD: idx7 = idx7; ; idx7 += inc3 */ +- 0x70000006, /* 00A4(:692): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ +- 0x088cf890, /* 00A8(:692): DRD2B1: idx2 = EU3(); EU3(idx2,var16) */ +- 0x1000cb28, /* 00AC(:693): DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */ +- 0x70000006, /* 00B0(:694): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ +- 0x088cf890, /* 00B4(:694): DRD2B1: idx2 = EU3(); EU3(idx2,var16) */ +- 0x1000cb30, /* 00B8(:695): DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */ +- 0x70000006, /* 00BC(:696): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ +- 0x088cf890, /* 00C0(:696): DRD2B1: idx2 = EU3(); EU3(idx2,var16) */ +- 0x0000cb38, /* 00C4(:697): DRD1A: *idx2 = idx7; FN=0 init=0 WS=0 RS=0 */ ++ 0xc202601b, /* 0078(:689): LCDEXT: idx0 = var4, idx1 = var4; ; idx0 += inc3, idx1 += inc3 */ ++ 0xc002229c, /* 007C(:689): LCDEXT: idx2 = var0, idx3 = var4; idx3 == var10; idx2 += inc3, idx3 += inc4 */ ++ 0x809a601b, /* 0080(:690): LCD: idx4 = var1; ; idx4 += inc3 */ ++ 0xda9b001b, /* 0084(:693): LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */ ++ 0x9b9be01b, /* 0088(:693): LCD: idx7 = idx7; ; idx7 += inc3 */ ++ 0x0000d3a0, /* 008C(:694): DRD1A: *idx4; FN=0 init=0 WS=0 RS=0 */ ++ 0xc10420c2, /* 0090(:696): LCDEXT: idx5 = var2, idx6 = var8; idx6 < var3; idx5 += inc0, idx6 += inc2 */ ++ 0x839be009, /* 0094(:696): LCD: idx7 = var7; ; idx7 += inc1 */ ++ 0x0bfed7b8, /* 0098(:699): DRD1A: *idx7; FN=0 TFD init=31 WS=3 RS=3 */ ++ 0xda9b001b, /* 009C(:701): LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */ ++ 0x9b9be01b, /* 00A0(:701): LCD: idx7 = idx7; ; idx7 += inc3 */ ++ 0x70000006, /* 00A4(:703): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ ++ 0x088cf889, /* 00A8(:703): DRD2B1: idx2 = EU3(); EU3(idx2,var9) */ ++ 0x1000cb28, /* 00AC(:704): DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x70000006, /* 00B0(:705): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ ++ 0x088cf889, /* 00B4(:705): DRD2B1: idx2 = EU3(); EU3(idx2,var9) */ ++ 0x1000cb30, /* 00B8(:706): DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x70000006, /* 00BC(:707): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ ++ 0x088cf889, /* 00C0(:707): DRD2B1: idx2 = EU3(); EU3(idx2,var9) */ ++ 0x0000cb38, /* 00C4(:708): DRD1A: *idx2 = idx7; FN=0 init=0 WS=0 RS=0 */ + 0x000001f8, /* 00C8(:0): NOP */ +- 0xc51803ed, /* 00CC(:701): LCDEXT: idx0 = var10; idx0 > var15; idx0 += inc5 */ +- 0x8018801b, /* 00D0(:701): LCD: idx1 = var0; idx1 once var0; idx1 += inc3 */ +- 0x040001f8, /* 00D4(:702): DRD1A: FN=0 INT init=0 WS=0 RS=0 */ ++ 0xc318022d, /* 00CC(:712): LCDEXT: idx0 = var6; idx0 > var8; idx0 += inc5 */ ++ 0x8018801b, /* 00D0(:712): LCD: idx1 = var0; idx1 once var0; idx1 += inc3 */ ++ 0x040001f8, /* 00D4(:713): DRD1A: FN=0 INT init=0 WS=0 RS=0 */ + }; + #ifdef MCD_INCLUDE_EU + u32 MCD_ChainEu_TDT[]= + { +- 0x80004000, /* 0000(:928): LCDEXT: idx0 = 0x00000000; ; */ +- 0x8118801b, /* 0004(:928): LCD: idx1 = var2; idx1 once var0; idx1 += inc3 */ +- 0xb8ca0018, /* 0008(:929): LCD: idx2 = *(idx1 + var20); idx2 once var0; idx2 += inc3 */ +- 0x10004b10, /* 000C(:930): DRD1A: var18 = idx2; FN=0 MORE init=0 WS=0 RS=0 */ +- 0x7000000c, /* 0010(:931): DRD2A: EU0=0 EU1=0 EU2=0 EU3=12 EXT MORE init=0 WS=0 RS=0 */ +- 0x024cf89f, /* 0014(:931): DRD2B1: var9 = EU3(); EU3(idx2) */ +- 0x60000009, /* 0018(:932): DRD2A: EU0=0 EU1=0 EU2=0 EU3=9 EXT init=0 WS=0 RS=0 */ +- 0x080cf89f, /* 001C(:932): DRD2B1: idx0 = EU3(); EU3(idx2) */ ++ 0x80004000, /* 0000(:947): LCDEXT: idx0 = 0x00000000; ; */ ++ 0x8198801b, /* 0004(:947): LCD: idx1 = var3; idx1 once var0; idx1 += inc3 */ ++ 0xb8c68018, /* 0008(:948): LCD: idx2 = *(idx1 + var13); idx2 once var0; idx2 += inc3 */ ++ 0x10002f10, /* 000C(:949): DRD1A: var11 = idx2; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x7000000d, /* 0010(:950): DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT MORE init=0 WS=0 RS=0 */ ++ 0x01ccf89f, /* 0014(:950): DRD2B1: var7 = EU3(); EU3(idx2) */ ++ 0x6000000a, /* 0018(:951): DRD2A: EU0=0 EU1=0 EU2=0 EU3=10 EXT init=0 WS=0 RS=0 */ ++ 0x080cf89f, /* 001C(:951): DRD2B1: idx0 = EU3(); EU3(idx2) */ + 0x000001f8, /* 0020(:0): NOP */ +- 0x98180524, /* 0024(:936): LCD: idx0 = idx0; idx0 != var20; idx0 += inc4 */ +- 0x8118801b, /* 0028(:938): LCD: idx1 = var2; idx1 once var0; idx1 += inc3 */ +- 0xf8ca001a, /* 002C(:939): LCDEXT: idx2 = *(idx1 + var20 + 8); idx2 once var0; idx2 += inc3 */ +- 0xb8ca601b, /* 0030(:940): LCD: idx3 = *(idx1 + var20 + 12); ; idx3 += inc3 */ +- 0x10004310, /* 0034(:942): DRD1A: var16 = idx2; FN=0 MORE init=0 WS=0 RS=0 */ +- 0x00001718, /* 0038(:943): DRD1A: var5 = idx3; FN=0 init=0 WS=0 RS=0 */ +- 0xb8ca001d, /* 003C(:945): LCD: idx2 = *(idx1 + var20 + 20); idx2 once var0; idx2 += inc3 */ +- 0x10001f10, /* 0040(:946): DRD1A: var7 = idx2; FN=0 MORE init=0 WS=0 RS=0 */ +- 0x60000007, /* 0044(:947): DRD2A: EU0=0 EU1=0 EU2=0 EU3=7 EXT init=0 WS=0 RS=0 */ +- 0x020cf893, /* 0048(:947): DRD2B1: var8 = EU3(); EU3(idx2,var19) */ +- 0x98ca001c, /* 004C(:949): LCD: idx2 = idx1 + var20 + 4; idx2 once var0; idx2 += inc3 */ +- 0x00000710, /* 0050(:950): DRD1A: var1 = idx2; FN=0 init=0 WS=0 RS=0 */ +- 0x98ca8018, /* 0054(:951): LCD: idx2 = idx1 + var21; idx2 once var0; idx2 += inc3 */ +- 0x10002b10, /* 0058(:952): DRD1A: var10 = idx2; FN=0 MORE init=0 WS=0 RS=0 */ +- 0x0000c828, /* 005C(:953): DRD1A: *idx2 = var5; FN=0 init=0 WS=0 RS=0 */ ++ 0x981803a4, /* 0024(:955): LCD: idx0 = idx0; idx0 == var14; idx0 += inc4 */ ++ 0x8198801b, /* 0028(:957): LCD: idx1 = var3; idx1 once var0; idx1 += inc3 */ ++ 0xf8c6801a, /* 002C(:958): LCDEXT: idx2 = *(idx1 + var13 + 8); idx2 once var0; idx2 += inc3 */ ++ 0xb8c6e01b, /* 0030(:959): LCD: idx3 = *(idx1 + var13 + 12); ; idx3 += inc3 */ ++ 0x10002b10, /* 0034(:961): DRD1A: var10 = idx2; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x00001318, /* 0038(:962): DRD1A: var4 = idx3; FN=0 init=0 WS=0 RS=0 */ ++ 0xb8c6801d, /* 003C(:964): LCD: idx2 = *(idx1 + var13 + 20); idx2 once var0; idx2 += inc3 */ ++ 0x10001710, /* 0040(:965): DRD1A: var5 = idx2; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x60000007, /* 0044(:966): DRD2A: EU0=0 EU1=0 EU2=0 EU3=7 EXT init=0 WS=0 RS=0 */ ++ 0x018cf88c, /* 0048(:966): DRD2B1: var6 = EU3(); EU3(idx2,var12) */ ++ 0x98c6801c, /* 004C(:968): LCD: idx2 = idx1 + var13 + 4; idx2 once var0; idx2 += inc3 */ ++ 0x00000b10, /* 0050(:969): DRD1A: var2 = idx2; FN=0 init=0 WS=0 RS=0 */ ++ 0x98c78018, /* 0054(:970): LCD: idx2 = idx1 + var15; idx2 once var0; idx2 += inc3 */ ++ 0x10002310, /* 0058(:971): DRD1A: var8 = idx2; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x0000c820, /* 005C(:972): DRD1A: *idx2 = var4; FN=0 init=0 WS=0 RS=0 */ + 0x000001f8, /* 0060(:0): NOP */ +- 0xc14ae018, /* 0064(:957): LCDEXT: idx1 = var2 + var21; ; idx1 += inc3 */ +- 0xc004a51d, /* 0068(:957): LCDEXT: idx2 = var0, idx3 = var9; idx3 == var20; idx2 += inc3, idx3 += inc5 */ +- 0x811a601b, /* 006C(:958): LCD: idx4 = var2; ; idx4 += inc3 */ +- 0xc28a21c2, /* 0070(:961): LCDEXT: idx5 = var5, idx6 = var20; idx6 < var7; idx5 += inc0, idx6 += inc2 */ +- 0x881be009, /* 0074(:961): LCD: idx7 = var16; ; idx7 += inc1 */ +- 0x63fe0000, /* 0078(:964): DRD2A: EU0=0 EU1=0 EU2=0 EU3=0 EXT init=31 WS=3 RS=3 */ +- 0x0d4cfddf, /* 007C(:964): DRD2B1: *idx5 = EU3(); EU3(*idx7) */ +- 0xda9b001b, /* 0080(:966): LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */ +- 0x9b9be01b, /* 0084(:966): LCD: idx7 = idx7; ; idx7 += inc3 */ +- 0x1000cb20, /* 0088(:967): DRD1A: *idx2 = idx4; FN=0 MORE init=0 WS=0 RS=0 */ +- 0x70000006, /* 008C(:968): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ +- 0x088cf896, /* 0090(:968): DRD2B1: idx2 = EU3(); EU3(idx2,var22) */ +- 0x1000cb28, /* 0094(:969): DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */ +- 0x70000006, /* 0098(:970): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ +- 0x088cf896, /* 009C(:970): DRD2B1: idx2 = EU3(); EU3(idx2,var22) */ +- 0x1000cb30, /* 00A0(:971): DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */ +- 0x70000006, /* 00A4(:972): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ +- 0x088cf896, /* 00A8(:972): DRD2B1: idx2 = EU3(); EU3(idx2,var22) */ +- 0x1000cb38, /* 00AC(:973): DRD1A: *idx2 = idx7; FN=0 MORE init=0 WS=0 RS=0 */ +- 0x0000c728, /* 00B0(:974): DRD1A: *idx1 = idx5; FN=0 init=0 WS=0 RS=0 */ +- 0x000001f8, /* 00B4(:0): NOP */ +- 0xc14ae018, /* 00B8(:978): LCDEXT: idx1 = var2 + var21; ; idx1 += inc3 */ +- 0xc004a5dd, /* 00BC(:978): LCDEXT: idx2 = var0, idx3 = var9; idx3 == var23; idx2 += inc3, idx3 += inc5 */ +- 0x811a601b, /* 00C0(:979): LCD: idx4 = var2; ; idx4 += inc3 */ +- 0xda9b001b, /* 00C4(:982): LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */ +- 0x9b9be01b, /* 00C8(:982): LCD: idx7 = idx7; ; idx7 += inc3 */ +- 0x0000d3a0, /* 00CC(:983): DRD1A: *idx4; FN=0 init=0 WS=0 RS=0 */ +- 0xc28a21c2, /* 00D0(:985): LCDEXT: idx5 = var5, idx6 = var20; idx6 < var7; idx5 += inc0, idx6 += inc2 */ +- 0x881be009, /* 00D4(:985): LCD: idx7 = var16; ; idx7 += inc1 */ +- 0x6bfe0000, /* 00D8(:988): DRD2A: EU0=0 EU1=0 EU2=0 EU3=0 TFD EXT init=31 WS=3 RS=3 */ +- 0x0d4cfddf, /* 00DC(:988): DRD2B1: *idx5 = EU3(); EU3(*idx7) */ +- 0xda9b001b, /* 00E0(:990): LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */ +- 0x9b9be01b, /* 00E4(:990): LCD: idx7 = idx7; ; idx7 += inc3 */ +- 0x1000cb20, /* 00E8(:991): DRD1A: *idx2 = idx4; FN=0 MORE init=0 WS=0 RS=0 */ +- 0x70000006, /* 00EC(:992): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ +- 0x088cf896, /* 00F0(:992): DRD2B1: idx2 = EU3(); EU3(idx2,var22) */ +- 0x1000cb28, /* 00F4(:993): DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */ +- 0x70000006, /* 00F8(:994): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ +- 0x088cf896, /* 00FC(:994): DRD2B1: idx2 = EU3(); EU3(idx2,var22) */ +- 0x1000cb30, /* 0100(:995): DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */ +- 0x70000006, /* 0104(:996): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ +- 0x088cf896, /* 0108(:996): DRD2B1: idx2 = EU3(); EU3(idx2,var22) */ +- 0x1000cb38, /* 010C(:997): DRD1A: *idx2 = idx7; FN=0 MORE init=0 WS=0 RS=0 */ +- 0x0000c728, /* 0110(:998): DRD1A: *idx1 = idx5; FN=0 init=0 WS=0 RS=0 */ +- 0x000001f8, /* 0114(:0): NOP */ +- 0x8118801b, /* 0118(:1002): LCD: idx1 = var2; idx1 once var0; idx1 += inc3 */ +- 0x8a19001b, /* 011C(:1004): LCD: idx2 = var20; idx2 once var0; idx2 += inc3 */ +- 0x6000000e, /* 0120(:1005): DRD2A: EU0=0 EU1=0 EU2=0 EU3=14 EXT init=0 WS=0 RS=0 */ +- 0x088cf49f, /* 0124(:1005): DRD2B1: idx2 = EU3(); EU3(var18) */ +- 0xd9190536, /* 0128(:1006): LCDEXT: idx2 = idx2; idx2 == var20; idx2 += inc6 */ +- 0x98ca0018, /* 012C(:1006): LCD: idx3 = idx1 + var20; idx3 once var0; idx3 += inc3 */ +- 0x6000000a, /* 0130(:1008): DRD2A: EU0=0 EU1=0 EU2=0 EU3=10 EXT init=0 WS=0 RS=0 */ +- 0x0cccfcdf, /* 0134(:1008): DRD2B1: *idx3 = EU3(); EU3(*idx3) */ +- 0x000001f8, /* 0138(:0): NOP */ +- 0xa14a001e, /* 013C(:1011): LCD: idx1 = *(var2 + var20 + 24); idx1 once var0; idx1 += inc3 */ +- 0x10000b08, /* 0140(:1012): DRD1A: var2 = idx1; FN=0 MORE init=0 WS=0 RS=0 */ +- 0x10002c90, /* 0144(:1013): DRD1A: var11 = var18; FN=0 MORE init=0 WS=0 RS=0 */ +- 0xb8ca0018, /* 0148(:1014): LCD: idx2 = *(idx1 + var20); idx2 once var0; idx2 += inc3 */ +- 0x10004b10, /* 014C(:1015): DRD1A: var18 = idx2; FN=0 MORE init=0 WS=0 RS=0 */ +- 0x70000009, /* 0150(:1016): DRD2A: EU0=0 EU1=0 EU2=0 EU3=9 EXT MORE init=0 WS=0 RS=0 */ +- 0x080cf89f, /* 0154(:1016): DRD2B1: idx0 = EU3(); EU3(idx2) */ +- 0x6000000c, /* 0158(:1017): DRD2A: EU0=0 EU1=0 EU2=0 EU3=12 EXT init=0 WS=0 RS=0 */ +- 0x024cf89f, /* 015C(:1017): DRD2B1: var9 = EU3(); EU3(idx2) */ +- 0x000001f8, /* 0160(:0): NOP */ +- 0x8a18801b, /* 0164(:1023): LCD: idx1 = var20; idx1 once var0; idx1 += inc3 */ +- 0x7000000d, /* 0168(:1024): DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT MORE init=0 WS=0 RS=0 */ +- 0x084cf2df, /* 016C(:1024): DRD2B1: idx1 = EU3(); EU3(var11) */ +- 0xd899053f, /* 0170(:1025): LCDEXT: idx2 = idx1; idx2 > var20; idx2 += inc7 */ +- 0x8019801b, /* 0174(:1025): LCD: idx3 = var0; idx3 once var0; idx3 += inc3 */ +- 0x040001f8, /* 0178(:1026): DRD1A: FN=0 INT init=0 WS=0 RS=0 */ +- 0x000001f8, /* 017C(:0): NOP */ +- 0x000001f8, /* 0180(:0): NOP */ ++ 0x8698801b, /* 0064(:976): LCD: idx1 = var13; idx1 once var0; idx1 += inc3 */ ++ 0x7000000f, /* 0068(:977): DRD2A: EU0=0 EU1=0 EU2=0 EU3=15 EXT MORE init=0 WS=0 RS=0 */ ++ 0x084cf2df, /* 006C(:977): DRD2B1: idx1 = EU3(); EU3(var11) */ ++ 0xd899042d, /* 0070(:978): LCDEXT: idx2 = idx1; idx2 >= var16; idx2 += inc5 */ ++ 0x8019801b, /* 0074(:978): LCD: idx3 = var0; idx3 once var0; idx3 += inc3 */ ++ 0x60000003, /* 0078(:979): DRD2A: EU0=0 EU1=0 EU2=0 EU3=3 EXT init=0 WS=0 RS=0 */ ++ 0x2cd7c7df, /* 007C(:979): DRD2B2: EU3(var13) */ ++ 0xd8990364, /* 0080(:980): LCDEXT: idx2 = idx1; idx2 == var13; idx2 += inc4 */ ++ 0x8019801b, /* 0084(:980): LCD: idx3 = var0; idx3 once var0; idx3 += inc3 */ ++ 0x60000003, /* 0088(:981): DRD2A: EU0=0 EU1=0 EU2=0 EU3=3 EXT init=0 WS=0 RS=0 */ ++ 0x2c17c7df, /* 008C(:981): DRD2B2: EU3(var1) */ ++ 0x000001f8, /* 0090(:0): NOP */ ++ 0xc1c7e018, /* 0094(:984): LCDEXT: idx1 = var3 + var15; ; idx1 += inc3 */ ++ 0xc003a35e, /* 0098(:984): LCDEXT: idx2 = var0, idx3 = var7; idx3 == var13; idx2 += inc3, idx3 += inc6 */ ++ 0x819a601b, /* 009C(:985): LCD: idx4 = var3; ; idx4 += inc3 */ ++ 0xc206a142, /* 00A0(:988): LCDEXT: idx5 = var4, idx6 = var13; idx6 < var5; idx5 += inc0, idx6 += inc2 */ ++ 0x851be009, /* 00A4(:988): LCD: idx7 = var10; ; idx7 += inc1 */ ++ 0x63fe0000, /* 00A8(:991): DRD2A: EU0=0 EU1=0 EU2=0 EU3=0 EXT init=31 WS=3 RS=3 */ ++ 0x0d4cfddf, /* 00AC(:991): DRD2B1: *idx5 = EU3(); EU3(*idx7) */ ++ 0xda9b001b, /* 00B0(:993): LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */ ++ 0x9b9be01b, /* 00B4(:993): LCD: idx7 = idx7; ; idx7 += inc3 */ ++ 0x70000002, /* 00B8(:994): DRD2A: EU0=0 EU1=0 EU2=0 EU3=2 EXT MORE init=0 WS=0 RS=0 */ ++ 0x004cf81f, /* 00BC(:994): DRD2B1: var1 = EU3(); EU3(idx0) */ ++ 0x1000cb20, /* 00C0(:995): DRD1A: *idx2 = idx4; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x70000006, /* 00C4(:996): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ ++ 0x088cf891, /* 00C8(:996): DRD2B1: idx2 = EU3(); EU3(idx2,var17) */ ++ 0x1000cb28, /* 00CC(:997): DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x70000006, /* 00D0(:998): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ ++ 0x088cf891, /* 00D4(:998): DRD2B1: idx2 = EU3(); EU3(idx2,var17) */ ++ 0x1000cb30, /* 00D8(:999): DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x70000006, /* 00DC(:1000): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ ++ 0x088cf891, /* 00E0(:1000): DRD2B1: idx2 = EU3(); EU3(idx2,var17) */ ++ 0x1000cb38, /* 00E4(:1001): DRD1A: *idx2 = idx7; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x0000c728, /* 00E8(:1002): DRD1A: *idx1 = idx5; FN=0 init=0 WS=0 RS=0 */ ++ 0x000001f8, /* 00EC(:0): NOP */ ++ 0xc1c7e018, /* 00F0(:1006): LCDEXT: idx1 = var3 + var15; ; idx1 += inc3 */ ++ 0xc003a49e, /* 00F4(:1006): LCDEXT: idx2 = var0, idx3 = var7; idx3 == var18; idx2 += inc3, idx3 += inc6 */ ++ 0x819a601b, /* 00F8(:1007): LCD: idx4 = var3; ; idx4 += inc3 */ ++ 0xda9b001b, /* 00FC(:1010): LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */ ++ 0x9b9be01b, /* 0100(:1010): LCD: idx7 = idx7; ; idx7 += inc3 */ ++ 0x0000d3a0, /* 0104(:1011): DRD1A: *idx4; FN=0 init=0 WS=0 RS=0 */ ++ 0xc206a142, /* 0108(:1013): LCDEXT: idx5 = var4, idx6 = var13; idx6 < var5; idx5 += inc0, idx6 += inc2 */ ++ 0x851be009, /* 010C(:1013): LCD: idx7 = var10; ; idx7 += inc1 */ ++ 0x6bfe0000, /* 0110(:1016): DRD2A: EU0=0 EU1=0 EU2=0 EU3=0 TFD EXT init=31 WS=3 RS=3 */ ++ 0x0d4cfddf, /* 0114(:1016): DRD2B1: *idx5 = EU3(); EU3(*idx7) */ ++ 0xda9b001b, /* 0118(:1018): LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */ ++ 0x9b9be01b, /* 011C(:1018): LCD: idx7 = idx7; ; idx7 += inc3 */ ++ 0x70000002, /* 0120(:1019): DRD2A: EU0=0 EU1=0 EU2=0 EU3=2 EXT MORE init=0 WS=0 RS=0 */ ++ 0x004cf81f, /* 0124(:1019): DRD2B1: var1 = EU3(); EU3(idx0) */ ++ 0x1000cb20, /* 0128(:1020): DRD1A: *idx2 = idx4; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x70000006, /* 012C(:1021): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ ++ 0x088cf891, /* 0130(:1021): DRD2B1: idx2 = EU3(); EU3(idx2,var17) */ ++ 0x1000cb28, /* 0134(:1022): DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x70000006, /* 0138(:1023): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ ++ 0x088cf891, /* 013C(:1023): DRD2B1: idx2 = EU3(); EU3(idx2,var17) */ ++ 0x1000cb30, /* 0140(:1024): DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x70000006, /* 0144(:1025): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ ++ 0x088cf891, /* 0148(:1025): DRD2B1: idx2 = EU3(); EU3(idx2,var17) */ ++ 0x1000cb38, /* 014C(:1026): DRD1A: *idx2 = idx7; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x0000c728, /* 0150(:1027): DRD1A: *idx1 = idx5; FN=0 init=0 WS=0 RS=0 */ ++ 0x000001f8, /* 0154(:0): NOP */ ++ 0x8198801b, /* 0158(:1031): LCD: idx1 = var3; idx1 once var0; idx1 += inc3 */ ++ 0xd8c68018, /* 015C(:1033): LCDEXT: idx2 = idx1 + var13; idx2 once var0; idx2 += inc3 */ ++ 0x98c6e01c, /* 0160(:1033): LCD: idx3 = idx1 + var13 + 4; ; idx3 += inc3 */ ++ 0x6000000b, /* 0164(:1034): DRD2A: EU0=0 EU1=0 EU2=0 EU3=11 EXT init=0 WS=0 RS=0 */ ++ 0x0c8cfc9f, /* 0168(:1034): DRD2B1: *idx2 = EU3(); EU3(*idx2) */ ++ 0x0000cc08, /* 016C(:1035): DRD1A: *idx3 = var1; FN=0 init=0 WS=0 RS=0 */ ++ 0xa1c6801e, /* 0170(:1038): LCD: idx1 = *(var3 + var13 + 24); idx1 once var0; idx1 += inc3 */ ++ 0x10000f08, /* 0174(:1039): DRD1A: var3 = idx1; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x10002458, /* 0178(:1040): DRD1A: var9 = var11; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0xb8c68018, /* 017C(:1041): LCD: idx2 = *(idx1 + var13); idx2 once var0; idx2 += inc3 */ ++ 0x10002f10, /* 0180(:1042): DRD1A: var11 = idx2; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x7000000a, /* 0184(:1043): DRD2A: EU0=0 EU1=0 EU2=0 EU3=10 EXT MORE init=0 WS=0 RS=0 */ ++ 0x080cf89f, /* 0188(:1043): DRD2B1: idx0 = EU3(); EU3(idx2) */ ++ 0x6000000d, /* 018C(:1044): DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT init=0 WS=0 RS=0 */ ++ 0x01ccf89f, /* 0190(:1044): DRD2B1: var7 = EU3(); EU3(idx2) */ ++ 0x000001f8, /* 0194(:0): NOP */ ++ 0x8698801b, /* 0198(:1050): LCD: idx1 = var13; idx1 once var0; idx1 += inc3 */ ++ 0x7000000e, /* 019C(:1051): DRD2A: EU0=0 EU1=0 EU2=0 EU3=14 EXT MORE init=0 WS=0 RS=0 */ ++ 0x084cf25f, /* 01A0(:1051): DRD2B1: idx1 = EU3(); EU3(var9) */ ++ 0xd899037f, /* 01A4(:1052): LCDEXT: idx2 = idx1; idx2 > var13; idx2 += inc7 */ ++ 0x8019801b, /* 01A8(:1052): LCD: idx3 = var0; idx3 once var0; idx3 += inc3 */ ++ 0x040001f8, /* 01AC(:1053): DRD1A: FN=0 INT init=0 WS=0 RS=0 */ ++ 0x000001f8, /* 01B0(:0): NOP */ ++ 0x000001f8, /* 01B4(:0): NOP */ + }; + u32 MCD_SingleEu_TDT[]= + { +- 0x8318001b, /* 0000(:1204): LCD: idx0 = var6; idx0 once var0; idx0 += inc3 */ +- 0x7000000c, /* 0004(:1205): DRD2A: EU0=0 EU1=0 EU2=0 EU3=12 EXT MORE init=0 WS=0 RS=0 */ +- 0x080cf81f, /* 0008(:1205): DRD2B1: idx0 = EU3(); EU3(idx0) */ +- 0x8318801b, /* 000C(:1206): LCD: idx1 = var6; idx1 once var0; idx1 += inc3 */ +- 0x6000000d, /* 0010(:1207): DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT init=0 WS=0 RS=0 */ +- 0x084cf85f, /* 0014(:1207): DRD2B1: idx1 = EU3(); EU3(idx1) */ ++ 0x8218001b, /* 0000(:1248): LCD: idx0 = var4; idx0 once var0; idx0 += inc3 */ ++ 0x7000000d, /* 0004(:1249): DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT MORE init=0 WS=0 RS=0 */ ++ 0x080cf81f, /* 0008(:1249): DRD2B1: idx0 = EU3(); EU3(idx0) */ ++ 0x8218801b, /* 000C(:1250): LCD: idx1 = var4; idx1 once var0; idx1 += inc3 */ ++ 0x6000000e, /* 0010(:1251): DRD2A: EU0=0 EU1=0 EU2=0 EU3=14 EXT init=0 WS=0 RS=0 */ ++ 0x084cf85f, /* 0014(:1251): DRD2B1: idx1 = EU3(); EU3(idx1) */ + 0x000001f8, /* 0018(:0): NOP */ +- 0x8498001b, /* 001C(:1211): LCD: idx0 = var9; idx0 once var0; idx0 += inc3 */ +- 0x7000000c, /* 0020(:1212): DRD2A: EU0=0 EU1=0 EU2=0 EU3=12 EXT MORE init=0 WS=0 RS=0 */ +- 0x020cf81f, /* 0024(:1212): DRD2B1: var8 = EU3(); EU3(idx0) */ +- 0x6000000d, /* 0028(:1213): DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT init=0 WS=0 RS=0 */ +- 0x028cf81f, /* 002C(:1213): DRD2B1: var10 = EU3(); EU3(idx0) */ +- 0xc404601b, /* 0030(:1216): LCDEXT: idx0 = var8, idx1 = var8; ; idx0 += inc3, idx1 += inc3 */ +- 0xc00423dc, /* 0034(:1216): LCDEXT: idx2 = var0, idx3 = var8; idx3 == var15; idx2 += inc3, idx3 += inc4 */ +- 0x809a601b, /* 0038(:1217): LCD: idx4 = var1; ; idx4 += inc3 */ +- 0xc207a182, /* 003C(:1220): LCDEXT: idx5 = var4, idx6 = var15; idx6 < var6; idx5 += inc0, idx6 += inc2 */ +- 0x869be009, /* 0040(:1220): LCD: idx7 = var13; ; idx7 += inc1 */ +- 0x63fe0000, /* 0044(:1223): DRD2A: EU0=0 EU1=0 EU2=0 EU3=0 EXT init=31 WS=3 RS=3 */ +- 0x0d4cfddf, /* 0048(:1223): DRD2B1: *idx5 = EU3(); EU3(*idx7) */ +- 0xda9b001b, /* 004C(:1225): LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */ +- 0x9b9be01b, /* 0050(:1225): LCD: idx7 = idx7; ; idx7 += inc3 */ +- 0x70000006, /* 0054(:1227): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ +- 0x088cf890, /* 0058(:1227): DRD2B1: idx2 = EU3(); EU3(idx2,var16) */ +- 0x1000cb28, /* 005C(:1228): DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */ +- 0x70000006, /* 0060(:1229): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ +- 0x088cf890, /* 0064(:1229): DRD2B1: idx2 = EU3(); EU3(idx2,var16) */ +- 0x1000cb30, /* 0068(:1230): DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */ +- 0x70000006, /* 006C(:1231): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ +- 0x088cf890, /* 0070(:1231): DRD2B1: idx2 = EU3(); EU3(idx2,var16) */ +- 0x0000cb38, /* 0074(:1232): DRD1A: *idx2 = idx7; FN=0 init=0 WS=0 RS=0 */ +- 0x000001f8, /* 0078(:0): NOP */ +- 0xc404601b, /* 007C(:1236): LCDEXT: idx0 = var8, idx1 = var8; ; idx0 += inc3, idx1 += inc3 */ +- 0xc004245c, /* 0080(:1236): LCDEXT: idx2 = var0, idx3 = var8; idx3 == var17; idx2 += inc3, idx3 += inc4 */ +- 0x809a601b, /* 0084(:1237): LCD: idx4 = var1; ; idx4 += inc3 */ +- 0xda9b001b, /* 0088(:1240): LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */ +- 0x9b9be01b, /* 008C(:1240): LCD: idx7 = idx7; ; idx7 += inc3 */ +- 0x0000d3a0, /* 0090(:1241): DRD1A: *idx4; FN=0 init=0 WS=0 RS=0 */ +- 0xc207a182, /* 0094(:1243): LCDEXT: idx5 = var4, idx6 = var15; idx6 < var6; idx5 += inc0, idx6 += inc2 */ +- 0x869be009, /* 0098(:1243): LCD: idx7 = var13; ; idx7 += inc1 */ +- 0x6bfe0000, /* 009C(:1246): DRD2A: EU0=0 EU1=0 EU2=0 EU3=0 TFD EXT init=31 WS=3 RS=3 */ +- 0x0d4cfddf, /* 00A0(:1246): DRD2B1: *idx5 = EU3(); EU3(*idx7) */ +- 0xda9b001b, /* 00A4(:1248): LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */ +- 0x9b9be01b, /* 00A8(:1248): LCD: idx7 = idx7; ; idx7 += inc3 */ +- 0x70000006, /* 00AC(:1250): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ +- 0x088cf890, /* 00B0(:1250): DRD2B1: idx2 = EU3(); EU3(idx2,var16) */ +- 0x1000cb28, /* 00B4(:1251): DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */ +- 0x70000006, /* 00B8(:1252): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ +- 0x088cf890, /* 00BC(:1252): DRD2B1: idx2 = EU3(); EU3(idx2,var16) */ +- 0x1000cb30, /* 00C0(:1253): DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */ +- 0x70000006, /* 00C4(:1254): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ +- 0x088cf890, /* 00C8(:1254): DRD2B1: idx2 = EU3(); EU3(idx2,var16) */ +- 0x0000cb38, /* 00CC(:1255): DRD1A: *idx2 = idx7; FN=0 init=0 WS=0 RS=0 */ +- 0x000001f8, /* 00D0(:0): NOP */ +- 0xc51803ed, /* 00D4(:1259): LCDEXT: idx0 = var10; idx0 > var15; idx0 += inc5 */ +- 0x8018801b, /* 00D8(:1259): LCD: idx1 = var0; idx1 once var0; idx1 += inc3 */ +- 0x040001f8, /* 00DC(:1260): DRD1A: FN=0 INT init=0 WS=0 RS=0 */ ++ 0x8318001b, /* 001C(:1255): LCD: idx0 = var6; idx0 once var0; idx0 += inc3 */ ++ 0x7000000d, /* 0020(:1256): DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT MORE init=0 WS=0 RS=0 */ ++ 0x014cf81f, /* 0024(:1256): DRD2B1: var5 = EU3(); EU3(idx0) */ ++ 0x6000000e, /* 0028(:1257): DRD2A: EU0=0 EU1=0 EU2=0 EU3=14 EXT init=0 WS=0 RS=0 */ ++ 0x01ccf81f, /* 002C(:1257): DRD2B1: var7 = EU3(); EU3(idx0) */ ++ 0x8498001b, /* 0030(:1260): LCD: idx0 = var9; idx0 once var0; idx0 += inc3 */ ++ 0x7000000f, /* 0034(:1261): DRD2A: EU0=0 EU1=0 EU2=0 EU3=15 EXT MORE init=0 WS=0 RS=0 */ ++ 0x080cf19f, /* 0038(:1261): DRD2B1: idx0 = EU3(); EU3(var6) */ ++ 0xd81882a4, /* 003C(:1262): LCDEXT: idx1 = idx0; idx1 >= var10; idx1 += inc4 */ ++ 0x8019001b, /* 0040(:1262): LCD: idx2 = var0; idx2 once var0; idx2 += inc3 */ ++ 0x60000003, /* 0044(:1263): DRD2A: EU0=0 EU1=0 EU2=0 EU3=3 EXT init=0 WS=0 RS=0 */ ++ 0x2c97c7df, /* 0048(:1263): DRD2B2: EU3(var9) */ ++ 0xd818826d, /* 004C(:1264): LCDEXT: idx1 = idx0; idx1 == var9; idx1 += inc5 */ ++ 0x8019001b, /* 0050(:1264): LCD: idx2 = var0; idx2 once var0; idx2 += inc3 */ ++ 0x60000003, /* 0054(:1265): DRD2A: EU0=0 EU1=0 EU2=0 EU3=3 EXT init=0 WS=0 RS=0 */ ++ 0x2c17c7df, /* 0058(:1265): DRD2B2: EU3(var1) */ ++ 0x000001f8, /* 005C(:0): NOP */ ++ 0xc282e01b, /* 0060(:1268): LCDEXT: idx0 = var5, idx1 = var5; ; idx0 += inc3, idx1 += inc3 */ ++ 0xc002a25e, /* 0064(:1268): LCDEXT: idx2 = var0, idx3 = var5; idx3 == var9; idx2 += inc3, idx3 += inc6 */ ++ 0x811a601b, /* 0068(:1269): LCD: idx4 = var2; ; idx4 += inc3 */ ++ 0xc184a102, /* 006C(:1272): LCDEXT: idx5 = var3, idx6 = var9; idx6 < var4; idx5 += inc0, idx6 += inc2 */ ++ 0x841be009, /* 0070(:1272): LCD: idx7 = var8; ; idx7 += inc1 */ ++ 0x63fe0000, /* 0074(:1275): DRD2A: EU0=0 EU1=0 EU2=0 EU3=0 EXT init=31 WS=3 RS=3 */ ++ 0x0d4cfddf, /* 0078(:1275): DRD2B1: *idx5 = EU3(); EU3(*idx7) */ ++ 0xda9b001b, /* 007C(:1277): LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */ ++ 0x9b9be01b, /* 0080(:1277): LCD: idx7 = idx7; ; idx7 += inc3 */ ++ 0x70000002, /* 0084(:1279): DRD2A: EU0=0 EU1=0 EU2=0 EU3=2 EXT MORE init=0 WS=0 RS=0 */ ++ 0x004cf99f, /* 0088(:1279): DRD2B1: var1 = EU3(); EU3(idx6) */ ++ 0x70000006, /* 008C(:1280): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ ++ 0x088cf88b, /* 0090(:1280): DRD2B1: idx2 = EU3(); EU3(idx2,var11) */ ++ 0x1000cb28, /* 0094(:1281): DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x70000006, /* 0098(:1282): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ ++ 0x088cf88b, /* 009C(:1282): DRD2B1: idx2 = EU3(); EU3(idx2,var11) */ ++ 0x1000cb30, /* 00A0(:1283): DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x70000006, /* 00A4(:1284): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ ++ 0x088cf88b, /* 00A8(:1284): DRD2B1: idx2 = EU3(); EU3(idx2,var11) */ ++ 0x0000cb38, /* 00AC(:1285): DRD1A: *idx2 = idx7; FN=0 init=0 WS=0 RS=0 */ ++ 0x000001f8, /* 00B0(:0): NOP */ ++ 0xc282e01b, /* 00B4(:1289): LCDEXT: idx0 = var5, idx1 = var5; ; idx0 += inc3, idx1 += inc3 */ ++ 0xc002a31e, /* 00B8(:1289): LCDEXT: idx2 = var0, idx3 = var5; idx3 == var12; idx2 += inc3, idx3 += inc6 */ ++ 0x811a601b, /* 00BC(:1290): LCD: idx4 = var2; ; idx4 += inc3 */ ++ 0xda9b001b, /* 00C0(:1293): LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */ ++ 0x9b9be01b, /* 00C4(:1293): LCD: idx7 = idx7; ; idx7 += inc3 */ ++ 0x0000d3a0, /* 00C8(:1294): DRD1A: *idx4; FN=0 init=0 WS=0 RS=0 */ ++ 0xc184a102, /* 00CC(:1296): LCDEXT: idx5 = var3, idx6 = var9; idx6 < var4; idx5 += inc0, idx6 += inc2 */ ++ 0x841be009, /* 00D0(:1296): LCD: idx7 = var8; ; idx7 += inc1 */ ++ 0x6bfe0000, /* 00D4(:1299): DRD2A: EU0=0 EU1=0 EU2=0 EU3=0 TFD EXT init=31 WS=3 RS=3 */ ++ 0x0d4cfddf, /* 00D8(:1299): DRD2B1: *idx5 = EU3(); EU3(*idx7) */ ++ 0xda9b001b, /* 00DC(:1301): LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */ ++ 0x9b9be01b, /* 00E0(:1301): LCD: idx7 = idx7; ; idx7 += inc3 */ ++ 0x70000002, /* 00E4(:1303): DRD2A: EU0=0 EU1=0 EU2=0 EU3=2 EXT MORE init=0 WS=0 RS=0 */ ++ 0x004cf99f, /* 00E8(:1303): DRD2B1: var1 = EU3(); EU3(idx6) */ ++ 0x70000006, /* 00EC(:1304): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ ++ 0x088cf88b, /* 00F0(:1304): DRD2B1: idx2 = EU3(); EU3(idx2,var11) */ ++ 0x1000cb28, /* 00F4(:1305): DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x70000006, /* 00F8(:1306): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ ++ 0x088cf88b, /* 00FC(:1306): DRD2B1: idx2 = EU3(); EU3(idx2,var11) */ ++ 0x1000cb30, /* 0100(:1307): DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x70000006, /* 0104(:1308): DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */ ++ 0x088cf88b, /* 0108(:1308): DRD2B1: idx2 = EU3(); EU3(idx2,var11) */ ++ 0x0000cb38, /* 010C(:1309): DRD1A: *idx2 = idx7; FN=0 init=0 WS=0 RS=0 */ ++ 0x000001f8, /* 0110(:0): NOP */ ++ 0x8144801c, /* 0114(:1312): LCD: idx0 = var2 + var9 + 4; idx0 once var0; idx0 += inc3 */ ++ 0x0000c008, /* 0118(:1313): DRD1A: *idx0 = var1; FN=0 init=0 WS=0 RS=0 */ ++ 0xc398027f, /* 011C(:1315): LCDEXT: idx0 = var7; idx0 > var9; idx0 += inc7 */ ++ 0x8018801b, /* 0120(:1315): LCD: idx1 = var0; idx1 once var0; idx1 += inc3 */ ++ 0x040001f8, /* 0124(:1316): DRD1A: FN=0 INT init=0 WS=0 RS=0 */ + }; + #endif + u32 MCD_ENetRcv_TDT[]= + { +- 0x80004000, /* 0000(:1334): LCDEXT: idx0 = 0x00000000; ; */ +- 0x82188000, /* 0004(:1334): LCD: idx1 = var4; idx1 once var0; idx1 += inc0 */ +- 0x10000788, /* 0008(:1335): DRD1A: var1 = *idx1; FN=0 MORE init=0 WS=0 RS=0 */ +- 0x60000009, /* 000C(:1336): DRD2A: EU0=0 EU1=0 EU2=0 EU3=9 EXT init=0 WS=0 RS=0 */ +- 0x080cf05f, /* 0010(:1336): DRD2B1: idx0 = EU3(); EU3(var1) */ +- 0x98180249, /* 0014(:1339): LCD: idx0 = idx0; idx0 != var9; idx0 += inc1 */ +- 0x82448004, /* 0018(:1341): LCD: idx1 = var4 + var9 + 4; idx1 once var0; idx1 += inc0 */ +- 0x7000000d, /* 001C(:1342): DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT MORE init=0 WS=0 RS=0 */ +- 0x014cf05f, /* 0020(:1342): DRD2B1: var5 = EU3(); EU3(var1) */ +- 0x7000000b, /* 0024(:1343): DRD2A: EU0=0 EU1=0 EU2=0 EU3=11 EXT MORE init=0 WS=0 RS=0 */ +- 0x020cf05f, /* 0028(:1343): DRD2B1: var8 = EU3(); EU3(var1) */ +- 0x70000004, /* 002C(:1344): DRD2A: EU0=0 EU1=0 EU2=0 EU3=4 EXT MORE init=0 WS=0 RS=0 */ +- 0x018cf04a, /* 0030(:1344): DRD2B1: var6 = EU3(); EU3(var1,var10) */ +- 0x70000004, /* 0034(:1345): DRD2A: EU0=0 EU1=0 EU2=0 EU3=4 EXT MORE init=0 WS=0 RS=0 */ +- 0x004cf04b, /* 0038(:1345): DRD2B1: var1 = EU3(); EU3(var1,var11) */ +- 0x00000b88, /* 003C(:1348): DRD1A: var2 = *idx1; FN=0 init=0 WS=0 RS=0 */ +- 0xc4838190, /* 0040(:1351): LCDEXT: idx1 = var9, idx2 = var7; idx1 < var6; idx1 += inc2, idx2 += inc0 */ +- 0x8119e012, /* 0044(:1351): LCD: idx3 = var2; ; idx3 += inc2 */ +- 0x03e0cf90, /* 0048(:1354): DRD1A: *idx3 = *idx2; FN=0 init=31 WS=0 RS=0 */ +- 0x81188000, /* 004C(:1357): LCD: idx1 = var2; idx1 once var0; idx1 += inc0 */ +- 0x000ac788, /* 0050(:1358): DRD1A: *idx1 = *idx1; FN=0 init=0 WS=1 RS=1 */ +- 0xc4838000, /* 0054(:1360): LCDEXT: idx1 = var9, idx2 = var7; idx1 once var0; idx1 += inc0, idx2 += inc0 */ +- 0x8219e000, /* 0058(:1360): LCD: idx3 = var4; ; idx3 += inc0 */ +- 0x70000004, /* 005C(:1368): DRD2A: EU0=0 EU1=0 EU2=0 EU3=4 EXT MORE init=0 WS=0 RS=0 */ +- 0x084cfc8c, /* 0060(:1368): DRD2B1: idx1 = EU3(); EU3(*idx2,var12) */ +- 0x60000005, /* 0064(:1371): DRD2A: EU0=0 EU1=0 EU2=0 EU3=5 EXT init=0 WS=0 RS=0 */ +- 0x0cccf841, /* 0068(:1371): DRD2B1: *idx3 = EU3(); EU3(idx1,var1) */ +- 0x82468000, /* 006C(:1377): LCD: idx1 = var4 + var13; idx1 once var0; idx1 += inc0 */ +- 0xc419025b, /* 0070(:1379): LCDEXT: idx2 = var8; idx2 > var9; idx2 += inc3 */ +- 0x80198000, /* 0074(:1379): LCD: idx3 = var0; idx3 once var0; idx3 += inc0 */ +- 0x00008400, /* 0078(:1380): DRD1A: idx1 = var0; FN=0 init=0 WS=0 RS=0 */ +- 0x00001308, /* 007C(:1381): DRD1A: var4 = idx1; FN=0 init=0 WS=0 RS=0 */ +- 0x82188000, /* 0080(:1384): LCD: idx1 = var4; idx1 once var0; idx1 += inc0 */ +- 0x10000788, /* 0084(:1385): DRD1A: var1 = *idx1; FN=0 MORE init=0 WS=0 RS=0 */ +- 0x60000009, /* 0088(:1386): DRD2A: EU0=0 EU1=0 EU2=0 EU3=9 EXT init=0 WS=0 RS=0 */ +- 0x080cf05f, /* 008C(:1386): DRD2B1: idx0 = EU3(); EU3(var1) */ +- 0xc2988249, /* 0090(:1389): LCDEXT: idx1 = var5; idx1 != var9; idx1 += inc1 */ +- 0x80190000, /* 0094(:1389): LCD: idx2 = var0; idx2 once var0; idx2 += inc0 */ +- 0x040001f8, /* 0098(:1390): DRD1A: FN=0 INT init=0 WS=0 RS=0 */ +- 0x000001f8, /* 009C(:0): NOP */ ++ 0x80004000, /* 0000(:1389): LCDEXT: idx0 = 0x00000000; ; */ ++ 0x81988000, /* 0004(:1389): LCD: idx1 = var3; idx1 once var0; idx1 += inc0 */ ++ 0x10000788, /* 0008(:1390): DRD1A: var1 = *idx1; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x6000000a, /* 000C(:1391): DRD2A: EU0=0 EU1=0 EU2=0 EU3=10 EXT init=0 WS=0 RS=0 */ ++ 0x080cf05f, /* 0010(:1391): DRD2B1: idx0 = EU3(); EU3(var1) */ ++ 0x98180209, /* 0014(:1394): LCD: idx0 = idx0; idx0 != var8; idx0 += inc1 */ ++ 0x81c40004, /* 0018(:1396): LCD: idx1 = var3 + var8 + 4; idx1 once var0; idx1 += inc0 */ ++ 0x7000000e, /* 001C(:1397): DRD2A: EU0=0 EU1=0 EU2=0 EU3=14 EXT MORE init=0 WS=0 RS=0 */ ++ 0x010cf05f, /* 0020(:1397): DRD2B1: var4 = EU3(); EU3(var1) */ ++ 0x7000000c, /* 0024(:1398): DRD2A: EU0=0 EU1=0 EU2=0 EU3=12 EXT MORE init=0 WS=0 RS=0 */ ++ 0x01ccf05f, /* 0028(:1398): DRD2B1: var7 = EU3(); EU3(var1) */ ++ 0x70000004, /* 002C(:1399): DRD2A: EU0=0 EU1=0 EU2=0 EU3=4 EXT MORE init=0 WS=0 RS=0 */ ++ 0x014cf049, /* 0030(:1399): DRD2B1: var5 = EU3(); EU3(var1,var9) */ ++ 0x70000004, /* 0034(:1400): DRD2A: EU0=0 EU1=0 EU2=0 EU3=4 EXT MORE init=0 WS=0 RS=0 */ ++ 0x004cf04a, /* 0038(:1400): DRD2B1: var1 = EU3(); EU3(var1,var10) */ ++ 0x00000b88, /* 003C(:1403): DRD1A: var2 = *idx1; FN=0 init=0 WS=0 RS=0 */ ++ 0xc4030150, /* 0040(:1406): LCDEXT: idx1 = var8, idx2 = var6; idx1 < var5; idx1 += inc2, idx2 += inc0 */ ++ 0x8119e012, /* 0044(:1406): LCD: idx3 = var2; ; idx3 += inc2 */ ++ 0x03e0cf90, /* 0048(:1409): DRD1A: *idx3 = *idx2; FN=0 init=31 WS=0 RS=0 */ ++ 0x81188000, /* 004C(:1412): LCD: idx1 = var2; idx1 once var0; idx1 += inc0 */ ++ 0x000ac788, /* 0050(:1413): DRD1A: *idx1 = *idx1; FN=0 init=0 WS=1 RS=1 */ ++ 0xc4030000, /* 0054(:1415): LCDEXT: idx1 = var8, idx2 = var6; idx1 once var0; idx1 += inc0, idx2 += inc0 */ ++ 0x8199e000, /* 0058(:1415): LCD: idx3 = var3; ; idx3 += inc0 */ ++ 0x63e00004, /* 005C(:1418): DRD2A: EU0=0 EU1=0 EU2=0 EU3=4 EXT init=31 WS=0 RS=0 */ ++ 0x084cfc8b, /* 0060(:1418): DRD2B1: idx1 = EU3(); EU3(*idx2,var11) */ ++ 0xd8990000, /* 0064(:1421): LCDEXT: idx1 = idx1, idx2 = idx2; idx1 once var0; idx1 += inc0, idx2 += inc0 */ ++ 0x9999e000, /* 0068(:1421): LCD: idx3 = idx3; ; idx3 += inc0 */ ++ 0x60000005, /* 006C(:1422): DRD2A: EU0=0 EU1=0 EU2=0 EU3=5 EXT init=0 WS=0 RS=0 */ ++ 0x0cccf841, /* 0070(:1422): DRD2B1: *idx3 = EU3(); EU3(idx1,var1) */ ++ 0x81c60000, /* 0074(:1427): LCD: idx1 = var3 + var12; idx1 once var0; idx1 += inc0 */ ++ 0xc399021b, /* 0078(:1429): LCDEXT: idx2 = var7; idx2 > var8; idx2 += inc3 */ ++ 0x80198000, /* 007C(:1429): LCD: idx3 = var0; idx3 once var0; idx3 += inc0 */ ++ 0x00008400, /* 0080(:1430): DRD1A: idx1 = var0; FN=0 init=0 WS=0 RS=0 */ ++ 0x00000f08, /* 0084(:1431): DRD1A: var3 = idx1; FN=0 init=0 WS=0 RS=0 */ ++ 0x81988000, /* 0088(:1434): LCD: idx1 = var3; idx1 once var0; idx1 += inc0 */ ++ 0x10000788, /* 008C(:1435): DRD1A: var1 = *idx1; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x6000000a, /* 0090(:1436): DRD2A: EU0=0 EU1=0 EU2=0 EU3=10 EXT init=0 WS=0 RS=0 */ ++ 0x080cf05f, /* 0094(:1436): DRD2B1: idx0 = EU3(); EU3(var1) */ ++ 0xc2188209, /* 0098(:1439): LCDEXT: idx1 = var4; idx1 != var8; idx1 += inc1 */ ++ 0x80190000, /* 009C(:1439): LCD: idx2 = var0; idx2 once var0; idx2 += inc0 */ ++ 0x040001f8, /* 00A0(:1440): DRD1A: FN=0 INT init=0 WS=0 RS=0 */ ++ 0x000001f8, /* 00A4(:0): NOP */ + }; + u32 MCD_ENetXmit_TDT[]= + { +- 0x80004000, /* 0000(:1465): LCDEXT: idx0 = 0x00000000; ; */ +- 0x81988000, /* 0004(:1465): LCD: idx1 = var3; idx1 once var0; idx1 += inc0 */ +- 0x10000788, /* 0008(:1466): DRD1A: var1 = *idx1; FN=0 MORE init=0 WS=0 RS=0 */ +- 0x60000009, /* 000C(:1467): DRD2A: EU0=0 EU1=0 EU2=0 EU3=9 EXT init=0 WS=0 RS=0 */ +- 0x080cf05f, /* 0010(:1467): DRD2B1: idx0 = EU3(); EU3(var1) */ +- 0x98180309, /* 0014(:1470): LCD: idx0 = idx0; idx0 != var12; idx0 += inc1 */ +- 0x80004003, /* 0018(:1472): LCDEXT: idx1 = 0x00000003; ; */ +- 0x81c60004, /* 001C(:1472): LCD: idx2 = var3 + var12 + 4; idx2 once var0; idx2 += inc0 */ +- 0x7000000d, /* 0020(:1473): DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT MORE init=0 WS=0 RS=0 */ +- 0x014cf05f, /* 0024(:1473): DRD2B1: var5 = EU3(); EU3(var1) */ +- 0x7000000b, /* 0028(:1474): DRD2A: EU0=0 EU1=0 EU2=0 EU3=11 EXT MORE init=0 WS=0 RS=0 */ +- 0x028cf05f, /* 002C(:1474): DRD2B1: var10 = EU3(); EU3(var1) */ +- 0x7000000c, /* 0030(:1475): DRD2A: EU0=0 EU1=0 EU2=0 EU3=12 EXT MORE init=0 WS=0 RS=0 */ +- 0x018cf05f, /* 0034(:1475): DRD2B1: var6 = EU3(); EU3(var1) */ +- 0x70000004, /* 0038(:1476): DRD2A: EU0=0 EU1=0 EU2=0 EU3=4 EXT MORE init=0 WS=0 RS=0 */ +- 0x01ccf04d, /* 003C(:1476): DRD2B1: var7 = EU3(); EU3(var1,var13) */ +- 0x10000b90, /* 0040(:1477): DRD1A: var2 = *idx2; FN=0 MORE init=0 WS=0 RS=0 */ +- 0x60000004, /* 0044(:1478): DRD2A: EU0=0 EU1=0 EU2=0 EU3=4 EXT init=0 WS=0 RS=0 */ +- 0x020cf0a1, /* 0048(:1478): DRD2B1: var8 = EU3(); EU3(var2,idx1) */ +- 0xc3188312, /* 004C(:1481): LCDEXT: idx1 = var6; idx1 > var12; idx1 += inc2 */ +- 0x83c70000, /* 0050(:1481): LCD: idx2 = var7 + var14; idx2 once var0; idx2 += inc0 */ +- 0x00001f10, /* 0054(:1482): DRD1A: var7 = idx2; FN=0 init=0 WS=0 RS=0 */ +- 0xc583a3c3, /* 0058(:1484): LCDEXT: idx1 = var11, idx2 = var7; idx2 >= var15; idx1 += inc0, idx2 += inc3 */ +- 0x81042325, /* 005C(:1484): LCD: idx3 = var2, idx4 = var8; idx4 == var12; idx3 += inc4, idx4 += inc5 */ +- 0x03e0c798, /* 0060(:1489): DRD1A: *idx1 = *idx3; FN=0 init=31 WS=0 RS=0 */ +- 0xd8990000, /* 0064(:1492): LCDEXT: idx1 = idx1, idx2 = idx2; idx1 once var0; idx1 += inc0, idx2 += inc0 */ +- 0x9999e000, /* 0068(:1492): LCD: idx3 = idx3; ; idx3 += inc0 */ +- 0x000acf98, /* 006C(:1493): DRD1A: *idx3 = *idx3; FN=0 init=0 WS=1 RS=1 */ +- 0xd8992306, /* 0070(:1495): LCDEXT: idx1 = idx1, idx2 = idx2; idx2 > var12; idx1 += inc0, idx2 += inc6 */ +- 0x9999e03f, /* 0074(:1495): LCD: idx3 = idx3; ; idx3 += inc7 */ +- 0x03eac798, /* 0078(:1498): DRD1A: *idx1 = *idx3; FN=0 init=31 WS=1 RS=1 */ +- 0xd8990000, /* 007C(:1501): LCDEXT: idx1 = idx1, idx2 = idx2; idx1 once var0; idx1 += inc0, idx2 += inc0 */ +- 0x9999e000, /* 0080(:1501): LCD: idx3 = idx3; ; idx3 += inc0 */ +- 0x000acf98, /* 0084(:1502): DRD1A: *idx3 = *idx3; FN=0 init=0 WS=1 RS=1 */ +- 0xd8990000, /* 0088(:1504): LCDEXT: idx1 = idx1, idx2 = idx2; idx1 once var0; idx1 += inc0, idx2 += inc0 */ +- 0x99832302, /* 008C(:1504): LCD: idx3 = idx3, idx4 = var6; idx4 > var12; idx3 += inc0, idx4 += inc2 */ +- 0x0beac798, /* 0090(:1507): DRD1A: *idx1 = *idx3; FN=0 TFD init=31 WS=1 RS=1 */ +- 0x81988000, /* 0094(:1509): LCD: idx1 = var3; idx1 once var0; idx1 += inc0 */ +- 0x6000000a, /* 0098(:1510): DRD2A: EU0=0 EU1=0 EU2=0 EU3=10 EXT init=0 WS=0 RS=0 */ +- 0x0c4cfc5f, /* 009C(:1510): DRD2B1: *idx1 = EU3(); EU3(*idx1) */ +- 0x81c80000, /* 00A0(:1512): LCD: idx1 = var3 + var16; idx1 once var0; idx1 += inc0 */ +- 0xc5190312, /* 00A4(:1514): LCDEXT: idx2 = var10; idx2 > var12; idx2 += inc2 */ +- 0x80198000, /* 00A8(:1514): LCD: idx3 = var0; idx3 once var0; idx3 += inc0 */ +- 0x00008400, /* 00AC(:1515): DRD1A: idx1 = var0; FN=0 init=0 WS=0 RS=0 */ +- 0x00000f08, /* 00B0(:1516): DRD1A: var3 = idx1; FN=0 init=0 WS=0 RS=0 */ +- 0x81988000, /* 00B4(:1519): LCD: idx1 = var3; idx1 once var0; idx1 += inc0 */ +- 0x10000788, /* 00B8(:1520): DRD1A: var1 = *idx1; FN=0 MORE init=0 WS=0 RS=0 */ +- 0x60000009, /* 00BC(:1521): DRD2A: EU0=0 EU1=0 EU2=0 EU3=9 EXT init=0 WS=0 RS=0 */ +- 0x080cf05f, /* 00C0(:1521): DRD2B1: idx0 = EU3(); EU3(var1) */ +- 0xc2988309, /* 00C4(:1524): LCDEXT: idx1 = var5; idx1 != var12; idx1 += inc1 */ +- 0x80190000, /* 00C8(:1524): LCD: idx2 = var0; idx2 once var0; idx2 += inc0 */ +- 0x040001f8, /* 00CC(:1525): DRD1A: FN=0 INT init=0 WS=0 RS=0 */ ++ 0x80004000, /* 0000(:1515): LCDEXT: idx0 = 0x00000000; ; */ ++ 0x81988000, /* 0004(:1515): LCD: idx1 = var3; idx1 once var0; idx1 += inc0 */ ++ 0x10000788, /* 0008(:1516): DRD1A: var1 = *idx1; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x6000000a, /* 000C(:1517): DRD2A: EU0=0 EU1=0 EU2=0 EU3=10 EXT init=0 WS=0 RS=0 */ ++ 0x080cf05f, /* 0010(:1517): DRD2B1: idx0 = EU3(); EU3(var1) */ ++ 0x98180309, /* 0014(:1520): LCD: idx0 = idx0; idx0 != var12; idx0 += inc1 */ ++ 0x80004003, /* 0018(:1522): LCDEXT: idx1 = 0x00000003; ; */ ++ 0x81c60004, /* 001C(:1522): LCD: idx2 = var3 + var12 + 4; idx2 once var0; idx2 += inc0 */ ++ 0x7000000e, /* 0020(:1523): DRD2A: EU0=0 EU1=0 EU2=0 EU3=14 EXT MORE init=0 WS=0 RS=0 */ ++ 0x014cf05f, /* 0024(:1523): DRD2B1: var5 = EU3(); EU3(var1) */ ++ 0x7000000c, /* 0028(:1524): DRD2A: EU0=0 EU1=0 EU2=0 EU3=12 EXT MORE init=0 WS=0 RS=0 */ ++ 0x028cf05f, /* 002C(:1524): DRD2B1: var10 = EU3(); EU3(var1) */ ++ 0x7000000d, /* 0030(:1525): DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT MORE init=0 WS=0 RS=0 */ ++ 0x018cf05f, /* 0034(:1525): DRD2B1: var6 = EU3(); EU3(var1) */ ++ 0x70000004, /* 0038(:1526): DRD2A: EU0=0 EU1=0 EU2=0 EU3=4 EXT MORE init=0 WS=0 RS=0 */ ++ 0x01ccf04d, /* 003C(:1526): DRD2B1: var7 = EU3(); EU3(var1,var13) */ ++ 0x10000b90, /* 0040(:1527): DRD1A: var2 = *idx2; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x60000004, /* 0044(:1528): DRD2A: EU0=0 EU1=0 EU2=0 EU3=4 EXT init=0 WS=0 RS=0 */ ++ 0x020cf0a1, /* 0048(:1528): DRD2B1: var8 = EU3(); EU3(var2,idx1) */ ++ 0xc3188312, /* 004C(:1531): LCDEXT: idx1 = var6; idx1 > var12; idx1 += inc2 */ ++ 0x83c70000, /* 0050(:1531): LCD: idx2 = var7 + var14; idx2 once var0; idx2 += inc0 */ ++ 0x00001f10, /* 0054(:1532): DRD1A: var7 = idx2; FN=0 init=0 WS=0 RS=0 */ ++ 0xc583a3c3, /* 0058(:1534): LCDEXT: idx1 = var11, idx2 = var7; idx2 >= var15; idx1 += inc0, idx2 += inc3 */ ++ 0x81042325, /* 005C(:1534): LCD: idx3 = var2, idx4 = var8; idx4 == var12; idx3 += inc4, idx4 += inc5 */ ++ 0x03e0c798, /* 0060(:1539): DRD1A: *idx1 = *idx3; FN=0 init=31 WS=0 RS=0 */ ++ 0xd8990000, /* 0064(:1542): LCDEXT: idx1 = idx1, idx2 = idx2; idx1 once var0; idx1 += inc0, idx2 += inc0 */ ++ 0x9999e000, /* 0068(:1542): LCD: idx3 = idx3; ; idx3 += inc0 */ ++ 0x000acf98, /* 006C(:1543): DRD1A: *idx3 = *idx3; FN=0 init=0 WS=1 RS=1 */ ++ 0xd8992306, /* 0070(:1545): LCDEXT: idx1 = idx1, idx2 = idx2; idx2 > var12; idx1 += inc0, idx2 += inc6 */ ++ 0x9999e03f, /* 0074(:1545): LCD: idx3 = idx3; ; idx3 += inc7 */ ++ 0x03eac798, /* 0078(:1548): DRD1A: *idx1 = *idx3; FN=0 init=31 WS=1 RS=1 */ ++ 0xd8990000, /* 007C(:1551): LCDEXT: idx1 = idx1, idx2 = idx2; idx1 once var0; idx1 += inc0, idx2 += inc0 */ ++ 0x9999e000, /* 0080(:1551): LCD: idx3 = idx3; ; idx3 += inc0 */ ++ 0x000acf98, /* 0084(:1552): DRD1A: *idx3 = *idx3; FN=0 init=0 WS=1 RS=1 */ ++ 0xd8990000, /* 0088(:1554): LCDEXT: idx1 = idx1, idx2 = idx2; idx1 once var0; idx1 += inc0, idx2 += inc0 */ ++ 0x99832302, /* 008C(:1554): LCD: idx3 = idx3, idx4 = var6; idx4 > var12; idx3 += inc0, idx4 += inc2 */ ++ 0x0beac798, /* 0090(:1557): DRD1A: *idx1 = *idx3; FN=0 TFD init=31 WS=1 RS=1 */ ++ 0x81988000, /* 0094(:1559): LCD: idx1 = var3; idx1 once var0; idx1 += inc0 */ ++ 0x6000000b, /* 0098(:1560): DRD2A: EU0=0 EU1=0 EU2=0 EU3=11 EXT init=0 WS=0 RS=0 */ ++ 0x0c4cfc5f, /* 009C(:1560): DRD2B1: *idx1 = EU3(); EU3(*idx1) */ ++ 0x81c80000, /* 00A0(:1562): LCD: idx1 = var3 + var16; idx1 once var0; idx1 += inc0 */ ++ 0xc5190312, /* 00A4(:1564): LCDEXT: idx2 = var10; idx2 > var12; idx2 += inc2 */ ++ 0x80198000, /* 00A8(:1564): LCD: idx3 = var0; idx3 once var0; idx3 += inc0 */ ++ 0x00008400, /* 00AC(:1565): DRD1A: idx1 = var0; FN=0 init=0 WS=0 RS=0 */ ++ 0x00000f08, /* 00B0(:1566): DRD1A: var3 = idx1; FN=0 init=0 WS=0 RS=0 */ ++ 0x81988000, /* 00B4(:1569): LCD: idx1 = var3; idx1 once var0; idx1 += inc0 */ ++ 0x10000788, /* 00B8(:1570): DRD1A: var1 = *idx1; FN=0 MORE init=0 WS=0 RS=0 */ ++ 0x6000000a, /* 00BC(:1571): DRD2A: EU0=0 EU1=0 EU2=0 EU3=10 EXT init=0 WS=0 RS=0 */ ++ 0x080cf05f, /* 00C0(:1571): DRD2B1: idx0 = EU3(); EU3(var1) */ ++ 0xc2988309, /* 00C4(:1574): LCDEXT: idx1 = var5; idx1 != var12; idx1 += inc1 */ ++ 0x80190000, /* 00C8(:1574): LCD: idx2 = var0; idx2 once var0; idx2 += inc0 */ ++ 0x040001f8, /* 00CC(:1575): DRD1A: FN=0 INT init=0 WS=0 RS=0 */ + 0x000001f8, /* 00D0(:0): NOP */ + }; + ++#ifdef MCD_INCLUDE_EU ++MCD_bufDesc MCD_singleBufDescs[NCHANNELS]; ++#endif +--- a/drivers/dma/MCD_tasksInit.c ++++ b/drivers/dma/MCD_tasksInit.c +@@ -1,51 +1,34 @@ +-/********************************************************************* +- * +- * Copyright (C) 2004 Motorola, Inc. +- * MOTOROLA, INC. All Rights Reserved. +- * You are hereby granted a copyright license to use +- * the SOFTWARE so long as this entire notice is +- * retained without alteration in any modified and/or redistributed +- * versions, and that such modified versions are clearly identified +- * as such. No licenses are granted by implication, estoppel or +- * otherwise under any patents or trademarks of Motorola, Inc. This +- * software is provided on an "AS IS" basis and without warranty. +- * +- * To the maximum extent permitted by applicable law, MOTOROLA +- * DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED, INCLUDING +- * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR +- * PURPOSE AND ANY WARRANTY AGAINST INFRINGEMENT WITH REGARD TO THE +- * SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF) AND ANY +- * ACCOMPANYING WRITTEN MATERIALS. +- * +- * To the maximum extent permitted by applicable law, IN NO EVENT +- * SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER (INCLUDING +- * WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS +- * INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY +- * LOSS) ARISING OF THE USE OR INABILITY TO USE THE SOFTWARE. +- * +- * Motorola assumes no responsibility for the maintenance and support +- * of this software +- ********************************************************************/ + /* +- * Do not edit! +- */ +- /* +- * File: MCD_tasksInit.c +- * Purpose: Function for initialize variable tables of different +- * types of tasks. ++ * drivers/dma/MCD_tasksInit.c + * +- * Notes: ++ * Copyright (C) 2004-2008 Freescale Semiconductor, Inc. ++ * Kurt Mahan <kmahan@freescale.com> + * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of ++ * the License, or (at your option) any later version. + * +- * Modifications: +- * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. + * +- */ ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++ * MA 02111-1307 USA ++ */ + +-#include <asm/MCD_dma.h> ++/* ++ * Autogenerated - Do not edit! ++ */ ++ ++#include "MCD_dma.h" + + extern dmaRegs *MCD_dmaBar; + ++ + /* + * Task 0 + */ +@@ -53,232 +36,203 @@ extern dmaRegs *MCD_dmaBar; + void MCD_startDmaChainNoEu(int *currBD, short srcIncr, short destIncr, int xferSize, short xferSizeIncr, int *cSave, volatile TaskTableEntry *taskTable, int channel) + { + +- MCD_SET_VAR(taskTable+channel, 2, (u32)currBD); /* var[2] */ +- MCD_SET_VAR(taskTable+channel, 25, (u32)(0xe000 << 16) | (0xffff & srcIncr)); /* inc[1] */ +- MCD_SET_VAR(taskTable+channel, 24, (u32)(0xe000 << 16) | (0xffff & destIncr)); /* inc[0] */ +- MCD_SET_VAR(taskTable+channel, 19, (u32)xferSize); /* var[19] */ +- MCD_SET_VAR(taskTable+channel, 26, (u32)(0x2000 << 16) | (0xffff & xferSizeIncr)); /* inc[2] */ +- MCD_SET_VAR(taskTable+channel, 0, (u32)cSave); /* var[0] */ +- MCD_SET_VAR(taskTable+channel, 1, (u32)0x00000000); /* var[1] */ +- MCD_SET_VAR(taskTable+channel, 3, (u32)0x00000000); /* var[3] */ +- MCD_SET_VAR(taskTable+channel, 4, (u32)0x00000000); /* var[4] */ +- MCD_SET_VAR(taskTable+channel, 5, (u32)0x00000000); /* var[5] */ +- MCD_SET_VAR(taskTable+channel, 6, (u32)0x00000000); /* var[6] */ +- MCD_SET_VAR(taskTable+channel, 7, (u32)0x00000000); /* var[7] */ +- MCD_SET_VAR(taskTable+channel, 8, (u32)0x00000000); /* var[8] */ +- MCD_SET_VAR(taskTable+channel, 9, (u32)0x00000000); /* var[9] */ +- MCD_SET_VAR(taskTable+channel, 10, (u32)0x00000000); /* var[10] */ +- MCD_SET_VAR(taskTable+channel, 11, (u32)0x00000000); /* var[11] */ +- MCD_SET_VAR(taskTable+channel, 12, (u32)0x00000000); /* var[12] */ +- MCD_SET_VAR(taskTable+channel, 13, (u32)0x00000000); /* var[13] */ +- MCD_SET_VAR(taskTable+channel, 14, (u32)0x00000000); /* var[14] */ +- MCD_SET_VAR(taskTable+channel, 15, (u32)0x00000000); /* var[15] */ +- MCD_SET_VAR(taskTable+channel, 16, (u32)0x00000000); /* var[16] */ +- MCD_SET_VAR(taskTable+channel, 17, (u32)0x00000000); /* var[17] */ +- MCD_SET_VAR(taskTable+channel, 18, (u32)0x00000000); /* var[18] */ +- MCD_SET_VAR(taskTable+channel, 20, (u32)0x00000000); /* var[20] */ +- MCD_SET_VAR(taskTable+channel, 21, (u32)0x00000010); /* var[21] */ +- MCD_SET_VAR(taskTable+channel, 22, (u32)0x00000004); /* var[22] */ +- MCD_SET_VAR(taskTable+channel, 23, (u32)0x00000080); /* var[23] */ +- MCD_SET_VAR(taskTable+channel, 27, (u32)0x00000000); /* inc[3] */ +- MCD_SET_VAR(taskTable+channel, 28, (u32)0x60000000); /* inc[4] */ +- MCD_SET_VAR(taskTable+channel, 29, (u32)0x80000001); /* inc[5] */ +- MCD_SET_VAR(taskTable+channel, 30, (u32)0x80000000); /* inc[6] */ +- MCD_SET_VAR(taskTable+channel, 31, (u32)0x40000000); /* inc[7] */ ++ MCD_SET_VAR(taskTable+channel, 2, (u32)currBD); /* var[2] */ ++ MCD_SET_VAR(taskTable+channel, 25, (u32)(0xe000 << 16) | (0xffff & srcIncr)); /* inc[1] */ ++ MCD_SET_VAR(taskTable+channel, 24, (u32)(0xe000 << 16) | (0xffff & destIncr)); /* inc[0] */ ++ MCD_SET_VAR(taskTable+channel, 11, (u32)xferSize); /* var[11] */ ++ MCD_SET_VAR(taskTable+channel, 26, (u32)(0x2000 << 16) | (0xffff & xferSizeIncr)); /* inc[2] */ ++ MCD_SET_VAR(taskTable+channel, 0, (u32)cSave); /* var[0] */ ++ MCD_SET_VAR(taskTable+channel, 1, (u32)0x00000000); /* var[1] */ ++ MCD_SET_VAR(taskTable+channel, 3, (u32)0x00000000); /* var[3] */ ++ MCD_SET_VAR(taskTable+channel, 4, (u32)0x00000000); /* var[4] */ ++ MCD_SET_VAR(taskTable+channel, 5, (u32)0x00000000); /* var[5] */ ++ MCD_SET_VAR(taskTable+channel, 6, (u32)0x00000000); /* var[6] */ ++ MCD_SET_VAR(taskTable+channel, 7, (u32)0x00000000); /* var[7] */ ++ MCD_SET_VAR(taskTable+channel, 8, (u32)0x00000000); /* var[8] */ ++ MCD_SET_VAR(taskTable+channel, 9, (u32)0x00000000); /* var[9] */ ++ MCD_SET_VAR(taskTable+channel, 10, (u32)0x00000000); /* var[10] */ ++ MCD_SET_VAR(taskTable+channel, 12, (u32)0x00000000); /* var[12] */ ++ MCD_SET_VAR(taskTable+channel, 13, (u32)0x80000000); /* var[13] */ ++ MCD_SET_VAR(taskTable+channel, 14, (u32)0x00000010); /* var[14] */ ++ MCD_SET_VAR(taskTable+channel, 15, (u32)0x00000004); /* var[15] */ ++ MCD_SET_VAR(taskTable+channel, 16, (u32)0x08000000); /* var[16] */ ++ MCD_SET_VAR(taskTable+channel, 27, (u32)0x00000000); /* inc[3] */ ++ MCD_SET_VAR(taskTable+channel, 28, (u32)0x80000000); /* inc[4] */ ++ MCD_SET_VAR(taskTable+channel, 29, (u32)0x80000001); /* inc[5] */ ++ MCD_SET_VAR(taskTable+channel, 30, (u32)0x40000000); /* inc[6] */ + + /* Set the task's Enable bit in its Task Control Register */ +- MCD_dmaBar->taskControl[channel] |= (u16)0x8000; /* add a MACRO HERE TBD*/ +- +- ++ MCD_dmaBar->taskControl[channel] |= (u16)0x8000; + } + + + /* + * Task 1 + */ +- +-void MCD_startDmaSingleNoEu(char *srcAddr, short srcIncr, char *destAddr, short destIncr, int dmaSize, int dmaSizeMXferSize, short xferSizeIncr, int flags, int *currBD, int *cSave, volatile TaskTableEntry *taskTable, int channel) ++ ++void MCD_startDmaSingleNoEu(char *srcAddr, short srcIncr, char *destAddr, short destIncr, int dmaSize, short xferSizeIncr, int flags, int *currBD, int *cSave, volatile TaskTableEntry *taskTable, int channel) + { +- +- MCD_SET_VAR(taskTable+channel, 13, (u32)srcAddr); /* var[13] */ +- MCD_SET_VAR(taskTable+channel, 25, (u32)(0xe000 << 16) | (0xffff & srcIncr)); /* inc[1] */ +- MCD_SET_VAR(taskTable+channel, 4, (u32)destAddr); /* var[4] */ +- MCD_SET_VAR(taskTable+channel, 24, (u32)(0xe000 << 16) | (0xffff & destIncr)); /* inc[0] */ +- MCD_SET_VAR(taskTable+channel, 6, (u32)dmaSize); /* var[6] */ +- MCD_SET_VAR(taskTable+channel, 7, (u32)dmaSizeMXferSize); /* var[7] */ +- MCD_SET_VAR(taskTable+channel, 26, (u32)(0x2000 << 16) | (0xffff & xferSizeIncr)); /* inc[2] */ +- MCD_SET_VAR(taskTable+channel, 9, (u32)flags); /* var[9] */ +- MCD_SET_VAR(taskTable+channel, 1, (u32)currBD); /* var[1] */ +- MCD_SET_VAR(taskTable+channel, 0, (u32)cSave); /* var[0] */ +- MCD_SET_VAR(taskTable+channel, 2, (u32)0x00000000); /* var[2] */ +- MCD_SET_VAR(taskTable+channel, 3, (u32)0x00000000); /* var[3] */ +- MCD_SET_VAR(taskTable+channel, 5, (u32)0x00000000); /* var[5] */ +- MCD_SET_VAR(taskTable+channel, 8, (u32)0x00000000); /* var[8] */ +- MCD_SET_VAR(taskTable+channel, 10, (u32)0x00000000); /* var[10] */ +- MCD_SET_VAR(taskTable+channel, 11, (u32)0x00000000); /* var[11] */ +- MCD_SET_VAR(taskTable+channel, 12, (u32)0x00000000); /* var[12] */ +- MCD_SET_VAR(taskTable+channel, 14, (u32)0x00000000); /* var[14] */ +- MCD_SET_VAR(taskTable+channel, 15, (u32)0x00000000); /* var[15] */ +- MCD_SET_VAR(taskTable+channel, 16, (u32)0x00000004); /* var[16] */ +- MCD_SET_VAR(taskTable+channel, 17, (u32)0x00000080); /* var[17] */ +- MCD_SET_VAR(taskTable+channel, 27, (u32)0x00000000); /* inc[3] */ +- MCD_SET_VAR(taskTable+channel, 28, (u32)0x80000001); /* inc[4] */ +- MCD_SET_VAR(taskTable+channel, 29, (u32)0x40000000); /* inc[5] */ + ++ MCD_SET_VAR(taskTable+channel, 7, (u32)srcAddr); /* var[7] */ ++ MCD_SET_VAR(taskTable+channel, 25, (u32)(0xe000 << 16) | (0xffff & srcIncr)); /* inc[1] */ ++ MCD_SET_VAR(taskTable+channel, 2, (u32)destAddr); /* var[2] */ ++ MCD_SET_VAR(taskTable+channel, 24, (u32)(0xe000 << 16) | (0xffff & destIncr)); /* inc[0] */ ++ MCD_SET_VAR(taskTable+channel, 3, (u32)dmaSize); /* var[3] */ ++ MCD_SET_VAR(taskTable+channel, 26, (u32)(0x2000 << 16) | (0xffff & xferSizeIncr)); /* inc[2] */ ++ MCD_SET_VAR(taskTable+channel, 5, (u32)flags); /* var[5] */ ++ MCD_SET_VAR(taskTable+channel, 1, (u32)currBD); /* var[1] */ ++ MCD_SET_VAR(taskTable+channel, 0, (u32)cSave); /* var[0] */ ++ MCD_SET_VAR(taskTable+channel, 4, (u32)0x00000000); /* var[4] */ ++ MCD_SET_VAR(taskTable+channel, 6, (u32)0x00000000); /* var[6] */ ++ MCD_SET_VAR(taskTable+channel, 8, (u32)0x00000000); /* var[8] */ ++ MCD_SET_VAR(taskTable+channel, 9, (u32)0x00000004); /* var[9] */ ++ MCD_SET_VAR(taskTable+channel, 10, (u32)0x08000000); /* var[10] */ ++ MCD_SET_VAR(taskTable+channel, 27, (u32)0x00000000); /* inc[3] */ ++ MCD_SET_VAR(taskTable+channel, 28, (u32)0x80000001); /* inc[4] */ ++ MCD_SET_VAR(taskTable+channel, 29, (u32)0x40000000); /* inc[5] */ + +- /* enable the task */ +- MCD_dmaBar->taskControl[channel] |= (u16)0x8000; /* add a MACRO HERE TBD*/ ++ /* Set the task's Enable bit in its Task Control Register */ ++ MCD_dmaBar->taskControl[channel] |= (u16)0x8000; + } + + + /* + * Task 2 + */ +- ++ + void MCD_startDmaChainEu(int *currBD, short srcIncr, short destIncr, int xferSize, short xferSizeIncr, int *cSave, volatile TaskTableEntry *taskTable, int channel) + { +- +- MCD_SET_VAR(taskTable+channel, 2, (u32)currBD); /* var[2] */ +- MCD_SET_VAR(taskTable+channel, 25, (u32)(0xe000 << 16) | (0xffff & srcIncr)); /* inc[1] */ +- MCD_SET_VAR(taskTable+channel, 24, (u32)(0xe000 << 16) | (0xffff & destIncr)); /* inc[0] */ +- MCD_SET_VAR(taskTable+channel, 19, (u32)xferSize); /* var[19] */ +- MCD_SET_VAR(taskTable+channel, 26, (u32)(0x2000 << 16) | (0xffff & xferSizeIncr)); /* inc[2] */ +- MCD_SET_VAR(taskTable+channel, 0, (u32)cSave); /* var[0] */ +- MCD_SET_VAR(taskTable+channel, 1, (u32)0x00000000); /* var[1] */ +- MCD_SET_VAR(taskTable+channel, 3, (u32)0x00000000); /* var[3] */ +- MCD_SET_VAR(taskTable+channel, 4, (u32)0x00000000); /* var[4] */ +- MCD_SET_VAR(taskTable+channel, 5, (u32)0x00000000); /* var[5] */ +- MCD_SET_VAR(taskTable+channel, 6, (u32)0x00000000); /* var[6] */ +- MCD_SET_VAR(taskTable+channel, 7, (u32)0x00000000); /* var[7] */ +- MCD_SET_VAR(taskTable+channel, 8, (u32)0x00000000); /* var[8] */ +- MCD_SET_VAR(taskTable+channel, 9, (u32)0x00000000); /* var[9] */ +- MCD_SET_VAR(taskTable+channel, 10, (u32)0x00000000); /* var[10] */ +- MCD_SET_VAR(taskTable+channel, 11, (u32)0x00000000); /* var[11] */ +- MCD_SET_VAR(taskTable+channel, 12, (u32)0x00000000); /* var[12] */ +- MCD_SET_VAR(taskTable+channel, 13, (u32)0x00000000); /* var[13] */ +- MCD_SET_VAR(taskTable+channel, 14, (u32)0x00000000); /* var[14] */ +- MCD_SET_VAR(taskTable+channel, 15, (u32)0x00000000); /* var[15] */ +- MCD_SET_VAR(taskTable+channel, 16, (u32)0x00000000); /* var[16] */ +- MCD_SET_VAR(taskTable+channel, 17, (u32)0x00000000); /* var[17] */ +- MCD_SET_VAR(taskTable+channel, 18, (u32)0x00000000); /* var[18] */ +- MCD_SET_VAR(taskTable+channel, 20, (u32)0x00000000); /* var[20] */ +- MCD_SET_VAR(taskTable+channel, 21, (u32)0x00000010); /* var[21] */ +- MCD_SET_VAR(taskTable+channel, 22, (u32)0x00000004); /* var[22] */ +- MCD_SET_VAR(taskTable+channel, 23, (u32)0x00000080); /* var[23] */ +- MCD_SET_VAR(taskTable+channel, 27, (u32)0x00000000); /* inc[3] */ +- MCD_SET_VAR(taskTable+channel, 28, (u32)0x60000000); /* inc[4] */ +- MCD_SET_VAR(taskTable+channel, 29, (u32)0x80000001); /* inc[5] */ +- MCD_SET_VAR(taskTable+channel, 30, (u32)0x80000000); /* inc[6] */ +- MCD_SET_VAR(taskTable+channel, 31, (u32)0x40000000); /* inc[7] */ + +- /*enable the task*/ +- MCD_dmaBar->taskControl[channel] |= (u16)0x8000; /* add a MACRO HERE TBD*/ ++ MCD_SET_VAR(taskTable+channel, 3, (u32)currBD); /* var[3] */ ++ MCD_SET_VAR(taskTable+channel, 25, (u32)(0xe000 << 16) | (0xffff & srcIncr)); /* inc[1] */ ++ MCD_SET_VAR(taskTable+channel, 24, (u32)(0xe000 << 16) | (0xffff & destIncr)); /* inc[0] */ ++ MCD_SET_VAR(taskTable+channel, 12, (u32)xferSize); /* var[12] */ ++ MCD_SET_VAR(taskTable+channel, 26, (u32)(0x2000 << 16) | (0xffff & xferSizeIncr)); /* inc[2] */ ++ MCD_SET_VAR(taskTable+channel, 0, (u32)cSave); /* var[0] */ ++ MCD_SET_VAR(taskTable+channel, 1, (u32)0x00000000); /* var[1] */ ++ MCD_SET_VAR(taskTable+channel, 2, (u32)0x00000000); /* var[2] */ ++ MCD_SET_VAR(taskTable+channel, 4, (u32)0x00000000); /* var[4] */ ++ MCD_SET_VAR(taskTable+channel, 5, (u32)0x00000000); /* var[5] */ ++ MCD_SET_VAR(taskTable+channel, 6, (u32)0x00000000); /* var[6] */ ++ MCD_SET_VAR(taskTable+channel, 7, (u32)0x00000000); /* var[7] */ ++ MCD_SET_VAR(taskTable+channel, 8, (u32)0x00000000); /* var[8] */ ++ MCD_SET_VAR(taskTable+channel, 9, (u32)0x00000000); /* var[9] */ ++ MCD_SET_VAR(taskTable+channel, 10, (u32)0x00000000); /* var[10] */ ++ MCD_SET_VAR(taskTable+channel, 11, (u32)0x00000000); /* var[11] */ ++ MCD_SET_VAR(taskTable+channel, 13, (u32)0x00000000); /* var[13] */ ++ MCD_SET_VAR(taskTable+channel, 14, (u32)0x80000000); /* var[14] */ ++ MCD_SET_VAR(taskTable+channel, 15, (u32)0x00000010); /* var[15] */ ++ MCD_SET_VAR(taskTable+channel, 16, (u32)0x00000001); /* var[16] */ ++ MCD_SET_VAR(taskTable+channel, 17, (u32)0x00000004); /* var[17] */ ++ MCD_SET_VAR(taskTable+channel, 18, (u32)0x08000000); /* var[18] */ ++ MCD_SET_VAR(taskTable+channel, 27, (u32)0x00000000); /* inc[3] */ ++ MCD_SET_VAR(taskTable+channel, 28, (u32)0x80000000); /* inc[4] */ ++ MCD_SET_VAR(taskTable+channel, 29, (u32)0xc0000000); /* inc[5] */ ++ MCD_SET_VAR(taskTable+channel, 30, (u32)0x80000001); /* inc[6] */ ++ MCD_SET_VAR(taskTable+channel, 31, (u32)0x40000000); /* inc[7] */ ++ ++ /* Set the task's Enable bit in its Task Control Register */ ++ MCD_dmaBar->taskControl[channel] |= (u16)0x8000; + } + + + /* + * Task 3 + */ +- +-void MCD_startDmaSingleEu(char *srcAddr, short srcIncr, char *destAddr, short destIncr, int dmaSize, int dmaSizeMXferSize, short xferSizeIncr, int flags, int *currBD, int *cSave, volatile TaskTableEntry *taskTable, int channel) ++ ++void MCD_startDmaSingleEu(char *srcAddr, short srcIncr, char *destAddr, short destIncr, int dmaSize, short xferSizeIncr, int flags, int *currBD, int *cSave, volatile TaskTableEntry *taskTable, int channel) + { +- +- MCD_SET_VAR(taskTable+channel, 13, (u32)srcAddr); /* var[13] */ +- MCD_SET_VAR(taskTable+channel, 25, (u32)(0xe000 << 16) | (0xffff & srcIncr)); /* inc[1] */ +- MCD_SET_VAR(taskTable+channel, 4, (u32)destAddr); /* var[4] */ +- MCD_SET_VAR(taskTable+channel, 24, (u32)(0xe000 << 16) | (0xffff & destIncr)); /* inc[0] */ +- MCD_SET_VAR(taskTable+channel, 6, (u32)dmaSize); /* var[6] */ +- MCD_SET_VAR(taskTable+channel, 7, (u32)dmaSizeMXferSize); /* var[7] */ +- MCD_SET_VAR(taskTable+channel, 26, (u32)(0x2000 << 16) | (0xffff & xferSizeIncr)); /* inc[2] */ +- MCD_SET_VAR(taskTable+channel, 9, (u32)flags); /* var[9] */ +- MCD_SET_VAR(taskTable+channel, 1, (u32)currBD); /* var[1] */ +- MCD_SET_VAR(taskTable+channel, 0, (u32)cSave); /* var[0] */ +- MCD_SET_VAR(taskTable+channel, 2, (u32)0x00000000); /* var[2] */ +- MCD_SET_VAR(taskTable+channel, 3, (u32)0x00000000); /* var[3] */ +- MCD_SET_VAR(taskTable+channel, 5, (u32)0x00000000); /* var[5] */ +- MCD_SET_VAR(taskTable+channel, 8, (u32)0x00000000); /* var[8] */ +- MCD_SET_VAR(taskTable+channel, 10, (u32)0x00000000); /* var[10] */ +- MCD_SET_VAR(taskTable+channel, 11, (u32)0x00000000); /* var[11] */ +- MCD_SET_VAR(taskTable+channel, 12, (u32)0x00000000); /* var[12] */ +- MCD_SET_VAR(taskTable+channel, 14, (u32)0x00000000); /* var[14] */ +- MCD_SET_VAR(taskTable+channel, 15, (u32)0x00000000); /* var[15] */ +- MCD_SET_VAR(taskTable+channel, 16, (u32)0x00000004); /* var[16] */ +- MCD_SET_VAR(taskTable+channel, 17, (u32)0x00000080); /* var[17] */ +- MCD_SET_VAR(taskTable+channel, 27, (u32)0x00000000); /* inc[3] */ +- MCD_SET_VAR(taskTable+channel, 28, (u32)0x80000001); /* inc[4] */ +- MCD_SET_VAR(taskTable+channel, 29, (u32)0x40000000); /* inc[5] */ + +- /*enable the task*/ +- MCD_dmaBar->taskControl[channel] |= (u16)0x8000; /* add a MACRO HERE TBD*/ ++ MCD_SET_VAR(taskTable+channel, 8, (u32)srcAddr); /* var[8] */ ++ MCD_SET_VAR(taskTable+channel, 25, (u32)(0xe000 << 16) | (0xffff & srcIncr)); /* inc[1] */ ++ MCD_SET_VAR(taskTable+channel, 3, (u32)destAddr); /* var[3] */ ++ MCD_SET_VAR(taskTable+channel, 24, (u32)(0xe000 << 16) | (0xffff & destIncr)); /* inc[0] */ ++ MCD_SET_VAR(taskTable+channel, 4, (u32)dmaSize); /* var[4] */ ++ MCD_SET_VAR(taskTable+channel, 26, (u32)(0x2000 << 16) | (0xffff & xferSizeIncr)); /* inc[2] */ ++ MCD_SET_VAR(taskTable+channel, 6, (u32)flags); /* var[6] */ ++ MCD_SET_VAR(taskTable+channel, 2, (u32)currBD); /* var[2] */ ++ MCD_SET_VAR(taskTable+channel, 0, (u32)cSave); /* var[0] */ ++ MCD_SET_VAR(taskTable+channel, 1, (u32)0x00000000); /* var[1] */ ++ MCD_SET_VAR(taskTable+channel, 5, (u32)0x00000000); /* var[5] */ ++ MCD_SET_VAR(taskTable+channel, 7, (u32)0x00000000); /* var[7] */ ++ MCD_SET_VAR(taskTable+channel, 9, (u32)0x00000000); /* var[9] */ ++ MCD_SET_VAR(taskTable+channel, 10, (u32)0x00000001); /* var[10] */ ++ MCD_SET_VAR(taskTable+channel, 11, (u32)0x00000004); /* var[11] */ ++ MCD_SET_VAR(taskTable+channel, 12, (u32)0x08000000); /* var[12] */ ++ MCD_SET_VAR(taskTable+channel, 27, (u32)0x00000000); /* inc[3] */ ++ MCD_SET_VAR(taskTable+channel, 28, (u32)0xc0000000); /* inc[4] */ ++ MCD_SET_VAR(taskTable+channel, 29, (u32)0x80000000); /* inc[5] */ ++ MCD_SET_VAR(taskTable+channel, 30, (u32)0x80000001); /* inc[6] */ ++ MCD_SET_VAR(taskTable+channel, 31, (u32)0x40000000); /* inc[7] */ + ++ /* Set the task's Enable bit in its Task Control Register */ ++ MCD_dmaBar->taskControl[channel] |= (u16)0x8000; + } + + + /* + * Task 4 + */ +- ++ + void MCD_startDmaENetRcv(char *bDBase, char *currBD, char *rcvFifoPtr, volatile TaskTableEntry *taskTable, int channel) + { +- +- MCD_SET_VAR(taskTable+channel, 0, (u32)bDBase); /* var[0] */ +- MCD_SET_VAR(taskTable+channel, 4, (u32)currBD); /* var[4] */ +- MCD_SET_VAR(taskTable+channel, 7, (u32)rcvFifoPtr); /* var[7] */ +- MCD_SET_VAR(taskTable+channel, 1, (u32)0x00000000); /* var[1] */ +- MCD_SET_VAR(taskTable+channel, 2, (u32)0x00000000); /* var[2] */ +- MCD_SET_VAR(taskTable+channel, 3, (u32)0x00000000); /* var[3] */ +- MCD_SET_VAR(taskTable+channel, 5, (u32)0x00000000); /* var[5] */ +- MCD_SET_VAR(taskTable+channel, 6, (u32)0x00000000); /* var[6] */ +- MCD_SET_VAR(taskTable+channel, 8, (u32)0x00000000); /* var[8] */ +- MCD_SET_VAR(taskTable+channel, 9, (u32)0x00000000); /* var[9] */ +- MCD_SET_VAR(taskTable+channel, 10, (u32)0x0000ffff); /* var[10] */ +- MCD_SET_VAR(taskTable+channel, 11, (u32)0x30000000); /* var[11] */ +- MCD_SET_VAR(taskTable+channel, 12, (u32)0x0fffffff); /* var[12] */ +- MCD_SET_VAR(taskTable+channel, 13, (u32)0x00000008); /* var[13] */ +- MCD_SET_VAR(taskTable+channel, 24, (u32)0x00000000); /* inc[0] */ +- MCD_SET_VAR(taskTable+channel, 25, (u32)0x60000000); /* inc[1] */ +- MCD_SET_VAR(taskTable+channel, 26, (u32)0x20000004); /* inc[2] */ +- MCD_SET_VAR(taskTable+channel, 27, (u32)0x40000000); /* inc[3] */ +- /*enable the task*/ +- MCD_dmaBar->taskControl[channel] |= (u16)0x8000; /* add a MACRO HERE TBD*/ + ++ MCD_SET_VAR(taskTable+channel, 0, (u32)bDBase); /* var[0] */ ++ MCD_SET_VAR(taskTable+channel, 3, (u32)currBD); /* var[3] */ ++ MCD_SET_VAR(taskTable+channel, 6, (u32)rcvFifoPtr); /* var[6] */ ++ MCD_SET_VAR(taskTable+channel, 1, (u32)0x00000000); /* var[1] */ ++ MCD_SET_VAR(taskTable+channel, 2, (u32)0x00000000); /* var[2] */ ++ MCD_SET_VAR(taskTable+channel, 4, (u32)0x00000000); /* var[4] */ ++ MCD_SET_VAR(taskTable+channel, 5, (u32)0x00000000); /* var[5] */ ++ MCD_SET_VAR(taskTable+channel, 7, (u32)0x00000000); /* var[7] */ ++ MCD_SET_VAR(taskTable+channel, 8, (u32)0x00000000); /* var[8] */ ++ MCD_SET_VAR(taskTable+channel, 9, (u32)0x0000ffff); /* var[9] */ ++ MCD_SET_VAR(taskTable+channel, 10, (u32)0x30000000); /* var[10] */ ++ MCD_SET_VAR(taskTable+channel, 11, (u32)0x0fffffff); /* var[11] */ ++ MCD_SET_VAR(taskTable+channel, 12, (u32)0x00000008); /* var[12] */ ++ MCD_SET_VAR(taskTable+channel, 24, (u32)0x00000000); /* inc[0] */ ++ MCD_SET_VAR(taskTable+channel, 25, (u32)0x60000000); /* inc[1] */ ++ MCD_SET_VAR(taskTable+channel, 26, (u32)0x20000004); /* inc[2] */ ++ MCD_SET_VAR(taskTable+channel, 27, (u32)0x40000000); /* inc[3] */ ++ ++ /* Set the task's Enable bit in its Task Control Register */ ++ MCD_dmaBar->taskControl[channel] |= (u16)0x8000; + } + + + /* + * Task 5 + */ +- ++ + void MCD_startDmaENetXmit(char *bDBase, char *currBD, char *xmitFifoPtr, volatile TaskTableEntry *taskTable, int channel) + { +- +- MCD_SET_VAR(taskTable+channel, 0, (u32)bDBase); /* var[0] */ +- MCD_SET_VAR(taskTable+channel, 3, (u32)currBD); /* var[3] */ +- MCD_SET_VAR(taskTable+channel, 11, (u32)xmitFifoPtr); /* var[11] */ +- MCD_SET_VAR(taskTable+channel, 1, (u32)0x00000000); /* var[1] */ +- MCD_SET_VAR(taskTable+channel, 2, (u32)0x00000000); /* var[2] */ +- MCD_SET_VAR(taskTable+channel, 4, (u32)0x00000000); /* var[4] */ +- MCD_SET_VAR(taskTable+channel, 5, (u32)0x00000000); /* var[5] */ +- MCD_SET_VAR(taskTable+channel, 6, (u32)0x00000000); /* var[6] */ +- MCD_SET_VAR(taskTable+channel, 7, (u32)0x00000000); /* var[7] */ +- MCD_SET_VAR(taskTable+channel, 8, (u32)0x00000000); /* var[8] */ +- MCD_SET_VAR(taskTable+channel, 9, (u32)0x00000000); /* var[9] */ +- MCD_SET_VAR(taskTable+channel, 10, (u32)0x00000000); /* var[10] */ +- MCD_SET_VAR(taskTable+channel, 12, (u32)0x00000000); /* var[12] */ +- MCD_SET_VAR(taskTable+channel, 13, (u32)0x0000ffff); /* var[13] */ +- MCD_SET_VAR(taskTable+channel, 14, (u32)0xffffffff); /* var[14] */ +- MCD_SET_VAR(taskTable+channel, 15, (u32)0x00000004); /* var[15] */ +- MCD_SET_VAR(taskTable+channel, 16, (u32)0x00000008); /* var[16] */ +- MCD_SET_VAR(taskTable+channel, 24, (u32)0x00000000); /* inc[0] */ +- MCD_SET_VAR(taskTable+channel, 25, (u32)0x60000000); /* inc[1] */ +- MCD_SET_VAR(taskTable+channel, 26, (u32)0x40000000); /* inc[2] */ +- MCD_SET_VAR(taskTable+channel, 27, (u32)0xc000fffc); /* inc[3] */ +- MCD_SET_VAR(taskTable+channel, 28, (u32)0xe0000004); /* inc[4] */ +- MCD_SET_VAR(taskTable+channel, 29, (u32)0x80000000); /* inc[5] */ +- MCD_SET_VAR(taskTable+channel, 30, (u32)0x4000ffff); /* inc[6] */ +- MCD_SET_VAR(taskTable+channel, 31, (u32)0xe0000001); /* inc[7] */ + +- /*enable the task*/ +- MCD_dmaBar->taskControl[channel] |= (u16)0x8000; /* add a MACRO HERE TBD*/ ++ MCD_SET_VAR(taskTable+channel, 0, (u32)bDBase); /* var[0] */ ++ MCD_SET_VAR(taskTable+channel, 3, (u32)currBD); /* var[3] */ ++ MCD_SET_VAR(taskTable+channel, 11, (u32)xmitFifoPtr); /* var[11] */ ++ MCD_SET_VAR(taskTable+channel, 1, (u32)0x00000000); /* var[1] */ ++ MCD_SET_VAR(taskTable+channel, 2, (u32)0x00000000); /* var[2] */ ++ MCD_SET_VAR(taskTable+channel, 4, (u32)0x00000000); /* var[4] */ ++ MCD_SET_VAR(taskTable+channel, 5, (u32)0x00000000); /* var[5] */ ++ MCD_SET_VAR(taskTable+channel, 6, (u32)0x00000000); /* var[6] */ ++ MCD_SET_VAR(taskTable+channel, 7, (u32)0x00000000); /* var[7] */ ++ MCD_SET_VAR(taskTable+channel, 8, (u32)0x00000000); /* var[8] */ ++ MCD_SET_VAR(taskTable+channel, 9, (u32)0x00000000); /* var[9] */ ++ MCD_SET_VAR(taskTable+channel, 10, (u32)0x00000000); /* var[10] */ ++ MCD_SET_VAR(taskTable+channel, 12, (u32)0x00000000); /* var[12] */ ++ MCD_SET_VAR(taskTable+channel, 13, (u32)0x0000ffff); /* var[13] */ ++ MCD_SET_VAR(taskTable+channel, 14, (u32)0xffffffff); /* var[14] */ ++ MCD_SET_VAR(taskTable+channel, 15, (u32)0x00000004); /* var[15] */ ++ MCD_SET_VAR(taskTable+channel, 16, (u32)0x00000008); /* var[16] */ ++ MCD_SET_VAR(taskTable+channel, 24, (u32)0x00000000); /* inc[0] */ ++ MCD_SET_VAR(taskTable+channel, 25, (u32)0x60000000); /* inc[1] */ ++ MCD_SET_VAR(taskTable+channel, 26, (u32)0x40000000); /* inc[2] */ ++ MCD_SET_VAR(taskTable+channel, 27, (u32)0xc000fffc); /* inc[3] */ ++ MCD_SET_VAR(taskTable+channel, 28, (u32)0xe0000004); /* inc[4] */ ++ MCD_SET_VAR(taskTable+channel, 29, (u32)0x80000000); /* inc[5] */ ++ MCD_SET_VAR(taskTable+channel, 30, (u32)0x4000ffff); /* inc[6] */ ++ MCD_SET_VAR(taskTable+channel, 31, (u32)0xe0000001); /* inc[7] */ + ++ /* Set the task's Enable bit in its Task Control Register */ ++ MCD_dmaBar->taskControl[channel] |= (u16)0x8000; + } +--- a/drivers/dma/MCD_tasksInit.h ++++ b/drivers/dma/MCD_tasksInit.h +@@ -1,40 +1,31 @@ +-/********************************************************************* ++/* ++ * drivers/dma/MCD_tasksInit.h + * +- * Copyright (C) 2004 Motorola, Inc. +- * MOTOROLA, INC. All Rights Reserved. +- * You are hereby granted a copyright license to use +- * the SOFTWARE so long as this entire notice is +- * retained without alteration in any modified and/or redistributed +- * versions, and that such modified versions are clearly identified +- * as such. No licenses are granted by implication, estoppel or +- * otherwise under any patents or trademarks of Motorola, Inc. This +- * software is provided on an "AS IS" basis and without warranty. ++ * Copyright (C) 2004-2008 Freescale Semiconductor, Inc. ++ * Kurt Mahan <kmahan@freescale.com> + * +- * To the maximum extent permitted by applicable law, MOTOROLA +- * DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED, INCLUDING +- * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR +- * PURPOSE AND ANY WARRANTY AGAINST INFRINGEMENT WITH REGARD TO THE +- * SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF) AND ANY +- * ACCOMPANYING WRITTEN MATERIALS. ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of ++ * the License, or (at your option) any later version. + * +- * To the maximum extent permitted by applicable law, IN NO EVENT +- * SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER (INCLUDING +- * WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS +- * INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY +- * LOSS) ARISING OF THE USE OR INABILITY TO USE THE SOFTWARE. ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. + * +- * Motorola assumes no responsibility for the maintenance and support +- * of this software +- ********************************************************************/ ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++ * MA 02111-1307 USA ++ */ + #ifndef MCD_TSK_INIT_H + #define MCD_TSK_INIT_H 1 + + /* +- * Do not edit! ++ * Autogenerated - Do not edit! + */ + +- +- + /* + * Task 0 + */ +@@ -44,7 +35,7 @@ void MCD_startDmaChainNoEu(int *currBD, + /* + * Task 1 + */ +-void MCD_startDmaSingleNoEu(char *srcAddr, short srcIncr, char *destAddr, short destIncr, int dmaSize, int dmaSizeMXferSize, short xferSizeIncr, int flags, int *currBD, int *cSave, volatile TaskTableEntry *taskTable, int channel); ++void MCD_startDmaSingleNoEu(char *srcAddr, short srcIncr, char *destAddr, short destIncr, int dmaSize, short xferSizeIncr, int flags, int *currBD, int *cSave, volatile TaskTableEntry *taskTable, int channel); + + + /* +@@ -56,7 +47,7 @@ void MCD_startDmaChainEu(int *currBD, s + /* + * Task 3 + */ +-void MCD_startDmaSingleEu(char *srcAddr, short srcIncr, char *destAddr, short destIncr, int dmaSize, int dmaSizeMXferSize, short xferSizeIncr, int flags, int *currBD, int *cSave, volatile TaskTableEntry *taskTable, int channel); ++void MCD_startDmaSingleEu(char *srcAddr, short srcIncr, char *destAddr, short destIncr, int dmaSize, short xferSizeIncr, int flags, int *currBD, int *cSave, volatile TaskTableEntry *taskTable, int channel); + + + /* diff --git a/target/linux/coldfire/patches/052-m547x_8x_dspi.patch b/target/linux/coldfire/patches/052-m547x_8x_dspi.patch new file mode 100644 index 0000000000..c9277f8cb7 --- /dev/null +++ b/target/linux/coldfire/patches/052-m547x_8x_dspi.patch @@ -0,0 +1,1137 @@ +From acc2bc0cd419c176820d4a384eb36498a066366d Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Wed, 30 Apr 2008 14:20:48 -0600 +Subject: [PATCH] DSPI support for M547x/M548x. + +LTIBName: m547x-8x-dspi +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + arch/m68k/coldfire/Makefile | 1 + + arch/m68k/coldfire/m547x_8x-devices.c | 150 +++++++++++++ + drivers/spi/Makefile | 3 +- + drivers/spi/spi_coldfire.c | 382 ++++++++++++++++----------------- + include/asm-m68k/m5485dspi.h | 144 +++++++++++++ + include/asm-m68k/mcfqspi.h | 1 + + include/asm-m68k/mcfsim.h | 1 + + 7 files changed, 485 insertions(+), 197 deletions(-) + create mode 100644 arch/m68k/coldfire/m547x_8x-devices.c + create mode 100644 include/asm-m68k/m5485dspi.h + +--- a/arch/m68k/coldfire/Makefile ++++ b/arch/m68k/coldfire/Makefile +@@ -10,4 +10,5 @@ endif + + obj-$(CONFIG_PCI) += pci.o mcf5445x-pci.o iomap.o + obj-$(CONFIG_M54455) += mcf5445x-devices.o ++obj-$(CONFIG_M547X_8X) += m547x_8x-devices.o + obj-$(CONFIG_MCD_DMA) += m547x_8x-dma.o +--- /dev/null ++++ b/arch/m68k/coldfire/m547x_8x-devices.c +@@ -0,0 +1,150 @@ ++/* ++ * arch/m68k/coldfire/m547x_8x-devices.c ++ * ++ * Coldfire M547x/M548x Platform Device Configuration ++ * ++ * Copyright (c) 2008 Freescale Semiconductor, Inc. ++ * Kurt Mahan <kmahan@freescale.com> ++ */ ++#include <linux/module.h> ++#include <linux/kernel.h> ++#include <linux/init.h> ++#include <linux/platform_device.h> ++#include <linux/fsl_devices.h> ++#include <linux/spi/spi.h> ++ ++#include <asm/coldfire.h> ++#include <asm/mcfsim.h> ++#include <asm/mcfqspi.h> ++ ++ ++#ifdef CONFIG_SPI ++/* ++ * ++ * DSPI ++ * ++ */ ++ ++/* number of supported SPI selects */ ++#define SPI_NUM_CHIPSELECTS 4 ++ ++void coldfire_spi_cs_control(u8 cs, u8 command) ++{ ++ /* nothing special required */ ++} ++ ++static struct spi_board_info spi_board_info[] = { ++ /* no board info */ ++}; ++ ++static int spi_irq_list[] = { ++ /* IRQ, ICR Offset, ICR Val, Mask */ ++ 64 + ISC_DSPI_OVRFW, 0, 0, 0, ++ 64 + ISC_DSPI_RFOF, 0, 0, 0, ++ 64 + ISC_DSPI_RFDF, 0, 0, 0, ++ 64 + ISC_DSPI_TFUF, 0, 0, 0, ++ 64 + ISC_DSPI_TCF, 0, 0, 0, ++ 64 + ISC_DSPI_TFFF, 0, 0, 0, ++ 64 + ISC_DSPI_EOQF, 0, 0, 0, ++ 0,0,0,0, ++}; ++ ++static struct coldfire_spi_master coldfire_master_info = { ++ .bus_num = 1, ++ .num_chipselect = SPI_NUM_CHIPSELECTS, ++ .irq_list = spi_irq_list, ++ .irq_source = 0, /* not used */ ++ .irq_vector = 0, /* not used */ ++ .irq_mask = 0, /* not used */ ++ .irq_lp = 0, /* not used */ ++ .par_val = 0, /* not used */ ++ .cs_control = coldfire_spi_cs_control, ++}; ++ ++static struct resource coldfire_spi_resources[] = { ++ [0] = { ++ .name = "spi-par", ++ .start = MCF_MBAR + 0x00000a50, /* PAR_DSPI */ ++ .end = MCF_MBAR + 0x00000a50, /* PAR_DSPI */ ++ .flags = IORESOURCE_MEM ++ }, ++ ++ [1] = { ++ .name = "spi-module", ++ .start = MCF_MBAR + 0x00008a00, /* DSPI MCR Base */ ++ .end = MCF_MBAR + 0x00008ab8, /* DSPI mem map end */ ++ .flags = IORESOURCE_MEM ++ }, ++ ++ [2] = { ++ .name = "spi-int-level", ++ .start = MCF_MBAR + 0x740, /* ICR start */ ++ .end = MCF_MBAR + 0x740 + ISC_DSPI_EOQF, /* ICR end */ ++ .flags = IORESOURCE_MEM ++ }, ++ ++ [3] = { ++ .name = "spi-int-mask", ++ .start = MCF_MBAR + 0x70c, /* IMRL */ ++ .end = MCF_MBAR + 0x70c, /* IMRL */ ++ .flags = IORESOURCE_MEM ++ } ++}; ++ ++static struct platform_device coldfire_spi = { ++ .name = "spi_coldfire", ++ .id = -1, ++ .resource = coldfire_spi_resources, ++ .num_resources = ARRAY_SIZE(coldfire_spi_resources), ++ .dev = { ++ .platform_data = &coldfire_master_info, ++ } ++}; ++ ++/** ++ * m547x_8x_spi_init - Initialize SPI ++ */ ++static int __init m547x_8x_spi_init(void) ++{ ++ int retval; ++ ++ /* initialize the DSPI PAR */ ++ MCF_GPIO_PAR_DSPI = (MCF_GPIO_PAR_DSPI_PAR_CS5 | ++ MCF_GPIO_PAR_DSPI_PAR_CS3_DSPICS | ++ MCF_GPIO_PAR_DSPI_PAR_CS2_DSPICS | ++ MCF_GPIO_PAR_DSPI_PAR_CS0_DSPICS | ++ MCF_GPIO_PAR_DSPI_PAR_SCK_SCK | ++ MCF_GPIO_PAR_DSPI_PAR_SIN_SIN | ++ MCF_GPIO_PAR_DSPI_PAR_SOUT_SOUT); ++ ++ /* register device */ ++ retval = platform_device_register(&coldfire_spi); ++ if (retval < 0) { ++ printk(KERN_ERR "SPI-m547x_8x: platform_device_register failed with code=%d\n", retval); ++ goto out; ++ } ++ ++ /* register board info */ ++ if (ARRAY_SIZE(spi_board_info)) ++ retval = spi_register_board_info(spi_board_info, ARRAY_SIZE(spi_board_info)); ++ ++out: ++ return retval; ++} ++#endif ++ ++ ++/** ++ * m547x_8x_init_devices - Initialize M547X_8X devices ++ * ++ * Returns 0 on success. ++ */ ++static int __init m547x_8x_init_devices(void) ++{ ++#ifdef CONFIG_SPI ++ m547x_8x_spi_init(); ++#endif ++ ++ return 0; ++} ++arch_initcall(m547x_8x_init_devices); +--- a/drivers/spi/Makefile ++++ b/drivers/spi/Makefile +@@ -18,7 +18,8 @@ obj-$(CONFIG_SPI_BFIN) += spi_bfin5xx. + obj-$(CONFIG_SPI_BITBANG) += spi_bitbang.o + obj-$(CONFIG_SPI_AU1550) += au1550_spi.o + obj-$(CONFIG_SPI_BUTTERFLY) += spi_butterfly.o +-obj-$(CONFIG_SPI_COLDFIRE) += spi_coldfire.o spi-m5445x.o ++# obj-$(CONFIG_SPI_COLDFIRE) += spi_coldfire.o spi-m5445x.o ++obj-$(CONFIG_SPI_COLDFIRE) += spi_coldfire.o + obj-$(CONFIG_SPI_GPIO) += spi_gpio.o + obj-$(CONFIG_SPI_IMX) += spi_imx.o + obj-$(CONFIG_SPI_LM70_LLP) += spi_lm70llp.o +--- a/drivers/spi/spi_coldfire.c ++++ b/drivers/spi/spi_coldfire.c +@@ -1,29 +1,39 @@ +-/****************************************************************************/ +- + /* +- * spi_coldfire.c - Master QSPI/DSPI controller for the ColdFire processors ++ * spi_coldfire.c - Master QSPI/DSPI controller for the ColdFire processors ++ * + * + * (C) Copyright 2005, Intec Automation, + * Mike Lavender (mike@steroidmicros) + * +- * (C) Copyright 2007, Freescale Inc, +- * Yaroslav Vinogradov (yaroslav.vinogradov@freescale.com) ++ * (C) Copyright 2007-2008, Freescale Inc, ++ * Yaroslav Vinogradov ++ * Andrey Butok ++ * Kurt Mahan + * +- +- This program is free software; you can redistribute it and/or modify +- it under the terms of the GNU General Public License as published by +- the Free Software Foundation; either version 2 of the License, or +- (at your option) any later version. +- +- This program is distributed in the hope that it will be useful, +- but WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +- GNU General Public License for more details. +- +- You should have received a copy of the GNU General Public License +- along with this program; if not, write to the Free Software +- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +-/* ------------------------------------------------------------------------- */ ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ++ * ++ *************************************************************************** ++ * Changes: ++ * v0.003 12 February 2008 Andrey Butok, Freescale Semiconductor ++ * Added suport of MCF5227x DSPI module. ++ * v0.002 2007 Yaroslav Vinogradov, Freescale Semiconductor ++ * Added suport of MCF5445x DSPI module. ++ * v0.001 2005 Mike Lavender, Intec Automation, ++ * Intial version. Coldfire QSPI master driver. ++ * ++ */ + + + /****************************************************************************/ +@@ -46,41 +56,52 @@ + #include <asm/mcfsim.h> + #include <asm/mcfqspi.h> + #include <asm/coldfire.h> +-#include <asm/virtconvert.h> + + #if defined(CONFIG_M54455) ++ #include <asm/virtconvert.h> ++ + #define SPI_DSPI + #if defined(CONFIG_SPI_COLDFIRE_DSPI_EDMA) + #define SPI_DSPI_EDMA + #ifdef CONFIG_MMU + #define SPI_USE_MMU + #endif ++ #include <asm/mcf5445x_edma.h> + #endif ++ ++ #include <asm/mcf5445x_dspi.h> + #endif + +-#ifdef SPI_DSPI +-#include <asm/mcf5445x_dspi.h> ++#if defined(CONFIG_M547X_8X) ++ #define SPI_DSPI ++ ++ #include <asm/virtconvert.h> ++ #include <asm/m5485dspi.h> ++#endif + ++#ifdef CONFIG_M5227x ++ #define SPI_DSPI + ++ #if defined(CONFIG_SPI_COLDFIRE_DSPI_EDMA) ++ #define SPI_DSPI_EDMA ++ #endif + #endif + ++ + #if defined(SPI_DSPI_EDMA) + + /* edma buffer size in transfer units (32bits) */ + #define EDMA_BUFFER_SIZE (PAGE_SIZE/4) +-#define EDMA_BUFSIZE_KMALLOC (EDMA_BUFFER_SIZE*4) +- +-#define DSPI_DMA_RX_TCD 12 +-#define DSPI_DMA_TX_TCD 13 ++#define EDMA_BUFSIZE_KMALLOC (EDMA_BUFFER_SIZE*4) + ++#define DSPI_DMA_RX_TCD MCF_EDMA_CHAN_DSPI_RX ++#define DSPI_DMA_TX_TCD MCF_EDMA_CHAN_DSPI_TX + +-#include <asm/coldfire_edma.h> +-#include <asm/mcf5445x_edma.h> ++#include <asm/mcf_edma.h> + #endif + +- + MODULE_AUTHOR("Mike Lavender"); +-MODULE_DESCRIPTION("ColdFire QSPI Contoller"); ++MODULE_DESCRIPTION("ColdFire SPI Contoller"); + MODULE_LICENSE("GPL"); + + #define DRIVER_NAME "Coldfire QSPI/DSPI" +@@ -92,7 +113,6 @@ MODULE_LICENSE("GPL"); + */ + + #define QSPI_RAM_SIZE 0x10 /* 16 word table */ +- + #define QSPI_TRANSMIT_RAM 0x00 + #define QSPI_RECEIVE_RAM 0x10 + #define QSPI_COMMAND_RAM 0x20 +@@ -296,13 +316,10 @@ struct driver_data { + u32 *dspi_rser; /* DSPI RSER register */ + u32 *dspi_sr; /* DSPI status register */ + u8 dspi_ctas; /* DSPI CTAS value*/ +- + #if defined(SPI_DSPI_EDMA) + void* edma_tx_buf; + void* edma_rx_buf; + #endif +- +- + #else + u16 *qmr; /* QSPI mode register */ + u16 *qdlyr; /* QSPI delay register */ +@@ -312,7 +329,11 @@ struct driver_data { + u16 *qdr; /* QSPI data register */ + u16 *qcr; /* QSPI command register */ + #endif ++#if defined(CONFIG_M532x) || defined(CONFIG_M537x) ++ u16 *par; /* Pin assignment register */ ++#else + u8 *par; /* Pin assignment register */ ++#endif + u8 *int_icr; /* Interrupt level and priority register */ + u32 *int_mr; /* Interrupt mask register */ + void (*cs_control)(u8 cs, u8 command); +@@ -327,8 +348,6 @@ struct driver_data { + * SPI local functions + */ + +-//#define SPI_COLDFIRE_DEBUG +- + static void *next_transfer(struct driver_data *drv_data) + { + struct spi_message *msg = drv_data->cur_msg; +@@ -387,11 +406,9 @@ static int write(struct driver_data *drv + int tx_word; + + #if defined(SPI_DSPI) +- + #if defined(SPI_DSPI_EDMA) + u32* edma_wr; + #endif +- + u16 d16; + u8 d8; + u32 dspi_pushr; +@@ -400,9 +417,9 @@ static int write(struct driver_data *drv + + tx_word = is_word_transfer(drv_data); + +- // If we are in word mode, but only have a single byte to transfer +- // then switch to byte mode temporarily. Will switch back at the +- // end of the transfer. ++ /* If we are in word mode, but only have a single byte to transfer ++ * then switch to byte mode temporarily. Will switch back at the ++ * end of the transfer. */ + if (tx_word && ((drv_data->tx_end - drv_data->tx) == 1)) { + drv_data->flags |= TRAN_STATE_WORD_ODD_NUM; + set_8bit_transfer_mode(drv_data); +@@ -411,12 +428,10 @@ static int write(struct driver_data *drv + + + #if defined(SPI_DSPI) +- + #if defined(SPI_DSPI_EDMA) + edma_wr = (u32*)(drv_data->edma_tx_buf); + #endif + +- + #if defined(SPI_DSPI_EDMA) + while ((drv_data->tx < drv_data->tx_end) && (tx_count < EDMA_BUFFER_SIZE)) { + #else +@@ -432,19 +447,16 @@ static int write(struct driver_data *drv + } + + dspi_pushr = MCF_DSPI_DTFR_TXDATA(d16) +- | DSPI_CS(drv_data->cs) +- | MCF_DSPI_DTFR_CTAS(drv_data->dspi_ctas) +- //| MCF_DSPI_DTFR_CONT +- ; +- ++ | DSPI_CS(drv_data->cs) ++ | MCF_DSPI_DTFR_CTAS(drv_data->dspi_ctas); + drv_data->tx += 2; + + #if defined(SPI_DSPI_EDMA) + if (drv_data->tx == drv_data->tx_end || tx_count==EDMA_BUFFER_SIZE-1) { +-#else ++#else + if (drv_data->tx == drv_data->tx_end || tx_count==DSPI_FIFO_SIZE-1) { +-#endif +- // last transfer in queue ++#endif ++ /* last transfer in the queue */ + dspi_pushr |= MCF_DSPI_DTFR_EOQ; + if (drv_data->cs_change) { + dspi_pushr &= ~MCF_DSPI_DTFR_CONT; +@@ -453,14 +465,13 @@ static int write(struct driver_data *drv + + if (first) { + first = 0; +- dspi_pushr |= MCF_DSPI_DTFR_CTCNT; // clear counter ++ dspi_pushr |= MCF_DSPI_DTFR_CTCNT; /* clear counter */ + } + #if defined(SPI_DSPI_EDMA) + *edma_wr = dspi_pushr; +- edma_wr++; ++ edma_wr++; + #else + *drv_data->dspi_dtfr = dspi_pushr; +- //MCF_DSPI_DTFR = dspi_pushr; + #endif + + +@@ -473,14 +484,13 @@ static int write(struct driver_data *drv + + dspi_pushr = MCF_DSPI_DTFR_TXDATA(d8) + | DSPI_CS(drv_data->cs) +- /* | MCF_DSPI_DTFR_PCS5 | */ + | MCF_DSPI_DTFR_CTAS(drv_data->dspi_ctas) + | MCF_DSPI_DTFR_CONT; + + drv_data->tx++; + + if (drv_data->tx == drv_data->tx_end || tx_count==DSPI_FIFO_SIZE-1) { +- // last transfer in queue ++ /* last transfer in the queue */ + dspi_pushr |= MCF_DSPI_DTFR_EOQ; + if (drv_data->cs_change) { + dspi_pushr &= ~MCF_DSPI_DTFR_CONT; +@@ -489,16 +499,15 @@ static int write(struct driver_data *drv + + if (first) { + first = 0; +- dspi_pushr |= MCF_DSPI_DTFR_CTCNT; // clear counter ++ dspi_pushr |= MCF_DSPI_DTFR_CTCNT; /* clear counter */ + } + + #if defined(SPI_DSPI_EDMA) + *edma_wr = dspi_pushr; +- edma_wr++; +-#else ++ edma_wr++; ++#else + *drv_data->dspi_dtfr = dspi_pushr; +- //MCF_DSPI_DTFR = dspi_pushr; +-#endif ++#endif + + } + tx_count++; +@@ -508,8 +517,8 @@ static int write(struct driver_data *drv + + if (tx_count>0) { + +- // TODO: initiate eDMA transfer +- set_edma_params(DSPI_DMA_TX_TCD, ++ /* TBD: initiate eDMA transfer */ ++ mcf_edma_set_tcd_params(DSPI_DMA_TX_TCD, + #ifdef SPI_USE_MMU + virt_to_phys(drv_data->edma_tx_buf), + #else +@@ -517,18 +526,18 @@ static int write(struct driver_data *drv + #endif + (u32)drv_data->dspi_dtfr, + MCF_EDMA_TCD_ATTR_SSIZE_32BIT | MCF_EDMA_TCD_ATTR_DSIZE_32BIT, +- 4, // soff +- 4, // nbytes +- 0, // slast +- tx_count, // citer +- tx_count, // biter +- 0, // doff +- 0, // dlastsga +- 0, // major_int +- 1 // disable_req ++ 4, /* soff */ ++ 4, /* nbytes */ ++ 0, /* slast */ ++ tx_count, /* citer */ ++ tx_count, /* biter */ ++ 0, /* doff */ ++ 0, /* dlastsga */ ++ 0, /* major_int */ ++ 1 /* disable_req */ + ); + +- set_edma_params(DSPI_DMA_RX_TCD, ++ mcf_edma_set_tcd_params(DSPI_DMA_RX_TCD, + (u32)drv_data->dspi_drfr, + #ifdef SPI_USE_MMU + virt_to_phys(drv_data->edma_rx_buf), +@@ -536,20 +545,20 @@ static int write(struct driver_data *drv + drv_data->edma_rx_buf, + #endif + MCF_EDMA_TCD_ATTR_SSIZE_32BIT | MCF_EDMA_TCD_ATTR_DSIZE_32BIT, +- 0, // soff +- 4, // nbytes +- 0, // slast +- tx_count, // citer +- tx_count, // biter +- 4, // doff +- 0, // dlastsga +- 0, // major_int +- 1 // disable_req ++ 0, /* soff */ ++ 4, /* nbytes */ ++ 0, /* slast */ ++ tx_count, /* citer */ ++ tx_count, /* biter */ ++ 4, /* doff */ ++ 0, /* dlastsga */ ++ 0, /* major_int */ ++ 1 /* disable_req */ + ); + + +- start_edma_transfer(DSPI_DMA_TX_TCD); // transmit SPI data +- start_edma_transfer(DSPI_DMA_RX_TCD); // receive SPI data ++ start_edma_transfer(DSPI_DMA_TX_TCD); /* transmit SPI data */ ++ start_edma_transfer(DSPI_DMA_RX_TCD); /* receive SPI data */ + } + #endif + +@@ -583,9 +592,9 @@ static int write(struct driver_data *drv + | QCR_CONT + | (~((0x01 << drv_data->cs) << 8) & 0x0F00); + +- if ( (cmd_count == tx_count - 1) +- && (drv_data->tx == drv_data->tx_end) +- && (drv_data->cs_change) ) { ++ if ( (cmd_count == tx_count - 1) ++ && (drv_data->tx == drv_data->tx_end) ++ && (drv_data->cs_change) ) { + qcr &= ~QCR_CONT; + } + *drv_data->qcr = qcr; +@@ -613,7 +622,6 @@ static int read(struct driver_data *drv_ + rx_word = is_word_transfer(drv_data); + + #if defined(SPI_DSPI) +- + #if defined(SPI_DSPI_EDMA) + rx_edma = (u32*) drv_data->edma_tx_buf; + while ((drv_data->rx < drv_data->rx_end) && (rx_count < EDMA_BUFFER_SIZE)) { +@@ -646,10 +654,7 @@ static int read(struct driver_data *drv_ + } + rx_count++; + } +- +- + #else +- + *drv_data->qar = QSPI_RECEIVE_RAM; + while ((drv_data->rx < drv_data->rx_end) && (rx_count < QSPI_RAM_SIZE)) { + if (rx_word) { +@@ -680,19 +685,18 @@ static inline void qspi_setup_chip(struc + + *drv_data->mcr = chip->mcr_val; + +- // TODO: remove later ++ /* TBD: remove later */ ++/* JKM -- validate */ + chip->ctar_val = 0x78560118; + + *drv_data->ctar = chip->ctar_val; + *drv_data->dspi_rser = 0 +- | MCF_DSPI_DRSER_EOQFE ++ | MCF_DSPI_DRSER_EOQFE + #if defined(SPI_DSPI_EDMA) +- | MCF_DSPI_DRSER_TFFFE +- | MCF_DSPI_DRSER_TFFFS ++ | MCF_DSPI_DRSER_TFFFE ++ | MCF_DSPI_DRSER_TFFFS + #endif +- ; +- +- ++ ; + #else + *drv_data->qmr = chip->qmr_val; + *drv_data->qdlyr = chip->qdlyr_val; +@@ -770,7 +774,6 @@ static irqreturn_t qspi_interrupt(int ir + * transfer tasklet + */ + if (drv_data->flags & TRAN_STATE_WORD_ODD_NUM) { +- //*drv_data->qmr &= ~QMR_BITS; + set_16bit_transfer_mode(drv_data); + } + +@@ -857,10 +860,8 @@ static void pump_transfers(unsigned long + if (message->state == START_STATE) { + qspi_setup_chip(drv_data); + +- if (drv_data->cs_control) { +- //printk( "m s\n" ); +- drv_data->cs_control(message->spi->chip_select, QSPI_CS_ASSERT); +- } ++ if (drv_data->cs_control) ++ drv_data->cs_control(message->spi->chip_select, QSPI_CS_ASSERT); + } + + /* Delay if requested at end of transfer*/ +@@ -902,12 +903,12 @@ static void pump_transfers(unsigned long + } + + +-static void pump_messages(struct work_struct * work) ++static void pump_messages(struct work_struct *work) + { + struct driver_data *drv_data; + unsigned long flags; + +- drv_data = container_of(work, struct driver_data, pump_messages); ++ drv_data = container_of(work, struct driver_data, pump_messages); + + /* Lock queue and check for queue work */ + spin_lock_irqsave(&drv_data->lock, flags); +@@ -1002,7 +1003,7 @@ static int setup(struct spi_device *spi) + chip->mcr.cont_scke = 0; + chip->mcr.dconf = 0; + chip->mcr.frz = 0; +- chip->mcr.mtfe = 1; ++ chip->mcr.mtfe = 0; + chip->mcr.pcsse = 0; + chip->mcr.rooe = 0; + chip->mcr.pcsis = 0xFF; +@@ -1019,7 +1020,7 @@ static int setup(struct spi_device *spi) + if ((spi->bits_per_word >= 4) && (spi->bits_per_word <= 16)) { + chip->ctar.fmsz = spi->bits_per_word-1; + } else { +- printk(KERN_ERR "coldfire-qspi: invalid wordsize\n"); ++ printk(KERN_ERR "coldfire-spi: invalid wordsize\n"); + kfree(chip); + return -ENODEV; + } +@@ -1056,9 +1057,9 @@ static int setup(struct spi_device *spi) + + #else + +- chip->qwr.csiv = 1; // Chip selects are active low +- chip->qmr.master = 1; // Must set to master mode +- chip->qmr.dohie = 1; // Data output high impediance enabled ++ chip->qwr.csiv = 1; /* Chip selects are active low */ ++ chip->qmr.master = 1; /* Must set to master mode */ ++ chip->qmr.dohie = 1; /* Data output high impediance enabled */ + chip->void_write_data = chip_info->void_write_data; + + chip->qdlyr.qcd = chip_info->del_cs_to_clk; +@@ -1075,8 +1076,8 @@ static int setup(struct spi_device *spi) + + chip->qmr.baud = baud_divisor; + +- //printk( "QSPI: spi->max_speed_hz %d\n", spi->max_speed_hz ); +- //printk( "QSPI: Baud set to %d\n", chip->qmr.baud ); ++ /*printk( "SPI: spi->max_speed_hz %d\n", spi->max_speed_hz );*/ ++ /*printk( "SPI: Baud set to %d\n", chip->qmr.baud );*/ + + if (spi->mode & SPI_CPHA) + chip->qmr.cpha = 1; +@@ -1089,7 +1090,7 @@ static int setup(struct spi_device *spi) + } else if ((spi->bits_per_word >= 8) && (spi->bits_per_word <= 15)) { + chip->qmr.bits = spi->bits_per_word; + } else { +- printk(KERN_ERR "coldfire-qspi: invalid wordsize\n"); ++ printk(KERN_ERR "coldfire-spi: invalid wordsize\n"); + kfree(chip); + return -ENODEV; + } +@@ -1112,7 +1113,7 @@ static int init_queue(struct driver_data + tasklet_init(&drv_data->pump_transfers, + pump_transfers, (unsigned long)drv_data); + +- INIT_WORK(&drv_data->pump_messages, pump_messages/*, drv_data*/); ++ INIT_WORK(&drv_data->pump_messages, pump_messages); + + drv_data->workqueue = create_singlethread_workqueue( + drv_data->master->dev.parent->bus_id); +@@ -1185,7 +1186,7 @@ static int destroy_queue(struct driver_d + } + + +-static void cleanup(const struct spi_device *spi) ++static void cleanup(struct spi_device *spi) + { + struct chip_data *chip = spi_get_ctldata((struct spi_device *)spi); + +@@ -1213,11 +1214,7 @@ static int coldfire_spi_probe(struct pla + int status = 0; + int i; + +-#if defined(SPI_DSPI_EDMA) +- init_edma(); +-#endif +- +- platform_info = (struct coldfire_spi_master *)pdev->dev.platform_data; ++ platform_info = (struct coldfire_spi_master *)pdev->dev.platform_data; + + master = spi_alloc_master(dev, sizeof(struct driver_data)); + if (!master) +@@ -1241,7 +1238,7 @@ static int coldfire_spi_probe(struct pla + drv_data->cs_control(i, QSPI_CS_INIT | QSPI_CS_DROP); + + /* Setup register addresses */ +- memory_resource = platform_get_resource_byname(pdev, IORESOURCE_MEM, "qspi-module"); ++ memory_resource = platform_get_resource_byname(pdev, IORESOURCE_MEM, "spi-module"); + if (!memory_resource) { + dev_dbg(dev, "can not find platform module memory\n"); + goto out_error_master_alloc; +@@ -1259,13 +1256,13 @@ static int coldfire_spi_probe(struct pla + dev_dbg(dev, "cannot allocate eDMA RX memory\n"); + goto out_error_master_alloc; + } +-#endif ++#endif + + #if defined(SPI_DSPI) + +- drv_data->mcr = (void *)(memory_resource->start + 0x00000000); +- drv_data->ctar = (void *)(memory_resource->start + 0x0000000C); +- drv_data->dspi_sr = (void *)(memory_resource->start + 0x0000002C); ++ drv_data->mcr = (void *)(memory_resource->start + 0x00000000); ++ drv_data->ctar = (void *)(memory_resource->start + 0x0000000C); ++ drv_data->dspi_sr = (void *)(memory_resource->start + 0x0000002C); + drv_data->dspi_rser = (void *)(memory_resource->start + 0x00000030); + drv_data->dspi_dtfr = (void *)(memory_resource->start + 0x00000034); + drv_data->dspi_drfr = (void *)(memory_resource->start + 0x00000038); +@@ -1283,7 +1280,7 @@ static int coldfire_spi_probe(struct pla + #endif + + /* Setup register addresses */ +- memory_resource = platform_get_resource_byname(pdev, IORESOURCE_MEM, "qspi-par"); ++ memory_resource = platform_get_resource_byname(pdev, IORESOURCE_MEM, "spi-par"); + if (!memory_resource) { + dev_dbg(dev, "can not find platform par memory\n"); + goto out_error_master_alloc; +@@ -1292,7 +1289,7 @@ static int coldfire_spi_probe(struct pla + drv_data->par = (void *)memory_resource->start; + + /* Setup register addresses */ +- memory_resource = platform_get_resource_byname(pdev, IORESOURCE_MEM, "qspi-int-level"); ++ memory_resource = platform_get_resource_byname(pdev, IORESOURCE_MEM, "spi-int-level"); + if (!memory_resource) { + dev_dbg(dev, "can not find platform par memory\n"); + goto out_error_master_alloc; +@@ -1301,7 +1298,7 @@ static int coldfire_spi_probe(struct pla + drv_data->int_icr = (void *)memory_resource->start; + + /* Setup register addresses */ +- memory_resource = platform_get_resource_byname(pdev, IORESOURCE_MEM, "qspi-int-mask"); ++ memory_resource = platform_get_resource_byname(pdev, IORESOURCE_MEM, "spi-int-mask"); + if (!memory_resource) { + dev_dbg(dev, "can not find platform par memory\n"); + goto out_error_master_alloc; +@@ -1309,32 +1306,52 @@ static int coldfire_spi_probe(struct pla + + drv_data->int_mr = (void *)memory_resource->start; + +- irq = platform_info->irq_vector; ++ if (platform_info->irq_list) { ++ /* multiple IRQs */ ++ int *irqlist = platform_info->irq_list; ++ while ((irq = *irqlist++)) { ++ int off = *irqlist++; ++ int lvl = *irqlist++; ++ int msk = *irqlist++; ++ status = request_irq(irq, qspi_interrupt, IRQF_DISABLED, ++ dev->bus_id, drv_data); ++ if (status < 0) { ++ dev_err(&pdev->dev, ++ "unable to attach ColdFire DSPI interrupt\n"); ++ goto out_error_master_alloc; ++ } ++ ++ if (lvl) ++ *(drv_data->int_icr + off) = lvl; + +- status = request_irq(platform_info->irq_vector, qspi_interrupt, IRQF_DISABLED, dev->bus_id, drv_data); +- if (status < 0) { +- dev_err(&pdev->dev, "unable to attach ColdFire QSPI interrupt\n"); +- goto out_error_master_alloc; ++ if (msk) ++ *drv_data->int_mr &= ~msk; ++ } + } ++ else { ++ irq = platform_info->irq_vector; + +- /* Now that we have all the addresses etc. Let's set it up */ +- // TODO: +- //*drv_data->par = platform_info->par_val; ++ status = request_irq(platform_info->irq_vector, qspi_interrupt, ++ IRQF_DISABLED, dev->bus_id, drv_data); ++ if (status < 0) { ++ dev_err(&pdev->dev, "unable to attach ColdFire QSPI interrupt\n"); ++ goto out_error_master_alloc; ++ } + +- MCF_GPIO_PAR_DSPI = 0 +- | MCF_GPIO_PAR_DSPI_PCS5_PCS5 +- | MCF_GPIO_PAR_DSPI_PCS2_PCS2 +- | MCF_GPIO_PAR_DSPI_PCS1_PCS1 +- | MCF_GPIO_PAR_DSPI_PCS0_PCS0 +- | MCF_GPIO_PAR_DSPI_SIN_SIN +- | MCF_GPIO_PAR_DSPI_SOUT_SOUT +- | MCF_GPIO_PAR_DSPI_SCK_SCK; ++ *drv_data->int_icr = platform_info->irq_lp; ++ *drv_data->int_mr &= ~platform_info->irq_mask; ++ } ++ ++ /* Now that we have all the addresses etc. Let's set it up */ ++ if (platform_info->par_val) ++ *drv_data->par = platform_info->par_val; + +- *drv_data->int_icr = platform_info->irq_lp; +- *drv_data->int_mr &= ~platform_info->irq_mask; ++#ifdef CONFIG_M5227x ++ MCF_GPIO_PAR_IRQ = 0x04; /* Mistake in RM documentation */ ++#endif + + #ifdef SPI_DSPI +- drv_data->dspi_ctas = 0; // TODO: change later ++ drv_data->dspi_ctas = 0; /* TBD: change later */ + #endif + + /* Initial and start queue */ +@@ -1359,40 +1376,37 @@ static int coldfire_spi_probe(struct pla + } + + #if defined(SPI_DSPI_EDMA) +- if (request_edma_channel(DSPI_DMA_TX_TCD, +- edma_tx_handler, +- NULL, +- pdev, +- NULL, /* spinlock */ +- DRIVER_NAME +- )!=0) +- { ++ if (mcf_edma_request_channel(DSPI_DMA_TX_TCD, ++ edma_tx_handler, ++ NULL, ++ pdev, ++ NULL, /* spinlock */ ++ DRIVER_NAME ++ )!=0) { + dev_err(&pdev->dev, "problem requesting edma transmit channel\n"); + status = -EINVAL; +- goto out_error_queue_alloc; ++ goto out_error_queue_alloc; + } + +- if (request_edma_channel(DSPI_DMA_RX_TCD, +- edma_rx_handler, +- NULL, +- pdev, +- NULL, /* spinlock */ +- DRIVER_NAME +- )!=0) +- { ++ if (mcf_edma_request_channel(DSPI_DMA_RX_TCD, ++ edma_rx_handler, ++ NULL, ++ pdev, ++ NULL, /* spinlock */ ++ DRIVER_NAME ++ )!=0) { + dev_err(&pdev->dev, "problem requesting edma receive channel\n"); + status = -EINVAL; +- goto out_edma_transmit; ++ goto out_edma_transmit; + } + #endif + +- printk( "SPI: Coldfire master initialized\n" ); +- //dev_info(&pdev->dev, "driver initialized\n"); ++ printk(KERN_INFO "SPI: Coldfire master initialized\n" ); + return status; + + #if defined(SPI_DSPI_EDMA) + out_edma_transmit: +- free_edma_channel(DSPI_DMA_TX_TCD, pdev); ++ mcf_edma_free_channel(DSPI_DMA_TX_TCD, pdev); + #endif + + out_error_queue_alloc: +@@ -1417,8 +1431,8 @@ static int coldfire_spi_remove(struct pl + return 0; + + #if defined(SPI_DSPI_EDMA) +- free_edma_channel(DSPI_DMA_TX_TCD, pdev); +- free_edma_channel(DSPI_DMA_RX_TCD, pdev); ++ mcf_edma_free_channel(DSPI_DMA_TX_TCD, pdev); ++ mcf_edma_free_channel(DSPI_DMA_RX_TCD, pdev); + #endif + + /* Remove the queue */ +@@ -1426,27 +1440,8 @@ static int coldfire_spi_remove(struct pl + if (status != 0) + return status; + +- /* Disable the SSP at the peripheral and SOC level */ +- /*write_SSCR0(0, drv_data->ioaddr); +- pxa_set_cken(drv_data->master_info->clock_enable, 0);*/ +- +- /* Release DMA */ +- /*if (drv_data->master_info->enable_dma) { +- if (drv_data->ioaddr == SSP1_VIRT) { +- DRCMRRXSSDR = 0; +- DRCMRTXSSDR = 0; +- } else if (drv_data->ioaddr == SSP2_VIRT) { +- DRCMRRXSS2DR = 0; +- DRCMRTXSS2DR = 0; +- } else if (drv_data->ioaddr == SSP3_VIRT) { +- DRCMRRXSS3DR = 0; +- DRCMRTXSS3DR = 0; +- } +- pxa_free_dma(drv_data->tx_channel); +- pxa_free_dma(drv_data->rx_channel); +- }*/ +- + /* Release IRQ */ ++/* JKM -- check for list and remove list */ + irq = platform_get_irq(pdev, 0); + if (irq >= 0) + free_irq(irq, drv_data); +@@ -1496,8 +1491,6 @@ static int coldfire_spi_suspend(struct p + status = stop_queue(drv_data); + if (status != 0) + return status; +- /*write_SSCR0(0, drv_data->ioaddr); +- pxa_set_cken(drv_data->master_info->clock_enable, 0);*/ + + return 0; + } +@@ -1507,9 +1500,6 @@ static int coldfire_spi_resume(struct pl + struct driver_data *drv_data = platform_get_drvdata(pdev); + int status = 0; + +- /* Enable the SSP clock */ +- /*pxa_set_cken(drv_data->master_info->clock_enable, 1);*/ +- + /* Start the queue running */ + status = start_queue(drv_data); + if (status != 0) { +--- /dev/null ++++ b/include/asm-m68k/m5485dspi.h +@@ -0,0 +1,144 @@ ++/* ++ * File: mcf548x_dspi.h ++ * Purpose: Register and bit definitions for the MCF548X ++ * ++ * Notes: ++ * ++ */ ++ ++#ifndef _M5485DSPI_H_ ++#define _M5485DSPI_H_ ++ ++/* ++ * ++ * DMA Serial Peripheral Interface (DSPI) ++ * ++ */ ++ ++/* Register read/write macros */ ++#define MCF_DSPI_DMCR MCF_REG32(0x008A00) ++#define MCF_DSPI_DTCR MCF_REG32(0x008A08) ++#define MCF_DSPI_DCTAR0 MCF_REG32(0x008A0C) ++#define MCF_DSPI_DCTAR1 MCF_REG32(0x008A10) ++#define MCF_DSPI_DCTAR2 MCF_REG32(0x008A14) ++#define MCF_DSPI_DCTAR3 MCF_REG32(0x008A18) ++#define MCF_DSPI_DCTAR4 MCF_REG32(0x008A1C) ++#define MCF_DSPI_DCTAR5 MCF_REG32(0x008A20) ++#define MCF_DSPI_DCTAR6 MCF_REG32(0x008A24) ++#define MCF_DSPI_DCTAR7 MCF_REG32(0x008A28) ++#define MCF_DSPI_DCTARn(x) MCF_REG32(0x008A0C+(x*4)) ++#define MCF_DSPI_DSR MCF_REG32(0x008A2C) ++#define MCF_DSPI_DRSER MCF_REG32(0x008A30) ++#define MCF_DSPI_DTFR MCF_REG32(0x008A34) ++#define MCF_DSPI_DRFR MCF_REG32(0x008A38) ++#define MCF_DSPI_DTFDR0 MCF_REG32(0x008A3C) ++#define MCF_DSPI_DTFDR1 MCF_REG32(0x008A40) ++#define MCF_DSPI_DTFDR2 MCF_REG32(0x008A44) ++#define MCF_DSPI_DTFDR3 MCF_REG32(0x008A48) ++#define MCF_DSPI_DTFDRn(x) MCF_REG32(0x008A3C+(x*4)) ++#define MCF_DSPI_DRFDR0 MCF_REG32(0x008A7C) ++#define MCF_DSPI_DRFDR1 MCF_REG32(0x008A80) ++#define MCF_DSPI_DRFDR2 MCF_REG32(0x008A84) ++#define MCF_DSPI_DRFDR3 MCF_REG32(0x008A88) ++#define MCF_DSPI_DRFDRn(x) MCF_REG32(0x008A7C+(x*4)) ++ ++/* Bit definitions and macros for MCF_DSPI_DMCR */ ++#define MCF_DSPI_DMCR_HALT (0x00000001) ++#define MCF_DSPI_DMCR_SMPL_PT(x) (((x)&0x00000003)<<8) ++#define MCF_DSPI_DMCR_CRXF (0x00000400) ++#define MCF_DSPI_DMCR_CTXF (0x00000800) ++#define MCF_DSPI_DMCR_DRXF (0x00001000) ++#define MCF_DSPI_DMCR_DTXF (0x00002000) ++#define MCF_DSPI_DMCR_CSIS0 (0x00010000) ++#define MCF_DSPI_DMCR_CSIS2 (0x00040000) ++#define MCF_DSPI_DMCR_CSIS3 (0x00080000) ++#define MCF_DSPI_DMCR_CSIS5 (0x00200000) ++#define MCF_DSPI_DMCR_ROOE (0x01000000) ++#define MCF_DSPI_DMCR_PCSSE (0x02000000) ++#define MCF_DSPI_DMCR_MTFE (0x04000000) ++#define MCF_DSPI_DMCR_FRZ (0x08000000) ++#define MCF_DSPI_DMCR_DCONF(x) (((x)&0x00000003)<<28) ++#define MCF_DSPI_DMCR_CSCK (0x40000000) ++#define MCF_DSPI_DMCR_MSTR (0x80000000) ++ ++/* Bit definitions and macros for MCF_DSPI_DTCR */ ++#define MCF_DSPI_DTCR_SPI_TCNT(x) (((x)&0x0000FFFF)<<16) ++ ++/* Bit definitions and macros for MCF_DSPI_DCTARn */ ++#define MCF_DSPI_DCTAR_BR(x) (((x)&0x0000000F)<<0) ++#define MCF_DSPI_DCTAR_DT(x) (((x)&0x0000000F)<<4) ++#define MCF_DSPI_DCTAR_ASC(x) (((x)&0x0000000F)<<8) ++#define MCF_DSPI_DCTAR_CSSCK(x) (((x)&0x0000000F)<<12) ++#define MCF_DSPI_DCTAR_PBR(x) (((x)&0x00000003)<<16) ++#define MCF_DSPI_DCTAR_PDT(x) (((x)&0x00000003)<<18) ++#define MCF_DSPI_DCTAR_PASC(x) (((x)&0x00000003)<<20) ++#define MCF_DSPI_DCTAR_PCSSCK(x) (((x)&0x00000003)<<22) ++#define MCF_DSPI_DCTAR_LSBFE (0x01000000) ++#define MCF_DSPI_DCTAR_CPHA (0x02000000) ++#define MCF_DSPI_DCTAR_CPOL (0x04000000) ++/* #define MCF_DSPI_DCTAR_TRSZ(x) (((x)&0x0000000F)<<27) */ ++#define MCF_DSPI_DCTAR_FMSZ(x) (((x)&0x0000000F)<<27) ++#define MCF_DSPI_DCTAR_PCSSCK_1CLK (0x00000000) ++#define MCF_DSPI_DCTAR_PCSSCK_3CLK (0x00400000) ++#define MCF_DSPI_DCTAR_PCSSCK_5CLK (0x00800000) ++#define MCF_DSPI_DCTAR_PCSSCK_7CLK (0x00A00000) ++#define MCF_DSPI_DCTAR_PASC_1CLK (0x00000000) ++#define MCF_DSPI_DCTAR_PASC_3CLK (0x00100000) ++#define MCF_DSPI_DCTAR_PASC_5CLK (0x00200000) ++#define MCF_DSPI_DCTAR_PASC_7CLK (0x00300000) ++#define MCF_DSPI_DCTAR_PDT_1CLK (0x00000000) ++#define MCF_DSPI_DCTAR_PDT_3CLK (0x00040000) ++#define MCF_DSPI_DCTAR_PDT_5CLK (0x00080000) ++#define MCF_DSPI_DCTAR_PDT_7CLK (0x000A0000) ++#define MCF_DSPI_DCTAR_PBR_1CLK (0x00000000) ++#define MCF_DSPI_DCTAR_PBR_3CLK (0x00010000) ++#define MCF_DSPI_DCTAR_PBR_5CLK (0x00020000) ++#define MCF_DSPI_DCTAR_PBR_7CLK (0x00030000) ++ ++/* Bit definitions and macros for MCF_DSPI_DSR */ ++#define MCF_DSPI_DSR_RXPTR(x) (((x)&0x0000000F)<<0) ++#define MCF_DSPI_DSR_RXCTR(x) (((x)&0x0000000F)<<4) ++#define MCF_DSPI_DSR_TXPTR(x) (((x)&0x0000000F)<<8) ++#define MCF_DSPI_DSR_TXCTR(x) (((x)&0x0000000F)<<12) ++#define MCF_DSPI_DSR_RFDF (0x00020000) ++#define MCF_DSPI_DSR_RFOF (0x00080000) ++#define MCF_DSPI_DSR_TFFF (0x02000000) ++#define MCF_DSPI_DSR_TFUF (0x08000000) ++#define MCF_DSPI_DSR_EOQF (0x10000000) ++#define MCF_DSPI_DSR_TXRXS (0x40000000) ++#define MCF_DSPI_DSR_TCF (0x80000000) ++ ++/* Bit definitions and macros for MCF_DSPI_DRSER */ ++#define MCF_DSPI_DRSER_RFDFS (0x00010000) ++#define MCF_DSPI_DRSER_RFDFE (0x00020000) ++#define MCF_DSPI_DRSER_RFOFE (0x00080000) ++#define MCF_DSPI_DRSER_TFFFS (0x01000000) ++#define MCF_DSPI_DRSER_TFFFE (0x02000000) ++#define MCF_DSPI_DRSER_TFUFE (0x08000000) ++#define MCF_DSPI_DRSER_EOQFE (0x10000000) ++#define MCF_DSPI_DRSER_TCFE (0x80000000) ++ ++/* Bit definitions and macros for MCF_DSPI_DTFR */ ++#define MCF_DSPI_DTFR_TXDATA(x) (((x)&0x0000FFFF)<<0) ++#define MCF_DSPI_DTFR_CS0 (0x00010000) ++#define MCF_DSPI_DTFR_CS2 (0x00040000) ++#define MCF_DSPI_DTFR_CS3 (0x00080000) ++#define MCF_DSPI_DTFR_CS5 (0x00200000) ++#define MCF_DSPI_DTFR_CTCNT (0x04000000) ++#define MCF_DSPI_DTFR_EOQ (0x08000000) ++#define MCF_DSPI_DTFR_CTAS(x) (((x)&0x00000007)<<28) ++#define MCF_DSPI_DTFR_CONT (0x80000000) ++ ++/* Bit definitions and macros for MCF_DSPI_DRFR */ ++#define MCF_DSPI_DRFR_RXDATA(x) (((x)&0x0000FFFF)<<0) ++ ++/* Bit definitions and macros for MCF_DSPI_DTFDRn */ ++#define MCF_DSPI_DTFDRn_TXDATA(x) (((x)&0x0000FFFF)<<0) ++#define MCF_DSPI_DTFDRn_TXCMD(x) (((x)&0x0000FFFF)<<16) ++ ++/* Bit definitions and macros for MCF_DSPI_DRFDRn */ ++#define MCF_DSPI_DRFDRn_RXDATA(x) (((x)&0x0000FFFF)<<0) ++ ++/********************************************************************/ ++ ++#endif /* _M5485DSPI_H_ */ +--- a/include/asm-m68k/mcfqspi.h ++++ b/include/asm-m68k/mcfqspi.h +@@ -36,6 +36,7 @@ struct coldfire_spi_master { + u32 irq_mask; + u8 irq_lp; + u8 par_val; ++ u32 *irq_list; + void (*cs_control)(u8 cs, u8 command); + }; + +--- a/include/asm-m68k/mcfsim.h ++++ b/include/asm-m68k/mcfsim.h +@@ -25,6 +25,7 @@ + #include <asm/mcf5445x_dtim.h> + #elif defined(CONFIG_M547X_8X) + #include <asm/m5485sim.h> ++#include <asm/m5485gpio.h> + #endif + + /* diff --git a/target/linux/coldfire/patches/053-mcfv4e_brcache_inval.patch b/target/linux/coldfire/patches/053-mcfv4e_brcache_inval.patch new file mode 100644 index 0000000000..dc551babf3 --- /dev/null +++ b/target/linux/coldfire/patches/053-mcfv4e_brcache_inval.patch @@ -0,0 +1,42 @@ +From eba69831e8f35174e2e15e373a66f40dc0be8929 Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Wed, 14 May 2008 12:23:12 -0600 +Subject: [PATCH] Force branch-cache invalidate on task switch. + +When finishing a task switch make sure the branch cache +gets invalidated to ensure no stale entries exist for +the next user space. + +LTIBName: mcfv4e-brcache-inval +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + include/asm-m68k/system.h | 15 +++++++++++++++ + 1 files changed, 15 insertions(+), 0 deletions(-) + +--- a/include/asm-m68k/system.h ++++ b/include/asm-m68k/system.h +@@ -5,9 +5,24 @@ + #include <linux/kernel.h> + #include <asm/segment.h> + #include <asm/entry.h> ++#include <asm/cfcache.h> + + #ifdef __KERNEL__ + ++#ifdef CONFIG_COLDFIRE ++#define FLUSH_BC (0x00040000) ++ ++#define finish_arch_switch(prev) do { \ ++ unsigned long tmpreg; \ ++ asm volatile ( "move.l %2,%0\n" \ ++ "orl %1,%0\n" \ ++ "movec %0,%%cacr" \ ++ : "=&d" (tmpreg) \ ++ : "id" (FLUSH_BC), "m" (shadow_cacr)); \ ++ } while(0) ++ ++#endif ++ + /* + * switch_to(n) should switch tasks to task ptr, first checking that + * ptr isn't the current task, in which case it does nothing. This diff --git a/target/linux/coldfire/patches/054-mcfv4e_defconfig_upd.patch b/target/linux/coldfire/patches/054-mcfv4e_defconfig_upd.patch new file mode 100644 index 0000000000..3742421224 --- /dev/null +++ b/target/linux/coldfire/patches/054-mcfv4e_defconfig_upd.patch @@ -0,0 +1,2227 @@ +From 8a089acdd2f29356883bcbd65622fda8b0a7f276 Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Thu, 15 May 2008 11:51:00 -0600 +Subject: [PATCH] Defconfig updates for M54455EVB, M5475EVB and M5485EVB. + +LTIBName: mcfv4e-defconfig-upd +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + arch/m68k/configs/55_defconfig | 830 ++++++++++++++++++++++++++++ + arch/m68k/configs/m54455evb_defconfig | 2 +- + arch/m68k/configs/m5475evb_defconfig | 954 +++++++++++++++++++++++++++++++++ + arch/m68k/configs/m5485evb_defconfig | 197 ++++---- + 4 files changed, 1889 insertions(+), 94 deletions(-) + create mode 100644 arch/m68k/configs/55_defconfig + create mode 100644 arch/m68k/configs/m5475evb_defconfig + +--- /dev/null ++++ b/arch/m68k/configs/55_defconfig +@@ -0,0 +1,830 @@ ++# ++# Automatically generated make config: don't edit ++# Linux kernel version: 2.6.25 ++# Thu Jun 26 16:17:41 2008 ++# ++CONFIG_M68K=y ++CONFIG_MMU=y ++# CONFIG_GENERIC_TIME is not set ++# CONFIG_GENERIC_CLOCKEVENTS is not set ++CONFIG_RWSEM_GENERIC_SPINLOCK=y ++# CONFIG_ARCH_HAS_ILOG2_U32 is not set ++# CONFIG_ARCH_HAS_ILOG2_U64 is not set ++CONFIG_GENERIC_HWEIGHT=y ++CONFIG_GENERIC_CALIBRATE_DELAY=y ++CONFIG_TIME_LOW_RES=y ++CONFIG_GENERIC_IOMAP=y ++# CONFIG_NO_IOPORT is not set ++# CONFIG_NO_DMA is not set ++CONFIG_ARCH_SUPPORTS_AOUT=y ++CONFIG_HZ=100 ++CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" ++ ++# ++# General setup ++# ++CONFIG_EXPERIMENTAL=y ++CONFIG_BROKEN_ON_SMP=y ++CONFIG_INIT_ENV_ARG_LIMIT=32 ++CONFIG_LOCALVERSION="" ++CONFIG_LOCALVERSION_AUTO=y ++CONFIG_SWAP=y ++CONFIG_SYSVIPC=y ++CONFIG_SYSVIPC_SYSCTL=y ++# CONFIG_POSIX_MQUEUE is not set ++# CONFIG_BSD_PROCESS_ACCT is not set ++# CONFIG_TASKSTATS is not set ++# CONFIG_AUDIT is not set ++CONFIG_IKCONFIG=y ++CONFIG_IKCONFIG_PROC=y ++CONFIG_LOG_BUF_SHIFT=17 ++# CONFIG_CGROUPS is not set ++CONFIG_GROUP_SCHED=y ++CONFIG_FAIR_GROUP_SCHED=y ++# CONFIG_RT_GROUP_SCHED is not set ++CONFIG_USER_SCHED=y ++# CONFIG_CGROUP_SCHED is not set ++CONFIG_SYSFS_DEPRECATED=y ++CONFIG_SYSFS_DEPRECATED_V2=y ++# CONFIG_RELAY is not set ++CONFIG_NAMESPACES=y ++# CONFIG_UTS_NS is not set ++# CONFIG_IPC_NS is not set ++# CONFIG_USER_NS is not set ++# CONFIG_PID_NS is not set ++# CONFIG_BLK_DEV_INITRD is not set ++# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set ++CONFIG_SYSCTL=y ++# CONFIG_EMBEDDED is not set ++CONFIG_UID16=y ++CONFIG_SYSCTL_SYSCALL=y ++CONFIG_KALLSYMS=y ++# CONFIG_KALLSYMS_ALL is not set ++# CONFIG_KALLSYMS_EXTRA_PASS is not set ++CONFIG_HOTPLUG=y ++CONFIG_PRINTK=y ++CONFIG_BUG=y ++CONFIG_ELF_CORE=y ++CONFIG_COMPAT_BRK=y ++CONFIG_BASE_FULL=y ++CONFIG_FUTEX=y ++CONFIG_ANON_INODES=y ++CONFIG_EPOLL=y ++CONFIG_SIGNALFD=y ++CONFIG_TIMERFD=y ++CONFIG_EVENTFD=y ++CONFIG_SHMEM=y ++CONFIG_VM_EVENT_COUNTERS=y ++CONFIG_SLAB=y ++# CONFIG_SLUB is not set ++# CONFIG_SLOB is not set ++# CONFIG_PROFILING is not set ++# CONFIG_MARKERS is not set ++# CONFIG_HAVE_OPROFILE is not set ++# CONFIG_HAVE_KPROBES is not set ++# CONFIG_HAVE_KRETPROBES is not set ++CONFIG_PROC_PAGE_MONITOR=y ++CONFIG_SLABINFO=y ++CONFIG_RT_MUTEXES=y ++# CONFIG_TINY_SHMEM is not set ++CONFIG_BASE_SMALL=0 ++CONFIG_MODULES=y ++CONFIG_MODULE_UNLOAD=y ++CONFIG_MODULE_FORCE_UNLOAD=y ++# CONFIG_MODVERSIONS is not set ++# CONFIG_MODULE_SRCVERSION_ALL is not set ++# CONFIG_KMOD is not set ++CONFIG_BLOCK=y ++CONFIG_LBD=y ++# CONFIG_BLK_DEV_IO_TRACE is not set ++# CONFIG_LSF is not set ++# CONFIG_BLK_DEV_BSG is not set ++ ++# ++# IO Schedulers ++# ++CONFIG_IOSCHED_NOOP=y ++CONFIG_IOSCHED_AS=y ++CONFIG_IOSCHED_DEADLINE=y ++CONFIG_IOSCHED_CFQ=y ++# CONFIG_DEFAULT_AS is not set ++# CONFIG_DEFAULT_DEADLINE is not set ++CONFIG_DEFAULT_CFQ=y ++# CONFIG_DEFAULT_NOOP is not set ++CONFIG_DEFAULT_IOSCHED="cfq" ++CONFIG_CLASSIC_RCU=y ++ ++# ++# Platform dependent setup ++# ++# CONFIG_SUN3 is not set ++CONFIG_COLDFIRE=y ++CONFIG_CFV4E=y ++# CONFIG_AMIGA is not set ++# CONFIG_ATARI is not set ++# CONFIG_PCI is not set ++# CONFIG_MAC is not set ++# CONFIG_APOLLO is not set ++# CONFIG_VME is not set ++# CONFIG_HP300 is not set ++# CONFIG_SUN3X is not set ++# CONFIG_Q40 is not set ++ ++# ++# Processor type ++# ++# CONFIG_M68020 is not set ++# CONFIG_M68030 is not set ++# CONFIG_M68040 is not set ++# CONFIG_M68060 is not set ++CONFIG_M5445X=y ++# CONFIG_M54451 is not set ++CONFIG_M54455=y ++# CONFIG_M54451EVB is not set ++CONFIG_M54455EVB=y ++# CONFIG_M547X_8X is not set ++CONFIG_MCFCLK=266666666 ++# CONFIG_MCF_USER_HALT is not set ++CONFIG_MMU_CFV4E=y ++CONFIG_SDRAM_BASE=0x40000000 ++CONFIG_SDRAM_SIZE=0x10000000 ++CONFIG_NOR_FLASH_BASE=0x00000000 ++# CONFIG_M68KFPU_EMU is not set ++CONFIG_ADVANCED=y ++# CONFIG_RMW_INSNS is not set ++CONFIG_SINGLE_MEMORY_CHUNK=y ++# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set ++CONFIG_SELECT_MEMORY_MODEL=y ++CONFIG_FLATMEM_MANUAL=y ++# CONFIG_DISCONTIGMEM_MANUAL is not set ++# CONFIG_SPARSEMEM_MANUAL is not set ++CONFIG_FLATMEM=y ++CONFIG_FLAT_NODE_MEM_MAP=y ++CONFIG_NEED_MULTIPLE_NODES=y ++# CONFIG_SPARSEMEM_STATIC is not set ++# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set ++CONFIG_SPLIT_PTLOCK_CPUS=4 ++# CONFIG_RESOURCES_64BIT is not set ++CONFIG_ZONE_DMA_FLAG=1 ++CONFIG_BOUNCE=y ++CONFIG_VIRT_TO_BUS=y ++ ++# ++# General setup ++# ++CONFIG_BINFMT_ELF=y ++# CONFIG_BINFMT_AOUT is not set ++# CONFIG_BINFMT_MISC is not set ++CONFIG_PROC_HARDWARE=y ++CONFIG_ZONE_DMA=y ++# CONFIG_ARCH_SUPPORTS_MSI is not set ++ ++# ++# Power management options ++# ++# CONFIG_PM is not set ++ ++# ++# Networking ++# ++CONFIG_NET=y ++ ++# ++# Networking options ++# ++CONFIG_PACKET=y ++# CONFIG_PACKET_MMAP is not set ++CONFIG_UNIX=y ++CONFIG_XFRM=y ++# CONFIG_XFRM_USER is not set ++# CONFIG_XFRM_SUB_POLICY is not set ++# CONFIG_XFRM_MIGRATE is not set ++# CONFIG_XFRM_STATISTICS is not set ++CONFIG_NET_KEY=y ++# CONFIG_NET_KEY_MIGRATE is not set ++CONFIG_INET=y ++# CONFIG_IP_MULTICAST is not set ++CONFIG_IP_ADVANCED_ROUTER=y ++CONFIG_ASK_IP_FIB_HASH=y ++# CONFIG_IP_FIB_TRIE is not set ++CONFIG_IP_FIB_HASH=y ++# CONFIG_IP_MULTIPLE_TABLES is not set ++# CONFIG_IP_ROUTE_MULTIPATH is not set ++# CONFIG_IP_ROUTE_VERBOSE is not set ++CONFIG_IP_PNP=y ++# CONFIG_IP_PNP_DHCP is not set ++# CONFIG_IP_PNP_BOOTP is not set ++# CONFIG_IP_PNP_RARP is not set ++# CONFIG_NET_IPIP is not set ++# CONFIG_NET_IPGRE is not set ++# CONFIG_ARPD is not set ++# CONFIG_SYN_COOKIES is not set ++CONFIG_INET_AH=y ++CONFIG_INET_ESP=y ++# CONFIG_INET_IPCOMP is not set ++# CONFIG_INET_XFRM_TUNNEL is not set ++# CONFIG_INET_TUNNEL is not set ++# CONFIG_INET_XFRM_MODE_TRANSPORT is not set ++# CONFIG_INET_XFRM_MODE_TUNNEL is not set ++# CONFIG_INET_XFRM_MODE_BEET is not set ++# CONFIG_INET_LRO is not set ++CONFIG_INET_DIAG=y ++CONFIG_INET_TCP_DIAG=y ++# CONFIG_TCP_CONG_ADVANCED is not set ++CONFIG_TCP_CONG_CUBIC=y ++CONFIG_DEFAULT_TCP_CONG="cubic" ++# CONFIG_TCP_MD5SIG is not set ++# CONFIG_IPV6 is not set ++# CONFIG_INET6_XFRM_TUNNEL is not set ++# CONFIG_INET6_TUNNEL is not set ++# CONFIG_NETWORK_SECMARK is not set ++# CONFIG_NETFILTER is not set ++# CONFIG_IP_DCCP is not set ++# CONFIG_IP_SCTP is not set ++# CONFIG_TIPC is not set ++# CONFIG_ATM is not set ++# CONFIG_BRIDGE is not set ++# CONFIG_VLAN_8021Q is not set ++# CONFIG_DECNET is not set ++# CONFIG_LLC2 is not set ++# CONFIG_IPX is not set ++# CONFIG_ATALK is not set ++# CONFIG_X25 is not set ++# CONFIG_LAPB is not set ++# CONFIG_ECONET is not set ++# CONFIG_WAN_ROUTER is not set ++# CONFIG_NET_SCHED is not set ++ ++# ++# Network testing ++# ++# CONFIG_NET_PKTGEN is not set ++# CONFIG_HAMRADIO is not set ++# CONFIG_CAN is not set ++# CONFIG_IRDA is not set ++# CONFIG_BT is not set ++# CONFIG_AF_RXRPC is not set ++ ++# ++# Wireless ++# ++# CONFIG_CFG80211 is not set ++# CONFIG_WIRELESS_EXT is not set ++# CONFIG_MAC80211 is not set ++# CONFIG_IEEE80211 is not set ++# CONFIG_RFKILL is not set ++# CONFIG_NET_9P is not set ++ ++# ++# Device Drivers ++# ++ ++# ++# Generic Driver Options ++# ++CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" ++# CONFIG_STANDALONE is not set ++CONFIG_PREVENT_FIRMWARE_BUILD=y ++CONFIG_FW_LOADER=y ++# CONFIG_DEBUG_DRIVER is not set ++# CONFIG_DEBUG_DEVRES is not set ++# CONFIG_SYS_HYPERVISOR is not set ++# CONFIG_CONNECTOR is not set ++# CONFIG_MTD is not set ++# CONFIG_PARPORT is not set ++CONFIG_BLK_DEV=y ++# CONFIG_BLK_DEV_COW_COMMON is not set ++CONFIG_BLK_DEV_LOOP=y ++# CONFIG_BLK_DEV_CRYPTOLOOP is not set ++# CONFIG_BLK_DEV_NBD is not set ++CONFIG_BLK_DEV_RAM=y ++CONFIG_BLK_DEV_RAM_COUNT=16 ++CONFIG_BLK_DEV_RAM_SIZE=64000 ++# CONFIG_BLK_DEV_XIP is not set ++# CONFIG_CDROM_PKTCDVD is not set ++# CONFIG_ATA_OVER_ETH is not set ++CONFIG_MISC_DEVICES=y ++# CONFIG_COLDFIRE_SEC is not set ++# CONFIG_EEPROM_93CX6 is not set ++# CONFIG_ENCLOSURE_SERVICES is not set ++CONFIG_HAVE_IDE=y ++# CONFIG_IDE is not set ++ ++# ++# SCSI device support ++# ++# CONFIG_RAID_ATTRS is not set ++CONFIG_SCSI=y ++CONFIG_SCSI_DMA=y ++# CONFIG_SCSI_TGT is not set ++# CONFIG_SCSI_NETLINK is not set ++CONFIG_SCSI_PROC_FS=y ++ ++# ++# SCSI support type (disk, tape, CD-ROM) ++# ++CONFIG_BLK_DEV_SD=y ++# CONFIG_CHR_DEV_ST is not set ++# CONFIG_CHR_DEV_OSST is not set ++# CONFIG_BLK_DEV_SR is not set ++# CONFIG_CHR_DEV_SG is not set ++# CONFIG_CHR_DEV_SCH is not set ++ ++# ++# Some SCSI devices (e.g. CD jukebox) support multiple LUNs ++# ++CONFIG_SCSI_MULTI_LUN=y ++# CONFIG_SCSI_CONSTANTS is not set ++# CONFIG_SCSI_LOGGING is not set ++# CONFIG_SCSI_SCAN_ASYNC is not set ++CONFIG_SCSI_WAIT_SCAN=m ++ ++# ++# SCSI Transports ++# ++# CONFIG_SCSI_SPI_ATTRS is not set ++# CONFIG_SCSI_FC_ATTRS is not set ++# CONFIG_SCSI_ISCSI_ATTRS is not set ++# CONFIG_SCSI_SAS_LIBSAS is not set ++# CONFIG_SCSI_SRP_ATTRS is not set ++CONFIG_SCSI_LOWLEVEL=y ++# CONFIG_ISCSI_TCP is not set ++# CONFIG_SCSI_DEBUG is not set ++# CONFIG_ATA is not set ++# CONFIG_MD is not set ++CONFIG_NETDEVICES=y ++# CONFIG_NETDEVICES_MULTIQUEUE is not set ++# CONFIG_DUMMY is not set ++# CONFIG_BONDING is not set ++# CONFIG_MACVLAN is not set ++# CONFIG_EQUALIZER is not set ++# CONFIG_TUN is not set ++# CONFIG_VETH is not set ++# CONFIG_PHYLIB is not set ++CONFIG_NET_ETHERNET=y ++CONFIG_MII=y ++# CONFIG_IBM_NEW_EMAC_ZMII is not set ++# CONFIG_IBM_NEW_EMAC_RGMII is not set ++# CONFIG_IBM_NEW_EMAC_TAH is not set ++# CONFIG_IBM_NEW_EMAC_EMAC4 is not set ++# CONFIG_B44 is not set ++CONFIG_FEC=y ++# CONFIG_FEC2 is not set ++# CONFIG_NETDEV_1000 is not set ++# CONFIG_NETDEV_10000 is not set ++ ++# ++# Wireless LAN ++# ++# CONFIG_WLAN_PRE80211 is not set ++# CONFIG_WLAN_80211 is not set ++# CONFIG_WAN is not set ++# CONFIG_PPP is not set ++# CONFIG_SLIP is not set ++# CONFIG_NETCONSOLE is not set ++# CONFIG_NETPOLL is not set ++# CONFIG_NET_POLL_CONTROLLER is not set ++# CONFIG_ISDN is not set ++# CONFIG_PHONE is not set ++ ++# ++# Input device support ++# ++CONFIG_INPUT=y ++# CONFIG_INPUT_FF_MEMLESS is not set ++# CONFIG_INPUT_POLLDEV is not set ++ ++# ++# Userland interfaces ++# ++CONFIG_INPUT_MOUSEDEV=y ++# CONFIG_INPUT_MOUSEDEV_PSAUX is not set ++CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 ++CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 ++# CONFIG_INPUT_JOYDEV is not set ++CONFIG_INPUT_EVDEV=y ++# CONFIG_INPUT_EVBUG is not set ++ ++# ++# Input Device Drivers ++# ++CONFIG_INPUT_KEYBOARD=y ++# CONFIG_KEYBOARD_ATKBD is not set ++# CONFIG_KEYBOARD_SUNKBD is not set ++# CONFIG_KEYBOARD_LKKBD is not set ++# CONFIG_KEYBOARD_XTKBD is not set ++# CONFIG_KEYBOARD_NEWTON is not set ++# CONFIG_KEYBOARD_STOWAWAY is not set ++# CONFIG_INPUT_MOUSE is not set ++# CONFIG_INPUT_JOYSTICK is not set ++# CONFIG_INPUT_TABLET is not set ++# CONFIG_INPUT_TOUCHSCREEN is not set ++# CONFIG_INPUT_MISC is not set ++ ++# ++# Hardware I/O ports ++# ++CONFIG_SERIO=y ++CONFIG_SERIO_SERPORT=y ++# CONFIG_SERIO_RAW is not set ++# CONFIG_GAMEPORT is not set ++ ++# ++# Character devices ++# ++CONFIG_VT=y ++CONFIG_VT_CONSOLE=y ++CONFIG_HW_CONSOLE=y ++# CONFIG_VT_HW_CONSOLE_BINDING is not set ++# CONFIG_SERIAL_NONSTANDARD is not set ++ ++# ++# Serial drivers ++# ++# CONFIG_SERIAL_8250 is not set ++ ++# ++# Non-8250 serial port support ++# ++CONFIG_SERIAL_COLDFIRE=y ++# CONFIG_SERIAL_MCF is not set ++CONFIG_UNIX98_PTYS=y ++# CONFIG_LEGACY_PTYS is not set ++# CONFIG_IPMI_HANDLER is not set ++# CONFIG_HW_RANDOM is not set ++# CONFIG_GEN_RTC is not set ++# CONFIG_R3964 is not set ++# CONFIG_RAW_DRIVER is not set ++# CONFIG_TCG_TPM is not set ++CONFIG_I2C=y ++CONFIG_I2C_BOARDINFO=y ++CONFIG_I2C_CHARDEV=y ++ ++# ++# I2C Algorithms ++# ++# CONFIG_I2C_ALGOBIT is not set ++# CONFIG_I2C_ALGOPCF is not set ++# CONFIG_I2C_ALGOPCA is not set ++ ++# ++# I2C Hardware Bus support ++# ++# CONFIG_I2C_MCF548x is not set ++CONFIG_I2C_MCF=y ++# CONFIG_I2C_OCORES is not set ++# CONFIG_I2C_PARPORT_LIGHT is not set ++# CONFIG_I2C_SIMTEC is not set ++# CONFIG_I2C_TAOS_EVM is not set ++# CONFIG_I2C_STUB is not set ++ ++# ++# Miscellaneous I2C Chip support ++# ++# CONFIG_DS1682 is not set ++# CONFIG_SENSORS_EEPROM is not set ++# CONFIG_SENSORS_PCF8574 is not set ++# CONFIG_PCF8575 is not set ++# CONFIG_SENSORS_PCF8591 is not set ++# CONFIG_TPS65010 is not set ++# CONFIG_SENSORS_MAX6875 is not set ++# CONFIG_SENSORS_TSL2550 is not set ++# CONFIG_I2C_DEBUG_CORE is not set ++# CONFIG_I2C_DEBUG_ALGO is not set ++# CONFIG_I2C_DEBUG_BUS is not set ++# CONFIG_I2C_DEBUG_CHIP is not set ++ ++# ++# SPI support ++# ++# CONFIG_SPI is not set ++# CONFIG_COLDFIRE_EDMA is not set ++# CONFIG_SPI_MASTER is not set ++# CONFIG_W1 is not set ++# CONFIG_POWER_SUPPLY is not set ++# CONFIG_HWMON is not set ++# CONFIG_THERMAL is not set ++# CONFIG_WATCHDOG is not set ++ ++# ++# Sonics Silicon Backplane ++# ++CONFIG_SSB_POSSIBLE=y ++# CONFIG_SSB is not set ++ ++# ++# Multifunction device drivers ++# ++# CONFIG_MFD_SM501 is not set ++ ++# ++# Multimedia devices ++# ++# CONFIG_VIDEO_DEV is not set ++# CONFIG_DVB_CORE is not set ++CONFIG_DAB=y ++ ++# ++# Graphics support ++# ++# CONFIG_VGASTATE is not set ++CONFIG_VIDEO_OUTPUT_CONTROL=m ++# CONFIG_FB is not set ++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set ++ ++# ++# Display device support ++# ++# CONFIG_DISPLAY_SUPPORT is not set ++ ++# ++# Console display driver support ++# ++CONFIG_DUMMY_CONSOLE=y ++ ++# ++# Sound ++# ++# CONFIG_SOUND is not set ++# CONFIG_HID_SUPPORT is not set ++# CONFIG_USB_SUPPORT is not set ++# CONFIG_MMC is not set ++# CONFIG_MEMSTICK is not set ++# CONFIG_NEW_LEDS is not set ++# CONFIG_RTC_CLASS is not set ++ ++# ++# Userspace I/O ++# ++# CONFIG_UIO is not set ++ ++# ++# Character devices ++# ++# CONFIG_SERIAL_CONSOLE is not set ++ ++# ++# File systems ++# ++CONFIG_EXT2_FS=y ++# CONFIG_EXT2_FS_XATTR is not set ++# CONFIG_EXT2_FS_XIP is not set ++CONFIG_EXT3_FS=y ++CONFIG_EXT3_FS_XATTR=y ++# CONFIG_EXT3_FS_POSIX_ACL is not set ++# CONFIG_EXT3_FS_SECURITY is not set ++# CONFIG_EXT4DEV_FS is not set ++CONFIG_JBD=y ++CONFIG_FS_MBCACHE=y ++# CONFIG_REISERFS_FS is not set ++# CONFIG_JFS_FS is not set ++# CONFIG_FS_POSIX_ACL is not set ++# CONFIG_XFS_FS is not set ++# CONFIG_GFS2_FS is not set ++# CONFIG_OCFS2_FS is not set ++CONFIG_DNOTIFY=y ++# CONFIG_INOTIFY is not set ++# CONFIG_QUOTA is not set ++# CONFIG_AUTOFS_FS is not set ++# CONFIG_AUTOFS4_FS is not set ++# CONFIG_FUSE_FS is not set ++ ++# ++# CD-ROM/DVD Filesystems ++# ++# CONFIG_ISO9660_FS is not set ++# CONFIG_UDF_FS is not set ++ ++# ++# DOS/FAT/NT Filesystems ++# ++CONFIG_FAT_FS=y ++CONFIG_MSDOS_FS=y ++CONFIG_VFAT_FS=y ++CONFIG_FAT_DEFAULT_CODEPAGE=437 ++CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" ++CONFIG_NTFS_FS=y ++# CONFIG_NTFS_DEBUG is not set ++CONFIG_NTFS_RW=y ++ ++# ++# Pseudo filesystems ++# ++CONFIG_PROC_FS=y ++# CONFIG_PROC_KCORE is not set ++CONFIG_PROC_SYSCTL=y ++CONFIG_SYSFS=y ++CONFIG_TMPFS=y ++# CONFIG_TMPFS_POSIX_ACL is not set ++# CONFIG_HUGETLB_PAGE is not set ++# CONFIG_CONFIGFS_FS is not set ++ ++# ++# Miscellaneous filesystems ++# ++# CONFIG_ADFS_FS is not set ++# CONFIG_AFFS_FS is not set ++# CONFIG_HFS_FS is not set ++# CONFIG_HFSPLUS_FS is not set ++# CONFIG_BEFS_FS is not set ++# CONFIG_BFS_FS is not set ++# CONFIG_EFS_FS is not set ++# CONFIG_CRAMFS is not set ++# CONFIG_VXFS_FS is not set ++CONFIG_MINIX_FS=y ++# CONFIG_HPFS_FS is not set ++# CONFIG_QNX4FS_FS is not set ++# CONFIG_ROMFS_FS is not set ++# CONFIG_SYSV_FS is not set ++# CONFIG_UFS_FS is not set ++CONFIG_NETWORK_FILESYSTEMS=y ++CONFIG_NFS_FS=y ++# CONFIG_NFS_V3 is not set ++# CONFIG_NFS_V4 is not set ++# CONFIG_NFS_DIRECTIO is not set ++# CONFIG_NFSD is not set ++CONFIG_ROOT_NFS=y ++CONFIG_LOCKD=y ++CONFIG_NFS_COMMON=y ++CONFIG_SUNRPC=y ++# CONFIG_SUNRPC_BIND34 is not set ++# CONFIG_RPCSEC_GSS_KRB5 is not set ++# CONFIG_RPCSEC_GSS_SPKM3 is not set ++# CONFIG_SMB_FS is not set ++# CONFIG_CIFS is not set ++# CONFIG_NCP_FS is not set ++# CONFIG_CODA_FS is not set ++# CONFIG_AFS_FS is not set ++ ++# ++# Partition Types ++# ++CONFIG_PARTITION_ADVANCED=y ++# CONFIG_ACORN_PARTITION is not set ++# CONFIG_OSF_PARTITION is not set ++# CONFIG_AMIGA_PARTITION is not set ++# CONFIG_ATARI_PARTITION is not set ++# CONFIG_MAC_PARTITION is not set ++CONFIG_MSDOS_PARTITION=y ++# CONFIG_BSD_DISKLABEL is not set ++# CONFIG_MINIX_SUBPARTITION is not set ++# CONFIG_SOLARIS_X86_PARTITION is not set ++# CONFIG_UNIXWARE_DISKLABEL is not set ++# CONFIG_LDM_PARTITION is not set ++# CONFIG_SGI_PARTITION is not set ++# CONFIG_ULTRIX_PARTITION is not set ++# CONFIG_SUN_PARTITION is not set ++# CONFIG_KARMA_PARTITION is not set ++# CONFIG_EFI_PARTITION is not set ++# CONFIG_SYSV68_PARTITION is not set ++CONFIG_NLS=y ++CONFIG_NLS_DEFAULT="iso8859-1" ++CONFIG_NLS_CODEPAGE_437=y ++# CONFIG_NLS_CODEPAGE_737 is not set ++# CONFIG_NLS_CODEPAGE_775 is not set ++# CONFIG_NLS_CODEPAGE_850 is not set ++# CONFIG_NLS_CODEPAGE_852 is not set ++# CONFIG_NLS_CODEPAGE_855 is not set ++# CONFIG_NLS_CODEPAGE_857 is not set ++# CONFIG_NLS_CODEPAGE_860 is not set ++# CONFIG_NLS_CODEPAGE_861 is not set ++# CONFIG_NLS_CODEPAGE_862 is not set ++# CONFIG_NLS_CODEPAGE_863 is not set ++# CONFIG_NLS_CODEPAGE_864 is not set ++# CONFIG_NLS_CODEPAGE_865 is not set ++# CONFIG_NLS_CODEPAGE_866 is not set ++# CONFIG_NLS_CODEPAGE_869 is not set ++# CONFIG_NLS_CODEPAGE_936 is not set ++# CONFIG_NLS_CODEPAGE_950 is not set ++# CONFIG_NLS_CODEPAGE_932 is not set ++# CONFIG_NLS_CODEPAGE_949 is not set ++# CONFIG_NLS_CODEPAGE_874 is not set ++# CONFIG_NLS_ISO8859_8 is not set ++# CONFIG_NLS_CODEPAGE_1250 is not set ++# CONFIG_NLS_CODEPAGE_1251 is not set ++# CONFIG_NLS_ASCII is not set ++CONFIG_NLS_ISO8859_1=y ++# CONFIG_NLS_ISO8859_2 is not set ++# CONFIG_NLS_ISO8859_3 is not set ++# CONFIG_NLS_ISO8859_4 is not set ++# CONFIG_NLS_ISO8859_5 is not set ++# CONFIG_NLS_ISO8859_6 is not set ++# CONFIG_NLS_ISO8859_7 is not set ++# CONFIG_NLS_ISO8859_9 is not set ++# CONFIG_NLS_ISO8859_13 is not set ++# CONFIG_NLS_ISO8859_14 is not set ++# CONFIG_NLS_ISO8859_15 is not set ++# CONFIG_NLS_KOI8_R is not set ++# CONFIG_NLS_KOI8_U is not set ++CONFIG_NLS_UTF8=y ++# CONFIG_DLM is not set ++ ++# ++# Kernel hacking ++# ++# CONFIG_PRINTK_TIME is not set ++CONFIG_ENABLE_WARN_DEPRECATED=y ++# CONFIG_ENABLE_MUST_CHECK is not set ++# CONFIG_MAGIC_SYSRQ is not set ++# CONFIG_UNUSED_SYMBOLS is not set ++# CONFIG_DEBUG_FS is not set ++# CONFIG_HEADERS_CHECK is not set ++CONFIG_DEBUG_KERNEL=y ++CONFIG_DETECT_SOFTLOCKUP=y ++CONFIG_SCHED_DEBUG=y ++# CONFIG_SCHEDSTATS is not set ++# CONFIG_TIMER_STATS is not set ++CONFIG_DEBUG_SLAB=y ++# CONFIG_DEBUG_SLAB_LEAK is not set ++# CONFIG_DEBUG_RT_MUTEXES is not set ++# CONFIG_RT_MUTEX_TESTER is not set ++# CONFIG_DEBUG_SPINLOCK is not set ++# CONFIG_DEBUG_MUTEXES is not set ++# CONFIG_DEBUG_SPINLOCK_SLEEP is not set ++# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set ++# CONFIG_DEBUG_KOBJECT is not set ++CONFIG_DEBUG_BUGVERBOSE=y ++CONFIG_DEBUG_INFO=y ++# CONFIG_DEBUG_VM is not set ++# CONFIG_DEBUG_LIST is not set ++# CONFIG_DEBUG_SG is not set ++# CONFIG_FRAME_POINTER is not set ++# CONFIG_BOOT_PRINTK_DELAY is not set ++# CONFIG_RCU_TORTURE_TEST is not set ++# CONFIG_BACKTRACE_SELF_TEST is not set ++# CONFIG_FAULT_INJECTION is not set ++# CONFIG_SAMPLES is not set ++CONFIG_BOOTPARAM=y ++CONFIG_BOOTPARAM_STRING="root=/dev/nfs rw nfsroot=172.27.155.1:/tftpboot/redstripe ip=172.27.155.55:172.27.155.1:172.27.255.254:255.255.0.0::eth0:off mtdparts=phys_mapped_flash:16m(User)" ++ ++# ++# Security options ++# ++# CONFIG_KEYS is not set ++# CONFIG_SECURITY is not set ++# CONFIG_SECURITY_FILE_CAPABILITIES is not set ++CONFIG_CRYPTO=y ++CONFIG_CRYPTO_ALGAPI=y ++CONFIG_CRYPTO_AEAD=y ++CONFIG_CRYPTO_BLKCIPHER=y ++# CONFIG_CRYPTO_SEQIV is not set ++CONFIG_CRYPTO_HASH=y ++CONFIG_CRYPTO_MANAGER=y ++CONFIG_CRYPTO_HMAC=y ++# CONFIG_CRYPTO_XCBC is not set ++# CONFIG_CRYPTO_NULL is not set ++# CONFIG_CRYPTO_MD4 is not set ++CONFIG_CRYPTO_MD5=y ++CONFIG_CRYPTO_SHA1=y ++# CONFIG_CRYPTO_SHA256 is not set ++# CONFIG_CRYPTO_SHA512 is not set ++# CONFIG_CRYPTO_WP512 is not set ++# CONFIG_CRYPTO_TGR192 is not set ++# CONFIG_CRYPTO_GF128MUL is not set ++CONFIG_CRYPTO_ECB=y ++CONFIG_CRYPTO_CBC=y ++CONFIG_CRYPTO_PCBC=m ++# CONFIG_CRYPTO_LRW is not set ++# CONFIG_CRYPTO_XTS is not set ++# CONFIG_CRYPTO_CTR is not set ++# CONFIG_CRYPTO_GCM is not set ++# CONFIG_CRYPTO_CCM is not set ++# CONFIG_CRYPTO_CRYPTD is not set ++CONFIG_CRYPTO_DES=y ++# CONFIG_CRYPTO_FCRYPT is not set ++# CONFIG_CRYPTO_BLOWFISH is not set ++# CONFIG_CRYPTO_TWOFISH is not set ++# CONFIG_CRYPTO_SERPENT is not set ++# CONFIG_CRYPTO_AES is not set ++# CONFIG_CRYPTO_CAST5 is not set ++# CONFIG_CRYPTO_CAST6 is not set ++# CONFIG_CRYPTO_TEA is not set ++# CONFIG_CRYPTO_ARC4 is not set ++# CONFIG_CRYPTO_KHAZAD is not set ++# CONFIG_CRYPTO_ANUBIS is not set ++# CONFIG_CRYPTO_SEED is not set ++# CONFIG_CRYPTO_SALSA20 is not set ++# CONFIG_CRYPTO_DEFLATE is not set ++# CONFIG_CRYPTO_MICHAEL_MIC is not set ++# CONFIG_CRYPTO_CRC32C is not set ++# CONFIG_CRYPTO_CAMELLIA is not set ++CONFIG_CRYPTO_TEST=m ++CONFIG_CRYPTO_AUTHENC=y ++# CONFIG_CRYPTO_LZO is not set ++CONFIG_CRYPTO_HW=y ++# CONFIG_CRYPTO_DEV_MCFCAU is not set ++ ++# ++# Library routines ++# ++CONFIG_BITREVERSE=y ++CONFIG_CRC_CCITT=y ++CONFIG_CRC16=y ++# CONFIG_CRC_ITU_T is not set ++CONFIG_CRC32=y ++# CONFIG_CRC7 is not set ++CONFIG_LIBCRC32C=y ++CONFIG_PLIST=y ++CONFIG_HAS_IOMEM=y ++CONFIG_HAS_IOPORT=y ++CONFIG_HAS_DMA=y +--- a/arch/m68k/configs/m54455evb_defconfig ++++ b/arch/m68k/configs/m54455evb_defconfig +@@ -963,7 +963,7 @@ CONFIG_FORCED_INLINING=y + # CONFIG_RCU_TORTURE_TEST is not set + # CONFIG_FAULT_INJECTION is not set + CONFIG_BOOTPARAM=y +-CONFIG_BOOTPARAM_STRING="root=/dev/nfs rw nfsroot=172.27.163.2:/tftpboot/ltib ip=172.27.163.3:172.27.163.2:172.27.255.254:255.255.0.0::eth0:off mtdparts=phys_mapped_flash:16m(User)" ++CONFIG_BOOTPARAM_STRING="root=/dev/nfs rw nfsroot=172.27.155.1:/tftpboot/redstripe ip=172.27.155.55:172.27.155.1:172.27.255.254:255.255.0.0::eth0:off mtdparts=phys_mapped_flash:16m(User)" + + # + # CodeTEST Setup +--- /dev/null ++++ b/arch/m68k/configs/m5475evb_defconfig +@@ -0,0 +1,954 @@ ++# ++# Automatically generated make config: don't edit ++# Linux kernel version: 2.6.25 ++# Wed Jul 9 16:09:19 2008 ++# ++CONFIG_M68K=y ++CONFIG_MMU=y ++# CONFIG_GENERIC_TIME is not set ++# CONFIG_GENERIC_CLOCKEVENTS is not set ++CONFIG_RWSEM_GENERIC_SPINLOCK=y ++# CONFIG_ARCH_HAS_ILOG2_U32 is not set ++# CONFIG_ARCH_HAS_ILOG2_U64 is not set ++CONFIG_GENERIC_HWEIGHT=y ++CONFIG_GENERIC_CALIBRATE_DELAY=y ++CONFIG_TIME_LOW_RES=y ++CONFIG_GENERIC_IOMAP=y ++# CONFIG_NO_IOPORT is not set ++# CONFIG_NO_DMA is not set ++CONFIG_ARCH_SUPPORTS_AOUT=y ++CONFIG_HZ=100 ++CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" ++ ++# ++# General setup ++# ++CONFIG_EXPERIMENTAL=y ++CONFIG_BROKEN_ON_SMP=y ++CONFIG_INIT_ENV_ARG_LIMIT=32 ++CONFIG_LOCALVERSION="" ++CONFIG_LOCALVERSION_AUTO=y ++CONFIG_SWAP=y ++CONFIG_SYSVIPC=y ++CONFIG_SYSVIPC_SYSCTL=y ++# CONFIG_POSIX_MQUEUE is not set ++# CONFIG_BSD_PROCESS_ACCT is not set ++# CONFIG_TASKSTATS is not set ++# CONFIG_AUDIT is not set ++CONFIG_IKCONFIG=y ++CONFIG_IKCONFIG_PROC=y ++CONFIG_LOG_BUF_SHIFT=17 ++# CONFIG_CGROUPS is not set ++CONFIG_GROUP_SCHED=y ++CONFIG_FAIR_GROUP_SCHED=y ++# CONFIG_RT_GROUP_SCHED is not set ++CONFIG_USER_SCHED=y ++# CONFIG_CGROUP_SCHED is not set ++CONFIG_SYSFS_DEPRECATED=y ++CONFIG_SYSFS_DEPRECATED_V2=y ++# CONFIG_RELAY is not set ++CONFIG_NAMESPACES=y ++# CONFIG_UTS_NS is not set ++# CONFIG_IPC_NS is not set ++# CONFIG_USER_NS is not set ++# CONFIG_PID_NS is not set ++# CONFIG_BLK_DEV_INITRD is not set ++# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set ++CONFIG_SYSCTL=y ++# CONFIG_EMBEDDED is not set ++CONFIG_UID16=y ++CONFIG_SYSCTL_SYSCALL=y ++CONFIG_KALLSYMS=y ++# CONFIG_KALLSYMS_ALL is not set ++# CONFIG_KALLSYMS_EXTRA_PASS is not set ++CONFIG_HOTPLUG=y ++CONFIG_PRINTK=y ++CONFIG_BUG=y ++CONFIG_ELF_CORE=y ++CONFIG_COMPAT_BRK=y ++CONFIG_BASE_FULL=y ++CONFIG_FUTEX=y ++CONFIG_ANON_INODES=y ++CONFIG_EPOLL=y ++CONFIG_SIGNALFD=y ++CONFIG_TIMERFD=y ++CONFIG_EVENTFD=y ++CONFIG_SHMEM=y ++CONFIG_VM_EVENT_COUNTERS=y ++CONFIG_SLAB=y ++# CONFIG_SLUB is not set ++# CONFIG_SLOB is not set ++# CONFIG_PROFILING is not set ++# CONFIG_MARKERS is not set ++# CONFIG_HAVE_OPROFILE is not set ++# CONFIG_HAVE_KPROBES is not set ++# CONFIG_HAVE_KRETPROBES is not set ++CONFIG_PROC_PAGE_MONITOR=y ++CONFIG_SLABINFO=y ++CONFIG_RT_MUTEXES=y ++# CONFIG_TINY_SHMEM is not set ++CONFIG_BASE_SMALL=0 ++CONFIG_MODULES=y ++CONFIG_MODULE_UNLOAD=y ++CONFIG_MODULE_FORCE_UNLOAD=y ++# CONFIG_MODVERSIONS is not set ++# CONFIG_MODULE_SRCVERSION_ALL is not set ++# CONFIG_KMOD is not set ++CONFIG_BLOCK=y ++CONFIG_LBD=y ++# CONFIG_BLK_DEV_IO_TRACE is not set ++# CONFIG_LSF is not set ++# CONFIG_BLK_DEV_BSG is not set ++ ++# ++# IO Schedulers ++# ++CONFIG_IOSCHED_NOOP=y ++CONFIG_IOSCHED_AS=y ++CONFIG_IOSCHED_DEADLINE=y ++CONFIG_IOSCHED_CFQ=y ++# CONFIG_DEFAULT_AS is not set ++# CONFIG_DEFAULT_DEADLINE is not set ++CONFIG_DEFAULT_CFQ=y ++# CONFIG_DEFAULT_NOOP is not set ++CONFIG_DEFAULT_IOSCHED="cfq" ++CONFIG_CLASSIC_RCU=y ++ ++# ++# Platform dependent setup ++# ++# CONFIG_SUN3 is not set ++CONFIG_COLDFIRE=y ++CONFIG_CFV4E=y ++CONFIG_MCD_DMA=y ++# CONFIG_AMIGA is not set ++# CONFIG_ATARI is not set ++CONFIG_PCI=y ++# CONFIG_MAC is not set ++# CONFIG_APOLLO is not set ++# CONFIG_VME is not set ++# CONFIG_HP300 is not set ++# CONFIG_SUN3X is not set ++# CONFIG_Q40 is not set ++ ++# ++# Processor type ++# ++# CONFIG_M68020 is not set ++# CONFIG_M68030 is not set ++# CONFIG_M68040 is not set ++# CONFIG_M68060 is not set ++# CONFIG_M5445X is not set ++CONFIG_M547X_8X=y ++CONFIG_M547X=y ++# CONFIG_M548X is not set ++# CONFIG_M5475AFE is not set ++# CONFIG_M5475BFE is not set ++CONFIG_M5475CFE=y ++# CONFIG_M5475DFE is not set ++# CONFIG_M5475EFE is not set ++# CONFIG_M5475FFE is not set ++# CONFIG_M5485AFE is not set ++# CONFIG_M5485BFE is not set ++# CONFIG_M5485CFE is not set ++# CONFIG_M5485DFE is not set ++# CONFIG_M5485EFE is not set ++# CONFIG_M5485FFE is not set ++CONFIG_MCFCLK=266000000 ++# CONFIG_MCF_USER_HALT is not set ++CONFIG_MMU_CFV4E=y ++CONFIG_SDRAM_BASE=0x00000000 ++CONFIG_SDRAM_SIZE=0x04000000 ++CONFIG_NOR_FLASH_BASE=0xE0000000 ++# CONFIG_M68KFPU_EMU is not set ++CONFIG_ADVANCED=y ++# CONFIG_RMW_INSNS is not set ++CONFIG_SINGLE_MEMORY_CHUNK=y ++# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set ++CONFIG_SELECT_MEMORY_MODEL=y ++CONFIG_FLATMEM_MANUAL=y ++# CONFIG_DISCONTIGMEM_MANUAL is not set ++# CONFIG_SPARSEMEM_MANUAL is not set ++CONFIG_FLATMEM=y ++CONFIG_FLAT_NODE_MEM_MAP=y ++CONFIG_NEED_MULTIPLE_NODES=y ++# CONFIG_SPARSEMEM_STATIC is not set ++# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set ++CONFIG_SPLIT_PTLOCK_CPUS=4 ++# CONFIG_RESOURCES_64BIT is not set ++CONFIG_ZONE_DMA_FLAG=1 ++CONFIG_BOUNCE=y ++CONFIG_VIRT_TO_BUS=y ++ ++# ++# General setup ++# ++CONFIG_BINFMT_ELF=y ++# CONFIG_BINFMT_AOUT is not set ++# CONFIG_BINFMT_MISC is not set ++CONFIG_PROC_HARDWARE=y ++CONFIG_ZONE_DMA=y ++# CONFIG_ARCH_SUPPORTS_MSI is not set ++CONFIG_PCI_LEGACY=y ++# CONFIG_PCI_DEBUG is not set ++ ++# ++# Power management options ++# ++# CONFIG_PM is not set ++ ++# ++# Networking ++# ++CONFIG_NET=y ++ ++# ++# Networking options ++# ++CONFIG_PACKET=y ++# CONFIG_PACKET_MMAP is not set ++CONFIG_UNIX=y ++CONFIG_XFRM=y ++# CONFIG_XFRM_USER is not set ++# CONFIG_XFRM_SUB_POLICY is not set ++# CONFIG_XFRM_MIGRATE is not set ++# CONFIG_XFRM_STATISTICS is not set ++CONFIG_NET_KEY=y ++# CONFIG_NET_KEY_MIGRATE is not set ++CONFIG_INET=y ++# CONFIG_IP_MULTICAST is not set ++CONFIG_IP_ADVANCED_ROUTER=y ++CONFIG_ASK_IP_FIB_HASH=y ++# CONFIG_IP_FIB_TRIE is not set ++CONFIG_IP_FIB_HASH=y ++# CONFIG_IP_MULTIPLE_TABLES is not set ++# CONFIG_IP_ROUTE_MULTIPATH is not set ++# CONFIG_IP_ROUTE_VERBOSE is not set ++CONFIG_IP_PNP=y ++# CONFIG_IP_PNP_DHCP is not set ++# CONFIG_IP_PNP_BOOTP is not set ++# CONFIG_IP_PNP_RARP is not set ++# CONFIG_NET_IPIP is not set ++# CONFIG_NET_IPGRE is not set ++# CONFIG_ARPD is not set ++# CONFIG_SYN_COOKIES is not set ++CONFIG_INET_AH=y ++CONFIG_INET_ESP=y ++# CONFIG_INET_IPCOMP is not set ++# CONFIG_INET_XFRM_TUNNEL is not set ++# CONFIG_INET_TUNNEL is not set ++# CONFIG_INET_XFRM_MODE_TRANSPORT is not set ++# CONFIG_INET_XFRM_MODE_TUNNEL is not set ++# CONFIG_INET_XFRM_MODE_BEET is not set ++# CONFIG_INET_LRO is not set ++CONFIG_INET_DIAG=y ++CONFIG_INET_TCP_DIAG=y ++# CONFIG_TCP_CONG_ADVANCED is not set ++CONFIG_TCP_CONG_CUBIC=y ++CONFIG_DEFAULT_TCP_CONG="cubic" ++# CONFIG_TCP_MD5SIG is not set ++# CONFIG_IPV6 is not set ++# CONFIG_INET6_XFRM_TUNNEL is not set ++# CONFIG_INET6_TUNNEL is not set ++# CONFIG_NETWORK_SECMARK is not set ++# CONFIG_NETFILTER is not set ++# CONFIG_IP_DCCP is not set ++# CONFIG_IP_SCTP is not set ++# CONFIG_TIPC is not set ++# CONFIG_ATM is not set ++# CONFIG_BRIDGE is not set ++# CONFIG_VLAN_8021Q is not set ++# CONFIG_DECNET is not set ++# CONFIG_LLC2 is not set ++# CONFIG_IPX is not set ++# CONFIG_ATALK is not set ++# CONFIG_X25 is not set ++# CONFIG_LAPB is not set ++# CONFIG_ECONET is not set ++# CONFIG_WAN_ROUTER is not set ++# CONFIG_NET_SCHED is not set ++ ++# ++# Network testing ++# ++# CONFIG_NET_PKTGEN is not set ++# CONFIG_HAMRADIO is not set ++CONFIG_CAN=y ++CONFIG_CAN_RAW=y ++# CONFIG_CAN_BCM is not set ++ ++# ++# CAN Device Drivers ++# ++# CONFIG_CAN_VCAN is not set ++CONFIG_CAN_FLEXCAN=y ++CONFIG_CAN_MCF547X_8X=y ++# CONFIG_CAN_DEBUG_DEVICES is not set ++# CONFIG_IRDA is not set ++# CONFIG_BT is not set ++# CONFIG_AF_RXRPC is not set ++ ++# ++# Wireless ++# ++# CONFIG_CFG80211 is not set ++# CONFIG_WIRELESS_EXT is not set ++# CONFIG_MAC80211 is not set ++# CONFIG_IEEE80211 is not set ++# CONFIG_RFKILL is not set ++# CONFIG_NET_9P is not set ++ ++# ++# Device Drivers ++# ++ ++# ++# Generic Driver Options ++# ++CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" ++# CONFIG_STANDALONE is not set ++CONFIG_PREVENT_FIRMWARE_BUILD=y ++CONFIG_FW_LOADER=y ++# CONFIG_DEBUG_DRIVER is not set ++# CONFIG_DEBUG_DEVRES is not set ++# CONFIG_SYS_HYPERVISOR is not set ++# CONFIG_CONNECTOR is not set ++CONFIG_MTD=y ++# CONFIG_MTD_DEBUG is not set ++# CONFIG_MTD_CONCAT is not set ++CONFIG_MTD_PARTITIONS=y ++# CONFIG_MTD_REDBOOT_PARTS is not set ++CONFIG_MTD_CMDLINE_PARTS=y ++ ++# ++# User Modules And Translation Layers ++# ++# CONFIG_MTD_CHAR is not set ++CONFIG_MTD_BLKDEVS=y ++CONFIG_MTD_BLOCK=y ++# CONFIG_FTL is not set ++# CONFIG_NFTL is not set ++# CONFIG_INFTL is not set ++# CONFIG_RFD_FTL is not set ++# CONFIG_SSFDC is not set ++# CONFIG_MTD_OOPS is not set ++ ++# ++# RAM/ROM/Flash chip drivers ++# ++# CONFIG_MTD_CFI is not set ++# CONFIG_MTD_JEDECPROBE is not set ++CONFIG_MTD_MAP_BANK_WIDTH_1=y ++CONFIG_MTD_MAP_BANK_WIDTH_2=y ++CONFIG_MTD_MAP_BANK_WIDTH_4=y ++# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set ++# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set ++# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set ++CONFIG_MTD_CFI_I1=y ++CONFIG_MTD_CFI_I2=y ++# CONFIG_MTD_CFI_I4 is not set ++# CONFIG_MTD_CFI_I8 is not set ++CONFIG_MTD_RAM=y ++CONFIG_MTD_ROM=y ++# CONFIG_MTD_ABSENT is not set ++ ++# ++# Mapping drivers for chip access ++# ++# CONFIG_MTD_COMPLEX_MAPPINGS is not set ++# CONFIG_MTD_PHYSMAP is not set ++# CONFIG_MTD_INTEL_VR_NOR is not set ++# CONFIG_MTD_PLATRAM is not set ++ ++# ++# Self-contained MTD device drivers ++# ++# CONFIG_MTD_PMC551 is not set ++# CONFIG_MTD_DATAFLASH is not set ++# CONFIG_MTD_M25P80 is not set ++# CONFIG_MTD_SLRAM is not set ++# CONFIG_MTD_PHRAM is not set ++# CONFIG_MTD_MTDRAM is not set ++# CONFIG_MTD_BLOCK2MTD is not set ++ ++# ++# Disk-On-Chip Device Drivers ++# ++# CONFIG_MTD_DOC2000 is not set ++# CONFIG_MTD_DOC2001 is not set ++# CONFIG_MTD_DOC2001PLUS is not set ++# CONFIG_MTD_NAND is not set ++# CONFIG_MTD_ONENAND is not set ++ ++# ++# UBI - Unsorted block images ++# ++# CONFIG_MTD_UBI is not set ++# CONFIG_PARPORT is not set ++CONFIG_BLK_DEV=y ++# CONFIG_BLK_CPQ_DA is not set ++# CONFIG_BLK_CPQ_CISS_DA is not set ++# CONFIG_BLK_DEV_DAC960 is not set ++# CONFIG_BLK_DEV_UMEM is not set ++# CONFIG_BLK_DEV_COW_COMMON is not set ++CONFIG_BLK_DEV_LOOP=y ++# CONFIG_BLK_DEV_CRYPTOLOOP is not set ++# CONFIG_BLK_DEV_NBD is not set ++# CONFIG_BLK_DEV_SX8 is not set ++CONFIG_BLK_DEV_RAM=y ++CONFIG_BLK_DEV_RAM_COUNT=16 ++CONFIG_BLK_DEV_RAM_SIZE=64000 ++# CONFIG_BLK_DEV_XIP is not set ++# CONFIG_CDROM_PKTCDVD is not set ++# CONFIG_ATA_OVER_ETH is not set ++CONFIG_MISC_DEVICES=y ++CONFIG_COLDFIRE_SEC=y ++CONFIG_SEC_DEVICE=y ++# CONFIG_PHANTOM is not set ++# CONFIG_EEPROM_93CX6 is not set ++# CONFIG_SGI_IOC4 is not set ++# CONFIG_TIFM_CORE is not set ++# CONFIG_ENCLOSURE_SERVICES is not set ++CONFIG_HAVE_IDE=y ++# CONFIG_IDE is not set ++ ++# ++# SCSI device support ++# ++# CONFIG_RAID_ATTRS is not set ++CONFIG_SCSI=y ++CONFIG_SCSI_DMA=y ++# CONFIG_SCSI_TGT is not set ++# CONFIG_SCSI_NETLINK is not set ++CONFIG_SCSI_PROC_FS=y ++ ++# ++# SCSI support type (disk, tape, CD-ROM) ++# ++CONFIG_BLK_DEV_SD=y ++# CONFIG_CHR_DEV_ST is not set ++# CONFIG_CHR_DEV_OSST is not set ++# CONFIG_BLK_DEV_SR is not set ++# CONFIG_CHR_DEV_SG is not set ++# CONFIG_CHR_DEV_SCH is not set ++ ++# ++# Some SCSI devices (e.g. CD jukebox) support multiple LUNs ++# ++CONFIG_SCSI_MULTI_LUN=y ++# CONFIG_SCSI_CONSTANTS is not set ++# CONFIG_SCSI_LOGGING is not set ++# CONFIG_SCSI_SCAN_ASYNC is not set ++CONFIG_SCSI_WAIT_SCAN=m ++ ++# ++# SCSI Transports ++# ++# CONFIG_SCSI_SPI_ATTRS is not set ++# CONFIG_SCSI_FC_ATTRS is not set ++# CONFIG_SCSI_ISCSI_ATTRS is not set ++# CONFIG_SCSI_SAS_LIBSAS is not set ++# CONFIG_SCSI_SRP_ATTRS is not set ++# CONFIG_SCSI_LOWLEVEL is not set ++# CONFIG_ATA is not set ++# CONFIG_MD is not set ++# CONFIG_FUSION is not set ++ ++# ++# IEEE 1394 (FireWire) support ++# ++# CONFIG_FIREWIRE is not set ++# CONFIG_IEEE1394 is not set ++# CONFIG_I2O is not set ++CONFIG_NETDEVICES=y ++# CONFIG_NETDEVICES_MULTIQUEUE is not set ++# CONFIG_DUMMY is not set ++# CONFIG_BONDING is not set ++# CONFIG_MACVLAN is not set ++# CONFIG_EQUALIZER is not set ++# CONFIG_TUN is not set ++# CONFIG_VETH is not set ++# CONFIG_ARCNET is not set ++# CONFIG_PHYLIB is not set ++CONFIG_NET_ETHERNET=y ++CONFIG_MII=y ++CONFIG_FEC_548x=y ++CONFIG_FEC_548x_AUTO_NEGOTIATION=y ++# CONFIG_FEC_548x_ENABLE_FEC2 is not set ++# CONFIG_HAPPYMEAL is not set ++# CONFIG_SUNGEM is not set ++# CONFIG_CASSINI is not set ++# CONFIG_NET_VENDOR_3COM is not set ++# CONFIG_ENC28J60 is not set ++# CONFIG_NET_TULIP is not set ++# CONFIG_HP100 is not set ++# CONFIG_IBM_NEW_EMAC_ZMII is not set ++# CONFIG_IBM_NEW_EMAC_RGMII is not set ++# CONFIG_IBM_NEW_EMAC_TAH is not set ++# CONFIG_IBM_NEW_EMAC_EMAC4 is not set ++# CONFIG_NET_PCI is not set ++# CONFIG_B44 is not set ++# CONFIG_NETDEV_1000 is not set ++# CONFIG_NETDEV_10000 is not set ++# CONFIG_TR is not set ++ ++# ++# Wireless LAN ++# ++# CONFIG_WLAN_PRE80211 is not set ++# CONFIG_WLAN_80211 is not set ++# CONFIG_WAN is not set ++# CONFIG_FDDI is not set ++# CONFIG_HIPPI is not set ++# CONFIG_PPP is not set ++# CONFIG_SLIP is not set ++# CONFIG_NET_FC is not set ++# CONFIG_NETCONSOLE is not set ++# CONFIG_NETPOLL is not set ++# CONFIG_NET_POLL_CONTROLLER is not set ++# CONFIG_ISDN is not set ++# CONFIG_PHONE is not set ++ ++# ++# Input device support ++# ++CONFIG_INPUT=y ++# CONFIG_INPUT_FF_MEMLESS is not set ++# CONFIG_INPUT_POLLDEV is not set ++ ++# ++# Userland interfaces ++# ++CONFIG_INPUT_MOUSEDEV=y ++# CONFIG_INPUT_MOUSEDEV_PSAUX is not set ++CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 ++CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 ++# CONFIG_INPUT_JOYDEV is not set ++CONFIG_INPUT_EVDEV=y ++# CONFIG_INPUT_EVBUG is not set ++ ++# ++# Input Device Drivers ++# ++CONFIG_INPUT_KEYBOARD=y ++# CONFIG_KEYBOARD_ATKBD is not set ++# CONFIG_KEYBOARD_SUNKBD is not set ++# CONFIG_KEYBOARD_LKKBD is not set ++# CONFIG_KEYBOARD_XTKBD is not set ++# CONFIG_KEYBOARD_NEWTON is not set ++# CONFIG_KEYBOARD_STOWAWAY is not set ++# CONFIG_INPUT_MOUSE is not set ++# CONFIG_INPUT_JOYSTICK is not set ++# CONFIG_INPUT_TABLET is not set ++# CONFIG_INPUT_TOUCHSCREEN is not set ++# CONFIG_INPUT_MISC is not set ++ ++# ++# Hardware I/O ports ++# ++CONFIG_SERIO=y ++CONFIG_SERIO_SERPORT=y ++# CONFIG_SERIO_PCIPS2 is not set ++# CONFIG_SERIO_RAW is not set ++# CONFIG_GAMEPORT is not set ++ ++# ++# Character devices ++# ++CONFIG_VT=y ++CONFIG_VT_CONSOLE=y ++CONFIG_HW_CONSOLE=y ++# CONFIG_VT_HW_CONSOLE_BINDING is not set ++# CONFIG_SERIAL_NONSTANDARD is not set ++# CONFIG_NOZOMI is not set ++ ++# ++# Serial drivers ++# ++# CONFIG_SERIAL_8250 is not set ++ ++# ++# Non-8250 serial port support ++# ++CONFIG_SERIAL_COLDFIRE=y ++CONFIG_SERIAL_COLDFIRE_IRDA=y ++# CONFIG_SERIAL_MCF is not set ++# CONFIG_SERIAL_JSM is not set ++CONFIG_UNIX98_PTYS=y ++# CONFIG_LEGACY_PTYS is not set ++# CONFIG_IPMI_HANDLER is not set ++# CONFIG_HW_RANDOM is not set ++# CONFIG_GEN_RTC is not set ++# CONFIG_R3964 is not set ++# CONFIG_APPLICOM is not set ++# CONFIG_RAW_DRIVER is not set ++# CONFIG_TCG_TPM is not set ++# CONFIG_I2C is not set ++ ++# ++# SPI support ++# ++CONFIG_SPI=y ++CONFIG_SPI_DEBUG=y ++# CONFIG_COLDFIRE_EDMA is not set ++CONFIG_SPI_MASTER=y ++ ++# ++# SPI Master Controller Drivers ++# ++# CONFIG_SPI_BITBANG is not set ++CONFIG_SPI_COLDFIRE=y ++ ++# ++# SPI Protocol Masters ++# ++# CONFIG_SPI_AT25 is not set ++# CONFIG_SPI_SPIDEV is not set ++# CONFIG_SPI_TLE62X0 is not set ++# CONFIG_SPI_COLDFIRE_SSI_AUDIO is not set ++# CONFIG_W1 is not set ++# CONFIG_POWER_SUPPLY is not set ++# CONFIG_HWMON is not set ++# CONFIG_THERMAL is not set ++CONFIG_WATCHDOG=y ++# CONFIG_WATCHDOG_NOWAYOUT is not set ++ ++# ++# Watchdog Device Drivers ++# ++# CONFIG_SOFT_WATCHDOG is not set ++CONFIG_COLDFIRE_WATCHDOG=m ++ ++# ++# PCI-based Watchdog Cards ++# ++# CONFIG_PCIPCWATCHDOG is not set ++# CONFIG_WDTPCI is not set ++ ++# ++# Sonics Silicon Backplane ++# ++CONFIG_SSB_POSSIBLE=y ++# CONFIG_SSB is not set ++ ++# ++# Multifunction device drivers ++# ++# CONFIG_MFD_SM501 is not set ++ ++# ++# Multimedia devices ++# ++# CONFIG_VIDEO_DEV is not set ++# CONFIG_DVB_CORE is not set ++CONFIG_DAB=y ++ ++# ++# Graphics support ++# ++# CONFIG_DRM is not set ++# CONFIG_VGASTATE is not set ++CONFIG_VIDEO_OUTPUT_CONTROL=m ++# CONFIG_FB is not set ++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set ++ ++# ++# Display device support ++# ++# CONFIG_DISPLAY_SUPPORT is not set ++ ++# ++# Console display driver support ++# ++CONFIG_DUMMY_CONSOLE=y ++ ++# ++# Sound ++# ++# CONFIG_SOUND is not set ++CONFIG_HID_SUPPORT=y ++CONFIG_HID=y ++CONFIG_HID_DEBUG=y ++# CONFIG_HIDRAW is not set ++# CONFIG_USB_SUPPORT is not set ++# CONFIG_MMC is not set ++# CONFIG_MEMSTICK is not set ++# CONFIG_NEW_LEDS is not set ++# CONFIG_INFINIBAND is not set ++# CONFIG_RTC_CLASS is not set ++ ++# ++# Userspace I/O ++# ++# CONFIG_UIO is not set ++ ++# ++# Character devices ++# ++# CONFIG_SERIAL_CONSOLE is not set ++ ++# ++# File systems ++# ++CONFIG_EXT2_FS=y ++# CONFIG_EXT2_FS_XATTR is not set ++# CONFIG_EXT2_FS_XIP is not set ++CONFIG_EXT3_FS=y ++CONFIG_EXT3_FS_XATTR=y ++# CONFIG_EXT3_FS_POSIX_ACL is not set ++# CONFIG_EXT3_FS_SECURITY is not set ++# CONFIG_EXT4DEV_FS is not set ++CONFIG_JBD=y ++CONFIG_FS_MBCACHE=y ++# CONFIG_REISERFS_FS is not set ++# CONFIG_JFS_FS is not set ++# CONFIG_FS_POSIX_ACL is not set ++# CONFIG_XFS_FS is not set ++# CONFIG_GFS2_FS is not set ++# CONFIG_OCFS2_FS is not set ++CONFIG_DNOTIFY=y ++# CONFIG_INOTIFY is not set ++# CONFIG_QUOTA is not set ++# CONFIG_AUTOFS_FS is not set ++# CONFIG_AUTOFS4_FS is not set ++# CONFIG_FUSE_FS is not set ++ ++# ++# CD-ROM/DVD Filesystems ++# ++# CONFIG_ISO9660_FS is not set ++# CONFIG_UDF_FS is not set ++ ++# ++# DOS/FAT/NT Filesystems ++# ++CONFIG_FAT_FS=y ++CONFIG_MSDOS_FS=y ++CONFIG_VFAT_FS=y ++CONFIG_FAT_DEFAULT_CODEPAGE=437 ++CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" ++CONFIG_NTFS_FS=y ++# CONFIG_NTFS_DEBUG is not set ++CONFIG_NTFS_RW=y ++ ++# ++# Pseudo filesystems ++# ++CONFIG_PROC_FS=y ++# CONFIG_PROC_KCORE is not set ++CONFIG_PROC_SYSCTL=y ++CONFIG_SYSFS=y ++CONFIG_TMPFS=y ++# CONFIG_TMPFS_POSIX_ACL is not set ++# CONFIG_HUGETLB_PAGE is not set ++# CONFIG_CONFIGFS_FS is not set ++ ++# ++# Miscellaneous filesystems ++# ++# CONFIG_ADFS_FS is not set ++# CONFIG_AFFS_FS is not set ++# CONFIG_HFS_FS is not set ++# CONFIG_HFSPLUS_FS is not set ++# CONFIG_BEFS_FS is not set ++# CONFIG_BFS_FS is not set ++# CONFIG_EFS_FS is not set ++# CONFIG_JFFS2_FS is not set ++# CONFIG_CRAMFS is not set ++# CONFIG_VXFS_FS is not set ++CONFIG_MINIX_FS=y ++# CONFIG_HPFS_FS is not set ++# CONFIG_QNX4FS_FS is not set ++CONFIG_ROMFS_FS=y ++# CONFIG_SYSV_FS is not set ++# CONFIG_UFS_FS is not set ++CONFIG_NETWORK_FILESYSTEMS=y ++CONFIG_NFS_FS=y ++# CONFIG_NFS_V3 is not set ++# CONFIG_NFS_V4 is not set ++# CONFIG_NFS_DIRECTIO is not set ++# CONFIG_NFSD is not set ++CONFIG_ROOT_NFS=y ++CONFIG_LOCKD=y ++CONFIG_NFS_COMMON=y ++CONFIG_SUNRPC=y ++# CONFIG_SUNRPC_BIND34 is not set ++# CONFIG_RPCSEC_GSS_KRB5 is not set ++# CONFIG_RPCSEC_GSS_SPKM3 is not set ++# CONFIG_SMB_FS is not set ++# CONFIG_CIFS is not set ++# CONFIG_NCP_FS is not set ++# CONFIG_CODA_FS is not set ++# CONFIG_AFS_FS is not set ++ ++# ++# Partition Types ++# ++CONFIG_PARTITION_ADVANCED=y ++# CONFIG_ACORN_PARTITION is not set ++# CONFIG_OSF_PARTITION is not set ++# CONFIG_AMIGA_PARTITION is not set ++# CONFIG_ATARI_PARTITION is not set ++# CONFIG_MAC_PARTITION is not set ++CONFIG_MSDOS_PARTITION=y ++# CONFIG_BSD_DISKLABEL is not set ++# CONFIG_MINIX_SUBPARTITION is not set ++# CONFIG_SOLARIS_X86_PARTITION is not set ++# CONFIG_UNIXWARE_DISKLABEL is not set ++# CONFIG_LDM_PARTITION is not set ++# CONFIG_SGI_PARTITION is not set ++# CONFIG_ULTRIX_PARTITION is not set ++# CONFIG_SUN_PARTITION is not set ++# CONFIG_KARMA_PARTITION is not set ++# CONFIG_EFI_PARTITION is not set ++# CONFIG_SYSV68_PARTITION is not set ++CONFIG_NLS=y ++CONFIG_NLS_DEFAULT="iso8859-1" ++CONFIG_NLS_CODEPAGE_437=y ++# CONFIG_NLS_CODEPAGE_737 is not set ++# CONFIG_NLS_CODEPAGE_775 is not set ++# CONFIG_NLS_CODEPAGE_850 is not set ++# CONFIG_NLS_CODEPAGE_852 is not set ++# CONFIG_NLS_CODEPAGE_855 is not set ++# CONFIG_NLS_CODEPAGE_857 is not set ++# CONFIG_NLS_CODEPAGE_860 is not set ++# CONFIG_NLS_CODEPAGE_861 is not set ++# CONFIG_NLS_CODEPAGE_862 is not set ++# CONFIG_NLS_CODEPAGE_863 is not set ++# CONFIG_NLS_CODEPAGE_864 is not set ++# CONFIG_NLS_CODEPAGE_865 is not set ++# CONFIG_NLS_CODEPAGE_866 is not set ++# CONFIG_NLS_CODEPAGE_869 is not set ++# CONFIG_NLS_CODEPAGE_936 is not set ++# CONFIG_NLS_CODEPAGE_950 is not set ++# CONFIG_NLS_CODEPAGE_932 is not set ++# CONFIG_NLS_CODEPAGE_949 is not set ++# CONFIG_NLS_CODEPAGE_874 is not set ++# CONFIG_NLS_ISO8859_8 is not set ++# CONFIG_NLS_CODEPAGE_1250 is not set ++# CONFIG_NLS_CODEPAGE_1251 is not set ++# CONFIG_NLS_ASCII is not set ++CONFIG_NLS_ISO8859_1=y ++# CONFIG_NLS_ISO8859_2 is not set ++# CONFIG_NLS_ISO8859_3 is not set ++# CONFIG_NLS_ISO8859_4 is not set ++# CONFIG_NLS_ISO8859_5 is not set ++# CONFIG_NLS_ISO8859_6 is not set ++# CONFIG_NLS_ISO8859_7 is not set ++# CONFIG_NLS_ISO8859_9 is not set ++# CONFIG_NLS_ISO8859_13 is not set ++# CONFIG_NLS_ISO8859_14 is not set ++# CONFIG_NLS_ISO8859_15 is not set ++# CONFIG_NLS_KOI8_R is not set ++# CONFIG_NLS_KOI8_U is not set ++CONFIG_NLS_UTF8=y ++# CONFIG_DLM is not set ++ ++# ++# Kernel hacking ++# ++# CONFIG_PRINTK_TIME is not set ++CONFIG_ENABLE_WARN_DEPRECATED=y ++# CONFIG_ENABLE_MUST_CHECK is not set ++# CONFIG_MAGIC_SYSRQ is not set ++# CONFIG_UNUSED_SYMBOLS is not set ++# CONFIG_DEBUG_FS is not set ++# CONFIG_HEADERS_CHECK is not set ++CONFIG_DEBUG_KERNEL=y ++CONFIG_DETECT_SOFTLOCKUP=y ++CONFIG_SCHED_DEBUG=y ++# CONFIG_SCHEDSTATS is not set ++# CONFIG_TIMER_STATS is not set ++CONFIG_DEBUG_SLAB=y ++# CONFIG_DEBUG_SLAB_LEAK is not set ++# CONFIG_DEBUG_RT_MUTEXES is not set ++# CONFIG_RT_MUTEX_TESTER is not set ++# CONFIG_DEBUG_SPINLOCK is not set ++# CONFIG_DEBUG_MUTEXES is not set ++# CONFIG_DEBUG_SPINLOCK_SLEEP is not set ++# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set ++# CONFIG_DEBUG_KOBJECT is not set ++CONFIG_DEBUG_BUGVERBOSE=y ++CONFIG_DEBUG_INFO=y ++# CONFIG_DEBUG_VM is not set ++# CONFIG_DEBUG_LIST is not set ++# CONFIG_DEBUG_SG is not set ++# CONFIG_FRAME_POINTER is not set ++# CONFIG_BOOT_PRINTK_DELAY is not set ++# CONFIG_RCU_TORTURE_TEST is not set ++# CONFIG_BACKTRACE_SELF_TEST is not set ++# CONFIG_FAULT_INJECTION is not set ++# CONFIG_SAMPLES is not set ++CONFIG_BOOTPARAM=y ++CONFIG_BOOTPARAM_STRING="root=/dev/nfs rw nfsroot=172.27.163.2:/tftpboot/ltib ip=172.27.163.3:172.27.163.2:172.27.255.254:255.255.0.0::eth0:off mtdparts=phys_mapped_flash:16m(User)" ++ ++# ++# Security options ++# ++# CONFIG_KEYS is not set ++# CONFIG_SECURITY is not set ++# CONFIG_SECURITY_FILE_CAPABILITIES is not set ++CONFIG_CRYPTO=y ++CONFIG_CRYPTO_ALGAPI=y ++CONFIG_CRYPTO_AEAD=y ++CONFIG_CRYPTO_BLKCIPHER=y ++# CONFIG_CRYPTO_SEQIV is not set ++CONFIG_CRYPTO_HASH=y ++CONFIG_CRYPTO_MANAGER=y ++CONFIG_CRYPTO_HMAC=y ++# CONFIG_CRYPTO_XCBC is not set ++# CONFIG_CRYPTO_NULL is not set ++# CONFIG_CRYPTO_MD4 is not set ++CONFIG_CRYPTO_MD5=y ++CONFIG_CRYPTO_SHA1=y ++# CONFIG_CRYPTO_SHA256 is not set ++# CONFIG_CRYPTO_SHA512 is not set ++# CONFIG_CRYPTO_WP512 is not set ++# CONFIG_CRYPTO_TGR192 is not set ++# CONFIG_CRYPTO_GF128MUL is not set ++# CONFIG_CRYPTO_ECB is not set ++CONFIG_CRYPTO_CBC=y ++# CONFIG_CRYPTO_PCBC is not set ++# CONFIG_CRYPTO_LRW is not set ++# CONFIG_CRYPTO_XTS is not set ++# CONFIG_CRYPTO_CTR is not set ++# CONFIG_CRYPTO_GCM is not set ++# CONFIG_CRYPTO_CCM is not set ++# CONFIG_CRYPTO_CRYPTD is not set ++CONFIG_CRYPTO_DES=y ++# CONFIG_CRYPTO_FCRYPT is not set ++# CONFIG_CRYPTO_BLOWFISH is not set ++# CONFIG_CRYPTO_TWOFISH is not set ++# CONFIG_CRYPTO_SERPENT is not set ++# CONFIG_CRYPTO_AES is not set ++# CONFIG_CRYPTO_CAST5 is not set ++# CONFIG_CRYPTO_CAST6 is not set ++# CONFIG_CRYPTO_TEA is not set ++# CONFIG_CRYPTO_ARC4 is not set ++# CONFIG_CRYPTO_KHAZAD is not set ++# CONFIG_CRYPTO_ANUBIS is not set ++# CONFIG_CRYPTO_SEED is not set ++# CONFIG_CRYPTO_SALSA20 is not set ++# CONFIG_CRYPTO_DEFLATE is not set ++# CONFIG_CRYPTO_MICHAEL_MIC is not set ++# CONFIG_CRYPTO_CRC32C is not set ++# CONFIG_CRYPTO_CAMELLIA is not set ++CONFIG_CRYPTO_TEST=m ++CONFIG_CRYPTO_AUTHENC=y ++# CONFIG_CRYPTO_LZO is not set ++# CONFIG_CRYPTO_HW is not set ++ ++# ++# Library routines ++# ++CONFIG_BITREVERSE=y ++CONFIG_CRC_CCITT=y ++CONFIG_CRC16=y ++# CONFIG_CRC_ITU_T is not set ++CONFIG_CRC32=y ++# CONFIG_CRC7 is not set ++CONFIG_LIBCRC32C=y ++CONFIG_PLIST=y ++CONFIG_HAS_IOMEM=y ++CONFIG_HAS_IOPORT=y ++CONFIG_HAS_DMA=y +--- a/arch/m68k/configs/m5485evb_defconfig ++++ b/arch/m68k/configs/m5485evb_defconfig +@@ -1,7 +1,7 @@ + # + # Automatically generated make config: don't edit +-# Linux kernel version: 2.6.24 +-# Wed Mar 5 16:05:25 2008 ++# Linux kernel version: 2.6.25 ++# Thu Jul 10 16:12:53 2008 + # + CONFIG_M68K=y + CONFIG_MMU=y +@@ -16,6 +16,8 @@ CONFIG_TIME_LOW_RES=y + CONFIG_GENERIC_IOMAP=y + # CONFIG_NO_IOPORT is not set + # CONFIG_NO_DMA is not set ++CONFIG_ARCH_SUPPORTS_AOUT=y ++CONFIG_HZ=100 + CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" + + # +@@ -32,18 +34,24 @@ CONFIG_SYSVIPC_SYSCTL=y + # CONFIG_POSIX_MQUEUE is not set + # CONFIG_BSD_PROCESS_ACCT is not set + # CONFIG_TASKSTATS is not set +-# CONFIG_USER_NS is not set +-# CONFIG_PID_NS is not set + # CONFIG_AUDIT is not set + CONFIG_IKCONFIG=y + CONFIG_IKCONFIG_PROC=y + CONFIG_LOG_BUF_SHIFT=17 + # CONFIG_CGROUPS is not set ++CONFIG_GROUP_SCHED=y + CONFIG_FAIR_GROUP_SCHED=y +-CONFIG_FAIR_USER_SCHED=y +-# CONFIG_FAIR_CGROUP_SCHED is not set ++# CONFIG_RT_GROUP_SCHED is not set ++CONFIG_USER_SCHED=y ++# CONFIG_CGROUP_SCHED is not set + CONFIG_SYSFS_DEPRECATED=y ++CONFIG_SYSFS_DEPRECATED_V2=y + # CONFIG_RELAY is not set ++CONFIG_NAMESPACES=y ++# CONFIG_UTS_NS is not set ++# CONFIG_IPC_NS is not set ++# CONFIG_USER_NS is not set ++# CONFIG_PID_NS is not set + # CONFIG_BLK_DEV_INITRD is not set + # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set + CONFIG_SYSCTL=y +@@ -57,17 +65,25 @@ CONFIG_HOTPLUG=y + CONFIG_PRINTK=y + CONFIG_BUG=y + CONFIG_ELF_CORE=y ++CONFIG_COMPAT_BRK=y + CONFIG_BASE_FULL=y + CONFIG_FUTEX=y + CONFIG_ANON_INODES=y + CONFIG_EPOLL=y + CONFIG_SIGNALFD=y ++CONFIG_TIMERFD=y + CONFIG_EVENTFD=y + CONFIG_SHMEM=y + CONFIG_VM_EVENT_COUNTERS=y + CONFIG_SLAB=y + # CONFIG_SLUB is not set + # CONFIG_SLOB is not set ++# CONFIG_PROFILING is not set ++# CONFIG_MARKERS is not set ++# CONFIG_HAVE_OPROFILE is not set ++# CONFIG_HAVE_KPROBES is not set ++# CONFIG_HAVE_KRETPROBES is not set ++CONFIG_PROC_PAGE_MONITOR=y + CONFIG_SLABINFO=y + CONFIG_RT_MUTEXES=y + # CONFIG_TINY_SHMEM is not set +@@ -96,6 +112,7 @@ CONFIG_IOSCHED_CFQ=y + CONFIG_DEFAULT_CFQ=y + # CONFIG_DEFAULT_NOOP is not set + CONFIG_DEFAULT_IOSCHED="cfq" ++CONFIG_CLASSIC_RCU=y + + # + # Platform dependent setup +@@ -120,7 +137,7 @@ CONFIG_MCD_DMA=y + # CONFIG_M68030 is not set + # CONFIG_M68040 is not set + # CONFIG_M68060 is not set +-# CONFIG_M54455 is not set ++# CONFIG_M5445X is not set + CONFIG_M547X_8X=y + # CONFIG_M547X is not set + CONFIG_M548X=y +@@ -141,6 +158,7 @@ CONFIG_MCFCLK=200000000 + CONFIG_MMU_CFV4E=y + CONFIG_SDRAM_BASE=0x00000000 + CONFIG_SDRAM_SIZE=0x04000000 ++CONFIG_NOR_FLASH_BASE=0xE0000000 + # CONFIG_M68KFPU_EMU is not set + CONFIG_ADVANCED=y + # CONFIG_RMW_INSNS is not set +@@ -191,6 +209,7 @@ CONFIG_XFRM=y + # CONFIG_XFRM_USER is not set + # CONFIG_XFRM_SUB_POLICY is not set + # CONFIG_XFRM_MIGRATE is not set ++# CONFIG_XFRM_STATISTICS is not set + CONFIG_NET_KEY=y + # CONFIG_NET_KEY_MIGRATE is not set + CONFIG_INET=y +@@ -251,6 +270,7 @@ CONFIG_DEFAULT_TCP_CONG="cubic" + # + # CONFIG_NET_PKTGEN is not set + # CONFIG_HAMRADIO is not set ++# CONFIG_CAN is not set + # CONFIG_IRDA is not set + # CONFIG_BT is not set + # CONFIG_AF_RXRPC is not set +@@ -280,73 +300,7 @@ CONFIG_FW_LOADER=y + # CONFIG_DEBUG_DEVRES is not set + # CONFIG_SYS_HYPERVISOR is not set + # CONFIG_CONNECTOR is not set +-CONFIG_MTD=y +-# CONFIG_MTD_DEBUG is not set +-# CONFIG_MTD_CONCAT is not set +-CONFIG_MTD_PARTITIONS=y +-# CONFIG_MTD_REDBOOT_PARTS is not set +-CONFIG_MTD_CMDLINE_PARTS=y +- +-# +-# User Modules And Translation Layers +-# +-# CONFIG_MTD_CHAR is not set +-CONFIG_MTD_BLKDEVS=y +-CONFIG_MTD_BLOCK=y +-# CONFIG_FTL is not set +-# CONFIG_NFTL is not set +-# CONFIG_INFTL is not set +-# CONFIG_RFD_FTL is not set +-# CONFIG_SSFDC is not set +-# CONFIG_MTD_OOPS is not set +- +-# +-# RAM/ROM/Flash chip drivers +-# +-# CONFIG_MTD_CFI is not set +-# CONFIG_MTD_JEDECPROBE is not set +-CONFIG_MTD_MAP_BANK_WIDTH_1=y +-CONFIG_MTD_MAP_BANK_WIDTH_2=y +-CONFIG_MTD_MAP_BANK_WIDTH_4=y +-# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set +-# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set +-# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set +-CONFIG_MTD_CFI_I1=y +-CONFIG_MTD_CFI_I2=y +-# CONFIG_MTD_CFI_I4 is not set +-# CONFIG_MTD_CFI_I8 is not set +-CONFIG_MTD_RAM=y +-CONFIG_MTD_ROM=y +-# CONFIG_MTD_ABSENT is not set +- +-# +-# Mapping drivers for chip access +-# +-# CONFIG_MTD_COMPLEX_MAPPINGS is not set +-# CONFIG_MTD_PHYSMAP is not set +-# CONFIG_MTD_PLATRAM is not set +- +-# +-# Self-contained MTD device drivers +-# +-# CONFIG_MTD_SLRAM is not set +-# CONFIG_MTD_PHRAM is not set +-# CONFIG_MTD_MTDRAM is not set +-# CONFIG_MTD_BLOCK2MTD is not set +- +-# +-# Disk-On-Chip Device Drivers +-# +-# CONFIG_MTD_DOC2000 is not set +-# CONFIG_MTD_DOC2001 is not set +-# CONFIG_MTD_DOC2001PLUS is not set +-# CONFIG_MTD_NAND is not set +-# CONFIG_MTD_ONENAND is not set +- +-# +-# UBI - Unsorted block images +-# +-# CONFIG_MTD_UBI is not set ++# CONFIG_MTD is not set + # CONFIG_PARPORT is not set + CONFIG_BLK_DEV=y + # CONFIG_BLK_DEV_COW_COMMON is not set +@@ -356,11 +310,15 @@ CONFIG_BLK_DEV_LOOP=y + CONFIG_BLK_DEV_RAM=y + CONFIG_BLK_DEV_RAM_COUNT=16 + CONFIG_BLK_DEV_RAM_SIZE=64000 +-CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 ++# CONFIG_BLK_DEV_XIP is not set + # CONFIG_CDROM_PKTCDVD is not set + # CONFIG_ATA_OVER_ETH is not set + CONFIG_MISC_DEVICES=y ++CONFIG_COLDFIRE_SEC=y ++CONFIG_SEC_DEVICE=y + # CONFIG_EEPROM_93CX6 is not set ++# CONFIG_ENCLOSURE_SERVICES is not set ++CONFIG_HAVE_IDE=y + # CONFIG_IDE is not set + + # +@@ -417,6 +375,7 @@ CONFIG_MII=y + CONFIG_FEC_548x=y + CONFIG_FEC_548x_AUTO_NEGOTIATION=y + # CONFIG_FEC_548x_ENABLE_FEC2 is not set ++# CONFIG_ENC28J60 is not set + # CONFIG_IBM_NEW_EMAC_ZMII is not set + # CONFIG_IBM_NEW_EMAC_RGMII is not set + # CONFIG_IBM_NEW_EMAC_TAH is not set +@@ -433,7 +392,6 @@ CONFIG_FEC_548x_AUTO_NEGOTIATION=y + # CONFIG_WAN is not set + # CONFIG_PPP is not set + # CONFIG_SLIP is not set +-# CONFIG_SHAPER is not set + # CONFIG_NETCONSOLE is not set + # CONFIG_NETPOLL is not set + # CONFIG_NET_POLL_CONTROLLER is not set +@@ -500,6 +458,8 @@ CONFIG_HW_CONSOLE=y + # Non-8250 serial port support + # + CONFIG_SERIAL_COLDFIRE=y ++# CONFIG_SERIAL_COLDFIRE_IRDA is not set ++# CONFIG_SERIAL_MCF is not set + CONFIG_UNIX98_PTYS=y + # CONFIG_LEGACY_PTYS is not set + # CONFIG_IPMI_HANDLER is not set +@@ -508,17 +468,69 @@ CONFIG_UNIX98_PTYS=y + # CONFIG_R3964 is not set + # CONFIG_RAW_DRIVER is not set + # CONFIG_TCG_TPM is not set +-# CONFIG_I2C is not set ++CONFIG_I2C=y ++CONFIG_I2C_BOARDINFO=y ++# CONFIG_I2C_CHARDEV is not set ++ ++# ++# I2C Algorithms ++# ++# CONFIG_I2C_ALGOBIT is not set ++# CONFIG_I2C_ALGOPCF is not set ++# CONFIG_I2C_ALGOPCA is not set ++ ++# ++# I2C Hardware Bus support ++# ++CONFIG_I2C_MCF548x=y ++# CONFIG_I2C_MCF is not set ++# CONFIG_I2C_OCORES is not set ++# CONFIG_I2C_PARPORT_LIGHT is not set ++# CONFIG_I2C_SIMTEC is not set ++# CONFIG_I2C_TAOS_EVM is not set ++# CONFIG_I2C_STUB is not set ++ ++# ++# Miscellaneous I2C Chip support ++# ++# CONFIG_DS1682 is not set ++# CONFIG_SENSORS_EEPROM is not set ++# CONFIG_SENSORS_PCF8574 is not set ++# CONFIG_PCF8575 is not set ++# CONFIG_SENSORS_PCF8591 is not set ++# CONFIG_TPS65010 is not set ++# CONFIG_SENSORS_MAX6875 is not set ++# CONFIG_SENSORS_TSL2550 is not set ++# CONFIG_I2C_DEBUG_CORE is not set ++# CONFIG_I2C_DEBUG_ALGO is not set ++# CONFIG_I2C_DEBUG_BUS is not set ++# CONFIG_I2C_DEBUG_CHIP is not set + + # + # SPI support + # +-# CONFIG_SPI is not set ++CONFIG_SPI=y ++CONFIG_SPI_DEBUG=y + # CONFIG_COLDFIRE_EDMA is not set +-# CONFIG_SPI_MASTER is not set ++CONFIG_SPI_MASTER=y ++ ++# ++# SPI Master Controller Drivers ++# ++# CONFIG_SPI_BITBANG is not set ++CONFIG_SPI_COLDFIRE=y ++ ++# ++# SPI Protocol Masters ++# ++# CONFIG_SPI_AT25 is not set ++# CONFIG_SPI_SPIDEV is not set ++# CONFIG_SPI_TLE62X0 is not set ++# CONFIG_SPI_COLDFIRE_SSI_AUDIO is not set + # CONFIG_W1 is not set + # CONFIG_POWER_SUPPLY is not set + # CONFIG_HWMON is not set ++# CONFIG_THERMAL is not set + # CONFIG_WATCHDOG is not set + + # +@@ -567,6 +579,7 @@ CONFIG_HID_DEBUG=y + # CONFIG_HIDRAW is not set + # CONFIG_USB_SUPPORT is not set + # CONFIG_MMC is not set ++# CONFIG_MEMSTICK is not set + # CONFIG_NEW_LEDS is not set + # CONFIG_RTC_CLASS is not set + +@@ -599,11 +612,9 @@ CONFIG_FS_MBCACHE=y + # CONFIG_XFS_FS is not set + # CONFIG_GFS2_FS is not set + # CONFIG_OCFS2_FS is not set +-CONFIG_MINIX_FS=y +-CONFIG_ROMFS_FS=y ++CONFIG_DNOTIFY=y + # CONFIG_INOTIFY is not set + # CONFIG_QUOTA is not set +-CONFIG_DNOTIFY=y + # CONFIG_AUTOFS_FS is not set + # CONFIG_AUTOFS4_FS is not set + # CONFIG_FUSE_FS is not set +@@ -648,11 +659,12 @@ CONFIG_TMPFS=y + # CONFIG_BEFS_FS is not set + # CONFIG_BFS_FS is not set + # CONFIG_EFS_FS is not set +-# CONFIG_JFFS2_FS is not set + # CONFIG_CRAMFS is not set + # CONFIG_VXFS_FS is not set ++CONFIG_MINIX_FS=y + # CONFIG_HPFS_FS is not set + # CONFIG_QNX4FS_FS is not set ++CONFIG_ROMFS_FS=y + # CONFIG_SYSV_FS is not set + # CONFIG_UFS_FS is not set + CONFIG_NETWORK_FILESYSTEMS=y +@@ -736,9 +748,6 @@ CONFIG_NLS_ISO8859_1=y + # CONFIG_NLS_KOI8_U is not set + CONFIG_NLS_UTF8=y + # CONFIG_DLM is not set +-CONFIG_INSTRUMENTATION=y +-# CONFIG_PROFILING is not set +-# CONFIG_MARKERS is not set + + # + # Kernel hacking +@@ -770,20 +779,15 @@ CONFIG_DEBUG_INFO=y + # CONFIG_DEBUG_LIST is not set + # CONFIG_DEBUG_SG is not set + # CONFIG_FRAME_POINTER is not set +-CONFIG_FORCED_INLINING=y + # CONFIG_BOOT_PRINTK_DELAY is not set + # CONFIG_RCU_TORTURE_TEST is not set ++# CONFIG_BACKTRACE_SELF_TEST is not set + # CONFIG_FAULT_INJECTION is not set + # CONFIG_SAMPLES is not set + CONFIG_BOOTPARAM=y + CONFIG_BOOTPARAM_STRING="root=/dev/nfs rw nfsroot=172.27.163.2:/tftpboot/ltib ip=172.27.163.3:172.27.163.2:172.27.255.254:255.255.0.0::eth0:off mtdparts=phys_mapped_flash:16m(User)" + + # +-# CodeTEST Setup +-# +-# CONFIG_CODETEST is not set +- +-# + # Security options + # + # CONFIG_KEYS is not set +@@ -791,7 +795,9 @@ CONFIG_BOOTPARAM_STRING="root=/dev/nfs r + # CONFIG_SECURITY_FILE_CAPABILITIES is not set + CONFIG_CRYPTO=y + CONFIG_CRYPTO_ALGAPI=y ++CONFIG_CRYPTO_AEAD=y + CONFIG_CRYPTO_BLKCIPHER=y ++# CONFIG_CRYPTO_SEQIV is not set + CONFIG_CRYPTO_HASH=y + CONFIG_CRYPTO_MANAGER=y + CONFIG_CRYPTO_HMAC=y +@@ -810,6 +816,9 @@ CONFIG_CRYPTO_CBC=y + # CONFIG_CRYPTO_PCBC is not set + # CONFIG_CRYPTO_LRW is not set + # CONFIG_CRYPTO_XTS is not set ++# CONFIG_CRYPTO_CTR is not set ++# CONFIG_CRYPTO_GCM is not set ++# CONFIG_CRYPTO_CCM is not set + # CONFIG_CRYPTO_CRYPTD is not set + CONFIG_CRYPTO_DES=y + # CONFIG_CRYPTO_FCRYPT is not set +@@ -824,12 +833,14 @@ CONFIG_CRYPTO_DES=y + # CONFIG_CRYPTO_KHAZAD is not set + # CONFIG_CRYPTO_ANUBIS is not set + # CONFIG_CRYPTO_SEED is not set ++# CONFIG_CRYPTO_SALSA20 is not set + # CONFIG_CRYPTO_DEFLATE is not set + # CONFIG_CRYPTO_MICHAEL_MIC is not set + # CONFIG_CRYPTO_CRC32C is not set + # CONFIG_CRYPTO_CAMELLIA is not set + CONFIG_CRYPTO_TEST=m +-# CONFIG_CRYPTO_AUTHENC is not set ++CONFIG_CRYPTO_AUTHENC=y ++# CONFIG_CRYPTO_LZO is not set + # CONFIG_CRYPTO_HW is not set + + # diff --git a/target/linux/coldfire/patches/055-m547x_8x_i2c.patch b/target/linux/coldfire/patches/055-m547x_8x_i2c.patch new file mode 100644 index 0000000000..0a2a277d34 --- /dev/null +++ b/target/linux/coldfire/patches/055-m547x_8x_i2c.patch @@ -0,0 +1,808 @@ +From ce57fc22543d0ee0ca33157264815a52fc8cf9a3 Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Thu, 15 May 2008 13:23:27 -0600 +Subject: [PATCH] Add I2C bus driver for MCF547x and MCF548x. + +LTIBName: m547x-8x-i2c +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +Signed-off-by: Shrek Wu <b16972@freescale.com> +--- + arch/m68k/coldfire/Makefile | 1 + + arch/m68k/coldfire/mcf548x-devices.c | 94 ++++++ + drivers/i2c/busses/Kconfig | 12 + + drivers/i2c/busses/Makefile | 1 + + drivers/i2c/busses/i2c-algo-mcf.h | 23 ++ + drivers/i2c/busses/i2c-mcf548x.c | 573 ++++++++++++++++++++++++++++++++++ + include/asm-m68k/m5485i2c.h | 45 +++ + 7 files changed, 749 insertions(+), 0 deletions(-) + create mode 100644 arch/m68k/coldfire/mcf548x-devices.c + create mode 100644 drivers/i2c/busses/i2c-algo-mcf.h + create mode 100644 drivers/i2c/busses/i2c-mcf548x.c + create mode 100644 include/asm-m68k/m5485i2c.h + +--- a/arch/m68k/coldfire/Makefile ++++ b/arch/m68k/coldfire/Makefile +@@ -11,4 +11,5 @@ endif + obj-$(CONFIG_PCI) += pci.o mcf5445x-pci.o iomap.o + obj-$(CONFIG_M54455) += mcf5445x-devices.o + obj-$(CONFIG_M547X_8X) += m547x_8x-devices.o ++obj-$(CONFIG_M547X_8X) += mcf548x-devices.o + obj-$(CONFIG_MCD_DMA) += m547x_8x-dma.o +--- /dev/null ++++ b/arch/m68k/coldfire/mcf548x-devices.c +@@ -0,0 +1,94 @@ ++/* ++ * arch/m68k/coldfire/mcf5445x-devices.c ++ * ++ * Coldfire M5445x Platform Device Configuration ++ * ++ * Based on the Freescale MXC devices.c ++ * ++ * Copyright (c) 2007 Freescale Semiconductor, Inc. ++ * Kurt Mahan <kmahan@freescale.com> ++ */ ++#include <linux/module.h> ++#include <linux/kernel.h> ++#include <linux/init.h> ++#include <linux/mtd/physmap.h> ++#include <linux/platform_device.h> ++#include <linux/fsl_devices.h> ++ ++#include <asm/coldfire.h> ++#include <asm/mcfsim.h> ++ ++static struct resource coldfire_i2c_resources[] = { ++ [0] = { /* I/O */ ++ .start = MCF_MBAR + 0x008F00, ++ .end = MCF_MBAR + 0x008F20, ++ .flags = IORESOURCE_MEM, ++ }, ++ [2] = { /* IRQ */ ++ .start = 40, ++ .end = 40, ++ .flags = IORESOURCE_IRQ, ++ }, ++}; ++ ++static struct platform_device coldfire_i2c_device = { ++ .name = "MCF548X-i2c", ++ .id = -1, ++ .num_resources = ARRAY_SIZE(coldfire_i2c_resources), ++ .resource = coldfire_i2c_resources, ++}; ++ ++static struct resource coldfire_sec_resources[] = { ++ [0] = { /* I/O */ ++ .start = MCF_MBAR + 0x00020000, ++ .end = MCF_MBAR + 0x00033000, ++ .flags = IORESOURCE_MEM, ++ }, ++ [2] = { /* IRQ */ ++ .start = ISC_SEC, ++ .end = ISC_SEC, ++ .flags = IORESOURCE_IRQ, ++ }, ++}; ++ ++static struct platform_device coldfire_sec_device = { ++ .name = "fsl-sec1", ++ .id = -1, ++ .num_resources = ARRAY_SIZE(coldfire_sec_resources), ++ .resource = coldfire_sec_resources, ++}; ++ ++#if defined(CONFIG_MTD_PHYSMAP) ++static struct physmap_flash_data mcf5485_flash_data = { ++ .width = 2, ++}; ++ ++static struct resource mcf5485_flash_resource = { ++ .start = 0xf8000000, ++ .end = 0xf80fffff, ++ .flags = IORESOURCE_MEM, ++}; ++ ++static struct platform_device mcf5485_flash_device = { ++ .name = "physmap-flash", ++ .id = 0, ++ .dev = { ++ .platform_data = &mcf5485_flash_data, ++ }, ++ .num_resources = 1, ++ .resource = &mcf5485_flash_resource, ++}; ++#endif ++ ++static int __init mcf5485_init_devices(void) ++{ ++ printk(KERN_INFO "MCF5485x INIT_DEVICES\n"); ++ ++ platform_device_register(&coldfire_i2c_device); ++ platform_device_register(&coldfire_sec_device); ++/*#if defined(CONFIG_MTD_PHYSMAP) ++ platform_device_register(&mcf5485_flash_device); ++#endif*/ ++ return 0; ++} ++arch_initcall(mcf5485_init_devices); +--- a/drivers/i2c/busses/Kconfig ++++ b/drivers/i2c/busses/Kconfig +@@ -4,6 +4,18 @@ + + menu "I2C Hardware Bus support" + ++config I2C_MCF548x ++ tristate "I2C MCF547x/548x interfaces" ++ depends on I2C ++ help ++ This allows you to use the I2C adapters found on the Freescale ++ MCF547x/548x microcontrollers. ++ Say Y if you own an I2C adapter belonging to this class and then say ++ Y to the specific driver for you adapter below. ++ ++ This support is also available as a module. If so, the module ++ will be called i2c-algo-mcf. ++ + config I2C_ALI1535 + tristate "ALI 1535" + depends on PCI +--- a/drivers/i2c/busses/Makefile ++++ b/drivers/i2c/busses/Makefile +@@ -52,6 +52,7 @@ obj-$(CONFIG_I2C_VIAPRO) += i2c-viapro.o + obj-$(CONFIG_I2C_VOODOO3) += i2c-voodoo3.o + obj-$(CONFIG_SCx200_ACB) += scx200_acb.o + obj-$(CONFIG_SCx200_I2C) += scx200_i2c.o ++obj-$(CONFIG_I2C_MCF548x) += i2c-mcf548x.o + + ifeq ($(CONFIG_I2C_DEBUG_BUS),y) + EXTRA_CFLAGS += -DDEBUG +--- /dev/null ++++ b/drivers/i2c/busses/i2c-algo-mcf.h +@@ -0,0 +1,23 @@ ++#ifndef I2C_ALGO_MCF_H ++#define I2C_ALGO_MCF_H 1 ++ ++/* --- Defines for pcf-adapters --------------------------------------- */ ++#include <linux/i2c.h> ++ ++struct i2c_algo_mcf_data { ++ void *data; /* private data for lolevel routines */ ++ void (*setmcf) (void *data, int ctl, int val); ++ int (*getmcf) (void *data, int ctl); ++ int (*getown) (void *data); ++ int (*getclock) (void *data); ++ void (*waitforpin) (void); ++ /* local settings */ ++ int udelay; ++ int mdelay; ++ int timeout; ++}; ++ ++int i2c_mcf_add_bus(struct i2c_adapter *); ++int i2c_mcf_del_bus(struct i2c_adapter *); ++ ++#endif /* I2C_ALGO_MCF_H */ +--- /dev/null ++++ b/drivers/i2c/busses/i2c-mcf548x.c +@@ -0,0 +1,573 @@ ++/* ++ * Performance and stability improvements: (C) Copyright 2008, ++ * Adrian Cox <adrian@humboldt.co.uk> ++ * ColdFire 547x/548x I2C master support ++ * Shrek Wu (b16972@freescale.com )moved the code driver/i2c/alg/mcf.c ++ * into driver/i2c/busses.And changed the driver to a platform driver. ++ */ ++#include <linux/i2c.h> ++#include "i2c-algo-mcf.h" ++ ++#include <linux/init.h> ++#include <linux/kernel.h> ++#include <linux/module.h> ++#include <linux/delay.h> ++#include <linux/platform_device.h> ++#include <linux/sched.h> ++#include <linux/interrupt.h> ++#include <asm/io.h> ++ ++#include <asm/coldfire.h> ++#include <asm/m5485sim.h> ++#include <asm/m5485i2c.h> ++ ++#define get_clock(adap) (clock) ++#define get_own(adap) (own) ++ ++static int clock = 0x3b; /*50000 / 1024 ~ 49 KHz*/ ++module_param(clock, int, 0); ++MODULE_PARM_DESC(clock, ++ "Set I2C clock in kHz: 400=fast mode (default == 49khz)"); ++ ++static int own = 0x78; ++module_param(own, int, 0); ++MODULE_PARM_DESC(clock, "Set I2C Master controller address(0x78)"); ++ ++static struct i2c_algo_mcf_data i2c_mcf_board_data = { ++ .timeout = 10000, ++}; ++ ++static struct i2c_adapter i2c_mcf_board_adapter = { ++ .owner = THIS_MODULE, ++ .name = "MCF5485 adapter", ++ .id = I2C_HW_MPC107, ++ .algo_data = &i2c_mcf_board_data, ++ .class = I2C_CLASS_HWMON, ++ .timeout = 1, ++ .retries = 1 ++}; ++/* ++ * static void i2c_start() ++ * ++ * Generates START signal ++ */ ++static void ++i2c_start( ++ struct i2c_algo_mcf_data *adap ++) { ++ MCF_I2CR |= MCF_I2CR_MSTA; ++} ++ ++ ++/* ++ * static void i2c_stop() ++ * ++ * Generates STOP signal ++ */ ++static void ++i2c_stop( ++ struct i2c_algo_mcf_data *adap ++) { ++ MCF_I2CR &= ~MCF_I2CR_MSTA; ++} ++ ++static int ++i2c_getack( ++ struct i2c_algo_mcf_data *adap ++) { ++ return !(MCF_I2SR & MCF_I2SR_RXAK); ++} ++ ++/* ++ * static void i2c_repstart() ++ * ++ * Generates repeated start signal (without STOP while mastering the bus) ++ */ ++static void ++i2c_repstart( ++ struct i2c_algo_mcf_data *adap ++) { ++ MCF_I2CR |= MCF_I2CR_RSTA; ++ MCF_I2CR |= MCF_I2CR_MTX; ++} ++ ++ ++/* ++ * static void wait_for_bb() ++ * ++ * Wait for bus idle state ++ */ ++static int ++wait_for_bb( ++ struct i2c_algo_mcf_data *adap ++) { ++ int i; ++ for (i = 0; i < adap->timeout; i++) { ++ if (!(MCF_I2SR & MCF_I2SR_IBB)) ++ return 0; ++ udelay(10); ++ } ++ printk(KERN_ERR "%s: timeout", __FUNCTION__); ++ return -ETIMEDOUT; ++} ++ ++/* ++ * static void wait_for_not_bb() ++ * ++ * Wait for bus busy state ++ */ ++static int ++wait_for_not_bb( ++ struct i2c_algo_mcf_data *adap ++) { ++ int i; ++ for (i = 0; i < adap->timeout; i++) { ++ if (MCF_I2SR & MCF_I2SR_IBB) ++ return 0; ++ udelay(10); ++ } ++ printk(KERN_ERR "%s: timeout", __FUNCTION__); ++ return -ETIMEDOUT; ++} ++ ++/* ++ * static void wait_xfer_done() ++ * ++ * Wait for transfer to complete ++ */ ++static int ++wait_xfer_done( ++ struct i2c_algo_mcf_data *adap ++) { ++ int i; ++ ++ for (i = 0; i < adap->timeout; i++) { ++ if (MCF_I2SR & MCF_I2SR_IIF) { ++ MCF_I2SR &= ~MCF_I2SR_IIF; ++ return 0; ++ } ++ udelay(1); ++ } ++ printk(KERN_ERR "%s: timeout", __FUNCTION__); ++ return -ETIMEDOUT; ++} ++ ++ ++/* ++ * static void i2c_set_addr() ++ * ++ * Sets slave address to communicate ++ */ ++static int ++i2c_set_addr( ++ struct i2c_algo_mcf_data *adap, ++ struct i2c_msg *msg, ++ int retries ++) { ++ unsigned short flags = msg->flags; ++ unsigned char addr; ++ ++ if ((flags & I2C_M_TEN)) { ++ /* 10 bit address not supported yet */ ++ return -EIO; ++ } else { ++ /* normal 7bit address */ ++ addr = (msg->addr << 1); ++ if (flags & I2C_M_RD) ++ addr |= 1; ++ if (flags & I2C_M_REV_DIR_ADDR) ++ addr ^= 1; ++ ++ MCF_I2DR = addr; ++ } ++ return 0; ++} ++ ++ ++/* ++ * static void mcf_i2c_init() ++ * ++ * Perform ColdFire i2c initialization ++ */ ++static void ++mcf_i2c_init(struct i2c_algo_mcf_data *adap) ++{ ++ u8 dummy; ++ /* Setup GPIO lines */ ++ MCF_PAR_FECI2CIRQ |= MCF_PAR_SDA; ++ MCF_PAR_FECI2CIRQ |= MCF_PAR_SCL; ++ ++ /* Ensure slaves are in idle state */ ++ if (MCF_I2SR & MCF_I2SR_IBB) { ++ MCF_I2ICR = 0x00; ++ MCF_I2CR = 0x00; ++ MCF_I2CR = 0x0A; ++ dummy = MCF_I2DR; ++ MCF_I2SR = 0x00; ++ MCF_I2CR = 0x00; ++ MCF_I2ICR = 0x01; ++ } ++ ++ /* setup SCL clock */ ++ MCF_I2FDR = get_clock(adap); ++ ++ /* set slave address */ ++ MCF_I2AR = get_own(adap); ++ ++ /* enable I2C module */ ++ MCF_I2CR = MCF_I2CR_IEN; ++} ++ ++static int i2c_outb( ++ struct i2c_adapter *i2c_adap, ++ char c ++) { ++ ++ struct i2c_algo_mcf_data *adap = i2c_adap->algo_data; ++ int timeout; ++ /* Put data to be sent */ ++ MCF_I2DR = c; ++ /* Wait for xfer completed*/ ++ timeout = wait_xfer_done(adap); ++ if (timeout) { ++ i2c_stop(adap); ++ wait_for_bb(adap); ++ printk(KERN_ERR "i2c-algo-mcf: %s i2c_write: " ++ "error - timeout.\n", i2c_adap->name); ++ return -EREMOTEIO; /* got a better one ?? */ ++ } ++ ++ return 0; ++} ++ ++ ++/* ++ * static void mcf_sendbytes() ++ * ++ * Perform tx data transfer ++ */ ++static int ++mcf_sendbytes( ++ struct i2c_adapter *i2c_adap, ++ const char *buf, ++ int count, int last ++) { ++ struct i2c_algo_mcf_data *adap = i2c_adap->algo_data; ++ int ret, i; ++ ++ /* Set master TX mode */ ++ MCF_I2CR |= MCF_I2CR_MTX; ++ ++ for (i = 0; i < count; ++i) { ++ printk(KERN_DEBUG "i2c-algo-mcf: %s i2c_write: writing %2.2X\n", ++ i2c_adap->name, buf[i]&0xff); ++ ret = i2c_outb(i2c_adap, buf[i]); ++ if (ret < 0) ++ return ret; ++ } ++ if (last) { ++ i2c_stop(adap); ++ wait_for_bb(adap); ++ } else { ++ i2c_repstart(adap); ++ } ++ ++ return (i); ++} ++ ++ ++/* ++ * static void mcf_readbytes() ++ * ++ * Perform rx data transfer ++ */ ++static int ++mcf_readbytes( ++ struct i2c_adapter *i2c_adap, ++ char *buf, ++ int count, int last ++) { ++ int i; ++ struct i2c_algo_mcf_data *adap = i2c_adap->algo_data; ++ u8 dummy; ++ ++ /* Set master RX mode */ ++ MCF_I2CR &= ~MCF_I2CR_MTX; ++ MCF_I2CR &= ~MCF_I2CR_TXAK; ++ dummy = MCF_I2DR; ++ ++ for (i = 0; i < count-1; i++) { ++ if (wait_xfer_done(adap)) { ++ i2c_stop(adap); ++ wait_for_bb(adap); ++ printk(KERN_DEBUG ++ "i2c-algo-mcf: mcf_readbytes timed out.\n"); ++ return (-1); ++ } ++ ++ /* store next data byte */ ++ buf[i] = MCF_I2DR; ++ } ++ ++ if (wait_xfer_done(adap)) { ++ i2c_stop(adap); ++ wait_for_bb(adap); ++ printk(KERN_DEBUG "i2c-algo-mcf: mcf_readbytes timed out.\n"); ++ return (-1); ++ } ++ ++ /* Disable acknowlege (set I2CR.TXAK) */ ++ MCF_I2CR |= MCF_I2CR_TXAK; ++ buf[i] = MCF_I2DR; ++ if (wait_xfer_done(adap)) { ++ i2c_stop(adap); ++ wait_for_bb(adap); ++ printk(KERN_DEBUG "i2c-algo-mcf: mcf_readbytes timed out.\n"); ++ return (-1); ++ } ++ ++ if (last) { ++ i2c_stop(adap); ++ wait_for_bb(adap); ++ } else { ++ i2c_repstart(adap); ++ } ++ ++ return (i+1); ++} ++ ++ ++/* ++ * static void mcf_xfer() ++ * ++ * Perform master data I/O transfer ++ */ ++static int ++mcf_xfer( ++ struct i2c_adapter *i2c_adap, ++ struct i2c_msg *msgs, ++ int num ++) { ++ struct i2c_algo_mcf_data *adap = i2c_adap->algo_data; ++ struct i2c_msg *pmsg; ++ int i; ++ int ret = 0, timeout; ++ ++ /* Skip own address */ ++ if (get_own(adap) == (msgs[0].addr << 1)) ++ return -EIO; ++ ++ /* Ensure slaves are in idle state */ ++ if (MCF_I2SR & MCF_I2SR_IBB) { ++ MCF_I2ICR = 0x00; ++ MCF_I2CR = 0x00; ++ MCF_I2CR = 0x0A; ++ timeout = MCF_I2DR; ++ MCF_I2SR = 0x00; ++ MCF_I2CR = 0x00; ++ MCF_I2ICR = 0x01; ++ } ++ /* setup SCL clock */ ++ MCF_I2FDR = get_clock(adap); ++ /* set slave address */ ++ MCF_I2AR = get_own(adap); ++ /* enable I2C module */ ++ MCF_I2CR = MCF_I2CR_IEN; ++ ++ MCF_I2CR |= MCF_I2CR_TXAK; ++ ++ /* Check for bus busy */ ++ wait_for_bb(adap); ++ ++ for (i = 0; ret >= 0 && i < num; i++) { ++ pmsg = &msgs[i]; ++ ++ printk(KERN_DEBUG "i2c-algo-mcf: Doing %s %d bytes " ++ "to 0x%02x - %d of %d messages\n", ++ pmsg->flags & I2C_M_RD ? "read" : "write", ++ pmsg->len, pmsg->addr, i + 1, num); ++ ++ /* Send START */ ++ if (i == 0) ++ i2c_start(adap); ++ ++ /* Wait for Bus Busy */ ++ wait_for_not_bb(adap); ++ ++ MCF_I2CR |= MCF_I2CR_MTX; ++ ++ ret = i2c_set_addr(adap, pmsg, i2c_adap->retries); ++ if (ret < 0) ++ return ret; ++ ++ /* Wait for address transfer completion */ ++ wait_xfer_done(adap); ++ ++ /* Check for ACK */ ++ if (!i2c_getack(adap)) { ++ i2c_stop(adap); ++ wait_for_bb(adap); ++ printk(KERN_DEBUG "i2c-algo-mcf: No ack after " ++ "send address in mcf_xfer\n"); ++ return (-EREMOTEIO); ++ } ++ ++ printk(KERN_DEBUG "i2c-algo-mcf: Msg %d, " ++ "addr = 0x%x, flags = 0x%x, len = %d\n", ++ i, msgs[i].addr, msgs[i].flags, msgs[i].len); ++ /* Read */ ++ if (pmsg->flags & I2C_M_RD) { ++ /* read bytes into buffer*/ ++ ret = mcf_readbytes(i2c_adap, pmsg->buf, pmsg->len, ++ (i + 1 == num)); ++ ++ if (ret != pmsg->len) { ++ printk(KERN_DEBUG "i2c-algo-mcf: fail: " ++ "only read %d bytes.\n", ret); ++ } else { ++ printk(KERN_DEBUG "i2c-algo-mcf: " ++ "read %d bytes.\n", ret); ++ } ++ } else { ++ /* write bytes into buffer*/ ++ ret = mcf_sendbytes(i2c_adap, pmsg->buf, pmsg->len, ++ (i + 1 == num)); ++ if (ret != pmsg->len) { ++ printk(KERN_DEBUG "i2c-algo-mcf: fail: " ++ "only wrote %d bytes.\n", ret); ++ } else { ++ printk(KERN_DEBUG "i2c-algo-mcf: wrote" ++ "%d bytes.\n", ret); ++ } ++ } ++ } ++ ++ /* Disable I2C module */ ++ MCF_I2CR = 0; ++ return (i); ++} ++ ++ ++/* ++ * static void mcf_func() ++ * ++ * Return algorithm funtionality ++ */ ++static u32 ++mcf_func( ++ struct i2c_adapter *i2c_adap ++) { ++ return I2C_FUNC_SMBUS_EMUL | I2C_FUNC_I2C; ++} ++ ++/* ++ * ColdFire bus algorithm callbacks ++ */ ++static struct i2c_algorithm mcf_algo = { ++ .master_xfer = mcf_xfer, ++ .functionality = mcf_func, ++}; ++ ++/***********************************************************/ ++struct coldfire_i2c { ++ void __iomem *base; ++ struct resource *irqarea; ++ struct resource *ioarea; ++ u32 irq; ++ struct i2c_adapter *adap; ++ u32 flags; ++}; ++ ++/* ++ * registering functions to load algorithms at runtime ++ */ ++int i2c_mcf_add_bus(struct i2c_adapter *adap) ++{ ++ struct i2c_algo_mcf_data *mcf_adap = adap->algo_data; ++ ++ /*adap->id |= mcf_algo.id;*/ ++ adap->algo = &mcf_algo; ++ adap->timeout = 100; ++ ++ mcf_i2c_init(mcf_adap); ++ ++#ifdef MODULE ++ MOD_INC_USE_COUNT; ++#endif ++ ++ i2c_add_adapter(adap); ++ ++ return 0; ++} ++ ++static int mcf548x_i2c_probe(struct platform_device *pdev) ++{ ++ struct coldfire_i2c *i2c; ++ int rc = 0; ++ ++ /************************************************************/ ++ i2c = kzalloc(sizeof(*i2c), GFP_KERNEL); ++ if (!i2c) { ++ printk(KERN_ERR "%s kzalloc coldfire_i2c faile\n", ++ __FUNCTION__); ++ return -ENOMEM; ++ } ++ /****************************************************************/ ++ platform_set_drvdata(pdev, i2c); ++ ++ i2c->adap = &i2c_mcf_board_adapter; ++ i2c->adap->dev.parent = &pdev->dev; ++ rc = i2c_mcf_add_bus(i2c->adap); ++ if (rc < 0) { ++ printk(KERN_ERR "%s - failed to add adapter\n", __FUNCTION__); ++ rc = -ENODEV; ++ goto fail_add; ++ } ++ ++ printk(KERN_INFO "i2c-algo-mcf.o: I2C ColdFire algorithm" ++ " module is loaded.\n"); ++ return rc; ++ ++fail_add: ++ kfree(i2c); ++ return rc; ++}; ++ ++static int mcf548x_i2c_remove(struct platform_device *pdev) ++{ ++ struct coldfire_i2c *i2c = platform_get_drvdata(pdev); ++ ++ i2c_del_adapter(i2c->adap); ++ platform_set_drvdata(pdev, NULL); ++ iounmap(i2c->base); ++ kfree(i2c); ++ return 0; ++}; ++ ++/* Structure for a device driver */ ++static struct platform_driver mcf548x_i2c_driver = { ++ .probe = mcf548x_i2c_probe, ++ .remove = mcf548x_i2c_remove, ++ .driver = { ++ .owner = THIS_MODULE, ++ .name = "MCF548X-i2c", ++ }, ++}; ++ ++static int __init coldfire_i2c_init(void) ++{ ++ return platform_driver_register(&mcf548x_i2c_driver); ++} ++ ++static void __exit coldfire_i2c_exit(void) ++{ ++ platform_driver_unregister(&mcf548x_i2c_driver); ++} ++ ++module_init(coldfire_i2c_init); ++module_exit(coldfire_i2c_exit); ++ ++MODULE_AUTHOR("Adrian Cox <adrian@humboldt.co.uk>"); ++MODULE_DESCRIPTION ++ ("I2C-Bus adapter for MCF547x and MCF548x processors"); ++MODULE_LICENSE("GPL"); +--- /dev/null ++++ b/include/asm-m68k/m5485i2c.h +@@ -0,0 +1,45 @@ ++/* ++ * m5485i2c.h -- ColdFire 547x/548x i2c controller support. ++ */ ++#ifndef M548X_I2C_H ++#define M548X_I2C_H ++ ++/* Register read/write macros */ ++#define MCF_I2AR MCF_REG08(0x008F00) /* I2C Address */ ++#define MCF_I2FDR MCF_REG08(0x008F04) /* I2C Frequency Divider */ ++#define MCF_I2CR MCF_REG08(0x008F08) /* I2C Control */ ++#define MCF_I2SR MCF_REG08(0x008F0C) /* I2C Status */ ++#define MCF_I2DR MCF_REG08(0x008F10) /* I2C Data I/O */ ++#define MCF_I2ICR MCF_REG08(0x008F20) /* I2C Interrupt Control */ ++ ++/* Bit definitions and macros for MCF_I2C_I2AR */ ++#define MCF_I2AR_ADR(x) (((x)&0x7F)<<1) ++ ++/* Bit definitions and macros for MCF_I2C_I2FDR */ ++#define MCF_I2FDR_IC(x) (((x)&0x3F)<<0) ++ ++/* Bit definitions and macros for MCF_I2C_I2CR */ ++#define MCF_I2CR_RSTA (0x04) ++#define MCF_I2CR_TXAK (0x08) ++#define MCF_I2CR_MTX (0x10) ++#define MCF_I2CR_MSTA (0x20) ++#define MCF_I2CR_IIEN (0x40) ++#define MCF_I2CR_IEN (0x80) ++ ++/* Bit definitions and macros for MCF_I2C_I2SR */ ++#define MCF_I2SR_RXAK (0x01) ++#define MCF_I2SR_IIF (0x02) ++#define MCF_I2SR_SRW (0x04) ++#define MCF_I2SR_IAL (0x10) ++#define MCF_I2SR_IBB (0x20) ++#define MCF_I2SR_IAAS (0x40) ++#define MCF_I2SR_ICF (0x80) ++ ++/* Bit definitions and macros for MCF_I2C_I2ICR */ ++#define MCF_I2ICR_IE (0x01) ++#define MCF_I2ICR_RE (0x02) ++#define MCF_I2ICR_TE (0x04) ++#define MCF_I2ICR_BNBE (0x08) ++ ++/********************************************************************/ ++#endif diff --git a/target/linux/coldfire/patches/056-m547x_8x_rtc_rv5c387a.patch b/target/linux/coldfire/patches/056-m547x_8x_rtc_rv5c387a.patch new file mode 100644 index 0000000000..4d5db0ae4c --- /dev/null +++ b/target/linux/coldfire/patches/056-m547x_8x_rtc_rv5c387a.patch @@ -0,0 +1,127 @@ +From 1353cd9749377dbcc8290dab5c098deec66fb956 Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Thu, 15 May 2008 13:24:58 -0600 +Subject: [PATCH] Add RTC RV5C387A driver for MCF547x and MCF548x. + +LTIBName: m547x-8x-rtc-rv5c387a +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +Signed-off-by: Shrek Wu <b16972@freescale.com> +--- + drivers/rtc/rtc-rs5c372.c | 67 +++++++++++++++++++++++++++++++++++++++++--- + 1 files changed, 62 insertions(+), 5 deletions(-) + +--- a/drivers/rtc/rtc-rs5c372.c ++++ b/drivers/rtc/rtc-rs5c372.c +@@ -15,7 +15,6 @@ + + #define DRV_VERSION "0.5" + +- + /* + * Ricoh has a family of I2C based RTCs, which differ only slightly from + * each other. Differences center on pinout (e.g. how many interrupts, +@@ -60,6 +59,15 @@ + /* to read (style 1) or write registers starting at R */ + #define RS5C_ADDR(R) (((R) << 4) | 0) + ++#ifdef CONFIG_M547X_8X ++#define DRV_NAME "rv5c387a" ++/* i2c configuration */ ++#define RV5C387_I2C_ADDR 0x32 ++static unsigned short normal_i2c[] = { ++ RV5C387_I2C_ADDR, I2C_CLIENT_END ++}; ++I2C_CLIENT_INSMOD; /* defines addr_data */ ++#endif + + enum rtc_type { + rtc_undef = 0, +@@ -506,14 +514,14 @@ static int rs5c372_probe(struct i2c_clie + err = -ENODEV; + goto exit; + } +- +- if (!(rs5c372 = kzalloc(sizeof(struct rs5c372), GFP_KERNEL))) { ++ rs5c372 = kzalloc(sizeof(struct rs5c372), GFP_KERNEL); ++ if (!rs5c372) { + err = -ENOMEM; + goto exit; + } + + /* we read registers 0x0f then 0x00-0x0f; skip the first one */ +- rs5c372->regs=&rs5c372->buf[1]; ++ rs5c372->regs = &rs5c372->buf[1]; + + rs5c372->client = client; + i2c_set_clientdata(client, rs5c372); +@@ -605,7 +613,7 @@ static int rs5c372_probe(struct i2c_clie + case rtc_rv5c386: s = "rv5c386"; break; + case rtc_rv5c387a: s = "rv5c387a"; break; + default: s = "chip"; break; +- }; s;}), ++ }; s; }), + rs5c372->time24 ? "24hr" : "am/pm" + ); + +@@ -645,12 +653,61 @@ static int rs5c372_remove(struct i2c_cli + return 0; + } + ++#ifdef CONFIG_M547X_8X ++static int rv5c387_probe(struct i2c_adapter *adapter, int addr, int kind) ++{ ++ int rc = 0; ++ struct i2c_client *new_client = NULL; ++ ++ if (!i2c_check_functionality(adapter, I2C_FUNC_I2C)) { ++ rc = -ENODEV; ++ printk(KERN_DEBUG "%s i2c_check_functionality\n", __FUNCTION__); ++ goto failout; ++ } ++ ++ new_client = kzalloc(sizeof(struct i2c_client), GFP_KERNEL); ++ if (new_client == NULL) { ++ rc = -ENOMEM; ++ printk(KERN_DEBUG "%s kzalloc new_client\n", __FUNCTION__); ++ goto failout; ++ } ++ ++ new_client->addr = addr; ++ new_client->adapter = adapter; ++ new_client->driver = &rs5c372_driver; ++ new_client->flags = 0; ++ strcpy(new_client->name, DRV_NAME); ++ ++ rc = i2c_attach_client(new_client); ++ if (rc < 0) { ++ printk(KERN_DEBUG "%s i2c_attach_client\n", __FUNCTION__); ++ goto failout; ++ } ++ ++ rs5c372_probe(new_client); ++ return 0; ++failout: ++ kfree(new_client); ++ return rc; ++} ++ ++static int ++rv5c387_attach_adapter(struct i2c_adapter *adapter) ++{ ++ return i2c_probe(adapter, &addr_data, rv5c387_probe); ++} ++#endif ++ + static struct i2c_driver rs5c372_driver = { + .driver = { + .name = "rtc-rs5c372", + }, ++#ifdef CONFIG_M547X_8X ++ .attach_adapter = &rv5c387_attach_adapter, ++#else + .probe = rs5c372_probe, + .remove = rs5c372_remove, ++#endif + }; + + static __init int rs5c372_init(void) diff --git a/target/linux/coldfire/patches/057-mcfv4e_add_mm_args.patch b/target/linux/coldfire/patches/057-mcfv4e_add_mm_args.patch new file mode 100644 index 0000000000..483f030d95 --- /dev/null +++ b/target/linux/coldfire/patches/057-mcfv4e_add_mm_args.patch @@ -0,0 +1,55 @@ +From a2360b8ebb8b2b0d55f8aea3fdce51bce9b57b10 Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Thu, 15 May 2008 15:48:59 -0600 +Subject: [PATCH] Add mm arg to pte/pmd/pud/pgd_free and add pmd_pgtable macro. + +Add mm argument to pte/pmd/pud/pgd_free as per commit +5e5419734c8719cbc01af959ad9c0844002c0df5. + +LTIBName: mcfv4e-add-mm-args +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + include/asm-m68k/cf_pgalloc.h | 10 ++++++---- + 1 files changed, 6 insertions(+), 4 deletions(-) + +--- a/include/asm-m68k/cf_pgalloc.h ++++ b/include/asm-m68k/cf_pgalloc.h +@@ -6,7 +6,7 @@ + #include <asm/cf_tlbflush.h> + #include <asm/cf_cacheflush.h> + +-extern inline void pte_free_kernel(pte_t *pte) ++extern inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte) + { + free_page((unsigned long) pte); + } +@@ -40,6 +40,8 @@ extern inline pmd_t *pmd_alloc_kernel(pg + + #define pmd_populate_kernel(mm, pmd, pte) (pmd_val(*pmd) = (unsigned long)(pte)) + ++#define pmd_pgtable(pmd) pmd_page(pmd) ++ + static inline void __pte_free_tlb(struct mmu_gather *tlb, struct page *page) + { + __free_page(page); +@@ -68,7 +70,7 @@ static inline struct page *pte_alloc_one + return page; + } + +-extern inline void pte_free(struct page *page) ++extern inline void pte_free(struct mm_struct *mm, struct page *page) + { + __free_page(page); + } +@@ -77,9 +79,9 @@ extern inline void pte_free(struct page + * In our implementation, each pgd entry contains 1 pmd that is never allocated + * or freed. pgd_present is always 1, so this should never be called. -NL + */ +-#define pmd_free(pmd) BUG() ++#define pmd_free(mm, pmd) BUG() + +-extern inline void pgd_free(pgd_t *pgd) ++extern inline void pgd_free(struct mm_struct *mm, pgd_t *pgd) + { + free_page((unsigned long) pgd); + } diff --git a/target/linux/coldfire/patches/058-mcfv4e_tlsnptl_elf_reloc.patch b/target/linux/coldfire/patches/058-mcfv4e_tlsnptl_elf_reloc.patch new file mode 100644 index 0000000000..849e3a6abe --- /dev/null +++ b/target/linux/coldfire/patches/058-mcfv4e_tlsnptl_elf_reloc.patch @@ -0,0 +1,43 @@ +From a64bac5fc75aa2872a8abe54a9f9aaa0fce31588 Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Thu, 22 May 2008 09:50:31 -0600 +Subject: [PATCH] Add elf relocation types for TLS/NPTL. + +These relocations are from the draft TLS/NPTL ABI document v0.2 +by Joseph Myers of CodeSourcery. + +LTIBName: mcfv4e-tlsnptl-elf-reloc +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + include/asm-m68k/elf.h | 20 ++++++++++++++++++++ + 1 files changed, 20 insertions(+), 0 deletions(-) + +--- a/include/asm-m68k/elf.h ++++ b/include/asm-m68k/elf.h +@@ -34,6 +34,26 @@ + #define R_68K_GLOB_DAT 20 + #define R_68K_JMP_SLOT 21 + #define R_68K_RELATIVE 22 ++/* TLS static relocations */ ++#define R_68K_TLS_GD32 25 ++#define R_68K_TLS_GD16 26 ++#define R_68K_TLS_GD8 27 ++#define R_68K_TLS_LDM32 28 ++#define R_68K_TLS_LDM16 29 ++#define R_68K_TLS_LDM8 30 ++#define R_68K_TLS_LDO32 31 ++#define R_68K_TLS_LDO16 32 ++#define R_68K_TLS_LDO8 33 ++#define R_68K_TLS_IE32 34 ++#define R_68K_TLS_IE16 35 ++#define R_68K_TLS_IE8 36 ++#define R_68K_TLS_LE32 37 ++#define R_68K_TLS_LE16 38 ++#define R_68K_TLS_LE8 39 ++/* TLS dynamic relocations */ ++#define R_68K_TLS_DTPMOD32 40 ++#define R_68K_TLS_DTPREL32 41 ++#define R_68K_TLS_TPREL32 42 + + typedef unsigned long elf_greg_t; + diff --git a/target/linux/coldfire/patches/059-mcfv4e_vdso_headers.patch b/target/linux/coldfire/patches/059-mcfv4e_vdso_headers.patch new file mode 100644 index 0000000000..f430ab3623 --- /dev/null +++ b/target/linux/coldfire/patches/059-mcfv4e_vdso_headers.patch @@ -0,0 +1,79 @@ +From a05af27aec00eacf533ff111ba8eb3dec328d9af Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Thu, 22 May 2008 11:20:53 -0600 +Subject: [PATCH] Initial vDSO header changes. + +LTIBName: mcfv4e-vdso-headers +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + include/asm-m68k/auxvec.h | 9 +++++++++ + include/asm-m68k/elf.h | 31 +++++++++++++++++++++++++++++++ + include/asm-m68k/page.h | 5 +++++ + 3 files changed, 45 insertions(+), 0 deletions(-) + +--- a/include/asm-m68k/auxvec.h ++++ b/include/asm-m68k/auxvec.h +@@ -1,4 +1,13 @@ + #ifndef __ASMm68k_AUXVEC_H + #define __ASMm68k_AUXVEC_H ++/* ++ * Architecture-neutral AT_ values in 0-17, leave some room ++ * for more of them. ++ */ ++ ++#ifdef CONFIG_VSYSCALL ++/* Entry point to the vsyscall page */ ++#define AT_SYSINFO_EHDR 33 ++#endif + + #endif +--- a/include/asm-m68k/elf.h ++++ b/include/asm-m68k/elf.h +@@ -136,4 +136,35 @@ typedef struct user_m68kfp_struct elf_fp + + #define SET_PERSONALITY(ex, ibcs2) set_personality((ibcs2)?PER_SVR4:PER_LINUX) + ++/* ++ * VDSO ++ */ ++#ifdef CONFIG_VSYSCALL ++extern unsigned int vdso_enabled; ++ ++#define VDSO_BASE ((unsigned long)current->mm->context.vdso) ++#define VDSO_SYM(x) (VDSO_BASE + (unsigned long)(x)) ++ ++#define VSYSCALL_AUX_ENT \ ++ if (vdso_enabled) \ ++ NEW_AUX_ENT(AT_SYSINFO_EHDR, VDSO_BASE); ++ ++/* additional pages */ ++#define ARCH_HAS_SETUP_ADDITIONAL_PAGES 1 ++ ++struct linux_binprm; ++extern int arch_setup_additional_pages(struct linux_binprm *bprm, ++ int executable_stack); ++ ++#else ++/* no VSYSCALL_AUX_ENT */ ++#define VSYSCALL_AUX_ENT ++#endif ++ ++#define ARCH_DLINFO \ ++do { \ ++ /* vsyscall entry */ \ ++ VSYSCALL_AUX_ENT; \ ++} while (0); ++ + #endif +--- a/include/asm-m68k/page.h ++++ b/include/asm-m68k/page.h +@@ -252,4 +252,9 @@ static inline __attribute_const__ int __ + + #include <asm-generic/page.h> + ++#ifdef CONFIG_VSYSCALL ++/* vDSO support */ ++#define __HAVE_ARCH_GATE_AREA ++#endif ++ + #endif /* _M68K_PAGE_H */ diff --git a/target/linux/coldfire/patches/060-m547x_8x_move_memmap.patch b/target/linux/coldfire/patches/060-m547x_8x_move_memmap.patch new file mode 100644 index 0000000000..01d7a6ea99 --- /dev/null +++ b/target/linux/coldfire/patches/060-m547x_8x_move_memmap.patch @@ -0,0 +1,152 @@ +From 961a1f1ccbb2121a4e650cd64ca1f5c15b232e18 Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Thu, 29 May 2008 22:03:08 -0600 +Subject: [PATCH] Update M547x/M548x memory map. + +- Move internal memory + 0xF0000000 MBAR + 0xF1000000 MMUBAR + 0xF3000000 RAMBAR0 + 0xF3001000 RAMBAR1 + +- Move KMAP area + 0xD0000000 -> 0xDFFFFFFF + +- Update pagefault code for KMAP area + +LTIBName: m547x-8x-move-memmap +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + arch/m68k/coldfire/head.S | 2 +- + arch/m68k/mm/cf-mmu.c | 20 ++++++++++---------- + arch/m68k/mm/kmap.c | 18 +++++++++++++++--- + include/asm-m68k/coldfire.h | 8 ++++---- + include/asm-m68k/pgtable.h | 4 ++-- + 5 files changed, 32 insertions(+), 20 deletions(-) + +--- a/arch/m68k/coldfire/head.S ++++ b/arch/m68k/coldfire/head.S +@@ -87,7 +87,7 @@ + #else + #if defined(CONFIG_M54455) + #elif defined(CONFIG_M547X_8X) +-#define ACR0_DEFAULT #0xE000C040 /* ACR0 default value */ ++#define ACR0_DEFAULT #0xF00FC040 /* ACR0 default value */ + #define ACR1_DEFAULT #0x000FA008 /* ACR1 default value */ + #define ACR2_DEFAULT #0x00000000 /* ACR2 default value */ + #define ACR3_DEFAULT #0x000FA008 /* ACR3 default value */ +--- a/arch/m68k/mm/cf-mmu.c ++++ b/arch/m68k/mm/cf-mmu.c +@@ -35,11 +35,9 @@ + #include <asm/coldfire.h> + #include <asm/tlbflush.h> + +-#if PAGE_OFFSET == CONFIG_SDRAM_BASE +-#define KERNRAM(x) ((x >= PAGE_OFFSET) && (x < (PAGE_OFFSET + CONFIG_SDRAM_SIZE))) +-#else +-#define KERNRAM(x) (x >= PAGE_OFFSET) +-#endif ++#define KMAPAREA(x) ((x >= KMAP_START) && ( x < KMAP_END)) ++ ++#undef DEBUG + + mm_context_t next_mmu_context; + unsigned long context_map[LAST_CONTEXT / BITS_PER_LONG + 1]; +@@ -162,7 +160,7 @@ int cf_tlb_miss(struct pt_regs *regs, in + mmuar = ( dtlb ) ? regs->mmuar + : regs->pc + (extension_word * sizeof(long)); + +- mm = (!user_mode(regs) && KERNRAM(mmuar)) ? &init_mm : current->mm; ++ mm = (!user_mode(regs) && KMAPAREA(mmuar)) ? &init_mm : current->mm; + + if (!mm) { + local_irq_restore(flags); +@@ -181,7 +179,7 @@ int cf_tlb_miss(struct pt_regs *regs, in + return (-1); + } + +- pte = (KERNRAM(mmuar)) ? pte_offset_kernel(pmd, mmuar) ++ pte = (KMAPAREA(mmuar)) ? pte_offset_kernel(pmd, mmuar) + : pte_offset_map(pmd, mmuar); + if (pte_none(*pte) || !pte_present(*pte)) { + local_irq_restore(flags); +@@ -198,7 +196,7 @@ int cf_tlb_miss(struct pt_regs *regs, in + + set_pte(pte, pte_mkyoung(*pte)); + asid = mm->context & 0xff; +- if (!pte_dirty(*pte) && !KERNRAM(mmuar)) ++ if (!pte_dirty(*pte) && !KMAPAREA(mmuar)) + set_pte(pte, pte_wrprotect(*pte)); + + *MMUTR = (mmuar & PAGE_MASK) | (asid << CF_ASID_MMU_SHIFT) +@@ -216,8 +214,10 @@ int cf_tlb_miss(struct pt_regs *regs, in + + asm("nop"); + +- /*printk("cf_tlb_miss: va=%lx, pa=%lx\n", (mmuar & PAGE_MASK), +- (pte_val(*pte) & PAGE_MASK));*/ ++#ifdef DEBUG ++ printk("cf_tlb_miss: va=%lx, pa=%lx\n", (mmuar & PAGE_MASK), ++ (pte_val(*pte) & PAGE_MASK)); ++#endif + local_irq_restore(flags); + return (0); + } +--- a/arch/m68k/mm/kmap.c ++++ b/arch/m68k/mm/kmap.c +@@ -135,10 +135,22 @@ void __iomem *__ioremap(unsigned long ph + + #ifdef CONFIG_M54455 + if (physaddr >= 0xf0000000) { +- /* short circuit mappings for xf0000000 */ +-#ifdef DEBUG +- printk(KERN_INFO "ioremap: short circuiting 0x%lx mapping\n", physaddr); ++ /* ++ * On the M5445x processors an ACR is setup to map ++ * the 0xF0000000 range into kernel memory as ++ * non-cacheable. ++ */ ++ return (void __iomem *)physaddr; ++ } + #endif ++ ++#ifdef CONFIG_M547X_8X ++ if (physaddr >= 0xf0000000) { ++ /* ++ * On the M547x/M548x processors an ACR is setup to map ++ * the 0xF0000000 range into kernel memory as ++ * non-cacheable. ++ */ + return (void __iomem *)physaddr; + } + #endif +--- a/include/asm-m68k/coldfire.h ++++ b/include/asm-m68k/coldfire.h +@@ -6,10 +6,10 @@ + #define MCF_RAMBAR1 0x40000000 + #define MCF_SRAM 0x80000000 + #elif defined(CONFIG_M547X_8X) +-#define MCF_MBAR 0xE0000000 +-#define MCF_MMUBAR 0xE1000000 +-#define MCF_RAMBAR0 0xE3000000 +-#define MCF_RAMBAR1 0xE3001000 ++#define MCF_MBAR 0xF0000000 ++#define MCF_MMUBAR 0xF1000000 ++#define MCF_RAMBAR0 0xF3000000 ++#define MCF_RAMBAR1 0xF3001000 + #endif + + #define MCF_CLK CONFIG_MCFCLK +--- a/include/asm-m68k/pgtable.h ++++ b/include/asm-m68k/pgtable.h +@@ -73,8 +73,8 @@ + #define KMAP_START 0x0DC00000 + #define KMAP_END 0x0E000000 + #elif defined(CONFIG_COLDFIRE) +-#define KMAP_START 0xe0000000 +-#define KMAP_END 0xf0000000 ++#define KMAP_START 0xd0000000 ++#define KMAP_END 0xe0000000 + #else + #define KMAP_START 0xd0000000 + #define KMAP_END 0xf0000000 diff --git a/target/linux/coldfire/patches/061-m5445x_rename_config.patch b/target/linux/coldfire/patches/061-m5445x_rename_config.patch new file mode 100644 index 0000000000..8f898e3165 --- /dev/null +++ b/target/linux/coldfire/patches/061-m5445x_rename_config.patch @@ -0,0 +1,791 @@ +From 778c1668df4a4c634fae8ef99a05120121cce838 Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Wed, 18 Jun 2008 15:17:31 -0600 +Subject: [PATCH] Convert CONFIG_M54455 to CONFIG_M5445X for clarity. + +LTIBName: m5445x-rename-config +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + arch/m68k/Kconfig | 50 ++++++++++++++++++++++++++++--------- + arch/m68k/Makefile | 2 +- + arch/m68k/coldfire/Makefile | 2 +- + arch/m68k/coldfire/config.c | 33 +++++++++++++++---------- + arch/m68k/coldfire/head.S | 23 ++++++++++------- + arch/m68k/coldfire/ints.c | 6 ++-- + arch/m68k/kernel/dma.c | 4 +- + arch/m68k/kernel/setup.c | 2 +- + arch/m68k/mm/kmap.c | 2 +- + drivers/crypto/Kconfig | 12 ++++---- + drivers/crypto/mcfcau-aes.c | 2 +- + drivers/crypto/mcfcau-des.c | 2 +- + drivers/crypto/mcfcau-md5.c | 2 +- + drivers/crypto/mcfcau-sha1.c | 2 +- + drivers/crypto/mcfcau.c | 2 +- + drivers/crypto/mcfcau.h | 2 +- + drivers/net/Kconfig | 2 +- + drivers/net/fec.c | 10 ++++---- + drivers/net/fec.h | 2 +- + drivers/serial/mcfserial.c | 8 +++--- + drivers/spi/coldfire_edma.c | 4 +- + drivers/spi/spi_coldfire.c | 2 +- + drivers/spi/ssi_audio.c | 2 +- + include/asm-m68k/cfcache.h | 2 +- + include/asm-m68k/coldfire.h | 4 +- + include/asm-m68k/coldfire_edma.h | 4 +- + include/asm-m68k/mcfsim.h | 2 +- + include/asm-m68k/mcfuart.h | 2 +- + include/asm-m68k/page_offset.h | 2 +- + include/asm-m68k/setup.h | 2 +- + 30 files changed, 116 insertions(+), 80 deletions(-) + +--- a/arch/m68k/Kconfig ++++ b/arch/m68k/Kconfig +@@ -56,7 +56,7 @@ config ARCH_MAY_HAVE_PC_FDC + default y + + config NO_IOPORT +- def_bool !(M54455 || M547X_8X) ++ def_bool !(M5445X || M547X_8X) + + config NO_DMA + def_bool SUN3 +@@ -143,7 +143,7 @@ config CFV4E + + config MCD_DMA + bool "ColdFire MCD DMA support" +- depends on CFV4E ++ depends on M547X_8X + default y + help + This enables support for the ColdFire 547x/548x family +@@ -177,7 +177,7 @@ config HADES + config PCI + bool + depends on HADES || M54455 +- default y ++ default n + help + Find out whether you have a PCI motherboard. PCI is the name of a + bus system, i.e. the way the CPU talks to the other stuff inside +@@ -325,11 +325,34 @@ config M68060 + If you anticipate running this kernel on a computer with a MC68060 + processor, say Y. Otherwise, say N. + +-config M54455 +- bool "MCF54455 support" ++config M5445X ++ bool "MCF5445x support" + depends on COLDFIRE + help +- This option will add support for the MCF54455 processor with mmu. ++ This option will add support for the MCF5445 processor with mmu. ++ ++config M54451 ++ bool ++ depends on M5445X ++ default n ++ ++config M54455 ++ bool ++ depends on M5445X ++ default n ++ ++choice ++ prompt "Model" ++ depends on M5445X ++ default M54451EVB ++ config M54451EVB ++ bool "M54451EVB" ++ select M54451 ++ config M54455EVB ++ bool "M54455EVB" ++ select M54455 ++endchoice ++ + + config M547X_8X + bool "MCF547x/MCF548x support" +@@ -393,7 +416,8 @@ endchoice + + config MCFCLK + int +- default 266666666 if M54455 ++ default 266666666 if M54455EVB ++ default 240000000 if M54451EVB + default 266000000 if M547X + default 200000000 if M548X + help +@@ -401,7 +425,7 @@ config MCFCLK + + config MCF_USER_HALT + bool "Coldfire User Halt Enable" +- depends on M54455 || M547X_8X ++ depends on M5445X || M547X_8X + default n + help + Enables the HALT instruction in User Mode. +@@ -420,19 +444,21 @@ config MMU_CFV4E + config SDRAM_BASE + hex + depends on COLDFIRE +- default 0x40000000 if M54455 ++ default 0x40000000 if M5445X + default 0x00000000 if M547X_8X + + config SDRAM_SIZE + hex + depends on COLDFIRE +- default 0x0FFFFFFF if M54455 ++ default 0x08000000 if M54451EVB ++ default 0x10000000 if M54455EVB + default 0x04000000 if M547X_8X + + config NOR_FLASH_BASE + hex "NOR Flash Base Address" +- depends on M54455 +- default 0x00000000 ++ depends on COLDFIRE ++ default 0x00000000 if M54451EVB ++ default 0x00000000 if M54455EVB + + config M68KFPU_EMU + bool "Math emulation support (EXPERIMENTAL)" +--- a/arch/m68k/Makefile ++++ b/arch/m68k/Makefile +@@ -59,7 +59,7 @@ endif + endif + endif + +-ifdef CONFIG_M54455 ++ifdef CONFIG_M5445X + KBUILD_CFLAGS += -march=isac -mcpu=54455 -msoft-float -g + KBUILD_AFLAGS += -march=isac -mcpu=54455 -msoft-float + endif +--- a/arch/m68k/coldfire/Makefile ++++ b/arch/m68k/coldfire/Makefile +@@ -9,7 +9,7 @@ ifneq ($(strip $(CONFIG_USB) $(CONFIG_US + endif + + obj-$(CONFIG_PCI) += pci.o mcf5445x-pci.o iomap.o +-obj-$(CONFIG_M54455) += mcf5445x-devices.o ++obj-$(CONFIG_M5445X) += mcf5445x-devices.o + obj-$(CONFIG_M547X_8X) += m547x_8x-devices.o + obj-$(CONFIG_M547X_8X) += mcf548x-devices.o + obj-$(CONFIG_MCD_DMA) += m547x_8x-dma.o +--- a/arch/m68k/coldfire/config.c ++++ b/arch/m68k/coldfire/config.c +@@ -35,14 +35,14 @@ + + #include <asm/mcfsim.h> + +-#if defined(CONFIG_M54455) ++#if defined(CONFIG_M5445X) + #define UBOOT_EXTRA_CLOCKS + #elif defined(CONFIG_M547X_8X) + #define UBOOT_PCI + #endif + #include <asm/bootinfo.h> + +-#ifdef CONFIG_M54455 ++#ifdef CONFIG_M5445X + #include <asm/mcf5445x_intc.h> + #include <asm/mcf5445x_sdramc.h> + #include <asm/mcf5445x_fbcs.h> +@@ -132,8 +132,9 @@ int __init uboot_commandline(char *boota + /* + * This routine does things not done in the bootloader. + */ +-#if defined(CONFIG_M54455) +-#define DEFAULT_COMMAND_LINE "root=/dev/mtdblock1 rw rootfstype=jffs2 ip=none mtdparts=physmap-flash.0:5M(kernel)ro,-(jffs2)" ++#if defined(CONFIG_M5445X) ++#define FOO_DEFAULT_COMMAND_LINE "root=/dev/mtdblock1 rw rootfstype=jffs2 ip=none mtdparts=physmap-flash.0:5M(kernel)ro,-(jffs2)" ++#define DEFAULT_COMMAND_LINE "debug root=/dev/nfs rw nfsroot=172.27.155.1:/tftpboot/redstripe/rootfs/ ip=172.27.155.51:172.27.155.1" + #elif defined(CONFIG_M547X_8X) + #define DEFAULT_COMMAND_LINE "debug root=/dev/nfs rw nfsroot=172.27.155.1:/tftpboot/rigo/rootfs/ ip=172.27.155.85:172.27.155.1" + #endif +@@ -143,14 +144,14 @@ asmlinkage void __init cf_early_init(voi + + extern char _end; + +-#if defined(CONFIG_M54455) ++#if defined(CONFIG_M5445X) + SET_VBR((void *)MCF_RAMBAR1); + #elif defined(CONFIG_M547X_8X) + SET_VBR((void *)MCF_RAMBAR0); + #endif + + /* Mask all interrupts */ +-#if defined(CONFIG_M54455) ++#if defined(CONFIG_M5445X) + MCF_INTC0_IMRL = 0xFFFFFFFF; + MCF_INTC0_IMRH = 0xFFFFFFFF; + MCF_INTC1_IMRL = 0xFFFFFFFF; +@@ -160,7 +161,7 @@ asmlinkage void __init cf_early_init(voi + MCF_IMRH = 0xFFFFFFFF; + #endif + +-#if defined(CONFIG_M54455) ++#if defined(CONFIG_M5445X) + #if defined(CONFIG_NOR_FLASH_BASE) + MCF_FBCS_CSAR(1) = CONFIG_NOR_FLASH_BASE; + #else +@@ -171,9 +172,9 @@ asmlinkage void __init cf_early_init(voi + /* Init optional SDRAM chip select */ + MCF_SDRAMC_SDCS(1) = (256*1024*1024) | 0x1B; + #endif +-#endif /* CONFIG_M54455 */ ++#endif /* CONFIG_M5445X */ + +-#if defined(CONFIG_M54455) ++#if defined(CONFIG_M5445X) + /* Setup SDRAM crossbar(XBS) priorities */ + MCF_XBS_PRS2 = (MCF_XBS_PRS_M0(MCF_XBS_PRI_2) | + MCF_XBS_PRS_M1(MCF_XBS_PRI_3) | +@@ -193,6 +194,7 @@ asmlinkage void __init cf_early_init(voi + m68k_memory[m68k_num_memory].addr = CONFIG_SDRAM_BASE; + m68k_memory[m68k_num_memory++].size = CONFIG_SDRAM_SIZE; + ++#if 0 + if (!uboot_commandline(m68k_command_line)) { + #if defined(CONFIG_BOOTPARAM) + strncpy(m68k_command_line, CONFIG_BOOTPARAM_STRING, CL_SIZE-1); +@@ -200,6 +202,10 @@ asmlinkage void __init cf_early_init(voi + strcpy(m68k_command_line, DEFAULT_COMMAND_LINE); + #endif + } ++#endif ++/* JKM -- temporary! */ ++strcpy(m68k_command_line, DEFAULT_COMMAND_LINE); ++/* JKM -- temporary! */ + + #if defined(CONFIG_BLK_DEV_INITRD) + /* add initrd image */ +@@ -223,9 +229,10 @@ asmlinkage void __init cf_early_init(voi + + /* Turn on caches via CACR, enable EUSP */ + cacr_set(CACHE_INITIAL_MODE); ++ + } + +-#if defined(CONFIG_M54455) ++#if defined(CONFIG_M5445X) + void settimericr(unsigned int timer, unsigned int level) + { + volatile unsigned char *icrp; +@@ -256,7 +263,7 @@ void __init coldfire_trap_init(void) + int i = 0; + e_vector *vectors; + +-#if defined(CONFIG_M54455) ++#if defined(CONFIG_M5445X) + vectors = (e_vector *)MCF_RAMBAR1; + #elif defined(CONFIG_M547X_8X) + vectors = (e_vector *)MCF_RAMBAR0; +@@ -281,7 +288,7 @@ void __init coldfire_trap_init(void) + vectors[32] = system_call; + } + +-#if defined(CONFIG_M54455) ++#if defined(CONFIG_M5445X) + + void coldfire_tick(void) + { +@@ -369,7 +376,7 @@ unsigned long coldfire_gettimeoffset(voi + + void coldfire_reboot(void) + { +-#if defined(CONFIG_M54455) ++#if defined(CONFIG_M5445X) + /* disable interrupts and do a software reset */ + asm("movew #0x2700, %%sr\n\t" + "moveb #0x80, %%d0\n\t" +--- a/arch/m68k/coldfire/head.S ++++ b/arch/m68k/coldfire/head.S +@@ -63,8 +63,8 @@ + * None currently (mapped via TLBs) + */ + +-#if CONFIG_SDRAM_BASE != PAGE_BASE +-#if defined(CONFIG_M54455) ++#if CONFIG_SDRAM_BASE != PAGE_OFFSET ++#if defined(CONFIG_M5445X) + #if 0 + #define ACR0_DEFAULT #0xA00FA048 /* ACR0 default value */ + #endif +@@ -85,7 +85,11 @@ + #endif + + #else +-#if defined(CONFIG_M54455) ++#if defined(CONFIG_M5445X) ++#define ACR0_DEFAULT #0xF00FC040 /* ACR0 default value */ ++#define ACR1_DEFAULT #0x400FA008 /* ACR1 default value */ ++#define ACR2_DEFAULT #0x00000000 /* ACR2 default value */ ++#define ACR3_DEFAULT #0x400FA008 /* ACR3 default value */ + #elif defined(CONFIG_M547X_8X) + #define ACR0_DEFAULT #0xF00FC040 /* ACR0 default value */ + #define ACR1_DEFAULT #0x000FA008 /* ACR1 default value */ +@@ -280,7 +284,7 @@ ENTRY(__start) + subl %a0,%a0 + movel %a0,%usp + +-#if defined(CONFIG_M54455) ++#if defined(CONFIG_M5445X) + movel #(MCF_RAMBAR1 + 0x221), %d0 + movec %d0, %rambar1 + #elif defined(CONFIG_M547X_8X) +@@ -331,12 +335,11 @@ _loop_bss: + cmpl %a0,%a1 + bne _loop_bss + #endif +- + /* If you change the memory size to another value make a matching + change in paging_init(cf-mmu.c) to zones_size[]. */ + + #if CONFIG_SDRAM_BASE != PAGE_OFFSET +-#if defined(CONFIG_M54455) ++#if defined(CONFIG_M5445X) + /* Map 256MB as code */ + mmu_map (PAGE_OFFSET+0*0x1000000), (PHYS_OFFSET+0*0x1000000), \ + MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC, MMUDR_SP, \ +@@ -502,7 +505,7 @@ _loop_bss: + * enabled and we are executing in high memory. + */ + +-#if defined(CONFIG_M54455) ++#if defined(CONFIG_M5445X) + /* Map first 16 MB as code */ + mmu_map (PHYS_OFFSET+0*0x1000000), (PHYS_OFFSET+0*0x1000000), \ + MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_INC, MMUDR_SP, 0, \ +@@ -562,7 +565,7 @@ ENTRY(__running_high) + + /* Unmap unity mappings */ + #if CONFIG_SDRAM_BASE != PAGE_OFFSET +-#if defined(CONFIG_M54455) ++#if defined(CONFIG_M5445X) + mmu_unmap (PHYS_OFFSET+0*0x1000000), MMUOR_ITLB, %d0 + mmu_unmap (PHYS_OFFSET+0*0x1000000), 0, %d0 + #elif defined(CONFIG_M547X_8X) +@@ -599,9 +602,9 @@ func_start set_context,%d0,(1*4) + movec %d0,%asid + func_return set_context + +-#ifdef CONFIG_M54455 ++#ifdef CONFIG_M5445X + /* +- * set_fpga(addr,val) on the M54455EVB ++ * set_fpga(addr,val) on the M5445X + * + * Map in 0x00000000 -> 0x0fffffff and then do the write. + */ +--- a/arch/m68k/coldfire/ints.c ++++ b/arch/m68k/coldfire/ints.c +@@ -47,7 +47,7 @@ static int irq_depth[SYS_IRQS]; + /* + * IRQ Controller + */ +-#if defined(CONFIG_M54455) ++#if defined(CONFIG_M5445X) + void m5445x_irq_enable(unsigned int irq); + void m5445x_irq_disable(unsigned int irq); + static struct irq_controller m5445x_irq_controller = { +@@ -87,7 +87,7 @@ void __init init_IRQ(void) + { + int i; + +-#if defined(CONFIG_M54455) ++#if defined(CONFIG_M5445X) + for (i = 0; i < SYS_IRQS; i++) + irq_controller[i] = &m5445x_irq_controller; + #elif defined(CONFIG_M547X_8X) +@@ -337,7 +337,7 @@ asmlinkage void handle_badint(struct pt_ + } + EXPORT_SYMBOL(handle_badint); + +-#ifdef CONFIG_M54455 ++#ifdef CONFIG_M5445X + /* + * M5445X Implementation + */ +--- a/arch/m68k/kernel/dma.c ++++ b/arch/m68k/kernel/dma.c +@@ -17,7 +17,7 @@ + void *dma_alloc_coherent(struct device *dev, size_t size, + dma_addr_t *handle, gfp_t flag) + { +-#ifndef CONFIG_M54455 ++#ifndef CONFIG_M5445X + struct page *page, **map; + pgprot_t pgprot; + void *addr; +@@ -75,7 +75,7 @@ void dma_free_coherent(struct device *de + void *addr, dma_addr_t handle) + { + pr_debug("dma_free_coherent: %p, %x\n", addr, handle); +-#ifndef CONFIG_M54455 ++#ifndef CONFIG_M5445X + vfree(addr); + #else + kfree(addr); +--- a/arch/m68k/kernel/setup.c ++++ b/arch/m68k/kernel/setup.c +@@ -519,7 +519,7 @@ int get_hardware_list(char *buffer) + + void check_bugs(void) + { +-#if !defined(CONFIG_M68KFPU_EMU) && !defined(CONFIG_M54455) ++#if !defined(CONFIG_M68KFPU_EMU) && !defined(CONFIG_M5445X) + if (m68k_fputype == 0) { + printk(KERN_EMERG "*** YOU DO NOT HAVE A FLOATING POINT UNIT, " + "WHICH IS REQUIRED BY LINUX/M68K ***\n"); +--- a/arch/m68k/mm/kmap.c ++++ b/arch/m68k/mm/kmap.c +@@ -133,7 +133,7 @@ void __iomem *__ioremap(unsigned long ph + } + #endif + +-#ifdef CONFIG_M54455 ++#ifdef CONFIG_M5445X + if (physaddr >= 0xf0000000) { + /* + * On the M5445x processors an ACR is setup to map +--- a/drivers/crypto/Kconfig ++++ b/drivers/crypto/Kconfig +@@ -62,15 +62,15 @@ config CRYPTO_DEV_GEODE + + config CRYPTO_DEV_MCFCAU + bool "Support for Freescale Coldfire Cryptographic Acceleration Unit (CAU)" +- depends on M54455 ++ depends on M5445X + select CRYPTO_ALGAPI + help + The cryptographic acceleration unit (CAU) is a ColdFire coprocessor + implementing a set of specialized operations in hardware. For example, you can +- find it on MCF54455. ++ find it on MCF5445X. + + config CRYPTO_DEV_MCFCAU_DES +- tristate "DES and Triple DES cipher algorithms (MCF54455)" ++ tristate "DES and Triple DES cipher algorithms (MCF5445X)" + depends on CRYPTO_DEV_MCFCAU + select CRYPTO_ALGAPI + select CRYPTO_BLKCIPHER +@@ -84,7 +84,7 @@ config CRYPTO_DEV_MCFCAU_DES + will be called mcfcau-des. + + config CRYPTO_DEV_MCFCAU_AES +- tristate "AES cipher algorithm (MCF54455)" ++ tristate "AES cipher algorithm (MCF5445X)" + depends on CRYPTO_DEV_MCFCAU + select CRYPTO_ALGAPI + select CRYPTO_BLKCIPHER +@@ -98,7 +98,7 @@ config CRYPTO_DEV_MCFCAU_AES + will be called mcfcau-aes. + + config CRYPTO_DEV_MCFCAU_MD5 +- tristate "MD5 digest algorithm (MCF54455)" ++ tristate "MD5 digest algorithm (MCF5445X)" + depends on CRYPTO_DEV_MCFCAU + select CRYPTO_ALGAPI + help +@@ -111,7 +111,7 @@ config CRYPTO_DEV_MCFCAU_MD5 + will be called mcfcau-md5. + + config CRYPTO_DEV_MCFCAU_SHA1 +- tristate "SHA1 digest algorithm (MCF54455)" ++ tristate "SHA1 digest algorithm (MCF5445X)" + depends on CRYPTO_DEV_MCFCAU + select CRYPTO_ALGAPI + help +--- a/drivers/crypto/mcfcau-aes.c ++++ b/drivers/crypto/mcfcau-aes.c +@@ -5,7 +5,7 @@ + * Author: Andrey Butok + * Copyright Freescale Semiconductor Inc. 2007 + * +- * NOTE: You can find the ColdFire CAU module on MCF54455 and MCF52235. ++ * NOTE: You can find the ColdFire CAU module on MCF5445X and MCF52235. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the +--- a/drivers/crypto/mcfcau-des.c ++++ b/drivers/crypto/mcfcau-des.c +@@ -5,7 +5,7 @@ + * Author: Andrey Butok + * Copyright Freescale Semiconductor Inc. 2007 + * +- * NOTE: You can find the ColdFire CAU module on MCF54455 and MCF52235. ++ * NOTE: You can find the ColdFire CAU module on MCF5445X and MCF52235. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the +--- a/drivers/crypto/mcfcau-md5.c ++++ b/drivers/crypto/mcfcau-md5.c +@@ -5,7 +5,7 @@ + * Author: Andrey Butok + * Copyright Freescale Semiconductor Inc. 2007 + * +- * NOTE: You can find the ColdFire CAU module on MCF54455 and MCF52235. ++ * NOTE: You can find the ColdFire CAU module on MCF5445X and MCF52235. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the +--- a/drivers/crypto/mcfcau-sha1.c ++++ b/drivers/crypto/mcfcau-sha1.c +@@ -5,7 +5,7 @@ + * Author: Andrey Butok + * Copyright Freescale Semiconductor Inc. 2007 + * +- * NOTE: You can find the ColdFire CAU module on MCF54455 and MCF52235. ++ * NOTE: You can find the ColdFire CAU module on MCF5445X and MCF52235. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the +--- a/drivers/crypto/mcfcau.c ++++ b/drivers/crypto/mcfcau.c +@@ -5,7 +5,7 @@ + * Author: Andrey Butok + * Copyright Freescale Semiconductor Inc. 2007 + * +- * NOTE: You can find the ColdFire CAU module on MCF54455 and MCF52235. ++ * NOTE: You can find the ColdFire CAU module on MCF5445X and MCF52235. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the +--- a/drivers/crypto/mcfcau.h ++++ b/drivers/crypto/mcfcau.h +@@ -5,7 +5,7 @@ + * Author: Andrey Butok + * Copyright Freescale Semiconductor Inc. 2007 + * +- * NOTE: You can find the ColdFire CAU module on MCF54455 and MCF52235. ++ * NOTE: You can find the ColdFire CAU module on MCF5445X and MCF52235. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the +--- a/drivers/net/Kconfig ++++ b/drivers/net/Kconfig +@@ -1975,7 +1975,7 @@ config 68360_ENET + + config FEC + bool "FEC ethernet controller (of ColdFire CPUs)" +- depends on M523x || M527x || M5272 || M528x || M520x || M54455 ++ depends on M523x || M527x || M5272 || M528x || M520x || M5445X + help + Say Y here if you want to use the built-in 10/100 Fast ethernet + controller on some Motorola ColdFire processors. +--- a/drivers/net/fec.c ++++ b/drivers/net/fec.c +@@ -52,7 +52,7 @@ + #if defined(CONFIG_M523x) || defined(CONFIG_M527x) || \ + defined(CONFIG_M5272) || defined(CONFIG_M528x) || \ + defined(CONFIG_M520x) || defined(CONFIG_M532x) || \ +- defined(CONFIG_M54455) ++ defined(CONFIG_M5445X) + + #include <asm/coldfire.h> + #include <asm/mcfsim.h> +@@ -84,7 +84,7 @@ static unsigned int fec_hw[] = { + (MCF_MBAR+0x30000), + #elif defined(CONFIG_M532x) + (MCF_MBAR+0xfc030000), +-#elif defined(CONFIG_M54455) ++#elif defined(CONFIG_M5445X) + (MCF_MBAR+0xfc030000), + #if defined(CONFIG_FEC2) + (MCF_MBAR+0xfc034000), +@@ -179,7 +179,7 @@ typedef struct { + * account when setting it. + */ + #if defined(CONFIG_M523x) || defined(CONFIG_M527x) || defined(CONFIG_M528x) || \ +- defined(CONFIG_M520x) || defined(CONFIG_M532x) || defined(CONFIG_M54455) ++ defined(CONFIG_M520x) || defined(CONFIG_M532x) || defined(CONFIG_M5445X) + #define OPT_FRAME_SIZE (PKT_MAXBUF_SIZE << 16) + #else + #define OPT_FRAME_SIZE 0 +@@ -1831,9 +1831,9 @@ static void __inline__ fec_uncache(unsig + + /* ------------------------------------------------------------------------- */ + +-#elif defined(CONFIG_M54455) ++#elif defined(CONFIG_M5445X) + /* +- * Code specific for M54455 ++ * Code specific for M5445X + */ + + static void __inline__ fec_request_intrs(struct net_device *dev) +--- a/drivers/net/fec.h ++++ b/drivers/net/fec.h +@@ -14,7 +14,7 @@ + /****************************************************************************/ + + #if defined(CONFIG_M523x) || defined(CONFIG_M527x) || defined(CONFIG_M528x) || \ +- defined(CONFIG_M520x) || defined(CONFIG_M532x) || defined(CONFIG_M54455) ++ defined(CONFIG_M520x) || defined(CONFIG_M532x) || defined(CONFIG_M5445X) + /* + * Just figures, Motorola would have to change the offsets for + * registers in the same peripheral device on different models +--- a/drivers/serial/mcfserial.c ++++ b/drivers/serial/mcfserial.c +@@ -69,7 +69,7 @@ struct timer_list mcfrs_timer_struct; + #define DEFAULT_CBAUD B38400 + #elif defined(CONFIG_MOD5272) || defined(CONFIG_M5208EVB) || \ + defined(CONFIG_M5329EVB) || defined(CONFIG_GILBARCO) || \ +- defined(CONFIG_M54455) || defined(CONFIG_M547X_8X) ++ defined(CONFIG_M5445X) || defined(CONFIG_M547X_8X) + #define CONSOLE_BAUD_RATE 115200 + #define DEFAULT_CBAUD B115200 + #elif defined(CONFIG_ARNEWSH) || defined(CONFIG_FREESCALE) || \ +@@ -102,7 +102,7 @@ static struct tty_driver *mcfrs_serial_d + #undef SERIAL_DEBUG_FLOW + + #if defined(CONFIG_M523x) || defined(CONFIG_M527x) || defined(CONFIG_M528x) || \ +- defined(CONFIG_M520x) || defined(CONFIG_M532x) || defined(CONFIG_M54455) || \ ++ defined(CONFIG_M520x) || defined(CONFIG_M532x) || defined(CONFIG_M5445X) || \ + defined(CONFIG_M547X_8X) + #define IRQBASE (MCFINT_VECBASE+MCFINT_UART0) + #else +@@ -1630,7 +1630,7 @@ static void mcfrs_irqinit(struct mcf_ser + /* GPIOs also must be initalized, depends on board */ + break; + } +-#elif defined(CONFIG_M54455) ++#elif defined(CONFIG_M5445X) + volatile unsigned char *uartp; + uartp = info->addr; + switch (info->line) { +@@ -2022,7 +2022,7 @@ struct console mcfrs_console = { + + static int __init mcfrs_console_init(void) + { +-#if !(defined(CONFIG_M54455) || defined(CONFIG_M547X_8X)) ++#if !(defined(CONFIG_M5445X) || defined(CONFIG_M547X_8X)) + register_console(&mcfrs_console); + #endif + return 0; +--- a/drivers/spi/coldfire_edma.c ++++ b/drivers/spi/coldfire_edma.c +@@ -20,10 +20,10 @@ + #include <linux/cdev.h> + #include <linux/seq_file.h> + #include <linux/proc_fs.h> +-#ifdef CONFIG_M54455 ++#ifdef CONFIG_M5445X + #include <asm/mcf5445x_edma.h> + #include <asm/mcf5445x_intc.h> +-#endif /* CONFIG_M54455 */ ++#endif /* CONFIG_M5445X */ + #include <asm/coldfire_edma.h> + + /* +--- a/drivers/spi/spi_coldfire.c ++++ b/drivers/spi/spi_coldfire.c +@@ -57,7 +57,7 @@ + #include <asm/mcfqspi.h> + #include <asm/coldfire.h> + +-#if defined(CONFIG_M54455) ++#if defined(CONFIG_M5445X) + #include <asm/virtconvert.h> + + #define SPI_DSPI +--- a/drivers/spi/ssi_audio.c ++++ b/drivers/spi/ssi_audio.c +@@ -25,7 +25,7 @@ + + #include <asm/coldfire.h> + #include <asm/coldfire_edma.h> +-#ifdef CONFIG_M54455 ++#ifdef CONFIG_M5445X + #include <asm/mcf5445x_ssi.h> + #include <asm/mcf5445x_ccm.h> + #include <asm/mcf5445x_gpio.h> +--- a/include/asm-m68k/cfcache.h ++++ b/include/asm-m68k/cfcache.h +@@ -40,7 +40,7 @@ + #define CF_CACR_IDSP (0x00000080) /* Ins default supervisor-protect */ + #define CF_CACR_EUSP (0x00000020) /* Switch stacks in user mode */ + +-#ifdef CONFIG_M54455 ++#ifdef CONFIG_M5445X + /* + * M5445x Cache Configuration + * - cache line size is 16 bytes +--- a/include/asm-m68k/coldfire.h ++++ b/include/asm-m68k/coldfire.h +@@ -1,9 +1,9 @@ + #ifndef _COLDFIRE_H_ + #define _COLDFIRE_H_ + +-#if defined(CONFIG_M54455) ++#if defined(CONFIG_M5445X) + #define MCF_MBAR 0x0 +-#define MCF_RAMBAR1 0x40000000 ++#define MCF_RAMBAR1 0x80000000 + #define MCF_SRAM 0x80000000 + #elif defined(CONFIG_M547X_8X) + #define MCF_MBAR 0xF0000000 +--- a/include/asm-m68k/coldfire_edma.h ++++ b/include/asm-m68k/coldfire_edma.h +@@ -20,14 +20,14 @@ + #define EDMA_DRIVER_NAME "ColdFire-eDMA" + #define DMA_DEV_MINOR 1 + +-#ifdef CONFIG_M54455 ++#ifdef CONFIG_M5445X + #define EDMA_INT_CHANNEL_BASE 8 + #define EDMA_INT_CONTROLLER_BASE 64 + #define EDMA_INT_BASE (EDMA_INT_CHANNEL_BASE + \ + EDMA_INT_CONTROLLER_BASE) + #define EDMA_CHANNELS 16 + #define EDMA_INT_ERR 16 /* edma error interrupt */ +-#endif /* CONFIG_M54455 */ ++#endif /* CONFIG_M5445X */ + + typedef irqreturn_t (*edma_irq_handler)(int, void *); + typedef void (*edma_error_handler)(int, void *); +--- a/include/asm-m68k/mcfsim.h ++++ b/include/asm-m68k/mcfsim.h +@@ -12,7 +12,7 @@ + #include <asm/coldfire.h> + #endif + +-#if defined(CONFIG_M54455) ++#if defined(CONFIG_M5445X) + #include <asm/mcf5445x_intc.h> + #include <asm/mcf5445x_gpio.h> + #include <asm/mcf5445x_i2c.h> +--- a/include/asm-m68k/mcfuart.h ++++ b/include/asm-m68k/mcfuart.h +@@ -15,7 +15,7 @@ + * Define the base address of the UARTS within the MBAR address + * space. + */ +-#if defined(CONFIG_M54455) ++#if defined(CONFIG_M5445X) + #include <asm/mcf5445x_intc.h> + #define MCFUART_BASE1 0xfc060000 /* Base address of UART1 */ + #define MCFUART_BASE2 0xfc064000 /* Base address of UART2 */ +--- a/include/asm-m68k/page_offset.h ++++ b/include/asm-m68k/page_offset.h +@@ -4,7 +4,7 @@ + #if defined(CONFIG_SUN3) + #define PAGE_OFFSET_RAW 0x0E000000 + +-#elif defined(CONFIG_M54455) || defined(CONFIG_M547X_8X) ++#elif defined(CONFIG_M5445X) || defined(CONFIG_M547X_8X) + #define PHYS_OFFSET CONFIG_SDRAM_BASE + #define PAGE_OFFSET_RAW (PHYS_OFFSET) + /* #define PAGE_OFFSET_RAW 0xC0000000 */ +--- a/include/asm-m68k/setup.h ++++ b/include/asm-m68k/setup.h +@@ -240,7 +240,7 @@ extern unsigned long m68k_machtype; + #define FPU_68040 (1<<FPUB_68040) + #define FPU_68060 (1<<FPUB_68060) + #define FPU_SUNFPA (1<<FPUB_SUNFPA) +-#ifndef CONFIG_M54455 ++#ifndef CONFIG_M5445X + #define FPU_CFV4E (1<<FPUB_CFV4E) + #else + #define FPU_CFV4E 0 diff --git a/target/linux/coldfire/patches/062-mcfv4e_cache_split.patch b/target/linux/coldfire/patches/062-mcfv4e_cache_split.patch new file mode 100644 index 0000000000..a98c334b6d --- /dev/null +++ b/target/linux/coldfire/patches/062-mcfv4e_cache_split.patch @@ -0,0 +1,979 @@ +From 940b4fea5ebfde3abe03c6469a57c01ee961497a Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Wed, 18 Jun 2008 15:20:21 -0600 +Subject: [PATCH] Split 547x/548x and 5445x cache routines into separate files. + +LTIBName: mcfv4e-cache-split +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + include/asm-m68k/cf_5445x_cacheflush.h | 447 ++++++++++++++++++++++++++++++++ + include/asm-m68k/cf_548x_cacheflush.h | 259 ++++++++++++++++++ + include/asm-m68k/cf_cacheflush.h | 244 +----------------- + 3 files changed, 711 insertions(+), 239 deletions(-) + create mode 100644 include/asm-m68k/cf_5445x_cacheflush.h + create mode 100644 include/asm-m68k/cf_548x_cacheflush.h + +--- /dev/null ++++ b/include/asm-m68k/cf_5445x_cacheflush.h +@@ -0,0 +1,447 @@ ++/* ++ * include/asm-m68k/cf_5445x_cacheflush.h - Coldfire 5445x Cache ++ * ++ * Based on include/asm-m68k/cacheflush.h ++ * ++ * Coldfire pieces by: ++ * Kurt Mahan kmahan@freescale.com ++ * ++ * Copyright Freescale Semiconductor, Inc. 2007, 2008 ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ */ ++#ifndef M68K_CF_5445x_CACHEFLUSH_H ++#define M68K_CF_5445x_CACHEFLUSH_H ++ ++#include <asm/cfcache.h> ++ ++/* ++ * Coldfire Cache Model ++ * ++ * The Coldfire processors use a Harvard architecture cache configured ++ * as four-way set associative. The cache does not implement bus snooping ++ * so cache coherency with other masters must be maintained in software. ++ * ++ * The cache is managed via the CPUSHL instruction in conjunction with ++ * bits set in the CACR (cache control register). Currently the code ++ * uses the CPUSHL enhancement which adds the ability to ++ * invalidate/clear/push a cacheline by physical address. This feature ++ * is designated in the Hardware Configuration Register [D1-CPES]. ++ * ++ * CACR Bits: ++ * DPI[28] cpushl invalidate disable for d-cache ++ * IDPI[12] cpushl invalidate disable for i-cache ++ * SPA[14] cpushl search by physical address ++ * IVO[20] cpushl invalidate only ++ * ++ * Random Terminology: ++ * * invalidate = reset the cache line's valid bit ++ * * push = generate a line-sized store of the data if its contents are marked ++ * as modifed (the modified flag is cleared after the store) ++ * * clear = push + invalidate ++ */ ++ ++/** ++ * flush_icache - Flush all of the instruction cache ++ */ ++static inline void flush_icache(void) ++{ ++ asm volatile("nop\n" ++ "moveq%.l #0,%%d0\n" ++ "moveq%.l #0,%%d1\n" ++ "move%.l %%d0,%%a0\n" ++ "1:\n" ++ "cpushl %%ic,(%%a0)\n" ++ "add%.l #0x0010,%%a0\n" ++ "addq%.l #1,%%d1\n" ++ "cmpi%.l %0,%%d1\n" ++ "bne 1b\n" ++ "moveq%.l #0,%%d1\n" ++ "addq%.l #1,%%d0\n" ++ "move%.l %%d0,%%a0\n" ++ "cmpi%.l #4,%%d0\n" ++ "bne 1b\n" ++ : : "i" (CACHE_SETS) ++ : "a0", "d0", "d1"); ++} ++ ++/** ++ * flush_dcache - Flush all of the data cache ++ */ ++static inline void flush_dcache(void) ++{ ++ asm volatile("nop\n" ++ "moveq%.l #0,%%d0\n" ++ "moveq%.l #0,%%d1\n" ++ "move%.l %%d0,%%a0\n" ++ "1:\n" ++ "cpushl %%dc,(%%a0)\n" ++ "add%.l #0x0010,%%a0\n" ++ "addq%.l #1,%%d1\n" ++ "cmpi%.l %0,%%d1\n" ++ "bne 1b\n" ++ "moveq%.l #0,%%d1\n" ++ "addq%.l #1,%%d0\n" ++ "move%.l %%d0,%%a0\n" ++ "cmpi%.l #4,%%d0\n" ++ "bne 1b\n" ++ : : "i" (CACHE_SETS) ++ : "a0", "d0", "d1"); ++} ++ ++/** ++ * flush_bcache - Flush all of both caches ++ */ ++static inline void flush_bcache(void) ++{ ++ asm volatile("nop\n" ++ "moveq%.l #0,%%d0\n" ++ "moveq%.l #0,%%d1\n" ++ "move%.l %%d0,%%a0\n" ++ "1:\n" ++ "cpushl %%bc,(%%a0)\n" ++ "add%.l #0x0010,%%a0\n" ++ "addq%.l #1,%%d1\n" ++ "cmpi%.l %0,%%d1\n" ++ "bne 1b\n" ++ "moveq%.l #0,%%d1\n" ++ "addq%.l #1,%%d0\n" ++ "move%.l %%d0,%%a0\n" ++ "cmpi%.l #4,%%d0\n" ++ "bne 1b\n" ++ : : "i" (CACHE_SETS) ++ : "a0", "d0", "d1"); ++} ++ ++/** ++ * cf_cache_clear - invalidate cache ++ * @paddr: starting physical address ++ * @len: number of bytes ++ * ++ * Invalidate cache lines starting at paddr for len bytes. ++ * Those lines are not pushed. ++ */ ++static inline void cf_cache_clear(unsigned long paddr, int len) ++{ ++ /* number of lines */ ++ len = (len + (CACHE_LINE_SIZE-1)) / CACHE_LINE_SIZE; ++ if (len == 0) ++ return; ++ ++ /* align on set boundary */ ++ paddr &= 0xfffffff0; ++ ++ asm volatile("nop\n" ++ "move%.l %2,%%d0\n" ++ "or%.l %3,%%d0\n" ++ "movec %%d0,%%cacr\n" ++ "move%.l %0,%%a0\n" ++ "move%.l %1,%%d0\n" ++ "1:\n" ++ "cpushl %%bc,(%%a0)\n" ++ "lea 0x10(%%a0),%%a0\n" ++ "subq%.l #1,%%d0\n" ++ "bne%.b 1b\n" ++ "movec %2,%%cacr\n" ++ : : "a" (paddr), "r" (len), ++ "r" (shadow_cacr), ++ "i" (CF_CACR_SPA+CF_CACR_IVO) ++ : "a0", "d0"); ++} ++ ++/** ++ * cf_cache_push - Push dirty cache out with no invalidate ++ * @paddr: starting physical address ++ * @len: number of bytes ++ * ++ * Push the any dirty lines starting at paddr for len bytes. ++ * Those lines are not invalidated. ++ */ ++static inline void cf_cache_push(unsigned long paddr, int len) ++{ ++ /* number of lines */ ++ len = (len + (CACHE_LINE_SIZE-1)) / CACHE_LINE_SIZE; ++ if (len == 0) ++ return; ++ ++ /* align on set boundary */ ++ paddr &= 0xfffffff0; ++ ++ asm volatile("nop\n" ++ "move%.l %2,%%d0\n" ++ "or%.l %3,%%d0\n" ++ "movec %%d0,%%cacr\n" ++ "move%.l %0,%%a0\n" ++ "move%.l %1,%%d0\n" ++ "1:\n" ++ "cpushl %%bc,(%%a0)\n" ++ "lea 0x10(%%a0),%%a0\n" ++ "subq%.l #1,%%d0\n" ++ "bne.b 1b\n" ++ "movec %2,%%cacr\n" ++ : : "a" (paddr), "r" (len), ++ "r" (shadow_cacr), ++ "i" (CF_CACR_SPA+CF_CACR_DPI+CF_CACR_IDPI) ++ : "a0", "d0"); ++} ++ ++/** ++ * cf_cache_flush - Push dirty cache out and invalidate ++ * @paddr: starting physical address ++ * @len: number of bytes ++ * ++ * Push the any dirty lines starting at paddr for len bytes and ++ * invalidate those lines. ++ */ ++static inline void cf_cache_flush(unsigned long paddr, int len) ++{ ++ /* number of lines */ ++ len = (len + (CACHE_LINE_SIZE-1)) / CACHE_LINE_SIZE; ++ if (len == 0) ++ return; ++ ++ /* align on set boundary */ ++ paddr &= 0xfffffff0; ++ ++ asm volatile("nop\n" ++ "move%.l %2,%%d0\n" ++ "or%.l %3,%%d0\n" ++ "movec %%d0,%%cacr\n" ++ "move%.l %0,%%a0\n" ++ "move%.l %1,%%d0\n" ++ "1:\n" ++ "cpushl %%bc,(%%a0)\n" ++ "lea 0x10(%%a0),%%a0\n" ++ "subq%.l #1,%%d0\n" ++ "bne.b 1b\n" ++ "movec %2,%%cacr\n" ++ : : "a" (paddr), "r" (len), ++ "r" (shadow_cacr), ++ "i" (CF_CACR_SPA) ++ : "a0", "d0"); ++} ++ ++/** ++ * cf_cache_flush_range - Push dirty data/inst cache in range out and invalidate ++ * @vstart - starting virtual address ++ * @vend: ending virtual address ++ * ++ * Push the any dirty data/instr lines starting at paddr for len bytes and ++ * invalidate those lines. ++ */ ++static inline void cf_cache_flush_range(unsigned long vstart, unsigned long vend) ++{ ++ int len; ++ ++ /* align on set boundary */ ++ vstart &= 0xfffffff0; ++ vend = PAGE_ALIGN((vend + (CACHE_LINE_SIZE-1))) & 0xfffffff0; ++ len = vend - vstart; ++ if (len == 0) ++ return; ++ vstart = __pa(vstart); ++ vend = vstart + len; ++ ++ asm volatile("nop\n" ++ "move%.l %2,%%d0\n" ++ "or%.l %3,%%d0\n" ++ "movec %%d0,%%cacr\n" ++ "move%.l %0,%%a0\n" ++ "move%.l %1,%%a1\n" ++ "1:\n" ++ "cpushl %%bc,(%%a0)\n" ++ "lea 0x10(%%a0),%%a0\n" ++ "cmpa%.l %%a0,%%a1\n" ++ "bne.b 1b\n" ++ "movec %2,%%cacr\n" ++ : /* no return */ ++ : "a" (vstart), "a" (vend), ++ "r" (shadow_cacr), ++ "i" (CF_CACR_SPA) ++ : "a0", "a1", "d0"); ++} ++ ++/** ++ * cf_dcache_flush_range - Push dirty data cache in range out and invalidate ++ * @vstart - starting virtual address ++ * @vend: ending virtual address ++ * ++ * Push the any dirty data lines starting at paddr for len bytes and ++ * invalidate those lines. ++ */ ++static inline void cf_dcache_flush_range(unsigned long vstart, unsigned long vend) ++{ ++ /* align on set boundary */ ++ vstart &= 0xfffffff0; ++ vend = (vend + (CACHE_LINE_SIZE-1)) & 0xfffffff0; ++ ++ asm volatile("nop\n" ++ "move%.l %2,%%d0\n" ++ "or%.l %3,%%d0\n" ++ "movec %%d0,%%cacr\n" ++ "move%.l %0,%%a0\n" ++ "move%.l %1,%%a1\n" ++ "1:\n" ++ "cpushl %%dc,(%%a0)\n" ++ "lea 0x10(%%a0),%%a0\n" ++ "cmpa%.l %%a0,%%a1\n" ++ "bne.b 1b\n" ++ "movec %2,%%cacr\n" ++ : /* no return */ ++ : "a" (__pa(vstart)), "a" (__pa(vend)), ++ "r" (shadow_cacr), ++ "i" (CF_CACR_SPA) ++ : "a0", "a1", "d0"); ++} ++ ++/** ++ * cf_icache_flush_range - Push dirty inst cache in range out and invalidate ++ * @vstart - starting virtual address ++ * @vend: ending virtual address ++ * ++ * Push the any dirty instr lines starting at paddr for len bytes and ++ * invalidate those lines. This should just be an invalidate since you ++ * shouldn't be able to have dirty instruction cache. ++ */ ++static inline void cf_icache_flush_range(unsigned long vstart, unsigned long vend) ++{ ++ /* align on set boundary */ ++ vstart &= 0xfffffff0; ++ vend = (vend + (CACHE_LINE_SIZE-1)) & 0xfffffff0; ++ ++ asm volatile("nop\n" ++ "move%.l %2,%%d0\n" ++ "or%.l %3,%%d0\n" ++ "movec %%d0,%%cacr\n" ++ "move%.l %0,%%a0\n" ++ "move%.l %1,%%a1\n" ++ "1:\n" ++ "cpushl %%ic,(%%a0)\n" ++ "lea 0x10(%%a0),%%a0\n" ++ "cmpa%.l %%a0,%%a1\n" ++ "bne.b 1b\n" ++ "movec %2,%%cacr\n" ++ : /* no return */ ++ : "a" (__pa(vstart)), "a" (__pa(vend)), ++ "r" (shadow_cacr), ++ "i" (CF_CACR_SPA) ++ : "a0", "a1", "d0"); ++} ++ ++/** ++ * flush_cache_mm - Flush an mm_struct ++ * @mm: mm_struct to flush ++ */ ++static inline void flush_cache_mm(struct mm_struct *mm) ++{ ++ if (mm == current->mm) ++ flush_bcache(); ++} ++ ++#define flush_cache_dup_mm(mm) flush_cache_mm(mm) ++ ++/** ++ * flush_cache_range - Flush a cache range ++ * @vma: vma struct ++ * @start: Starting address ++ * @end: Ending address ++ * ++ * flush_cache_range must be a macro to avoid a dependency on ++ * linux/mm.h which includes this file. ++ */ ++static inline void flush_cache_range(struct vm_area_struct *vma, ++ unsigned long start, unsigned long end) ++{ ++ if (vma->vm_mm == current->mm) ++ cf_cache_flush_range(start, end); ++} ++ ++/** ++ * flush_cache_page - Flush a page of the cache ++ * @vma: vma struct ++ * @vmaddr: ++ * @pfn: page numer ++ * ++ * flush_cache_page must be a macro to avoid a dependency on ++ * linux/mm.h which includes this file. ++ */ ++static inline void flush_cache_page(struct vm_area_struct *vma, ++ unsigned long vmaddr, unsigned long pfn) ++{ ++ if (vma->vm_mm == current->mm) ++ cf_cache_flush_range(vmaddr, vmaddr+PAGE_SIZE); ++} ++ ++/** ++ * __flush_page_to_ram - Push a page out of the cache ++ * @vaddr: Virtual address at start of page ++ * ++ * Push the page at kernel virtual address *vaddr* and clear ++ * the icache. ++ */ ++static inline void __flush_page_to_ram(void *vaddr) ++{ ++ asm volatile("nop\n" ++ "move%.l %2,%%d0\n" ++ "or%.l %3,%%d0\n" ++ "movec %%d0,%%cacr\n" ++ "move%.l %0,%%d0\n" ++ "and%.l #0xfffffff0,%%d0\n" ++ "move%.l %%d0,%%a0\n" ++ "move%.l %1,%%d0\n" ++ "1:\n" ++ "cpushl %%bc,(%%a0)\n" ++ "lea 0x10(%%a0),%%a0\n" ++ "subq%.l #1,%%d0\n" ++ "bne.b 1b\n" ++ "movec %2,%%cacr\n" ++ : : "a" (__pa(vaddr)), "i" (PAGE_SIZE / CACHE_LINE_SIZE), ++ "r" (shadow_cacr), "i" (CF_CACR_SPA) ++ : "a0", "d0"); ++} ++ ++/* ++ * Various defines for the kernel. ++ */ ++ ++extern void cache_clear(unsigned long paddr, int len); ++extern void cache_push(unsigned long paddr, int len); ++extern void flush_icache_range(unsigned long address, unsigned long endaddr); ++ ++#define flush_cache_all() flush_bcache() ++#define flush_cache_vmap(start, end) flush_bcache() ++#define flush_cache_vunmap(start, end) flush_bcache() ++ ++#define flush_dcache_range(vstart, vend) cf_dcache_flush_range(vstart, vend) ++#define flush_dcache_page(page) __flush_page_to_ram(page_address(page)) ++#define flush_dcache_mmap_lock(mapping) do { } while (0) ++#define flush_dcache_mmap_unlock(mapping) do { } while (0) ++ ++#define flush_icache_page(vma, page) __flush_page_to_ram(page_address(page)) ++ ++/** ++ * copy_to_user_page - Copy memory to user page ++ */ ++static inline void copy_to_user_page(struct vm_area_struct *vma, ++ struct page *page, unsigned long vaddr, ++ void *dst, void *src, int len) ++{ ++ memcpy(dst, src, len); ++ cf_cache_flush(page_to_phys(page), PAGE_SIZE); ++} ++ ++/** ++ * copy_from_user_page - Copy memory from user page ++ */ ++static inline void copy_from_user_page(struct vm_area_struct *vma, ++ struct page *page, unsigned long vaddr, ++ void *dst, void *src, int len) ++{ ++ cf_cache_flush(page_to_phys(page), PAGE_SIZE); ++ memcpy(dst, src, len); ++} ++ ++#endif /* M68K_CF_5445x_CACHEFLUSH_H */ +--- /dev/null ++++ b/include/asm-m68k/cf_548x_cacheflush.h +@@ -0,0 +1,259 @@ ++/* ++ * include/asm-m68k/cf_548x_cacheflush.h - Coldfire 547x/548x Cache ++ * ++ * Based on include/asm-m68k/cacheflush.h ++ * ++ * Coldfire pieces by: ++ * Kurt Mahan kmahan@freescale.com ++ * ++ * Copyright Freescale Semiconductor, Inc. 2007, 2008 ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ */ ++#ifndef M68K_CF_548x_CACHEFLUSH_H ++#define M68K_CF_548x_CACHEFLUSH_H ++ ++#include <asm/cfcache.h> ++/* ++ * Cache handling functions ++ */ ++ ++#define flush_icache() \ ++({ \ ++ unsigned long set; \ ++ unsigned long start_set; \ ++ unsigned long end_set; \ ++ \ ++ start_set = 0; \ ++ end_set = (unsigned long)LAST_DCACHE_ADDR; \ ++ \ ++ for (set = start_set; set <= end_set; set += (0x10 - 3)) { \ ++ asm volatile("cpushl %%ic,(%0)\n" \ ++ "\taddq%.l #1,%0\n" \ ++ "\tcpushl %%ic,(%0)\n" \ ++ "\taddq%.l #1,%0\n" \ ++ "\tcpushl %%ic,(%0)\n" \ ++ "\taddq%.l #1,%0\n" \ ++ "\tcpushl %%ic,(%0)" : "=a" (set) : "a" (set)); \ ++ } \ ++}) ++ ++#define flush_dcache() \ ++({ \ ++ unsigned long set; \ ++ unsigned long start_set; \ ++ unsigned long end_set; \ ++ \ ++ start_set = 0; \ ++ end_set = (unsigned long)LAST_DCACHE_ADDR; \ ++ \ ++ for (set = start_set; set <= end_set; set += (0x10 - 3)) { \ ++ asm volatile("cpushl %%dc,(%0)\n" \ ++ "\taddq%.l #1,%0\n" \ ++ "\tcpushl %%dc,(%0)\n" \ ++ "\taddq%.l #1,%0\n" \ ++ "\tcpushl %%dc,(%0)\n" \ ++ "\taddq%.l #1,%0\n" \ ++ "\tcpushl %%dc,(%0)" : "=a" (set) : "a" (set)); \ ++ } \ ++}) ++ ++#define flush_bcache() \ ++({ \ ++ unsigned long set; \ ++ unsigned long start_set; \ ++ unsigned long end_set; \ ++ \ ++ start_set = 0; \ ++ end_set = (unsigned long)LAST_DCACHE_ADDR; \ ++ \ ++ for (set = start_set; set <= end_set; set += (0x10 - 3)) { \ ++ asm volatile("cpushl %%bc,(%0)\n" \ ++ "\taddq%.l #1,%0\n" \ ++ "\tcpushl %%bc,(%0)\n" \ ++ "\taddq%.l #1,%0\n" \ ++ "\tcpushl %%bc,(%0)\n" \ ++ "\taddq%.l #1,%0\n" \ ++ "\tcpushl %%bc,(%0)" : "=a" (set) : "a" (set)); \ ++ } \ ++}) ++ ++/* ++ * invalidate the cache for the specified memory range. ++ * It starts at the physical address specified for ++ * the given number of bytes. ++ */ ++extern void cache_clear(unsigned long paddr, int len); ++/* ++ * push any dirty cache in the specified memory range. ++ * It starts at the physical address specified for ++ * the given number of bytes. ++ */ ++extern void cache_push(unsigned long paddr, int len); ++ ++/* ++ * push and invalidate pages in the specified user virtual ++ * memory range. ++ */ ++extern void cache_push_v(unsigned long vaddr, int len); ++ ++/* This is needed whenever the virtual mapping of the current ++ process changes. */ ++ ++/** ++ * flush_cache_mm - Flush an mm_struct ++ * @mm: mm_struct to flush ++ */ ++static inline void flush_cache_mm(struct mm_struct *mm) ++{ ++ if (mm == current->mm) ++ flush_bcache(); ++} ++ ++#define flush_cache_dup_mm(mm) flush_cache_mm(mm) ++ ++#define flush_cache_all() flush_bcache() ++ ++/** ++ * flush_cache_range - Flush a cache range ++ * @vma: vma struct ++ * @start: Starting address ++ * @end: Ending address ++ * ++ * flush_cache_range must be a macro to avoid a dependency on ++ * linux/mm.h which includes this file. ++ */ ++static inline void flush_cache_range(struct vm_area_struct *vma, ++ unsigned long start, unsigned long end) ++{ ++ if (vma->vm_mm == current->mm) ++ flush_bcache(); ++// cf_cache_flush_range(start, end); ++} ++ ++/** ++ * flush_cache_page - Flush a page of the cache ++ * @vma: vma struct ++ * @vmaddr: ++ * @pfn: page numer ++ * ++ * flush_cache_page must be a macro to avoid a dependency on ++ * linux/mm.h which includes this file. ++ */ ++static inline void flush_cache_page(struct vm_area_struct *vma, ++ unsigned long vmaddr, unsigned long pfn) ++{ ++ if (vma->vm_mm == current->mm) ++ flush_bcache(); ++// cf_cache_flush_range(vmaddr, vmaddr+PAGE_SIZE); ++} ++ ++/* Push the page at kernel virtual address and clear the icache */ ++/* RZ: use cpush %bc instead of cpush %dc, cinv %ic */ ++#define flush_page_to_ram(page) __flush_page_to_ram((void *) page_address(page)) ++extern inline void __flush_page_to_ram(void *address) ++{ ++ unsigned long set; ++ unsigned long start_set; ++ unsigned long end_set; ++ unsigned long addr = (unsigned long) address; ++ ++ addr &= ~(PAGE_SIZE - 1); /* round down to page start address */ ++ ++ start_set = addr & _ICACHE_SET_MASK; ++ end_set = (addr + PAGE_SIZE-1) & _ICACHE_SET_MASK; ++ ++ if (start_set > end_set) { ++ /* from the begining to the lowest address */ ++ for (set = 0; set <= end_set; set += (0x10 - 3)) { ++ asm volatile("cpushl %%bc,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%bc,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%bc,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%bc,(%0)" : "=a" (set) : "a" (set)); ++ } ++ /* next loop will finish the cache ie pass the hole */ ++ end_set = LAST_ICACHE_ADDR; ++ } ++ for (set = start_set; set <= end_set; set += (0x10 - 3)) { ++ asm volatile("cpushl %%bc,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%bc,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%bc,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%bc,(%0)" : "=a" (set) : "a" (set)); ++ } ++} ++ ++/* Use __flush_page_to_ram() for flush_dcache_page all values are same - MW */ ++#define flush_dcache_page(page) \ ++ __flush_page_to_ram((void *) page_address(page)) ++#define flush_icache_page(vma,pg) \ ++ __flush_page_to_ram((void *) page_address(pg)) ++#define flush_icache_user_range(adr,len) do { } while (0) ++/* NL */ ++#define flush_icache_user_page(vma,page,addr,len) do { } while (0) ++ ++/* Push n pages at kernel virtual address and clear the icache */ ++/* RZ: use cpush %bc instead of cpush %dc, cinv %ic */ ++extern inline void flush_icache_range (unsigned long address, ++ unsigned long endaddr) ++{ ++ unsigned long set; ++ unsigned long start_set; ++ unsigned long end_set; ++ ++ start_set = address & _ICACHE_SET_MASK; ++ end_set = endaddr & _ICACHE_SET_MASK; ++ ++ if (start_set > end_set) { ++ /* from the begining to the lowest address */ ++ for (set = 0; set <= end_set; set += (0x10 - 3)) { ++ asm volatile("cpushl %%ic,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%ic,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%ic,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%ic,(%0)" : "=a" (set) : "a" (set)); ++ } ++ /* next loop will finish the cache ie pass the hole */ ++ end_set = LAST_ICACHE_ADDR; ++ } ++ for (set = start_set; set <= end_set; set += (0x10 - 3)) { ++ asm volatile("cpushl %%ic,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%ic,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%ic,(%0)\n" ++ "\taddq%.l #1,%0\n" ++ "\tcpushl %%ic,(%0)" : "=a" (set) : "a" (set)); ++ } ++} ++ ++static inline void copy_to_user_page(struct vm_area_struct *vma, ++ struct page *page, unsigned long vaddr, ++ void *dst, void *src, int len) ++{ ++ memcpy(dst, src, len); ++ flush_icache_user_page(vma, page, vaddr, len); ++} ++static inline void copy_from_user_page(struct vm_area_struct *vma, ++ struct page *page, unsigned long vaddr, ++ void *dst, void *src, int len) ++{ ++ memcpy(dst, src, len); ++} ++ ++#define flush_cache_vmap(start, end) flush_cache_all() ++#define flush_cache_vunmap(start, end) flush_cache_all() ++#define flush_dcache_mmap_lock(mapping) do { } while (0) ++#define flush_dcache_mmap_unlock(mapping) do { } while (0) ++ ++#endif /* M68K_CF_548x_CACHEFLUSH_H */ +--- a/include/asm-m68k/cf_cacheflush.h ++++ b/include/asm-m68k/cf_cacheflush.h +@@ -1,244 +1,10 @@ + #ifndef M68K_CF_CACHEFLUSH_H + #define M68K_CF_CACHEFLUSH_H + +-#include <asm/cfcache.h> +-/* +- * Cache handling functions +- */ +- +-#define flush_icache() \ +-({ \ +- unsigned long set; \ +- unsigned long start_set; \ +- unsigned long end_set; \ +- \ +- start_set = 0; \ +- end_set = (unsigned long)LAST_DCACHE_ADDR; \ +- \ +- for (set = start_set; set <= end_set; set += (0x10 - 3)) { \ +- asm volatile("cpushl %%ic,(%0)\n" \ +- "\taddq%.l #1,%0\n" \ +- "\tcpushl %%ic,(%0)\n" \ +- "\taddq%.l #1,%0\n" \ +- "\tcpushl %%ic,(%0)\n" \ +- "\taddq%.l #1,%0\n" \ +- "\tcpushl %%ic,(%0)" : "=a" (set) : "a" (set)); \ +- } \ +-}) +- +-#define flush_dcache() \ +-({ \ +- unsigned long set; \ +- unsigned long start_set; \ +- unsigned long end_set; \ +- \ +- start_set = 0; \ +- end_set = (unsigned long)LAST_DCACHE_ADDR; \ +- \ +- for (set = start_set; set <= end_set; set += (0x10 - 3)) { \ +- asm volatile("cpushl %%dc,(%0)\n" \ +- "\taddq%.l #1,%0\n" \ +- "\tcpushl %%dc,(%0)\n" \ +- "\taddq%.l #1,%0\n" \ +- "\tcpushl %%dc,(%0)\n" \ +- "\taddq%.l #1,%0\n" \ +- "\tcpushl %%dc,(%0)" : "=a" (set) : "a" (set)); \ +- } \ +-}) +- +-#define flush_bcache() \ +-({ \ +- unsigned long set; \ +- unsigned long start_set; \ +- unsigned long end_set; \ +- \ +- start_set = 0; \ +- end_set = (unsigned long)LAST_DCACHE_ADDR; \ +- \ +- for (set = start_set; set <= end_set; set += (0x10 - 3)) { \ +- asm volatile("cpushl %%bc,(%0)\n" \ +- "\taddq%.l #1,%0\n" \ +- "\tcpushl %%bc,(%0)\n" \ +- "\taddq%.l #1,%0\n" \ +- "\tcpushl %%bc,(%0)\n" \ +- "\taddq%.l #1,%0\n" \ +- "\tcpushl %%bc,(%0)" : "=a" (set) : "a" (set)); \ +- } \ +-}) +- +-/* +- * invalidate the cache for the specified memory range. +- * It starts at the physical address specified for +- * the given number of bytes. +- */ +-extern void cache_clear(unsigned long paddr, int len); +-/* +- * push any dirty cache in the specified memory range. +- * It starts at the physical address specified for +- * the given number of bytes. +- */ +-extern void cache_push(unsigned long paddr, int len); +- +-/* +- * push and invalidate pages in the specified user virtual +- * memory range. +- */ +-extern void cache_push_v(unsigned long vaddr, int len); +- +-/* This is needed whenever the virtual mapping of the current +- process changes. */ +- +-/** +- * flush_cache_mm - Flush an mm_struct +- * @mm: mm_struct to flush +- */ +-static inline void flush_cache_mm(struct mm_struct *mm) +-{ +- if (mm == current->mm) +- flush_bcache(); +-} +- +-#define flush_cache_dup_mm(mm) flush_cache_mm(mm) +- +-#define flush_cache_all() flush_bcache() +- +-/** +- * flush_cache_range - Flush a cache range +- * @vma: vma struct +- * @start: Starting address +- * @end: Ending address +- * +- * flush_cache_range must be a macro to avoid a dependency on +- * linux/mm.h which includes this file. +- */ +-static inline void flush_cache_range(struct vm_area_struct *vma, +- unsigned long start, unsigned long end) +-{ +- if (vma->vm_mm == current->mm) +- flush_bcache(); +-// cf_cache_flush_range(start, end); +-} +- +-/** +- * flush_cache_page - Flush a page of the cache +- * @vma: vma struct +- * @vmaddr: +- * @pfn: page numer +- * +- * flush_cache_page must be a macro to avoid a dependency on +- * linux/mm.h which includes this file. +- */ +-static inline void flush_cache_page(struct vm_area_struct *vma, +- unsigned long vmaddr, unsigned long pfn) +-{ +- if (vma->vm_mm == current->mm) +- flush_bcache(); +-// cf_cache_flush_range(vmaddr, vmaddr+PAGE_SIZE); +-} +- +-/* Push the page at kernel virtual address and clear the icache */ +-/* RZ: use cpush %bc instead of cpush %dc, cinv %ic */ +-#define flush_page_to_ram(page) __flush_page_to_ram((void *) page_address(page)) +-extern inline void __flush_page_to_ram(void *address) +-{ +- unsigned long set; +- unsigned long start_set; +- unsigned long end_set; +- unsigned long addr = (unsigned long) address; +- +- addr &= ~(PAGE_SIZE - 1); /* round down to page start address */ +- +- start_set = addr & _ICACHE_SET_MASK; +- end_set = (addr + PAGE_SIZE-1) & _ICACHE_SET_MASK; +- +- if (start_set > end_set) { +- /* from the begining to the lowest address */ +- for (set = 0; set <= end_set; set += (0x10 - 3)) { +- asm volatile("cpushl %%bc,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%bc,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%bc,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%bc,(%0)" : "=a" (set) : "a" (set)); +- } +- /* next loop will finish the cache ie pass the hole */ +- end_set = LAST_ICACHE_ADDR; +- } +- for (set = start_set; set <= end_set; set += (0x10 - 3)) { +- asm volatile("cpushl %%bc,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%bc,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%bc,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%bc,(%0)" : "=a" (set) : "a" (set)); +- } +-} +- +-/* Use __flush_page_to_ram() for flush_dcache_page all values are same - MW */ +-#define flush_dcache_page(page) \ +- __flush_page_to_ram((void *) page_address(page)) +-#define flush_icache_page(vma,pg) \ +- __flush_page_to_ram((void *) page_address(pg)) +-#define flush_icache_user_range(adr,len) do { } while (0) +-/* NL */ +-#define flush_icache_user_page(vma,page,addr,len) do { } while (0) +- +-/* Push n pages at kernel virtual address and clear the icache */ +-/* RZ: use cpush %bc instead of cpush %dc, cinv %ic */ +-extern inline void flush_icache_range (unsigned long address, +- unsigned long endaddr) +-{ +- unsigned long set; +- unsigned long start_set; +- unsigned long end_set; +- +- start_set = address & _ICACHE_SET_MASK; +- end_set = endaddr & _ICACHE_SET_MASK; +- +- if (start_set > end_set) { +- /* from the begining to the lowest address */ +- for (set = 0; set <= end_set; set += (0x10 - 3)) { +- asm volatile("cpushl %%ic,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%ic,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%ic,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%ic,(%0)" : "=a" (set) : "a" (set)); +- } +- /* next loop will finish the cache ie pass the hole */ +- end_set = LAST_ICACHE_ADDR; +- } +- for (set = start_set; set <= end_set; set += (0x10 - 3)) { +- asm volatile("cpushl %%ic,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%ic,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%ic,(%0)\n" +- "\taddq%.l #1,%0\n" +- "\tcpushl %%ic,(%0)" : "=a" (set) : "a" (set)); +- } +-} +- +-static inline void copy_to_user_page(struct vm_area_struct *vma, +- struct page *page, unsigned long vaddr, +- void *dst, void *src, int len) +-{ +- memcpy(dst, src, len); +- flush_icache_user_page(vma, page, vaddr, len); +-} +-static inline void copy_from_user_page(struct vm_area_struct *vma, +- struct page *page, unsigned long vaddr, +- void *dst, void *src, int len) +-{ +- memcpy(dst, src, len); +-} +- +-#define flush_cache_vmap(start, end) flush_cache_all() +-#define flush_cache_vunmap(start, end) flush_cache_all() +-#define flush_dcache_mmap_lock(mapping) do { } while (0) +-#define flush_dcache_mmap_unlock(mapping) do { } while (0) ++#ifdef CONFIG_M5445X ++#include "cf_5445x_cacheflush.h" ++#else ++#include "cf_548x_cacheflush.h" ++#endif + + #endif /* M68K_CF_CACHEFLUSH_H */ diff --git a/target/linux/coldfire/patches/063-m5445x_rambar_config.patch b/target/linux/coldfire/patches/063-m5445x_rambar_config.patch new file mode 100644 index 0000000000..ba4e18e8cc --- /dev/null +++ b/target/linux/coldfire/patches/063-m5445x_rambar_config.patch @@ -0,0 +1,44 @@ +From 6651009d31bfcb8e364e25e944618465f510bd0b Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Tue, 24 Jun 2008 21:23:58 -0600 +Subject: [PATCH] Update SRAM/RAMBAR1 configuration for M5445x. + +LTIBName: m5445x-rambar-config +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + arch/m68k/coldfire/head.S | 5 +++-- + include/asm-m68k/coldfire.h | 9 +++++++-- + 2 files changed, 10 insertions(+), 4 deletions(-) + +--- a/arch/m68k/coldfire/head.S ++++ b/arch/m68k/coldfire/head.S +@@ -285,8 +285,9 @@ ENTRY(__start) + movel %a0,%usp + + #if defined(CONFIG_M5445X) +- movel #(MCF_RAMBAR1 + 0x221), %d0 +- movec %d0, %rambar1 ++/* JKM -- don't enable it currently -- fix */ ++/* movel #(MCF_RAMBAR1 + 0x221), %d0 */ ++/* movec %d0, %rambar1 */ + #elif defined(CONFIG_M547X_8X) + movel #MCF_MBAR, %d0 + movec %d0, %mbar +--- a/include/asm-m68k/coldfire.h ++++ b/include/asm-m68k/coldfire.h +@@ -3,8 +3,13 @@ + + #if defined(CONFIG_M5445X) + #define MCF_MBAR 0x0 +-#define MCF_RAMBAR1 0x80000000 +-#define MCF_SRAM 0x80000000 ++/* ++ * Even though RAMBAR1 should be in the 0x8xxxxxxx range there ++ * is a problem that needs to be resolved. Currently head.S ++ * disables SRAM/RAMBAR1. ++ */ ++#define MCF_RAMBAR1 0x40000000 ++#define MCF_SRAM 0x40000000 + #elif defined(CONFIG_M547X_8X) + #define MCF_MBAR 0xF0000000 + #define MCF_MMUBAR 0xF1000000 diff --git a/target/linux/coldfire/patches/064-mcfv4e_update_cmdlines.patch b/target/linux/coldfire/patches/064-mcfv4e_update_cmdlines.patch new file mode 100644 index 0000000000..0b382d285c --- /dev/null +++ b/target/linux/coldfire/patches/064-mcfv4e_update_cmdlines.patch @@ -0,0 +1,30 @@ +From 7b2dd837d32050d88eadfb0c71c381f7478f55b3 Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Tue, 24 Jun 2008 22:09:34 -0600 +Subject: [PATCH] Update default command lines. + +LTIBName: mcfv4e-update-cmdlines +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + arch/m68k/coldfire/config.c | 8 +++++--- + 1 files changed, 5 insertions(+), 3 deletions(-) + +--- a/arch/m68k/coldfire/config.c ++++ b/arch/m68k/coldfire/config.c +@@ -132,11 +132,13 @@ int __init uboot_commandline(char *boota + /* + * This routine does things not done in the bootloader. + */ +-#if defined(CONFIG_M5445X) +-#define FOO_DEFAULT_COMMAND_LINE "root=/dev/mtdblock1 rw rootfstype=jffs2 ip=none mtdparts=physmap-flash.0:5M(kernel)ro,-(jffs2)" ++#if defined(CONFIG_M54451) + #define DEFAULT_COMMAND_LINE "debug root=/dev/nfs rw nfsroot=172.27.155.1:/tftpboot/redstripe/rootfs/ ip=172.27.155.51:172.27.155.1" ++#elif defined(CONFIG_M54455) ++#define MTD_DEFAULT_COMMAND_LINE "root=/dev/mtdblock1 rw rootfstype=jffs2 ip=none mtdparts=physmap-flash.0:5M(kernel)ro,-(jffs2)" ++#define DEFAULT_COMMAND_LINE "debug root=/dev/nfs rw nfsroot=172.27.155.1:/tftpboot/redstripe/rootfs/ ip=172.27.155.55:172.27.155.1" + #elif defined(CONFIG_M547X_8X) +-#define DEFAULT_COMMAND_LINE "debug root=/dev/nfs rw nfsroot=172.27.155.1:/tftpboot/rigo/rootfs/ ip=172.27.155.85:172.27.155.1" ++#define DEFAULT_COMMAND_LINE "debug root=/dev/nfs rw nfsroot=172.27.155.1:/tftpboot/rigo/rootfs/ ip=172.27.155.75:172.27.155.1" + #endif + asmlinkage void __init cf_early_init(void) + { diff --git a/target/linux/coldfire/patches/065-mcfv4e_bss_clear_move.patch b/target/linux/coldfire/patches/065-mcfv4e_bss_clear_move.patch new file mode 100644 index 0000000000..84a26a3e21 --- /dev/null +++ b/target/linux/coldfire/patches/065-mcfv4e_bss_clear_move.patch @@ -0,0 +1,46 @@ +From 87ea76988875856dc1c3657b27ac792d2f0311e9 Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Tue, 24 Jun 2008 22:12:17 -0600 +Subject: [PATCH] Move BSS initialization after mmu setup. + +LTIBName: mcfv4e-bss-clear-move +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + arch/m68k/coldfire/head.S | 19 +++++++++---------- + 1 files changed, 9 insertions(+), 10 deletions(-) + +--- a/arch/m68k/coldfire/head.S ++++ b/arch/m68k/coldfire/head.S +@@ -326,16 +326,6 @@ ENTRY(__start) + movec %d0, %acr3 + nop + +-#ifdef CONFIG_COLDFIRE +-/* zero bss */ +- lea _sbss,%a0 +- lea _ebss,%a1 +- clrl %d0 +-_loop_bss: +- movel %d0,(%a0)+ +- cmpl %a0,%a1 +- bne _loop_bss +-#endif + /* If you change the memory size to another value make a matching + change in paging_init(cf-mmu.c) to zones_size[]. */ + +@@ -564,6 +554,15 @@ ENTRY(__running_high) + addl #PAGE_OFFSET,%a1 + movel %a1,%a0@ + ++/* zero bss */ ++ lea _sbss,%a0 ++ lea _ebss,%a1 ++ clrl %d0 ++_loop_bss: ++ movel %d0,(%a0)+ ++ cmpl %a0,%a1 ++ bne _loop_bss ++ + /* Unmap unity mappings */ + #if CONFIG_SDRAM_BASE != PAGE_OFFSET + #if defined(CONFIG_M5445X) diff --git a/target/linux/coldfire/patches/066-mcfv4e_endmem_fix.patch b/target/linux/coldfire/patches/066-mcfv4e_endmem_fix.patch new file mode 100644 index 0000000000..e334f42ea4 --- /dev/null +++ b/target/linux/coldfire/patches/066-mcfv4e_endmem_fix.patch @@ -0,0 +1,22 @@ +From 601145f682eab66abca5d154a8a9fdf275acd8ba Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Tue, 24 Jun 2008 22:20:31 -0600 +Subject: [PATCH] Fix off by 1 error with endmem. + +LTIBName: mcfv4e-endmem-fix +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + arch/m68k/coldfire/config.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +--- a/arch/m68k/coldfire/config.c ++++ b/arch/m68k/coldfire/config.c +@@ -449,7 +449,7 @@ void __init config_coldfire(void) + /* mach_hwclk = coldfire_hwclk; to be done */ + mach_get_model = coldfire_get_model; + +- coldfire_bootmem_alloc(startmem, endmem); ++ coldfire_bootmem_alloc(startmem, endmem-1); + + /* + * initrd setup diff --git a/target/linux/coldfire/patches/067-mcfv4e_acr_cleanup.patch b/target/linux/coldfire/patches/067-mcfv4e_acr_cleanup.patch new file mode 100644 index 0000000000..3a0736c8af --- /dev/null +++ b/target/linux/coldfire/patches/067-mcfv4e_acr_cleanup.patch @@ -0,0 +1,112 @@ +From ddc092180bd24b34afdd6fd7cd48b77b55a5bd5e Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Tue, 24 Jun 2008 23:21:07 -0600 +Subject: [PATCH] Cleanup ACR mappings and document. + +LTIBName: mcfv4e-acr-cleanup +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + arch/m68k/coldfire/head.S | 81 +++++++++++++++++++++++++------------------- + 1 files changed, 46 insertions(+), 35 deletions(-) + +--- a/arch/m68k/coldfire/head.S ++++ b/arch/m68k/coldfire/head.S +@@ -53,52 +53,63 @@ + #define __FINIT .previous + #endif + +-/* JKM -- REVISE DOCS FOR M547x_8x and PHYS MAPPING */ ++#if CONFIG_SDRAM_BASE != PAGE_OFFSET + /* +- * Setup ACR mappings to provide the following memory map: +- * Data +- * 0xA0000000 -> 0xAFFFFFFF [0] NO CACHE / PRECISE / SUPER ONLY +- * 0xF0000000 -> 0xFFFFFFFF [1] NO CACHE / PRECISE / SUPER ONLY +- * Code +- * None currently (mapped via TLBs) ++ * Kernel mapped to virtual ram address. ++ * ++ * M5445x: ++ * Data[0]: 0xF0000000 -> 0xFFFFFFFF System regs ++ * Data[1]: 0xA0000000 -> 0xAFFFFFFF PCI ++ * Code[0]: Not Mapped ++ * Code[1]: Not Mapped ++ * ++ * M547x/M548x ++ * Data[0]: 0xF0000000 -> 0xFFFFFFFF System regs ++ * Data[1]: Not Mapped ++ * Code[0]: Not Mapped ++ * Code[1]: Not Mapped + */ +- +-#if CONFIG_SDRAM_BASE != PAGE_OFFSET + #if defined(CONFIG_M5445X) +-#if 0 +-#define ACR0_DEFAULT #0xA00FA048 /* ACR0 default value */ +-#endif +-#define ACR0_DEFAULT #0x400FA028 /* ACR0 default value */ +-#define ACR1_DEFAULT #0xF00FA040 /* ACR1 default value */ +-#if 0 +-#define ACR2_DEFAULT #0x00000000 /* ACR2 default value */ +-#endif +-#define ACR2_DEFAULT #0x400FA028 /* ACR2 default value */ +-#define ACR3_DEFAULT #0x00000000 /* ACR3 default value */ +-/* ACR mapping for FPGA (maps 0) */ +-#define ACR0_FPGA #0x000FA048 /* ACR0 enable FPGA */ ++#define ACR0_DEFAULT #0xF00FA048 /* System regs */ ++#define ACR1_DEFAULT #0xA00FA048 /* PCI */ ++#define ACR2_DEFAULT #0x00000000 /* Not Mapped */ ++#define ACR3_DEFAULT #0x00000000 /* Not Mapped */ + #elif defined(CONFIG_M547X_8X) +-#define ACR0_DEFAULT #0xE000C040 /* ACR0 default value */ +-#define ACR1_DEFAULT #0x00000000 /* ACR1 default value */ +-#define ACR2_DEFAULT #0x00000000 /* ACR2 default value */ +-#define ACR3_DEFAULT #0x00000000 /* ACR3 default value */ ++#define ACR0_DEFAULT #0xF00FA048 /* System Regs */ ++#define ACR1_DEFAULT #0x00000000 /* Not Mapped */ ++#define ACR2_DEFAULT #0x00000000 /* Not Mapped */ ++#define ACR3_DEFAULT #0x00000000 /* Not Mapped */ + #endif + +-#else ++#else /* CONFIG_SDRAM_BASE = PAGE_OFFSET */ ++/* ++ * Kernel mapped to physical ram address. ++ * ++ * M5445x: ++ * Data[0]: 0xF0000000 -> 0xFFFFFFFF System regs ++ * Data[1]: 0x40000000 -> 0x4FFFFFFF SDRAM - uncached ++ * Code[0]: Not Mapped ++ * Code[1]: 0x40000000 -> 0x4FFFFFFF SDRAM - cached ++ * ++ * M547x/M548x ++ * Data[0]: 0xF0000000 -> 0xFFFFFFFF System regs ++ * Data[1]: 0x00000000 -> 0x0FFFFFFF SDRAM - uncached ++ * Code[0]: Not Mapped ++ * Code[1]: 0x00000000 -> 0x0FFFFFFF SDRAM - cached ++ */ + #if defined(CONFIG_M5445X) +-#define ACR0_DEFAULT #0xF00FC040 /* ACR0 default value */ +-#define ACR1_DEFAULT #0x400FA008 /* ACR1 default value */ +-#define ACR2_DEFAULT #0x00000000 /* ACR2 default value */ +-#define ACR3_DEFAULT #0x400FA008 /* ACR3 default value */ ++#define ACR0_DEFAULT #0xF00FA048 /* System Regs */ ++#define ACR1_DEFAULT #0x400FA048 /* SDRAM uncached */ ++#define ACR2_DEFAULT #0x00000000 /* Not mapped */ ++#define ACR3_DEFAULT #0x400FA008 /* SDRAM cached */ + #elif defined(CONFIG_M547X_8X) +-#define ACR0_DEFAULT #0xF00FC040 /* ACR0 default value */ +-#define ACR1_DEFAULT #0x000FA008 /* ACR1 default value */ +-#define ACR2_DEFAULT #0x00000000 /* ACR2 default value */ +-#define ACR3_DEFAULT #0x000FA008 /* ACR3 default value */ ++#define ACR0_DEFAULT #0xF00FA048 /* System Regs */ ++#define ACR1_DEFAULT #0x000FA048 /* SDRAM uncached */ ++#define ACR2_DEFAULT #0x00000000 /* Not mapped */ ++#define ACR3_DEFAULT #0x000FA008 /* SDRAM cached */ + #endif + #endif + +- + /* Several macros to make the writing of subroutines easier: + * - func_start marks the beginning of the routine which setups the frame + * register and saves the registers, it also defines another macro diff --git a/target/linux/coldfire/patches/068-m547x_8x_NOR_FLASH_baseaddr.patch b/target/linux/coldfire/patches/068-m547x_8x_NOR_FLASH_baseaddr.patch new file mode 100644 index 0000000000..a2891de83b --- /dev/null +++ b/target/linux/coldfire/patches/068-m547x_8x_NOR_FLASH_baseaddr.patch @@ -0,0 +1,21 @@ +From 423d67db899b8f2e20b09fac7da1f7eaaa4523cb Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Tue, 24 Jun 2008 23:24:30 -0600 +Subject: [PATCH] Add the M547x/M548x NOR_FLASH base address. + +LTIBName: m547x-8x-NOR-FLASH-baseaddr +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + arch/m68k/Kconfig | 1 + + 1 files changed, 1 insertions(+), 0 deletions(-) + +--- a/arch/m68k/Kconfig ++++ b/arch/m68k/Kconfig +@@ -459,6 +459,7 @@ config NOR_FLASH_BASE + depends on COLDFIRE + default 0x00000000 if M54451EVB + default 0x00000000 if M54455EVB ++ default 0xE0000000 if M547X_8X + + config M68KFPU_EMU + bool "Math emulation support (EXPERIMENTAL)" diff --git a/target/linux/coldfire/patches/069-m5445x_fecint_nest_1.patch b/target/linux/coldfire/patches/069-m5445x_fecint_nest_1.patch new file mode 100644 index 0000000000..a3f14eb2f0 --- /dev/null +++ b/target/linux/coldfire/patches/069-m5445x_fecint_nest_1.patch @@ -0,0 +1,32 @@ +From 8809b176ecde425d13cab8920a66fbfd6fb4c3b7 Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Tue, 24 Jun 2008 23:26:54 -0600 +Subject: [PATCH] Make sure interrupt handler calls aren't nested. + +LTIBName: m5445x-fecint-nest +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + drivers/net/fec.c | 5 ++++- + 1 files changed, 4 insertions(+), 1 deletions(-) + +--- a/drivers/net/fec.c ++++ b/drivers/net/fec.c +@@ -23,6 +23,9 @@ + * + * Bug fixes and cleanup by Philippe De Muyter (phdm@macqel.be) + * Copyright (c) 2004-2006 Macq Electronique SA. ++ * ++ * Coldfire bug fixes and cleanup by Kurt Mahan (kmahan@freescale.com) ++ * Copyright 2007-2008 Freescale Semiconductor, Inc. All Rights Reserved. + */ + + #include <linux/module.h> +@@ -1865,7 +1868,7 @@ static void __inline__ fec_request_intrs + + /* Setup interrupt handlers. */ + for (idp = id; idp->name; idp++) { +- if (request_irq(b+idp->irq, fec_enet_interrupt, 0, ++ if (request_irq(b+idp->irq, fec_enet_interrupt, IRQF_DISABLED, + idp->name, dev) != 0) + printk(KERN_ERR "FEC: Could not alloc %s IRQ(%d)!\n", + idp->name, b+idp->irq); diff --git a/target/linux/coldfire/patches/070-m5445x_rambar_init_1.patch b/target/linux/coldfire/patches/070-m5445x_rambar_init_1.patch new file mode 100644 index 0000000000..e07eba3ed0 --- /dev/null +++ b/target/linux/coldfire/patches/070-m5445x_rambar_init_1.patch @@ -0,0 +1,25 @@ +From 1667ce157c8cc2ffc13f1e31c64982d0af95d5a5 Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Wed, 25 Jun 2008 01:34:30 -0600 +Subject: [PATCH] Disable RAMBAR1 on initialization. + +LTIBName: m5445x-rambar-init +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + arch/m68k/coldfire/head.S | 5 ++--- + 1 files changed, 2 insertions(+), 3 deletions(-) + +--- a/arch/m68k/coldfire/head.S ++++ b/arch/m68k/coldfire/head.S +@@ -296,9 +296,8 @@ ENTRY(__start) + movel %a0,%usp + + #if defined(CONFIG_M5445X) +-/* JKM -- don't enable it currently -- fix */ +-/* movel #(MCF_RAMBAR1 + 0x221), %d0 */ +-/* movec %d0, %rambar1 */ ++ movel #0x80000000, %d0 ++ movec %d0, %rambar1 + #elif defined(CONFIG_M547X_8X) + movel #MCF_MBAR, %d0 + movec %d0, %mbar diff --git a/target/linux/coldfire/patches/071-m5445x_i2c.patch b/target/linux/coldfire/patches/071-m5445x_i2c.patch new file mode 100644 index 0000000000..ecda4d6c70 --- /dev/null +++ b/target/linux/coldfire/patches/071-m5445x_i2c.patch @@ -0,0 +1,699 @@ +From e1618e943f60a4f8f778c4f7c389e2fa13eb0a83 Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Thu, 26 Jun 2008 16:29:56 -0600 +Subject: [PATCH] Add I2C support for the M5445x platforms. + +LTIBName: m5445x-i2c +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + drivers/i2c/busses/Kconfig | 10 + + drivers/i2c/busses/Makefile | 1 + + drivers/i2c/busses/i2c-mcf.c | 573 ++++++++++++++++++++++++++++++++++++++++++ + drivers/i2c/busses/i2c-mcf.h | 75 ++++++ + 4 files changed, 659 insertions(+), 0 deletions(-) + create mode 100644 drivers/i2c/busses/i2c-mcf.c + create mode 100644 drivers/i2c/busses/i2c-mcf.h + +--- a/drivers/i2c/busses/Kconfig ++++ b/drivers/i2c/busses/Kconfig +@@ -302,6 +302,16 @@ config I2C_POWERMAC + This support is also available as a module. If so, the module + will be called i2c-powermac. + ++config I2C_MCF ++ tristate "MCF ColdFire" ++ depends on I2C && EXPERIMENTAL ++ help ++ If you say yes to this option, support will be included for the ++ I2C on most ColdFire CPUs ++ ++ This driver can also be built as a module. If so, the module ++ will be called i2c-mcf. ++ + config I2C_MPC + tristate "MPC107/824x/85xx/52xx/86xx" + depends on PPC32 +--- a/drivers/i2c/busses/Makefile ++++ b/drivers/i2c/busses/Makefile +@@ -53,6 +53,7 @@ obj-$(CONFIG_I2C_VOODOO3) += i2c-voodoo3 + obj-$(CONFIG_SCx200_ACB) += scx200_acb.o + obj-$(CONFIG_SCx200_I2C) += scx200_i2c.o + obj-$(CONFIG_I2C_MCF548x) += i2c-mcf548x.o ++obj-$(CONFIG_I2C_MCF) += i2c-mcf.o + + ifeq ($(CONFIG_I2C_DEBUG_BUS),y) + EXTRA_CFLAGS += -DDEBUG +--- /dev/null ++++ b/drivers/i2c/busses/i2c-mcf.c +@@ -0,0 +1,573 @@ ++/* ++ i2c-mcf.c - Part of lm_sensors, Linux kernel modules for hardware monitoring ++ ++ Copyright (c) 2005, Derek CL Cheung <derek.cheung@sympatico.ca> ++ <http://www3.sympatico.ca/derek.cheung> ++ ++ Copyright (c) 2006-2007, emlix ++ Sebastian Hess <sh@emlix.com> ++ ++ Copyright (c) 2006-2007 Freescale Semiconductor, Inc ++ Yaroslav Vinogradov <yaroslav.vinogradov@freescale.com> ++ Matt Waddel <Matt.Waddel@freescale.com> ++ ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 2 of the License, or ++ (at your option) any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program; if not, write to the Free Software ++ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ ++ Changes: ++ v0.1 26 March 2005 ++ Initial Release - developed on uClinux with 2.6.9 kernel ++ ++ v0.2 29 May 2006 ++ Modified to be more generic and added support for ++ i2c_master_xfer ++ ++ This I2C adaptor supports the ColdFire CPU I2C module. Since most Coldfire ++ CPUs' I2C module use the same register set (e.g., MCF5249), the code is very ++ portable and re-usable to other Coldfire CPUs. ++ ++ The transmission frequency is set at about 100KHz for the CPU board with ++ 8MHz crystal. If the CPU board uses different system clock frequency, you ++ should change the following line: ++ static int __init i2c_coldfire_init(void) ++ { ++ ......... ++ // Set transmission frequency 0x15 = ~100kHz ++ *MCF_I2C_I2FDR = 0x15; ++ ........ ++ } ++ ++ Remember to perform a dummy read to set the ColdFire CPU's I2C module for ++ read before reading the actual byte from a device ++ ++ The I2C_SM_BUS_BLOCK_DATA function are not yet ready but most lm_senors ++ do not care ++*/ ++ ++#include <linux/init.h> ++#include <linux/module.h> ++#include <linux/kernel.h> ++#include <linux/errno.h> ++#include <linux/i2c.h> ++#include <linux/delay.h> ++#include <linux/string.h> ++#include <asm/coldfire.h> ++#include <asm/mcfsim.h> ++#include <asm/types.h> ++#include <linux/platform_device.h> ++#include "i2c-mcf.h" ++ ++ ++static struct i2c_algorithm coldfire_algorithm = { ++ /*.name = "ColdFire I2C algorithm", ++ .id = I2C_ALGO_SMBUS,*/ ++ .smbus_xfer = coldfire_i2c_access, ++ .master_xfer = coldfire_i2c_master, ++ .functionality = coldfire_func, ++}; ++ ++ ++static struct i2c_adapter coldfire_adapter = { ++ .owner = THIS_MODULE, ++ .class = I2C_CLASS_HWMON, ++ .algo = &coldfire_algorithm, ++ .name = "ColdFire I2C adapter", ++}; ++ ++ ++__u16 lastaddr; ++__u16 lastop; ++ ++static inline int coldfire_do_first_start(__u16 addr,__u16 flags) ++{ ++ int err; ++ /* ++ * Generate a stop and put the I2C module into slave mode ++ */ ++ *MCF_I2C_I2CR &= ~MCF_I2C_I2CR_MSTA; ++ ++ /* ++ * Generate a new Start signal ++ */ ++ err = coldfire_i2c_start(flags & I2C_M_RD ? I2C_SMBUS_READ : I2C_SMBUS_WRITE, ++ addr, FIRST_START); ++ if(err) return err; ++ ++ lastaddr = addr; ++ lastop = flags & I2C_M_RD; /* Ensure everything for new start */ ++ return 0; ++} ++ ++ ++/* ++ * read one byte data from the I2C bus ++ */ ++static int coldfire_read_data(u8 * const rxData, const enum I2C_ACK_TYPE ackType) { ++ ++ int timeout; ++ ++ *MCF_I2C_I2CR &= ~MCF_I2C_I2CR_MTX; /* master receive mode*/ ++ ++ if (ackType == NACK) ++ *MCF_I2C_I2CR |= MCF_I2C_I2CR_TXAK; /* generate NA */ ++ else ++ *MCF_I2C_I2CR &= ~MCF_I2C_I2CR_TXAK; /* generate ACK */ ++ ++ ++ /* read data from the I2C bus */ ++ *rxData = *MCF_I2C_I2DR; ++ ++ /* printk(">>> %s I2DR data is %.2x \n", __FUNCTION__, *rxData); */ ++ ++ /* wait for data transfer to complete */ ++ timeout = 500; ++ while (timeout-- && !(*MCF_I2C_I2SR & MCF_I2C_I2SR_IIF)) ++ udelay(1); ++ if (timeout <= 0) ++ printk("%s - I2C IIF never set. Timeout is %d \n", __FUNCTION__, ++ timeout); ++ ++ ++ /* reset the interrupt bit */ ++ *MCF_I2C_I2SR &= ~MCF_I2C_I2SR_IIF; ++ ++ if (timeout <= 0 ) ++ return -1; ++ else ++ return 0; ++ ++}; ++ ++ ++/* ++ * write one byte data onto the I2C bus ++ */ ++static int coldfire_write_data(const u8 txData) { ++ ++ int timeout; ++ ++ timeout = 500; ++ ++ *MCF_I2C_I2CR |= MCF_I2C_I2CR_MTX; /* I2C module into TX mode */ ++ *MCF_I2C_I2DR = txData; /* send the data */ ++ ++ /* wait for data transfer to complete */ ++ /* rely on the interrupt handling bit */ ++ timeout = 500; ++ while (timeout-- && !(*MCF_I2C_I2SR & MCF_I2C_I2SR_IIF)) ++ udelay(1); ++ if (timeout <=0) ++ printk("%s - I2C IIF never set. Timeout is %d \n", __FUNCTION__, ++ timeout); ++ ++ ++ /* reset the interrupt bit */ ++ *MCF_I2C_I2SR &= ~MCF_I2C_I2SR_IIF; ++ ++ if (timeout <= 0 ) ++ return -1; ++ else ++ return 0; ++ ++}; ++ ++ ++ ++ ++/* ++ * Generate I2C start or repeat start signal ++ * Combine the 7 bit target_address and the R/W bit and put it onto the I2C bus ++ */ ++static int coldfire_i2c_start(const char read_write, const u16 target_address, const enum I2C_START_TYPE start_type) { ++ ++ int timeout; ++ ++ /* printk(">>> %s START TYPE %s \n", __FUNCTION__, ++ start_type == FIRST_START ? "FIRST_START":"REPEAT_START");*/ ++ ++ *MCF_I2C_I2CR |= MCF_I2C_I2CR_IEN; ++ ++ if (start_type == FIRST_START) { ++ /* Make sure the I2C bus is idle */ ++ timeout = 500; /* 500us timeout */ ++ while (timeout-- && (*MCF_I2C_I2SR & MCF_I2C_I2SR_IBB)) ++ udelay(1); ++ if (timeout <= 0) { ++ printk("%s - I2C bus always busy in the past 500us timeout is %d \n", __FUNCTION__, timeout); ++ goto check_rc; ++ } ++ /* generate a START and put the I2C module into MASTER TX mode*/ ++ *MCF_I2C_I2CR |= (MCF_I2C_I2CR_MSTA | MCF_I2C_I2CR_MTX); ++ ++ /* wait for bus busy to be set */ ++ timeout = 500; ++ while (timeout-- && !(*MCF_I2C_I2SR & MCF_I2C_I2SR_IBB)) ++ udelay(1); ++ if (timeout <= 0) { ++ printk("%s - I2C bus is never busy after START. Timeout is %d \n", __FUNCTION__, timeout); ++ goto check_rc; ++ } ++ ++ } else { ++ /* this is repeat START */ ++ udelay(500); /* need some delay before repeat start */ ++ *MCF_I2C_I2CR |= (MCF_I2C_I2CR_MSTA | MCF_I2C_I2CR_RSTA); ++ } ++ ++ ++ /* combine the R/W bit and the 7 bit target address and put it onto ++ the I2C bus */ ++ *MCF_I2C_I2DR = ((target_address & 0x7F) << 1) | (read_write == I2C_SMBUS_WRITE ? 0x00 : 0x01); ++ ++ /* wait for bus transfer to complete */ ++ /* when one byte transfer is completed, IIF set at the faling edge of ++ the 9th clock */ ++ timeout = 500; ++ while (timeout-- && !(*MCF_I2C_I2SR & MCF_I2C_I2SR_IIF)) ++ udelay(1); ++ if (timeout <= 0) ++ printk("%s - I2C IIF never set. Timeout is %d \n", __FUNCTION__, timeout); ++ ++ ++check_rc: ++ /* reset the interrupt bit */ ++ *MCF_I2C_I2SR &= ~MCF_I2C_I2SR_IIF; ++ ++ if (timeout <= 0) ++ return -1; ++ else ++ return 0; ++}; ++ ++ ++/* ++ * 5282 SMBUS supporting functions ++ */ ++ ++static s32 coldfire_i2c_access(struct i2c_adapter *adap, u16 addr, ++ unsigned short flags, char read_write, ++ u8 command, int size, union i2c_smbus_data *data) ++{ ++ int rc = 0; ++ u8 rxData, tempRxData[2]; ++ ++ switch (size) { ++ case I2C_SMBUS_QUICK: ++ rc = coldfire_i2c_start(read_write, addr, FIRST_START); /* generate START */ ++ break; ++ case I2C_SMBUS_BYTE: ++ rc = coldfire_i2c_start(read_write, addr, FIRST_START); ++ *MCF_I2C_I2CR |= MCF_I2C_I2CR_TXAK; /*generate NA */ ++ if (read_write == I2C_SMBUS_WRITE) ++ rc += coldfire_write_data(command); ++ else { ++ coldfire_read_data(&rxData, NACK);/*dummy read*/ ++ rc += coldfire_read_data(&rxData, NACK); ++ data->byte = rxData; ++ } ++ *MCF_I2C_I2CR &= ~MCF_I2C_I2CR_TXAK; /* reset ACK bit */ ++ break; ++ case I2C_SMBUS_BYTE_DATA: ++ rc = coldfire_i2c_start(I2C_SMBUS_WRITE, addr, FIRST_START); ++ rc += coldfire_write_data(command); ++ if (read_write == I2C_SMBUS_WRITE) ++ rc += coldfire_write_data(data->byte); ++ else { ++ /* This is SMBus READ Byte Data Request. ++ Perform REPEAT START */ ++ rc += coldfire_i2c_start(I2C_SMBUS_READ, addr, ++ REPEAT_START); ++ coldfire_read_data(&rxData, ACK);/* dummy read*/ ++ /* Disable Acknowledge, generate STOP after ++ next byte transfer */ ++ rc += coldfire_read_data(&rxData, NACK); ++ data->byte = rxData; ++ } ++ *MCF_I2C_I2CR &= ~MCF_I2C_I2CR_TXAK;/* reset to normal ACk */ ++ break; ++ case I2C_SMBUS_PROC_CALL: ++ case I2C_SMBUS_WORD_DATA: ++ dev_info(&adap->dev, "size = I2C_SMBUS_WORD_DATA \n"); ++ rc = coldfire_i2c_start(I2C_SMBUS_WRITE, addr, ++ FIRST_START); ++ rc += coldfire_write_data(command); ++ if (read_write == I2C_SMBUS_WRITE) { ++ rc += coldfire_write_data(data->word & 0x00FF); ++ rc += coldfire_write_data((data->word & 0x00FF) >> 8); ++ } else { ++ /* This is SMBUS READ WORD request. ++ Peform REPEAT START */ ++ rc += coldfire_i2c_start(I2C_SMBUS_READ, addr, ++ REPEAT_START); ++ coldfire_read_data(&rxData, ACK);/* dummy read*/ ++ /* Disable Acknowledge, generate STOP after ++ next byte transfer */ ++ /* read the MS byte from the device */ ++ rc += coldfire_read_data(&rxData, NACK); ++ tempRxData[1] = rxData; ++ /* read the LS byte from the device */ ++ rc += coldfire_read_data(&rxData, NACK); ++ tempRxData[0] = rxData; ++ /* the host driver expect little endian ++ convention. Swap the byte */ ++ data->word = (tempRxData[0] << 8)|tempRxData[1]; ++ } ++ *MCF_I2C_I2CR &= ~MCF_I2C_I2CR_TXAK; ++ break; ++ case I2C_SMBUS_BLOCK_DATA: ++ /* Not done yet */ ++ break; ++ default: ++ printk("Unsupported I2C size \n"); ++ rc = -1; ++ break; ++ }; ++ ++ /* Generate a STOP and put I2C module into slave mode */ ++ *MCF_I2C_I2CR &= ~MCF_I2C_I2CR_MSTA; ++ ++ /* restore interrupt */ ++ *MCF_I2C_I2CR |= MCF_I2C_I2CR_IIEN; ++ ++ if (rc < 0) ++ return -1; ++ else ++ return 0; ++}; ++ ++ ++/* ++ * List the SMBUS functions supported by this I2C adaptor ++ * Also tell the I2C Subsystem that we are able of master_xfer() ++ */ ++static u32 coldfire_func(struct i2c_adapter *adapter) ++{ ++ return(I2C_FUNC_SMBUS_QUICK | ++ I2C_FUNC_SMBUS_BYTE | ++ I2C_FUNC_SMBUS_PROC_CALL | ++ I2C_FUNC_SMBUS_BYTE_DATA | ++ I2C_FUNC_SMBUS_WORD_DATA | ++ I2C_FUNC_I2C | ++ I2C_FUNC_SMBUS_BLOCK_DATA); ++}; ++ ++static int coldfire_i2c_master(struct i2c_adapter *adap,struct i2c_msg *msgs, ++ int num) ++{ ++ u8 dummyRead; ++ struct i2c_msg *p; ++ int i, err = 0; ++ int ic=0; ++ ++ lastaddr = 0; ++ lastop = 8; ++ ++ /* disable the IRQ, we are doing polling */ ++ *MCF_I2C_I2CR &= ~MCF_I2C_I2CR_IIEN; ++ ++ dev_dbg(&adap->dev,"Num of actions: %d\n", num); ++ ++ for (i = 0; !err && i < num; i++) { ++ p = &msgs[i]; ++ ++ ++ if (!p->len) ++ { ++ dev_dbg(&adap->dev,"p->len == 0!\n"); ++ continue; ++ } ++ /* ++ * Generate a new Start, if the target address differs from ++ * the last target, generate a stop in this case first ++ */ ++ if(p->addr != lastaddr) ++ { ++ err = coldfire_do_first_start(p->addr,p->flags); ++ if(err) ++ { ++ dev_dbg(&adap->dev,"First Init failed!\n"); ++ break; ++ } ++ } ++ ++ else if((p->flags & I2C_M_RD) != lastop) ++ { ++ /* ++ * If the Operational Mode changed, we need to do this ++ * here ... ++ */ ++ dev_dbg(&adap->dev,"%s(): Direction changed, was: %d; is now: %d\n", __FUNCTION__, lastop, p->flags & I2C_M_RD); ++ ++ /* Last op was an read, now it's write: complete stop ++ and reinit */ ++ if (lastop & I2C_M_RD) ++ { ++ dev_dbg(&adap->dev,"%s(): The device is in read state, we must reset!\n", __FUNCTION__); ++ if((err = coldfire_do_first_start(p->addr,p->flags))) ++ break; ++ } ++ else ++ { ++ dev_dbg(&adap->dev,"%s(): We switchted to read mode\n",__FUNCTION__); ++ if((err = coldfire_i2c_start((p->flags & I2C_M_RD) ? I2C_SMBUS_READ : I2C_SMBUS_WRITE, ++ p->addr, REPEAT_START))) ++ break; ++ } ++ ++ lastop = p->flags & I2C_M_RD; /* Save the last op */ ++ } ++ ++ if (p->flags & I2C_M_RD) ++ { ++ /* ++ * When ever we get here, a new session was activated, ++ * so read a dummy byte ++ */ ++ coldfire_read_data(&dummyRead, ACK); ++ /* ++ * read p->len -1 bytes with ACK to the slave, ++ * read the last byte without the ACK, to inform him ++ * about the stop afterwards ++ */ ++ ic = 0; ++ while(!err && (ic < p->len-1 )) ++ { ++ err = coldfire_read_data(p->buf+ic, ACK ); ++ ic++; ++ } ++ if(!err) ++ err = coldfire_read_data(p->buf+ic, NACK); ++ dev_dbg(&coldfire_adapter.dev,"read: %2x\n",p->buf[ic]); ++ } ++ else ++ { ++ if(p->len == 2) ++ dev_dbg(&coldfire_adapter.dev,"writing: 0x %2x %2x\n", p->buf[0], p->buf[1]); ++ ++ /* ++ * Write data to the slave ++ */ ++ for(ic=0; !err && ic < p->len; ic++) ++ { ++ err = coldfire_write_data(p->buf[ic]); ++ if(err) ++ { ++ dev_dbg(&coldfire_adapter.dev, "Failed to write data\n"); ++ } ++ } ++ } ++ } ++ ++ /* ++ * Put the device into slave mode to enable the STOP Generation ++ * (the RTC needs this) ++ */ ++ *MCF_I2C_I2CR &= ~MCF_I2C_I2CR_MSTA; ++ ++ *MCF_I2C_I2CR &= ~MCF_I2C_I2CR_TXAK; /* reset the ACK bit */ ++ ++ /* restore interrupt */ ++ *MCF_I2C_I2CR |= MCF_I2C_I2CR_IIEN; ++ ++ /* Return the number of messages processed, or the error code. */ ++ if (err == 0) ++ err = num; ++ return err; ++} ++ ++ ++/* ++ * Initalize the 5282 I2C module ++ * Disable the 5282 I2C interrupt capability. Just use callback ++ */ ++ ++static int __init i2c_coldfire_init(void) ++{ ++ int retval; ++ u8 dummyRead; ++ ++#if defined(CONFIG_M532x) || defined(CONFIG_M5445X) ++ /* ++ * Initialize the GPIOs for I2C ++ */ ++ MCF_GPIO_PAR_FECI2C |= (0 ++ | MCF_GPIO_PAR_FECI2C_PAR_SDA(3) ++ | MCF_GPIO_PAR_FECI2C_PAR_SCL(3)); ++#elif defined(CONFIG_M5253) ++ { ++ volatile u32 *reg; ++ /* GPIO Bit 41 = SCL0, Bit 42 = SDA0 */ ++ reg = (volatile u32 *)(MCF_MBAR2 + MCFSIM2_GPIO1FUNC); ++ *reg &= 0xFFFFF9FF; ++ } ++#else ++ /* Initialize PASP0 and PASP1 to I2C functions, 5282 user guide 26-19 */ ++ /* Port AS Pin Assignment Register (PASPAR) */ ++ /* PASPA1 = 11 = AS1 pin is I2C SDA */ ++ /* PASPA0 = 11 = AS0 pin is I2C SCL */ ++ *MCF_GPIO_PASPAR |= 0x000F; /* u16 declaration */ ++#endif ++ ++ ++ /* Set transmission frequency 0x15 = ~100kHz */ ++ *MCF_I2C_I2FDR = 0x15; ++ ++ /* set the 5282 I2C slave address though we never use it */ ++ *MCF_I2C_I2ADR = 0x6A; ++ ++ /* Enable I2C module and if IBB is set, do the special initialzation */ ++ /* procedures as are documented at the 5282 User Guide page 24-11 */ ++ *MCF_I2C_I2CR |= MCF_I2C_I2CR_IEN; ++ if ((*MCF_I2C_I2SR & MCF_I2C_I2SR_IBB) == 1) { ++ printk("%s - do special 5282 I2C init procedures \n", ++ __FUNCTION__); ++ *MCF_I2C_I2CR = 0x00; ++ *MCF_I2C_I2CR = 0xA0; ++ dummyRead = *MCF_I2C_I2DR; ++ *MCF_I2C_I2SR = 0x00; ++ *MCF_I2C_I2CR = 0x00; ++ } ++ ++ /* default I2C mode is - slave and receive */ ++ *MCF_I2C_I2CR &= ~(MCF_I2C_I2CR_MSTA | MCF_I2C_I2CR_MTX); ++ ++ coldfire_adapter.dev.parent = &platform_bus; ++ retval = i2c_add_adapter(&coldfire_adapter); ++ ++ if (retval < 0) ++ printk("%s - return code is: %d \n", __FUNCTION__, retval); ++ ++ return retval; ++}; ++ ++ ++/* ++ * I2C module exit function ++ */ ++ ++static void __exit i2c_coldfire_exit(void) ++{ ++ /* disable I2C and Interrupt */ ++ *MCF_I2C_I2CR &= ~(MCF_I2C_I2CR_IEN | MCF_I2C_I2CR_IIEN); ++ i2c_del_adapter(&coldfire_adapter); ++ ++}; ++ ++ ++MODULE_AUTHOR("Derek CL Cheung <derek.cheung@sympatico.ca>"); ++MODULE_DESCRIPTION("MCF5282 I2C adaptor"); ++MODULE_LICENSE("GPL"); ++ ++module_init(i2c_coldfire_init); ++module_exit(i2c_coldfire_exit); +--- /dev/null ++++ b/drivers/i2c/busses/i2c-mcf.h +@@ -0,0 +1,75 @@ ++/* ++ i2c-mcf.h - header file for i2c-mcf.c ++ ++ Copyright (c) 2005, Derek CL Cheung <derek.cheung@sympatico.ca> ++ <http://www3.sympatico.ca/derek.cheung> ++ ++ Copyright (c) 2006-2007, emlix ++ Sebastian Hess <sh@emlix.com> ++ ++ Copyright (c) 2006-2007 Freescale Semiconductor, Inc ++ Yaroslav Vinogradov <yaroslav.vinogradov@freescale.com> ++ Matt Waddel <Matt.Waddel@freescale.com> ++ ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 2 of the License, or ++ (at your option) any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program; if not, write to the Free Software ++ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ ++ Changes: ++ v0.1 26 March 2005 ++ Initial Release - developed on uClinux with 2.6.9 kernel ++ v0.2 29 May 2006 ++ Modified to be more generic and added support for ++ i2c_master_xfer ++*/ ++ ++ ++#ifndef __I2C_MCF_H__ ++#define __I2C_MCF_H__ ++ ++enum I2C_START_TYPE { FIRST_START, REPEAT_START }; ++enum I2C_ACK_TYPE { ACK, NACK}; ++ ++/* Function prototypes */ ++static u32 coldfire_func(struct i2c_adapter *adapter); ++static s32 coldfire_i2c_access(struct i2c_adapter *adap, u16 address, ++ unsigned short flags, char read_write, ++ u8 command, int size, union i2c_smbus_data *data); ++static int coldfire_write_data(const u8 data); ++static int coldfire_i2c_start(const char read_write, const u16 target_address, const enum I2C_START_TYPE i2c_start); ++static int coldfire_read_data(u8 * const rxData, const enum I2C_ACK_TYPE ackType); ++static int coldfire_i2c_master(struct i2c_adapter *adap,struct i2c_msg *msgs, int num); ++void dumpReg(char *, u16 addr, u8 data); ++ ++#define MCF_I2C_I2ADR_ADDR(x) (((x)&0x7F)<<0x01) ++#define MCF_I2C_I2FDR_IC(x) (((x)&0x3F)) ++ ++/* I2C Control Register */ ++#define MCF_I2C_I2CR_IEN (0x80) /* I2C enable */ ++#define MCF_I2C_I2CR_IIEN (0x40) /* interrupt enable */ ++#define MCF_I2C_I2CR_MSTA (0x20) /* master/slave mode */ ++#define MCF_I2C_I2CR_MTX (0x10) /* transmit/receive mode */ ++#define MCF_I2C_I2CR_TXAK (0x08) /* transmit acknowledge enable */ ++#define MCF_I2C_I2CR_RSTA (0x04) /* repeat start */ ++ ++/* I2C Status Register */ ++#define MCF_I2C_I2SR_ICF (0x80) /* data transfer bit */ ++#define MCF_I2C_I2SR_IAAS (0x40) /* I2C addressed as a slave */ ++#define MCF_I2C_I2SR_IBB (0x20) /* I2C bus busy */ ++#define MCF_I2C_I2SR_IAL (0x10) /* aribitration lost */ ++#define MCF_I2C_I2SR_SRW (0x04) /* slave read/write */ ++#define MCF_I2C_I2SR_IIF (0x02) /* I2C interrupt */ ++#define MCF_I2C_I2SR_RXAK (0x01) /* received acknowledge */ ++ ++/********************************************************************/ ++#endif /* __I2C_MCF_H__ */ diff --git a/target/linux/coldfire/patches/072-mcfv4e_disable_irq_nosync.patch b/target/linux/coldfire/patches/072-mcfv4e_disable_irq_nosync.patch new file mode 100644 index 0000000000..c93c6f7c29 --- /dev/null +++ b/target/linux/coldfire/patches/072-mcfv4e_disable_irq_nosync.patch @@ -0,0 +1,24 @@ +From 69446dbc7af1fddf00f3ad0629008dd6875704a7 Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Wed, 2 Jul 2008 16:03:56 -0600 +Subject: [PATCH] Add disable_irq_nosync alias to disable_irq. + +LTIBName: mcfv4e-disable-irq-nosync +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + arch/m68k/coldfire/ints.c | 4 ++++ + 1 files changed, 4 insertions(+), 0 deletions(-) + +--- a/arch/m68k/coldfire/ints.c ++++ b/arch/m68k/coldfire/ints.c +@@ -317,6 +317,10 @@ void disable_irq(unsigned int irq) + } + EXPORT_SYMBOL(disable_irq); + ++void disable_irq_nosync(unsigned int irq) __attribute__((alias("disable_irq"))); ++EXPORT_SYMBOL(disable_irq_nosync); ++ ++ + unsigned long probe_irq_on(void) + { + return 0; diff --git a/target/linux/coldfire/patches/073-mcfv4e_uboot_bootargs.patch b/target/linux/coldfire/patches/073-mcfv4e_uboot_bootargs.patch new file mode 100644 index 0000000000..34d1e3b306 --- /dev/null +++ b/target/linux/coldfire/patches/073-mcfv4e_uboot_bootargs.patch @@ -0,0 +1,32 @@ +From 39929365081d5aa7c311ee8325c7f1a0ffb88a76 Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Mon, 7 Jul 2008 23:37:30 -0600 +Subject: [PATCH] Enable uboot bootargs. + +LTIBName: mcfv4e-uboot-bootargs +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + arch/m68k/coldfire/config.c | 5 ----- + 1 files changed, 0 insertions(+), 5 deletions(-) + +--- a/arch/m68k/coldfire/config.c ++++ b/arch/m68k/coldfire/config.c +@@ -196,7 +196,6 @@ asmlinkage void __init cf_early_init(voi + m68k_memory[m68k_num_memory].addr = CONFIG_SDRAM_BASE; + m68k_memory[m68k_num_memory++].size = CONFIG_SDRAM_SIZE; + +-#if 0 + if (!uboot_commandline(m68k_command_line)) { + #if defined(CONFIG_BOOTPARAM) + strncpy(m68k_command_line, CONFIG_BOOTPARAM_STRING, CL_SIZE-1); +@@ -204,10 +203,6 @@ asmlinkage void __init cf_early_init(voi + strcpy(m68k_command_line, DEFAULT_COMMAND_LINE); + #endif + } +-#endif +-/* JKM -- temporary! */ +-strcpy(m68k_command_line, DEFAULT_COMMAND_LINE); +-/* JKM -- temporary! */ + + #if defined(CONFIG_BLK_DEV_INITRD) + /* add initrd image */ diff --git a/target/linux/coldfire/patches/074-mcfv4e_except_vector_fix.patch b/target/linux/coldfire/patches/074-mcfv4e_except_vector_fix.patch new file mode 100644 index 0000000000..9956ba71b7 --- /dev/null +++ b/target/linux/coldfire/patches/074-mcfv4e_except_vector_fix.patch @@ -0,0 +1,56 @@ +From 09895934aaddf4f08345798068b41344068c7b56 Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Tue, 8 Jul 2008 00:59:38 -0600 +Subject: [PATCH] Fix exception handling to properly get vector. + +LTIBName: mcfv4e-except-vector-fix +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + arch/m68k/coldfire/traps.c | 11 ++++++----- + 1 files changed, 6 insertions(+), 5 deletions(-) + +--- a/arch/m68k/coldfire/traps.c ++++ b/arch/m68k/coldfire/traps.c +@@ -7,6 +7,7 @@ + * 68040 fixes by Martin Apel + * 68060 fixes by Roman Hodek + * 68060 fixes by Jesper Skov ++ * Coldfire fixes by Kurt Mahan + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file COPYING in the main directory of this archive +@@ -288,13 +289,13 @@ void show_stack(struct task_struct *task + void bad_super_trap(struct frame *fp) + { + console_verbose(); +- if (fp->ptregs.vector < 4*sizeof(vec_names)/sizeof(vec_names[0])) ++ if (fp->ptregs.vector < sizeof(vec_names)/sizeof(vec_names[0])) + printk(KERN_WARNING "*** %s *** FORMAT=%X\n", +- vec_names[(fp->ptregs.vector) >> 2], ++ vec_names[fp->ptregs.vector], + fp->ptregs.format); + else + printk(KERN_WARNING "*** Exception %d *** FORMAT=%X\n", +- (fp->ptregs.vector) >> 2, ++ fp->ptregs.vector, + fp->ptregs.format); + printk(KERN_WARNING "Current process id is %d\n", current->pid); + die_if_kernel("BAD KERNEL TRAP", &fp->ptregs, 0); +@@ -306,7 +307,7 @@ asmlinkage void trap_c(struct frame *fp) + siginfo_t info; + + if (fp->ptregs.sr & PS_S) { +- if ((fp->ptregs.vector >> 2) == VEC_TRACE) { ++ if (fp->ptregs.vector == VEC_TRACE) { + /* traced a trapping instruction */ + current->ptrace |= PT_DTRACE; + } else +@@ -315,7 +316,7 @@ asmlinkage void trap_c(struct frame *fp) + } + + /* send the appropriate signal to the user program */ +- switch ((fp->ptregs.vector) >> 2) { ++ switch (fp->ptregs.vector) { + case VEC_ADDRERR: + info.si_code = BUS_ADRALN; + sig = SIGBUS; diff --git a/target/linux/coldfire/patches/075-mcfv4e_watchdog.patch b/target/linux/coldfire/patches/075-mcfv4e_watchdog.patch new file mode 100644 index 0000000000..5b865bdd32 --- /dev/null +++ b/target/linux/coldfire/patches/075-mcfv4e_watchdog.patch @@ -0,0 +1,265 @@ +From 3c6c80a04d6ca99c4f9fbb5e4f279bd644b2df48 Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Tue, 8 Jul 2008 14:10:46 -0600 +Subject: [PATCH] Add Coldfire Watchdog support. + +LTIBName: mcfv4e-watchdog +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + drivers/watchdog/Kconfig | 9 ++ + drivers/watchdog/Makefile | 1 + + drivers/watchdog/mcf_wdt.c | 220 ++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 230 insertions(+), 0 deletions(-) + create mode 100644 drivers/watchdog/mcf_wdt.c + +--- a/drivers/watchdog/Kconfig ++++ b/drivers/watchdog/Kconfig +@@ -672,6 +672,15 @@ config TXX9_WDT + + # PARISC Architecture + ++# ColdFire Architecture ++ ++config COLDFIRE_WATCHDOG ++ tristate "ColdFire watchdog support" ++ depends on WATCHDOG ++ help ++ To compile this driver as a module, choose M here: the ++ module will be called softdog. ++ + # POWERPC Architecture + + config MPC5200_WDT +--- a/drivers/watchdog/Makefile ++++ b/drivers/watchdog/Makefile +@@ -86,6 +86,7 @@ obj-$(CONFIG_SBC_EPX_C3_WATCHDOG) += sbc + # M32R Architecture + + # M68K Architecture ++obj-$(CONFIG_COLDFIRE_WATCHDOG) += mcf_wdt.o + + # M68KNOMMU Architecture + +--- /dev/null ++++ b/drivers/watchdog/mcf_wdt.c +@@ -0,0 +1,220 @@ ++/* ++ * drivers/watchdog/mcf_wdt.c ++ * ++ * Watchdog driver for ColdFire processors ++ * ++ * Adapted from the IXP4xx watchdog driver. ++ * The original version carries these notices: ++ * ++ * Author: Deepak Saxena <dsaxena@plexity.net> ++ * ++ * Copyright 2004 (c) MontaVista, Software, Inc. ++ * Based on sa1100 driver, Copyright (C) 2000 Oleg Drokin <green@crimea.edu> ++ * ++ * This file is licensed under the terms of the GNU General Public ++ * License version 2. This program is licensed "as is" without any ++ * warranty of any kind, whether express or implied. ++ */ ++ ++#include <linux/module.h> ++#include <linux/moduleparam.h> ++#include <linux/types.h> ++#include <linux/kernel.h> ++#include <linux/fs.h> ++#include <linux/miscdevice.h> ++#include <linux/watchdog.h> ++#include <linux/init.h> ++#include <linux/bitops.h> ++ ++#include <asm-m68k/uaccess.h> ++#include <asm-m68k/coldfire.h> ++#include <asm-m68k/m5485gpt.h> ++ ++static int nowayout; ++static unsigned int heartbeat = 30; /* (secs) Default is 0.5 minute */ ++static unsigned long wdt_status; ++ ++#define WDT_IN_USE 0 ++#define WDT_OK_TO_CLOSE 1 ++ ++static unsigned long wdt_tick_rate; ++ ++static void ++wdt_enable(void) ++{ ++ MCF_GPT_GMS0 = 0; ++ MCF_GPT_GCIR0 = MCF_GPT_GCIR_PRE(heartbeat*wdt_tick_rate) | ++ MCF_GPT_GCIR_CNT(0xffff); ++ MCF_GPT_GMS0 = MCF_GPT_GMS_OCPW(0xA5) | MCF_GPT_GMS_WDEN | ++ MCF_GPT_GMS_CE | MCF_GPT_GMS_TMS_GPIO; ++} ++ ++static void ++wdt_disable(void) ++{ ++ MCF_GPT_GMS0 = 0; ++} ++ ++static void ++wdt_keepalive(void) ++{ ++ MCF_GPT_GMS0 = MCF_GPT_GMS_OCPW(0xA5) | MCF_GPT_GMS0; ++} ++ ++static int ++mcf_wdt_open(struct inode *inode, struct file *file) ++{ ++ if (test_and_set_bit(WDT_IN_USE, &wdt_status)) ++ return -EBUSY; ++ ++ clear_bit(WDT_OK_TO_CLOSE, &wdt_status); ++ ++ wdt_enable(); ++ ++ return nonseekable_open(inode, file); ++} ++ ++static ssize_t ++mcf_wdt_write(struct file *file, const char *data, size_t len, loff_t *ppos) ++{ ++ if (len) { ++ if (!nowayout) { ++ size_t i; ++ ++ clear_bit(WDT_OK_TO_CLOSE, &wdt_status); ++ ++ for (i = 0; i != len; i++) { ++ char c; ++ ++ if (get_user(c, data + i)) ++ return -EFAULT; ++ if (c == 'V') ++ set_bit(WDT_OK_TO_CLOSE, &wdt_status); ++ } ++ } ++ wdt_keepalive(); ++ } ++ ++ return len; ++} ++ ++ ++static struct watchdog_info ident = { ++ .options = WDIOF_MAGICCLOSE | WDIOF_SETTIMEOUT | ++ WDIOF_KEEPALIVEPING, ++ .identity = "Coldfire Watchdog", ++}; ++ ++static int ++mcf_wdt_ioctl(struct inode *inode, struct file *file, unsigned int cmd, ++ unsigned long arg) ++{ ++ int ret = -ENOIOCTLCMD; ++ int time; ++ ++ switch (cmd) { ++ case WDIOC_GETSUPPORT: ++ ret = copy_to_user((struct watchdog_info *)arg, &ident, ++ sizeof(ident)) ? -EFAULT : 0; ++ break; ++ ++ case WDIOC_GETSTATUS: ++ ret = put_user(0, (int *)arg); ++ break; ++ ++ case WDIOC_GETBOOTSTATUS: ++ ret = put_user(0, (int *)arg); ++ break; ++ ++ case WDIOC_SETTIMEOUT: ++ ret = get_user(time, (int *)arg); ++ if (ret) ++ break; ++ ++ if (time <= 0 || time > 30) { ++ ret = -EINVAL; ++ break; ++ } ++ ++ heartbeat = time; ++ wdt_enable(); ++ /* Fall through */ ++ ++ case WDIOC_GETTIMEOUT: ++ ret = put_user(heartbeat, (int *)arg); ++ break; ++ ++ case WDIOC_KEEPALIVE: ++ wdt_keepalive(); ++ ret = 0; ++ break; ++ } ++ ++ return ret; ++} ++ ++static int ++mcf_wdt_release(struct inode *inode, struct file *file) ++{ ++ if (test_bit(WDT_OK_TO_CLOSE, &wdt_status)) { ++ wdt_disable(); ++ } else { ++ printk(KERN_CRIT "WATCHDOG: Device closed unexpectdly - " ++ "timer will not stop\n"); ++ } ++ ++ clear_bit(WDT_IN_USE, &wdt_status); ++ clear_bit(WDT_OK_TO_CLOSE, &wdt_status); ++ ++ return 0; ++} ++ ++ ++static struct file_operations mcf_wdt_fops = { ++ .owner = THIS_MODULE, ++ .llseek = no_llseek, ++ .write = mcf_wdt_write, ++ .ioctl = mcf_wdt_ioctl, ++ .open = mcf_wdt_open, ++ .release = mcf_wdt_release, ++}; ++ ++static struct miscdevice mcf_wdt_miscdev = { ++ .minor = WATCHDOG_MINOR, ++ .name = "watchdog", ++ .fops = &mcf_wdt_fops, ++}; ++ ++static int __init mcf_wdt_init(void) ++{ ++ wdt_tick_rate = MCF_BUSCLK/0xffff; ++#ifdef CONFIG_WATCHDOG_NOWAYOUT ++ nowayout = 1; ++#else ++ nowayout = 0; ++#endif ++ printk("ColdFire watchdog driver is loaded.\n"); ++ ++ return misc_register(&mcf_wdt_miscdev); ++} ++ ++static void __exit mcf_wdt_exit(void) ++{ ++ misc_deregister(&mcf_wdt_miscdev); ++} ++ ++module_init(mcf_wdt_init); ++module_exit(mcf_wdt_exit); ++ ++MODULE_AUTHOR("Deepak Saxena"); ++MODULE_DESCRIPTION("ColdFire Watchdog"); ++ ++module_param(heartbeat, int, 0); ++MODULE_PARM_DESC(heartbeat, "Watchdog heartbeat in seconds (default 60s)"); ++ ++module_param(nowayout, int, 0); ++MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started"); ++ ++MODULE_LICENSE("GPL"); ++MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR); ++ diff --git a/target/linux/coldfire/patches/076-mcfv4e_irda.patch b/target/linux/coldfire/patches/076-mcfv4e_irda.patch new file mode 100644 index 0000000000..0452a47b24 --- /dev/null +++ b/target/linux/coldfire/patches/076-mcfv4e_irda.patch @@ -0,0 +1,237 @@ +From 5f645d0668b469c4738fe1e9d3994287a519d0f3 Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Tue, 8 Jul 2008 15:57:47 -0600 +Subject: [PATCH] Add Coldfire IRDA support in serial driver. + +LTIBName: mcfv4e-irda +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +Signed-off-by: Huan, Wang <b18965@freescale.com> +--- + drivers/serial/Kconfig | 6 ++ + drivers/serial/mcfserial.c | 110 ++++++++++++++++++++++++++++++++++++++++++-- + net/irda/irlap.c | 2 +- + 3 files changed, 113 insertions(+), 5 deletions(-) + +--- a/drivers/serial/Kconfig ++++ b/drivers/serial/Kconfig +@@ -979,6 +979,12 @@ config SERIAL_COLDFIRE + This driver supports the built-in serial ports of the Motorola ColdFire + family of CPUs. + ++config SERIAL_COLDFIRE_IRDA ++ bool "ColdFire IRDA support" ++ depends on SERIAL_COLDFIRE ++ help ++ This driver supports IRDA on the Motorola ColdFire. ++ + config SERIAL_MCF + bool "Coldfire serial support (new style driver)" + depends on COLDFIRE +--- a/drivers/serial/mcfserial.c ++++ b/drivers/serial/mcfserial.c +@@ -109,6 +109,10 @@ static struct tty_driver *mcfrs_serial_d + #define IRQBASE 73 + #endif + ++#ifdef CONFIG_SERIAL_COLDFIRE_IRDA ++#define SERIAL_IRDA_LINE (2) ++#endif ++ + /* + * Configuration table, UARTs to look for at startup. + */ +@@ -393,6 +397,9 @@ static inline void receive_chars(struct + static inline void transmit_chars(struct mcf_serial *info) + { + volatile unsigned char *uartp; ++#ifdef CONFIG_SERIAL_COLDFIRE_IRDA ++ int i; ++#endif + + uartp = info->addr; + +@@ -404,13 +411,36 @@ static inline void transmit_chars(struct + } + + if ((info->xmit_cnt <= 0) || info->tty->stopped) { ++#ifdef CONFIG_SERIAL_COLDFIRE_IRDA ++ if (info->line == SERIAL_IRDA_LINE) { ++ /* Enable receiver for IRDA */ ++ uartp[MCFUART_UCR] = MCFUART_UCR_CMDRESETRX; ++ /* reset RX */ ++ uartp[MCFUART_UCR] = MCFUART_UCR_TXENABLE | MCFUART_UCR_RXENABLE; ++ } ++#endif + info->imr &= ~MCFUART_UIR_TXREADY; + uartp[MCFUART_UIMR] = info->imr; + return; + } + + while (uartp[MCFUART_USR] & MCFUART_USR_TXREADY) { ++#ifdef CONFIG_SERIAL_COLDFIRE_IRDA ++ if (info->line == SERIAL_IRDA_LINE) { ++ while (!(uartp[MCFUART_USR] & MCFUART_USR_TXEMPTY)); ++ i = 0; ++ /* delay for settle */ ++#if defined(CONFIG_M548X) ++ udelay(1); ++#elif defined(CONFIG_M547X) ++ udelay(2); ++#else ++ while (i++ < 25000) udelay(1); ++#endif ++ } ++#endif + uartp[MCFUART_UTB] = info->xmit_buf[info->xmit_tail++]; ++ + info->xmit_tail = info->xmit_tail & (SERIAL_XMIT_SIZE-1); + info->stats.tx++; + if (--info->xmit_cnt <= 0) +@@ -567,6 +597,28 @@ static int startup(struct mcf_serial * i + */ + mcfrs_change_speed(info); + ++#ifdef CONFIG_SERIAL_COLDFIRE_IRDA ++ if (info->line == SERIAL_IRDA_LINE) { ++ /* Put PSC in IrDA mode */ ++ MCF_PSC_SICR(info->line) = MCF_PSC_SICR_SIM_SIR; ++ ++ /* Set pulse width to 1.6 uS */ ++ MCF_PSC_IRSDR(info->line) = (uint8_t) ++ (16 * (CONFIG_MCFCLK / 10000000)); ++ MCF_PSC_IRCR1(info->line) = MCF_PSC_IRCR1_SPUL; ++ MCF_PSC_IRCR2(info->line) = 0; ++ ++ /* Enable RTS to send */ ++ MCF_PSC_OPSET(info->line) = MCF_PSC_OPSET_RTS; ++ ++ /* Setup FIFO Alarms */ ++ MCF_PSC_RFAR(info->line) = MCF_PSC_RFAR_ALARM(248); ++ MCF_PSC_TFAR(info->line) = MCF_PSC_TFAR_ALARM(248); ++ ++ MCF_PSC_RFCR(info->line) = MCF_PSC_RFCR_FRMEN | MCF_PSC_RFCR_GR(4); ++ MCF_PSC_TFCR(info->line) = MCF_PSC_TFCR_FRMEN | MCF_PSC_RFCR_GR(4); ++ } ++#endif + /* + * Lastly enable the UART transmitter and receiver, and + * interrupt enables. +@@ -588,10 +640,20 @@ static void shutdown(struct mcf_serial * + { + volatile unsigned char *uartp; + unsigned long flags; ++#ifdef CONFIG_SERIAL_COLDFIRE_IRDA ++ unsigned long delay_counter = 0; ++#endif + + if (!(info->flags & ASYNC_INITIALIZED)) + return; +- ++#ifdef CONFIG_SERIAL_COLDFIRE_IRDA ++ uartp = (volatile unsigned char *) info->addr; ++ while (!(uartp[MCFUART_USR] & MCFUART_USR_TXEMPTY)) { ++ if(delay_counter++ > 25000) ++ break; ++ udelay(10); ++ } ++#endif + #ifdef SERIAL_DEBUG_OPEN + printk("Shutting down serial port %d (irq %d)....\n", info->line, + info->irq); +@@ -820,10 +882,19 @@ static int mcfrs_write(struct tty_struct + + local_irq_disable(); + uartp = info->addr; ++ ++#ifdef CONFIG_SERIAL_COLDFIRE_IRDA ++ if (info->line == SERIAL_IRDA_LINE) { ++ /* Disable IRDA receiver*/ ++ uartp[MCFUART_UCR] = MCFUART_UCR_CMDRESETRX; /* reset RX */ ++ uartp[MCFUART_UCR] = MCFUART_UCR_CMDRESETTX; /* reset TX */ ++ ++ uartp[MCFUART_UCR] = MCFUART_UCR_TXENABLE; ++ } ++#endif + info->imr |= MCFUART_UIR_TXREADY; + uartp[MCFUART_UIMR] = info->imr; + local_irq_restore(flags); +- + return total; + } + +@@ -884,9 +955,21 @@ static void mcfrs_throttle(struct tty_st + + if (serial_paranoia_check(info, tty->name, "mcfrs_throttle")) + return; +- ++#ifdef CONFIG_SERIAL_COLDFIRE_IRDA ++ if (I_IXOFF(tty)) { ++ /* Force STOP_CHAR (xoff) out */ ++ volatile unsigned char *uartp; ++ unsigned long flags; ++ uartp = (volatile unsigned char *) info->addr; ++ local_irq_save(flags); ++ info->imr |= MCFUART_UIR_TXREADY; ++ uartp[MCFUART_UIMR] = info->imr; ++ local_irq_restore(flags); ++ } ++#else + if (I_IXOFF(tty)) + info->x_char = STOP_CHAR(tty); ++#endif + + /* Turn off RTS line (do this atomic) */ + } +@@ -907,8 +990,22 @@ static void mcfrs_unthrottle(struct tty_ + if (I_IXOFF(tty)) { + if (info->x_char) + info->x_char = 0; ++#ifdef CONFIG_SERIAL_COLDFIRE_IRDA ++ else { ++ /* Force START_CHAR (xon) out */ ++ volatile unsigned char *uartp; ++ unsigned long flags; ++ info->x_char = START_CHAR(tty); ++ uartp = (volatile unsigned char *) info->addr; ++ local_irq_save(flags); ++ info->imr |= MCFUART_UIR_TXREADY; ++ uartp[MCFUART_UIMR] = info->imr; ++ local_irq_restore(flags); ++ } ++#else + else + info->x_char = START_CHAR(tty); ++#endif + } + + /* Assert RTS line (do this atomic) */ +@@ -1156,12 +1253,17 @@ static int mcfrs_ioctl(struct tty_struct + static void mcfrs_set_termios(struct tty_struct *tty, struct ktermios *old_termios) + { + struct mcf_serial *info = (struct mcf_serial *)tty->driver_data; ++#ifdef CONFIG_SERIAL_COLDFIRE_IRDA ++ int i = 0; /* hush GCC */ ++#endif + + if (tty->termios->c_cflag == old_termios->c_cflag) + return; + ++#ifdef CONFIG_SERIAL_COLDFIRE_IRDA ++ while (i++ < 35000) udelay(1); ++#endif + mcfrs_change_speed(info); +- + if ((old_termios->c_cflag & CRTSCTS) && + !(tty->termios->c_cflag & CRTSCTS)) { + tty->hw_stopped = 0; +--- a/net/irda/irlap.c ++++ b/net/irda/irlap.c +@@ -627,7 +627,7 @@ void irlap_status_indication(struct irla + { + switch (quality_of_link) { + case STATUS_NO_ACTIVITY: +- IRDA_MESSAGE("IrLAP, no activity on link!\n"); ++ /* IRDA_MESSAGE("IrLAP, no activity on link!\n"); */ + break; + case STATUS_NOISY: + IRDA_MESSAGE("IrLAP, noisy link!\n"); diff --git a/target/linux/coldfire/patches/077-mcfv4e_flexcan.patch b/target/linux/coldfire/patches/077-mcfv4e_flexcan.patch new file mode 100644 index 0000000000..ae7aefd649 --- /dev/null +++ b/target/linux/coldfire/patches/077-mcfv4e_flexcan.patch @@ -0,0 +1,1376 @@ +From c44de58d0972d05851512ba8cbd928b7adef5187 Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Tue, 8 Jul 2008 17:11:33 -0600 +Subject: [PATCH] Add FlexCAN support. + +LTIBName: mcfv4e-flexcan +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +Signed-off-by: Huan Wang <b18965@freescale.com> +--- + drivers/net/can/Kconfig | 13 ++ + drivers/net/can/Makefile | 1 + + drivers/net/can/flexcan/Makefile | 5 + + drivers/net/can/flexcan/flexcan.c | 378 +++++++++++++++++++++++++++++++++ + drivers/net/can/flexcan/flexcan.h | 148 +++++++++++++ + drivers/net/can/flexcan/mcf548x_can.c | 213 ++++++++++++++++++ + include/asm-m68k/m5485sim.h | 2 + + include/linux/can/dev.h | 62 ++++++ + include/linux/can/ioctl.h | 152 +++++++++++++ + include/linux/can/version.h | 22 ++ + net/can/Makefile | 3 + + net/can/dev.c | 292 +++++++++++++++++++++++++ + 12 files changed, 1291 insertions(+), 0 deletions(-) + create mode 100644 drivers/net/can/flexcan/Makefile + create mode 100644 drivers/net/can/flexcan/flexcan.c + create mode 100644 drivers/net/can/flexcan/flexcan.h + create mode 100644 drivers/net/can/flexcan/mcf548x_can.c + create mode 100644 include/linux/can/dev.h + create mode 100644 include/linux/can/ioctl.h + create mode 100644 include/linux/can/version.h + create mode 100644 net/can/dev.c + +--- a/drivers/net/can/Kconfig ++++ b/drivers/net/can/Kconfig +@@ -12,6 +12,19 @@ config CAN_VCAN + This driver can also be built as a module. If so, the module + will be called vcan. + ++config CAN_FLEXCAN ++ tristate "Support for Freescale FLEXCAN based chips" ++ depends on CAN && (PPC || M68K || M68KNOMMU) ++ ---help--- ++ Say Y here if you want to support for Freescale FlexCAN. ++ ++config CAN_MCF547X_8X ++ tristate "Freescale MCF547X/MCF548X onboard CAN controller" ++ depends on CAN_FLEXCAN && (M547X || M548X) ++ ---help--- ++ Say Y here if you want to support for Freescale MCF547x/MCF548x ++ onboard dualCAN controller. ++ + config CAN_DEBUG_DEVICES + bool "CAN devices debugging messages" + depends on CAN +--- a/drivers/net/can/Makefile ++++ b/drivers/net/can/Makefile +@@ -3,3 +3,4 @@ + # + + obj-$(CONFIG_CAN_VCAN) += vcan.o ++obj-$(CONFIG_CAN_FLEXCAN) += flexcan/ +--- /dev/null ++++ b/drivers/net/can/flexcan/Makefile +@@ -0,0 +1,5 @@ ++ ++obj-$(CONFIG_CAN_MCF547X_8X) += flexcan-mcf548x.o ++ ++flexcan-mcf548x-objs := flexcan.o mcf548x_can.o ++ +--- /dev/null ++++ b/drivers/net/can/flexcan/flexcan.c +@@ -0,0 +1,378 @@ ++/* ++ * flexcan.c ++ * ++ * DESCRIPTION: ++ * CAN bus driver for the alone generic (as possible as) FLEXCAN controller. ++ * ++ * AUTHOR: ++ * Andrey Volkov <avolkov@varma-el.com> ++ * ++ * COPYRIGHT: ++ * 2005-2006, Varma Electronics Oy ++ * ++ * LICENCE: ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ++ * ++ * HISTORY: ++ * 2008-06-23 Support for MCF548x's FlexCAN ++ * Huan, Wang <b18965@freescale.com> ++ */ ++ ++ ++ ++#include <linux/kernel.h> ++#include <linux/module.h> ++#include <linux/interrupt.h> ++#include <linux/delay.h> ++#include <linux/netdevice.h> ++#include <linux/if_arp.h> ++#include <linux/if_ether.h> ++#include <linux/can.h> ++#include <linux/list.h> ++#include <linux/io.h> ++ ++#include <linux/can/dev.h> ++#include <linux/can/error.h> ++#include "flexcan.h" ++#include <asm/coldfire.h> ++#include <asm/m5485sim.h> ++#include <linux/can/version.h> /* for RCSID. Removed by mkpatch script */ ++RCSID("$Id$"); ++ ++struct flexcan_priv { ++ struct can_priv can; ++ volatile unsigned long flags; ++ u8 shadow_statflg; ++ u8 shadow_canrier; ++ u8 cur_pri; ++ u8 tx_active; ++ ++ struct list_head tx_head; ++ struct napi_struct napi; ++ struct net_device *dev; ++}; ++ ++ ++static int flexcan_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) ++{ ++ struct can_frame *frame = (struct can_frame *)skb->data; ++ struct flexcan_regs *regs = (struct flexcan_regs *)dev->base_addr; ++ int i, len; ++ int txbuf = 0; ++ u32 can_id, can_ext, tmp, tmp1; ++ ++ /* Transmission inactive */ ++ regs->cantxfg[txbuf].can_dlc = MB_CNT_CODE(0x08); ++ ++ can_ext = frame->can_id; ++ if (can_ext & CAN_EFF_FLAG) { ++ /* Frame format is extended */ ++ regs->cantxfg[txbuf].can_dlc |= (1 << 21); ++ regs->cantxfg[txbuf].can_dlc |= (1 << 22); ++ can_id = frame->can_id & MB_ID_EXT; ++ if (frame->can_id & CAN_RTR_FLAG) ++ regs->cantxfg[txbuf].can_dlc |= (1 << 20); ++ ++ tmp = (can_id & CAN_SFF_MASK) << 18; ++ tmp1 = can_id >> 11; ++ can_id = tmp | tmp1; ++ regs->cantxfg[txbuf].can_id = can_id; ++ } else { ++ /* Frame format is standard */ ++ can_id = frame->can_id & MB_ID_EXT; ++ if (frame->can_id & CAN_RTR_FLAG) ++ regs->cantxfg[txbuf].can_dlc |= (1 << 20); ++ ++ regs->cantxfg[txbuf].can_id = can_id << 18; ++ } ++ ++ len = 8; ++ for (i = 0; i < len; i++) ++ regs->cantxfg[txbuf].data[i] = frame->data[i]; ++ ++ regs->cantxfg[txbuf].can_dlc |= len << 16; ++ /* Transmission active */ ++ regs->cantxfg[txbuf].can_dlc |= MB_CNT_CODE(0x0c); ++ kfree_skb(skb); ++ return NETDEV_TX_OK; ++} ++ ++static void flexcan_tx_timeout(struct net_device *dev) ++{ ++ struct sk_buff *skb; ++ struct flexcan_regs *regs = (struct flexcan_regs *)dev->base_addr; ++ struct can_frame *frame; ++ int length = 8; ++ ++ /* Diable the interrupts */ ++ regs->imask = IMASK_BUFF_DISABLE_ALL; ++ ++ skb = dev_alloc_skb(sizeof(struct can_frame)); ++ if (!skb) { ++ if (printk_ratelimit()) ++ dev_notice(ND2D(dev), "TIMEOUT packet dropped.\n"); ++ return; ++ } ++ frame = (struct can_frame *)skb_put(skb, sizeof(struct can_frame)); ++ ++ frame->can_dlc = length; ++ ++ skb->dev = dev; ++ skb->protocol = __constant_htons(ETH_P_CAN); ++ skb->pkt_type = PACKET_BROADCAST; ++ skb->ip_summed = CHECKSUM_UNNECESSARY; ++ ++ netif_rx(skb); ++} ++ ++static irqreturn_t flexcan_isr(int irq, void *dev_id) ++{ ++ struct net_device *dev = (struct net_device *)dev_id; ++ struct flexcan_regs *regs = (struct flexcan_regs *)dev->base_addr; ++ struct net_device_stats *stats = dev->get_stats(dev); ++ struct sk_buff *skb; ++ struct can_frame *frame; ++ u32 iflags, oflags; ++ int i, k; ++ int retval = 1; ++ ++ iflags = regs->iflag; ++ oflags = iflags; ++ for (i = 0; i < 16; i++) { ++ if (iflags & (0x01 << i)) { ++ struct flexcan_mb *mb = ®s->cantxfg[i]; ++ int ctrl = mb->can_dlc; ++ int code = (ctrl >> 24) & 0x0f; ++ int length = (ctrl >> 16) & 0x0f; ++ u32 tmp, tmp1; ++ ++ if (code < 8 && (length > 0)) { ++ /* receive frame */ ++ skb = dev_alloc_skb(sizeof(struct can_frame)); ++ if (!skb) ++ dev_notice(ND2D(dev), ++ "Packets dropped.\n"); ++ skb->dev = dev; ++ frame = (struct can_frame *)skb_put(skb, ++ sizeof(struct can_frame)); ++ ++ frame->can_id &= 0x0; ++ frame->can_dlc = length; ++ tmp1 = mb->can_id & MB_ID_EXT; ++ if (ctrl & MB_CNT_IDE) { ++ tmp = tmp1; ++ tmp = (tmp >> 18) & CAN_SFF_MASK; ++ frame->can_id = (tmp1 << 11) | tmp; ++ frame->can_id &= CAN_EFF_MASK; ++ frame->can_id |= CAN_EFF_FLAG; ++ if (ctrl & MB_CNT_RTR) ++ frame->can_id |= CAN_RTR_FLAG; ++ } else { ++ frame->can_id = tmp1 >> 18; ++ if (ctrl & MB_CNT_RTR) ++ frame->can_id |= CAN_RTR_FLAG; ++ } ++ ++ for (k = 0; k < 8; k++) ++ frame->data[k] = mb->data[k]; ++ ++ mb->can_dlc &= MB_CODE_MASK; ++ mb->can_dlc |= MB_CNT_CODE(0x04); ++ ++ stats->rx_packets++; ++ stats->rx_bytes += frame->can_dlc; ++ skb->dev = dev; ++ skb->protocol = __constant_htons(ETH_P_CAN); ++ skb->ip_summed = CHECKSUM_UNNECESSARY; ++ ++ retval = netif_rx(skb); ++ if (retval == NET_RX_DROP) ++ dev_notice(ND2D(dev), ++ "Packets dropped.\n"); ++ } else { ++ /* transmit frame */ ++ mb->can_dlc = MB_CNT_CODE(0x04); ++ } ++ } ++ } ++ regs->iflag = oflags; ++ ++ return IRQ_HANDLED; ++} ++ ++static int flexcan_do_set_bit_time(struct net_device *dev, ++ struct can_bittime *bt) ++{ ++ struct flexcan_priv *priv = netdev_priv(dev); ++ struct flexcan_regs *regs = (struct flexcan_regs *)dev->base_addr; ++ int ret = 0; ++ u32 reg; ++ ++ if (bt->type != CAN_BITTIME_STD) ++ return -EINVAL; ++ ++ spin_lock_irq(&priv->can.irq_lock); ++ ++ reg = CANCTRL_PRESDIV(bt->std.brp) | CANCTRL_PSEG1(bt->std.phase_seg1 ++ - 1) | CANCTRL_PSEG2(bt->std.phase_seg2 - 1); ++ regs->canctrl &= CANCTRL_BITTIME; ++ regs->canctrl |= (reg | CANCTRL_SAMP(bt->std.sam) | ++ CANCTRL_PROPSEG(bt->std.prop_seg - 1)); ++ ++ spin_unlock_irq(&priv->can.irq_lock); ++ return ret; ++} ++ ++ ++static int flexcan_open(struct net_device *dev) ++{ ++ int ret, i, j; ++ struct flexcan_regs *regs = (struct flexcan_regs *)dev->base_addr; ++ ++#if defined(CONFIG_M547X_8X) ++ MCF_PAR_TIMER = MCF_PAR_TIMER | 0x28; ++ MCF_PAR_TIMER = MCF_PAR_TIMER & 0xf8; ++ MCF_PAR_DSPI = MCF_PAR_DSPI | 0x0a00; ++ MCF_PAR_FECI2CIRQ = MCF_PAR_FECI2CIRQ | 0x0283; ++ MCF_PAR_PSCn(2) = MCF_PAR_PSCn(2) & 0x0f; ++ MCF_PAR_PSCn(2) = MCF_PAR_PSCn(2) | 0x50; ++#endif ++ ++ regs->canmcr |= CANMCR_SOFTRST; ++ regs->canmcr |= CANMCR_MDIS; ++ udelay(10); ++ ++ if ((regs->canmcr & CANMCR_SOFTRST) != 0x0) { ++ dev_err(ND2D(dev), "Failed to softreset can module.\n"); ++ return -1; ++ } ++ ++ /* Enable error and bus off interrupt */ ++ regs->canctrl |= (CANCTRL_RJW(3) | CANCTRL_ERRMSK | ++ CANCTRL_BOFFMSK); ++ ++ /* Set lowest buffer transmitted first */ ++ regs->canctrl |= CANCTRL_LBUF; ++ ++ for (i = 0; i < 16; i++) { ++ regs->cantxfg[i].can_dlc = 0; ++ regs->cantxfg[i].can_id = 0; ++ for (j = 0; j < 8; j++) ++ regs->cantxfg[i].data[j] = 0; ++ ++ /* Put MB into rx queue */ ++ regs->cantxfg[i].can_dlc = MB_CNT_CODE(0x04); ++ } ++ ++ /* acceptance mask/acceptance code (accept everything) */ ++ regs->rxgmask = 0x00000000; ++ regs->rx14mask = 0x00000000; ++ regs->rx15mask = 0x00000000; ++ /* extended frame */ ++ regs->cantxfg[14].can_dlc |= 0x600000; ++ /* Enable flexcan module */ ++ regs->canmcr &= ~CANMCR_MDIS; ++ /* Synchronize with the can bus */ ++ regs->canmcr &= ~CANMCR_HALT; ++ ++#if defined(CONFIG_M547X_8X) ++ for (i = 0; i < 2; i++) { ++ MCF_ICR(ISC_CANn_MBOR(i)) = 0x33; ++ MCF_ICR(ISC_CANn_ERR(i)) = 0x33; ++ MCF_ICR(ISC_CANn_BUSOFF(i)) = 0x33; ++ } ++ ++ ret = request_irq(dev->irq + 64, flexcan_isr, IRQF_DISABLED, ++ dev->name, dev); ++ ret = request_irq(dev->irq + 1 + 64, flexcan_isr, IRQF_DISABLED, ++ dev->name, dev); ++ ret = request_irq(dev->irq + 2 + 64, flexcan_isr, IRQF_DISABLED, ++ dev->name, dev); ++ if (ret < 0) { ++ printk(KERN_ERR "%s - failed to attach interrupt.\n", ++ dev->name); ++ return ret; ++ } ++#endif ++ ++ /* Enable all interrupts */ ++ regs->imask = IMASK_BUFF_ENABLE_ALL; ++ netif_start_queue(dev); ++ return 0; ++} ++ ++static int flexcan_close(struct net_device *dev) ++{ ++ struct flexcan_regs *regs = (struct flexcan_regs *)dev->base_addr; ++ ++ netif_stop_queue(dev); ++ ++ /* Disable all interrupts */ ++ regs->imask = IMASK_BUFF_DISABLE_ALL; ++ free_irq(dev->irq + 64, dev); ++ free_irq(dev->irq + 1 + 64, dev); ++ free_irq(dev->irq + 2 + 64, dev); ++ ++ /* Disable module */ ++ regs->canmcr |= CANMCR_MDIS; ++ return 0; ++} ++ ++int register_flexcandev(struct net_device *dev, int clock_src) ++{ ++ struct flexcan_regs *regs = (struct flexcan_regs *)dev->base_addr; ++ ++ regs->canmcr &= ~CANMCR_MDIS; ++ udelay(100); ++ regs->canmcr |= (CANMCR_FRZ | CANMCR_HALT); ++ return register_netdev(dev); ++} ++EXPORT_SYMBOL(register_flexcandev); ++ ++void unregister_flexcandev(struct net_device *dev) ++{ ++ struct flexcan_regs *regs = (struct flexcan_regs *)dev->base_addr; ++ ++ regs->canmcr |= (CANMCR_FRZ | CANMCR_HALT); ++ regs->canmcr |= CANMCR_MDIS; ++ ++ unregister_netdev(dev); ++} ++EXPORT_SYMBOL(unregister_flexcandev); ++ ++struct net_device *alloc_flexcandev(void) ++{ ++ struct net_device *dev; ++ struct flexcan_priv *priv; ++ ++ dev = alloc_candev(sizeof(struct flexcan_priv)); ++ if (!dev) ++ return NULL; ++ ++ priv = netdev_priv(dev); ++ priv->dev = dev; ++ dev->open = flexcan_open; ++ dev->stop = flexcan_close; ++ dev->hard_start_xmit = flexcan_hard_start_xmit; ++ dev->tx_timeout = flexcan_tx_timeout; ++ dev->flags |= IFF_NOARP; ++ priv->can.do_set_bit_time = flexcan_do_set_bit_time; ++ return dev; ++} ++EXPORT_SYMBOL(alloc_flexcandev); ++ ++MODULE_AUTHOR("Andrey Volkov <avolkov@varma-el.com>"); ++MODULE_LICENSE("GPL v2"); ++MODULE_DESCRIPTION("CAN port driver for flexcan based chip"); +--- /dev/null ++++ b/drivers/net/can/flexcan/flexcan.h +@@ -0,0 +1,148 @@ ++/* ++ * flexcan.h ++ * ++ * DESCRIPTION: ++ * Definitions of consts/structs to drive the Freescale FLEXCAN. ++ * ++ */ ++ ++#ifndef __FLEXCAN_H__ ++#define __FLEXCAN_H__ ++ ++#include <linux/autoconf.h> ++#include <linux/types.h> ++ ++/* FLEXCAN module configuration register (CANMCR) bits */ ++#define CANMCR_MDIS 0x80000000 ++#define CANMCR_FRZ 0x40000000 ++#define CANMCR_HALT 0x10000000 ++#define CANMCR_SOFTRST 0x02000000 ++#define CANMCR_FRZACK 0x01000000 ++#define CANMCR_SUPV 0x00800000 ++#define CANMCR_MAXMB(x) ((x)&0x0f) ++ ++/* FLEXCAN control register (CANCTRL) bits */ ++#define CANCTRL_PRESDIV(x) (((x)&0xff)<<24) ++#define CANCTRL_RJW(x) (((x)&0x03)<<22) ++#define CANCTRL_PSEG1(x) (((x)&0x07)<<19) ++#define CANCTRL_PSEG2(x) (((x)&0x07)<<16) ++#define CANCTRL_BOFFMSK 0x00008000 ++#define CANCTRL_ERRMSK 0x00004000 ++#define CANCTRL_LPB 0x00001000 ++#define CANCTRL_SAMP(x) (((x)&0x1)<<7) ++#define CANCTRL_BOFFREC 0x00000040 ++#define CANCTRL_TSYNC 0x00000020 ++#define CANCTRL_LBUF 0x00000010 ++#define CANCTRL_LOM 0x00000008 ++#define CANCTRL_PROPSEG(x) ((x)&0x07) ++#define CANCTRL_BITTIME 0x00c0d078 ++ ++/* FLEXCAN error counter register (ERRCNT) bits */ ++#define ERRCNT_REXECTR(x) (((x)&0xff)<<8) ++#define ERRCNT_TXECTR(x) ((x)&0xff) ++ ++/* FLEXCAN error and status register (ERRSTAT) bits */ ++#define ERRSTAT_BITERR(x) (((x)&0x03)<<14) ++#define ERRSTAT_ACKERR 0x00002000 ++#define ERRSTAT_CRCERR 0x00001000 ++#define ERRSTAT_FRMERR 0x00000800 ++#define ERRSTAT_STFERR 0x00000400 ++#define ERRSTAT_TXWRN 0x00000200 ++#define ERRSTAT_RXWRN 0x00000100 ++#define ERRSTAT_IDLE 0x00000080 ++#define ERRSTAT_TXRX 0x00000040 ++#define ERRSTAT_FLTCONF(x) (((x)&0x03)<<4) ++#define ERRSTAT_BOFFINT 0x00000004 ++#define ERRSTAT_ERRINT 0x00000002 ++ ++/* FLEXCAN interrupt mask register (IMASK) bits */ ++#define IMASK_BUF15M 0x8000 ++#define IMASK_BUF14M 0x4000 ++#define IMASK_BUF13M 0x2000 ++#define IMASK_BUF12M 0x1000 ++#define IMASK_BUF11M 0x0800 ++#define IMASK_BUF10M 0x0400 ++#define IMASK_BUF9M 0x0200 ++#define IMASK_BUF8M 0x0100 ++#define IMASK_BUF7M 0x0080 ++#define IMASK_BUF6M 0x0040 ++#define IMASK_BUF5M 0x0020 ++#define IMASK_BUF4M 0x0010 ++#define IMASK_BUF3M 0x0008 ++#define IMASK_BUF2M 0x0004 ++#define IMASK_BUF1M 0x0002 ++#define IMASK_BUF0M 0x0001 ++#define IMASK_BUFnM(x) (0x1<<(x)) ++#define IMASK_BUFF_ENABLE_ALL 0xffff ++#define IMASK_BUFF_DISABLE_ALL 0x0000 ++ ++/* FLEXCAN interrupt flag register (IFLAG) bits */ ++#define IFLAG_BUF15M 0x8000 ++#define IFLAG_BUF14M 0x4000 ++#define IFLAG_BUF13M 0x2000 ++#define IFLAG_BUF12M 0x1000 ++#define IFLAG_BUF11M 0x0800 ++#define IFLAG_BUF10M 0x0400 ++#define IFLAG_BUF9M 0x0200 ++#define IFLAG_BUF8M 0x0100 ++#define IFLAG_BUF7M 0x0080 ++#define IFLAG_BUF6M 0x0040 ++#define IFLAG_BUF5M 0x0020 ++#define IFLAG_BUF4M 0x0010 ++#define IFLAG_BUF3M 0x0008 ++#define IFLAG_BUF2M 0x0004 ++#define IFLAG_BUF1M 0x0002 ++#define IFLAG_BUF0M 0x0001 ++#define IFLAG_BUFnM(x) (0x1<<(x)) ++#define IFLAG_BUFF_SET_ALL 0xffff ++#define IFLAG_BUFF_DISABLE_ALL 0x0000 ++ ++/* FLEXCAN message buffers */ ++#define MB_CNT_CODE(x) (((x)&0x0f)<<24) ++#define MB_CNT_SRR 0x00400000 ++#define MB_CNT_IDE 0x00200000 ++#define MB_CNT_RTR 0x00100000 ++#define MB_CNT_LENGTH(x) (((x)&0x0f)<<16) ++#define MB_CNT_TIMESTAMP(x) ((x)&0xffff) ++ ++#define MB_ID_STD ((0x7ff)<<18) ++#define MB_ID_EXT 0x1fffffff ++#define MB_CODE_MASK 0xf0ffffff ++ ++/* Structure of the message buffer */ ++struct flexcan_mb { ++ u32 can_dlc; ++ u32 can_id; ++ u8 data[8]; ++}; ++ ++/* Structure of the hardware registers */ ++struct flexcan_regs { ++ u32 canmcr; ++ u32 canctrl; ++ u32 timer; ++ u32 reserved1; ++ u32 rxgmask; ++ u32 rx14mask; ++ u32 rx15mask; ++ u32 errcnt; ++ u32 errstat; ++ u32 reserved2; ++ u32 imask; ++ u32 reserved3; ++ u32 iflag; ++ u32 reserved4[19]; ++ struct flexcan_mb cantxfg[16]; ++}; ++ ++struct flexcan_platform_data { ++ u8 clock_src; /* FLEXCAN clock source CRIN or SYSCLK */ ++ u32 clock_frq; /* can ref. clock, in Hz */ ++}; ++ ++struct net_device *alloc_flexcandev(void); ++ ++extern int register_flexcandev(struct net_device *dev, int clock_src); ++extern void unregister_flexcandev(struct net_device *dev); ++ ++#endif /* __FLEXCAN_H__ */ +--- /dev/null ++++ b/drivers/net/can/flexcan/mcf548x_can.c +@@ -0,0 +1,213 @@ ++/* ++ * DESCRIPTION: ++ * CAN bus driver for the Freescale MCF548x embedded CPU. ++ * ++ * AUTHOR: ++ * Andrey Volkov <avolkov@varma-el.com> ++ * ++ * COPYRIGHT: ++ * 2004-2005, Varma Electronics Oy ++ * ++ * LICENCE: ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ++ * ++ * HISTORY: ++ * 2008-06-23 support for MCF548x's FlexCAN ++ * Huan, Wang <b18965@freescale.com> ++ * 2005-02-03 created ++ * ++ */ ++ ++#include <linux/kernel.h> ++#include <linux/module.h> ++#include <linux/interrupt.h> ++#include <linux/platform_device.h> ++#include <linux/netdevice.h> ++#include <linux/can.h> ++#include <linux/can/dev.h> ++#include <linux/io.h> ++ ++#include "flexcan.h" ++#include <asm/coldfire.h> ++#include <asm/m5485sim.h> ++#include <linux/can/version.h> /* for RCSID. Removed by mkpatch script */ ++ ++RCSID("$Id$"); ++ ++#define PDEV_MAX 2 ++ ++struct platform_device *pdev[PDEV_MAX]; ++ ++static int __devinit mcf548x_can_probe(struct platform_device *pdev) ++{ ++ struct resource *mem; ++ struct net_device *dev; ++ struct flexcan_platform_data *pdata = pdev->dev.platform_data; ++ struct can_priv *can; ++ u32 mem_size; ++ int ret = -ENODEV; ++ ++ if (!pdata) ++ return ret; ++ ++ dev = alloc_flexcandev(); ++ if (!dev) ++ return -ENOMEM; ++ can = netdev_priv(dev); ++ ++ mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); ++ ++ dev->irq = platform_get_irq(pdev, 0); ++ if (!mem || !dev->irq) ++ goto req_error; ++ ++ mem_size = mem->end - mem->start + 1; ++ if (!request_mem_region(mem->start, mem_size, pdev->dev.driver->name)) { ++ dev_err(&pdev->dev, "resource unavailable\n"); ++ goto req_error; ++ } ++ SET_NETDEV_DEV(dev, &pdev->dev); ++ ++ dev->base_addr = (unsigned long)ioremap_nocache(mem->start, mem_size); ++ if (!dev->base_addr) { ++ dev_err(&pdev->dev, "failed to map can port\n"); ++ ret = -ENOMEM; ++ goto fail_map; ++ } ++ can->can_sys_clock = pdata->clock_frq; ++ platform_set_drvdata(pdev, dev); ++ ret = register_flexcandev(dev, pdata->clock_src); ++ if (ret >= 0) { ++ dev_info(&pdev->dev, "probe for port 0x%lX done\n", ++ dev->base_addr); ++ return ret; ++ } ++ ++ iounmap((unsigned long *)dev->base_addr); ++fail_map: ++ release_mem_region(mem->start, mem_size); ++req_error: ++ free_candev(dev); ++ dev_err(&pdev->dev, "probe failed\n"); ++ return ret; ++} ++ ++static int __devexit mcf548x_can_remove(struct platform_device *pdev) ++{ ++ struct net_device *dev = platform_get_drvdata(pdev); ++ struct resource *mem; ++ ++ platform_set_drvdata(pdev, NULL); ++ unregister_flexcandev(dev); ++ iounmap((unsigned long *)dev->base_addr); ++ ++ mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); ++ release_mem_region(mem->start, mem->end - mem->start + 1); ++ free_candev(dev); ++ return 0; ++} ++ ++static struct platform_driver mcf548x_can_driver = { ++ .driver = { ++ .name = "mcf548x-flexcan", ++ }, ++ .probe = mcf548x_can_probe, ++ .remove = __devexit_p(mcf548x_can_remove), ++}; ++ ++static struct resource mcf548x_can0_resources[] = { ++ [0] = { ++ .start = MCF_MBAR + 0x0000A000, ++ .end = MCF_MBAR + 0x0000A7FF, ++ .flags = IORESOURCE_MEM, ++ }, ++ [1] = { ++ .start = 49, ++ .end = 49, ++ .flags = IORESOURCE_IRQ, ++ }, ++}; ++ ++static struct resource mcf548x_can1_resources[] = { ++ [0] = { ++ .start = MCF_MBAR + 0x0000A800, ++ .end = MCF_MBAR + 0x0000AFFF, ++ .flags = IORESOURCE_MEM, ++ }, ++ [1] = { ++ .start = 55, ++ .end = 55, ++ .flags = IORESOURCE_IRQ, ++ }, ++}; ++ ++ ++static int __init mcf548x_of_to_pdev(void) ++{ ++ unsigned int i; ++ int err = -ENODEV; ++ struct flexcan_platform_data pdata; ++ ++ pdev[0] = platform_device_register_simple("mcf548x-flexcan", 0, ++ mcf548x_can0_resources, 2); ++ if (IS_ERR(pdev[0])) { ++ err = PTR_ERR(pdev[0]); ++ return err; ++ } ++ pdev[1] = platform_device_register_simple("mcf548x-flexcan", 1, ++ mcf548x_can1_resources, 2); ++ if (IS_ERR(pdev[1])) { ++ err = PTR_ERR(pdev[1]); ++ return err; ++ } ++ ++ /* FlexCAN clock */ ++ pdata.clock_frq = 100000000; ++ ++ for (i = 0; i < PDEV_MAX; i++) { ++ err = platform_device_add_data(pdev[i], &pdata, sizeof(pdata)); ++ if (err) ++ return err; ++ } ++ return err; ++} ++ ++int __init mcf548x_can_init(void) ++{ ++ int err = mcf548x_of_to_pdev(); ++ ++ if (err) { ++ printk(KERN_ERR "%s init failed with err=%d\n", ++ mcf548x_can_driver.driver.name, err); ++ return err; ++ } ++ ++ return platform_driver_register(&mcf548x_can_driver); ++} ++ ++void __exit mcf548x_can_exit(void) ++{ ++ int i; ++ platform_driver_unregister(&mcf548x_can_driver); ++ for (i = 0; i < PDEV_MAX; i++) ++ platform_device_unregister(pdev[i]); ++} ++ ++module_init(mcf548x_can_init); ++module_exit(mcf548x_can_exit); ++ ++MODULE_AUTHOR("Andrey Volkov <avolkov@varma-el.com>"); ++MODULE_DESCRIPTION("Freescale MCF548x CAN driver"); ++MODULE_LICENSE("GPL v2"); +--- a/include/asm-m68k/m5485sim.h ++++ b/include/asm-m68k/m5485sim.h +@@ -186,6 +186,8 @@ + #define MCF_PAR_PCIBR MCF_REG16(0x000A4A) + #define MCF_PAR_PSCn(x) MCF_REG08(0x000A4F-((x)&0x3)) + #define MCF_PAR_FECI2CIRQ MCF_REG16(0x000A44) ++#define MCF_PAR_DSPI MCF_REG16(0x000A50) ++#define MCF_PAR_TIMER MCF_REG08(0X000A52) + #define MCF_EPPAR MCF_REG16(0x000F00) + #define MCF_EPIER MCF_REG08(0x000F05) + #define MCF_EPFR MCF_REG08(0x000F0C) +--- /dev/null ++++ b/include/linux/can/dev.h +@@ -0,0 +1,62 @@ ++/* ++ * linux/can/dev.h ++ * ++ * Definitions for CAN controller network devices lib (work in progress) ++ * ++ * * * $Id$ ++ * ++ * Author: Andrey Volkov <avolkov@varma-el.com> ++ * Copyright (c) 2006 Varma Electronics Oy ++ * ++ */ ++ ++#ifndef CAN_DEVICE_H ++#define CAN_DEVICE_H ++ ++#include <linux/version.h> ++#include <linux/can/error.h> ++#include <linux/can/ioctl.h> ++ ++struct can_priv { ++ struct can_device_stats can_stats; ++ ++ /* can-bus oscillator frequency, in Hz, ++ BE CAREFUL! SOME CONTROLLERS (LIKE SJA1000) ++ FOOLISH ABOUT THIS FRQ (for sja1000 as ex. this ++ clock must be xtal clock divided by 2). */ ++ u32 can_sys_clock; ++ ++ /* by default max_brp is equal 64, ++ but for a Freescale TouCAN, as ex., it can be 255*/ ++ u32 max_brp; ++ /* For the mostly all controllers, max_sjw is equal 4, but ++ some, hmm, CAN implementations hardwared it to 1 */ ++ u8 max_sjw; ++ ++ u32 baudrate; /* in bauds */ ++ struct can_bittime bit_time; ++ ++ spinlock_t irq_lock; ++ /* Please hold this lock when touching net_stats/can_stats*/ ++ spinlock_t stats_lock; ++ ++ can_state_t state; ++ can_mode_t mode; ++ can_ctrlmode_t ctrlmode; ++ ++ int (*do_set_bit_time)(struct net_device *dev, struct can_bittime *br); ++ int (*do_get_state) (struct net_device *dev, can_state_t *state); ++ int (*do_set_mode) (struct net_device *dev, can_mode_t mode); ++ int (*do_set_ctrlmode)(struct net_device *dev, can_ctrlmode_t ctrlmode); ++ int (*do_get_ctrlmode)(struct net_device *dev, can_ctrlmode_t *ctrlmode); ++}; ++ ++#define ND2D(_ndev) (_ndev->dev.parent) ++ ++struct net_device *alloc_candev(int sizeof_priv); ++void free_candev(struct net_device *dev); ++ ++int can_calc_bit_time(struct can_priv *can, u32 baudrate, ++ struct can_bittime_std *bit_time); ++ ++#endif /* CAN_DEVICE_H */ +--- /dev/null ++++ b/include/linux/can/ioctl.h +@@ -0,0 +1,152 @@ ++/* ++ * linux/can/ioctl.h ++ * ++ * Definitions for CAN controller setup (work in progress) ++ * ++ * $Id$ ++ * ++ * Send feedback to <socketcan-users@lists.berlios.de> ++ * ++ */ ++ ++#ifndef CAN_IOCTL_H ++#define CAN_IOCTL_H ++ ++#include <linux/sockios.h> ++ ++ ++/* max. 16 private ioctls */ ++ ++#define SIOCSCANBAUDRATE (SIOCDEVPRIVATE+0) ++#define SIOCGCANBAUDRATE (SIOCDEVPRIVATE+1) ++ ++#define SIOCSCANCUSTOMBITTIME (SIOCDEVPRIVATE+2) ++#define SIOCGCANCUSTOMBITTIME (SIOCDEVPRIVATE+3) ++ ++#define SIOCSCANMODE (SIOCDEVPRIVATE+4) ++#define SIOCGCANMODE (SIOCDEVPRIVATE+5) ++ ++#define SIOCSCANCTRLMODE (SIOCDEVPRIVATE+6) ++#define SIOCGCANCTRLMODE (SIOCDEVPRIVATE+7) ++ ++#define SIOCSCANFILTER (SIOCDEVPRIVATE+8) ++#define SIOCGCANFILTER (SIOCDEVPRIVATE+9) ++ ++#define SIOCGCANSTATE (SIOCDEVPRIVATE+10) ++#define SIOCGCANSTATS (SIOCDEVPRIVATE+11) ++ ++#define SIOCSCANERRORCONFIG (SIOCDEVPRIVATE+12) ++#define SIOCGCANERRORCONFIG (SIOCDEVPRIVATE+13) ++ ++/* parameters for ioctls */ ++ ++/* SIOC[SG]CANBAUDRATE */ ++/* baudrate for CAN-controller in bits per second. */ ++/* 0 = Scan for baudrate (Autobaud) */ ++ ++typedef __u32 can_baudrate_t; ++ ++ ++/* SIOC[SG]CANCUSTOMBITTIME */ ++ ++typedef enum CAN_BITTIME_TYPE { ++ CAN_BITTIME_STD, ++ CAN_BITTIME_BTR ++} can_bittime_type_t; ++ ++/* TSEG1 of controllers usually is a sum of synch_seg (always 1), ++ * prop_seg and phase_seg1, TSEG2 = phase_seg2 */ ++ ++struct can_bittime_std { ++ __u32 brp; /* baud rate prescaler */ ++ __u8 prop_seg; /* from 1 to 8 */ ++ __u8 phase_seg1; /* from 1 to 8 */ ++ __u8 phase_seg2; /* from 1 to 8 */ ++ __u8 sjw:7; /* from 1 to 4 */ ++ __u8 sam:1; /* 1 - enable triple sampling */ ++}; ++ ++struct can_bittime_btr { ++ __u8 btr0; ++ __u8 btr1; ++}; ++ ++struct can_bittime { ++ can_bittime_type_t type; ++ union { ++ struct can_bittime_std std; ++ struct can_bittime_btr btr; ++ }; ++}; ++ ++#define CAN_BAUDRATE_UNCONFIGURED ((__u32) 0xFFFFFFFFU) ++#define CAN_BAUDRATE_UNKNOWN 0 ++ ++/* SIOC[SG]CANMODE */ ++ ++typedef __u32 can_mode_t; ++ ++#define CAN_MODE_STOP 0 ++#define CAN_MODE_START 1 ++#define CAN_MODE_SLEEP 2 ++ ++ ++/* SIOC[SG]CANCTRLMODE */ ++ ++typedef __u32 can_ctrlmode_t; ++ ++#define CAN_CTRLMODE_LOOPBACK 0x1 ++#define CAN_CTRLMODE_LISTENONLY 0x2 ++ ++ ++/* SIOCGCANFILTER */ ++ ++typedef __u32 can_filter_t; ++ ++/* filter modes (may vary due to controller specific capabilities) */ ++#define CAN_FILTER_CAPAB 0 /* get filter type capabilities ++ (32 Bit value) */ ++#define CAN_FILTER_MASK_VALUE 1 /* easy bit filter (see struct can_filter) */ ++#define CAN_FILTER_SFF_BITMASK 2 /* bitfield with 2048 bit SFF filter */ ++ /* filters 3 - 31 currently undefined */ ++ ++#define CAN_FILTER_MAX 31 /* max. filter type value */ ++ ++ ++/* SIOCGCANSTATE */ ++ ++typedef __u32 can_state_t; ++ ++#define CAN_STATE_ACTIVE 0 ++#define CAN_STATE_BUS_WARNING 1 ++#define CAN_STATE_BUS_PASSIVE 2 ++#define CAN_STATE_BUS_OFF 3 ++#define CAN_STATE_SCANNING_BAUDRATE 4 ++#define CAN_STATE_STOPPED 5 ++#define CAN_STATE_SLEEPING 6 ++ ++ ++/* SIOCGCANSTATS */ ++ ++struct can_device_stats { ++ int error_warning; ++ int data_overrun; ++ int wakeup; ++ int bus_error; ++ int error_passive; ++ int arbitration_lost; ++ int restarts; ++ int bus_error_at_init; ++}; ++ ++/* SIOC[SG]CANERRORCONFIG */ ++ ++typedef enum CAN_ERRCFG_TYPE { ++ CAN_ERRCFG_MASK, ++ CAN_ERRCFG_BUSERR, ++ CAN_ERRCFG_BUSOFF ++} can_errcfg_type_t; ++ ++/* tbd */ ++ ++#endif /* CAN_IOCTL_H */ +--- /dev/null ++++ b/include/linux/can/version.h +@@ -0,0 +1,22 @@ ++/* ++ * linux/can/version.h ++ * ++ * Version information for the CAN network layer implementation ++ ++ * Author: Urs Thuermann <urs.thuermann@volkswagen.de> ++ * Copyright (c) 2002-2007 Volkswagen Group Electronic Research ++ * All rights reserved. ++ * ++ * Send feedback to <socketcan-users@lists.berlios.de> ++ * ++ */ ++ ++#ifndef CAN_VERSION_H ++#define CAN_VERSION_H ++ ++#define RCSID(s) asm(".section .rodata.str1.1,\"aMS\",@progbits,1\n\t" \ ++ ".string \"" s "\"\n\t.previous\n") ++ ++RCSID("$Id$"); ++ ++#endif /* CAN_VERSION_H */ +--- a/net/can/Makefile ++++ b/net/can/Makefile +@@ -10,3 +10,6 @@ can-raw-objs := raw.o + + obj-$(CONFIG_CAN_BCM) += can-bcm.o + can-bcm-objs := bcm.o ++ ++obj-$(CONFIG_CAN) += candev.o ++candev-objs := dev.o +--- /dev/null ++++ b/net/can/dev.c +@@ -0,0 +1,292 @@ ++/* ++ * $Id$ ++ * ++ * Copyright (C) 2005 Marc Kleine-Budde, Pengutronix ++ * Copyright (C) 2006 Andrey Volkov, Varma Electronics ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the version 2 of the GNU General Public License ++ * as published by the Free Software Foundation ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ++ */ ++ ++#include <linux/module.h> ++#include <linux/netdevice.h> ++#include <linux/if_arp.h> ++#include <linux/can.h> ++#include <linux/can/dev.h> ++ ++MODULE_DESCRIPTION("CAN netdevice library"); ++MODULE_LICENSE("GPL v2"); ++MODULE_AUTHOR("Marc Kleine-Budde <mkl@pengutronix.de>, " ++ "Andrey Volkov <avolkov@varma-el.com>"); ++ ++/* ++ Abstract: ++ Baud rate calculated with next formula: ++ baud = frq/(brp*(1 + prop_seg+ phase_seg1 + phase_seg2)) ++ ++ This calc function based on work of Florian Hartwich and Armin Bassemi ++ "The Configuration of the CAN Bit Timing" ++ (http://www.semiconductors.bosch.de/pdf/CiA99Paper.pdf) ++ ++ Parameters: ++ [in] ++ bit_time_nsec - expected bit time in nanosecs ++ ++ [out] ++ bit_time - calculated time segments, for meaning of ++ each field read CAN standard. ++*/ ++ ++#define DEFAULT_MAX_BRP 64U ++#define DEFAULT_MAX_SJW 4U ++ ++/* All below values in tq units */ ++#define MAX_BIT_TIME 25U ++#define MIN_BIT_TIME 8U ++#define MAX_PROP_SEG 8U ++#define MAX_PHASE_SEG1 8U ++#define MAX_PHASE_SEG2 8U ++ ++int can_calc_bit_time(struct can_priv *can, u32 baudrate, ++ struct can_bittime_std *bit_time) ++{ ++ int best_error = -1; /* Ariphmetic error */ ++ int df, best_df = -1; /* oscillator's tolerance range */ ++ u32 quanta; /*in tq units*/ ++ u32 brp, phase_seg1, phase_seg2, sjw, prop_seg; ++ u32 brp_min, brp_max, brp_expected; ++ u64 tmp; ++ ++ /* baudrate range [1baud,1Mbaud] */ ++ if (baudrate == 0 || baudrate > 1000000UL) ++ return -EINVAL; ++ ++ tmp = (u64)can->can_sys_clock*1000; ++ do_div(tmp, baudrate); ++ brp_expected = (u32)tmp; ++ ++ brp_min = brp_expected / (1000 * MAX_BIT_TIME); ++ if (brp_min == 0) ++ brp_min = 1; ++ if (brp_min > can->max_brp) ++ return -ERANGE; ++ ++ brp_max = (brp_expected + 500 * MIN_BIT_TIME) / (1000 * MIN_BIT_TIME); ++ if (brp_max == 0) ++ brp_max = 1; ++ if (brp_max > can->max_brp) ++ brp_max = can->max_brp; ++ ++ for (brp = brp_min; brp <= brp_max; brp++) { ++ quanta = brp_expected / (brp * 1000); ++ if (quanta < MAX_BIT_TIME && quanta * brp * 1000 != ++ brp_expected) ++ quanta++; ++ if (quanta < MIN_BIT_TIME || quanta > MAX_BIT_TIME) ++ continue; ++ ++ phase_seg2 = min((quanta - 3) / 2, MAX_PHASE_SEG2); ++ for (sjw = can->max_sjw; sjw > 0; sjw--) { ++ for (; phase_seg2 > sjw; phase_seg2--) { ++ u32 err1, err2; ++ phase_seg1 = phase_seg2 % 2 ? ++ phase_seg2-1 : phase_seg2; ++ prop_seg = quanta-1 - phase_seg2 - phase_seg1; ++ /* ++ * FIXME: support of longer lines ++ * (i.e. bigger prop_seg) is more prefered ++ * than support of cheap oscillators ++ * (i.e. bigger df/phase_seg1/phase_seg2) ++ * */ ++ ++ if (prop_seg < phase_seg1) ++ continue; ++ if (prop_seg > MAX_PROP_SEG) ++ goto next_brp; ++ ++ err1 = phase_seg1 * brp * 500 * 1000 / ++ (13 * brp_expected - phase_seg2 * ++ brp * 1000); ++ err2 = sjw * brp * 50 * 1000 / brp_expected; ++ ++ df = min(err1, err2); ++ if (df >= best_df) { ++ unsigned error = abs(brp_expected * 10 / ++ (brp * (1 + prop_seg + ++ phase_seg1 + ++ phase_seg2)) - 10000); ++ ++ if (error > 10 || error > best_error) ++ continue; ++ ++ if (error == best_error && prop_seg < ++ bit_time->prop_seg) ++ continue; ++ ++ best_error = error; ++ best_df = df; ++ bit_time->brp = brp; ++ bit_time->prop_seg = prop_seg; ++ bit_time->phase_seg1 = phase_seg1; ++ bit_time->phase_seg2 = phase_seg2; ++ bit_time->sjw = sjw; ++ bit_time->sam = ++ (bit_time->phase_seg1 > 3); ++ } ++ } ++ } ++next_brp: ; ++ } ++ ++ if (best_error < 0) ++ return -EDOM; ++ return 0; ++} ++EXPORT_SYMBOL(can_calc_bit_time); ++ ++static int can_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) ++{ ++ struct can_priv *can = netdev_priv(dev); ++ struct can_bittime *bt = (struct can_bittime *)&ifr->ifr_ifru; ++ ulong *baudrate = (ulong *)&ifr->ifr_ifru; ++ int ret = -EOPNOTSUPP; ++ ++ dev_dbg(ND2D(dev), "(%s) 0x%08x %p\n", __func__, cmd, &ifr->ifr_ifru); ++ ++ switch (cmd) { ++ case SIOCSCANBAUDRATE: ++ if (can->do_set_bit_time) { ++ struct can_bittime bit_time; ++ ret = can_calc_bit_time(can, *baudrate, &bit_time.std); ++ if (ret != 0) ++ break; ++ bit_time.type = CAN_BITTIME_STD; ++ ret = can->do_set_bit_time(dev, &bit_time); ++ if (!ret) { ++ can->baudrate = *baudrate; ++ can->bit_time = bit_time; ++ } ++ } ++ break; ++ case SIOCGCANBAUDRATE: ++ *baudrate = can->baudrate; ++ ret = 0; ++ break; ++ case SIOCSCANCUSTOMBITTIME: ++ if (can->do_set_bit_time) { ++ ret = can->do_set_bit_time(dev, bt); ++ if (!ret) { ++ can->bit_time = *bt; ++ if (bt->type == CAN_BITTIME_STD && bt->std.brp) { ++ can->baudrate = can->can_sys_clock / ++ (bt->std.brp * (1 + bt->std.prop_seg + ++ bt->std.phase_seg1 + ++ bt->std.phase_seg2)); ++ } else ++ can->baudrate = CAN_BAUDRATE_UNKNOWN; ++ } ++ } ++ break; ++ case SIOCGCANCUSTOMBITTIME: ++ *bt = can->bit_time; ++ ret = 0; ++ break; ++ case SIOCSCANMODE: ++ if (can->do_set_mode) { ++ can_mode_t mode = ++ *((can_mode_t *)(&ifr->ifr_ifru)); ++ if (mode == CAN_MODE_START && ++ can->baudrate == CAN_BAUDRATE_UNCONFIGURED) { ++ dev_info(ND2D(dev), "Impossible to start \ ++ on UNKNOWN speed\n"); ++ ret = EINVAL; ++ } else ++ return can->do_set_mode(dev, mode); ++ } ++ break; ++ case SIOCGCANMODE: ++ *((can_mode_t *)(&ifr->ifr_ifru)) = can->mode; ++ ret = 0; ++ break; ++ case SIOCSCANCTRLMODE: ++ if (can->do_set_ctrlmode) { ++ can_ctrlmode_t ctrlmode = ++ *((can_ctrlmode_t *)(&ifr->ifr_ifru)); ++ return can->do_set_ctrlmode(dev, ctrlmode); ++ } ++ break; ++ case SIOCGCANCTRLMODE: ++ *((can_ctrlmode_t *)(&ifr->ifr_ifru)) = can->ctrlmode; ++ ret = 0; ++ break; ++ case SIOCSCANFILTER: ++ break; ++ case SIOCGCANFILTER: ++ break; ++ case SIOCGCANSTATE: ++ if (can->do_get_state) ++ return can->do_get_state(dev, ++ (can_state_t *)(&ifr->ifr_ifru)); ++ break; ++ case SIOCGCANSTATS: ++ *((struct can_device_stats *)(&ifr->ifr_ifru)) = can->can_stats; ++ ret = 0; ++ break; ++ } ++ ++ return ret; ++} ++ ++static void can_setup(struct net_device *dev) ++{ ++ dev->type = ARPHRD_CAN; ++ dev->mtu = sizeof(struct can_frame); ++ dev->do_ioctl = can_ioctl; ++ dev->hard_header_len = 0; ++ dev->addr_len = 0; ++ dev->tx_queue_len = 10; ++ ++ /* New-style flags. */ ++ dev->flags = IFF_NOARP; ++ dev->features = NETIF_F_NO_CSUM; ++} ++ ++/* ++ * Function alloc_candev ++ * Allocates and sets up an CAN device ++ */ ++struct net_device *alloc_candev(int sizeof_priv) ++{ ++ struct net_device *dev; ++ struct can_priv *priv; ++ ++ dev = alloc_netdev(sizeof_priv, "can%d", can_setup); ++ if (!dev) ++ return NULL; ++ ++ priv = netdev_priv(dev); ++ ++ priv->baudrate = CAN_BAUDRATE_UNCONFIGURED; ++ priv->max_brp = DEFAULT_MAX_BRP; ++ priv->max_sjw = DEFAULT_MAX_SJW; ++ spin_lock_init(&priv->irq_lock); ++ ++ return dev; ++} ++EXPORT_SYMBOL(alloc_candev); ++ ++void free_candev(struct net_device *dev) ++{ ++ free_netdev(dev); ++} ++EXPORT_SYMBOL(free_candev); diff --git a/target/linux/coldfire/patches/078-m547x_8x_pci_initial.patch b/target/linux/coldfire/patches/078-m547x_8x_pci_initial.patch new file mode 100644 index 0000000000..b311773c33 --- /dev/null +++ b/target/linux/coldfire/patches/078-m547x_8x_pci_initial.patch @@ -0,0 +1,2623 @@ +From 7f92b68c12c1891435c75f7f83a6390b4c73eaa6 Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Thu, 10 Jul 2008 19:17:11 -0600 +Subject: [PATCH] Add PCI to m547x/m548x. + +LTIBName: m547x-8x-pci-initial +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +Signed-off-by: Shrek Wu <b16972@freescale.com> +--- + arch/m68k/Kconfig | 4 +- + arch/m68k/coldfire/Makefile | 7 +- + arch/m68k/coldfire/ints.c | 8 +- + arch/m68k/coldfire/mcf548x-pci.c | 934 +++++++++++++++++++++++++++++++++++++ + arch/m68k/kernel/Makefile | 3 + + arch/m68k/kernel/bios32_mcf548x.c | 631 +++++++++++++++++++++++++ + arch/m68k/kernel/dma.c | 32 +- + arch/m68k/mm/kmap.c | 11 +- + drivers/pci/access.c | 16 +- + drivers/usb/host/Makefile | 2 +- + include/asm-m68k/5445x_pci.h | 94 ++++ + include/asm-m68k/548x_pci.h | 99 ++++ + include/asm-m68k/io.h | 65 +++- + include/asm-m68k/m5485pci.h | 330 +++++++++++++ + include/asm-m68k/pci.h | 96 +---- + include/asm-m68k/raw_io.h | 26 + + include/asm-m68k/virtconvert.h | 5 + + include/linux/pci.h | 2 + + 18 files changed, 2250 insertions(+), 115 deletions(-) + create mode 100644 arch/m68k/coldfire/mcf548x-pci.c + create mode 100644 arch/m68k/kernel/bios32_mcf548x.c + create mode 100644 include/asm-m68k/5445x_pci.h + create mode 100644 include/asm-m68k/548x_pci.h + create mode 100644 include/asm-m68k/m5485pci.h + +--- a/arch/m68k/Kconfig ++++ b/arch/m68k/Kconfig +@@ -175,8 +175,8 @@ config HADES + to use this kernel on a Hades, say Y here; otherwise say N. + + config PCI +- bool +- depends on HADES || M54455 ++ bool "PCI bus support" ++ depends on HADES || M54455 || M547X_8X + default n + help + Find out whether you have a PCI motherboard. PCI is the name of a +--- a/arch/m68k/coldfire/Makefile ++++ b/arch/m68k/coldfire/Makefile +@@ -3,12 +3,17 @@ + # + + obj-y:= entry.o config.o cache.o signal.o muldi3.o traps.o ints.o +- ++ifdef CONFIG_M5445X + ifneq ($(strip $(CONFIG_USB) $(CONFIG_USB_GADGET_MCF5445X)),) + obj-y += usb.o usb/ + endif ++endif + ++ifdef CONFIG_M547X_8X ++obj-$(CONFIG_PCI) += mcf548x-pci.o ++else + obj-$(CONFIG_PCI) += pci.o mcf5445x-pci.o iomap.o ++endif + obj-$(CONFIG_M5445X) += mcf5445x-devices.o + obj-$(CONFIG_M547X_8X) += m547x_8x-devices.o + obj-$(CONFIG_M547X_8X) += mcf548x-devices.o +--- a/arch/m68k/coldfire/ints.c ++++ b/arch/m68k/coldfire/ints.c +@@ -192,6 +192,8 @@ int setup_irq(unsigned int irq, struct i + /* Can't share interrupts unless both agree to */ + if (!((*prev)->flags & node->flags & IRQF_SHARED)) { + spin_unlock_irqrestore(&contr->lock, flags); ++ printk(KERN_INFO "%s: -BUSY-Incorrect IRQ %d \n", ++ __FUNCTION__, irq); + return -EBUSY; + } + while (*prev) +@@ -219,9 +221,11 @@ int request_irq(unsigned int irq, + struct irq_node *node = get_irq_node(); + int res; + +- if (!node) ++ if (!node) { ++ printk(KERN_INFO "%s:get_irq_node error %x\n", ++ __FUNCTION__,(unsigned int) node); + return -ENOMEM; +- ++ } + node->handler = handler; + node->flags = flags; + node->dev_id = dev_id; +--- /dev/null ++++ b/arch/m68k/coldfire/mcf548x-pci.c +@@ -0,0 +1,934 @@ ++/* ++ * ColdFire 547x/548x PCI Host Controller functions ++ */ ++#include <linux/kernel.h> ++#include <linux/types.h> ++#include <linux/init.h> ++#include <linux/mm.h> ++#include <linux/string.h> ++#include <linux/pci.h> ++#include <linux/ioport.h> ++#include <linux/slab.h> ++#include <linux/version.h> ++#include <linux/interrupt.h> ++ ++#include <linux/dma-mapping.h> ++#include <asm/coldfire.h> ++#include <asm/io.h> ++#include <asm/m5485sim.h> ++#include <asm/m5485pci.h> ++#include <asm/irq.h> ++#include <asm/pci.h> ++#include <asm/virtconvert.h> ++ ++ ++#undef DEBUG ++//#define DEBUG ++ ++#ifdef DEBUG ++//#define DBG(x...) printk(KERN_DEBUG x) ++#define DBG(x...) printk(x) ++#else ++#define DBG(x...) ++#endif ++ ++#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,5,75)) ++# define irqreturn_t void ++# define IRQ_HANDLED ++# define IRQ_NONE ++#endif ++ ++/* ++ * Bridge configration dafaults ++ */ ++#define PCI_RETRIES 0 ++#define PCI_CACHE_LINE 8 ++#define PCI_MINGNT 1 ++#define PCI_MAXLAT 42 ++ ++ ++/* ++ * Initiator windows setting ++ */ ++#define HOST_MEM_BASE 0xD0000000 /* ColdFire Memory window base */ ++#define PCI_MEM_BASE 0xD0000000 /* PCI Memory window base */ ++#define PCI_MEM_SIZE 0x08000000 /* Memory window size (128M) */ ++#define HOST_IO_BASE 0xD8000000 /* ColdFire I/O window base */ ++#define PCI_IO_BASE_ADDR 0x00000000 /* PCI I/O window base */ ++#define PCI_IO_SIZE 0x00010000 /* I/O window size (64K) */ ++#define HOST_CFG_BASE 0xD8000000 /* ColdFire config window base */ ++#define HOST_DMA_BASE CONFIG_SDRAM_BASE /* ColdFire PCI-DMA window base */ ++#define PCI_HDR_BASE (MCF_MBAR+0xB00)/* ColdFire config registers */ ++ ++#define PCI_MEM_MASK (PCI_MEM_SIZE-1) ++#define PCI_IO_MASK (PCI_IO_SIZE-1) ++ ++/* Macro to set initiator window */ ++#define WxBAR(host_address, pci_address, size) \ ++ (((host_address) & 0xff000000) | \ ++ ((((size)-1) & 0xff000000) >> 8) | \ ++ ((pci_address) & 0xff000000) >> 16) ++ ++/* ++ * BIOS internal data ++ */ ++static u8 revision; /* controller revision */ ++ ++/* ++ * Board specific setting ++ */ ++const unsigned int irq_lines[] = { 5, 7 }; ++ ++#define N_SLOTS (sizeof(board_info) / sizeof(board_info[0])) ++#define N_IRQS (sizeof(irq_lines) / sizeof(irq_lines[0])) ++#define BRIDGE_SLOT 0 ++ ++const struct slotinfo { ++ unsigned char idsel; /* device number */ ++ unsigned char irq; /* external IRQ */ ++ unsigned char req; /* REQ line number */ ++ unsigned char gnt; /* GNT line number */ ++} board_info[] = { ++ {0, 0, 0, 0}, /* Bridge */ ++ {17, 5, 1, 1}, /* Slot #1 */ ++ {18, 5, 2, 2}, /* Slot #2 */ ++ {20, 7, 3, 3}, /* Slot #3 */ ++ {21, 7, 4, 4}, /* Slot #4 */ ++}; ++ ++/************************************************************************/ ++ ++/* ++ * static int mk_conf_addr() ++ * ++ * Return type0 or type1 configuration address ++ * by the means of device address and PCI dword location ++ * 0 - for not existing slots ++ */ ++static int mk_conf_addr(/*struct pci_dev *dev*/struct pci_bus *bus, unsigned int devfn, int where) ++{ ++ int slot, func, address, idsel, dev_fn; ++ ++ if (bus->number) { ++ address = MCF_PCICAR_E | (bus->number << 16) | ++ (devfn << 8) | (where & 0xfc); ++ } else { ++ slot = PCI_SLOT(devfn); ++ if (slot > N_SLOTS || slot == BRIDGE_SLOT) ++ return 0; ++ else { ++ func = PCI_FUNC(devfn); ++ idsel = board_info[slot].idsel; ++ ++ dev_fn = PCI_DEVFN(idsel, func); ++ address = MCF_PCICAR_E | (bus->number << 16) | ++ (dev_fn << 8) | (where & 0xfc); ++ } ++ } ++ ++ return (address); ++} ++ ++/* ++ * static int read_config_byte() ++ * ++ * Read a byte from configuration space of specified device ++ */ ++static int read_config_byte(/*struct pci_dev *dev*/struct pci_bus *bus, unsigned int devfn, int where, u8 *value) ++{ ++ int slot; ++ int address; ++ int result; ++ ++ *value = 0xff; ++ result = PCIBIOS_SUCCESSFUL; ++ ++ slot = PCI_SLOT(devfn); ++ if (slot == BRIDGE_SLOT) { ++ if (where <= 0x40) ++ *value = *(volatile u8 *) (PCI_HDR_BASE + (where ^ 3)); ++ else ++ *value = 0; ++ } else { ++ address = mk_conf_addr(bus, devfn, where); ++ if (!address) ++ result = PCIBIOS_DEVICE_NOT_FOUND; ++ else { ++ MCF_PCICAR = address; ++ *value = *(volatile u8 *) (HOST_CFG_BASE + (where & 3)); ++ } ++ } ++ __asm__ __volatile__("nop"); ++ __asm__ __volatile__("nop"); ++ MCF_PCICAR &= ~MCF_PCICAR_E; ++ ++ DBG("PCI: read_config_byte bus=%d, devfn=%d, addr=0x%02X, val=0x%02X, ret=%02X\n", ++ bus->number, devfn, where, *value, result); ++ ++ return (result); ++} ++ ++/* ++ * static int read_config_word() ++ * ++ * Read a word from configuration space of specified device ++ */ ++static int read_config_word(/*struct pci_dev *dev*/struct pci_bus *bus, unsigned int devfn, int where, u16 *value) ++{ ++ int slot; ++ int address; ++ int result; ++ ++ *value = 0xffff; ++ result = PCIBIOS_SUCCESSFUL; ++ ++ if (where & 0x1) ++ result = PCIBIOS_BAD_REGISTER_NUMBER; ++ else { ++ slot = PCI_SLOT(devfn); ++ if (slot == BRIDGE_SLOT) { ++ if (where <= 0x3f) ++ *value = ++ *(volatile u16 *) (PCI_HDR_BASE + ++ (where ^ 2)); ++ else ++ *value = 0; ++ } else { ++ address = mk_conf_addr(bus, devfn, where); ++ if (!address) ++ result = PCIBIOS_DEVICE_NOT_FOUND; ++ else { ++ MCF_PCICAR = address; ++ *value = le16_to_cpu(*(volatile u16 *) ++ (HOST_CFG_BASE + ++ (where & 2))); ++ } ++ } ++ } ++ __asm__ __volatile__("nop"); ++ __asm__ __volatile__("nop"); ++ MCF_PCICAR &= ~MCF_PCICAR_E; ++ ++ DBG("PCI: read_config_word bus=%d, devfn=%d, addr=0x%02X, val=0x%04X ret=%02X\n", ++ bus->number, devfn, where, *value, result); ++ ++ return (result); ++} ++ ++/* ++ * static int read_config_dword() ++ * ++ * Read a long word from configuration space of specified device ++ */ ++static int read_config_dword(/*struct pci_dev *dev*/struct pci_bus *bus, unsigned int devfn, int where, u32 *value) ++{ ++ int slot; ++ int address; ++ int result; ++ ++ *value = 0xffffffff; ++ result = PCIBIOS_SUCCESSFUL; ++ ++ if (where & 0x3) ++ result = PCIBIOS_BAD_REGISTER_NUMBER; ++ else { ++ slot = PCI_SLOT(devfn); ++ if (slot == BRIDGE_SLOT) { ++ if (where <= 0x3d) ++ *value = ++ *(volatile u32 *) (PCI_HDR_BASE + where); ++ else ++ *value = 0; ++ __asm__ __volatile__("nop"); ++ __asm__ __volatile__("nop"); ++ } else { ++ address = mk_conf_addr(bus, devfn, where); ++ if (!address) ++ result = PCIBIOS_DEVICE_NOT_FOUND; ++ else { ++ MCF_PCICAR = address; ++ *value = le32_to_cpu(*(volatile u32 *) ++ (HOST_CFG_BASE)); ++ __asm__ __volatile__("nop"); ++ __asm__ __volatile__("nop"); ++ if (bus->number != 0 && revision < 1) { ++ volatile u32 temp; ++ ++ MCF_PCICAR |= 0xff0000; ++ temp = *(volatile u32 *) (HOST_CFG_BASE); ++ } ++ } ++ } ++ } ++ ++ MCF_PCICAR &= ~MCF_PCICAR_E; ++ ++ DBG("PCI: read_config_dword bus=%d, devfn=%d, addr=0x%02X, value=0x%08X ret=%02X\n", ++ bus->number, devfn, where, *value, result); ++ ++ return (result); ++} ++ ++/* ++ * static int write_config_byte() ++ * ++ * Write a byte to configuration space of specified device ++ */ ++static int write_config_byte(/*struct pci_dev *dev*/struct pci_bus *bus, unsigned int devfn, int where, u8 value) ++{ ++ int slot; ++ int address; ++ int result; ++ ++ result = PCIBIOS_SUCCESSFUL; ++ ++ slot = PCI_SLOT(devfn); ++ if (slot == BRIDGE_SLOT) { ++ if (where <= 0x40) ++ *(volatile u8 *) (PCI_HDR_BASE + (where ^ 3)) = value; ++ } else { ++ address = mk_conf_addr(bus, devfn, where); ++ if (!address) ++ result = PCIBIOS_DEVICE_NOT_FOUND; ++ else { ++ MCF_PCICAR = address; ++ *(volatile u8 *) (HOST_CFG_BASE + (where & 3)) = value; ++ } ++ } ++ __asm__ __volatile__("nop"); ++ __asm__ __volatile__("nop"); ++ MCF_PCICAR &= ~MCF_PCICAR_E; ++ ++ DBG("PCI: write_config_byte bus=%d, devfn=%d, addr=0x%02X, value=0x%02X ret=%02X\n", ++ bus->number, devfn, where, value, result); ++ ++ return (result); ++} ++ ++/* ++ * static int write_config_word() ++ * ++ * Write a word to configuration space of specified device ++ */ ++static int write_config_word(/*struct pci_dev *dev*/struct pci_bus *bus, unsigned int devfn, int where, u16 value) ++{ ++ int slot; ++ int address; ++ int result; ++ ++ result = PCIBIOS_SUCCESSFUL; ++ ++ if (where & 0x1) ++ result = PCIBIOS_BAD_REGISTER_NUMBER; ++ else { ++ slot = PCI_SLOT(devfn); ++ if (slot == BRIDGE_SLOT) { ++ if (where <= 0x3f) ++ *(volatile u16 *) (PCI_HDR_BASE + (where ^ 2)) = ++ value; ++ } else { ++ address = mk_conf_addr(bus, devfn, where); ++ if (!address) ++ result = PCIBIOS_DEVICE_NOT_FOUND; ++ else { ++ MCF_PCICAR = address; ++ *(volatile u16 *) (HOST_CFG_BASE + (where & 2)) = ++ cpu_to_le16(value); ++ } ++ } ++ } ++ __asm__ __volatile__("nop"); ++ __asm__ __volatile__("nop"); ++ MCF_PCICAR &= ~MCF_PCICAR_E; ++ ++ DBG("PCI: write_config_word bus=%d, devfn=%d, addr=0x%02X, value=0x%04X ret=%02X\n", ++ bus->number, devfn, where, value, result); ++ ++ return (result); ++} ++ ++/* ++ * static int write_config_dword() ++ * ++ * Write a long word to configuration space of specified device ++ */ ++static int write_config_dword(/*struct pci_dev *dev*/struct pci_bus *bus, unsigned int devfn, int where, u32 value) ++{ ++ int slot; ++ int address; ++ int result; ++ ++ result = PCIBIOS_SUCCESSFUL; ++ ++ if (where & 0x3) ++ result = PCIBIOS_BAD_REGISTER_NUMBER; ++ else { ++ slot = PCI_SLOT(devfn); ++ if (slot == BRIDGE_SLOT) { ++ if (where <= 0x3d) ++ *(volatile u32 *) (PCI_HDR_BASE + where) = ++ value; ++ } else { ++ address = mk_conf_addr(bus, devfn, where); ++ if (!address) ++ result = PCIBIOS_DEVICE_NOT_FOUND; ++ else { ++ MCF_PCICAR = address; ++ *(volatile u32 *) (HOST_CFG_BASE) = ++ cpu_to_le32(value); ++ } ++ } ++ } ++ __asm__ __volatile__("nop"); ++ __asm__ __volatile__("nop"); ++ MCF_PCICAR &= ~MCF_PCICAR_E; ++ ++ DBG("PCI: write_config_dword dev=%d, fn=%d, addr=0x%02X, value=0x%08X ret=%02X\n", ++ PCI_SLOT(devfn), PCI_FUNC(devfn), where, value, result); ++ ++ return (result); ++} ++ ++static int config_read(struct pci_bus *bus, unsigned int devfn, ++ int where, int size, u32 * val) ++{ ++ switch (size) { ++ case 1: ++ return read_config_byte(bus, devfn, where, (u8 *) val); ++ case 2: ++ return read_config_word(bus, devfn, where, (u16 *) val); ++ default: ++ return read_config_dword(bus, devfn, where, val); ++ } ++} ++ ++static int config_write(struct pci_bus *bus, unsigned int devfn, ++ int where, int size, u32 val) ++{ ++ switch (size) { ++ case 1: ++ return write_config_byte(bus, devfn, where, (u8) val); ++ case 2: ++ return write_config_word(bus, devfn, where, (u16) val); ++ default: ++ return write_config_dword(bus, devfn, where, val); ++ } ++} ++ ++/* ++ * configuration routines entry points ++ */ ++static struct pci_ops bus_ops = { ++ read: config_read, ++ write: config_write ++}; ++ ++/************************************************************************/ ++ ++/* ++ * u8 pci_inb() ++ * ++ * Read a byte at specified address from I/O space ++ */ ++unsigned char pci_inb(long addr) ++{ ++ char value; ++ ++ value = *(volatile unsigned char *) (HOST_IO_BASE | (addr & PCI_IO_MASK)); ++ DBG("PCI: inb addr=0x%08X, value=0x%02X\n", addr, value); ++ ++ return (unsigned char) value; ++} ++ ++ ++/* ++ * u16 pci_inw() ++ * ++ * Read a word at specified address from I/O space ++ */ ++unsigned short pci_inw(long addr) ++{ ++ short value; ++ volatile unsigned short *ptr; ++ ++ ptr = (volatile unsigned short *) (HOST_IO_BASE | (addr & PCI_IO_MASK)); ++ value = le16_to_cpu(*ptr); ++ ++ DBG("PCI: inw addr=0x%08X, value=0x%04X\n", addr, value); ++ return (unsigned short) value; ++} ++ ++/* ++ * u16 pci_raw_inw() ++ * ++ * Read a raw word at specified address from I/O space ++ */ ++unsigned short pci_raw_inw(long addr) ++{ ++ short value; ++ volatile unsigned short *ptr; ++ ++ ptr = (volatile unsigned short *) (HOST_IO_BASE | (addr & PCI_IO_MASK)); ++ value = *ptr; ++ ++ DBG("PCI: raw_inw addr=0x%08X, value=0x%04X\n", addr, value); ++ return (unsigned short) value; ++} ++ ++/* ++ * u32 pci_inl() ++ * ++ * Read a dword at specified address from I/O space ++ */ ++unsigned long pci_inl(long addr) ++{ ++ long value; ++ volatile unsigned long *ptr; ++ ++ ptr = (volatile unsigned long *) (HOST_IO_BASE | (addr & PCI_IO_MASK)); ++ value = le32_to_cpu(*ptr); ++ ++ DBG("PCI: inl addr=0x%08X, value=0x%08X\n", addr, value); ++ return (unsigned long) value; ++} ++ ++/* ++ * u32 pci_raw_inl() ++ * ++ * Read a raw dword at specified address from I/O space ++ */ ++unsigned long pci_raw_inl(long addr) ++{ ++ long value; ++ volatile unsigned long *ptr; ++ ++ ptr = (volatile unsigned long *) (HOST_IO_BASE | (addr & PCI_IO_MASK)); ++ value = *ptr; ++ ++ DBG("PCI: raw_inl addr=0x%08X, value=0x%08X\n", addr, value); ++ return (unsigned long) value; ++} ++ ++/* ++ * void pci_outb() ++ * ++ * Write a byte value at specified address to I/O space ++ */ ++void pci_outb( unsigned char value, long addr) ++{ ++ ++ *(volatile unsigned char *) (HOST_IO_BASE | (addr & PCI_IO_MASK)) = value; ++ DBG("PCI: outb addr=0x%08X, value=0x%02X\n", addr, value); ++} ++ ++ ++/* ++ * void pci_outw() ++ * ++ * Write a word value at specified address to I/O space ++ */ ++void pci_outw(volatile unsigned short value, volatile long addr) ++{ ++ volatile unsigned short *ptr; ++ ++ ptr = (volatile unsigned short *) (HOST_IO_BASE | (addr & PCI_IO_MASK)); ++ *ptr = cpu_to_le16(value); ++ DBG("PCI: outw addr=0x%08X, value=0x%04X\n", addr, value); ++} ++ ++/* ++ * void pci_raw_outw() ++ * ++ * Write a raw word value at specified address to I/O space ++ */ ++void pci_raw_outw(volatile unsigned short value, volatile long addr) ++{ ++ volatile unsigned short *ptr; ++ ++ ptr = (volatile unsigned short *) (HOST_IO_BASE | (addr & PCI_IO_MASK)); ++ *ptr = value; ++ DBG("PCI: raw_outw addr=0x%08X, value=0x%04X\n", addr, value); ++} ++ ++/* ++ * void pci_outl() ++ * ++ * Write a long word value at specified address to I/O space ++ */ ++void pci_outl(volatile unsigned long value, volatile long addr) ++{ ++ volatile unsigned long *ptr; ++ ++ ptr = (volatile unsigned long *)(HOST_IO_BASE | (addr & PCI_IO_MASK)); ++ *ptr = cpu_to_le32(value); ++ DBG("PCI: outl addr=0x%08X, value=0x%08X\n", addr, value); ++} ++ ++/* ++ * void pci_raw_outl() ++ * ++ * Write a raw long word value at specified address to I/O space ++ */ ++void pci_raw_outl(volatile unsigned long value, volatile long addr) ++{ ++ volatile unsigned long *ptr; ++ ++ ptr = (volatile unsigned long *)(HOST_IO_BASE | (addr & PCI_IO_MASK)); ++ *ptr = value; ++ DBG("PCI: raw_outl addr=0x%08X, value=0x%08X\n", addr, value); ++} ++ ++/* ++ * void pci_insb() ++ * ++ * Read several byte values from specified I/O port ++ */ ++void pci_insb(volatile unsigned char *addr, unsigned char *buf, int len) ++{ ++ for (; len--; buf++) ++ *buf = pci_inb((unsigned long)addr); ++ DBG("PCI: pci_insb addr=0x%08X, buf=%p, len=%d\n", addr, buf, len); ++} ++ ++ ++/* ++ * void pci_insw() ++ * ++ * Read several word values from specified I/O port ++ */ ++void pci_insw(volatile unsigned short *addr, unsigned short *buf, int len) ++{ ++ for (; len--; buf++) ++ *buf = pci_inw((unsigned long)addr); ++ DBG("PCI: pci_insw addr=0x%08X, buf=%p, len=%d\n", addr, buf, len); ++} ++ ++/* ++ * void pci_insl() ++ * ++ * Read several dword values from specified I/O port ++ */ ++void pci_insl(volatile unsigned long *addr, unsigned long *buf, int len) ++{ ++ for (; len--; buf++) ++ *buf = pci_inl((unsigned long)addr); ++ DBG("PCI: pci_insl addr=0x%08X, buf=%p, len=%d\n", addr, buf, len); ++} ++ ++/* ++ * void pci_outsb() ++ * ++ * Write several byte values to specified I/O port ++ */ ++void pci_outsb(volatile unsigned char *addr, const unsigned char *buf, int len) ++{ ++ for (; len--; buf++) ++ pci_outb((unsigned long)addr, *buf); ++ DBG("PCI: pci_outsb addr=0x%08X, buf=%p, len=%d\n", addr, buf, len); ++} ++ ++/* ++ * void pci_outsw() ++ * ++ * Write several word values to specified I/O port ++ */ ++void pci_outsw(volatile unsigned short *addr, const unsigned short *buf, int len) ++{ ++ for (; len--; buf++) ++ pci_outw((unsigned long)addr, *buf); ++ DBG("PCI: pci_outsw addr=0x%08X, buf=%p, len=%d\n", addr, buf, len); ++} ++ ++/* ++ * void pci_outsl() ++ * ++ * Write several dword values to specified I/O port ++ */ ++void pci_outsl(volatile unsigned long *addr, const unsigned long *buf, int len) ++{ ++ for (; len--; buf++) ++ pci_outl((unsigned long)addr, *buf); ++ DBG("PCI: pci_outsl addr=0x%08X, buf=%p, len=%d\n", addr, buf, len); ++} ++ ++/* ++ * void pci_xlb_handler() ++ * ++ * PCI XLB interrupt handler ++ */ ++irqreturn_t xlb_interrupt(int irq, void *dev) ++{ ++ volatile int xlb_error = MCF_PCIISR; ++ ++ /* Acknowlege interrupt */ ++ MCF_PCIISR = xlb_error; ++ ++ /* Dump interrupt reason */ ++ if (xlb_error & MCF_PCIISR_RE) ++ DBG("PCI: Retry Error Received\n"); ++ ++ if (xlb_error & MCF_PCIISR_IA) ++ DBG("PCI: Initiator Abort Received\n"); ++ ++ if (xlb_error & MCF_PCIISR_TA) ++ DBG("PCI: Target Abort Received\n"); ++ ++ return IRQ_HANDLED; ++} ++ ++ ++/* ++ * void pci_arbiter_handler() ++ * ++ * PCI arbiter interrupt handler ++ */ ++irqreturn_t arb_interrupt(int irq, void *dev) ++{ ++ volatile unsigned long arb_error = MCF_PCIARB_PASR; ++ ++ /* Acknowlege interrupt */ ++ printk("%s\n",__FUNCTION__); ++ MCF_PCIARB_PASR = arb_error; ++ ++ if (arb_error & MCF_PCIARB_PASR_ITLMBK) { ++ DBG("PCI: coldfire master time-out\n"); ++ ++ /* Set infinite number of retries */ ++ MCF_PCIICR &= ~0xFF; ++ } ++ ++ if (arb_error & MCF_PCIARB_PASR_EXTMBK(0x1F)) { ++ arb_error >>= 17; ++ DBG("PCI: external master time-out (mask = 0x%X)\n", arb_error); ++ ++ /* raise arbitration priority level */ ++ MCF_PCIARB_PACR = MCF_PCIARB_PACR_EXTMPRI(arb_error); ++ } ++ ++ return IRQ_HANDLED; ++} ++ ++ ++/* ++ * void pci_eint_handler() ++ * ++ * Eport interrupt handler ++ */ ++irqreturn_t eint_handler(int irq, void *dev) ++{ ++ /* Just acknowlege interrupt and exit */ ++ MCF_EPFR = 0x1 << (irq - 64); ++ return IRQ_HANDLED; ++} ++ ++ ++/* ++ * void __init coldfire_fixup(int pci_modify) ++ * ++ * Assign IRQ numbers as used by Linux to the interrupt pins ++ * of the PCI cards. ++ */ ++static void __init coldfire_fixup(int pci_modify) ++{ ++ struct pci_dev *dev; ++ unsigned char slot, pin; ++ ++ DBG("%s\n",__FUNCTION__); ++#ifdef NL_ORIGINAL ++ pci_for_each_dev(dev) { ++#else ++ dev = NULL; ++ while ((dev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) { ++#endif ++ if (dev->class >> 16 != PCI_BASE_CLASS_BRIDGE) { ++ slot = PCI_SLOT(dev->devfn); ++ dev->irq = 64 + board_info[slot].irq; ++ ++ /* Check if device needs interrupt */ ++#ifdef NL_ORIGINAL ++ pcibios_read_config_byte( ++ dev->bus->number, dev->devfn, ++ PCI_INTERRUPT_PIN, &pin); ++ ++ if ( pin ) { ++ pcibios_write_config_byte( ++ dev->bus->number, dev->devfn, ++ PCI_INTERRUPT_LINE, dev->irq); ++ } ++#else ++ pci_read_config_byte(dev, ++ PCI_INTERRUPT_PIN, &pin); ++ ++ if ( pin ) { ++ pci_write_config_byte(dev, ++ PCI_INTERRUPT_LINE, dev->irq); ++ } ++#endif ++ } ++ } ++} ++ ++static void __init configure_device(struct pci_dev *dev) ++{ ++ /* TODO: This should depend from disable_pci_burst setting */ ++ DBG("%s\n",__FUNCTION__); ++#ifdef NL_ORIGINAL ++ pcibios_write_config_byte(bus, devfn, PCI_CACHE_LINE_SIZE, PCI_CACHE_LINE); ++#else ++ pci_write_config_byte(dev, PCI_CACHE_LINE_SIZE, PCI_CACHE_LINE); ++#endif ++} ++ ++struct pci_bus_info *__init init_coldfire_pci(void) ++{ ++ static struct pci_bus_info bus; ++ int i; ++ int pci_mem_va; ++ static char irq_name[N_IRQS][15]; ++ ++ /* Get controller revision */ ++ revision = MCF_PCICCRIR; ++ printk("ColdFire PCI Host Bridge (Rev. %d) detected:" ++ "MEMBase %x,MEMLen %x,IOBase %x,IOLen %x\n", ++ revision, HOST_MEM_BASE, PCI_MEM_SIZE - 1, 0, PCI_IO_SIZE - 1); ++ ++ /* Setup bus info structure. */ ++ memset(&bus, 0, sizeof (struct pci_bus_info)); ++ ++ /* Request intiator memory resource */ ++ bus.mem_space.start = PCI_MEM_BASE;//HOST_MEM_BASE; ++ bus.mem_space.end = bus.mem_space.start + PCI_MEM_SIZE - 1; ++ bus.mem_space.name = "PCI Bus #0"; ++ if (request_resource(&iomem_resource, &bus.mem_space) != 0) ++ { ++ printk("Failed to request bridge iomem resource\n"); ++ return NULL; ++ } ++ ++ /* Request intiator memory resource */ ++ bus.io_space.start = 0; ++ bus.io_space.end = bus.io_space.start + PCI_IO_SIZE - 1; ++ bus.io_space.name = "PCI Bus #0"; ++ if (request_resource(&ioport_resource, &bus.io_space) != 0) ++ { ++ printk("Failed to request bridge ioport resource\n"); ++ return NULL; ++ } ++ ++ /* Set up the arbiter */ ++ MCF_PCIARB_PACR = 0 /*MCF_PCIARB_PACR_PKMD*/ ++ | MCF_PCIARB_PACR_INTMPRI ++ | MCF_PCIARB_PACR_INTMINTEN ++ | MCF_PCIARB_PACR_EXTMPRI(0x1F) ++ | MCF_PCIARB_PACR_EXTMINTEN(0x1F); ++ ++ /* GNT and REQ */ ++ MCF_PAR_PCIBG = 0x3FF; ++ MCF_PAR_PCIBR = 0x3FF; ++ ++ /* Enable bus mastering, memory access and MWI */ ++ MCF_PCISCR = MCF_PCISCR_B | MCF_PCISCR_M | MCF_PCISCR_MW; ++ ++ /* Setup burst parameters */ ++ MCF_PCICR1 = MCF_PCICR1_LATTIMER(32) | ++ MCF_PCICR1_CACHELINESIZE(PCI_CACHE_LINE); ++ ++ MCF_PCICR2 = 0; ++ /*MCF_PCICR2_MINGNT(PCI_MINGNT) | ++ MCF_PCICR2_MAXLAT(PCI_MAXLAT); ++ */ ++ /* Turn on error signaling */ ++ MCF_PCIICR = MCF_PCIICR_TAE | MCF_PCIICR_IAE | PCI_RETRIES; ++ MCF_PCIGSCR |= MCF_PCIGSCR_SEE; ++ /* ++ * Configure Initiator Windows ++ * Window 0: 128M PCI Memory @ HOST_MEM_BASE, 1:1 mapping ++ * Window 1: 64K I/O Memory @ HOST_IO_BASE, 1:0 mapping ++ */ ++ MCF_PCIIW0BTAR = WxBAR(HOST_MEM_BASE, PCI_MEM_BASE, PCI_MEM_SIZE); ++ MCF_PCIIW1BTAR = WxBAR(HOST_IO_BASE, PCI_IO_BASE_ADDR, PCI_IO_SIZE); ++ ++ MCF_PCIIWCR = MCF_PCIIWCR_WINCTRL1_IO | ++ MCF_PCIIWCR_WINCTRL0_MEMRDLINE; ++ ++ /* Target PCI DMA Windows */ ++ MCF_PCIBAR1 = PCI_DMA_BASE; ++ MCF_PCITBATR1 = HOST_DMA_BASE | MCF_PCITBATR1_EN; ++ MCF_PCIBAR0 = MCF_RAMBAR0;; ++ MCF_PCITBATR0 = MCF_RAMBAR0 | MCF_PCITBATR0_EN; ++ DBG("PCI TCR %x,MCF_PCIBAR1 %x,MCF_PCITBATR1 %x." ++ "MCF_PCIBAR0 %x,MCF_PCITBATR9 %x\n", MCF_PCITCR, MCF_PCIBAR1, ++ MCF_PCITBATR1, MCF_PCIBAR0, MCF_PCITBATR0); ++ /* Enable internal PCI controller interrupts */ ++ MCF_ICR(ISC_PCI_XLB) = ILP_PCI_XLB; ++ /*request_irq(64+ISC_PCI_XLB, xlb_interrupt, ++ SA_INTERRUPT, "PCI XL Bus", (void*)-1); ++ enable_irq (64+ISC_PCI_XLB); ++ */ ++ if(request_irq(64+ISC_PCI_XLB, xlb_interrupt, ++ IRQF_DISABLED, "PCI XL Bus", (void*)-1)){ ++ printk("Cannot allocate ISC_PCI_XLB IRQ\n"); ++ return (struct pci_bus_info *)-EBUSY; ++ } ++ ++ MCF_ICR(ISC_PCI_ARB) = ILP_PCI_ARB; ++ /*request_irq(64+ISC_PCI_ARB, arb_interrupt, ++ SA_INTERRUPT, "PCI Arbiter", (void*)-1); ++ enable_irq (64+ISC_PCI_ARB); ++ */ ++ if(request_irq(64+ISC_PCI_ARB, arb_interrupt, ++ IRQF_DISABLED, "PCI Arbiter", (void*)-1)){ ++ printk("Cannot allocate ISC_PCI_ARB IRQ\n"); ++ return (struct pci_bus_info *)-EBUSY; ++ } ++ ++ /* Set slots interrupt setting */ ++ for (i = 0; i < N_IRQS; i++) ++ { ++ /* Set trailing edge for PCI interrupts */ ++ MCF_EPPAR &= ~MCF_EPPAR_EPPA(irq_lines[i], 0x3); ++ if (irq_lines[i] == 5) ++ MCF_EPPAR |= MCF_EPPAR_EPPA(irq_lines[i], MCF_EPPAR_EPPAx_FALLING); ++ else ++ MCF_EPPAR |= MCF_EPPAR_EPPA(irq_lines[i], 0/*MCF_EPPAR_EPPAx_FALLING*/); ++ /* Turn on irq line in eport */ ++ MCF_EPIER |= MCF_EPIER_EPIE(irq_lines[i]); ++ ++ /* Enable irq in gpio */ ++ if (irq_lines[i] == 5) ++ MCF_PAR_FECI2CIRQ |= 1; ++ ++ if (irq_lines[i] == 6) ++ MCF_PAR_FECI2CIRQ |= 2; ++ ++ /* Register external interrupt handlers */ ++ sprintf(irq_name[i], "PCI IRQ%d", irq_lines[i]); ++ /*request_irq(64 + irq_lines[i], eint_handler, ++ SA_SHIRQ, irq_name[i], (void*)-1); ++ enable_irq(64 + irq_lines[i]);*/ ++ if(request_irq(64 + irq_lines[i], eint_handler, ++ IRQF_SHARED, irq_name[i], (void*)-1)){ ++ printk("Cannot allocate irq_lines[%d] IRQ\n", irq_lines[i]); ++ return (struct pci_bus_info *)-EBUSY; ++ } ++ } ++ ++ /* Clear PCI Reset and wait for devices to reset */ ++ MCF_PCIGSCR &= ~MCF_PCIGSCR_PR; ++ schedule_timeout((5 * HZ) / 10); ++ /* Remap initiator windows (should be 1:1 to the physical memory) */ ++ pci_mem_va = (int) ioremap_nocache(HOST_MEM_BASE, PCI_MEM_SIZE + PCI_IO_SIZE); ++#if 1 ++ printk("%s: MEMBase_phy %x, Virt %x, len %x\n",__FUNCTION__, ++ HOST_MEM_BASE,pci_mem_va,PCI_MEM_SIZE + PCI_IO_SIZE); ++#endif ++ BUG_ON(pci_mem_va != HOST_MEM_BASE); ++ ++ /* Setup bios32 and pci bus driver callbacks */ ++ bus.m68k_pci_ops = &bus_ops; ++ bus.fixup = coldfire_fixup; ++ bus.conf_device = configure_device; ++ ++ return &bus; ++} ++ +--- a/arch/m68k/kernel/Makefile ++++ b/arch/m68k/kernel/Makefile +@@ -12,6 +12,9 @@ ifndef CONFIG_COLDFIRE + obj-$(CONFIG_PCI) += bios32.o + else # CONFIG_COLDFIRE + extra-y := ../coldfire/head.o vmlinux.lds ++ifdef CONFIG_M547X_8X ++ obj-$(CONFIG_PCI) += bios32_mcf548x.o ++endif + endif + endif + +--- /dev/null ++++ b/arch/m68k/kernel/bios32_mcf548x.c +@@ -0,0 +1,631 @@ ++/* ++ * bios32.c - PCI BIOS functions for m68k systems. ++ * ++ * Written by Wout Klaren. ++ * ++ * Based on the DEC Alpha bios32.c by Dave Rusling and David Mosberger. ++ */ ++#include <linux/init.h> ++#include <linux/kernel.h> ++ ++#if 0 ++# define DBG_DEVS(args) printk args ++#else ++# define DBG_DEVS(args) ++#endif ++ ++#ifdef CONFIG_PCI ++ ++/* ++ * PCI support for Linux/m68k. Currently only the Hades is supported. ++ * ++ * The support for PCI bridges in the DEC Alpha version has ++ * been removed in this version. ++ */ ++ ++#include <linux/pci.h> ++#include <linux/slab.h> ++#include <linux/mm.h> ++ ++#include <asm/io.h> ++#include <asm/pci.h> ++#include <asm/uaccess.h> ++ ++#define KB 1024 ++#define MB (1024*KB) ++#define GB (1024*MB) ++ ++#define MAJOR_REV 0 ++#define MINOR_REV 5 ++ ++/* ++ * Align VAL to ALIGN, which must be a power of two. ++ */ ++ ++#define MAX(val1, val2) (((val1) > (val2)) ? val1 : val2) ++ ++/* ++ * Offsets relative to the I/O and memory base addresses from where resources ++ * are allocated. ++ */ ++ ++#ifdef CONFIG_COLDFIRE ++#define IO_ALLOC_OFFSET 0x00000100 ++#define MEM_ALLOC_OFFSET 0x00000000 ++#else /* CONFIG_COLDFIRE */ ++#define IO_ALLOC_OFFSET 0x00004000 ++#define MEM_ALLOC_OFFSET 0x04000000 ++#endif /* CONFIG_COLDFIRE */ ++ ++/* ++ * Declarations of hardware specific initialisation functions. ++ */ ++ ++extern struct pci_bus_info *init_hades_pci(void); ++ ++/* ++ * Bus info structure of the PCI bus. A pointer to this structure is ++ * put in the sysdata member of the pci_bus structure. ++ */ ++ ++static struct pci_bus_info *bus_info; ++ ++static int pci_modify = 1; /* If set, layout the PCI bus ourself. */ ++static int skip_vga; /* If set do not modify base addresses ++ of vga cards.*/ ++static int disable_pci_burst; /* If set do not allow PCI bursts. */ ++ ++static unsigned int io_base; ++static unsigned int mem_base; ++ ++/* ++ * static void disable_dev(struct pci_dev *dev) ++ * ++ * Disable PCI device DEV so that it does not respond to I/O or memory ++ * accesses. ++ * ++ * Parameters: ++ * ++ * dev - device to disable. ++ */ ++ ++static void __init disable_dev(struct pci_dev *dev) ++{ ++ unsigned short cmd; ++ ++ if (((dev->class >> 8 == PCI_CLASS_NOT_DEFINED_VGA) || ++ (dev->class >> 8 == PCI_CLASS_DISPLAY_VGA) || ++ (dev->class >> 8 == PCI_CLASS_DISPLAY_XGA)) && skip_vga) ++ return; ++ ++ pci_read_config_word(dev, PCI_COMMAND, &cmd); ++ ++ cmd &= (~PCI_COMMAND_IO & ~PCI_COMMAND_MEMORY & ~PCI_COMMAND_MASTER); ++ pci_write_config_word(dev, PCI_COMMAND, cmd); ++} ++ ++/* Stolen from pcibios_enable_resources/i386 */ ++int pcibios_enable_device(struct pci_dev *dev, int mask) ++{ ++ u16 cmd, old_cmd; ++ int idx; ++ struct resource *r; ++ ++ pci_read_config_word(dev, PCI_COMMAND, &cmd); ++ old_cmd = cmd; ++ for(idx=0; idx<6; idx++) { ++ /* Only set up the requested stuff */ ++ if (!(mask & (1<<idx))) ++ continue; ++ ++ r = &dev->resource[idx]; ++ if (!r->start && r->end) { ++ printk("PCI: Device %s not available because" ++ " of resource collisions\n", dev->dev.bus_id); ++ return -EINVAL; ++ } ++ if (r->flags & IORESOURCE_IO) ++ cmd |= PCI_COMMAND_IO; ++ if (r->flags & IORESOURCE_MEM) ++ cmd |= PCI_COMMAND_MEMORY; ++ } ++ if (dev->resource[PCI_ROM_RESOURCE].start) ++ cmd |= PCI_COMMAND_MEMORY; ++ if (cmd != old_cmd) { ++ printk("PCI: Enabling device %s (%04x -> %04x)\n", dev->dev.bus_id, old_cmd, cmd); ++ pci_write_config_word(dev, PCI_COMMAND, cmd); ++ } ++ return 0; ++} ++ ++/* ++ * static void layout_dev(struct pci_dev *dev) ++ * ++ * Layout memory and I/O for a device. ++ * ++ * Parameters: ++ * ++ * device - device to layout memory and I/O for. ++ */ ++ ++static void __init layout_dev(struct pci_dev *dev) ++{ ++ unsigned short cmd; ++ unsigned int base, mask, size, reg; ++ unsigned int alignto; ++ int i; ++ ++ /* ++ * Skip video cards if requested. ++ */ ++ if (((dev->class >> 8 == PCI_CLASS_NOT_DEFINED_VGA) || ++ (dev->class >> 8 == PCI_CLASS_DISPLAY_VGA) || ++ (dev->class >> 8 == PCI_CLASS_DISPLAY_XGA)) && skip_vga){ ++ printk("%s: VGA\n",__FUNCTION__); ++ return; ++ } ++ pci_read_config_word(dev, PCI_COMMAND, &cmd); ++ ++ for (reg = PCI_BASE_ADDRESS_0, i = 0; reg <= PCI_BASE_ADDRESS_5; reg += 4, i++) ++ { ++ /* ++ * Figure out how much space and of what type this ++ * device wants. ++ */ ++ ++ pci_write_config_dword(dev, reg, 0xffffffff); ++ pci_read_config_dword(dev, reg, &base); ++ if (!base) ++ { ++ /* this base-address register is unused */ ++ dev->resource[i].start = 0; ++ dev->resource[i].end = 0; ++ dev->resource[i].flags = 0; ++ continue; ++ } ++ ++ /* ++ * We've read the base address register back after ++ * writing all ones and so now we must decode it. ++ */ ++ ++ if (base & PCI_BASE_ADDRESS_SPACE_IO) ++ { ++ /* ++ * I/O space base address register. ++ */ ++ ++ cmd |= PCI_COMMAND_IO; ++ ++ base &= PCI_BASE_ADDRESS_IO_MASK; ++ mask = (~base << 1) | 0x1; ++ size = (mask & base) & 0xffffffff; ++ ++ /* ++ * Align to multiple of size of minimum base. ++ */ ++ ++#ifdef CONFIG_COLDFIRE ++ alignto = MAX(PAGE_SIZE, size) ; ++#else /* CONFIG_COLDFIRE */ ++ alignto = MAX(0x040, size) ; ++#endif /* CONFIG_COLDFIRE */ ++ base = ALIGN(io_base, alignto); ++ io_base = base + size; ++ pci_write_config_dword(dev, reg, base | PCI_BASE_ADDRESS_SPACE_IO); ++ ++ dev->resource[i].start = base; ++ dev->resource[i].end = dev->resource[i].start + size - 1; ++ dev->resource[i].flags = IORESOURCE_IO | PCI_BASE_ADDRESS_SPACE_IO; ++ ++ DBG_DEVS(("layout_dev: IO address: %x\n", base)); ++ } ++ else ++ { ++ unsigned int type; ++ ++ /* ++ * Memory space base address register. ++ */ ++ ++ cmd |= PCI_COMMAND_MEMORY; ++ type = base & PCI_BASE_ADDRESS_MEM_TYPE_MASK; ++ base &= PCI_BASE_ADDRESS_MEM_MASK; ++ mask = (~base << 1) | 0x1; ++ size = (mask & base) & 0xffffffff; ++ switch (type) ++ { ++ case PCI_BASE_ADDRESS_MEM_TYPE_32: ++ case PCI_BASE_ADDRESS_MEM_TYPE_64: ++ break; ++ ++ case PCI_BASE_ADDRESS_MEM_TYPE_1M: ++ printk("bios32 WARNING: slot %d, function %d " ++ "requests memory below 1MB---don't " ++ "know how to do that.\n", ++ PCI_SLOT(dev->devfn), ++ PCI_FUNC(dev->devfn)); ++ continue; ++ } ++ DBG_DEVS(("%s MEM: base %x,type %x,mask %x,size %x\n", ++ __FUNCTION__, base, type, mask, size)); ++ /* ++ * Align to multiple of size of minimum base. ++ */ ++ ++ alignto = max_t(unsigned int, 0x1000, size); ++ base = ALIGN(mem_base, alignto); ++ mem_base = base + size; ++ pci_write_config_dword(dev, reg, base); ++ ++ dev->resource[i].start = base; ++ dev->resource[i].end = dev->resource[i].start + size - 1; ++ dev->resource[i].flags = IORESOURCE_MEM; ++ DBG_DEVS(("%s MEM :base %x,size %x\n", ++ __FUNCTION__, base, size)); ++ if (type == PCI_BASE_ADDRESS_MEM_TYPE_64) ++ { ++ /* ++ * 64-bit address, set the highest 32 bits ++ * to zero. ++ */ ++ ++ reg += 4; ++ pci_write_config_dword(dev, reg, 0); ++ ++ i++; ++ dev->resource[i].start = 0; ++ dev->resource[i].end = 0; ++ dev->resource[i].flags = 0; ++ printk("%s:type == 64\n",__FUNCTION__); ++ } ++ } ++ } ++ ++ /* ++ * Enable device: ++ */ ++ ++ if (dev->class >> 8 == PCI_CLASS_NOT_DEFINED || ++ dev->class >> 8 == PCI_CLASS_NOT_DEFINED_VGA || ++ dev->class >> 8 == PCI_CLASS_DISPLAY_VGA || ++ dev->class >> 8 == PCI_CLASS_DISPLAY_XGA) ++ { ++ /* ++ * All of these (may) have I/O scattered all around ++ * and may not use i/o-base address registers at all. ++ * So we just have to always enable I/O to these ++ * devices. ++ */ ++ cmd |= PCI_COMMAND_IO; ++ } ++ ++ pci_write_config_word(dev, PCI_COMMAND, cmd | PCI_COMMAND_MASTER); ++ ++ pci_write_config_byte(dev, PCI_LATENCY_TIMER, (disable_pci_burst) ? 0 : 32); ++ ++ if (bus_info != NULL) ++ bus_info->conf_device(dev); /* Machine dependent configuration. */ ++ ++ printk(KERN_INFO "layout_dev: bus %d slot 0x%x VID 0x%x DID 0x%x class 0x%x\n", ++ dev->bus->number, PCI_SLOT(dev->devfn), ++ dev->vendor, dev->device, dev->class); ++} ++ ++/* ++ * static void layout_bus(struct pci_bus *bus) ++ * ++ * Layout memory and I/O for all devices on the given bus. ++ * ++ * Parameters: ++ * ++ * bus - bus. ++ */ ++ ++static void __init layout_bus(struct pci_bus *bus) ++{ ++ unsigned int bio, bmem; ++ struct pci_dev *dev; ++ ++ DBG_DEVS(("layout_bus: starting bus %d\n", bus->number)); ++ ++ if (list_empty(&bus->devices) && list_empty(&bus->children)) ++ return; ++ ++ /* ++ * Align the current bases on appropriate boundaries (4K for ++ * IO and 1MB for memory). ++ */ ++ ++ bio = io_base = ALIGN(io_base, 4*KB); ++ bmem = mem_base = ALIGN(mem_base, 1*MB); ++ ++ /* ++ * PCI devices might have been setup by a PCI BIOS emulation ++ * running under TOS. In these cases there is a ++ * window during which two devices may have an overlapping ++ * address range. To avoid this causing trouble, we first ++ * turn off the I/O and memory address decoders for all PCI ++ * devices. They'll be re-enabled only once all address ++ * decoders are programmed consistently. ++ */ ++ ++ DBG_DEVS(("layout_bus: disable_dev for bus %d\n", bus->number)); ++ ++#ifdef NL_ORIGINAL ++ for (dev = bus->devices; dev; dev = dev->sibling) ++#else ++ dev = NULL; ++ while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) ++#endif ++ { ++ if ((dev->class >> 16 != PCI_BASE_CLASS_BRIDGE) || ++ (dev->class >> 8 == PCI_CLASS_BRIDGE_PCMCIA)) ++ disable_dev(dev); ++ } ++ ++ /* ++ * Allocate space to each device: ++ */ ++ ++ DBG_DEVS(("layout_bus: starting bus %d devices\n", bus->number)); ++ ++#ifdef NL_ORIGINAL ++ for (dev = bus->devices; dev; dev = dev->sibling) ++#else ++ dev = NULL; ++ while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) ++#endif ++ { ++ if ((dev->class >> 16 != PCI_BASE_CLASS_BRIDGE) || ++ (dev->class >> 8 == PCI_CLASS_BRIDGE_PCMCIA)) ++ layout_dev(dev); ++ } ++ ++ DBG_DEVS(("layout_bus: bus %d finished\n", bus->number)); ++} ++ ++/* ++ * static void pcibios_fixup(void) ++ * ++ * Layout memory and I/O of all devices on the PCI bus if 'pci_modify' is ++ * true. This might be necessary because not every m68k machine with a PCI ++ * bus has a PCI BIOS. This function should be called right after ++ * pci_scan_bus() in pcibios_init(). ++ */ ++ ++static void __init pcibios_fixup(void) ++{ ++ DBG_DEVS(("%s\n", __FUNCTION__)); ++ if (pci_modify) ++ { ++ /* ++ * Set base addresses for allocation of I/O and memory space. ++ */ ++ ++ io_base = bus_info->io_space.start + IO_ALLOC_OFFSET; ++ mem_base = bus_info->mem_space.start + MEM_ALLOC_OFFSET; ++ ++ /* ++ * Scan the tree, allocating PCI memory and I/O space. ++ */ ++ ++#ifdef NL_ORIGINAL ++ layout_bus(pci_bus_b(pci_root.next)); ++#else ++ layout_bus(pci_bus_b(pci_root_buses.next)); ++#endif ++ } ++ ++ /* ++ * Fix interrupt assignments, etc. ++ */ ++ ++ bus_info->fixup(pci_modify); ++} ++ ++/* ++ * static void pcibios_claim_resources(struct pci_bus *bus) ++ * ++ * Claim all resources that are assigned to devices on the given bus. ++ * ++ * Parameters: ++ * ++ * bus - bus. ++ */ ++ ++static void __init pcibios_claim_resources(struct pci_bus *bus) ++{ ++ struct pci_dev *dev; ++ int i; ++ DBG_DEVS(("%s\n", __FUNCTION__)); ++#ifdef NL_ORIGINAL ++ while (bus) ++#else ++ while ((bus = pci_find_next_bus(bus)) != NULL) ++#endif ++ { ++ ++#ifdef NL_ORIGINAL ++ for (dev = bus->devices; (dev != NULL); dev = dev->sibling) ++#else ++ dev = NULL; ++ while ((dev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) ++#endif ++ { ++ for (i = 0; i < PCI_NUM_RESOURCES; i++) ++ { ++ struct resource *r = &dev->resource[i]; ++ struct resource *pr; ++ struct pci_bus_info *bus_info = ++ (struct pci_bus_info *) dev->sysdata; ++ ++ if ((r->start == 0) || (r->parent != NULL)) ++ continue; ++ ++#ifdef CONFIG_COLDFIRE ++ if (dev->class >> 16 == PCI_BASE_CLASS_BRIDGE) ++ continue; ++#endif /* CONFIG_COLDFIRE */ ++#if 1 ++ if (r->flags & IORESOURCE_IO) ++ pr = &bus_info->io_space; ++ else ++ pr = &bus_info->mem_space; ++#else ++ if (r->flags & IORESOURCE_IO) ++ pr = &ioport_resource; ++ else ++ pr = &iomem_resource; ++#endif ++ if (request_resource(pr, r) < 0) ++ { ++#ifdef NL_ORIGINAL ++ DBG_DEVS(("PCI: Address space collision on " ++ "region %d of device %s\n", i, dev->name)); ++#else ++ printk("PCI: Address space collision on region %d of device %s\n", i, dev->dev.bus_id); ++#endif ++ } ++ } ++ } ++ ++#ifdef NL_ORIGINAL ++ if (bus->children) ++ pcibios_claim_resources(bus->children); ++#else ++ if (!list_empty(&bus->children)) ++ pcibios_claim_resources(pci_bus_b(bus->children.next)); ++#endif ++ ++#ifdef NL_ORIGINAL ++ bus = bus->next; ++#endif ++ } ++} ++ ++/* ++ * int pcibios_assign_resource(struct pci_dev *dev, int i) ++ * ++ * Assign a new address to a PCI resource. ++ * ++ * Parameters: ++ * ++ * dev - device. ++ * i - resource. ++ * ++ * Result: 0 if successful. ++ */ ++ ++int __init pcibios_assign_resource(struct pci_dev *dev, int i) ++{ ++ struct resource *r = &dev->resource[i]; ++ struct resource *pr = pci_find_parent_resource(dev, r); ++ unsigned long size = r->end + 1; ++ DBG_DEVS(("%s:IO_ALLOC_OFFSET %x\n", __FUNCTION__, IO_ALLOC_OFFSET)); ++ if (!pr) ++ return -EINVAL; ++ ++ if (r->flags & IORESOURCE_IO) ++ { ++ DBG_DEVS(("%s:IORESOURCE_IO:start %x, size %lx\n", ++ __FUNCTION__, bus_info->io_space.start, size)); ++ if (size > 0x100) ++ return -EFBIG; ++ ++#ifdef NL_ORIGINAL ++ if (allocate_resource(pr, r, size, bus_info->io_space.start + ++ IO_ALLOC_OFFSET, bus_info->io_space.end, 1024)) ++#else ++ if (allocate_resource(pr, r, size, bus_info->io_space.start + ++ IO_ALLOC_OFFSET, bus_info->io_space.end, 1024, NULL, NULL)) ++#endif ++ return -EBUSY; ++ } ++ else ++ { ++ DBG_DEVS(("%s:IORESOURCE_MEM:start %x, size %lx\n", ++ __FUNCTION__, bus_info->mem_space.start, size)); ++#ifdef NL_ORIGINAL ++ if (allocate_resource(pr, r, size, bus_info->mem_space.start + ++ MEM_ALLOC_OFFSET, bus_info->mem_space.end, size)) ++#else ++ if (allocate_resource(pr, r, size, bus_info->io_space.start + ++ IO_ALLOC_OFFSET, bus_info->io_space.end, 1024, NULL, NULL)) ++#endif ++ return -EBUSY; ++ } ++ ++ if (i < 6) ++ pci_write_config_dword(dev, PCI_BASE_ADDRESS_0 + 4 * i, r->start); ++ ++ return 0; ++} ++ ++void pcibios_fixup_bus(struct pci_bus *bus) ++{ ++ struct pci_dev *dev; ++ void *sysdata; ++ ++ sysdata = (bus->parent) ? bus->parent->sysdata : bus->sysdata; ++ ++#ifdef NL_ORIGINAL ++ for (dev = bus->devices; (dev != NULL); dev = dev->sibling) ++#else ++ dev = NULL; ++ while ((dev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) ++#endif ++ dev->sysdata = sysdata; ++} ++ ++int __init pcibios_init(void) ++{ ++ printk("Linux/m68k PCI BIOS32 revision %x.%02x\n", MAJOR_REV, MINOR_REV); ++ ++ bus_info = NULL; ++#ifdef CONFIG_COLDFIRE ++ bus_info = init_coldfire_pci(); ++#endif /* CONFIG_COLDFIRE */ ++#ifdef CONFIG_HADES ++ if (MACH_IS_HADES) ++ bus_info = init_hades_pci(); ++#endif ++ if (bus_info != NULL) ++ { ++ printk("PCI: Probing PCI hardware\n"); ++ pci_scan_bus(0, bus_info->m68k_pci_ops, bus_info); ++ pcibios_fixup(); ++#ifdef NL_ORIGINAL ++ pcibios_claim_resources(pci_root); ++#else ++ pcibios_claim_resources(pci_bus_b(pci_root_buses.next)); ++#endif ++ } ++ else ++ printk("PCI: No PCI bus detected\n"); ++ return 0; ++} ++ ++subsys_initcall(pcibios_init); ++ ++char * pcibios_setup(char *str) ++{ ++ if (!strcmp(str, "nomodify")) ++ { ++ pci_modify = 0; ++ return NULL; ++ } ++ else if (!strcmp(str, "skipvga")) ++ { ++ skip_vga = 1; ++ return NULL; ++ } ++ else if (!strcmp(str, "noburst")) ++ { ++ disable_pci_burst = 1; ++ return NULL; ++ } ++ ++ return str; ++} ++#endif /* CONFIG_PCI */ +--- a/arch/m68k/kernel/dma.c ++++ b/arch/m68k/kernel/dma.c +@@ -11,13 +11,24 @@ + #include <linux/kernel.h> + #include <linux/scatterlist.h> + #include <linux/vmalloc.h> +- ++#include <linux/pci.h> + #include <asm/pgalloc.h> + + void *dma_alloc_coherent(struct device *dev, size_t size, + dma_addr_t *handle, gfp_t flag) + { +-#ifndef CONFIG_M5445X ++#if defined(CONFIG_M547X_8X) | defined(CONFIG_M54455) ++ /* ++ * On the M5445x platform the memory allocated with GFP_DMA ++ * is guaranteed to be DMA'able. ++ */ ++ void *addr; ++ ++ size = PAGE_ALIGN(size); ++ addr = kmalloc(size, GFP_DMA); ++ *handle = virt_to_phys(addr); ++ return addr; ++#else + struct page *page, **map; + pgprot_t pgprot; + void *addr; +@@ -56,17 +67,6 @@ void *dma_alloc_coherent(struct device * + kfree(map); + + return addr; +-#else +- /* +- * On the M5445x platform the memory allocated with GFP_DMA +- * is guaranteed to be DMA'able. +- */ +- void *addr; +- +- size = PAGE_ALIGN(size); +- addr = kmalloc(size, GFP_DMA); +- *handle = virt_to_phys(addr); +- return addr; + #endif + } + EXPORT_SYMBOL(dma_alloc_coherent); +@@ -75,10 +75,10 @@ void dma_free_coherent(struct device *de + void *addr, dma_addr_t handle) + { + pr_debug("dma_free_coherent: %p, %x\n", addr, handle); +-#ifndef CONFIG_M5445X +- vfree(addr); +-#else ++#if defined(CONFIG_M547X_8X) | defined(CONFIG_M54455) + kfree(addr); ++#else ++ vfree(addr); + #endif + } + EXPORT_SYMBOL(dma_free_coherent); +--- a/arch/m68k/mm/kmap.c ++++ b/arch/m68k/mm/kmap.c +@@ -153,6 +153,10 @@ void __iomem *__ioremap(unsigned long ph + */ + return (void __iomem *)physaddr; + } ++ if ((physaddr >= 0xd0000000) && (physaddr + size < 0xd800ffff)) { ++ printk("ioremap:PCI 0x%lx,0x%lx(%d) - PCI area hit\n", physaddr, size, cacheflag); ++ return (void *)physaddr; ++ } + #endif + + #ifdef DEBUG +@@ -284,7 +288,12 @@ void __iounmap(void *addr, unsigned long + pgd_t *pgd_dir; + pmd_t *pmd_dir; + pte_t *pte_dir; +- ++#ifdef CONFIG_M547X_8X ++ if ((addr >= (void*)0xd0000000) && (addr + size < (void*)0xd800ffff)) { ++ printk("%s: PCI address\n",__FUNCTION__); ++ return; ++ } ++#endif + while ((long)size > 0) { + pgd_dir = pgd_offset_k(virtaddr); + if (pgd_bad(*pgd_dir)) { +--- a/drivers/pci/access.c ++++ b/drivers/pci/access.c +@@ -23,6 +23,7 @@ static DEFINE_SPINLOCK(pci_lock); + #define PCI_word_BAD (pos & 1) + #define PCI_dword_BAD (pos & 3) + ++#ifdef NL_ORIGINAL + #define PCI_OP_READ(size,type,len) \ + int pci_bus_read_config_##size \ + (struct pci_bus *bus, unsigned int devfn, int pos, type *value) \ +@@ -37,7 +38,20 @@ int pci_bus_read_config_##size \ + spin_unlock_irqrestore(&pci_lock, flags); \ + return res; \ + } +- ++#else /* NL_ORIGINAL */ ++#define PCI_OP_READ(size,type,len) \ ++int pci_bus_read_config_##size \ ++ (struct pci_bus *bus, unsigned int devfn, int pos, type *value) \ ++{ \ ++ int res; \ ++ unsigned long flags; \ ++ if (PCI_##size##_BAD) return PCIBIOS_BAD_REGISTER_NUMBER; \ ++ spin_lock_irqsave(&pci_lock, flags); \ ++ res = bus->ops->read(bus, devfn, pos, len, (u32 *)value); \ ++ spin_unlock_irqrestore(&pci_lock, flags); \ ++ return res; \ ++} ++#endif /* NL_ORIGINAL */ + #define PCI_OP_WRITE(size,type,len) \ + int pci_bus_write_config_##size \ + (struct pci_bus *bus, unsigned int devfn, int pos, type value) \ +--- a/drivers/usb/host/Makefile ++++ b/drivers/usb/host/Makefile +@@ -6,7 +6,7 @@ ifeq ($(CONFIG_USB_DEBUG),y) + EXTRA_CFLAGS += -DDEBUG + endif + +-obj-$(CONFIG_PCI) += pci-quirks.o ++#obj-$(CONFIG_PCI) += pci-quirks.o + + obj-$(CONFIG_USB_EHCI_HCD) += ehci-hcd.o + obj-$(CONFIG_USB_ISP116X_HCD) += isp116x-hcd.o +--- /dev/null ++++ b/include/asm-m68k/5445x_pci.h +@@ -0,0 +1,94 @@ ++/* ++ * asm-m68k/pci.h - m68k specific PCI declarations. ++ * ++ * Coldfire Implementation Copyright (c) 2007 Freescale Semiconductor, Inc. ++ * Kurt Mahan <kmahan@freescale.com> ++ */ ++#ifndef _ASM_M68K_5445X_PCI_H ++#define _ASM_M68K_5445x_PCI_H ++ ++#ifndef CONFIG_PCI ++/* ++ * The PCI address space does equal the physical memory ++ * address space. The networking and block device layers use ++ * this boolean for bounce buffer decisions. ++ */ ++#define PCI_DMA_BUS_IS_PHYS (1) ++#else ++#include <asm-generic/pci-dma-compat.h> ++ ++/* ++ * The PCI address space does equal the physical memory ++ * address space. The networking and block device layers use ++ * this boolean for bounce buffer decisions. ++ */ ++#define PCI_DMA_BUS_IS_PHYS (1) ++ ++#define PCIBIOS_MIN_IO 0x00004000 ++#define PCIBIOS_MIN_MEM 0x02000000 ++ ++#define pcibios_assign_all_busses() 0 ++#define pcibios_scan_all_fns(a, b) 0 ++ ++static inline void ++pcibios_set_master(struct pci_dev *dev) ++{ ++ /* no special bus mastering setup handling */ ++} ++ ++static inline void ++pcibios_penalize_isa_irq(int irq, int active) ++{ ++ /* no dynamic PCI IRQ allocation */ ++} ++ ++#if 0 ++static inline void ++pcibios_add_platform_entries(struct pci_dev *dev) ++{ ++ /* no special handling */ ++} ++#endif ++ ++static inline void ++pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region, ++ struct resource *res) ++{ ++#ifdef CONFIG_M54455 ++ if ((res->start == 0xa0000000) || (res->start == 0xa8000000)) { ++ /* HACK! FIX! kludge to fix bridge mapping */ ++ region->start = res->start & 0x0fffffff; ++ region->end = res->end & 0x0fffffff; ++ } else { ++ region->start = res->start; ++ region->end = res->end; ++ } ++#else ++ region->start = res->start; ++ region->end = res->end; ++#endif ++} ++ ++static inline void ++pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, ++ struct pci_bus_region *region) ++{ ++ res->start = region->start; ++ res->end = region->end; ++} ++ ++static inline struct resource * ++pcibios_select_root(struct pci_dev *pdev, struct resource *res) ++{ ++ struct resource *root = NULL; ++ ++ if (res->flags & IORESOURCE_IO) ++ root = &ioport_resource; ++ if (res->flags & IORESOURCE_MEM) ++ root = &iomem_resource; ++ ++ return root; ++} ++ ++#endif /* CONFIG_PCI */ ++#endif /* _ASM_M68K_5445X_PCI_H */ +--- /dev/null ++++ b/include/asm-m68k/548x_pci.h +@@ -0,0 +1,99 @@ ++#ifndef _ASM_M68K_548X_PCI_H ++#define _ASM_M68K_548X_PCI_H ++ ++/* ++ * asm-m68k/pci_m68k.h - m68k specific PCI declarations. ++ * ++ * Written by Wout Klaren. ++ */ ++#include <linux/mm.h> ++#include <asm/scatterlist.h> ++ ++#include <asm-generic/pci.h> ++ ++struct pci_ops; ++ ++/* ++ * Structure with hardware dependent information and functions of the ++ * PCI bus. ++ */ ++ ++struct pci_bus_info ++{ ++ /* ++ * Resources of the PCI bus. ++ */ ++ ++ struct resource mem_space; ++ struct resource io_space; ++ ++ /* ++ * System dependent functions. ++ */ ++ ++ struct pci_ops *m68k_pci_ops; ++ ++ void (*fixup)(int pci_modify); ++ void (*conf_device)(struct pci_dev *dev); ++}; ++ ++#define pcibios_assign_all_busses() 0 ++#define pcibios_scan_all_fns(a, b) 0 ++ ++static inline void pcibios_set_master(struct pci_dev *dev) ++{ ++ /* No special bus mastering setup handling */ ++} ++ ++static inline void pcibios_penalize_isa_irq(int irq) ++{ ++ /* We don't do dynamic PCI IRQ allocation */ ++} ++ ++#ifndef CONFIG_COLDFIRE ++/* The PCI address space does equal the physical memory ++ * address space. The networking and block device layers use ++ * this boolean for bounce buffer decisions. ++ */ ++#define PCI_DMA_BUS_IS_PHYS (1) ++ ++#define PCIBIOS_MIN_IO 0x00004000 ++#define PCIBIOS_MIN_MEM 0x04000000 ++ ++#else /* !CONFIG_COLDFIRE */ ++#include <asm-generic/pci-dma-compat.h> ++#define PCI_DMA_BASE /*0x40000000*/0 /* PCI-DMA window base */ ++ ++extern struct pci_bus_info *__init init_coldfire_pci(void); ++extern void * pci_alloc_son(struct pci_dev *, size_t, ++ dma_addr_t *, int); ++/* ++ * The PCI address space equal the virtual memory ++ * address space on m547X/m548X. ++ */ ++#define PCI_DMA_BUS_IS_PHYS (1) ++ ++#define PCIBIOS_MIN_IO 0x00000100 ++#define PCIBIOS_MIN_MEM 0x02000000 ++ ++struct scatterlist; ++ ++ ++/* This is always fine. */ ++#define pci_dac_dma_supported(pci_dev, mask) (1) ++ ++ ++/* These macros should be used after a pci_map_sg call has been done ++ * to get bus addresses of each of the SG entries and their lengths. ++ * You should only work with the number of sg entries pci_map_sg ++ * returns. ++ */ ++#define sg_dma_address(sg) ((sg)->dma_address) ++#define sg_dma_len(sg) ((sg)->length) ++ ++static inline void pcibios_align_resource(void *data, struct resource *res, unsigned long size, unsigned long align) ++{ ++} ++ ++#endif /* !CONFIG_COLDFIRE*/ ++#endif /* _ASM_M68K_548X_PCI_H */ +--- a/include/asm-m68k/io.h ++++ b/include/asm-m68k/io.h +@@ -204,6 +204,12 @@ static inline u16 __iomem *isa_mtw(unsig + #define isa_outw(val,port) (ISA_SEX ? out_be16(isa_itw(port),(val)) : out_le16(isa_itw(port),(val))) + #define isa_outl(val,port) (ISA_SEX ? out_be32(isa_itl(port),(val)) : out_le32(isa_itl(port),(val))) + ++#ifndef CONFIG_COLDFIRE ++#define isa_readb(p) in_8(isa_mtb(p)) ++#define isa_readw(p) (ISA_SEX ? in_be16(isa_mtw(p)) : in_le16(isa_mtw(p))) ++#define isa_writeb(val,p) out_8(isa_mtb(p),(val)) ++#define isa_writew(val,p) (ISA_SEX ? out_be16(isa_mtw(p),(val)) : out_le16(isa_mtw(p),(val))) ++#else + #define isa_readb(p) in_8(isa_mtb((unsigned long)(p))) + #define isa_readw(p) \ + (ISA_SEX ? in_be16(isa_mtw((unsigned long)(p))) \ +@@ -212,7 +218,7 @@ static inline u16 __iomem *isa_mtw(unsig + #define isa_writew(val,p) \ + (ISA_SEX ? out_be16(isa_mtw((unsigned long)(p)),(val)) \ + : out_le16(isa_mtw((unsigned long)(p)),(val))) +- ++#endif + static inline void isa_delay(void) + { + switch(ISA_TYPE) +@@ -285,6 +291,29 @@ static inline void isa_delay(void) + #endif /* CONFIG_ISA */ + + #if defined(CONFIG_PCI) ++#ifdef CONFIG_COLDFIRE ++#define inb_p inb ++#define inw_p inw ++#define inl_p inl ++#define outb_p outb ++#define outw_p outw ++#define outl_p outl ++ ++unsigned char pci_inb(long addr); ++unsigned short pci_inw(long addr); ++unsigned long pci_inl(long addr); ++void pci_outb(unsigned char val, long addr); ++void pci_outw(unsigned short val, long addr); ++void pci_outl(unsigned long val, long addr); ++ ++void pci_insb(volatile unsigned char* addr, unsigned char* buf, int len); ++void pci_insw(volatile unsigned short* addr, unsigned short* buf, int len); ++void pci_insl(volatile unsigned long* addr, unsigned long* buf, int len); ++ ++void pci_outsb(volatile unsigned char* addr, const unsigned char* buf, int len); ++void pci_outsw(volatile unsigned short* addr, const unsigned short* buf, int len); ++void pci_outsl(volatile unsigned long* addr, const unsigned long* buf, int len); ++#endif + + #define readl(addr) in_le32(addr) + #define writel(val,addr) out_le32((addr),(val)) +@@ -300,6 +329,7 @@ static inline void isa_delay(void) + #define readl_relaxed(addr) readl(addr) + + #ifndef CONFIG_ISA ++#ifndef CONFIG_COLDFIRE + #define inb(port) in_8(port) + #define outb(val,port) out_8((port),(val)) + #define inw(port) in_le16(port) +@@ -319,6 +349,30 @@ static inline void isa_delay(void) + #define outsl(port, buf, nr) \ + raw_outsw_swapw((u16 *)(port), (u16 *)(buf), (nr)<<1) + #else ++#define inb(port) pci_inb(port) ++#define outb(val,port) pci_outb((val),(port)) ++#define inw(port) pci_inw(port) ++#define outw(val,port) pci_outw((val),(port)) ++#define insb(a,b,c) pci_insb((volatile unsigned char*)a,(unsigned char*)b,c) ++#define insw(a,b,c) pci_insw((volatile unsigned short*)a,(const unsigned short*)b,c) ++#define insl(a,b,c) pci_insl((volatile unsigned long*)a,(const unsigned long*)b,c) ++#define outsb(a,b,c) pci_outsb((volatile unsigned char*)a,(const unsigned char*)b,c) ++#define outsw(a,b,c) pci_outsw((volatile unsigned short*)a,(const unsigned short*)b,c) ++#define outsl(a,b,c) pci_outsl((volatile unsigned long*)a,(const unsigned long*)b,c) ++#define inl(port) pci_inl(port) ++#define outl(val,port) pci_outl((val),(port)) ++#endif ++ ++#ifndef CONFIG_COLDFIRE ++#define __raw_readb readb ++#define __raw_readw readw ++#define __raw_readl readl ++#define __raw_writeb writeb ++#define __raw_writew writew ++#define __raw_writel writel ++#endif ++ ++#else + /* + * kernel with both ISA and PCI compiled in, those have + * conflicting defs for in/out. Simply consider port < 1024 +@@ -432,6 +486,15 @@ static inline void memcpy_toio(volatile + #define xlate_dev_kmem_ptr(p) p + + #ifdef CONFIG_COLDFIRE ++#define __raw_readb(addr) \ ++ ({ unsigned char __v = (*(volatile unsigned char *) (addr)); __v; }) ++#define __raw_readw(addr) \ ++ ({ unsigned short __v = (*(volatile unsigned short *) (addr)); __v; }) ++#define __raw_readl(addr) \ ++ ({ unsigned long __v = (*(volatile unsigned long *) (addr)); __v; }) ++#define __raw_writeb(b,addr) (void)((*(volatile unsigned char *) (addr)) = (b)) ++#define __raw_writew(b,addr) (void)((*(volatile unsigned short *) (addr)) = (b)) ++#define __raw_writel(b,addr) (void)((*(volatile unsigned int *) (addr)) = (b)) + + #define memset_io(a, b, c) memset((void *)(a), (b), (c)) + #define memcpy_fromio(a, b, c) memcpy((a), (void *)(b), (c)) +--- /dev/null ++++ b/include/asm-m68k/m5485pci.h +@@ -0,0 +1,330 @@ ++/* ++ * m5485pci.h -- ColdFire 547x/548x PCI controller support. ++ */ ++#ifndef __MCF548X_PCI_H__ ++#define __MCF548X_PCI_H__ ++ ++ ++/* PCI Type 0 Configuration Registers */ ++#define MCF_PCIIDR MCF_REG32(0x000B00) /* PCI Device ID/Vendor ID */ ++#define MCF_PCISCR MCF_REG32(0x000B04) /* PCI Status/Command */ ++#define MCF_PCICCRIR MCF_REG32(0x000B08) /* PCI Class Code / Revision ID */ ++#define MCF_PCICR1 MCF_REG32(0x000B0C) /* PCI Configuration 1 Register */ ++#define MCF_PCIBAR0 MCF_REG32(0x000B10) /* PCI Base Address Register 0 */ ++#define MCF_PCIBAR1 MCF_REG32(0x000B14) /* PCI Base Address Register 1 */ ++#define MCF_PCICCPR MCF_REG32(0x000B28) /* PCI Cardbus CIS Pointer */ ++#define MCF_PCISID MCF_REG32(0x000B2C) /* Subsystem ID/Subsystem Vendor ID*/ ++#define MCF_PCIERBAR MCF_REG32(0x000B30) /* PCI Expansion ROM */ ++#define MCF_PCICPR MCF_REG32(0x000B30) /* PCI Capabilities Pointer */ ++#define MCF_PCICR2 MCF_REG32(0x000B3C) /* PCI Configuration Register 2 */ ++ ++/* General Control/Status Registers */ ++#define MCF_PCIGSCR MCF_REG32(0x000B60) /* Global Status/Control Register */ ++#define MCF_PCITBATR0 MCF_REG32(0x000B64) /* Target Base Address Translation 0*/ ++#define MCF_PCITBATR1 MCF_REG32(0x000B68) /* Target Base Address Translation 1*/ ++#define MCF_PCITCR MCF_REG32(0x000B6C) /* Target Control Register */ ++#define MCF_PCIIW0BTAR MCF_REG32(0x000B70) /* Initiator Window 0 Base Address */ ++#define MCF_PCIIW1BTAR MCF_REG32(0x000B74) /* Initiator Window 1 Base Address */ ++#define MCF_PCIIW2BTAR MCF_REG32(0x000B78) /* Initiator Window 2 Base Address */ ++#define MCF_PCIIWCR MCF_REG32(0x000B80) /* Initiator Window Configuration */ ++#define MCF_PCIICR MCF_REG32(0x000B84) /* Initiator Control Register */ ++#define MCF_PCIISR MCF_REG32(0x000B88) /* Initiator Status Register */ ++#define MCF_PCICAR MCF_REG32(0x000BF8) /* Configuration Address Register */ ++ ++/* CommBus FIFO Transmit Interface Registers */ ++#define MCF_PCITPSR MCF_REG32(0x008400) /* Tx Packet Size Register */ ++#define MCF_PCITSAR MCF_REG32(0x008404) /* Tx Start Address Register */ ++#define MCF_PCITTCR MCF_REG32(0x008408) /* Tx Transaction Control Register */ ++#define MCF_PCITER MCF_REG32(0x00840C) /* Tx Enables Register */ ++#define MCF_PCITNAR MCF_REG32(0x008410) /* Tx Next Address Register */ ++#define MCF_PCITLWR MCF_REG32(0x008414) /* Tx Last Word Register */ ++#define MCF_PCITDCR MCF_REG32(0x008418) /* Tx Done Counts Register */ ++#define MCF_PCITSR MCF_REG32(0x00841C) /* Tx Status Register */ ++#define MCF_PCITFDR MCF_REG32(0x008440) /* Tx FIFO Data Register */ ++#define MCF_PCITFSR MCF_REG32(0x008444) /* Tx FIFO Status Register */ ++#define MCF_PCITFCR MCF_REG32(0x008448) /* Tx FIFO Control Register */ ++#define MCF_PCITFAR MCF_REG32(0x00844C) /* Tx FIFO Alarm Register */ ++#define MCF_PCITFRPR MCF_REG32(0x008450) /* Tx FIFO Read Pointer Register */ ++#define MCF_PCITFWPR MCF_REG32(0x008454) /* Tx FIFO Write Pointer Register */ ++ ++/* CommBus FIFO Receive Interface Registers */ ++#define MCF_PCIRPSR MCF_REG32(0x008480) /* Tx Packet Size Register */ ++#define MCF_PCIRSAR MCF_REG32(0x008484) /* Tx Start Address Register */ ++#define MCF_PCIRTCR MCF_REG32(0x008488) /* Tx Transaction Control Register */ ++#define MCF_PCIRER MCF_REG32(0x00848C) /* Tx Enables Register */ ++#define MCF_PCIRNAR MCF_REG32(0x008490) /* Tx Next Address Register */ ++#define MCF_PCIRDCR MCF_REG32(0x008498) /* Tx Done Counts Register */ ++#define MCF_PCIRSR MCF_REG32(0x00849C) /* Tx Status Register */ ++#define MCF_PCIRFDR MCF_REG32(0x0084C0) /* Tx FIFO Data Register */ ++#define MCF_PCIRFSR MCF_REG32(0x0084C4) /* Tx FIFO Status Register */ ++#define MCF_PCIRFCR MCF_REG32(0x0084C8) /* Tx FIFO Control Register */ ++#define MCF_PCIRFAR MCF_REG32(0x0084CC) /* Tx FIFO Alarm Register */ ++#define MCF_PCIRFRPR MCF_REG32(0x0084D0) /* Tx FIFO Read Pointer Register */ ++#define MCF_PCIRFWPR MCF_REG32(0x0084D4) /* Tx FIFO Write Pointer Register */ ++ ++/* PCI Arbiter Registers */ ++#define MCF_PCIARB_PACR MCF_REG32(0x000C00) ++#define MCF_PCIARB_PASR MCF_REG32(0x000C04) ++ ++ ++/* Bit definitions and macros for MCF_PCIIDR */ ++#define MCF_PCIIDR_VENDORID(x) (((x)&0x0000FFFF)<<0) ++#define MCF_PCIIDR_DEVICEID(x) (((x)&0x0000FFFF)<<16) ++ ++/* Bit definitions and macros for MCF_PCISCR */ ++#define MCF_PCISCR_M (0x00000002) ++#define MCF_PCISCR_B (0x00000004) ++#define MCF_PCISCR_SP (0x00000008) ++#define MCF_PCISCR_MW (0x00000010) ++#define MCF_PCISCR_PER (0x00000040) ++#define MCF_PCISCR_S (0x00000100) ++#define MCF_PCISCR_F (0x00000200) ++#define MCF_PCISCR_C (0x00100000) ++#define MCF_PCISCR_66M (0x00200000) ++#define MCF_PCISCR_R (0x00400000) ++#define MCF_PCISCR_FC (0x00800000) ++#define MCF_PCISCR_DP (0x01000000) ++#define MCF_PCISCR_DT(x) (((x)&0x00000003)<<25) ++#define MCF_PCISCR_TS (0x08000000) ++#define MCF_PCISCR_TR (0x10000000) ++#define MCF_PCISCR_MA (0x20000000) ++#define MCF_PCISCR_SE (0x40000000) ++#define MCF_PCISCR_PE (0x80000000) ++ ++/* Bit definitions and macros for MCF_PCICCRIR */ ++#define MCF_PCICCRIR_REVID(x) (((x)&0x000000FF)<<0) ++#define MCF_PCICCRIR_CLASSCODE(x) (((x)&0x00FFFFFF)<<8) ++ ++/* Bit definitions and macros for MCF_PCICR1 */ ++#define MCF_PCICR1_CACHELINESIZE(x) (((x)&0x0000000F)<<0) ++#define MCF_PCICR1_LATTIMER(x) (((x)&0x000000FF)<<8) ++#define MCF_PCICR1_HEADERTYPE(x) (((x)&0x000000FF)<<16) ++#define MCF_PCICR1_BIST(x) (((x)&0x000000FF)<<24) ++ ++/* Bit definitions and macros for MCF_PCIBAR# */ ++#define MCF_PCIBAR0_ADDR(x) (((x)&0x00003FFF)<<18) ++#define MCF_PCIBAR1_ADDR(x) (((x)&0x00000003)<<30) ++ ++/* Bit definitions and macros for MCF_PCICR2 */ ++#define MCF_PCICR2_INTLINE(x) (((x)&0x000000FF)<<0) ++#define MCF_PCICR2_INTPIN(x) (((x)&0x000000FF)<<8) ++#define MCF_PCICR2_MINGNT(x) (((x)&0x000000FF)<<16) ++#define MCF_PCICR2_MAXLAT(x) (((x)&0x000000FF)<<24) ++ ++/* Bit definitions and macros for MCF_PCIGSCR */ ++#define MCF_PCIGSCR_PR (0x00000001) ++#define MCF_PCIGSCR_SEE (0x00001000) ++#define MCF_PCIGSCR_PEE (0x00002000) ++#define MCF_PCIGSCR_SE (0x10000000) ++#define MCF_PCIGSCR_PE (0x20000000) ++ ++/* Bit definitions and macros for MCF_PCITBATR0 */ ++#define MCF_PCITBATR0_EN (0x00000001) ++#define MCF_PCITBATR0_BAT0(x) (((x)&0x00003FFF)<<18) ++ ++/* Bit definitions and macros for MCF_PCITBATR1 */ ++#define MCF_PCITBATR1_EN (0x00000001) ++#define MCF_PCITBATR1_BAT1(x) (((x)&0x00000003)<<30) ++ ++/* Bit definitions and macros for MCF_PCITCR */ ++#define MCF_PCITCR_P (0x00010000) ++#define MCF_PCITCR_LD (0x01000000) ++ ++/* Bit definitions and macros for MCF_PCIIW0BTAR */ ++#define MCF_PCIIW0BTAR_WTA0(x) (((x)&0x000000FF)<<8) ++#define MCF_PCIIW0BTAR_WAM0(x) (((x)&0x000000FF)<<16) ++#define MCF_PCIIW0BTAR_WBA0(x) (((x)&0x000000FF)<<24) ++ ++/* Bit definitions and macros for MCF_PCIIW1BTAR */ ++#define MCF_PCIIW1BTAR_WTA1(x) (((x)&0x000000FF)<<8) ++#define MCF_PCIIW1BTAR_WAM1(x) (((x)&0x000000FF)<<16) ++#define MCF_PCIIW1BTAR_WBA1(x) (((x)&0x000000FF)<<24) ++ ++/* Bit definitions and macros for MCF_PCIIW2BTAR */ ++#define MCF_PCIIW2BTAR_WTA2(x) (((x)&0x000000FF)<<8) ++#define MCF_PCIIW2BTAR_WAM2(x) (((x)&0x000000FF)<<16) ++#define MCF_PCIIW2BTAR_WBA2(x) (((x)&0x000000FF)<<24) ++ ++/* Bit definitions and macros for MCF_PCIIWCR */ ++#define MCF_PCIIWCR_WINCTRL2(x) (((x)&0x0000000F)<<8) ++#define MCF_PCIIWCR_WINCTRL1(x) (((x)&0x0000000F)<<16) ++#define MCF_PCIIWCR_WINCTRL0(x) (((x)&0x0000000F)<<24) ++#define MCF_PCIIWCR_WINCTRL0_MEMREAD (0x01000000) ++#define MCF_PCIIWCR_WINCTRL0_MEMRDLINE (0x03000000) ++#define MCF_PCIIWCR_WINCTRL0_MEMRDMUL (0x05000000) ++#define MCF_PCIIWCR_WINCTRL0_IO (0x09000000) ++#define MCF_PCIIWCR_WINCTRL0_E (0x01000000) ++#define MCF_PCIIWCR_WINCTRL1_MEMREAD (0x00010000) ++#define MCF_PCIIWCR_WINCTRL1_MEMRDLINE (0x00030000) ++#define MCF_PCIIWCR_WINCTRL1_MEMRDMUL (0x00050000) ++#define MCF_PCIIWCR_WINCTRL1_IO (0x00090000) ++#define MCF_PCIIWCR_WINCTRL1_E (0x00010000) ++#define MCF_PCIIWCR_WINCTRL2_MEMREAD (0x00000100) ++#define MCF_PCIIWCR_WINCTRL2_MEMRDLINE (0x00000300) ++#define MCF_PCIIWCR_WINCTRL2_MEMRDMUL (0x00000500) ++#define MCF_PCIIWCR_WINCTRL2_IO (0x00000900) ++#define MCF_PCIIWCR_WINCTRL2_E (0x00000100) ++ ++ ++/* Bit definitions and macros for MCF_PCIICR */ ++#define MCF_PCIICR_MAXRETRY(x) (((x)&0x000000FF)<<0) ++#define MCF_PCIICR_TAE (0x01000000) ++#define MCF_PCIICR_IAE (0x02000000) ++#define MCF_PCIICR_REE (0x04000000) ++ ++/* Bit definitions and macros for MCF_PCIISR */ ++#define MCF_PCIISR_TA (0x01000000) ++#define MCF_PCIISR_IA (0x02000000) ++#define MCF_PCIISR_RE (0x04000000) ++ ++/* Bit definitions and macros for MCF_PCICAR */ ++#define MCF_PCICAR_DWORD(x) (((x)&0x0000003F)<<2) ++#define MCF_PCICAR_FUNCNUM(x) (((x)&0x00000007)<<8) ++#define MCF_PCICAR_DEVNUM(x) (((x)&0x0000001F)<<11) ++#define MCF_PCICAR_BUSNUM(x) (((x)&0x000000FF)<<16) ++#define MCF_PCICAR_E (0x80000000) ++ ++/* Bit definitions and macros for MCF_PCITPSR */ ++#define MCF_PCITPSR_PKTSIZE(x) (((x)&0x0000FFFF)<<16) ++ ++/* Bit definitions and macros for MCF_PCITTCR */ ++#define MCF_PCITTCR_DI (0x00000001) ++#define MCF_PCITTCR_W (0x00000010) ++#define MCF_PCITTCR_MAXBEATS(x) (((x)&0x00000007)<<8) ++#define MCF_PCITTCR_MAXRETRY(x) (((x)&0x000000FF)<<16) ++#define MCF_PCITTCR_PCICMD(x) (((x)&0x0000000F)<<24) ++ ++/* Bit definitions and macros for MCF_PCITER */ ++#define MCF_PCITER_NE (0x00010000) ++#define MCF_PCITER_IAE (0x00020000) ++#define MCF_PCITER_TAE (0x00040000) ++#define MCF_PCITER_RE (0x00080000) ++#define MCF_PCITER_SE (0x00100000) ++#define MCF_PCITER_FEE (0x00200000) ++#define MCF_PCITER_ME (0x01000000) ++#define MCF_PCITER_BE (0x08000000) ++#define MCF_PCITER_CM (0x10000000) ++#define MCF_PCITER_RF (0x40000000) ++#define MCF_PCITER_RC (0x80000000) ++ ++/* Bit definitions and macros for MCF_PCITDCR */ ++#define MCF_PCITDCR_PKTSDONE(x) (((x)&0x0000FFFF)<<0) ++#define MCF_PCITDCR_BYTESDONE(x) (((x)&0x0000FFFF)<<16) ++ ++/* Bit definitions and macros for MCF_PCITSR */ ++#define MCF_PCITSR_IA (0x00010000) ++#define MCF_PCITSR_TA (0x00020000) ++#define MCF_PCITSR_RE (0x00040000) ++#define MCF_PCITSR_SE (0x00080000) ++#define MCF_PCITSR_FE (0x00100000) ++#define MCF_PCITSR_BE1 (0x00200000) ++#define MCF_PCITSR_BE2 (0x00400000) ++#define MCF_PCITSR_BE3 (0x00800000) ++#define MCF_PCITSR_NT (0x01000000) ++ ++/* Bit definitions and macros for MCF_PCITFSR */ ++#define MCF_PCITFSR_EMT (0x00010000) ++#define MCF_PCITFSR_ALARM (0x00020000) ++#define MCF_PCITFSR_FU (0x00040000) ++#define MCF_PCITFSR_FR (0x00080000) ++#define MCF_PCITFSR_OF (0x00100000) ++#define MCF_PCITFSR_UF (0x00200000) ++#define MCF_PCITFSR_RXW (0x00400000) ++ ++/* Bit definitions and macros for MCF_PCITFCR */ ++#define MCF_PCITFCR_OF_MSK (0x00080000) ++#define MCF_PCITFCR_UF_MSK (0x00100000) ++#define MCF_PCITFCR_RXW_MSK (0x00200000) ++#define MCF_PCITFCR_FAE_MSK (0x00400000) ++#define MCF_PCITFCR_IP_MSK (0x00800000) ++#define MCF_PCITFCR_GR(x) (((x)&0x00000007)<<24) ++ ++/* Bit definitions and macros for MCF_PCITFAR */ ++#define MCF_PCITFAR_ALARM(x) (((x)&0x0000007F)<<0) ++ ++/* Bit definitions and macros for MCF_PCITFRPR */ ++#define MCF_PCITFRPR_READ(x) (((x)&0x00000FFF)<<0) ++ ++/* Bit definitions and macros for MCF_PCITFWPR */ ++#define MCF_PCITFWPR_WRITE(x) (((x)&0x00000FFF)<<0) ++ ++/* Bit definitions and macros for MCF_PCIRPSR */ ++#define MCF_PCIRPSR_PKTSIZE(x) (((x)&0x0000FFFF)<<16) ++ ++/* Bit definitions and macros for MCF_PCIRTCR */ ++#define MCF_PCIRTCR_DI (0x00000001) ++#define MCF_PCIRTCR_W (0x00000010) ++#define MCF_PCIRTCR_MAXBEATS(x) (((x)&0x00000007)<<8) ++#define MCF_PCIRTCR_FB (0x00001000) ++#define MCF_PCIRTCR_MAXRETRY(x) (((x)&0x000000FF)<<16) ++#define MCF_PCIRTCR_PCICMD(x) (((x)&0x0000000F)<<24) ++ ++/* Bit definitions and macros for MCF_PCIRER */ ++#define MCF_PCIRER_NE (0x00010000) ++#define MCF_PCIRER_IAE (0x00020000) ++#define MCF_PCIRER_TAE (0x00040000) ++#define MCF_PCIRER_RE (0x00080000) ++#define MCF_PCIRER_SE (0x00100000) ++#define MCF_PCIRER_FEE (0x00200000) ++#define MCF_PCIRER_ME (0x01000000) ++#define MCF_PCIRER_BE (0x08000000) ++#define MCF_PCIRER_CM (0x10000000) ++#define MCF_PCIRER_FE (0x20000000) ++#define MCF_PCIRER_RF (0x40000000) ++#define MCF_PCIRER_RC (0x80000000) ++ ++/* Bit definitions and macros for MCF_PCIRDCR */ ++#define MCF_PCIRDCR_PKTSDONE(x) (((x)&0x0000FFFF)<<0) ++#define MCF_PCIRDCR_BYTESDONE(x) (((x)&0x0000FFFF)<<16) ++ ++/* Bit definitions and macros for MCF_PCIRSR */ ++#define MCF_PCIRSR_IA (0x00010000) ++#define MCF_PCIRSR_TA (0x00020000) ++#define MCF_PCIRSR_RE (0x00040000) ++#define MCF_PCIRSR_SE (0x00080000) ++#define MCF_PCIRSR_FE (0x00100000) ++#define MCF_PCIRSR_BE1 (0x00200000) ++#define MCF_PCIRSR_BE2 (0x00400000) ++#define MCF_PCIRSR_BE3 (0x00800000) ++#define MCF_PCIRSR_NT (0x01000000) ++ ++/* Bit definitions and macros for MCF_PCIRFSR */ ++#define MCF_PCIRFSR_EMT (0x00010000) ++#define MCF_PCIRFSR_ALARM (0x00020000) ++#define MCF_PCIRFSR_FU (0x00040000) ++#define MCF_PCIRFSR_FR (0x00080000) ++#define MCF_PCIRFSR_OF (0x00100000) ++#define MCF_PCIRFSR_UF (0x00200000) ++#define MCF_PCIRFSR_RXW (0x00400000) ++ ++/* Bit definitions and macros for MCF_PCIRFCR */ ++#define MCF_PCIRFCR_OF_MSK (0x00080000) ++#define MCF_PCIRFCR_UF_MSK (0x00100000) ++#define MCF_PCIRFCR_RXW_MSK (0x00200000) ++#define MCF_PCIRFCR_FAE_MSK (0x00400000) ++#define MCF_PCIRFCR_IP_MSK (0x00800000) ++#define MCF_PCIRFCR_GR(x) (((x)&0x00000007)<<24) ++ ++/* Bit definitions and macros for MCF_PCIRFAR */ ++#define MCF_PCIRFAR_ALARM(x) (((x)&0x0000007F)<<0) ++ ++/* Bit definitions and macros for MCF_PCIRFRPR */ ++#define MCF_PCIRFRPR_READ(x) (((x)&0x00000FFF)<<0) ++ ++/* Bit definitions and macros for MCF_PCIRFWPR */ ++#define MCF_PCIRFWPR_WRITE(x) (((x)&0x00000FFF)<<0) ++ ++ ++/* Bit definitions and macros for MCF_PCIARB_PACR */ ++#define MCF_PCIARB_PACR_INTMPRI (0x00000001) ++#define MCF_PCIARB_PACR_EXTMPRI(x) (((x)&0x0000001F)<<1) ++#define MCF_PCIARB_PACR_INTMINTEN (0x00010000) ++#define MCF_PCIARB_PACR_EXTMINTEN(x) (((x)&0x0000001F)<<17) ++#define MCF_PCIARB_PACR_PKMD (0x40000000) ++#define MCF_PCIARB_PACR_DS (0x80000000) ++ ++/* Bit definitions and macros for MCF_PCIARB_PASR */ ++#define MCF_PCIARB_PASR_ITLMBK (0x00010000) ++#define MCF_PCIARB_PASR_EXTMBK(x) (((x)&0x0000001F)<<17) ++ ++#endif /* __MCF548X_PCI_H__ */ +--- a/include/asm-m68k/pci.h ++++ b/include/asm-m68k/pci.h +@@ -1,94 +1,10 @@ +-/* +- * asm-m68k/pci.h - m68k specific PCI declarations. +- * +- * Coldfire Implementation Copyright (c) 2007 Freescale Semiconductor, Inc. +- * Kurt Mahan <kmahan@freescale.com> +- */ +-#ifndef _ASM_M68K_PCI_H +-#define _ASM_M68K_PCI_H ++#ifndef M68K_PCI_H ++#define M68K_PCI_H + +-#ifndef CONFIG_PCI +-/* +- * The PCI address space does equal the physical memory +- * address space. The networking and block device layers use +- * this boolean for bounce buffer decisions. +- */ +-#define PCI_DMA_BUS_IS_PHYS (1) ++#ifdef CONFIG_M5445X ++#include "5445x_pci.h" + #else +-#include <asm-generic/pci-dma-compat.h> +- +-/* +- * The PCI address space does equal the physical memory +- * address space. The networking and block device layers use +- * this boolean for bounce buffer decisions. +- */ +-#define PCI_DMA_BUS_IS_PHYS (1) +- +-#define PCIBIOS_MIN_IO 0x00004000 +-#define PCIBIOS_MIN_MEM 0x02000000 +- +-#define pcibios_assign_all_busses() 0 +-#define pcibios_scan_all_fns(a, b) 0 +- +-static inline void +-pcibios_set_master(struct pci_dev *dev) +-{ +- /* no special bus mastering setup handling */ +-} +- +-static inline void +-pcibios_penalize_isa_irq(int irq, int active) +-{ +- /* no dynamic PCI IRQ allocation */ +-} +- +-#if 0 +-static inline void +-pcibios_add_platform_entries(struct pci_dev *dev) +-{ +- /* no special handling */ +-} ++#include "548x_pci.h" + #endif + +-static inline void +-pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region, +- struct resource *res) +-{ +-#ifdef CONFIG_M54455 +- if ((res->start == 0xa0000000) || (res->start == 0xa8000000)) { +- /* HACK! FIX! kludge to fix bridge mapping */ +- region->start = res->start & 0x0fffffff; +- region->end = res->end & 0x0fffffff; +- } else { +- region->start = res->start; +- region->end = res->end; +- } +-#else +- region->start = res->start; +- region->end = res->end; +-#endif +-} +- +-static inline void +-pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, +- struct pci_bus_region *region) +-{ +- res->start = region->start; +- res->end = region->end; +-} +- +-static inline struct resource * +-pcibios_select_root(struct pci_dev *pdev, struct resource *res) +-{ +- struct resource *root = NULL; +- +- if (res->flags & IORESOURCE_IO) +- root = &ioport_resource; +- if (res->flags & IORESOURCE_MEM) +- root = &iomem_resource; +- +- return root; +-} +- +-#endif /* CONFIG_PCI */ +-#endif /* _ASM_M68K_PCI_H */ ++#endif /* M68K_PCI_H */ +--- a/include/asm-m68k/raw_io.h ++++ b/include/asm-m68k/raw_io.h +@@ -46,6 +46,29 @@ extern void __iounmap(void *addr, unsign + #define out_le16(addr,w) (void)((*(__force volatile __le16 *) (addr)) = cpu_to_le16(w)) + #define out_le32(addr,l) (void)((*(__force volatile __le32 *) (addr)) = cpu_to_le32(l)) + ++#if (defined CONFIG_COLDFIRE) && (defined CONFIG_PCI) ++unsigned char pci_inb(long addr); ++unsigned short pci_inw(long addr); ++unsigned long pci_inl(long addr); ++void pci_outb(unsigned char val, long addr); ++void pci_outw(unsigned short val, long addr); ++void pci_outl(unsigned long val, long addr); ++unsigned short pci_raw_inw(long addr); ++unsigned long pci_raw_inl(long addr); ++void pci_raw_outw(unsigned short val, long addr); ++void pci_raw_outl(unsigned long val, long addr); ++#define raw_inb(port) pci_inb((long)((volatile unsigned char *)(port))) ++#define raw_inw(port) pci_raw_inw((long)((volatile unsigned short *)(port))) ++#define raw_inl(port) pci_raw_inl((long)((volatile unsigned long *)(port))) ++ ++#define raw_outb(val,port) pci_outb((val),(long)((volatile unsigned char *)(port))) ++#define raw_outw(val,port) pci_raw_outw((val),(long)((volatile unsigned short *)(port))) ++#define raw_outl(val,port) pci_raw_outl((val),(long)((volatile unsigned long *)(port))) ++ ++#define swap_inw(port) pci_inw((long)((volatile unsigned short *)(port))) ++#define swap_outw(val,port) pci_outw((val),(long)((volatile unsigned short *)(port))) ++ ++#else + #define raw_inb in_8 + #define raw_inw in_be16 + #define raw_inl in_be32 +@@ -60,6 +83,9 @@ extern void __iounmap(void *addr, unsign + #define __raw_writew(val,addr) out_be16((addr),(val)) + #define __raw_writel(val,addr) out_be32((addr),(val)) + ++#define swap_inw(port) in_le16((port)) ++#define swap_outw(val,port) out_le16((port),(val)) ++#endif + static inline void raw_insb(volatile u8 __iomem *port, u8 *buf, unsigned int len) + { + unsigned int i; +--- a/include/asm-m68k/virtconvert.h ++++ b/include/asm-m68k/virtconvert.h +@@ -46,9 +46,14 @@ static inline void *phys_to_virt(unsigne + #define virt_to_bus(a) (virt_to_phys(a) + (MACH_IS_HADES ? 0x80000000 : 0)) + #define bus_to_virt(a) (phys_to_virt((a) - (MACH_IS_HADES ? 0x80000000 : 0))) + #else ++#ifdef CONFIG_COLDFIRE ++#define virt_to_bus(a) (a - PAGE_OFFSET + PCI_DMA_BASE) ++#define bus_to_virt(a) (a - PCI_DMA_BASE + PAGE_OFFSET) ++#else /* CONFIG_COLDFIRE */ + #define virt_to_bus virt_to_phys + #define bus_to_virt phys_to_virt + #endif ++#endif + + #endif + #endif +--- a/include/linux/pci.h ++++ b/include/linux/pci.h +@@ -458,8 +458,10 @@ int __must_check pcibios_enable_device(s + char *pcibios_setup(char *str); + + /* Used only when drivers/pci/setup.c is used */ ++#ifndef CONFIG_COLDFIRE + void pcibios_align_resource(void *, struct resource *, resource_size_t, + resource_size_t); ++#endif + void pcibios_update_irq(struct pci_dev *, int irq); + + /* Generic PCI functions used internally */ diff --git a/target/linux/coldfire/patches/079-m547x_8x_pci_video_sm712.patch b/target/linux/coldfire/patches/079-m547x_8x_pci_video_sm712.patch new file mode 100644 index 0000000000..7eb27ee686 --- /dev/null +++ b/target/linux/coldfire/patches/079-m547x_8x_pci_video_sm712.patch @@ -0,0 +1,1266 @@ +From a4c49cdc530046ded7a9fbfe9e13eab10d3973c7 Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Thu, 10 Jul 2008 19:19:29 -0600 +Subject: [PATCH] Add PCI Video SM712. + +LTIBName: m547x-8x-pci-video-sm712 +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +Signed-off-by: Shrek Wu <b16972@freescale.com> +--- + drivers/video/Kconfig | 10 + + drivers/video/Makefile | 1 + + drivers/video/cfbimgblt.c | 8 +- + drivers/video/console/bitblit.c | 12 + + drivers/video/console/fbcon.c | 7 +- + drivers/video/smifb.c | 949 +++++++++++++++++++++++++++++++++++++++ + drivers/video/smifb.h | 149 ++++++ + include/linux/fb.h | 13 +- + 8 files changed, 1142 insertions(+), 7 deletions(-) + create mode 100644 drivers/video/smifb.c + create mode 100644 drivers/video/smifb.h + +--- a/drivers/video/Kconfig ++++ b/drivers/video/Kconfig +@@ -201,6 +201,16 @@ config FB_TILEBLITTING + comment "Frame buffer hardware drivers" + depends on FB + ++config FB_SMI ++ tristate "SiliconMotion Lynx support" ++ depends on FB && PCI ++ select FB_CFB_FILLRECT ++ select FB_CFB_COPYAREA ++ select FB_CFB_IMAGEBLIT ++ ---help--- ++ This enables support for the Silicon Motion Lynx family of graphic ++ chips. It has been tested on ColdFire. ++ + config FB_CIRRUS + tristate "Cirrus Logic support" + depends on FB && (ZORRO || PCI) +--- a/drivers/video/Makefile ++++ b/drivers/video/Makefile +@@ -28,6 +28,7 @@ obj-$(CONFIG_FB_DDC) += fb_ddc + obj-$(CONFIG_FB_DEFERRED_IO) += fb_defio.o + + # Hardware specific drivers go first ++obj-$(CONFIG_FB_SMI) += smifb.o + obj-$(CONFIG_FB_AMIGA) += amifb.o c2p.o + obj-$(CONFIG_FB_ARC) += arcfb.o + obj-$(CONFIG_FB_CLPS711X) += clps711xfb.o +--- a/drivers/video/cfbimgblt.c ++++ b/drivers/video/cfbimgblt.c +@@ -44,12 +44,12 @@ + #endif + + static const u32 cfb_tab8[] = { +-#if defined(__BIG_ENDIAN) ++#if defined(__BIG_ENDIAN) && !defined(CONFIG_COLDFIRE) + 0x00000000,0x000000ff,0x0000ff00,0x0000ffff, + 0x00ff0000,0x00ff00ff,0x00ffff00,0x00ffffff, + 0xff000000,0xff0000ff,0xff00ff00,0xff00ffff, + 0xffff0000,0xffff00ff,0xffffff00,0xffffffff +-#elif defined(__LITTLE_ENDIAN) ++#elif defined(__LITTLE_ENDIAN) || defined(CONFIG_COLDFIRE) + 0x00000000,0xff000000,0x00ff0000,0xffff0000, + 0x0000ff00,0xff00ff00,0x00ffff00,0xffffff00, + 0x000000ff,0xff0000ff,0x00ff00ff,0xffff00ff, +@@ -60,9 +60,9 @@ static const u32 cfb_tab8[] = { + }; + + static const u32 cfb_tab16[] = { +-#if defined(__BIG_ENDIAN) ++#if defined(__BIG_ENDIAN) && !defined(CONFIG_COLDFIRE) + 0x00000000, 0x0000ffff, 0xffff0000, 0xffffffff +-#elif defined(__LITTLE_ENDIAN) ++#elif defined(__LITTLE_ENDIAN) || defined(CONFIG_COLDFIRE) + 0x00000000, 0xffff0000, 0x0000ffff, 0xffffffff + #else + #error FIXME: No endianness?? +--- a/drivers/video/console/bitblit.c ++++ b/drivers/video/console/bitblit.c +@@ -78,7 +78,11 @@ static inline void bit_putcs_aligned(str + u32 d_pitch, u32 s_pitch, u32 cellsize, + struct fb_image *image, u8 *buf, u8 *dst) + { ++#ifndef CONFIG_COLDFIRE + u16 charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff; ++#else ++ u32 charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff; ++#endif + u32 idx = vc->vc_font.width >> 3; + u8 *src; + +@@ -111,7 +115,11 @@ static inline void bit_putcs_unaligned(s + struct fb_image *image, u8 *buf, + u8 *dst) + { ++#ifndef CONFIG_COLDFIRE + u16 charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff; ++#else ++ u32 charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff; ++#endif + u32 shift_low = 0, mod = vc->vc_font.width % 8; + u32 shift_high = 8; + u32 idx = vc->vc_font.width >> 3; +@@ -238,7 +246,11 @@ static void bit_cursor(struct vc_data *v + { + struct fb_cursor cursor; + struct fbcon_ops *ops = info->fbcon_par; ++#ifndef CONFIG_COLDFIRE + unsigned short charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff; ++#else ++ unsigned long charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff; ++#endif + int w = (vc->vc_font.width + 7) >> 3, c; + int y = real_y(ops->p, vc->vc_y); + int attribute, use_sw = (vc->vc_cursor_type & 0x10); +--- a/drivers/video/console/fbcon.c ++++ b/drivers/video/console/fbcon.c +@@ -2679,8 +2679,11 @@ static int fbcon_set_palette(struct vc_d + { + struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]]; + int i, j, k, depth; +- u8 val; +- ++#ifndef CONFIG_COLDFIRE ++ u8 val; ++#else ++ u32 val; ++#endif + if (fbcon_is_inactive(vc, info)) + return -EINVAL; + +--- /dev/null ++++ b/drivers/video/smifb.c +@@ -0,0 +1,949 @@ ++/*************************************************************************** ++ smifb.c - Silicon Motion, Inc. LynxEM+ frame buffer device ++ ------------------- ++ begin : Thu Aug 9 2001 ++ copyright : (C) 2001 by Szu-Tao Huang ++ email : johuang@siliconmotion.com ++ ***************************************************************************/ ++ ++/*************************************************************************** ++ * * ++ * This program is free software; you can redistribute it and/or modify * ++ * it under the terms of the GNU General Public License as published by * ++ * the Free Software Foundation; either version 2 of the License, or * ++ * (at your option) any later version. * ++ * * ++ ***************************************************************************/ ++ ++#include <linux/module.h> ++#include <linux/kernel.h> ++#include <linux/errno.h> ++#include <linux/string.h> ++#include <linux/mm.h> ++#include <linux/tty.h> ++#include <linux/slab.h> ++#include <linux/delay.h> ++#include <linux/fb.h> ++#include <linux/pci.h> ++#include <linux/init.h> ++ ++#include <asm/io.h> ++#include <asm/irq.h> ++#include <asm/pgtable.h> ++#include <asm/system.h> ++#include <asm/uaccess.h> ++ ++#include "console/fbcon.h" ++ ++/* ++#include <video/fbcon.h> ++#include <video/fbcon-cfb8.h> ++#include <video/fbcon-cfb16.h> ++#include <video/fbcon-cfb24.h> ++*/ ++ ++#include <linux/fb.h> ++ ++static char *SMIRegs; // point to virtual Memory Map IO starting address ++static char *SMILFB; // point to virtual video memory starting address ++static struct par_info hw; // used to record hardware information ++ ++#include "smifb.h" ++ ++struct ModeInit VGAMode[numVGAModes] = ++{ ++ { ++ /* mode#0: 640 x 480 8Bpp 60Hz */ ++ 640, 480, 8, 60, ++ /* Init_MISC */ ++ 0xE3, ++ { /* Init_SR0_SR4 */ ++ 0x03, 0x01, 0x0F, 0x00, 0x0E, ++ }, ++ { /* Init_SR10_SR24 */ ++ 0xFF, 0xBE, 0xEF, 0xFF, 0x00, 0x0E, 0x17, 0x2C, ++ 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0xC4, 0x30, 0x02, 0x01, 0x01, ++ }, ++ { /* Init_SR30_SR75 */ ++ 0x32, 0x03, 0xA0, 0x09, 0xC0, 0x32, 0x32, 0x32, ++ 0x32, 0x32, 0x32, 0x32, 0x00, 0x00, 0x03, 0xFF, ++ 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC, ++ 0x20, 0x0C, 0x44, 0x20, 0x00, 0x32, 0x32, 0x32, ++ 0x04, 0x24, 0x63, 0x4F, 0x52, 0x0B, 0xDF, 0xEA, ++ 0x04, 0x50, 0x19, 0x32, 0x32, 0x00, 0x00, 0x32, ++ 0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00, ++ 0x50, 0x03, 0x74, 0x14, 0x07, 0x82, 0x07, 0x04, ++ 0x00, 0x45, 0x30, 0x30, 0x40, 0x30, ++ }, ++ { /* Init_SR80_SR93 */ ++ 0xFF, 0x07, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x32, ++ 0xF7, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0x32, 0x32, ++ 0x00, 0x00, 0x00, 0x00, ++ }, ++ { /* Init_SRA0_SRAF */ ++ 0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED, ++ 0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xFF, 0xDF, ++ }, ++ { /* Init_GR00_GR08 */ ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, ++ 0xFF, ++ }, ++ { /* Init_AR00_AR14 */ ++ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, ++ 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, ++ 0x41, 0x00, 0x0F, 0x00, 0x00, ++ }, ++ { /* Init_CR00_CR18 */ ++ 0x5F, 0x4F, 0x4F, 0x00, 0x53, 0x1F, 0x0B, 0x3E, ++ 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0xEA, 0x0C, 0xDF, 0x50, 0x40, 0xDF, 0x00, 0xE3, ++ 0xFF, ++ }, ++ { /* Init_CR30_CR4D */ ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x03, 0x20, ++ 0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xFF, 0xFD, ++ 0x5F, 0x4F, 0x00, 0x54, 0x00, 0x0B, 0xDF, 0x00, ++ 0xEA, 0x0C, 0x2E, 0x00, 0x4F, 0xDF, ++ }, ++ { /* Init_CR90_CRA7 */ ++ 0x56, 0xDD, 0x5E, 0xEA, 0x87, 0x44, 0x8F, 0x55, ++ 0x0A, 0x8F, 0x55, 0x0A, 0x00, 0x00, 0x18, 0x00, ++ 0x11, 0x10, 0x0B, 0x0A, 0x0A, 0x0A, 0x0A, 0x00, ++ }, ++ }, ++ { ++ /* mode#1: 640 x 480 16Bpp 60Hz */ ++ 640, 480, 16, 60, ++ /* Init_MISC */ ++ 0xE3, ++ { /* Init_SR0_SR4 */ ++ 0x03, 0x01, 0x0F, 0x00, 0x0E, ++ }, ++ { /* Init_SR10_SR24 */ ++ 0xFF, 0xBE, 0xEF, 0xFF, 0x00, 0x0E, 0x17, 0x2C, ++ 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0xC4, 0x30, 0x02, 0x01, 0x01, ++ }, ++ { /* Init_SR30_SR75 */ ++ 0x32, 0x03, 0xA0, 0x09, 0xC0, 0x32, 0x32, 0x32, ++ 0x32, 0x32, 0x32, 0x32, 0x00, 0x00, 0x03, 0xFF, ++ 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC, ++ 0x20, 0x0C, 0x44, 0x20, 0x00, 0x32, 0x32, 0x32, ++ 0x04, 0x24, 0x63, 0x4F, 0x52, 0x0B, 0xDF, 0xEA, ++ 0x04, 0x50, 0x19, 0x32, 0x32, 0x00, 0x00, 0x32, ++ 0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00, ++ 0x50, 0x03, 0x74, 0x14, 0x07, 0x82, 0x07, 0x04, ++ 0x00, 0x45, 0x30, 0x30, 0x40, 0x30, ++ }, ++ { /* Init_SR80_SR93 */ ++ 0xFF, 0x07, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x32, ++ 0xF7, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0x32, 0x32, ++ 0x00, 0x00, 0x00, 0x00, ++ }, ++ { /* Init_SRA0_SRAF */ ++ 0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED, ++ 0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xFF, 0xDF, ++ }, ++ { /* Init_GR00_GR08 */ ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, ++ 0xFF, ++ }, ++ { /* Init_AR00_AR14 */ ++ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, ++ 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, ++ 0x41, 0x00, 0x0F, 0x00, 0x00, ++ }, ++ { /* Init_CR00_CR18 */ ++ 0x5F, 0x4F, 0x4F, 0x00, 0x53, 0x1F, 0x0B, 0x3E, ++ 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0xEA, 0x0C, 0xDF, 0x50, 0x40, 0xDF, 0x00, 0xE3, ++ 0xFF, ++ }, ++ { /* Init_CR30_CR4D */ ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x03, 0x20, ++ 0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xFF, 0xFD, ++ 0x5F, 0x4F, 0x00, 0x54, 0x00, 0x0B, 0xDF, 0x00, ++ 0xEA, 0x0C, 0x2E, 0x00, 0x4F, 0xDF, ++ }, ++ { /* Init_CR90_CRA7 */ ++ 0x56, 0xDD, 0x5E, 0xEA, 0x87, 0x44, 0x8F, 0x55, ++ 0x0A, 0x8F, 0x55, 0x0A, 0x00, 0x00, 0x18, 0x00, ++ 0x11, 0x10, 0x0B, 0x0A, 0x0A, 0x0A, 0x0A, 0x00, ++ }, ++ }, ++ { ++ /* mode#2: 640 x 480 24Bpp 60Hz */ ++ 640, 480, 24, 60, ++ /* Init_MISC */ ++ 0xE3, ++ { /* Init_SR0_SR4 */ ++ 0x03, 0x01, 0x0F, 0x00, 0x0E, ++ }, ++ { /* Init_SR10_SR24 */ ++ 0xFF, 0xBE, 0xEF, 0xFF, 0x00, 0x0E, 0x17, 0x2C, ++ 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0xC4, 0x30, 0x02, 0x01, 0x01, ++ }, ++ { /* Init_SR30_SR75 */ ++ 0x32, 0x03, 0xA0, 0x09, 0xC0, 0x32, 0x32, 0x32, ++ 0x32, 0x32, 0x32, 0x32, 0x00, 0x00, 0x03, 0xFF, ++ 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC, ++ 0x20, 0x0C, 0x44, 0x20, 0x00, 0x32, 0x32, 0x32, ++ 0x04, 0x24, 0x63, 0x4F, 0x52, 0x0B, 0xDF, 0xEA, ++ 0x04, 0x50, 0x19, 0x32, 0x32, 0x00, 0x00, 0x32, ++ 0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00, ++ 0x50, 0x03, 0x74, 0x14, 0x07, 0x82, 0x07, 0x04, ++ 0x00, 0x45, 0x30, 0x30, 0x40, 0x30, ++ }, ++ { /* Init_SR80_SR93 */ ++ 0xFF, 0x07, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x32, ++ 0xF7, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0x32, 0x32, ++ 0x00, 0x00, 0x00, 0x00, ++ }, ++ { /* Init_SRA0_SRAF */ ++ 0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED, ++ 0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xFF, 0xDF, ++ }, ++ { /* Init_GR00_GR08 */ ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, ++ 0xFF, ++ }, ++ { /* Init_AR00_AR14 */ ++ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, ++ 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, ++ 0x41, 0x00, 0x0F, 0x00, 0x00, ++ }, ++ { /* Init_CR00_CR18 */ ++ 0x5F, 0x4F, 0x4F, 0x00, 0x53, 0x1F, 0x0B, 0x3E, ++ 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0xEA, 0x0C, 0xDF, 0x50, 0x40, 0xDF, 0x00, 0xE3, ++ 0xFF, ++ }, ++ { /* Init_CR30_CR4D */ ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x03, 0x20, ++ 0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xFF, 0xFD, ++ 0x5F, 0x4F, 0x00, 0x54, 0x00, 0x0B, 0xDF, 0x00, ++ 0xEA, 0x0C, 0x2E, 0x00, 0x4F, 0xDF, ++ }, ++ { /* Init_CR90_CRA7 */ ++ 0x56, 0xDD, 0x5E, 0xEA, 0x87, 0x44, 0x8F, 0x55, ++ 0x0A, 0x8F, 0x55, 0x0A, 0x00, 0x00, 0x18, 0x00, ++ 0x11, 0x10, 0x0B, 0x0A, 0x0A, 0x0A, 0x0A, 0x00, ++ }, ++ }, ++ {/* mode#3: 800 x 600 8Bpp 60Hz */ ++ 800,600,8,60, ++ 0x2B, /* Init_MISC */ ++ { /* Init_SR0_SR4 */ ++ 0x03, 0x01, 0x0F, 0x03, 0x0E, ++ }, ++ { /* Init_SR10_SR24 */ ++ 0xFF, 0xBE, 0xEE, 0xFF, 0x00, 0x0E, 0x17, 0x2C, ++ 0x99, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0xC4, 0x30, 0x02, 0x01, 0x01, ++ }, ++ { /* Init_SR30_SR75 */ ++ 0x24, 0x03, 0x20, 0x09, 0xC0, 0x24, 0x24, 0x24, ++ 0x24, 0x24, 0x24, 0x24, 0x00, 0x00, 0x03, 0xFF, ++ 0x00, 0xFC, 0x00, 0x00, 0x20, 0x38, 0x00, 0xFC, ++ 0x20, 0x0C, 0x44, 0x20, 0x00, 0x24, 0x24, 0x24, ++ 0x04, 0x48, 0x83, 0x63, 0x68, 0x72, 0x57, 0x58, ++ 0x04, 0x55, 0x59, 0x24, 0x24, 0x00, 0x00, 0x24, ++ 0x01, 0x80, 0x7A, 0x1A, 0x1A, 0x00, 0x00, 0x00, ++ 0x50, 0x03, 0x74, 0x14, 0x1C, 0x85, 0x35, 0x13, ++ 0x02, 0x45, 0x30, 0x35, 0x40, 0x20, ++ }, ++ { /* Init_SR80_SR93 */ ++ 0xFF, 0x87, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x24, ++ 0x90, 0x01, 0x2C, 0x01, 0xFF, 0x00, 0x24, 0x24, ++ 0x00, 0x00, 0x00, 0x00, ++ }, ++ { /* Init_SRA0_SRAF */ ++ 0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED, ++ 0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xBF, 0xDF, ++ }, ++ { /* Init_GR00_GR08 */ ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, ++ 0xFF, ++ }, ++ { /* Init_AR00_AR14 */ ++ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, ++ 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, ++ 0x41, 0x00, 0x0F, 0x00, 0x00, ++ }, ++ { /* Init_CR00_CR18 */ ++ 0x7F, 0x63, 0x63, 0x00, 0x68, 0x18, 0x72, 0xF0, ++ 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x58, 0x0C, 0x57, 0x64, 0x40, 0x57, 0x00, 0xE3, ++ 0xFF, ++ }, ++ { /* Init_CR30_CR4D */ ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x03, 0x20, ++ 0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xBF, 0xFD, ++ 0x7F, 0x63, 0x00, 0x69, 0x18, 0x72, 0x57, 0x00, ++ 0x58, 0x0C, 0xE0, 0x20, 0x63, 0x57, ++ }, ++ { /* Init_CR90_CRA7 */ ++ 0x56, 0x4B, 0x5E, 0x55, 0x86, 0x9D, 0x8E, 0xAA, ++ 0xDB, 0x2A, 0xDF, 0x33, 0x00, 0x00, 0x18, 0x00, ++ 0x20, 0x1F, 0x1A, 0x19, 0x0F, 0x0F, 0x0F, 0x00, ++ }, ++ }, ++ {/* mode#4: 800 x 600 16Bpp 60Hz */ ++ 800, 600, 16, 60, ++ /* Init_MISC */ ++ 0x2B, ++ { /* Init_SR0_SR4 */ ++ 0x03, 0x01, 0x0F, 0x03, 0x0E, ++ }, ++ { /* Init_SR10_SR24 */ ++ 0xFF, 0xBE, 0xEE, 0xFF, 0x00, 0x0E, 0x17, 0x2C, ++ 0x99, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0xC4, 0x30, 0x02, 0x01, 0x01, ++ }, ++ { /* Init_SR30_SR75 */ ++ 0x24, 0x03, 0x20, 0x09, 0xC0, 0x24, 0x24, 0x24, ++ 0x24, 0x24, 0x24, 0x24, 0x00, 0x00, 0x03, 0xFF, ++ 0x00, 0xFC, 0x00, 0x00, 0x20, 0x38, 0x00, 0xFC, ++ 0x20, 0x0C, 0x44, 0x20, 0x00, 0x24, 0x24, 0x24, ++ 0x04, 0x48, 0x83, 0x63, 0x68, 0x72, 0x57, 0x58, ++ 0x04, 0x55, 0x59, 0x24, 0x24, 0x00, 0x00, 0x24, ++ 0x01, 0x80, 0x7A, 0x1A, 0x1A, 0x00, 0x00, 0x00, ++ 0x50, 0x03, 0x74, 0x14, 0x1C, 0x85, 0x35, 0x13, ++ 0x02, 0x45, 0x30, 0x35, 0x40, 0x20, ++ }, ++ { /* Init_SR80_SR93 */ ++ 0x00, 0x00, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x24, ++ 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x24, 0x24, ++ 0x00, 0x00, 0x00, 0x00, ++ }, ++ { /* Init_SRA0_SRAF */ ++ 0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED, ++ 0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xBF, 0xDF, ++ }, ++ { /* Init_GR00_GR08 */ ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, ++ 0xFF, ++ }, ++ { /* Init_AR00_AR14 */ ++ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, ++ 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, ++ 0x41, 0x00, 0x0F, 0x00, 0x00, ++ }, ++ { /* Init_CR00_CR18 */ ++ 0x7F, 0x63, 0x63, 0x00, 0x68, 0x18, 0x72, 0xF0, ++ 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x58, 0x0C, 0x57, 0x64, 0x40, 0x57, 0x00, 0xE3, ++ 0xFF, ++ }, ++ { /* Init_CR30_CR4D */ ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x03, 0x20, ++ 0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xBF, 0xFD, ++ 0x7F, 0x63, 0x00, 0x69, 0x18, 0x72, 0x57, 0x00, ++ 0x58, 0x0C, 0xE0, 0x20, 0x63, 0x57, ++ }, ++ { /* Init_CR90_CRA7 */ ++ 0x56, 0x4B, 0x5E, 0x55, 0x86, 0x9D, 0x8E, 0xAA, ++ 0xDB, 0x2A, 0xDF, 0x33, 0x00, 0x00, 0x18, 0x00, ++ 0x20, 0x1F, 0x1A, 0x19, 0x0F, 0x0F, 0x0F, 0x00, ++ }, ++ }, ++ {/* mode#5: 800 x 600 24Bpp 60Hz */ ++ 800,600,24,60, ++ 0x2B, ++ { /* Init_SR0_SR4 */ ++ 0x03, 0x01, 0x0F, 0x03, 0x0E, ++ }, ++ { /* Init_SR10_SR24 */ ++ 0xFF, 0xBE, 0xEE, 0xFF, 0x00, 0x0E, 0x17, 0x2C, ++ 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0xC4, 0x30, 0x02, 0x01, 0x01, ++ }, ++ { /* Init_SR30_SR75 */ ++ 0x36, 0x03, 0x20, 0x09, 0xC0, 0x36, 0x36, 0x36, ++ 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x03, 0xFF, ++ 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC, ++ 0x20, 0x0C, 0x44, 0x20, 0x00, 0x36, 0x36, 0x36, ++ 0x04, 0x48, 0x83, 0x63, 0x68, 0x72, 0x57, 0x58, ++ 0x04, 0x55, 0x59, 0x36, 0x36, 0x00, 0x00, 0x36, ++ 0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00, ++ 0x50, 0x03, 0x74, 0x14, 0x1C, 0x85, 0x35, 0x13, ++ 0x02, 0x45, 0x30, 0x30, 0x40, 0x20, ++ }, ++ { /* Init_SR80_SR93 */ ++ 0xFF, 0x07, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x36, ++ 0xF7, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0x36, 0x36, ++ 0x00, 0x00, 0x00, 0x00, ++ }, ++ { /* Init_SRA0_SRAF */ ++ 0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED, ++ 0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xBF, 0xDF, ++ }, ++ { /* Init_GR00_GR08 */ ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, ++ 0xFF, ++ }, ++ { /* Init_AR00_AR14 */ ++ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, ++ 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, ++ 0x41, 0x00, 0x0F, 0x00, 0x00, ++ }, ++ { /* Init_CR00_CR18 */ ++ 0x7F, 0x63, 0x63, 0x00, 0x68, 0x18, 0x72, 0xF0, ++ 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x58, 0x0C, 0x57, 0x64, 0x40, 0x57, 0x00, 0xE3, ++ 0xFF, ++ }, ++ { /* Init_CR30_CR4D */ ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x03, 0x20, ++ 0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xBF, 0xFD, ++ 0x7F, 0x63, 0x00, 0x69, 0x18, 0x72, 0x57, 0x00, ++ 0x58, 0x0C, 0xE0, 0x20, 0x63, 0x57, ++ }, ++ { /* Init_CR90_CRA7 */ ++ 0x56, 0x4B, 0x5E, 0x55, 0x86, 0x9D, 0x8E, 0xAA, ++ 0xDB, 0x2A, 0xDF, 0x33, 0x00, 0x00, 0x18, 0x00, ++ 0x20, 0x1F, 0x1A, 0x19, 0x0F, 0x0F, 0x0F, 0x00, ++ }, ++ }, ++}; ++ ++static void smi_set_timing(struct smifb_info *sfb,struct par_info *hw) ++{ ++ int i=0,j=0; ++ u32 m_nScreenStride; ++ ++ ++ for (j=0;j < numVGAModes;j++) { ++ if (VGAMode[j].mmSizeX == hw->width && ++ VGAMode[j].mmSizeY == hw->height && ++ VGAMode[j].bpp == sfb->fb.var.bits_per_pixel && ++ VGAMode[j].hz == hw->hz) ++ { ++ ++ smi_mmiowb(0x0,0x3c6); ++ ++ smi_seqw(0,0x1); ++ ++ smi_mmiowb(VGAMode[j].Init_MISC,0x3c2); ++ ++ for (i=0;i<SIZE_SR00_SR04;i++) // init SEQ register SR00 - SR04 ++ { ++ smi_seqw(i,VGAMode[j].Init_SR00_SR04[i]); ++ } ++ ++ for (i=0;i<SIZE_SR10_SR24;i++) // init SEQ register SR10 - SR24 ++ { ++ smi_seqw(i+0x10,VGAMode[j].Init_SR10_SR24[i]); ++ } ++ ++ for (i=0;i<SIZE_SR30_SR75;i++) // init SEQ register SR30 - SR75 ++ { ++ if (((i+0x30) != 0x62) && ((i+0x30) != 0x6a) && ((i+0x30) != 0x6b)) ++ smi_seqw(i+0x30,VGAMode[j].Init_SR30_SR75[i]); ++ } ++ for (i=0;i<SIZE_SR80_SR93;i++) // init SEQ register SR80 - SR93 ++ { ++ smi_seqw(i+0x80,VGAMode[j].Init_SR80_SR93[i]); ++ } ++ for (i=0;i<SIZE_SRA0_SRAF;i++) // init SEQ register SRA0 - SRAF ++ { ++ smi_seqw(i+0xa0,VGAMode[j].Init_SRA0_SRAF[i]); ++ } ++ ++ for (i=0;i<SIZE_GR00_GR08;i++) // init Graphic register GR00 - GR08 ++ { ++ smi_grphw(i,VGAMode[j].Init_GR00_GR08[i]); ++ } ++ ++ for (i=0;i<SIZE_AR00_AR14;i++) // init Attribute register AR00 - AR14 ++ { ++ ++ smi_attrw(i,VGAMode[j].Init_AR00_AR14[i]); ++ } ++ ++ for (i=0;i<SIZE_CR00_CR18;i++) // init CRTC register CR00 - CR18 ++ { ++ smi_crtcw(i,VGAMode[j].Init_CR00_CR18[i]); ++ } ++ ++ for (i=0;i<SIZE_CR30_CR4D;i++) // init CRTC register CR30 - CR4D ++ { ++ smi_crtcw(i+0x30,VGAMode[j].Init_CR30_CR4D[i]); ++ } ++ ++ for (i=0;i<SIZE_CR90_CRA7;i++) // init CRTC register CR90 - CRA7 ++ { ++ smi_crtcw(i+0x90,VGAMode[j].Init_CR90_CRA7[i]); ++ } ++ } ++ } ++ smi_mmiowb(0x67,0x3c2); ++ // set VPR registers ++ writel(0x0,hw->m_pVPR+0x0C); ++ writel(0x0,hw->m_pVPR+0x40); ++ // set data width ++ m_nScreenStride = (hw->width * sfb->fb.var.bits_per_pixel) / 64; ++ switch (sfb->fb.var.bits_per_pixel) ++ { ++ case 8: ++ writel(0x0,hw->m_pVPR+0x0); ++ break; ++ case 16: ++ writel(0x00020000,hw->m_pVPR+0x0); ++ break; ++ case 24: ++ writel(0x00040000,hw->m_pVPR+0x0); ++ break; ++ } ++ writel((u32)(((m_nScreenStride + 2) << 16) | m_nScreenStride),hw->m_pVPR+0x10); ++} ++ ++/* ++ * Set the color palette ++ */ ++static int ++smifb_setcolreg(u_int regno, u_int red, u_int green, u_int blue, ++ u_int trans, struct fb_info *info) ++{ ++ ++ struct smifb_info *sfb = (struct smifbinfo *)info; ++ u32 *pal; ++ ++ switch (sfb->fb.fix.visual) { ++ case FB_VISUAL_TRUECOLOR: /* RGB 5:6:5 True Colour */ ++ pal = sfb->fb.pseudo_palette; // System has 16 default color ++ if (regno >= 16) ++ return 1; ++ ++ pal[regno] = (red & 0xf800) | ++ ((green & 0xfc00) >> 5) | ((blue & 0xf800) >> 11); ++ break; ++ } ++ ++ return 0; ++} ++ ++/* ++ * smifb_decode_var(): ++ * Get the video params out of 'var'. If a value doesn't fit, round it up, ++ * if it's too big, return -EINVAL. ++ * ++ * Suggestion: Round up in the following order: bits_per_pixel, xres, ++ * yres, xres_virtual, yres_virtual, xoffset, yoffset, grayscale, ++ * bitfields, horizontal timing, vertical timing. ++ */ ++static int smifb_decode_var(struct fb_var_screeninfo *var, struct smifb_info *sfb, struct par_info *hw) ++{ ++ hw->width = var->xres; ++ hw->height = var->yres; ++ hw->hz = 60; ++ ++ return 0; ++} ++ ++static int smifb_set_par (struct fb_info *info) ++{ ++ struct smifb_info *sfb = (struct smifb_info *)info; ++ int err, chgvar = 0; ++ struct fb_var_screeninfo *var = &info->var; ++ struct fb_cmap *cmap; ++ ++ ++ /* ++ * Decode var contents into a par structure, adjusting any ++ * out of range values. ++ */ ++ err = smifb_decode_var(var, sfb, &hw); ++ if (err) { ++ return err; ++ } ++ ++ if (hw.width != var->xres) ++ chgvar = 1; ++ if (hw.height != var->yres) ++ chgvar = 1; ++ ++ var->activate &= ~FB_ACTIVATE_ALL; ++ ++ smi_set_timing(sfb, &hw); ++ ++ sfb->palette_size = var->bits_per_pixel == 8 ? 256 : 16; ++ cmap = fb_default_cmap(sfb->palette_size); ++ fb_set_cmap(cmap, &sfb->fb); ++ ++ return 0; ++} ++ ++static int smifb_check_var (struct fb_var_screeninfo *var, struct fb_info *info) ++{ ++ var->bits_per_pixel += 7; ++ var->bits_per_pixel &= ~7; ++ ++ var->xres_virtual = ++ var->xres_virtual < var->xres ? var->xres : var->xres_virtual; ++ var->yres_virtual = ++ var->yres_virtual < var->yres ? var->yres : var->yres_virtual; ++ ++ switch (var->bits_per_pixel) { ++ case 8: ++ case 16: /* RGB 565 */ ++ case 24: ++ break; ++ default: ++ return -EINVAL; ++ } ++ ++ switch (var->bits_per_pixel) { ++ case 16: ++ var->red.offset = 11; ++ var->red.length = 5; ++ var->green.offset = 5; ++ var->green.length = 6; ++ var->blue.offset = 0; ++ var->blue.length = 5; ++ ++ info->fix.visual = FB_VISUAL_TRUECOLOR; ++ info->fix.line_length= var->xres * 2; ++ ++ break; ++ default: ++ return -EINVAL; /* We don't support anything other than 16bpp for now. --NL */ ++ break; ++ } ++ return 0; ++ ++// smifb_set_color_bitfields(var); ++ ++ return 0; ++} ++ ++/* ++ * Formal definition of the VESA spec: ++ * On ++ * This refers to the state of the display when it is in full operation ++ * Stand-By ++ * This defines an optional operating state of minimal power reduction with ++ * the shortest recovery time ++ * Suspend ++ * This refers to a level of power management in which substantial power ++ * reduction is achieved by the display. The display can have a longer ++ * recovery time from this state than from the Stand-by state ++ * Off ++ * This indicates that the display is consuming the lowest level of power ++ * and is non-operational. Recovery from this state may optionally require ++ * the user to manually power on the monitor ++ * ++ * Now, the fbdev driver adds an additional state, (blank), where they ++ * turn off the video (maybe by colormap tricks), but don't mess with the ++ * video itself: think of it semantically between on and Stand-By. ++ * ++ * So here's what we should do in our fbdev blank routine: ++ * ++ * VESA_NO_BLANKING (mode 0) Video on, front/back light on ++ * VESA_VSYNC_SUSPEND (mode 1) Video on, front/back light off ++ * VESA_HSYNC_SUSPEND (mode 2) Video on, front/back light off ++ * VESA_POWERDOWN (mode 3) Video off, front/back light off ++ * ++ * This will match the matrox implementation. ++ */ ++/* ++ * smifb_blank(): ++ * Blank the display by setting all palette values to zero. Note, the ++ * 12 and 16 bpp modes don't really use the palette, so this will not ++ * blank the display in all modes. ++ */ ++static int smifb_blank(int blank, struct fb_info *info) ++{ ++// struct smifb_info *sfb = (struct smifb_info *)info; ++#if 0 ++ switch (blank) { ++ case VESA_POWERDOWN: ++ case VESA_VSYNC_SUSPEND: ++ case VESA_HSYNC_SUSPEND: ++ case VESA_NO_BLANKING: ++ } ++#endif ++ return 1; ++} ++ ++static struct fb_ops smifb_ops = { ++ .owner = THIS_MODULE, ++ .fb_check_var = smifb_check_var, ++ .fb_set_par = smifb_set_par, ++ .fb_setcolreg = smifb_setcolreg, ++ .fb_blank = smifb_blank, ++ ++ /* Accelerated functions, using softversions, per se */ ++ .fb_fillrect = cfb_fillrect, ++ .fb_copyarea = cfb_copyarea, ++ .fb_imageblit = cfb_imageblit, ++ .fb_cursor = soft_cursor, ++}; ++ ++/* ++ * Alloc struct smifb_info and assign the default value ++ */ ++static struct smifb_info * __devinit ++smi_alloc_fb_info(struct pci_dev *dev, char *name) ++{ ++ struct smifb_info *sfb; ++ ++ sfb = kmalloc(sizeof(struct smifb_info) + sizeof(u32) * 16, GFP_KERNEL); ++ ++ if (!sfb) ++ return NULL; ++ ++ memset(sfb, 0, sizeof(struct smifb_info)); ++ ++ sfb->currcon = -1; ++ sfb->dev = dev; ++ ++ strcpy(sfb->fb.fix.id, name); ++ ++ sfb->fb.fix.type = FB_TYPE_PACKED_PIXELS; ++ sfb->fb.fix.type_aux = 0; ++ sfb->fb.fix.xpanstep = 0; ++ sfb->fb.fix.ypanstep = 0; ++ sfb->fb.fix.ywrapstep = 0; ++ sfb->fb.fix.accel = FB_ACCEL_NONE; ++ ++ sfb->fb.var.nonstd = 0; ++ sfb->fb.var.activate = FB_ACTIVATE_NOW; ++ sfb->fb.var.height = -1; ++ sfb->fb.var.width = -1; ++ sfb->fb.var.accel_flags = 0; ++ sfb->fb.var.vmode = FB_VMODE_NONINTERLACED; ++ ++ sfb->fb.fbops = &smifb_ops; ++ sfb->fb.flags = FBINFO_FLAG_DEFAULT; ++ sfb->fb.node = -1; ++ sfb->fb.pseudo_palette = (void *)(&sfb->palette_size + 1); ++ ++ return sfb; ++} ++ ++/* ++ * Unmap in the memory mapped IO registers ++ * ++ */ ++ ++static void __devinit ++smi_unmap_mmio(struct smifb_info *sfb) ++{ ++ if (sfb && SMILFB) ++ { ++ iounmap(SMILFB); ++ SMIRegs = NULL; ++ } ++} ++ ++/* ++ * Map in the screen memory ++ * ++ */ ++static int __devinit ++smi_map_smem(struct smifb_info *sfb, struct pci_dev *dev, u_long smem_len) ++{ ++ ++ sfb->fb.fix.smem_start = pci_resource_start(dev, 0); ++ sfb->fb.fix.smem_len = smem_len; ++ printk("%s:smem %x,len %x\n",sfb->fb.fix.smem_start,sfb->fb.fix.smem_len); ++ sfb->fb.screen_base = SMILFB; ++ ++ if (!sfb->fb.screen_base) ++ { ++ printk("%s: unable to map screen memory\n",sfb->fb.fix.id); ++ return -ENOMEM; ++ } ++ ++ return 0; ++} ++ ++ ++/* ++ * Unmap in the screen memory ++ * ++ */ ++static void __devinit ++smi_unmap_smem(struct smifb_info *sfb) ++{ ++ if (sfb && sfb->fb.screen_base) ++ { ++ iounmap(sfb->fb.screen_base); ++ sfb->fb.screen_base = NULL; ++ } ++} ++ ++/* ++ * We need to wake up the LynxEM+, and make sure its in linear memory mode. ++ */ ++static inline void __devinit ++smi_init_hw(void) ++{ ++ /* The delays prevent the ColdFire PCI host from locking up. :/ --NL */ ++ udelay(1000); ++ outb(0x18, 0x3c4); ++ udelay(1000); ++ outb(0x11, 0x3c5); ++ udelay(1000); ++ printk("%s: 0x3c4 =%x 0x3c5 %x\n",__FUNCTION__,inw(0x3c4),inw(0x3c5)); ++} ++ ++static void __devinit ++smi_free_fb_info(struct smifb_info *sfb) ++{ ++ if (sfb) { ++ fb_alloc_cmap(&sfb->fb.cmap, 0, 0); ++ kfree(sfb); ++ } ++} ++ ++ ++u16 SMI_ChipIDs[numChipIDs] = {0x710, 0x712, 0x720}; ++ ++int __init smifb_init(struct pci_dev *pdev, const struct pci_device_id *ent) ++{ ++ struct smifb_info *sfb; ++ u_long smem_size; ++ char name[16]; ++ int err; ++ char *m_pLAW; ++ ulong m_pLAWPhysical; ++ ++ printk("%s start\n",__FUNCTION__); ++ sprintf(name, "smifb"); ++ ++ hw.chipID = pdev->device; ++ ++ err = -ENOMEM; ++ sfb = smi_alloc_fb_info(pdev, name); ++ if (!sfb) { ++ goto failed; ++ } ++ ++ smi_init_hw(); ++ ++ // Map address and memory detection ++ m_pLAWPhysical = pci_resource_start(pdev,0); ++ printk("%s:m_pLAWPhysical %x,hw.chipID %x\n",__FUNCTION__,m_pLAWPhysical,hw.chipID); ++ switch (hw.chipID) { ++ case 0x710: ++ case 0x712: ++ sfb->fb.fix.mmio_start = m_pLAWPhysical + 0x00700000; ++ sfb->fb.fix.mmio_len = 0x00100000; ++ ++ hw.m_pLFB = SMILFB = ioremap(m_pLAWPhysical, 0x00800000); ++ printk("%s:SMILFB%x\n",__FUNCTION__,SMILFB); ++ hw.m_pMMIO = SMIRegs = SMILFB + 0x00700000; ++ hw.m_pDPR = hw.m_pLFB + 0x00408000; ++ hw.m_pVPR = hw.m_pLFB + 0x0040c000; ++ ++ if (!SMIRegs) ++ { ++ printk("%s: unable to map memory mapped IO\n",sfb->fb.fix.id); ++ return -ENOMEM; ++ } ++ ++ smi_seqw(0x62,0x7A); ++ smi_seqw(0x6a,0x0c); ++ smi_seqw(0x6b,0x02); ++ smem_size = 0x00400000; ++ ++ //LynxEM+ memory dection ++ *(u32 *)(SMILFB + 4) = 0xAA551133; ++ if (*(u32 *)(SMILFB + 4) != 0xAA551133) ++ { ++ smem_size = 0x00200000; ++ // Program the MCLK to 130 MHz ++ smi_seqw(0x6a,0x12); ++ smi_seqw(0x6b,0x02); ++ smi_seqw(0x62,0x3e); ++ } ++ break; ++ case 0x720: ++ sfb->fb.fix.mmio_start = m_pLAWPhysical + 0x000c0000; ++ sfb->fb.fix.mmio_len = 0x00040000; ++ ++ m_pLAW = ioremap(m_pLAWPhysical, 0x00a00000); ++ hw.m_pLFB = SMILFB = m_pLAW + 0x00200000; ++ hw.m_pMMIO = SMIRegs = m_pLAW + 0x000c0000; ++ hw.m_pDPR = m_pLAW; ++ hw.m_pVPR = m_pLAW + 0x800; ++ ++ smi_seqw(0x62,0xff); ++ smi_seqw(0x6a,0x0d); ++ smi_seqw(0x6b,0x02); ++ smem_size = 0x00400000; ++ ++ break; ++ } ++ ++ sfb->fb.var.xres = 640; ++ sfb->fb.var.yres = 480; ++ sfb->fb.var.bits_per_pixel = 16; ++ ++ sfb->fb.var.xres_virtual = sfb->fb.var.xres; ++ ++ sfb->fb.var.yres_virtual = sfb->fb.var.yres; ++ ++ sfb->fb.flags = FBINFO_FLAG_DEFAULT; ++ ++ printk("%s:smem_size %x\n",__FUNCTION__,smem_size); ++ err = smi_map_smem(sfb, pdev, smem_size); ++ printk("%s:smi_map_smem error %x\n",__FUNCTION__,err); ++ if (err) { ++ goto failed; ++ } ++ ++ ++ ++ fb_set_var(&sfb->fb, &sfb->fb.var); ++ smifb_check_var(&sfb->fb.var, &sfb->fb); ++ smifb_set_par(sfb); ++ printk("%s:register_framebuffer \n",__FUNCTION__); ++ err = register_framebuffer(&sfb->fb); ++ if (err < 0) { ++ goto failed; ++ } ++ ++ printk("Silicon Motion, Inc. LynxEM+ Init complete.\n"); ++ ++ return 0; ++ ++failed: ++ smi_unmap_smem(sfb); ++ smi_unmap_mmio(sfb); ++ smi_free_fb_info(sfb); ++ printk("Silicon Motion, Inc. LynxEM+ Init FAILED.n"); ++ ++ return err; ++} ++ ++struct pci_device_id smifb_pci_tbl[] = { ++ { 0x126f, 0x710, PCI_ANY_ID, PCI_ANY_ID }, ++ { 0x126f, 0x712, PCI_ANY_ID, PCI_ANY_ID }, ++ { 0x126f, 0x720, PCI_ANY_ID, PCI_ANY_ID }, ++ { 0 } ++}; ++ ++MODULE_DEVICE_TABLE(pci, smifb_pci_tbl); ++ ++struct pci_driver smifb_driver = { ++ .name = "smifb", ++ .id_table = smifb_pci_tbl, ++ .probe = smifb_init, ++}; ++ ++int __init smi_init(void) ++{ ++ /*return pci_module_init(&smifb_driver);*/ ++ return pci_register_driver(&smifb_driver); ++} ++ ++module_init(smi_init); ++MODULE_LICENSE("GPL"); ++ ++ ++ +--- /dev/null ++++ b/drivers/video/smifb.h +@@ -0,0 +1,149 @@ ++/*************************************************************************** ++ smifb.h - SiliconMotion LynxEM+ frame buffer device ++ ------------------- ++ begin : Thu Aug 9 2001 ++ copyright : (C) 2001 by Szu-Tao Huang ++ email : johuang@siliconmotion.com ++ ***************************************************************************/ ++ ++/*************************************************************************** ++ * * ++ * This program is free software; you can redistribute it and/or modify * ++ * it under the terms of the GNU General Public License as published by * ++ * the Free Software Foundation; either version 2 of the License, or * ++ * (at your option) any later version. * ++ * * ++ ***************************************************************************/ ++ ++#define smi_mmiowb(dat,reg) writeb(dat, SMIRegs + reg) ++#define smi_mmioww(dat,reg) writew(dat, SMIRegs + reg) ++#define smi_mmiowl(dat,reg) writel(dat, SMIRegs + reg) ++ ++#define smi_mmiorb(reg) readb(SMIRegs + reg) ++#define smi_mmiorw(reg) readw(SMIRegs + reg) ++#define smi_mmiorl(reg) readl(SMIRegs + reg) ++ ++#define SIZE_SR00_SR04 (0x04 - 0x00 + 1) ++#define SIZE_SR10_SR24 (0x24 - 0x10 + 1) ++#define SIZE_SR30_SR75 (0x75 - 0x30 + 1) ++#define SIZE_SR80_SR93 (0x93 - 0x80 + 1) ++#define SIZE_SRA0_SRAF (0xAF - 0xA0 + 1) ++#define SIZE_GR00_GR08 (0x08 - 0x00 + 1) ++#define SIZE_AR00_AR14 (0x14 - 0x00 + 1) ++#define SIZE_CR00_CR18 (0x18 - 0x00 + 1) ++#define SIZE_CR30_CR4D (0x4D - 0x30 + 1) ++#define SIZE_CR90_CRA7 (0xA7 - 0x90 + 1) ++#define SIZE_VPR (0x6C + 1) ++#define SIZE_DPR (0x44 + 1) ++ ++#define numVGAModes 6 ++#define numChipIDs 3 ++ ++#define NR_PALETTE 256 ++#define NR_RGB 2 ++ ++/* ++ * Minimum X and Y resolutions ++ */ ++#define MIN_XRES 640 ++#define MIN_YRES 480 ++ ++static inline void smi_crtcw(int reg, int val) ++{ ++ smi_mmiowb(reg, 0x3d4); ++ smi_mmiowb(val, 0x3d5); ++} ++ ++static inline unsigned int smi_crtcr(int reg) ++{ ++ smi_mmiowb(reg, 0x3d4); ++ return smi_mmiorb(0x3d5); ++} ++ ++static inline void smi_grphw(int reg, int val) ++{ ++ smi_mmiowb(reg, 0x3ce); ++ smi_mmiowb(val, 0x3cf); ++} ++ ++static inline unsigned int smi_grphr(int reg) ++{ ++ smi_mmiowb(reg, 0x3ce); ++ return smi_mmiorb(0x3cf); ++} ++ ++static inline void smi_attrw(int reg, int val) ++{ ++ smi_mmiorb(0x3da); ++ smi_mmiowb(reg, 0x3c0); ++ smi_mmiorb(0x3c1); ++ smi_mmiowb(val, 0x3c0); ++} ++ ++static inline void smi_seqw(int reg, int val) ++{ ++ smi_mmiowb(reg, 0x3c4); ++ smi_mmiowb(val, 0x3c5); ++} ++ ++static inline unsigned int smi_seqr(int reg) ++{ ++ smi_mmiowb(reg, 0x3c4); ++ return smi_mmiorb(0x3c5); ++} ++/* ++* Private structure ++*/ ++struct smifb_info { ++ /* ++ * The following is a pointer to be passed into the ++ * functions below. The modules outside the main ++ * smifb.c driver have no knowledge as to what ++ * is within this structure. ++ */ ++ struct fb_info fb; ++ struct display_switch *dispsw; ++ struct pci_dev *dev; ++ signed int currcon; ++ ++ struct { ++ u8 red, green, blue; ++ } palette[NR_RGB]; ++ ++ u_int palette_size; ++}; ++ ++struct par_info { ++ /* ++ * Hardware ++ */ ++ u16 chipID; ++ char *m_pLFB; ++ char *m_pMMIO; ++ char *m_pDPR; ++ char *m_pVPR; ++ ++ u_int width; ++ u_int height; ++ u_int hz; ++}; ++ ++// The next structure holds all information relevant for a specific video mode. ++struct ModeInit ++{ ++ int mmSizeX; ++ int mmSizeY; ++ int bpp; ++ int hz; ++ unsigned char Init_MISC; ++ unsigned char Init_SR00_SR04[SIZE_SR00_SR04]; ++ unsigned char Init_SR10_SR24[SIZE_SR10_SR24]; ++ unsigned char Init_SR30_SR75[SIZE_SR30_SR75]; ++ unsigned char Init_SR80_SR93[SIZE_SR80_SR93]; ++ unsigned char Init_SRA0_SRAF[SIZE_SRA0_SRAF]; ++ unsigned char Init_GR00_GR08[SIZE_GR00_GR08]; ++ unsigned char Init_AR00_AR14[SIZE_AR00_AR14]; ++ unsigned char Init_CR00_CR18[SIZE_CR00_CR18]; ++ unsigned char Init_CR30_CR4D[SIZE_CR30_CR4D]; ++ unsigned char Init_CR90_CRA7[SIZE_CR90_CRA7]; ++}; +--- a/include/linux/fb.h ++++ b/include/linux/fb.h +@@ -873,6 +873,17 @@ struct fb_info { + #define fb_writeq sbus_writeq + #define fb_memset sbus_memset_io + ++#elif defined(CONFIG_COLDFIRE) ++#define fb_readb readb ++#define fb_readw readw ++#define fb_readl readl ++#define fb_readq readq ++#define fb_writeb writeb ++#define fb_writew writew ++#define fb_writel writel ++#define fb_writeq writeq ++#define fb_memset memset_io ++ + #elif defined(__i386__) || defined(__alpha__) || defined(__x86_64__) || defined(__hppa__) || (defined(__sh__) && !defined(__SH5__)) || defined(__powerpc__) || defined(__avr32__) + + #define fb_readb __raw_readb +@@ -899,7 +910,7 @@ struct fb_info { + + #endif + +-#if defined (__BIG_ENDIAN) ++#if defined (__BIG_ENDIAN) && !defined(CONFIG_COLDFIRE) + #define FB_LEFT_POS(bpp) (32 - bpp) + #define FB_SHIFT_HIGH(val, bits) ((val) >> (bits)) + #define FB_SHIFT_LOW(val, bits) ((val) << (bits)) diff --git a/target/linux/coldfire/patches/080-mcfv4e_dspi_update.patch b/target/linux/coldfire/patches/080-mcfv4e_dspi_update.patch new file mode 100644 index 0000000000..a157616732 --- /dev/null +++ b/target/linux/coldfire/patches/080-mcfv4e_dspi_update.patch @@ -0,0 +1,1378 @@ +From 771f4741de2cd8a103d96cd1e8281926448ff56d Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Tue, 15 Jul 2008 11:44:08 -0600 +Subject: [PATCH] Fix DSPI driver. + +Update to latest Matt Coldfire driver. Fix timing issues with +M547x/M548x END-OF-QUEUE notification. + +LTIBName: mcfv4e-dspi-update +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + arch/m68k/coldfire/m547x_8x-devices.c | 35 +- + drivers/spi/Kconfig | 6 + + drivers/spi/Makefile | 2 +- + drivers/spi/dspi_mcf.c | 1217 +++++++++++++++++++++++++++++++++ + include/asm-m68k/mcfdspi.h | 48 ++ + 5 files changed, 1296 insertions(+), 12 deletions(-) + create mode 100644 drivers/spi/dspi_mcf.c + create mode 100644 include/asm-m68k/mcfdspi.h + +--- a/arch/m68k/coldfire/m547x_8x-devices.c ++++ b/arch/m68k/coldfire/m547x_8x-devices.c +@@ -26,26 +26,40 @@ + */ + + /* number of supported SPI selects */ +-#define SPI_NUM_CHIPSELECTS 4 ++#define SPI_NUM_CHIPSELECTS 8 + + void coldfire_spi_cs_control(u8 cs, u8 command) + { + /* nothing special required */ + } + ++#if defined(CONFIG_SPI_SPIDEV) || defined(CONFIG_SPI_SPIDEV_MODULE) ++static struct coldfire_spi_chip spidev_chip_info = { ++ .bits_per_word = 8, ++}; ++#endif ++ + static struct spi_board_info spi_board_info[] = { +- /* no board info */ ++#if defined(CONFIG_SPI_SPIDEV) || defined(CONFIG_SPI_SPIDEV_MODULE) ++ { ++ .modalias = "spidev", ++ .max_speed_hz = 16000000, /* max clk (SCK) speed in HZ */ ++ .bus_num = 1, ++ .chip_select = 0, /* CS0 */ ++ .controller_data = &spidev_chip_info, ++ } ++#endif + }; + + static int spi_irq_list[] = { +- /* IRQ, ICR Offset, ICR Val, Mask */ +- 64 + ISC_DSPI_OVRFW, 0, 0, 0, +- 64 + ISC_DSPI_RFOF, 0, 0, 0, +- 64 + ISC_DSPI_RFDF, 0, 0, 0, +- 64 + ISC_DSPI_TFUF, 0, 0, 0, +- 64 + ISC_DSPI_TCF, 0, 0, 0, +- 64 + ISC_DSPI_TFFF, 0, 0, 0, +- 64 + ISC_DSPI_EOQF, 0, 0, 0, ++ /* IRQ, ICR Offset, ICR Val,Mask */ ++ 64 + ISC_DSPI_OVRFW, ISC_DSPI_OVRFW, 0x18, 0, ++ 64 + ISC_DSPI_RFOF, ISC_DSPI_RFOF, 0x18, 0, ++ 64 + ISC_DSPI_RFDF, ISC_DSPI_RFDF, 0x18, 0, ++ 64 + ISC_DSPI_TFUF, ISC_DSPI_TFUF, 0x18, 0, ++ 64 + ISC_DSPI_TCF, ISC_DSPI_TCF, 0x18, 0, ++ 64 + ISC_DSPI_TFFF, ISC_DSPI_TFFF, 0x18, 0, ++ 64 + ISC_DSPI_EOQF, ISC_DSPI_EOQF, 0x18, 0, + 0,0,0,0, + }; + +@@ -120,7 +134,6 @@ static int __init m547x_8x_spi_init(void + /* register device */ + retval = platform_device_register(&coldfire_spi); + if (retval < 0) { +- printk(KERN_ERR "SPI-m547x_8x: platform_device_register failed with code=%d\n", retval); + goto out; + } + +--- a/drivers/spi/Kconfig ++++ b/drivers/spi/Kconfig +@@ -130,6 +130,12 @@ config SPI_COLDFIRE + Tested with the 5282 processor, but should also work with other + Coldfire variants. + ++config SPI_DSPI ++ tristate "Coldfire DSPI" ++ depends on SPI_MASTER && COLDFIRE ++ help ++ SPI driver for Coldfire DSPI driver only. ++ + config SPI_COLDFIRE_DSPI_EDMA + boolean "Coldfire DSPI master driver uses eDMA" + depends on SPI_MASTER && COLDFIRE && SPI_COLDFIRE && EXPERIMENTAL && COLDFIRE_EDMA +--- a/drivers/spi/Makefile ++++ b/drivers/spi/Makefile +@@ -19,7 +19,7 @@ obj-$(CONFIG_SPI_BITBANG) += spi_bitban + obj-$(CONFIG_SPI_AU1550) += au1550_spi.o + obj-$(CONFIG_SPI_BUTTERFLY) += spi_butterfly.o + # obj-$(CONFIG_SPI_COLDFIRE) += spi_coldfire.o spi-m5445x.o +-obj-$(CONFIG_SPI_COLDFIRE) += spi_coldfire.o ++obj-$(CONFIG_SPI_DSPI) += dspi_mcf.o + obj-$(CONFIG_SPI_GPIO) += spi_gpio.o + obj-$(CONFIG_SPI_IMX) += spi_imx.o + obj-$(CONFIG_SPI_LM70_LLP) += spi_lm70llp.o +--- /dev/null ++++ b/drivers/spi/dspi_mcf.c +@@ -0,0 +1,1217 @@ ++/* ++ * dspi_mcf.c - DSPI controller for ColdFire processors ++ * ++ * ++ * Matt Waddel Matt.Waddel@freescale.com ++ * Copyright Freescale Semiconductor, Inc. 2008 ++ * ++ * M547x/M548x changes by Kurt Mahan kmahan@freescale.com ++ * Copyright Freescale Semiconductor, Inc. 2008 ++ * ++ * Based on spi_coldfire.c done by: ++ * Andrey Butok ++ * Yaroslav Vinogradov ++ * Copyright Freescale Semiconductor, Inc. 2006-2007 ++ * Mike Lavender (mike@steroidmicros) ++ * (C) Copyright 2005, Intec Automation, ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ++ * ++ *************************************************************************** ++ * Changes: ++ * v0.002 M547x/M548x support. ++ * v0.001 Initial version. Coldfire DSPI master driver. ++ ****************************************************************************/ ++ ++/* ++ * Includes ++ */ ++ ++#include <linux/autoconf.h> ++#include <linux/init.h> ++#include <linux/module.h> ++#include <linux/device.h> ++#include <linux/interrupt.h> ++#include <linux/platform_device.h> ++#include <linux/spi/spi.h> ++#include <linux/workqueue.h> ++#include <linux/delay.h> ++#include <asm/mcfsim.h> ++#include <asm/mcfqspi.h> ++#include <asm/coldfire.h> ++#include <linux/io.h> ++#include <asm/mcfdspi.h> ++#include <linux/dma-mapping.h> ++ ++#undef DSPI_COLDFIRE_DEBUG ++ ++#ifdef DSPI_COLDFIRE_DEBUG ++#define DBG(fmt, args...) \ ++ printk(KERN_INFO "[%s] " fmt , __FUNCTION__, ## args) ++#else ++#define DBG(fmt, args...) do {} while (0) ++#endif ++ ++#if defined(CONFIG_M54455) ++#include <asm/mcf5445x_dspi.h> ++#if defined(CONFIG_SPI_COLDFIRE_DSPI_EDMA) ++ #include <asm/mcf5445x_edma.h> ++#endif ++#endif ++ ++#if defined(CONFIG_M547X_8X) ++#include <asm/virtconvert.h> ++#include <asm/m5485dspi.h> ++#endif ++ ++#if defined(CONFIG_SPI_COLDFIRE_DSPI_EDMA) ++#include <asm/mcf_edma.h> ++#define SPI_DSPI_EDMA ++#define EDMA_BUFSIZE_KMALLOC (DSPI_FIFO_SIZE*4) ++#define DSPI_DMA_RX_TCD MCF_EDMA_CHAN_DSPI_RX ++#define DSPI_DMA_TX_TCD MCF_EDMA_CHAN_DSPI_TX ++#endif ++ ++#define DSPI_BITS MCF_DSPI_DCTAR_FMSZ(0xF) ++#define DSPI_BITS_16 MCF_DSPI_DCTAR_FMSZ(0xF) ++#define DSPI_BITS_8 MCF_DSPI_DCTAR_FMSZ(0x7) ++#define DSPI_FIFO_SIZE 16 ++ ++#define DRIVER_NAME "Coldfire DSPI" ++ ++/****************************************************************************/ ++ ++/* ++ * Local constants and macros ++ */ ++ ++#define START_STATE ((void *)0) ++#define RUNNING_STATE ((void *)1) ++#define DONE_STATE ((void *)2) ++#define ERROR_STATE ((void *)-1) ++ ++#define QUEUE_RUNNING 0 ++#define QUEUE_STOPPED 1 ++ ++/****************************************************************************/ ++ ++/* ++ * Local Data Structures ++ */ ++ ++struct DSPI_MCR { ++ unsigned master:1; ++ unsigned cont_scke:1; ++ unsigned dconf:2; ++ unsigned frz:1; ++ unsigned mtfe:1; ++ unsigned pcsse:1; ++ unsigned rooe:1; ++ unsigned pcsis:8; ++ unsigned reserved15:1; ++ unsigned mdis:1; ++ unsigned dis_tx:1; ++ unsigned dis_rxf:1; ++ unsigned clr_tx:1; ++ unsigned clr_rxf:1; ++ unsigned smpl_pt:2; ++ unsigned reserved71:7; ++ unsigned halt:1; ++}; ++ ++struct DSPI_CTAR { ++ unsigned dbr:1; ++ unsigned fmsz:4; ++ unsigned cpol:1; ++ unsigned cpha:1; ++ unsigned lsbfe:1; ++ unsigned pcssck:2; ++ unsigned pasc:2; ++ unsigned pdt:2; ++ unsigned pbr:2; ++ unsigned cssck:4; ++ unsigned asc:4; ++ unsigned dt:4; ++ unsigned br:4; ++}; ++ ++struct chip_data { ++ /* dspi data */ ++ union { ++ u32 mcr_val; ++ struct DSPI_MCR mcr; ++ }; ++ union { ++ u32 ctar_val; ++ struct DSPI_CTAR ctar; ++ }; ++ u16 void_write_data; ++}; ++ ++ ++struct driver_data { ++ /* Driver model hookup */ ++ struct platform_device *pdev; ++ ++ /* SPI framework hookup */ ++ struct spi_master *master; ++ ++ /* Driver message queue */ ++ struct workqueue_struct *workqueue; ++ struct work_struct pump_messages; ++ spinlock_t lock; /* lock */ ++ struct list_head queue; ++ int busy; ++ int run; ++ ++ /* Message Transfer pump */ ++ struct tasklet_struct pump_transfers; ++ ++ /* Current message transfer state info */ ++ struct spi_message *cur_msg; ++ struct spi_transfer *cur_transfer; ++ struct chip_data *cur_chip; ++ size_t len; ++ void *tx; ++ void *tx_end; ++ void *rx; ++ void *rx_end; ++ char flags; ++#define TRAN_STATE_RX_VOID 0x01 ++#define TRAN_STATE_TX_VOID 0x02 ++#define TRAN_STATE_WORD_ODD_NUM 0x04 ++ u8 cs; ++ u16 void_write_data; ++ unsigned cs_change:1; ++ ++ u32 trans_cnt; ++ u32 wce_cnt; ++ u32 abrt_cnt; ++ u32 *mcr; /* DSPI MCR register */ ++ u32 *ctar; /* DSPI CTAR register */ ++ u32 *dspi_dtfr; /* DSPI DTFR register */ ++ u32 *dspi_drfr; /* DSPI DRFR register */ ++ u32 *dspi_rser; /* DSPI RSER register */ ++ u32 *dspi_sr; /* DSPI status register */ ++ ++#if defined(SPI_DSPI_EDMA) ++ void *edma_tx_buf; ++ void *edma_rx_buf; ++#endif ++ ++#if defined(CONFIG_M532x) || defined(CONFIG_M537x) ++ u16 *par; /* Pin assignment register */ ++#else ++ u8 *par; /* Pin assignment register */ ++#endif ++ u8 *int_icr; /* Interrupt level and priority register */ ++ u32 *int_mr; /* Interrupt mask register */ ++ void (*cs_control)(u8 cs, u8 command); ++}; ++ ++#define DSPI_CS(cs) ((1<<(cs))<<16) ++ ++/****************************************************************************/ ++ ++/* ++ * SPI local functions ++ */ ++ ++static void *next_transfer(struct driver_data *drv_data) ++{ ++ struct spi_message *msg = drv_data->cur_msg; ++ struct spi_transfer *trans = drv_data->cur_transfer; ++ ++ DBG("\n"); ++ /* Move to next transfer */ ++ if (trans->transfer_list.next != &msg->transfers) { ++ drv_data->cur_transfer = list_entry(trans->transfer_list.next, ++ struct spi_transfer, ++ transfer_list); ++ ++ if (drv_data->cur_transfer->transfer_list.next ++ == &msg->transfers) /* last transfer */ ++ drv_data->cur_transfer->cs_change = 1; ++ ++ return RUNNING_STATE; ++ } else ++ return DONE_STATE; ++} ++ ++ ++static inline int is_word_transfer(struct driver_data *drv_data) ++{ ++ return ((*(drv_data->ctar+drv_data->cs) & DSPI_BITS_16) == ++ DSPI_BITS_8) ? 0 : 1; ++} ++ ++static inline void set_8bit_transfer_mode(struct driver_data *drv_data) ++{ ++ DBG("\n"); ++ *(drv_data->ctar+drv_data->cs) = ++ (*(drv_data->ctar + drv_data->cs) & ~DSPI_BITS) | DSPI_BITS_8; ++} ++ ++static inline void set_16bit_transfer_mode(struct driver_data *drv_data) ++{ ++ DBG("\n"); ++ *(drv_data->ctar+drv_data->cs) = ++ (*(drv_data->ctar + drv_data->cs) & ~DSPI_BITS) | DSPI_BITS_16; ++} ++ ++static unsigned char hz_to_spi_baud(int pbr, int dbr, int speed_hz) ++{ ++ int pbr_tbl[4] = {2, 3, 5, 7}; /* Valid baud rate pre-scaler values */ ++ int brs[16] = { 2, 4, 6, 8, ++ 16, 32, 64, 128, ++ 256, 512, 1024, 2048, ++ 4096, 8192, 16384, 32768 }; ++ int temp, index = 0; ++ ++ if ((pbr < 0) || (pbr > 3) || ++ (dbr < 0) || (dbr > 1)) ++ return 15; /* table indexes out of range, go slow */ ++ ++ temp = ((((MCF_CLK / 2) / pbr_tbl[pbr]) * (1 + dbr)) / speed_hz); ++ ++ while (temp >= brs[index]) ++ if (index++ >= 15) ++ break; ++ ++ DBG("baud rate scaler = 0x%x - %d\n", index, brs[index]); ++ return(index); ++} ++ ++static int write(struct driver_data *drv_data) ++{ ++ int tx_count = 0; ++ int tx_word = is_word_transfer(drv_data); ++ u16 d16; ++ u8 d8; ++ u32 dspi_pushr = 0; ++ int first = 1; ++#if defined(SPI_DSPI_EDMA) ++ u32 *edma_wr = (u32 *)(drv_data->edma_tx_buf); ++#endif ++ ++ /* If we are in word mode, but only have a single byte to transfer ++ * then switch to byte mode temporarily. Will switch back at the ++ * end of the transfer. */ ++ if (tx_word && ((drv_data->tx_end - drv_data->tx) == 1)) { ++ drv_data->flags |= TRAN_STATE_WORD_ODD_NUM; ++ set_8bit_transfer_mode(drv_data); ++ tx_word = 0; ++ } ++ ++ while ((drv_data->tx < drv_data->tx_end) && (tx_count < DSPI_FIFO_SIZE)) { ++// DBG("while\n"); ++ if (tx_word) { ++ if ((drv_data->tx_end - drv_data->tx) == 1) ++ break; ++ ++ if (!(drv_data->flags & TRAN_STATE_TX_VOID)) ++ d16 = *(u16 *)drv_data->tx; ++ else ++ d16 = drv_data->void_write_data; ++ ++ dspi_pushr = MCF_DSPI_DTFR_TXDATA(d16) | ++ DSPI_CS(drv_data->cs) | ++ MCF_DSPI_DTFR_CTAS(drv_data->cs) | ++ MCF_DSPI_DTFR_CONT; ++ ++ drv_data->tx += 2; ++ } else { ++ if (!(drv_data->flags & TRAN_STATE_TX_VOID)) ++ d8 = *(u8 *)drv_data->tx; ++ else ++ d8 = *(u8 *)&drv_data->void_write_data; ++ ++ dspi_pushr = MCF_DSPI_DTFR_TXDATA(d8) | ++ DSPI_CS(drv_data->cs) | ++ MCF_DSPI_DTFR_CTAS(drv_data->cs) | ++ MCF_DSPI_DTFR_CONT; ++ ++ drv_data->tx++; ++ } ++ ++ if (drv_data->tx == drv_data->tx_end ++ || tx_count == DSPI_FIFO_SIZE-1) { ++ /* last transfer in the queue */ ++ dspi_pushr |= MCF_DSPI_DTFR_EOQ; ++ if ((drv_data->cs_change) ++ && (drv_data->tx == drv_data->tx_end)) ++ dspi_pushr &= ~MCF_DSPI_DTFR_CONT; ++#ifdef CONFIG_M547X_8X ++ /* EOQ gets missed if we don't delay */ ++ udelay(100); ++#endif ++ } else if (tx_word && ((drv_data->tx_end - drv_data->tx) == 1)) ++ dspi_pushr |= MCF_DSPI_DTFR_EOQ; ++ ++ if (first) { ++ first = 0; ++ dspi_pushr |= MCF_DSPI_DTFR_CTCNT; /* clear counter */ ++ } ++#if defined(SPI_DSPI_EDMA) ++ *edma_wr = dspi_pushr; ++ edma_wr++; ++#else ++ *drv_data->dspi_dtfr = dspi_pushr; ++#endif ++ tx_count++; ++ } ++ ++#if defined(SPI_DSPI_EDMA) ++ if (tx_count > 0) { ++ ++ mcf_edma_set_tcd_params(DSPI_DMA_TX_TCD, ++ virt_to_phys(drv_data->edma_tx_buf), ++ (u32)drv_data->dspi_dtfr, ++ MCF_EDMA_TCD_ATTR_SSIZE_32BIT ++ | MCF_EDMA_TCD_ATTR_DSIZE_32BIT, ++ 4, /* soff */ ++ 4 * tx_count, /* nbytes */ ++ 0, /* slast */ ++ 1, /* citer */ ++ 1, /* biter */ ++ 0, /* doff */ ++ 0, /* dlastsga */ ++ 0, /* major_int */ ++ 1); /* disable_req */ ++ ++ mcf_edma_set_tcd_params(DSPI_DMA_RX_TCD, ++ (u32)drv_data->dspi_drfr, ++ virt_to_phys(drv_data->edma_rx_buf), ++ MCF_EDMA_TCD_ATTR_SSIZE_32BIT ++ | MCF_EDMA_TCD_ATTR_DSIZE_32BIT, ++ 0, /* soff */ ++ 4 * tx_count, /* nbytes */ ++ 0, /* slast */ ++ 1, /* citer */ ++ 1, /* biter */ ++ 4, /* doff */ ++ 0, /* dlastsga */ ++ 0, /* major_int */ ++ 1); /* disable_req */ ++ ++ mcf_edma_start_transfer(DSPI_DMA_TX_TCD); ++ } ++#endif ++ return (tx_count * (tx_word + 1)); ++} ++ ++static int read(struct driver_data *drv_data) ++{ ++ int rx_count = 0; ++ int rx_word = is_word_transfer(drv_data); ++ u16 d; ++#if defined(SPI_DSPI_EDMA) ++ u32 *rx_edma = (u32 *) drv_data->edma_rx_buf; ++ ++ /* receive SPI data */ ++ mcf_edma_start_transfer(DSPI_DMA_RX_TCD); ++#endif ++ while ((drv_data->rx < drv_data->rx_end) ++ && (rx_count < DSPI_FIFO_SIZE)) { ++ ++ if (rx_word) { ++ if ((drv_data->rx_end - drv_data->rx) == 1) ++ break; ++#if defined(SPI_DSPI_EDMA) ++ d = MCF_DSPI_DRFR_RXDATA(*rx_edma); ++ rx_edma++; ++#else ++ d = MCF_DSPI_DRFR_RXDATA(*drv_data->dspi_drfr); ++#endif ++ if (!(drv_data->flags & TRAN_STATE_RX_VOID)) ++ *(u16 *)drv_data->rx = d; ++ drv_data->rx += 2; ++ ++ } else { ++#if defined(SPI_DSPI_EDMA) ++ d = MCF_DSPI_DRFR_RXDATA(*rx_edma); ++ rx_edma++; ++#else ++ d = MCF_DSPI_DRFR_RXDATA(*drv_data->dspi_drfr); ++#endif ++ if (!(drv_data->flags & TRAN_STATE_RX_VOID)) ++ *(u8 *)drv_data->rx = d; ++ drv_data->rx++; ++ } ++ rx_count++; ++ DBG("rxd=0x%x\n", d); ++ } ++ return rx_count; ++} ++ ++ ++static inline void dspi_setup_chip(struct driver_data *drv_data) ++{ ++ struct chip_data *chip = drv_data->cur_chip; ++ ++ DBG("\n"); ++ *drv_data->mcr = chip->mcr_val; ++ *(drv_data->ctar+drv_data->cs) = chip->ctar_val; ++ *drv_data->dspi_rser = MCF_DSPI_DRSER_EOQFE; ++} ++ ++#if defined(SPI_DSPI_EDMA) ++static int edma_tx_handler(int channel, void *dev) ++{ ++ DBG("\n"); ++ if (channel == DSPI_DMA_TX_TCD) ++ mcf_edma_stop_transfer(DSPI_DMA_TX_TCD); ++ return IRQ_HANDLED; ++} ++ ++static int edma_rx_handler(int channel, void *dev) ++{ ++ DBG("\n"); ++ if (channel == DSPI_DMA_RX_TCD) ++ mcf_edma_stop_transfer(DSPI_DMA_RX_TCD); ++ return IRQ_HANDLED; ++} ++#endif ++ ++static irqreturn_t dspi_interrupt(int irq, void *dev_id) ++{ ++ struct driver_data *drv_data = (struct driver_data *)dev_id; ++ struct spi_message *msg = drv_data->cur_msg; ++ ++ /* Clear all flags immediately */ ++ *drv_data->dspi_sr = MCF_DSPI_DSR_EOQF; ++ ++ if (!drv_data->cur_msg || !drv_data->cur_msg->state) { ++#if !defined(SPI_DSPI_EDMA) ++ u32 irq_status = *drv_data->dspi_sr; ++ /* if eDMA is used it happens some time (at least once)*/ ++ printk(KERN_ERR "Bad message or transfer state handler. \ ++ IRQ status = %x\n", irq_status); ++#endif ++ return IRQ_NONE; ++ } ++ ++ DBG("\n"); ++ /* ++ * Read the data into the buffer and reload and start ++ * queue with new data if not finished. If finished ++ * then setup the next transfer ++ */ ++ read(drv_data); ++ ++ if (drv_data->rx == drv_data->rx_end) { ++ /* ++ * Finished now - fall through and schedule next ++ * transfer tasklet ++ */ ++ if (drv_data->flags & TRAN_STATE_WORD_ODD_NUM) ++ set_16bit_transfer_mode(drv_data); ++ ++ msg->state = next_transfer(drv_data); ++ } else { ++ /* not finished yet - keep going */ ++ msg->actual_length += write(drv_data); ++ return IRQ_HANDLED; ++ } ++ ++ tasklet_schedule(&drv_data->pump_transfers); ++ ++ return IRQ_HANDLED; ++} ++ ++/* caller already set message->status; dma and pio irqs are blocked */ ++static void giveback(struct driver_data *drv_data) ++{ ++ struct spi_transfer *last_transfer; ++ unsigned long flags; ++ struct spi_message *msg; ++ DBG("\n"); ++ ++ spin_lock_irqsave(&drv_data->lock, flags); ++ msg = drv_data->cur_msg; ++ drv_data->cur_msg = NULL; ++ drv_data->cur_transfer = NULL; ++ drv_data->cur_chip = NULL; ++ queue_work(drv_data->workqueue, &drv_data->pump_messages); ++ spin_unlock_irqrestore(&drv_data->lock, flags); ++ ++ last_transfer = list_entry(msg->transfers.prev, ++ struct spi_transfer, transfer_list); ++ ++ if (!last_transfer->cs_change) ++ drv_data->cs_control(drv_data->cs, QSPI_CS_DROP); ++ ++ msg->state = NULL; ++ if (msg->complete) ++ msg->complete(msg->context); ++} ++ ++ ++static void pump_transfers(unsigned long data) ++{ ++ struct driver_data *drv_data = (struct driver_data *)data; ++ struct spi_message *message = NULL; ++ struct spi_transfer *transfer = NULL; ++ struct spi_transfer *previous = NULL; ++ struct chip_data *chip = NULL; ++ unsigned long flags; ++ DBG("\n"); ++ /* Get current state information */ ++ message = drv_data->cur_msg; ++ transfer = drv_data->cur_transfer; ++ chip = drv_data->cur_chip; ++ ++ /* Handle for abort */ ++ if (message->state == ERROR_STATE) { ++ message->status = -EIO; ++ giveback(drv_data); ++ return; ++ } ++ ++ /* Handle end of message */ ++ if (message->state == DONE_STATE) { ++ message->status = 0; ++ giveback(drv_data); ++ return; ++ } ++ ++ if (message->state == START_STATE) { ++ dspi_setup_chip(drv_data); ++ ++ if (drv_data->cs_control) ++ drv_data->cs_control(message->spi->chip_select, ++ QSPI_CS_ASSERT); ++ } ++ ++ /* Delay if requested at end of transfer*/ ++ if (message->state == RUNNING_STATE) { ++ previous = list_entry(transfer->transfer_list.prev, ++ struct spi_transfer, ++ transfer_list); ++ ++ if (drv_data->cs_control && transfer->cs_change) ++ drv_data->cs_control(message->spi->chip_select, ++ QSPI_CS_DROP); ++ ++ if (previous->delay_usecs) ++ udelay(previous->delay_usecs); ++ ++ if (drv_data->cs_control && transfer->cs_change) ++ drv_data->cs_control(message->spi->chip_select, ++ QSPI_CS_ASSERT); ++ } ++ ++ drv_data->flags = 0; ++ drv_data->tx = (void *)transfer->tx_buf; ++ drv_data->tx_end = drv_data->tx + transfer->len; ++ drv_data->rx = transfer->rx_buf; ++ drv_data->rx_end = drv_data->rx + transfer->len; ++ ++ if (!drv_data->rx) ++ drv_data->flags |= TRAN_STATE_RX_VOID; ++ if (!drv_data->tx) ++ drv_data->flags |= TRAN_STATE_TX_VOID; ++ drv_data->cs = message->spi->chip_select; ++ drv_data->cs_change = transfer->cs_change; ++ drv_data->void_write_data = chip->void_write_data; ++ if (transfer->speed_hz) { ++ *(drv_data->ctar + drv_data->cs) = \ ++ ((chip->ctar_val & ~0xF) | \ ++ hz_to_spi_baud(chip->ctar.pbr, \ ++ chip->ctar.dbr, \ ++ transfer->speed_hz)); ++ } ++ ++ message->state = RUNNING_STATE; ++ /* Go baby, go */ ++ local_irq_save(flags); ++ message->actual_length += write(drv_data); ++ local_irq_restore(flags); ++} ++ ++ ++static void pump_messages(struct work_struct *work) ++{ ++ struct driver_data *drv_data; ++ unsigned long flags; ++ DBG("\n"); ++ ++ drv_data = container_of(work, struct driver_data, pump_messages); ++ ++ /* Lock queue and check for queue work */ ++ spin_lock_irqsave(&drv_data->lock, flags); ++ if (list_empty(&drv_data->queue) ++ || drv_data->run == QUEUE_STOPPED) { ++ drv_data->busy = 0; ++ spin_unlock_irqrestore(&drv_data->lock, flags); ++ return; ++ } ++ ++ /* Make sure we are not already running a message */ ++ if (drv_data->cur_msg) { ++ spin_unlock_irqrestore(&drv_data->lock, flags); ++ return; ++ } ++ ++ /* Extract head of queue */ ++ drv_data->cur_msg = list_entry(drv_data->queue.next, ++ struct spi_message, queue); ++ list_del_init(&drv_data->cur_msg->queue); ++ ++ /* Initial message state*/ ++ drv_data->cur_msg->state = START_STATE; ++ drv_data->cur_transfer = list_entry(drv_data->cur_msg->transfers.next, ++ struct spi_transfer, ++ transfer_list); ++ ++ if (drv_data->cur_transfer->transfer_list.next ++ == &drv_data->cur_msg->transfers) ++ drv_data->cur_transfer->cs_change = 1; /* last */ ++ ++ ++ /* Setup the SPI Registers using the per chip configuration */ ++ drv_data->cur_chip = spi_get_ctldata(drv_data->cur_msg->spi); ++ ++ /* Mark as busy and launch transfers */ ++ tasklet_schedule(&drv_data->pump_transfers); ++ ++ drv_data->busy = 1; ++ spin_unlock_irqrestore(&drv_data->lock, flags); ++} ++ ++/****************************************************************************/ ++ ++/* ++ * SPI master implementation ++ */ ++ ++static int transfer(struct spi_device *spi, struct spi_message *msg) ++{ ++ struct driver_data *drv_data = spi_master_get_devdata(spi->master); ++ unsigned long flags; ++ ++ DBG("\n"); ++ spin_lock_irqsave(&drv_data->lock, flags); ++ ++ if (drv_data->run == QUEUE_STOPPED) { ++ spin_unlock_irqrestore(&drv_data->lock, flags); ++ return -ESHUTDOWN; ++ } ++ ++ msg->actual_length = 0; ++ msg->status = -EINPROGRESS; ++ msg->state = START_STATE; ++ ++ list_add_tail(&msg->queue, &drv_data->queue); ++ ++ if (drv_data->run == QUEUE_RUNNING && !drv_data->busy) ++ queue_work(drv_data->workqueue, &drv_data->pump_messages); ++ ++ spin_unlock_irqrestore(&drv_data->lock, flags); ++ ++ return 0; ++} ++ ++ ++static int setup(struct spi_device *spi) ++{ ++ ++ struct chip_data *chip; ++ struct coldfire_dspi_chip *chip_info ++ = (struct coldfire_dspi_chip *)spi->controller_data; ++ DBG("\n"); ++ ++ /* Only alloc on first setup */ ++ chip = spi_get_ctldata(spi); ++ if (chip == NULL) { ++ chip = kcalloc(1, sizeof(struct chip_data), GFP_KERNEL); ++ if (!chip) ++ return -ENOMEM; ++ spi->mode = chip_info->mode; ++ spi->bits_per_word = chip_info->bits_per_word; ++ } ++ ++ chip->mcr.master = 1; ++ chip->mcr.cont_scke = 0; ++ chip->mcr.dconf = 0; ++ chip->mcr.frz = 0; ++ chip->mcr.mtfe = 0; ++ chip->mcr.pcsse = 0; ++ chip->mcr.rooe = 0; ++ chip->mcr.pcsis = 0xFF; ++ chip->mcr.reserved15 = 0; ++ chip->mcr.mdis = 0; ++ chip->mcr.dis_tx = 0; ++ chip->mcr.dis_rxf = 0; ++ chip->mcr.clr_tx = 1; ++ chip->mcr.clr_rxf = 1; ++ chip->mcr.smpl_pt = 0; ++ chip->mcr.reserved71 = 0; ++ chip->mcr.halt = 0; ++ ++ if ((spi->bits_per_word >= 4) && (spi->bits_per_word <= 16)) { ++ chip->ctar.fmsz = spi->bits_per_word-1; ++ } else { ++ printk(KERN_ERR "Invalid wordsize\n"); ++ kfree(chip); ++ return -ENODEV; ++ } ++ ++ chip->void_write_data = chip_info->void_write_data; ++ ++ if (spi->max_speed_hz != 0) ++ chip_info->br = hz_to_spi_baud(chip_info->pbr, chip_info->dbr, \ ++ spi->max_speed_hz); ++ ++ chip->ctar.cpha = (spi->mode & SPI_CPHA) ? 1 : 0; ++ chip->ctar.cpol = (spi->mode & SPI_CPOL) ? 1 : 0; ++ chip->ctar.lsbfe = (spi->mode & SPI_LSB_FIRST) ? 1 : 0; ++ chip->ctar.dbr = chip_info->dbr; ++ chip->ctar.pbr = chip_info->pbr; ++ chip->ctar.br = chip_info->br; ++ chip->ctar.pcssck = chip_info->pcssck; ++ chip->ctar.pasc = chip_info->pasc; ++ chip->ctar.pdt = chip_info->pdt; ++ chip->ctar.cssck = chip_info->cssck; ++ chip->ctar.asc = chip_info->asc; ++ chip->ctar.dt = chip_info->dt; ++ ++ spi_set_ctldata(spi, chip); ++ ++ return 0; ++} ++ ++static int init_queue(struct driver_data *drv_data) ++{ ++ INIT_LIST_HEAD(&drv_data->queue); ++ spin_lock_init(&drv_data->lock); ++ ++ drv_data->run = QUEUE_STOPPED; ++ drv_data->busy = 0; ++ ++ tasklet_init(&drv_data->pump_transfers, ++ pump_transfers, (unsigned long)drv_data); ++ ++ INIT_WORK(&drv_data->pump_messages, pump_messages); ++ ++ drv_data->workqueue = create_singlethread_workqueue( ++ drv_data->master->dev.parent->bus_id); ++ if (drv_data->workqueue == NULL) ++ return -EBUSY; ++ ++ return 0; ++} ++ ++static int start_queue(struct driver_data *drv_data) ++{ ++ unsigned long flags; ++ ++ spin_lock_irqsave(&drv_data->lock, flags); ++ ++ if (drv_data->run == QUEUE_RUNNING || drv_data->busy) { ++ spin_unlock_irqrestore(&drv_data->lock, flags); ++ return -EBUSY; ++ } ++ ++ drv_data->run = QUEUE_RUNNING; ++ drv_data->cur_msg = NULL; ++ drv_data->cur_transfer = NULL; ++ drv_data->cur_chip = NULL; ++ spin_unlock_irqrestore(&drv_data->lock, flags); ++ ++ queue_work(drv_data->workqueue, &drv_data->pump_messages); ++ ++ return 0; ++} ++ ++static int stop_queue(struct driver_data *drv_data) ++{ ++ unsigned long flags; ++ unsigned limit = 500; ++ int status = 0; ++ ++ spin_lock_irqsave(&drv_data->lock, flags); ++ ++ /* This is a bit lame, but is optimized for the common execution path. ++ * A wait_queue on the drv_data->busy could be used, but then the common ++ * execution path (pump_messages) would be required to call wake_up or ++ * friends on every SPI message. Do this instead */ ++ drv_data->run = QUEUE_STOPPED; ++ while (!list_empty(&drv_data->queue) && drv_data->busy && limit--) { ++ spin_unlock_irqrestore(&drv_data->lock, flags); ++ msleep(10); ++ spin_lock_irqsave(&drv_data->lock, flags); ++ } ++ ++ if (!list_empty(&drv_data->queue) || drv_data->busy) ++ status = -EBUSY; ++ ++ spin_unlock_irqrestore(&drv_data->lock, flags); ++ ++ return status; ++} ++ ++static int destroy_queue(struct driver_data *drv_data) ++{ ++ int status; ++ ++ status = stop_queue(drv_data); ++ if (status != 0) ++ return status; ++ ++ destroy_workqueue(drv_data->workqueue); ++ ++ return 0; ++} ++ ++ ++static void cleanup(struct spi_device *spi) ++{ ++ struct chip_data *chip = spi_get_ctldata((struct spi_device *)spi); ++ ++ dev_dbg(&spi->dev, "spi_device %u.%u cleanup\n", ++ spi->master->bus_num, spi->chip_select); ++ ++ kfree(chip); ++} ++ ++ ++/****************************************************************************/ ++ ++/* ++ * Generic Device driver routines and interface implementation ++ */ ++ ++static int coldfire_spi_probe(struct platform_device *pdev) ++{ ++ struct device *dev = &pdev->dev; ++ struct coldfire_spi_master *platform_info; ++ struct spi_master *master; ++ struct driver_data *drv_data = 0; ++ struct resource *memory_resource; ++ int irq; ++ int status = 0; ++ int i; ++#if defined(SPI_DSPI_EDMA) ++ dma_addr_t dma_handle; ++#endif ++ ++ platform_info = (struct coldfire_spi_master *)dev->platform_data; ++ ++ master = spi_alloc_master(dev, sizeof(struct driver_data)); ++ if (!master) ++ return -ENOMEM; ++ ++ drv_data = spi_master_get_devdata(master); ++ drv_data->master = master; ++ ++ INIT_LIST_HEAD(&drv_data->queue); ++ spin_lock_init(&drv_data->lock); ++ ++ master->bus_num = platform_info->bus_num; ++ master->num_chipselect = platform_info->num_chipselect; ++ master->cleanup = cleanup; ++ master->setup = setup; ++ master->transfer = transfer; ++ ++ drv_data->cs_control = platform_info->cs_control; ++ if (drv_data->cs_control) ++ for (i = 0; i < master->num_chipselect; i++) ++ drv_data->cs_control(i, QSPI_CS_INIT | QSPI_CS_DROP); ++ ++ /* Setup register addresses */ ++ memory_resource = platform_get_resource_byname(pdev, ++ IORESOURCE_MEM, "spi-module"); ++ if (!memory_resource) { ++ dev_dbg(dev, "can not find platform module memory\n"); ++ goto out_error_master_alloc; ++ } ++ ++#if defined(SPI_DSPI_EDMA) ++ drv_data->edma_tx_buf = dma_alloc_coherent(NULL, EDMA_BUFSIZE_KMALLOC, \ ++ &dma_handle, GFP_DMA); ++ if (!drv_data->edma_tx_buf) { ++ dev_dbg(dev, "cannot allocate eDMA TX memory\n"); ++ goto out_error_master_alloc; ++ } ++ drv_data->edma_rx_buf = dma_alloc_coherent(NULL, EDMA_BUFSIZE_KMALLOC, \ ++ &dma_handle, GFP_DMA); ++ if (!drv_data->edma_rx_buf) { ++ dma_free_coherent(NULL, EDMA_BUFSIZE_KMALLOC, \ ++ drv_data->edma_tx_buf, dma_handle); ++ kfree(drv_data->edma_tx_buf); ++ dev_dbg(dev, "cannot allocate eDMA RX memory\n"); ++ goto out_error_master_alloc; ++ } ++#endif ++ ++ drv_data->mcr = (void *)&MCF_DSPI_DMCR; ++ drv_data->ctar = (void *)&MCF_DSPI_DCTAR0; ++ drv_data->dspi_sr = (void *)&MCF_DSPI_DSR; ++ drv_data->dspi_rser = (void *)&MCF_DSPI_DRSER; ++ drv_data->dspi_dtfr = (void *)&MCF_DSPI_DTFR; ++ drv_data->dspi_drfr = (void *)&MCF_DSPI_DRFR; ++ ++ memory_resource = platform_get_resource_byname(pdev, IORESOURCE_MEM, ++ "spi-par"); ++ if (!memory_resource) { ++ dev_dbg(dev, "No spi-par memory\n"); ++ goto out_error_master_alloc; ++ } ++ drv_data->par = (void *)memory_resource->start; ++ ++ memory_resource = platform_get_resource_byname(pdev, IORESOURCE_MEM, ++ "spi-int-level"); ++ if (!memory_resource) { ++ dev_dbg(dev, "No spi-int-level memory\n"); ++ goto out_error_master_alloc; ++ } ++ drv_data->int_icr = (void *)memory_resource->start; ++ ++ memory_resource = platform_get_resource_byname(pdev, IORESOURCE_MEM, ++ "spi-int-mask"); ++ if (!memory_resource) { ++ dev_dbg(dev, "No spi-int-mask memory\n"); ++ goto out_error_master_alloc; ++ } ++ drv_data->int_mr = (void *)memory_resource->start; ++ ++ if (platform_info->irq_list) { ++ /* multiple IRQs */ ++ int *irqlist = platform_info->irq_list; ++ while ((irq = *irqlist++)) { ++ int off = *irqlist++; ++ int lvl = *irqlist++; ++ int msk = *irqlist++; ++ status = request_irq(irq, dspi_interrupt, IRQF_DISABLED, ++ dev->bus_id, drv_data); ++ if (status < 0) { ++ dev_err(&pdev->dev, ++ "Unable to attach ColdFire DSPI interrupt\n"); ++ goto out_error_master_alloc; ++ } ++ ++ if (lvl) ++ *(drv_data->int_icr + off) = lvl; ++ ++ if (msk) ++ *drv_data->int_mr &= ~msk; ++ } ++ } ++ else { ++ irq = platform_info->irq_vector; ++ ++ status = request_irq(platform_info->irq_vector, dspi_interrupt, ++ IRQF_DISABLED, dev->bus_id, drv_data); ++ if (status < 0) { ++ dev_err(&pdev->dev, "Unable to attach ColdFire DSPI interrupt\n"); ++ goto out_error_master_alloc; ++ } ++ ++ *drv_data->int_icr = platform_info->irq_lp; ++ *drv_data->int_mr &= ~platform_info->irq_mask; ++ } ++ ++ /* Now that we have all the addresses etc. Let's set it up */ ++ if (platform_info->par_val) ++ *drv_data->par = platform_info->par_val; ++ ++ /* Initial and start queue */ ++ status = init_queue(drv_data); ++ if (status != 0) { ++ dev_err(&pdev->dev, "Problem initializing DSPI queue\n"); ++ goto out_error_irq_alloc; ++ } ++ status = start_queue(drv_data); ++ if (status != 0) { ++ dev_err(&pdev->dev, "Problem starting DSPI queue\n"); ++ goto out_error_irq_alloc; ++ } ++ ++ /* Register with the SPI framework */ ++ platform_set_drvdata(pdev, drv_data); ++ status = spi_register_master(master); ++ if (status != 0) { ++ dev_err(&pdev->dev, "Problem registering DSPI master\n"); ++ status = -EINVAL; ++ goto out_error_queue_alloc; ++ } ++ ++#if defined(SPI_DSPI_EDMA) ++ if (mcf_edma_request_channel(DSPI_DMA_TX_TCD, ++ edma_tx_handler, ++ NULL, ++ 0x0, ++ pdev, ++ NULL, /* spinlock */ ++ DRIVER_NAME) < 0){ ++ dev_err(&pdev->dev, "eDMA transmit channel request\n"); ++ status = -EINVAL; ++ goto out_error_queue_alloc; ++ } ++ ++ if (mcf_edma_request_channel(DSPI_DMA_RX_TCD, ++ edma_rx_handler, ++ NULL, ++ 0x0, ++ pdev, ++ NULL, /* spinlock */ ++ DRIVER_NAME) < 0){ ++ dev_err(&pdev->dev, "eDAM receive channel request\n"); ++ status = -EINVAL; ++ mcf_edma_free_channel(DSPI_DMA_TX_TCD, pdev); ++ goto out_error_queue_alloc; ++ } ++#endif ++ ++ printk(KERN_INFO "DSPI: Coldfire master initialized\n"); ++ return status; ++ ++out_error_queue_alloc: ++ destroy_queue(drv_data); ++ ++out_error_irq_alloc: ++ free_irq(platform_info->irq_vector, drv_data); ++ ++out_error_master_alloc: ++ spi_master_put(master); ++ return status; ++ ++} ++ ++static int coldfire_spi_remove(struct platform_device *pdev) ++{ ++ struct driver_data *drv_data = platform_get_drvdata(pdev); ++ int irq; ++ int status = 0; ++ ++ if (!drv_data) ++ return 0; ++ ++#if defined(SPI_DSPI_EDMA) ++ mcf_edma_free_channel(DSPI_DMA_TX_TCD, pdev); ++ mcf_edma_free_channel(DSPI_DMA_RX_TCD, pdev); ++#endif ++ ++ /* Remove the queue */ ++ status = destroy_queue(drv_data); ++ if (status != 0) ++ return status; ++ ++ /* Release IRQ */ ++ irq = platform_get_irq(pdev, 0); ++ if (irq >= 0) ++ free_irq(irq, drv_data); ++ ++ /* Disconnect from the SPI framework */ ++ spi_unregister_master(drv_data->master); ++ ++ /* Prevent double remove */ ++ platform_set_drvdata(pdev, NULL); ++ ++ return 0; ++} ++ ++static void coldfire_spi_shutdown(struct platform_device *pdev) ++{ ++ int status = coldfire_spi_remove(pdev); ++ ++ if (status != 0) ++ dev_err(&pdev->dev, "shutdown failed with %d\n", status); ++} ++ ++ ++#ifdef CONFIG_PM ++static int suspend_devices(struct device *dev, void *pm_message) ++{ ++ pm_message_t *state = pm_message; ++ ++ if (dev->power.power_state.event != state->event) { ++ dev_warn(dev, "pm state does not match request\n"); ++ return -1; ++ } ++ ++ return 0; ++} ++ ++static int coldfire_spi_suspend(struct platform_device *pdev, ++ pm_message_t state) ++{ ++ struct driver_data *drv_data = platform_get_drvdata(pdev); ++ int status = 0; ++ ++ /* Check all childern for current power state */ ++ if (device_for_each_child(&pdev->dev, ++ &state, suspend_devices) != 0) { ++ dev_warn(&pdev->dev, "suspend aborted\n"); ++ return -1; ++ } ++ ++ status = stop_queue(drv_data); ++ if (status != 0) ++ return status; ++ ++ return 0; ++} ++ ++static int coldfire_spi_resume(struct platform_device *pdev) ++{ ++ struct driver_data *drv_data = platform_get_drvdata(pdev); ++ int status = 0; ++ ++ /* Start the queue running */ ++ status = start_queue(drv_data); ++ if (status != 0) { ++ dev_err(&pdev->dev, "problem starting queue (%d)\n", status); ++ return status; ++ } ++ ++ return 0; ++} ++#else ++#define coldfire_spi_suspend NULL ++#define coldfire_spi_resume NULL ++#endif /* CONFIG_PM */ ++ ++static struct platform_driver driver = { ++ .driver = { ++ .name = "spi_coldfire", ++ .bus = &platform_bus_type, ++ .owner = THIS_MODULE, ++ }, ++ .probe = coldfire_spi_probe, ++ .remove = __devexit_p(coldfire_spi_remove), ++ .shutdown = coldfire_spi_shutdown, ++ .suspend = coldfire_spi_suspend, ++ .resume = coldfire_spi_resume, ++}; ++ ++static int __init coldfire_spi_init(void) ++{ ++ platform_driver_register(&driver); ++ ++ return 0; ++} ++module_init(coldfire_spi_init); ++ ++static void __exit coldfire_spi_exit(void) ++{ ++ platform_driver_unregister(&driver); ++} ++module_exit(coldfire_spi_exit); ++ ++MODULE_AUTHOR("Matt Waddel"); ++MODULE_DESCRIPTION("ColdFire DSPI Contoller"); ++MODULE_LICENSE("GPL"); +--- /dev/null ++++ b/include/asm-m68k/mcfdspi.h +@@ -0,0 +1,48 @@ ++/* ++ * mcfdspi.h-DSPI controller for the ColdFire processors. ++ * ++ * Andrey Butok ++ * Copyright Freescale Semiconductor, Inc. 2008 ++ * ++ * This file is based on mcfqspi.h ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ++ * ++ *************************************************************************** ++ * Changes: ++ * v0.001 25 March 2008 Andrey Butok ++ * Initial Release - developed on uClinux with 2.6.23 kernel. ++ * ++ */ ++ ++#ifndef MCFDSPI_H_ ++#define MCFDSPI_H_ ++ ++struct coldfire_dspi_chip { ++ u8 mode; ++ u8 bits_per_word; ++ u16 void_write_data; ++ /* Only used in master mode */ ++ u8 dbr; /* Double baud rate */ ++ u8 pbr; /* Baud rate prescaler */ ++ u8 br; /* Baud rate scaler */ ++ u8 pcssck; /* PCS to SCK delay prescaler */ ++ u8 pasc; /* After SCK delay prescaler */ ++ u8 pdt; /* Delay after transfer prescaler */ ++ u8 cssck; /* PCS to SCK delay scaler */ ++ u8 asc; /* After SCK delay scaler */ ++ u8 dt; /* Delay after transfer scaler */ ++}; ++#endif /*MCFDSPI_H_*/ diff --git a/target/linux/coldfire/patches/081-mcfv4e_vmalloc_fix.patch b/target/linux/coldfire/patches/081-mcfv4e_vmalloc_fix.patch new file mode 100644 index 0000000000..2bb2db60f0 --- /dev/null +++ b/target/linux/coldfire/patches/081-mcfv4e_vmalloc_fix.patch @@ -0,0 +1,60 @@ +From db94c8c3ec831b5fab828487ba05041bc048fccf Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Tue, 15 Jul 2008 17:48:11 -0600 +Subject: [PATCH] Move VMALLOC region to a valid area. + +LTIBName: mcfv4e-vmalloc-fix +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + arch/m68k/mm/cf-mmu.c | 7 +------ + include/asm-m68k/pgtable.h | 6 +++++- + 2 files changed, 6 insertions(+), 7 deletions(-) + +--- a/arch/m68k/mm/cf-mmu.c ++++ b/arch/m68k/mm/cf-mmu.c +@@ -35,7 +35,7 @@ + #include <asm/coldfire.h> + #include <asm/tlbflush.h> + +-#define KMAPAREA(x) ((x >= KMAP_START) && ( x < KMAP_END)) ++#define KMAPAREA(x) ((x >= VMALLOC_START) && ( x < KMAP_END)) + + #undef DEBUG + +@@ -62,11 +62,6 @@ void free_initmem(void) + unsigned long start = (unsigned long)&__init_begin; + unsigned long end = (unsigned long)&__init_end; + +-/* +- * JKM -- revisit -- the latest round of vmlinux.lds changes has caused +- * a little grief with how init areas are handled. With the new toolchain +- * release I'll fix this. +- */ + printk(KERN_INFO "free_initmem: __init_begin = 0x%lx __init_end = 0x%lx\n", start, end); + + addr = (unsigned long)&__init_begin; +--- a/include/asm-m68k/pgtable.h ++++ b/include/asm-m68k/pgtable.h +@@ -73,7 +73,9 @@ + #define KMAP_START 0x0DC00000 + #define KMAP_END 0x0E000000 + #elif defined(CONFIG_COLDFIRE) +-#define KMAP_START 0xd0000000 ++#define VMALLOC_START 0xc0000000 ++#define VMALLOC_END 0xcfffffff ++#define KMAP_START (VMALLOC_END + 1) + #define KMAP_END 0xe0000000 + #else + #define KMAP_START 0xd0000000 +@@ -88,9 +90,11 @@ + * The vmalloc() routines leaves a hole of 4kB between each vmalloced + * area for the same reason. ;) + */ ++#if !defined(CONFIG_COLDFIRE) + #define VMALLOC_OFFSET (8*1024*1024) + #define VMALLOC_START (((unsigned long) high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1)) + #define VMALLOC_END KMAP_START ++#endif + #else + extern unsigned long vmalloc_end; + #define VMALLOC_START 0x0f800000 diff --git a/target/linux/coldfire/patches/086-m547x_8x_dma_dipr.patch b/target/linux/coldfire/patches/086-m547x_8x_dma_dipr.patch new file mode 100644 index 0000000000..8ce9502e4f --- /dev/null +++ b/target/linux/coldfire/patches/086-m547x_8x_dma_dipr.patch @@ -0,0 +1,24 @@ +From 6cf498f4cf1930950d31aff5669bdba97d12364c Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Thu, 17 Jul 2008 15:02:23 -0600 +Subject: [PATCH] Properly clear bits in DIPR. + +Bugzilla 1351. + +LTIBName: m547x-8x-dma-dipr +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + arch/m68k/coldfire/m547x_8x-dma.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +--- a/arch/m68k/coldfire/m547x_8x-dma.c ++++ b/arch/m68k/coldfire/m547x_8x-dma.c +@@ -455,7 +455,7 @@ irqreturn_t dma_interrupt_handler(int ir + * pending interrupts with those that aren't masked. + */ + interrupts = MCF_DMA_DIPR; +- MCF_DMA_DIPR |= interrupts; ++ MCF_DMA_DIPR = interrupts; + + for (i = 0; i < 16; ++i, interrupts >>= 1) { + if (interrupts & 0x1) diff --git a/target/linux/coldfire/patches/087-m547x_8x_reboot_wd.patch b/target/linux/coldfire/patches/087-m547x_8x_reboot_wd.patch new file mode 100644 index 0000000000..3316cbfee4 --- /dev/null +++ b/target/linux/coldfire/patches/087-m547x_8x_reboot_wd.patch @@ -0,0 +1,36 @@ +From b3a11478f28a24b719ff6426f52216c37c3331d7 Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Thu, 17 Jul 2008 17:02:29 -0600 +Subject: [PATCH] Enable watchdog to reboot the processor. + +LTIBName: m547x-8x-reboot-wd +Signed-off-by: Kurt Mahan <kmahan@freescale.com> +--- + arch/m68k/coldfire/config.c | 9 +++++++++ + 1 files changed, 9 insertions(+), 0 deletions(-) + +--- a/arch/m68k/coldfire/config.c ++++ b/arch/m68k/coldfire/config.c +@@ -50,6 +50,10 @@ + #include <asm/mcf5445x_xbs.h> + #endif + ++#ifdef CONFIG_M547X_8X ++#include <asm/m5485gpt.h> ++#endif ++ + extern int get_irq_list(struct seq_file *p, void *v); + extern char _text, _end; + extern char _etext, _edata, __init_begin, __init_end; +@@ -379,6 +383,11 @@ void coldfire_reboot(void) + "moveb #0x80, %%d0\n\t" + "moveb %%d0, 0xfc0a0000\n\t" + : : : "%d0"); ++#elif defined(CONFIG_M547X_8X) ++ /* disable interrupts and enable the watchdog */ ++ printk(KERN_INFO "Rebooting\n"); ++ asm("movew #0x2700, %sr\n"); ++ MCF_GPT_GMS0 = MCF_GPT_GMS_WDEN | MCF_GPT_GMS_CE | MCF_GPT_GMS_TMS(4); + #endif + } + diff --git a/target/linux/coldfire/patches/088-m547x_8x_i2c_timeout_fix.patch b/target/linux/coldfire/patches/088-m547x_8x_i2c_timeout_fix.patch new file mode 100644 index 0000000000..dbc3c994bb --- /dev/null +++ b/target/linux/coldfire/patches/088-m547x_8x_i2c_timeout_fix.patch @@ -0,0 +1,123 @@ +From b9607c9083b767eac26df1d39a030f3cba5d3ae3 Mon Sep 17 00:00:00 2001 +From: Kurt Mahan <kmahan@freescale.com> +Date: Fri, 18 Jul 2008 12:40:04 -0600 +Subject: [PATCH] Increase timeouts on I2C bus. + +LTIBName: m547x-8x-i2c-timeout-fix +Signed-off-by: Shrek Wu <b16972@freescale.com> +--- + drivers/i2c/busses/i2c-mcf548x.c | 40 +++++++++++++++++++++++++++++-------- + 1 files changed, 31 insertions(+), 9 deletions(-) + +--- a/drivers/i2c/busses/i2c-mcf548x.c ++++ b/drivers/i2c/busses/i2c-mcf548x.c +@@ -43,8 +43,8 @@ static struct i2c_adapter i2c_mcf_board_ + .id = I2C_HW_MPC107, + .algo_data = &i2c_mcf_board_data, + .class = I2C_CLASS_HWMON, +- .timeout = 1, +- .retries = 1 ++ .timeout = 100, ++ .retries = 2 + }; + /* + * static void i2c_start() +@@ -105,7 +105,7 @@ wait_for_bb( + for (i = 0; i < adap->timeout; i++) { + if (!(MCF_I2SR & MCF_I2SR_IBB)) + return 0; +- udelay(10); ++ udelay(100); + } + printk(KERN_ERR "%s: timeout", __FUNCTION__); + return -ETIMEDOUT; +@@ -124,7 +124,7 @@ wait_for_not_bb( + for (i = 0; i < adap->timeout; i++) { + if (MCF_I2SR & MCF_I2SR_IBB) + return 0; +- udelay(10); ++ udelay(100); + } + printk(KERN_ERR "%s: timeout", __FUNCTION__); + return -ETIMEDOUT; +@@ -146,7 +146,7 @@ wait_xfer_done( + MCF_I2SR &= ~MCF_I2SR_IIF; + return 0; + } +- udelay(1); ++ udelay(10); + } + printk(KERN_ERR "%s: timeout", __FUNCTION__); + return -ETIMEDOUT; +@@ -166,7 +166,7 @@ i2c_set_addr( + ) { + unsigned short flags = msg->flags; + unsigned char addr; +- ++ MCF_I2CR |= MCF_I2CR_MTX; + if ((flags & I2C_M_TEN)) { + /* 10 bit address not supported yet */ + return -EIO; +@@ -269,7 +269,7 @@ mcf_sendbytes( + i2c_stop(adap); + wait_for_bb(adap); + } else { +- i2c_repstart(adap); ++ /* i2c_repstart(adap);*/ + } + + return (i); +@@ -330,7 +330,7 @@ mcf_readbytes( + i2c_stop(adap); + wait_for_bb(adap); + } else { +- i2c_repstart(adap); ++ /* i2c_repstart(adap);*/ + } + + return (i+1); +@@ -380,6 +380,27 @@ mcf_xfer( + wait_for_bb(adap); + + for (i = 0; ret >= 0 && i < num; i++) { ++ if (MCF_I2SR & MCF_I2SR_IBB) { ++ MCF_I2ICR = 0x00; ++ MCF_I2CR = 0x00; ++ MCF_I2CR = 0x0A; ++ timeout = MCF_I2DR; ++ MCF_I2SR = 0x00; ++ MCF_I2CR = 0x00; ++ MCF_I2ICR = 0x01; ++ } ++ /* setup SCL clock */ ++ MCF_I2FDR = get_clock(adap); ++ /* set slave address */ ++ MCF_I2AR = get_own(adap); ++ /* enable I2C module */ ++ MCF_I2CR = MCF_I2CR_IEN; ++ ++ MCF_I2CR |= MCF_I2CR_TXAK; ++ ++ /* Check for bus busy */ ++ wait_for_bb(adap); ++ + pmsg = &msgs[i]; + + printk(KERN_DEBUG "i2c-algo-mcf: Doing %s %d bytes " +@@ -388,7 +409,7 @@ mcf_xfer( + pmsg->len, pmsg->addr, i + 1, num); + + /* Send START */ +- if (i == 0) ++ /*if (i == 0)*/ + i2c_start(adap); + + /* Wait for Bus Busy */ +@@ -440,6 +461,7 @@ mcf_xfer( + "%d bytes.\n", ret); + } + } ++ MCF_I2CR = 0; + } + + /* Disable I2C module */ diff --git a/target/linux/coldfire/patches/089-m547x_8x_pci_reset_usb_fix.patch b/target/linux/coldfire/patches/089-m547x_8x_pci_reset_usb_fix.patch new file mode 100644 index 0000000000..79a1e3930e --- /dev/null +++ b/target/linux/coldfire/patches/089-m547x_8x_pci_reset_usb_fix.patch @@ -0,0 +1,49 @@ +Bugzilla 1647. This patch resets PCI which fixes the USB problem on mcf5475. + +Set PCI registers MCF_PCIGSCR and MCF_PCITCR to their reset defaults. +This fixes the USB problem and enables other PCI cards, such as PCI +network to function properly. + +Original work of Matt Waddel +Signed-off-by: Ross Wille + +--- a/arch/m68k/coldfire/mcf548x-pci.c ++++ b/arch/m68k/coldfire/mcf548x-pci.c +@@ -1,5 +1,23 @@ + /* + * ColdFire 547x/548x PCI Host Controller functions ++ * ++ * Copyright (c) 2005-2008 Freescale Semiconductor, Inc. ++ * ++ * This code is based on the 2.6.10 version of pci.c ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + #include <linux/kernel.h> + #include <linux/types.h> +@@ -815,6 +833,13 @@ struct pci_bus_info *__init init_coldfir + return NULL; + } + ++ /* Must Reset!!! If bootloader has PCI enabled, it will cause ++ * problem in linux when it tries to configure/find resources ++ * for the pci devices. Both registers need to be reset. ++ */ ++ MCF_PCIGSCR = 0x1; ++ MCF_PCITCR = 0x00000000; ++ + /* Set up the arbiter */ + MCF_PCIARB_PACR = 0 /*MCF_PCIARB_PACR_PKMD*/ + | MCF_PCIARB_PACR_INTMPRI diff --git a/target/linux/coldfire/patches/090-m547x_8x_fec_rxfifo_check.patch b/target/linux/coldfire/patches/090-m547x_8x_fec_rxfifo_check.patch new file mode 100644 index 0000000000..85f89c16d7 --- /dev/null +++ b/target/linux/coldfire/patches/090-m547x_8x_fec_rxfifo_check.patch @@ -0,0 +1,27 @@ +Re-enable rx fifo buffer checks. + +LTIBName: linux-2.6.25-m547x-8x-fec-rxfifo-check +Acked-by: Kurt Mahan <kmahan@freescale.com> +Signed-off-by: Shrek Wu <b16972@freescale.com> +--- a/drivers/net/fec/fec.c ++++ b/drivers/net/fec/fec.c +@@ -941,9 +941,9 @@ void fec_interrupt_fec_rx_handler(struct + { + struct fec_priv *fp = netdev_priv(dev); + struct sk_buff *skb; ++ int i; + + fp->fecpriv_rxflag = 1; +-/* + // Some buffers can be missed + if(!(fp->fecpriv_rxdesc[fp->fecpriv_current_rx].statCtrl & MCD_FEC_END_FRAME)) + { +@@ -961,7 +961,7 @@ void fec_interrupt_fec_rx_handler(struct + return; + } + } +-*/ ++ + for (; fp->fecpriv_rxdesc[fp->fecpriv_current_rx].statCtrl & MCD_FEC_END_FRAME; fp->fecpriv_current_rx = (fp->fecpriv_current_rx + 1) & FEC_RX_INDEX_MASK) { + if( (fp->fecpriv_rxdesc[fp->fecpriv_current_rx].length <= FEC_MAXBUF_SIZE) && + (fp->fecpriv_rxdesc[fp->fecpriv_current_rx].length > 4)) { /* --tym-- */ diff --git a/target/linux/coldfire/patches/100-compile_fixes.patch b/target/linux/coldfire/patches/100-compile_fixes.patch index 7a579b3628..0f0694e2f0 100644 --- a/target/linux/coldfire/patches/100-compile_fixes.patch +++ b/target/linux/coldfire/patches/100-compile_fixes.patch @@ -9,18 +9,6 @@ { pgd_val(*pgdp) = virt_to_phys(pmdp); } ---- a/include/asm-m68k/irq.h -+++ b/include/asm-m68k/irq.h -@@ -61,7 +61,8 @@ - - #define IRQ_USER 8 - --extern unsigned int irq_canonicalize(unsigned int irq); -+//extern unsigned int irq_canonicalize(unsigned int irq); -+#define irq_canonicalize(irq) (irq) - - struct pt_regs; - --- a/arch/m68k/mm/cf-mmu.c +++ b/arch/m68k/mm/cf-mmu.c @@ -21,6 +21,7 @@ |