FRAM memory access optimization.
diff --git a/common/cmd_eeprom.c b/common/cmd_eeprom.c
index 80b8ccc..2d4c9f6 100644
--- a/common/cmd_eeprom.c
+++ b/common/cmd_eeprom.c
@@ -22,6 +22,21 @@
  *
  */
 
+/*
+ * Support for read and write access to EEPROM like memory devices. This
+ * includes regular EEPROM as well as  FRAM (ferroelectic nonvolaile RAM).
+ * FRAM devices read and write data at bus speed. In particular, there is no
+ * write delay. Also, there is no limit imposed on the numer of bytes that can
+ * be transferred with a single read or write.
+ * 
+ * Use the following configuration options to ensure no unneeded performance
+ * degradation (typical for EEPROM) is incured for FRAM memory:
+ * 
+ * #define CFG_I2C_FRAM
+ * #undef CFG_EEPROM_PAGE_WRITE_DELAY_MS
+ *
+ */
+
 #include <common.h>
 #include <config.h>
 #include <command.h>
@@ -122,7 +137,11 @@
 	 * because the next page may be in a different device.
 	 */
 	while (offset < end) {
-		unsigned alen, len, maxlen;
+		unsigned alen, len;
+#if !defined(CFG_I2C_FRAM)
+		unsigned maxlen;
+#endif
+
 #if CFG_I2C_EEPROM_ADDR_LEN == 1 && !defined(CONFIG_SPI_X)
 		uchar addr[2];
 
@@ -144,12 +163,21 @@
 
 		addr[0] |= dev_addr;		/* insert device address */
 
+		len = end - offset;
+
+		/*
+		 * For a FRAM device there is no limit on the number of the
+		 * bytes that can be ccessed with the single read or write
+		 * operation.
+		 */
+#if !defined(CFG_I2C_FRAM)
 		maxlen = 0x100 - blk_off;
 		if (maxlen > I2C_RXTX_LEN)
 			maxlen = I2C_RXTX_LEN;
-		len    = end - offset;
 		if (len > maxlen)
 			len = maxlen;
+#endif
+
 #ifdef CONFIG_SPI
 		spi_read (addr, alen, buffer, len);
 #else
@@ -159,6 +187,7 @@
 		buffer += len;
 		offset += len;
 	}
+
 	return rcode;
 }
 
@@ -191,7 +220,11 @@
 	 */
 
 	while (offset < end) {
-		unsigned alen, len, maxlen;
+		unsigned alen, len;
+#if !defined(CFG_I2C_FRAM)
+		unsigned maxlen;
+#endif
+
 #if CFG_I2C_EEPROM_ADDR_LEN == 1 && !defined(CONFIG_SPI_X)
 		uchar addr[2];
 
@@ -213,6 +246,15 @@
 
 		addr[0] |= dev_addr;		/* insert device address */
 
+		len = end - offset;
+
+		/*
+		 * For a FRAM device there is no limit on the number of the
+		 * bytes that can be ccessed with the single read or write
+		 * operation.
+		 */
+#if !defined(CFG_I2C_FRAM)
+
 #if defined(CFG_EEPROM_PAGE_WRITE_BITS)
 
 #define	EEPROM_PAGE_SIZE	(1 << CFG_EEPROM_PAGE_WRITE_BITS)
@@ -225,9 +267,10 @@
 		if (maxlen > I2C_RXTX_LEN)
 			maxlen = I2C_RXTX_LEN;
 
-		len = end - offset;
 		if (len > maxlen)
 			len = maxlen;
+#endif
+
 #ifdef CONFIG_SPI
 		spi_write (addr, alen, buffer, len);
 #else
diff --git a/common/cmd_i2c.c b/common/cmd_i2c.c
index 9c02ceb..2e44c7f 100644
--- a/common/cmd_i2c.c
+++ b/common/cmd_i2c.c
@@ -295,7 +295,13 @@
 		 * chip doesn't respond.  This apparently isn't a
 		 * universal feature so we don't take advantage of it.
 		 */
+/*
+ * No write delay with FRAM devices.
+ */
+#if !defined(CFG_I2C_FRAM)
 		udelay(11000);
+#endif
+
 #if 0
 		for(timeout = 0; timeout < 10; timeout++) {
 			udelay(2000);