diff options
author | Trent Piepho <tpiepho@freescale.com> | 2008-03-30 21:19:29 -0700 |
---|---|---|
committer | David Woodhouse <dwmw2@infradead.org> | 2008-04-22 21:16:09 +0100 |
commit | fecb8865def541ff38f59ef3caf0cbd09f4fc9fd (patch) | |
tree | 0e407d1f17584399b158e2ef4028c9321960726d /drivers/mtd/chips/cfi_probe.c | |
parent | 0ff6631be150702ed4c92b46b77941affee866ba (diff) | |
download | linux-fecb8865def541ff38f59ef3caf0cbd09f4fc9fd.tar.gz linux-fecb8865def541ff38f59ef3caf0cbd09f4fc9fd.tar.bz2 linux-fecb8865def541ff38f59ef3caf0cbd09f4fc9fd.zip |
[MTD] [NOR] Read extended device ID from AMD/Spansion CFI flash chips
AMD/Spansion use a device id of 0x7e to indicate an extended device is
present at offset 0xe and 0xf in the query data.
I've verified with Spansion that all their chips (mfr == 0x01) with an id
of 0x7e use it to indicate an extended id is present. What's more, there
are no chips with a NON-extended id that is the same as a different chip's
extended id. In other words, when the extended ID is present, one can
replace the normal id with the extended id without losing any information.
Which is what I've done.
Signed-off-by: Trent Piepho <tpiepho@freescale.com>
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
Diffstat (limited to 'drivers/mtd/chips/cfi_probe.c')
-rw-r--r-- | drivers/mtd/chips/cfi_probe.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/drivers/mtd/chips/cfi_probe.c b/drivers/mtd/chips/cfi_probe.c index b03d43ef9108..a4463a91ce31 100644 --- a/drivers/mtd/chips/cfi_probe.c +++ b/drivers/mtd/chips/cfi_probe.c @@ -232,6 +232,11 @@ static int __xipram cfi_chip_setup(struct map_info *map, cfi->mfr = cfi_read_query16(map, base); cfi->id = cfi_read_query16(map, base + ofs_factor); + /* Get AMD/Spansion extended JEDEC ID */ + if (cfi->mfr == CFI_MFR_AMD && (cfi->id & 0xff) == 0x7e) + cfi->id = cfi_read_query(map, base + 0xe * ofs_factor) << 8 | + cfi_read_query(map, base + 0xf * ofs_factor); + /* Put it back into Read Mode */ cfi_send_gen_cmd(0xF0, 0, base, map, cfi, cfi->device_type, NULL); /* ... even if it's an Intel chip */ |