159
165
* Enable/disable 4-byte addressing mode.
161
static inline int set_4byte(struct m25p *flash, int enable)
167
static inline int set_4byte(struct m25p *flash, u32 jedec_id, int enable)
163
u8 code = enable ? OPCODE_EN4B : OPCODE_EX4B;
165
return spi_write_then_read(flash->spi, &code, 1, NULL, 0);
169
switch (JEDEC_MFR(jedec_id)) {
170
case CFI_MFR_MACRONIX:
171
flash->command[0] = enable ? OPCODE_EN4B : OPCODE_EX4B;
172
return spi_write(flash->spi, flash->command, 1);
175
flash->command[0] = OPCODE_BRWR;
176
flash->command[1] = enable << 7;
177
return spi_write(flash->spi, flash->command, 2);
655
668
{ "at26df161a", INFO(0x1f4601, 0, 64 * 1024, 32, SECT_4K) },
656
669
{ "at26df321", INFO(0x1f4700, 0, 64 * 1024, 64, SECT_4K) },
672
{ "en25f32", INFO(0x1c3116, 0, 64 * 1024, 64, SECT_4K) },
659
673
{ "en25p32", INFO(0x1c2016, 0, 64 * 1024, 64, 0) },
660
674
{ "en25p64", INFO(0x1c2017, 0, 64 * 1024, 128, 0) },
668
682
{ "mx25l4005a", INFO(0xc22013, 0, 64 * 1024, 8, SECT_4K) },
669
683
{ "mx25l8005", INFO(0xc22014, 0, 64 * 1024, 16, 0) },
684
{ "mx25l1606e", INFO(0xc22015, 0, 64 * 1024, 32, SECT_4K) },
670
685
{ "mx25l3205d", INFO(0xc22016, 0, 64 * 1024, 64, 0) },
671
686
{ "mx25l6405d", INFO(0xc22017, 0, 64 * 1024, 128, 0) },
672
687
{ "mx25l12805d", INFO(0xc22018, 0, 64 * 1024, 256, 0) },
683
698
{ "s25sl032a", INFO(0x010215, 0, 64 * 1024, 64, 0) },
684
699
{ "s25sl032p", INFO(0x010215, 0x4d00, 64 * 1024, 64, SECT_4K) },
685
700
{ "s25sl064a", INFO(0x010216, 0, 64 * 1024, 128, 0) },
701
{ "s25fl256s0", INFO(0x010219, 0x4d00, 256 * 1024, 128, 0) },
702
{ "s25fl256s1", INFO(0x010219, 0x4d01, 64 * 1024, 512, 0) },
703
{ "s25fl512s", INFO(0x010220, 0x4d00, 256 * 1024, 256, 0) },
704
{ "s70fl01gs", INFO(0x010221, 0x4d00, 256 * 1024, 256, 0) },
686
705
{ "s25sl12800", INFO(0x012018, 0x0300, 256 * 1024, 64, 0) },
687
706
{ "s25sl12801", INFO(0x012018, 0x0301, 64 * 1024, 256, 0) },
688
707
{ "s25fl129p0", INFO(0x012018, 0x4d00, 256 * 1024, 64, 0) },
728
747
{ "m25pe80", INFO(0x208014, 0, 64 * 1024, 16, 0) },
729
748
{ "m25pe16", INFO(0x208015, 0, 64 * 1024, 32, SECT_4K) },
750
{ "m25px32", INFO(0x207116, 0, 64 * 1024, 64, SECT_4K) },
751
{ "m25px32-s0", INFO(0x207316, 0, 64 * 1024, 64, SECT_4K) },
752
{ "m25px32-s1", INFO(0x206316, 0, 64 * 1024, 64, SECT_4K) },
753
{ "m25px64", INFO(0x207117, 0, 64 * 1024, 128, 0) },
731
755
/* Winbond -- w25x "blocks" are 64K, "sectors" are 4KiB */
732
756
{ "w25x10", INFO(0xef3011, 0, 64 * 1024, 2, SECT_4K) },
733
757
{ "w25x20", INFO(0xef3012, 0, 64 * 1024, 4, SECT_4K) },
942
968
/* partitions should match sector boundaries; and it may be good to
943
969
* use readonly partitions for writeprotected sectors (BP2..BP0).
945
if (mtd_has_partitions()) {
946
struct mtd_partition *parts = NULL;
949
if (mtd_has_cmdlinepart()) {
950
static const char *part_probes[]
951
= { "cmdlinepart", NULL, };
953
nr_parts = parse_mtd_partitions(&flash->mtd,
954
part_probes, &parts, 0);
957
if (nr_parts <= 0 && data && data->parts) {
959
nr_parts = data->nr_parts;
971
if (mtd_has_cmdlinepart()) {
972
static const char *part_probes[]
973
= { "cmdlinepart", NULL, };
975
nr_parts = parse_mtd_partitions(&flash->mtd,
976
part_probes, &parts, 0);
979
if (nr_parts <= 0 && data && data->parts) {
981
nr_parts = data->nr_parts;
962
984
#ifdef CONFIG_MTD_OF_PARTS
963
if (nr_parts <= 0 && spi->dev.of_node) {
964
nr_parts = of_mtd_parse_partitions(&spi->dev,
965
spi->dev.of_node, &parts);
985
if (nr_parts <= 0 && spi->dev.of_node) {
986
nr_parts = of_mtd_parse_partitions(&spi->dev,
987
spi->dev.of_node, &parts);
970
for (i = 0; i < nr_parts; i++) {
971
DEBUG(MTD_DEBUG_LEVEL2, "partitions[%d] = "
972
"{.name = %s, .offset = 0x%llx, "
973
".size = 0x%llx (%lldKiB) }\n",
975
(long long)parts[i].offset,
976
(long long)parts[i].size,
977
(long long)(parts[i].size >> 10));
979
flash->partitioned = 1;
980
return add_mtd_partitions(&flash->mtd, parts, nr_parts);
992
for (i = 0; i < nr_parts; i++) {
993
DEBUG(MTD_DEBUG_LEVEL2, "partitions[%d] = "
994
"{.name = %s, .offset = 0x%llx, "
995
".size = 0x%llx (%lldKiB) }\n",
997
(long long)parts[i].offset,
998
(long long)parts[i].size,
999
(long long)(parts[i].size >> 10));
982
} else if (data && data->nr_parts)
983
dev_warn(&spi->dev, "ignoring %d default partitions on %s\n",
984
data->nr_parts, data->name);
1001
flash->partitioned = 1;
986
return add_mtd_device(&flash->mtd) == 1 ? -ENODEV : 0;
1004
return mtd_device_register(&flash->mtd, parts, nr_parts) == 1 ?