Skip to content

Commit d0e8c47

Browse files
Chen GongDavid Woodhouse
authored andcommitted
[MTD] m25p80.c extended jedec support
- add extended device information support - add s25sl128 device support Signed-off-by: Chen Gong <g.chen@freescale.com> Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
1 parent 75d0ee2 commit d0e8c47

File tree

1 file changed

+47
-39
lines changed

1 file changed

+47
-39
lines changed

drivers/mtd/devices/m25p80.c

Lines changed: 47 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -469,6 +469,7 @@ struct flash_info {
469469
* then a two byte device id.
470470
*/
471471
u32 jedec_id;
472+
u16 ext_id;
472473

473474
/* The size listed here is what works with OPCODE_SE, which isn't
474475
* necessarily called a "sector" by the vendor.
@@ -488,57 +489,59 @@ struct flash_info {
488489
static struct flash_info __devinitdata m25p_data [] = {
489490

490491
/* Atmel -- some are (confusingly) marketed as "DataFlash" */
491-
{ "at25fs010", 0x1f6601, 32 * 1024, 4, SECT_4K, },
492-
{ "at25fs040", 0x1f6604, 64 * 1024, 8, SECT_4K, },
492+
{ "at25fs010", 0x1f6601, 0, 32 * 1024, 4, SECT_4K, },
493+
{ "at25fs040", 0x1f6604, 0, 64 * 1024, 8, SECT_4K, },
493494

494-
{ "at25df041a", 0x1f4401, 64 * 1024, 8, SECT_4K, },
495-
{ "at25df641", 0x1f4800, 64 * 1024, 128, SECT_4K, },
495+
{ "at25df041a", 0x1f4401, 0, 64 * 1024, 8, SECT_4K, },
496+
{ "at25df641", 0x1f4800, 0, 64 * 1024, 128, SECT_4K, },
496497

497-
{ "at26f004", 0x1f0400, 64 * 1024, 8, SECT_4K, },
498-
{ "at26df081a", 0x1f4501, 64 * 1024, 16, SECT_4K, },
499-
{ "at26df161a", 0x1f4601, 64 * 1024, 32, SECT_4K, },
500-
{ "at26df321", 0x1f4701, 64 * 1024, 64, SECT_4K, },
498+
{ "at26f004", 0x1f0400, 0, 64 * 1024, 8, SECT_4K, },
499+
{ "at26df081a", 0x1f4501, 0, 64 * 1024, 16, SECT_4K, },
500+
{ "at26df161a", 0x1f4601, 0, 64 * 1024, 32, SECT_4K, },
501+
{ "at26df321", 0x1f4701, 0, 64 * 1024, 64, SECT_4K, },
501502

502503
/* Spansion -- single (large) sector size only, at least
503504
* for the chips listed here (without boot sectors).
504505
*/
505-
{ "s25sl004a", 0x010212, 64 * 1024, 8, },
506-
{ "s25sl008a", 0x010213, 64 * 1024, 16, },
507-
{ "s25sl016a", 0x010214, 64 * 1024, 32, },
508-
{ "s25sl032a", 0x010215, 64 * 1024, 64, },
509-
{ "s25sl064a", 0x010216, 64 * 1024, 128, },
506+
{ "s25sl004a", 0x010212, 0, 64 * 1024, 8, },
507+
{ "s25sl008a", 0x010213, 0, 64 * 1024, 16, },
508+
{ "s25sl016a", 0x010214, 0, 64 * 1024, 32, },
509+
{ "s25sl032a", 0x010215, 0, 64 * 1024, 64, },
510+
{ "s25sl064a", 0x010216, 0, 64 * 1024, 128, },
511+
{ "s25sl12800", 0x012018, 0x0300, 256 * 1024, 64, },
512+
{ "s25sl12801", 0x012018, 0x0301, 64 * 1024, 256, },
510513

511514
/* SST -- large erase sizes are "overlays", "sectors" are 4K */
512-
{ "sst25vf040b", 0xbf258d, 64 * 1024, 8, SECT_4K, },
513-
{ "sst25vf080b", 0xbf258e, 64 * 1024, 16, SECT_4K, },
514-
{ "sst25vf016b", 0xbf2541, 64 * 1024, 32, SECT_4K, },
515-
{ "sst25vf032b", 0xbf254a, 64 * 1024, 64, SECT_4K, },
515+
{ "sst25vf040b", 0xbf258d, 0, 64 * 1024, 8, SECT_4K, },
516+
{ "sst25vf080b", 0xbf258e, 0, 64 * 1024, 16, SECT_4K, },
517+
{ "sst25vf016b", 0xbf2541, 0, 64 * 1024, 32, SECT_4K, },
518+
{ "sst25vf032b", 0xbf254a, 0, 64 * 1024, 64, SECT_4K, },
516519

517520
/* ST Microelectronics -- newer production may have feature updates */
518-
{ "m25p05", 0x202010, 32 * 1024, 2, },
519-
{ "m25p10", 0x202011, 32 * 1024, 4, },
520-
{ "m25p20", 0x202012, 64 * 1024, 4, },
521-
{ "m25p40", 0x202013, 64 * 1024, 8, },
522-
{ "m25p80", 0, 64 * 1024, 16, },
523-
{ "m25p16", 0x202015, 64 * 1024, 32, },
524-
{ "m25p32", 0x202016, 64 * 1024, 64, },
525-
{ "m25p64", 0x202017, 64 * 1024, 128, },
526-
{ "m25p128", 0x202018, 256 * 1024, 64, },
527-
528-
{ "m45pe80", 0x204014, 64 * 1024, 16, },
529-
{ "m45pe16", 0x204015, 64 * 1024, 32, },
530-
531-
{ "m25pe80", 0x208014, 64 * 1024, 16, },
532-
{ "m25pe16", 0x208015, 64 * 1024, 32, SECT_4K, },
521+
{ "m25p05", 0x202010, 0, 32 * 1024, 2, },
522+
{ "m25p10", 0x202011, 0, 32 * 1024, 4, },
523+
{ "m25p20", 0x202012, 0, 64 * 1024, 4, },
524+
{ "m25p40", 0x202013, 0, 64 * 1024, 8, },
525+
{ "m25p80", 0, 0, 64 * 1024, 16, },
526+
{ "m25p16", 0x202015, 0, 64 * 1024, 32, },
527+
{ "m25p32", 0x202016, 0, 64 * 1024, 64, },
528+
{ "m25p64", 0x202017, 0, 64 * 1024, 128, },
529+
{ "m25p128", 0x202018, 0, 256 * 1024, 64, },
530+
531+
{ "m45pe80", 0x204014, 0, 64 * 1024, 16, },
532+
{ "m45pe16", 0x204015, 0, 64 * 1024, 32, },
533+
534+
{ "m25pe80", 0x208014, 0, 64 * 1024, 16, },
535+
{ "m25pe16", 0x208015, 0, 64 * 1024, 32, SECT_4K, },
533536

534537
/* Winbond -- w25x "blocks" are 64K, "sectors" are 4KiB */
535-
{ "w25x10", 0xef3011, 64 * 1024, 2, SECT_4K, },
536-
{ "w25x20", 0xef3012, 64 * 1024, 4, SECT_4K, },
537-
{ "w25x40", 0xef3013, 64 * 1024, 8, SECT_4K, },
538-
{ "w25x80", 0xef3014, 64 * 1024, 16, SECT_4K, },
539-
{ "w25x16", 0xef3015, 64 * 1024, 32, SECT_4K, },
540-
{ "w25x32", 0xef3016, 64 * 1024, 64, SECT_4K, },
541-
{ "w25x64", 0xef3017, 64 * 1024, 128, SECT_4K, },
538+
{ "w25x10", 0xef3011, 0, 64 * 1024, 2, SECT_4K, },
539+
{ "w25x20", 0xef3012, 0, 64 * 1024, 4, SECT_4K, },
540+
{ "w25x40", 0xef3013, 0, 64 * 1024, 8, SECT_4K, },
541+
{ "w25x80", 0xef3014, 0, 64 * 1024, 16, SECT_4K, },
542+
{ "w25x16", 0xef3015, 0, 64 * 1024, 32, SECT_4K, },
543+
{ "w25x32", 0xef3016, 0, 64 * 1024, 64, SECT_4K, },
544+
{ "w25x64", 0xef3017, 0, 64 * 1024, 128, SECT_4K, },
542545
};
543546

544547
static struct flash_info *__devinit jedec_probe(struct spi_device *spi)
@@ -547,6 +550,7 @@ static struct flash_info *__devinit jedec_probe(struct spi_device *spi)
547550
u8 code = OPCODE_RDID;
548551
u8 id[3];
549552
u32 jedec;
553+
u16 ext_jedec;
550554
struct flash_info *info;
551555

552556
/* JEDEC also defines an optional "extended device information"
@@ -565,10 +569,14 @@ static struct flash_info *__devinit jedec_probe(struct spi_device *spi)
565569
jedec = jedec << 8;
566570
jedec |= id[2];
567571

572+
ext_jedec = id[3] << 8 | id[4];
573+
568574
for (tmp = 0, info = m25p_data;
569575
tmp < ARRAY_SIZE(m25p_data);
570576
tmp++, info++) {
571577
if (info->jedec_id == jedec)
578+
if (ext_jedec != 0 && info->ext_id != ext_jedec)
579+
continue;
572580
return info;
573581
}
574582
dev_err(&spi->dev, "unrecognized JEDEC id %06x\n", jedec);

0 commit comments

Comments
 (0)