summaryrefslogtreecommitdiff
path: root/jedec.c
diff options
context:
space:
mode:
authorhailfinger <hailfinger@2b7e53f0-3cfb-0310-b3e9-8179ed1497e1>2010-10-20 21:13:19 +0000
committerhailfinger <hailfinger@2b7e53f0-3cfb-0310-b3e9-8179ed1497e1>2010-10-20 21:13:19 +0000
commitf37c81a74401feed6ab21763af647248abded21e (patch)
treeff26f6f3a14b86338723f9c9a37bb67e0ec99e34 /jedec.c
parent81ebcd6c51366847c91940d62a0f1ad23b0a7291 (diff)
downloadflashrom-f37c81a74401feed6ab21763af647248abded21e.tar.gz
Add a reset to probe_jedec before we read the Chip's IDs.
Previous probes might have had too short delays for entering ID mode, so the chip may still be in the process of entering the ID mode. Due to that, an additional delay before the reset makes sense. Add FEATURE_RESET_MASK to deal cleanly with those feature bits. Maciej Pijanka tested the patch and it fixes probing for him with some old Atmel chips. Signed-off-by: Sean Nelson <audiohacked@gmail.com> Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net> Acked-by: Anders Juel Jensen <andersjjensen@gmail.com> Tested-by: Maciej Pijanka <maciej.pijanka@gmail.com> Acked-by: Sean Nelson <audiohacked@gmail.com> git-svn-id: https://code.coreboot.org/svn/flashrom/trunk@1216 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
Diffstat (limited to 'jedec.c')
-rw-r--r--jedec.c22
1 files changed, 21 insertions, 1 deletions
diff --git a/jedec.c b/jedec.c
index 4f042f2..199c64d 100644
--- a/jedec.c
+++ b/jedec.c
@@ -142,6 +142,26 @@ static int probe_jedec_common(struct flashchip *flash, unsigned int mask)
return 0;
}
+ /* Earlier probes might have been too fast for the chip to enter ID
+ * mode completely. Allow the chip to finish this before seeing a
+ * reset command.
+ */
+ if (probe_timing_enter)
+ programmer_delay(probe_timing_enter);
+ /* Reset chip to a clean slate */
+ if ((flash->feature_bits & FEATURE_RESET_MASK) == FEATURE_LONG_RESET)
+ {
+ chip_writeb(0xAA, bios + (0x5555 & mask));
+ if (probe_timing_exit)
+ programmer_delay(10);
+ chip_writeb(0x55, bios + (0x2AAA & mask));
+ if (probe_timing_exit)
+ programmer_delay(10);
+ }
+ chip_writeb(0xF0, bios + (0x5555 & mask));
+ if (probe_timing_exit)
+ programmer_delay(probe_timing_exit);
+
/* Issue JEDEC Product ID Entry command */
chip_writeb(0xAA, bios + (0x5555 & mask));
if (probe_timing_enter)
@@ -172,7 +192,7 @@ static int probe_jedec_common(struct flashchip *flash, unsigned int mask)
}
/* Issue JEDEC Product ID Exit command */
- if ((flash->feature_bits & FEATURE_SHORT_RESET) == FEATURE_LONG_RESET)
+ if ((flash->feature_bits & FEATURE_RESET_MASK) == FEATURE_LONG_RESET)
{
chip_writeb(0xAA, bios + (0x5555 & mask));
if (probe_timing_exit)