|
@@ -39,7 +39,10 @@ flash_info_t flash_info[CFG_MAX_FLASH_BANKS];
|
|
|
#define CMD_PROGRAM 0x00A000A0
|
|
|
#define CMD_UNLOCK_BYPASS 0x00200020
|
|
|
#define CMD_READ_MANF_ID 0x00900090
|
|
|
+#define CMD_UNLOCK_BYPASS_RES1 0x00900090
|
|
|
+#define CMD_UNLOCK_BYPASS_RES2 0x00000000
|
|
|
|
|
|
+#define MEM_FLASH_ADDR (*(volatile u32 *)CFG_FLASH_BASE)
|
|
|
#define MEM_FLASH_ADDR1 (*(volatile u32 *)(CFG_FLASH_BASE + (0x00000555 << 2)))
|
|
|
#define MEM_FLASH_ADDR2 (*(volatile u32 *)(CFG_FLASH_BASE + (0x000002AA << 2)))
|
|
|
|
|
@@ -331,9 +334,6 @@ volatile static int write_word (flash_info_t * info, ulong dest,
|
|
|
#endif
|
|
|
iflag = disable_interrupts ();
|
|
|
|
|
|
- MEM_FLASH_ADDR1 = CMD_UNLOCK1;
|
|
|
- MEM_FLASH_ADDR2 = CMD_UNLOCK2;
|
|
|
- MEM_FLASH_ADDR1 = CMD_UNLOCK_BYPASS;
|
|
|
*addr = CMD_PROGRAM;
|
|
|
*addr = data;
|
|
|
|
|
@@ -402,6 +402,10 @@ int write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt)
|
|
|
int l;
|
|
|
int i, rc;
|
|
|
|
|
|
+ MEM_FLASH_ADDR1 = CMD_UNLOCK1;
|
|
|
+ MEM_FLASH_ADDR2 = CMD_UNLOCK2;
|
|
|
+ MEM_FLASH_ADDR1 = CMD_UNLOCK_BYPASS;
|
|
|
+
|
|
|
wp = (addr & ~3); /* get lower word aligned address */
|
|
|
|
|
|
/*
|
|
@@ -422,7 +426,7 @@ int write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt)
|
|
|
}
|
|
|
|
|
|
if ((rc = write_word (info, wp, data)) != 0) {
|
|
|
- return (rc);
|
|
|
+ goto Done;
|
|
|
}
|
|
|
wp += 4;
|
|
|
}
|
|
@@ -441,7 +445,7 @@ int write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt)
|
|
|
}
|
|
|
|
|
|
if ((rc = write_word (info, wp, data)) != 0) {
|
|
|
- return (rc);
|
|
|
+ goto Done;
|
|
|
}
|
|
|
src += 4;
|
|
|
wp += 4;
|
|
@@ -449,7 +453,8 @@ int write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt)
|
|
|
}
|
|
|
|
|
|
if (cnt == 0) {
|
|
|
- return ERR_OK;
|
|
|
+ rc = ERR_OK;
|
|
|
+ goto Done;
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -464,7 +469,14 @@ int write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt)
|
|
|
data = (data >> 8) | (*(uchar *) cp << 24);
|
|
|
}
|
|
|
|
|
|
- return write_word (info, wp, data);
|
|
|
+ rc = write_word (info, wp, data);
|
|
|
+
|
|
|
+ Done:
|
|
|
+
|
|
|
+ MEM_FLASH_ADDR = CMD_UNLOCK_BYPASS_RES1;
|
|
|
+ MEM_FLASH_ADDR = CMD_UNLOCK_BYPASS_RES2;
|
|
|
+
|
|
|
+ return (rc);
|
|
|
}
|
|
|
|
|
|
/*-----------------------------------------------------------------------
|