@@ -5109,7 +5069,45 @@
.write = spi_chip_write_256,
.read = spi_chip_read, /* Fast read (0x0B) supported */
.voltage = {2700, 3600}, /* 2.35-3.6V for MX25V8005 */
.wp = &wp_generic,
+ },
+
+ {
+ .vendor = "Macronix",
+ .name = "MX25L6495F",
+ .bustype = BUS_SPI,
+ .manufacture_id = MACRONIX_ID,
+ .model_id = MACRONIX_MX25L6495F,
+ .total_size = 8192,
+ .page_size = 256,
+ .feature_bits = FEATURE_WRSR_WREN,
+ .tested = TEST_OK_PREW,
+ .probe = probe_spi_rdid,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = { {4 * 1024, 2048} },
+ .block_erase = spi_block_erase_20,
+ }, {
+ .eraseblocks = { {64 * 1024, 128} },
+ .block_erase = spi_block_erase_d8,
+ }, {
+ .eraseblocks = { {32 * 1024, 256} },
+ .block_erase = spi_block_erase_52,
+ }, {
+ .eraseblocks = { {8 * 1024 * 1024, 1} },
+ .block_erase = spi_block_erase_60,
+ }, {
+ .eraseblocks = { {8 * 1024 * 1024, 1} },
+ .block_erase = spi_block_erase_c7,
+ }
+ },
+ .unlock = spi_disable_blockprotect,
+ .write = spi_chip_write_256,
+ .read = spi_chip_read, /* Fast read (0x0B) supported */
+ .voltage = {2700, 3600}, /* 2.35-3.6V for MX25V8005 */
+ .wp = &wp_w25,
},
{
@@ -389,11 +388,12 @@
#define MACRONIX_MX25L1605 0x2015 /* MX25L1605{,A,D} */
#define MACRONIX_MX25L3205 0x2016 /* MX25L3205{,A} */
#define MACRONIX_MX25L6405 0x2017 /* MX25L6405{,D}, MX25L6406E, MX25L6445E */
+#define MACRONIX_MX25L6495F 0x9517 /* MX25L6495F */
#define MACRONIX_MX25L12805 0x2018 /* MX25L12805 */
#define MACRONIX_MX25L1635D 0x2415
#define MACRONIX_MX25L1635E 0x2515 /* MX25L1635{E} */
#define MACRONIX_MX25U1635E 0x2535
-#define MACRONIX_MX25U3235E 0x2536 /* Same as MX25U6435F */
+#define MACRONIX_MX25U3235E 0x2536 /* Same as MX25U3235F */
#define MACRONIX_MX25U6435E 0x2537 /* Same as MX25U6435F */
#define MACRONIX_MX25L3235D 0x5E16 /* MX25L3225D/MX25L3235D/MX25L3237D */
#define MACRONIX_MX29F001B 0x19
@@ -312,27 +281,27 @@
/* FIXME: Is there an mx25l3205 (without a trailing letter)? */
static struct w25q_range mx25l3205d_ranges[] = {
- { X, 0, 0, {0, 0} }, /* none */
- { X, 0, 0x1, {0x3f0000, 64 * 1024} },
- { X, 0, 0x2, {0x3e0000, 128 * 1024} },
- { X, 0, 0x3, {0x3c0000, 256 * 1024} },
- { X, 0, 0x4, {0x380000, 512 * 1024} },
- { X, 0, 0x5, {0x300000, 1024 * 1024} },
- { X, 0, 0x6, {0x200000, 2048 * 1024} },
- { X, 0, 0x7, {0x000000, 4096 * 1024} },
+ { 0, 0, 0, {0, 0} }, /* none */
+ { 0, 0, 0x1, {0x3f0000, 64 * 1024} },
+ { 0, 0, 0x2, {0x3e0000, 128 * 1024} },
+ { 0, 0, 0x3, {0x3c0000, 256 * 1024} },
+ { 0, 0, 0x4, {0x380000, 512 * 1024} },
+ { 0, 0, 0x5, {0x300000, 1024 * 1024} },
+ { 0, 0, 0x6, {0x200000, 2048 * 1024} },
+ { 0, 0, 0x7, {0x000000, 4096 * 1024} },
- { X, 1, 0x0, {0x000000, 4096 * 1024} },
- { X, 1, 0x1, {0x000000, 2048 * 1024} },
- { X, 1, 0x2, {0x000000, 3072 * 1024} },
- { X, 1, 0x3, {0x000000, 3584 * 1024} },
- { X, 1, 0x4, {0x000000, 3840 * 1024} },
- { X, 1, 0x5, {0x000000, 3968 * 1024} },
- { X, 1, 0x6, {0x000000, 4032 * 1024} },
- { X, 1, 0x7, {0x000000, 4096 * 1024} },
+ { 0, 1, 0x0, {0x000000, 4096 * 1024} },
+ { 0, 1, 0x1, {0x000000, 2048 * 1024} },
+ { 0, 1, 0x2, {0x000000, 3072 * 1024} },
+ { 0, 1, 0x3, {0x000000, 3584 * 1024} },
+ { 0, 1, 0x4, {0x000000, 3840 * 1024} },
+ { 0, 1, 0x5, {0x000000, 3968 * 1024} },
+ { 0, 1, 0x6, {0x000000, 4032 * 1024} },
+ { 0, 1, 0x7, {0x000000, 4096 * 1024} },
};
static struct w25q_range mx25u3235e_ranges[] = {
- { X, 0, 0, {0, 0} }, /* none */
+ { 0, 0, 0, {0, 0} }, /* none */
{ 0, 0, 0x1, {0x3f0000, 64 * 1024} },
{ 0, 0, 0x2, {0x3e0000, 128 * 1024} },
{ 0, 0, 0x3, {0x3c0000, 256 * 1024} },
@@ -351,8 +320,72 @@
{ 0, 1, 0x7, {0x000000, 4096 * 1024} },
};
-static struct w25q_range mx25u6435e_ranges[] = {
+#if 0
+/* FIXME: MX25L6405D has same ID as MX25L6406 */
+static struct w25q_range mx25l6405d_ranges[] = {
{ X, 0, 0, {0, 0} }, /* none */
+ { X, 0, 0x1, {0x7e0000, 2 * 64 * 1024} }, /* blocks 126-127 */
+ { X, 0, 0x2, {0x7c0000, 4 * 64 * 1024} }, /* blocks 124-127 */
+ { X, 0, 0x3, {0x780000, 8 * 64 * 1024} }, /* blocks 120-127 */
+ { X, 0, 0x4, {0x700000, 16 * 64 * 1024} }, /* blocks 112-127 */
+ { X, 0, 0x5, {0x600000, 32 * 64 * 1024} }, /* blocks 96-127 */
+ { X, 0, 0x6, {0x400000, 64 * 64 * 1024} }, /* blocks 64-127 */
+ { X, 0, 0x7, {0x000000, 64 * 128 * 1024} }, /* blocks 0-127 */
+
+ { X, 1, 0x0, {0x000000, 8192 * 1024} },
+ { X, 1, 0x1, {0x000000, 64 * 64 * 1024} }, /* blocks 0-63 */
+ { X, 1, 0x2, {0x000000, 64 * 96 * 1024} }, /* blocks 0-95 */
+ { X, 1, 0x3, {0x000000, 64 * 112 * 1024} }, /* blocks 0-111 */
+ { X, 1, 0x4, {0x000000, 64 * 120 * 1024} }, /* blocks 0-119 */
+ { X, 1, 0x5, {0x000000, 64 * 124 * 1024} }, /* blocks 0-123 */
+ { X, 1, 0x6, {0x000000, 64 * 126 * 1024} }, /* blocks 0-125 */
+ { X, 1, 0x7, {0x000000, 64 * 128 * 1024} }, /* blocks 0-127 */
+};
+#endif
+
+/* FIXME: MX25L6406 has same ID as MX25L6405D */
+static struct w25q_range mx25l6406e_ranges[] = {
+ { 0, 0, 0, {0, 0} }, /* none */
+ { 0, 0, 0x1, {0x7e0000, 64 * 2 * 1024} }, /* blocks 126-127 */
+ { 0, 0, 0x2, {0x7c0000, 64 * 4 * 1024} }, /* blocks 124-127 */
+ { 0, 0, 0x3, {0x7a0000, 64 * 8 * 1024} }, /* blocks 120-127 */
+ { 0, 0, 0x4, {0x700000, 64 * 16 * 1024} }, /* blocks 112-127 */
+ { 0, 0, 0x5, {0x600000, 64 * 32 * 1024} }, /* blocks 96-127 */
+ { 0, 0, 0x6, {0x400000, 64 * 64 * 1024} }, /* blocks 64-127 */
+ { 0, 0, 0x7, {0x000000, 64 * 128 * 1024} }, /* all */
+
+ { 0, 1, 0x0, {0x000000, 64 * 128 * 1024} }, /* all */
+ { 0, 1, 0x1, {0x000000, 64 * 64 * 1024} }, /* blocks 0-63 */
+ { 0, 1, 0x2, {0x000000, 64 * 96 * 1024} }, /* blocks 0-95 */
+ { 0, 1, 0x3, {0x000000, 64 * 112 * 1024} }, /* blocks 0-111 */
+ { 0, 1, 0x4, {0x000000, 64 * 120 * 1024} }, /* blocks 0-119 */
+ { 0, 1, 0x5, {0x000000, 64 * 124 * 1024} }, /* blocks 0-123 */
+ { 0, 1, 0x6, {0x000000, 64 * 126 * 1024} }, /* blocks 0-125 */
+ { 0, 1, 0x7, {0x000000, 64 * 128 * 1024} }, /* all */
+};
+
+static struct w25q_range mx25l6495f_ranges[] = {
+ { 0, 0, 0, {0, 0} }, /* none */
+ { 0, 0, 0x1, {0x7f0000, 1 * 64 * 1024} }, /* blocks 127 */
+ { 0, 0, 0x2, {0x7e0000, 2 * 64 * 1024} }, /* blocks 126-127 */
+ { 0, 0, 0x3, {0x7c0000, 4 * 64 * 1024} }, /* blocks 124-127 */
+ { 0, 0, 0x4, {0x780000, 8 * 64 * 1024} }, /* blocks 120-127 */
+ { 0, 0, 0x5, {0x700000, 16 * 64 * 1024} }, /* blocks 112-127 */
+ { 0, 0, 0x6, {0x600000, 32 * 64 * 1024} }, /* blocks 96-127 */
+ { 0, 0, 0x7, {0x400000, 64 * 64 * 1024} }, /* blocks 64-127 */
+
+ { 0, 1, 0x0, {0x000000, 64 * 128 * 1024} }, /* all */
+ { 0, 1, 0x1, {0x000000, 64 * 128 * 1024} }, /* all */
+ { 0, 1, 0x2, {0x000000, 64 * 128 * 1024} }, /* all */
+ { 0, 1, 0x3, {0x000000, 64 * 128 * 1024} }, /* all */
+ { 0, 1, 0x4, {0x000000, 64 * 128 * 1024} }, /* all */
+ { 0, 1, 0x5, {0x000000, 64 * 128 * 1024} }, /* all */
+ { 0, 1, 0x6, {0x000000, 64 * 128 * 1024} }, /* all */
+ { 0, 1, 0x7, {0x000000, 64 * 128 * 1024} }, /* all */
+};
+
+static struct w25q_range mx25u6435e_ranges[] = {
+ { 0, 0, 0, {0, 0} }, /* none */
{ 0, 0, 0x1, {0x7f0000, 1 * 64 * 1024} }, /* block 127 */
{ 0, 0, 0x2, {0x7e0000, 2 * 64 * 1024} }, /* blocks 126-127 */
{ 0, 0, 0x3, {0x7c0000, 4 * 64 * 1024} }, /* blocks 124-127 */
@@ -728,6 +761,16 @@
*w25q_ranges = mx25u6435e_ranges;
*num_entries = ARRAY_SIZE(mx25u6435e_ranges);
break;
+ case MACRONIX_MX25L6495F:
+ *w25q_ranges = mx25l6495f_ranges;
+ *num_entries = ARRAY_SIZE(mx25l6495f_ranges);
+ break;
+ case MACRONIX_MX25L6405:
+ /* FIXME: MX25L64* chips have mixed capabilities and
+ share IDs */
+ *w25q_ranges = mx25l6406e_ranges;
+ *num_entries = ARRAY_SIZE(mx25l6406e_ranges);
+ break;
default:
msg_cerr("%s():%d: MXIC flash chip mismatch (0x%04x)"
", aborting\n", __func__, __LINE__,