* Patch by Philippe Robin, 28 Sept 2004:
Fix Flash support for Versatile.
* Patch by Roger Blofeld, 16 Sep 2004:
Fix timeout for DHCP command retry
diff --git a/board/versatile/flash.c b/board/versatile/flash.c
index b120d63..477e702 100644
--- a/board/versatile/flash.c
+++ b/board/versatile/flash.c
@@ -35,8 +35,8 @@
flash_info_t flash_info[CFG_MAX_FLASH_BANKS]; /* info for FLASH chips */
/* Board support for 1 or 2 flash devices */
-#undef FLASH_PORT_WIDTH32
-#define FLASH_PORT_WIDTH16
+#define FLASH_PORT_WIDTH32
+#undef FLASH_PORT_WIDTH16
#ifdef FLASH_PORT_WIDTH16
#define FLASH_PORT_WIDTH ushort
@@ -62,9 +62,8 @@
/* Flash Organizations */
-OrgDef OrgIntel_28F256L18T[] = {
- {4, 32 * 1024}, /* 4 * 32kBytes sectors */
- {255, 128 * 1024}, /* 255 * 128kBytes sectors */
+OrgDef OrgIntel_28F256K3[] = {
+ {256, 128 * 1024}, /* 256 * 128kBytes sectors */
};
@@ -84,6 +83,20 @@
/*-----------------------------------------------------------------------
*/
+static void flash_vpp(int on)
+{
+ unsigned int tmp;
+
+ tmp = *(unsigned int *)(VERSATILE_FLASHCTRL);
+
+ if (on)
+ tmp |= VERSATILE_FLASHPROG_FLVPPEN;
+ else
+ tmp &= ~VERSATILE_FLASHPROG_FLVPPEN;
+
+ *(unsigned int *)(VERSATILE_FLASHCTRL) = tmp;
+}
+
unsigned long flash_init (void)
{
int i;
@@ -91,8 +104,10 @@
for (i = 0; i < CFG_MAX_FLASH_BANKS; i++) {
switch (i) {
case 0:
+ flash_vpp(1);
flash_get_size ((FPW *) PHYS_FLASH_1, &flash_info[i]);
flash_get_offsets (PHYS_FLASH_1, &flash_info[i]);
+ flash_vpp(0);
break;
default:
panic ("configured too many flash banks!\n");
@@ -117,7 +132,7 @@
int i;
OrgDef *pOrgDef;
- pOrgDef = OrgIntel_28F256L18T;
+ pOrgDef = OrgIntel_28F256K3;
if (info->flash_id == FLASH_UNKNOWN) {
return;
}
@@ -160,6 +175,9 @@
case FLASH_28F256L18T:
printf ("FLASH 28F256L18T\n");
break;
+ case FLASH_28F256K3:
+ printf ("FLASH 28F256K3\n");
+ break;
default:
printf ("Unknown Chip Type\n");
break;
@@ -193,7 +211,6 @@
mb ();
value = addr[0];
-
switch (value) {
case (FPW) INTEL_MANUFACT:
@@ -218,6 +235,13 @@
info->size = 0x02000000;
break; /* => 32 MB */
+ case (FPW)(INTEL_ID_28F256K3):
+ info->flash_id += FLASH_28F256K3;
+ info->sector_count = 256;
+ info->size = 0x02000000;
+ printf ("\Intel StrataFlash 28F256K3C device initialized\n");
+ break;
+
default:
info->flash_id = FLASH_UNKNOWN;
break;
@@ -290,6 +314,7 @@
printf ("\n");
}
+ flash_vpp(1);
start = get_timer (0);
last = start;
@@ -335,6 +360,9 @@
printf (" done\n");
}
}
+
+ flash_vpp(0);
+
return rcode;
}
@@ -364,6 +392,8 @@
port_width = 4;
#endif
+ flash_vpp(1);
+
/*
* handle unaligned start bytes
*/
@@ -382,6 +412,7 @@
}
if ((rc = write_data (info, wp, SWAP (data))) != 0) {
+ flash_vpp(0);
return (rc);
}
wp += port_width;
@@ -397,6 +428,7 @@
data = (data << 8) | *src++;
}
if ((rc = write_data (info, wp, SWAP (data))) != 0) {
+ flash_vpp(0);
return (rc);
}
wp += port_width;
@@ -408,6 +440,7 @@
}
if (cnt == 0) {
+ flash_vpp(0);
return (0);
}
@@ -423,7 +456,11 @@
data = (data << 8) | (*(uchar *) cp);
}
- return (write_data (info, wp, SWAP (data)));
+ rc = write_data (info, wp, SWAP (data));
+
+ flash_vpp(0);
+
+ return rc;
}
/*-----------------------------------------------------------------------
@@ -443,6 +480,9 @@
printf ("not erased at %08lx (%x)\n", (ulong) addr, *addr);
return (2);
}
+
+ flash_vpp(1);
+
flash_unprotect_sectors (addr);
/* Disable interrupts which might cause a timeout here */
flag = disable_interrupts ();
@@ -456,10 +496,12 @@
while (((status = *addr) & (FPW) 0x00800080) != (FPW) 0x00800080) {
if (get_timer_masked () > CFG_FLASH_WRITE_TOUT) {
*addr = (FPW) 0x00FF00FF; /* restore read mode */
+ flash_vpp(0);
return (1);
}
}
*addr = (FPW) 0x00FF00FF; /* restore read mode */
+ flash_vpp(0);
return (0);
}