@@ -469,6 +469,7 @@ struct flash_info {
469
469
* then a two byte device id.
470
470
*/
471
471
u32 jedec_id ;
472
+ u16 ext_id ;
472
473
473
474
/* The size listed here is what works with OPCODE_SE, which isn't
474
475
* necessarily called a "sector" by the vendor.
@@ -488,57 +489,59 @@ struct flash_info {
488
489
static struct flash_info __devinitdata m25p_data [] = {
489
490
490
491
/* 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 , },
493
494
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 , },
496
497
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 , },
501
502
502
503
/* Spansion -- single (large) sector size only, at least
503
504
* for the chips listed here (without boot sectors).
504
505
*/
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 , },
510
513
511
514
/* 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 , },
516
519
517
520
/* 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 , },
533
536
534
537
/* 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 , },
542
545
};
543
546
544
547
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)
547
550
u8 code = OPCODE_RDID ;
548
551
u8 id [3 ];
549
552
u32 jedec ;
553
+ u16 ext_jedec ;
550
554
struct flash_info * info ;
551
555
552
556
/* JEDEC also defines an optional "extended device information"
@@ -565,10 +569,14 @@ static struct flash_info *__devinit jedec_probe(struct spi_device *spi)
565
569
jedec = jedec << 8 ;
566
570
jedec |= id [2 ];
567
571
572
+ ext_jedec = id [3 ] << 8 | id [4 ];
573
+
568
574
for (tmp = 0 , info = m25p_data ;
569
575
tmp < ARRAY_SIZE (m25p_data );
570
576
tmp ++ , info ++ ) {
571
577
if (info -> jedec_id == jedec )
578
+ if (ext_jedec != 0 && info -> ext_id != ext_jedec )
579
+ continue ;
572
580
return info ;
573
581
}
574
582
dev_err (& spi -> dev , "unrecognized JEDEC id %06x\n" , jedec );
0 commit comments