rename CFG_ENV macros to CONFIG_ENV
[platform/kernel/u-boot.git] / board / emk / common / flash.c
index adfa9a0..04c35bc 100644 (file)
@@ -40,9 +40,11 @@ flash_info_t flash_info[CFG_MAX_FLASH_BANKS]; /* info for FLASH chips */
   #define FLASH_CYCLE2 0x02aa
   #define FLASH_ID1            0
   #define FLASH_ID2            1
+  #define FLASH_ID3            0x0e
+  #define FLASH_ID4            0x0F
 #endif
 
-#if defined (CONFIG_TOP5200)
+#if defined (CONFIG_TOP5200) && !defined (CONFIG_LITE5200)
   typedef unsigned char FLASH_PORT_WIDTH;
   typedef volatile unsigned char FLASH_PORT_WIDTHV;
   #define      FLASH_ID_MASK   0xFF
@@ -54,6 +56,24 @@ flash_info_t flash_info[CFG_MAX_FLASH_BANKS]; /* info for FLASH chips */
   #define FLASH_CYCLE2 0x0555
   #define FLASH_ID1            0
   #define FLASH_ID2            2
+  #define FLASH_ID3            0x1c
+  #define FLASH_ID4            0x1E
+#endif
+
+#if defined (CONFIG_TOP5200) && defined (CONFIG_LITE5200)
+  typedef unsigned char FLASH_PORT_WIDTH;
+  typedef volatile unsigned char FLASH_PORT_WIDTHV;
+  #define      FLASH_ID_MASK   0xFF
+
+  #define FPW  FLASH_PORT_WIDTH
+  #define FPWV FLASH_PORT_WIDTHV
+
+  #define FLASH_CYCLE1 0x0555
+  #define FLASH_CYCLE2 0x02aa
+  #define FLASH_ID1            0
+  #define FLASH_ID2            1
+  #define FLASH_ID3            0x0E
+  #define FLASH_ID4            0x0F
 #endif
 
 /*-----------------------------------------------------------------------
@@ -93,12 +113,12 @@ unsigned long flash_init (void)
                      flash_get_info(CFG_MONITOR_BASE));
 #endif
 
-#ifdef CFG_ENV_IS_IN_FLASH
+#ifdef CONFIG_ENV_IS_IN_FLASH
        /* ENV protection ON by default */
        flash_protect(FLAG_PROTECT_SET,
-                     CFG_ENV_ADDR,
-                     CFG_ENV_ADDR+CFG_ENV_SIZE-1,
-                     flash_get_info(CFG_ENV_ADDR));
+                     CONFIG_ENV_ADDR,
+                     CONFIG_ENV_ADDR+CONFIG_ENV_SIZE-1,
+                     flash_get_info(CONFIG_ENV_ADDR));
 #endif
 
 
@@ -145,7 +165,7 @@ void flash_print_info (flash_info_t *info)
        int i;
        uchar *boottype;
        uchar *bootletter;
-       uchar *fmt;
+       char *fmt;
        uchar botbootletter[] = "B";
        uchar topbootletter[] = "T";
        uchar botboottype[] = "bottom boot sector";
@@ -183,6 +203,15 @@ void flash_print_info (flash_info_t *info)
        case FLASH_AM160B:
                fmt = "29LV160%s (16 Mbit, %s)\n";
                break;
+       case FLASH_AMLV640U:
+               fmt = "29LV640M (64 Mbit)\n";
+               break;
+       case FLASH_AMDLV065D:
+               fmt = "29LV065D (64 Mbit)\n";
+               break;
+       case FLASH_AMLV256U:
+               fmt = "29LV256M (256 Mbit)\n";
+               break;
        default:
                fmt = "Unknown Chip Type\n";
                break;
@@ -239,7 +268,6 @@ void flash_print_info (flash_info_t *info)
 ulong flash_get_size (FPWV *addr, flash_info_t *info)
 {
        int             i;
-       ulong   offset;
 
        /* Write auto select command: read Manufacturer ID */
        /* Write auto select command sequence and test FLASH answer */
@@ -278,27 +306,64 @@ ulong flash_get_size (FPWV *addr, flash_info_t *info)
                info->flash_id += FLASH_AM160B;
                info->sector_count = 35;
                info->size = 0x00200000;
-#ifdef CFG_LOWBOOT
-               offset = 0;
-#else
-               offset = 0x00e00000;
-#endif
-               info->start[0] = (ulong)addr + offset;
-               info->start[1] = (ulong)addr + offset + 0x4000;
-               info->start[2] = (ulong)addr + offset + 0x6000;
-               info->start[3] = (ulong)addr + offset + 0x8000;
+               info->start[0] = (ulong)addr;
+               info->start[1] = (ulong)addr + 0x4000;
+               info->start[2] = (ulong)addr + 0x6000;
+               info->start[3] = (ulong)addr + 0x8000;
                for (i = 4; i < info->sector_count; i++)
                {
-                       info->start[i] = (ulong)addr + offset + 0x10000 * (i-3);
+                       info->start[i] = (ulong)addr + 0x10000 * (i-3);
+               }
+               break;
+
+       case (FPW)AMD_ID_LV065D:
+               info->flash_id += FLASH_AMDLV065D;
+               info->sector_count = 128;
+               info->size = 0x00800000;
+               for (i = 0; i < info->sector_count; i++)
+               {
+                       info->start[i] = (ulong)addr + 0x10000 * i;
                }
                break;
 
+       case (FPW)AMD_ID_MIRROR:
+               /* MIRROR BIT FLASH, read more ID bytes */
+               if ((FPW)addr[FLASH_ID3] == (FPW)AMD_ID_LV640U_2 &&
+                       (FPW)addr[FLASH_ID4] == (FPW)AMD_ID_LV640U_3)
+               {
+                       info->flash_id += FLASH_AMLV640U;
+                       info->sector_count = 128;
+                       info->size = 0x00800000;
+                       for (i = 0; i < info->sector_count; i++)
+                       {
+                               info->start[i] = (ulong)addr + 0x10000 * i;
+                       }
+                       break;
+               }
+               if ((FPW)addr[FLASH_ID3] == (FPW)AMD_ID_LV256U_2 &&
+                       (FPW)addr[FLASH_ID4] == (FPW)AMD_ID_LV256U_3)
+               {
+                       /* attention: only the first 16 MB will be used in u-boot */
+                       info->flash_id += FLASH_AMLV256U;
+                       info->sector_count = 256;
+                       info->size = 0x01000000;
+                       for (i = 0; i < info->sector_count; i++)
+                       {
+                               info->start[i] = (ulong)addr + 0x10000 * i;
+                       }
+                       break;
+               }
+
+               /* fall thru to here ! */
        default:
-               printf ("unknown AMD device=%x ", (FPW)addr[FLASH_ID2]);
+               printf ("unknown AMD device=%x %x %x",
+                       (FPW)addr[FLASH_ID2],
+                       (FPW)addr[FLASH_ID3],
+                       (FPW)addr[FLASH_ID4]);
                info->flash_id = FLASH_UNKNOWN;
                info->sector_count = 0;
-               info->size = 0;
-               return (0);                     /* => no or unknown flash */
+               info->size = 0x800000;
+               break;
        }
 
        /* Put FLASH back in read mode */
@@ -329,6 +394,7 @@ int flash_erase (flash_info_t *info, int s_first, int s_last)
 
        switch (info->flash_id & FLASH_TYPEMASK) {
        case FLASH_AM160B:
+       case FLASH_AMLV640U:
                break;
        case FLASH_UNKNOWN:
        default: