Remove duplicated files to stop the linker from complaining about duplicate
symbols

Signed-off-by: Alexandre Belloni <abelloni@adeneo-embedded.com>
---
--- a/csps/lpc32xx/bsps/fdi3250/startup/examples/s1l/sysapi_timer.c	2011-10-05 19:10:37.000000000 +0200
+++ /dev/null	2012-01-01 16:39:47.918907000 +0100
@@ -1,212 +0,0 @@
-/***********************************************************************
- * $Id:: sysapi_timer.c 3394 2010-05-06 17:56:27Z usb10132             $
- *
- * Project: Time support functions
- *
- * Description:
- *     Implements the following functions required for the S1L API
- *         time_init
- *         time_reset
- *         time_start
- *         time_stop
- *         time_get
- *         time_get_rate
- *
- ***********************************************************************
- * Software that is described herein is for illustrative purposes only  
- * which provides customers with programming information regarding the  
- * products. This software is supplied "AS IS" without any warranties.  
- * NXP Semiconductors assumes no responsibility or liability for the 
- * use of the software, conveys no license or title under any patent, 
- * copyright, or mask work right to the product. NXP Semiconductors 
- * reserves the right to make changes in the software without 
- * notification. NXP Semiconductors also make no representation or 
- * warranty that such application will be suitable for the specified 
- * use without further testing or modification. 
- **********************************************************************/
-
-#include "s1l_sys_inf.h"
-#include "lpc32xx_intc_driver.h"
-#include "lpc32xx_timer_driver.h"
-
-static UNS_64 base_rate;
-static INT_32 tdev = 0;
-
-/***********************************************************************
- *
- * Function: time_init
- *
- * Purpose: Initializes time system
- *
- * Processing: Initializes the system timer.
- *
- * Parameters: None
- *
- * Outputs: None
- *
- * Returns: 0 if the init failed, otherwise non-zero
- *
- * Notes: None
- *
- **********************************************************************/
-INT_32 time_init(void)
-{
-	TMR_PSCALE_SETUP_T pscale;
-
-	/* Open timer driver */
-	if (tdev == 0)
-	{
-		tdev = timer_open((void *) TIMER_CNTR0, 0);
-		if (tdev != 0)
-		{
-			/* Use a prescale count to 100000 */
-			pscale.ps_tick_val = 100000;
-			pscale.ps_us_val = 0; /* Not needed when ps_tick_val != 0 */
-			timer_ioctl(tdev, TMR_SETUP_PSCALE, (INT_32) &pscale);
-
-			/* Get timer clock rate */
-			base_rate = (UNS_64) timer_ioctl(tdev, TMR_GET_STATUS,
-				TMR_GET_CLOCK);
-		}
-	}
-
-	return tdev;
-}
-
-/***********************************************************************
- *
- * Function: time_reset
- *
- * Purpose: Resets system timer
- *
- * Processing:
- *     See function.
- *
- * Parameters: None
- *
- * Outputs: None
- *
- * Returns: Nothing
- *
- * Notes: None
- *
- **********************************************************************/
-void time_reset(void)
-{
-	if (tdev != 0)
-	{
-		timer_ioctl(tdev, TMR_RESET, 1);
-	}
-}
-
-/***********************************************************************
- *
- * Function: time_start
- *
- * Purpose: Starts system timer
- *
- * Processing:
- *     See function.
- *
- * Parameters: None
- *
- * Outputs: None
- *
- * Returns: Nothing
- *
- * Notes: None
- *
- **********************************************************************/
-void time_start(void)
-{
-	if (tdev != 0)
-	{
-		timer_ioctl(tdev, TMR_ENABLE, 1);
-	}
-}
-
-/***********************************************************************
- *
- * Function: time_stop
- *
- * Purpose: Stops system timer
- *
- * Processing:
- *     See function.
- *
- * Parameters: None
- *
- * Outputs: None
- *
- * Returns: Nothing
- *
- * Notes: None
- *
- **********************************************************************/
-void time_stop(void)
-{
-	if (tdev != 0)
-	{
-		timer_ioctl(tdev, TMR_ENABLE, 0);
-	}
-}
-
-/***********************************************************************
- *
- * Function: time_get
- *
- * Purpose: Returns current system time value
- *
- * Processing:
- *     See function.
- *
- * Parameters: None
- *
- * Outputs: None
- *
- * Returns: The number of ticks of the timer counter
- *
- * Notes: None
- *
- **********************************************************************/
-UNS_64 time_get(void)
-{
-	TMR_COUNTS_T tcounts;
-	UNS_64 ticks = 0;
-
-	if (tdev != 0)
-	{
-		timer_ioctl(tdev, TMR_GET_COUNTS, (INT_32) &tcounts);
-
-		/* Compute number of timer ticks */
-		ticks = (UNS_64) tcounts.count_val * 100000;
-		ticks = ticks + (UNS_64) tcounts.ps_count_val;
-	}
-
-	return ticks;
-}
-
-/***********************************************************************
- *
- * Function: time_get_rate
- *
- * Purpose:
- *     Returns base tick rate (ticks per second) of the time counter
- *
- * Processing:
- *     See function.
- *
- * Parameters: None
- *
- * Outputs: None
- *
- * Returns: The timer tick rate (in ticks per second)
- *
- * Notes: None
- *
- **********************************************************************/
-UNS_64 time_get_rate(void)
-{
-	return base_rate;
-}
-
--- a/csps/lpc32xx/bsps/fdi3250/startup/examples/s1l/sys_mmu_cmd_group.c	2011-10-05 19:10:37.000000000 +0200
+++ /dev/null	2012-01-01 16:39:47.918907000 +0100
@@ -1,746 +0,0 @@
-/***********************************************************************
- * $Id:: sys_mmu_cmd_group.c 3430 2010-05-07 17:39:08Z usb10132        $
- *
- * Project: Command processor for peek, poke, dump, and fill
- *
- * Description:
- *     Processes commands from the command prompt
- *
- ***********************************************************************
- * Software that is described herein is for illustrative purposes only  
- * which provides customers with programming information regarding the  
- * products. This software is supplied "AS IS" without any warranties.  
- * NXP Semiconductors assumes no responsibility or liability for the 
- * use of the software, conveys no license or title under any patent, 
- * copyright, or mask work right to the product. NXP Semiconductors 
- * reserves the right to make changes in the software without 
- * notification. NXP Semiconductors also make no representation or 
- * warranty that such application will be suitable for the specified 
- * use without further testing or modification. 
- **********************************************************************/
-
-#include "lpc_arm922t_cp15_driver.h"
-#include "lpc_string.h"
-#include "startup.h"
-#include "s1l_cmds.h"
-#include "s1l_sys_inf.h"
-
-/* dcache command */
-BOOL_32 cmd_dcache(void);
-static UNS_32 cmd_dcache_plist[] =
-{
-	(PARSE_TYPE_STR), /* The "dcache" command */
-	(PARSE_TYPE_DEC | PARSE_TYPE_END)
-};
-static CMD_ROUTE_T core_dcache_cmd =
-{
-	(UNS_8 *) "dcache",
-	cmd_dcache,
-	(UNS_8 *) "Enables, disables, or flushes data cache",
-	(UNS_8 *) "dcache [0(disable), 1(enable), 2(flush)]",
-	cmd_dcache_plist,
-	NULL
-};
-
-/* icache command */
-BOOL_32 cmd_icache(void);
-static UNS_32 cmd_icache_plist[] =
-{
-	(PARSE_TYPE_STR), /* The "icache" command */
-	(PARSE_TYPE_DEC | PARSE_TYPE_END)
-};
-static CMD_ROUTE_T core_icache_cmd =
-{
-	(UNS_8 *) "icache",
-	cmd_icache,
-	(UNS_8 *) "Enables or disables instruction cache",
-	(UNS_8 *) "icache [0(disable), 1(enable)]",
-	cmd_icache_plist,
-	NULL
-};
-
-/* inval command */
-BOOL_32 cmd_inval(void);
-static UNS_32 cmd_inval_plist[] =
-{
-	(PARSE_TYPE_STR | PARSE_TYPE_END) /* The "inval" command */
-};
-static CMD_ROUTE_T core_inval_cmd =
-{
-	(UNS_8 *) "inval",
-	cmd_inval,
-	(UNS_8 *) "Flushes data cache and invalidates instruction cache",
-	(UNS_8 *) "inval",
-	cmd_inval_plist,
-	NULL
-};
-
-/* mmuenab command */
-BOOL_32 cmd_mmuenab(void);
-static UNS_32 cmd_mmuenab_plist[] =
-{
-	(PARSE_TYPE_STR), /* The "mmuenab" command */
-	(PARSE_TYPE_DEC | PARSE_TYPE_END)
-};
-static CMD_ROUTE_T core_mmuenab_cmd =
-{
-	(UNS_8 *) "mmuenab",
-	cmd_mmuenab,
-	(UNS_8 *) "Enables or disables the MMU",
-	(UNS_8 *) "mmuenab [0(disable), 1(enable)]",
-	cmd_mmuenab_plist,
-	NULL
-};
-
-/* map command */
-BOOL_32 cmd_map(void);
-static UNS_32 cmd_map_plist[] =
-{
-	(PARSE_TYPE_STR), /* The "map" command */
-	(PARSE_TYPE_HEX),
-	(PARSE_TYPE_HEX),
-	(PARSE_TYPE_DEC),
-	(PARSE_TYPE_DEC | PARSE_TYPE_END),
-};
-static CMD_ROUTE_T core_map_cmd =
-{
-	(UNS_8 *) "map",
-	cmd_map,
-	(UNS_8 *) "Maps a range of physical address sections to virtual addresses",
-	(UNS_8 *) "map [virt hex addr][phy hex addr][sections][0(uncached), 1(cached), 2(unmap)]",
-	cmd_map_plist,
-	NULL
-};
-
-/* mmuinfo command */
-static BOOL_32 cmd_mmuinfo(void);
-static UNS_32 cmd_mmuinfo_plist[] =
-{
-	(PARSE_TYPE_STR | PARSE_TYPE_END) /* The "mmuinfo" command */
-};
-static CMD_ROUTE_T core_mmuinfo_cmd =
-{
-	(UNS_8 *) "mmuinfo",
-	cmd_mmuinfo,
-	(UNS_8 *) "Dumps page table and MMU info",
-	(UNS_8 *) "mmuinfo",
-	cmd_mmuinfo_plist,
-	NULL
-};
-
-/* MMU group */
-static GROUP_LIST_T mmu_group =
-{
-	(UNS_8 *) "mmu", /* mmu group */
-	(UNS_8 *) "MMU command group",
-	NULL,
-	NULL
-};
-
-static UNS_8 enabled_msg [] =" enabled";
-static UNS_8 disabled_msg [] =" disabled";
-static UNS_8 dcache_msg[] = "Data cache";
-static UNS_8 icache_msg[] = "Instruction cache";
-static UNS_8 pagetab_msg[] = "Page table at address: ";
-static UNS_8 slist_msg[] = "Type        Virt       Phy        fl Size";
-static UNS_8 mmu_msg [] ="MMU";
-static UNS_8 cpage_msg[] = "Coarse page:";
-static UNS_8 fpage_msg[] = "Fine page  :";
-static UNS_8 sect_msg[] =  "Section    :";
-static UNS_8 mbytes_msg[] = "M";
-static UNS_8 map1_err_msg[] =
-	"Error : section addresses must be aligned on a 32-bit boundary";
-static UNS_8 map2_err_msg[] =
-	"Error : Number of sections exceeds address range of device";
-static UNS_8 phya_msg[] = "Virtual address ";
-static UNS_8 mapped_msg[] = " mapped to physical address ";
-static UNS_8 unmapped_msg[] = " unmapped from physical address ";
-static UNS_8 cached_msg[] = " (cached)";
-static UNS_8 inval_msg[] = " invalidated";
-static UNS_8 caches_msg [] ="Caches";
-static UNS_8 flushed_msg[] = " flushed";
-
-/***********************************************************************
- *
- * Function: show_section
- *
- * Purpose: Display section information
- *
- * Processing:
- *     See function.
- *
- * Parameters:
- *     mmu_reg   : MMU settings for this section
- *     virt_addr : Starting virtual address for this section
- *     segs      : Number of 1M segments for this section
- *
- * Outputs: None
- *
- * Returns: Nothing
- *
- * Notes: None
- *
- **********************************************************************/
-static void show_section(UNS_32 mmu_reg,
-						 UNS_32 virt_addr,
-						 UNS_32 segs) 
-{
-	UNS_8 straddr [16];
-	UNS_32 mmu_phy;
-
-	if ((mmu_reg & ARM922T_L1D_TYPE_PG_SN_MASK) !=
-		ARM922T_L1D_TYPE_FAULT) 
-	{
-		if ((mmu_reg & ARM922T_L1D_TYPE_PG_SN_MASK) ==
-			ARM922T_L1D_TYPE_CPAGE) 
-		{
-			term_dat_out(cpage_msg);
-		}
-		else if ((mmu_reg & ARM922T_L1D_TYPE_PG_SN_MASK) ==
-			ARM922T_L1D_TYPE_FPAGE) 
-		{
-			term_dat_out(fpage_msg);
-		}
-		else
-		{
-			term_dat_out(sect_msg);
-		}
-
-		/* Compute virtual address */
-		str_makehex(straddr, virt_addr, 8);
-		term_dat_out(straddr);
-		term_dat_out((UNS_8 *) " ");
-
-		/* Compute mapped physical address */
-		if ((mmu_reg & ARM922T_L1D_TYPE_PG_SN_MASK) ==
-		ARM922T_L1D_TYPE_SECTION) 
-		{
-			mmu_phy = mmu_reg & 0xFFF00000;
-		}
-		else 
-		{
-			/* Don't compute addresses for non-sections */
-			mmu_phy = 0;
-		}
-		str_makehex(straddr, mmu_phy, 8);
-		term_dat_out(straddr);
-		term_dat_out((UNS_8 *) " ");
-
-		/* MMU flags */
-		if ((mmu_reg & ARM922T_L1D_BUFFERABLE) != 0) 
-		{
-			term_dat_out((UNS_8 *) "b");
-		}
-		else 
-		{
-			term_dat_out((UNS_8 *) " ");
-		}
-		if ((mmu_reg & ARM922T_L1D_CACHEABLE) != 0) 
-		{
-			term_dat_out((UNS_8 *) "c");
-		}
-		else 
-		{
-			term_dat_out((UNS_8 *) " ");
-		}
-		term_dat_out((UNS_8 *) " ");
-
-		/* Displays used megabytes */
-		str_makedec(straddr, segs);
-		term_dat_out(straddr);
-		term_dat_out_crlf(mbytes_msg);
-	}
-}
-
-/***********************************************************************
- *
- * Function: mmu_dumpinfo
- *
- * Purpose: Display MMU info
- *
- * Processing:
- *     Display the MMU information, including enable status, cache
- *     status, and page table.
- *
- * Parameters: None
- *
- * Outputs: None
- *
- * Returns: TRUE if the command was processed, otherwise FALSE
- *
- * Notes: None
- *
- **********************************************************************/
-static BOOL_32 mmu_dumpinfo(void) 
-{
-	UNS_32 segsz, last_mmu_reg, mmu_vrt, mmu_reg, mmu_vrtsav = 0, *pt;
-	UNS_32 mlast_mmu_reg, mmmu_reg;
-	int idx;
-	UNS_8 hexaddr [16];
-
-	term_dat_out(mmu_msg);
-	if (cp15_mmu_enabled() == FALSE) 
-	{
-		term_dat_out_crlf(disabled_msg);
-	}
-	else 
-	{
-		term_dat_out_crlf(enabled_msg);
-
-	    /* Get MMU control register word */
-  		mmu_reg = cp15_get_mmu_control_reg();
-
-		/* Instruction cache status */
-		term_dat_out(icache_msg);
-		if ((mmu_reg & ARM922T_MMU_CONTROL_I) == 0) 
-		{
-			term_dat_out_crlf(disabled_msg);
-		}
-		else 
-		{
-			term_dat_out_crlf(enabled_msg);
-		}
-
-		/* Data cache status */
-		term_dat_out(dcache_msg);
-		if ((mmu_reg & ARM922T_MMU_CONTROL_C) == 0) 
-		{
-			term_dat_out_crlf(disabled_msg);
-		}
-		else 
-		{
-			term_dat_out_crlf(enabled_msg);
-		}
-
-		term_dat_out(pagetab_msg);
-		mmu_reg = (UNS_32) cp15_get_ttb();
-		str_makehex(hexaddr, mmu_reg, 8);
-		term_dat_out_crlf(hexaddr);
-		term_dat_out_crlf(slist_msg);
-
-		/* Process MMU table - assume that the physical and
-		   virtual locations of table are the same */
-		pt = (UNS_32 *) mmu_reg;
-		mmu_vrt = 0x0;
-		segsz = 0xFFFFFFFF;
-		last_mmu_reg = mlast_mmu_reg = 0xFFFFFFFF;
-		for (idx = 0; idx < 4096; idx++) 
-		{
-			mmu_reg = *pt;
-			mmmu_reg = (mmu_reg & (ARM922T_L1D_TYPE_PG_SN_MASK |
-				ARM922T_L1D_BUFFERABLE | ARM922T_L1D_CACHEABLE));
-			segsz = segsz + 1;
-
-			if ((last_mmu_reg != 0xFFFFFFFF) &&
-				(mlast_mmu_reg != mmmu_reg))
-			{
-				show_section(last_mmu_reg, mmu_vrtsav, segsz);
-				segsz = 0;
-			}
-
-			if (mlast_mmu_reg != mmmu_reg) 
-			{
-				mmu_vrtsav = mmu_vrt;
-				last_mmu_reg = mmu_reg;
-				mlast_mmu_reg = mmmu_reg;
-			}
-
-			pt++;
-			mmu_vrt += 0x00100000;
-		}
-	}
-
-	return TRUE;
-}
-
-/***********************************************************************
- *
- * Function: mmu_dumpmap
- *
- * Purpose: Map a virtual address range to a physical range
- *
- * Processing:
- *     From the input addresses and number of sections, generate the
- *     appropriate entries in the page table.
- *
- * Parameters: None
- *
- * Outputs: None
- *
- * Returns: TRUE if the command was processed, otherwise FALSE
- *
- * Notes: None
- *
- **********************************************************************/
-static BOOL_32 mmu_dumpmap(UNS_32 vrt,
-						   UNS_32 phy,
-						   UNS_32 sections,
-						   UNS_32 cache) 
-{
-	BOOL_32 processed = FALSE;
-	UNS_32 mmu_phy, mmu_vrt, tmp1 = 0, tmp2, *pt;
-	UNS_8 hexaddr [16];
-
-	/* Verify address boundaries are sectional */
-	mmu_vrt = vrt & ~ARM922T_L2D_SN_BASE_MASK;
-	mmu_phy = phy & ~ARM922T_L2D_SN_BASE_MASK;
-	if ((mmu_vrt != 0) || (mmu_phy != 0)) 
-	{
-		term_dat_out_crlf(map1_err_msg);
-	}
-	else 
-	{
-		/* Verify that address range and section count will not
-		   exceed address range of device */
-		tmp1 = vrt >> 20;
-		tmp1 = (tmp1 + sections) - 1;
-		tmp2 = phy >> 20;
-		tmp2 = (tmp2 + sections) - 1;
-		if ((tmp1 < 4096) && (tmp2 < 4096)) 
-		{
-			/* Good address range and good section count */
-			processed = TRUE;
-		}
-		else 
-		{
-			term_dat_out_crlf(map2_err_msg);
-		}
-	}
-	
-	/* Generate static part of MMU word */
-	if (cache == 0) 
-	{
-		/* Section mapped with cache disabled */
-		tmp1 = ARM922T_L1D_TYPE_SECTION;
-	}
-	else if (cache == 1)
-	{
-		/* Section mapped with cache enabled */
-		tmp1 = (ARM922T_L1D_BUFFERABLE | ARM922T_L1D_CACHEABLE |
-			ARM922T_L1D_TYPE_SECTION);
-	}
-	else if (cache == 2)
-	{
-		/* Section unmapped */
-		tmp1 = ARM922T_L1D_TYPE_FAULT;
-	}
-	tmp1 |= ARM922T_L1D_AP_ALL;
-
-	/* Offset into page table for virtual address */
-	tmp2 = (vrt >> 20);
-	pt = cp15_get_ttb() + tmp2;
-
-	/* Loop until all sections are complete */
-	while ((sections > 0) && (processed == TRUE)) 
-	{
-		/* Add in physical address */
-		tmp2 = tmp1 | (phy & ARM922T_L2D_SN_BASE_MASK);
-
-		/* Save new section descriptor for virtual address */
-		*pt = tmp2;
-
-		/* Output message shown the map */
-		term_dat_out(phya_msg);
-		str_makehex(hexaddr, phy, 8);
-		term_dat_out(hexaddr);
-		if (cache == 2) 
-		{
-			term_dat_out(unmapped_msg);
-		}
-		else 
-		{
-			term_dat_out(mapped_msg);
-		}
-		str_makehex(hexaddr, vrt, 8);
-		term_dat_out(hexaddr);
-		if (cache == 1) 
-		{
-			term_dat_out(cached_msg);
-		}
-		term_dat_out_crlf((UNS_8 *) "");
-
-		/* Next section and page table entry*/
-		phy += 0x00100000;
-		vrt += 0x00100000;
-		pt++;
-		sections--;
-	}
-
-	return processed;
-}
-
-/***********************************************************************
- *
- * Function: cmd_mmuinfo
- *
- * Purpose: Display MMU information
- *
- * Processing:
- *     See function. 
- *
- * Parameters: None
- *
- * Outputs: None
- *
- * Returns: TRUE if the command was processed, otherwise FALSE
- *
- * Notes: None
- *
- **********************************************************************/
-static BOOL_32 cmd_mmuinfo(void) 
-{
-	mmu_dumpinfo();
-
-	return TRUE;
-}
-
-/***********************************************************************
- *
- * Function: cmd_map
- *
- * Purpose: Map a physical address region to a virtual region
- *
- * Processing:
- *     See function. 
- *
- * Parameters: None
- *
- * Outputs: None
- *
- * Returns: TRUE if the command was processed, otherwise FALSE
- *
- * Notes: None
- *
- **********************************************************************/
-BOOL_32 cmd_map(void) 
-{
-	UNS_32 phy, virt, sects, ce = 0;
-
-	/* Get arguments */
-	virt = cmd_get_field_val(1);
-	phy = cmd_get_field_val(2);
-	sects = cmd_get_field_val(3);
-	ce = cmd_get_field_val(4);
-
-	if (ce <= 2) 
-	{
-		mmu_dumpmap(virt, phy, sects, ce);
-	}
-
-	return TRUE;
-}
-
-/***********************************************************************
- *
- * Function: cmd_inval
- *
- * Purpose: MMU cache flush and invalidate
- *
- * Processing:
- *     See function. 
- *
- * Parameters: None
- *
- * Outputs: None
- *
- * Returns: TRUE if the command was processed, otherwise FALSE
- *
- * Notes: None
- *
- **********************************************************************/
-BOOL_32 cmd_inval(void) 
-{
-	dcache_flush();
-	icache_inval();
-	term_dat_out(caches_msg);
-	term_dat_out(inval_msg);
-
-	return TRUE;
-}
-
-/***********************************************************************
- *
- * Function: cmd_dcache
- *
- * Purpose: MMU data cache enable and disable
- *
- * Processing:
- *     If the value passed in the parser is 1, enable the data cache,
- *     otherwise disable the data cache.
- *
- * Parameters: None
- *
- * Outputs: None
- *
- * Returns: TRUE if the command was processed, otherwise FALSE
- *
- * Notes: None
- *
- **********************************************************************/
-BOOL_32 cmd_dcache(void) 
-{
-	UNS_32 cenable;
-	UNS_8 *ppar;
-
-	/* Get argument */
-	cenable = cmd_get_field_val(1);
-
-	switch (cenable)
-	{
-		case 0:
-			dcache_flush();
-			cp15_set_dcache(0);
-			ppar = disabled_msg;
-			break;
-
-		case 1:
-			cp15_invalidate_cache();
-			cp15_set_dcache(1);
-			ppar = enabled_msg;
-			break;
-
-		case 2:
-		default:
-			dcache_flush();
-			ppar = flushed_msg;
-			break;
-	}
-
-	term_dat_out(dcache_msg);
-	term_dat_out_crlf(ppar);
-
-	return TRUE;
-}
-
-/***********************************************************************
- *
- * Function: cmd_icache
- *
- * Purpose: MMU instruction cache enable and disable
- *
- * Processing:
- *     If the value passed in the parser is 1, enable the instruction
- *     cache, otherwise disable the instruction cache.
- *
- * Parameters: None
- *
- * Outputs: None
- *
- * Returns: TRUE if the command was processed, otherwise FALSE
- *
- * Notes: None
- *
- **********************************************************************/
-BOOL_32 cmd_icache(void)
-{
-	UNS_32 cenable;
-	UNS_8 *ppar;
-
-	/* Get argument */
-	cenable = cmd_get_field_val(1);
-
-	if (cenable == 1) 
-	{
-		dcache_flush();
-		cp15_invalidate_cache();
-		cp15_set_icache(1);
-		ppar = enabled_msg;
-	}
-	else
-	{
-		cp15_set_icache(0);
-		ppar = disabled_msg;
-	}
-
-	term_dat_out(icache_msg);
-	term_dat_out_crlf(ppar);
-
-	return TRUE;
-}
-
-
-/***********************************************************************
- *
- * Function: cmd_mmuenab
- *
- * Purpose: Enable or disable MMU
- *
- * Processing:
- *     See function. 
- *
- * Parameters: None
- *
- * Outputs: None
- *
- * Returns: TRUE if the command was processed, otherwise FALSE
- *
- * Notes: None
- *
- **********************************************************************/
-BOOL_32 cmd_mmuenab(void) 
-{
-	UNS_8 *ppar;
-	UNS_32 cenable;
-
-	term_dat_out_crlf((UNS_8 *) "Warning: Changing MMU status on "
-		" cached and buffered code can cause system crashes.");
-
-	/* Get argument */
-	cenable = cmd_get_field_val(1);
-
-	if (cenable == 1) 
-	{
-		if ((cp15_get_mmu_control_reg() & ARM922T_MMU_CONTROL_C) != 0)
-		{
-			cp15_invalidate_cache();
-		}
-
-		cp15_set_mmu(1);
-		ppar = enabled_msg;
-	}
-	else
-	{
-		cp15_dcache_flush();
-		cp15_write_buffer_flush();
-		cp15_invalidate_cache();
-		cp15_set_mmu(0);
-		ppar = disabled_msg;
-	}
-
-	term_dat_out(mmu_msg);
-	term_dat_out_crlf(ppar);
-
-	return TRUE;
-}
-
-/***********************************************************************
- *
- * Function: mmu_cmd_group_init
- *
- * Purpose: Initialize MMU command group
- *
- * Processing:
- *     See function. 
- *
- * Parameters: None
- *
- * Outputs: None
- *
- * Returns: Nothin
- *
- * Notes: None
- *
- **********************************************************************/
-void mmu_cmd_group_init(void)
-{
-	/* Add MMU group */
-	cmd_add_group(&mmu_group);
-
-	/* Add commands to the MMU group */
-	cmd_add_new_command(&mmu_group, &core_dcache_cmd);
-	cmd_add_new_command(&mmu_group, &core_icache_cmd);
-	cmd_add_new_command(&mmu_group, &core_inval_cmd);
-	cmd_add_new_command(&mmu_group, &core_mmuenab_cmd);
-	cmd_add_new_command(&mmu_group, &core_map_cmd);
-	cmd_add_new_command(&mmu_group, &core_mmuinfo_cmd);
-}
