diff -ur linux-2.4.6.uc0pre0.orig/drivers/block/Config.in linux-2.4.6.uc0pre0.actiontec/drivers/block/Config.in
--- linux-2.4.6.uc0pre0.orig/drivers/block/Config.in	2004-12-06 19:34:58.000000000 +0100
+++ linux-2.4.6.uc0pre0.actiontec/drivers/block/Config.in	2004-12-06 19:36:39.000000000 +0100
@@ -48,4 +48,15 @@
 
 tristate 'ROM disk memory block device (blkmem)' CONFIG_BLK_DEV_BLKMEM $CONFIG_BLK_DEV_BLKMEM
 
+if [ "$CONFIG_BLK_DEV_BLKMEM" = "y" -o "$CONFIG_BLK_DEV_BLKMEM" = "m" ]; then
+   choice 'BLKmem copied to RAM or inplace in ROM' \
+	"RAM CONFIG_BLK_DEV_BLKMEM_RAM \
+	 ROM CONFIG_BLK_DEV_BLKMEM_ROM" RAM	 
+    if [ "$CONFIG_BLK_DEV_BLKMEM_ROM" = "y" ]; then
+	bool '  BLKmem has static address' CONFIG_BLK_DEV_BLKMEM_ROM_STATIC
+	if [ "$CONFIG_BLK_DEV_BLKMEM_ROM_STATIC" = "y" ]; then
+	    hex '  Romdisk ROM offset address' CONFIG_BLK_DEV_BLKMEM_OFFSET 0
+	fi
+    fi
+fi	
 endmenu
diff -ur linux-2.4.6.uc0pre0.orig/drivers/block/blkmem.c linux-2.4.6.uc0pre0.actiontec/drivers/block/blkmem.c
--- linux-2.4.6.uc0pre0.orig/drivers/block/blkmem.c	2004-12-06 19:34:58.000000000 +0100
+++ linux-2.4.6.uc0pre0.actiontec/drivers/block/blkmem.c	2004-12-06 19:41:24.000000000 +0100
@@ -26,6 +26,7 @@
 #include <linux/ledman.h>
 #include <linux/init.h>
 #include <linux/tqueue.h>
+#include <linux/ioport.h>
 #include <asm/semaphore.h>
 #include <asm/uaccess.h>
 #include <asm/io.h>
@@ -40,6 +42,13 @@
 
 #define MAJOR_NR BLKMEM_MAJOR
 
+#ifdef CONFIG_ARCH_CNXT
+	#if !defined (CONFIG_ARCH_CX821XX) && !defined (CONFIG_ARCH_CX861XX)
+		#define	CONFIG_LINEOHW	1
+		#define DEVEL  1 /* everything in SDRAM for now */
+	#endif
+#endif
+
 // #define DEVICE_NAME "blkmem"
 #define DEVICE_REQUEST do_blkmem_request
 #define DEVICE_NR(device) (MINOR(device))
@@ -139,6 +148,19 @@
 #define CAT_ROMARRAY
 #endif
 
+#if defined (CONFIG_ARCH_CX821XX) || defined (CONFIG_ARCH_CX861XX)
+#   if defined (CONFIG_BLK_DEV_BLKMEM_ROM)
+#      if defined (CONFIG_BLK_DEV_BLKMEM_ROM_STATIC)
+#         define FIXED_ROMARRAY (char *)(CONFIG_BLK_DEV_BLKMEM_OFFSET)
+#      else
+#         error	No BLKmem ROM address.
+#      endif
+#   else
+       extern char _romfs[];
+#      define FIXED_ROMARRAY _romfs
+#   endif
+#endif
+
 /*
  *	Lineo hardware has similar FLASH layouts on all devices.
  */
@@ -162,10 +184,15 @@
 extern char __data_rom_start[];
 extern char _edata[];
 extern char __data_start[];
-#ifndef FIXUP_ARENAS
-#define FIXUP_ARENAS \
+# ifndef FIXUP_ARENAS
+#    if defined (CONFIG_BOARD_EVS3C4530HEI) && defined (CONFIG_BLK_DEV_BLKMEM_ROM)	/* FIXME: This is wrong place for it */
+#       define FIXUP_ARENAS \
+	arena[0].address = (unsigned long)__data_rom_start + (unsigned long)_edata - (unsigned long)__data_start + 0x01000000; /* FIXME: hack kernel in ram, romdisk in rom */
+#    else	
+#       define FIXUP_ARENAS \
 	arena[0].address = (unsigned long)__data_rom_start + (unsigned long)_edata - (unsigned long)__data_start;
-#endif
+#    endif	
+# endif
 #endif
 
 #if defined(CONFIG_WATCHDOG)
@@ -274,6 +301,26 @@
 #ifdef FIXED_ROMARRAY
 	{0, FIXED_ROMARRAY, -1},
 #endif
+#ifdef CONFIG_ARCH_CNXT
+	#if !defined (CONFIG_ARCH_CX821XX) && !defined (CONFIG_ARCH_CX861XX)
+	    /*  AM29LV004T flash
+	     *  rom0 -- root file-system 
+	     */
+		#ifdef DEVEL
+			/*
+			 * rom0 currently  in RAM
+			 */
+			{1, 0x8000000, 0x100000,0,0, flash_write, flash_erase, 0x10000, 0x10000, 0xff},
+		#else	
+			{1, 0x400000, 0x10000,0,0, flash_write, flash_erase, 0x10000, 0x10000, 0xff},
+			{1, 0x410000, 0xf0000,0,0, flash_write, flash_erase, 0x10000, 0x10000, 0xff},
+			{1, 0x500000,0x100000,0,0, flash_write, flash_erase, 0x10000,0x10000,0xff},
+			{1, 0x600000,0x200000,0,0, flash_write, flash_erase,0x10000,0x10000,0xff},
+			{1, 0x801000,0xff000,0,0, flash_write,flash_erase,0xff000,0xff000,0xff},
+		#endif
+	#endif
+#endif /* CONFIG_ARCH_CNXT*/
+
 
 #ifdef CONFIG_COLDFIRE
     /*
@@ -2209,7 +2256,7 @@
     schedule();
   }
 
-#ifdef CONFIG_UCLINUX
+#if defined(HARD_RESET_NOW) 
   if (prog->reset)
   	HARD_RESET_NOW();
 #endif
@@ -2498,6 +2545,8 @@
     		? "RW"
     		: "RO"
     );
+
+    request_mem_region (arena[i].address, arena[i].length, "blkmem");
   }
 
   if (register_blkdev(MAJOR_NR, DEVICE_NAME, &blkmem_fops )) {

