aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/mtd/chips/jedec_probe.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/drivers/mtd/chips/jedec_probe.c b/drivers/mtd/chips/jedec_probe.c
index b717f1a5d6b2..279fe60b7855 100644
--- a/drivers/mtd/chips/jedec_probe.c
+++ b/drivers/mtd/chips/jedec_probe.c
@@ -37,6 +37,7 @@
37#define MANUFACTURER_ST 0x0020 37#define MANUFACTURER_ST 0x0020
38#define MANUFACTURER_TOSHIBA 0x0098 38#define MANUFACTURER_TOSHIBA 0x0098
39#define MANUFACTURER_WINBOND 0x00da 39#define MANUFACTURER_WINBOND 0x00da
40#define CONTINUATION_CODE 0x007f
40 41
41 42
42/* AMD */ 43/* AMD */
@@ -1760,9 +1761,21 @@ static inline u32 jedec_read_mfr(struct map_info *map, uint32_t base,
1760{ 1761{
1761 map_word result; 1762 map_word result;
1762 unsigned long mask; 1763 unsigned long mask;
1763 u32 ofs = cfi_build_cmd_addr(0, cfi_interleave(cfi), cfi->device_type); 1764 int bank = 0;
1764 mask = (1 << (cfi->device_type * 8)) -1; 1765
1765 result = map_read(map, base + ofs); 1766 /* According to JEDEC "Standard Manufacturer's Identification Code"
1767 * (http://www.jedec.org/download/search/jep106W.pdf)
1768 * several first banks can contain 0x7f instead of actual ID
1769 */
1770 do {
1771 uint32_t ofs = cfi_build_cmd_addr(0 + (bank << 8),
1772 cfi_interleave(cfi),
1773 cfi->device_type);
1774 mask = (1 << (cfi->device_type * 8)) - 1;
1775 result = map_read(map, base + ofs);
1776 bank++;
1777 } while ((result.x[0] & mask) == CONTINUATION_CODE);
1778
1766 return result.x[0] & mask; 1779 return result.x[0] & mask;
1767} 1780}
1768 1781