1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (C) 2005, Intec Automation Inc.
4 * Copyright (C) 2014, Freescale Semiconductor, Inc.
7 #include <linux/mtd/spi-nor.h>
11 /* flash_info mfr_flag. Used to clear sticky prorietary SR bits. */
12 #define USE_CLSR BIT(0)
14 #define SPINOR_OP_CLSR 0x30 /* Clear status register 1 */
15 #define SPINOR_OP_RD_ANY_REG 0x65 /* Read any register */
16 #define SPINOR_OP_WR_ANY_REG 0x71 /* Write any register */
17 #define SPINOR_REG_CYPRESS_VREG 0x00800000
18 #define SPINOR_REG_CYPRESS_STR1 0x0
19 #define SPINOR_REG_CYPRESS_STR1V \
20 (SPINOR_REG_CYPRESS_VREG + SPINOR_REG_CYPRESS_STR1)
21 #define SPINOR_REG_CYPRESS_CFR1 0x2
22 #define SPINOR_REG_CYPRESS_CFR1V \
23 (SPINOR_REG_CYPRESS_VREG + SPINOR_REG_CYPRESS_CFR1)
24 #define SPINOR_REG_CYPRESS_CFR1_QUAD_EN BIT(1) /* Quad Enable */
25 #define SPINOR_REG_CYPRESS_CFR2 0x3
26 #define SPINOR_REG_CYPRESS_CFR2V \
27 (SPINOR_REG_CYPRESS_VREG + SPINOR_REG_CYPRESS_CFR2)
28 #define SPINOR_REG_CYPRESS_CFR2_MEMLAT_11_24 0xb
29 #define SPINOR_REG_CYPRESS_CFR2_ADRBYT BIT(7)
30 #define SPINOR_REG_CYPRESS_CFR3 0x4
31 #define SPINOR_REG_CYPRESS_CFR3V \
32 (SPINOR_REG_CYPRESS_VREG + SPINOR_REG_CYPRESS_CFR3)
33 #define SPINOR_REG_CYPRESS_CFR3_PGSZ BIT(4) /* Page size. */
34 #define SPINOR_REG_CYPRESS_CFR5 0x6
35 #define SPINOR_REG_CYPRESS_CFR5V \
36 (SPINOR_REG_CYPRESS_VREG + SPINOR_REG_CYPRESS_CFR5)
37 #define SPINOR_REG_CYPRESS_CFR5_BIT6 BIT(6)
38 #define SPINOR_REG_CYPRESS_CFR5_DDR BIT(1)
39 #define SPINOR_REG_CYPRESS_CFR5_OPI BIT(0)
40 #define SPINOR_REG_CYPRESS_CFR5_OCT_DTR_EN \
41 (SPINOR_REG_CYPRESS_CFR5_BIT6 | SPINOR_REG_CYPRESS_CFR5_DDR | \
42 SPINOR_REG_CYPRESS_CFR5_OPI)
43 #define SPINOR_REG_CYPRESS_CFR5_OCT_DTR_DS SPINOR_REG_CYPRESS_CFR5_BIT6
44 #define SPINOR_OP_CYPRESS_RD_FAST 0xee
45 #define SPINOR_REG_CYPRESS_ARCFN 0x00000006
47 /* Cypress SPI NOR flash operations. */
48 #define CYPRESS_NOR_WR_ANY_REG_OP(naddr, addr, ndata, buf) \
49 SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_WR_ANY_REG, 0), \
50 SPI_MEM_OP_ADDR(naddr, addr, 0), \
51 SPI_MEM_OP_NO_DUMMY, \
52 SPI_MEM_OP_DATA_OUT(ndata, buf, 0))
54 #define CYPRESS_NOR_RD_ANY_REG_OP(naddr, addr, ndummy, buf) \
55 SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_RD_ANY_REG, 0), \
56 SPI_MEM_OP_ADDR(naddr, addr, 0), \
57 SPI_MEM_OP_DUMMY(ndummy, 0), \
58 SPI_MEM_OP_DATA_IN(1, buf, 0))
60 #define SPANSION_CLSR_OP \
61 SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_CLSR, 0), \
63 SPI_MEM_OP_NO_DUMMY, \
67 * spansion_nor_clear_sr() - Clear the Status Register.
68 * @nor: pointer to 'struct spi_nor'.
70 static void spansion_nor_clear_sr(struct spi_nor *nor)
75 struct spi_mem_op op = SPANSION_CLSR_OP;
77 spi_nor_spimem_setup_op(nor, &op, nor->reg_proto);
79 ret = spi_mem_exec_op(nor->spimem, &op);
81 ret = spi_nor_controller_ops_write_reg(nor, SPINOR_OP_CLSR,
86 dev_dbg(nor->dev, "error %d clearing SR\n", ret);
89 static int cypress_nor_sr_ready_and_clear_reg(struct spi_nor *nor, u64 addr)
91 struct spi_mem_op op =
92 CYPRESS_NOR_RD_ANY_REG_OP(nor->params->addr_mode_nbytes, addr,
96 ret = spi_nor_read_any_reg(nor, &op, nor->reg_proto);
100 if (nor->bouncebuf[0] & (SR_E_ERR | SR_P_ERR)) {
101 if (nor->bouncebuf[0] & SR_E_ERR)
102 dev_err(nor->dev, "Erase Error occurred\n");
104 dev_err(nor->dev, "Programming Error occurred\n");
106 spansion_nor_clear_sr(nor);
108 ret = spi_nor_write_disable(nor);
115 return !(nor->bouncebuf[0] & SR_WIP);
118 * cypress_nor_sr_ready_and_clear() - Query the Status Register of each die by
119 * using Read Any Register command to see if the whole flash is ready for new
120 * commands and clear it if there are any errors.
121 * @nor: pointer to 'struct spi_nor'.
123 * Return: 1 if ready, 0 if not ready, -errno on errors.
125 static int cypress_nor_sr_ready_and_clear(struct spi_nor *nor)
127 struct spi_nor_flash_parameter *params = nor->params;
132 for (i = 0; i < params->n_dice; i++) {
133 addr = params->vreg_offset[i] + SPINOR_REG_CYPRESS_STR1;
134 ret = cypress_nor_sr_ready_and_clear_reg(nor, addr);
144 static int cypress_nor_octal_dtr_en(struct spi_nor *nor)
146 struct spi_mem_op op;
147 u8 *buf = nor->bouncebuf;
149 u8 addr_mode_nbytes = nor->params->addr_mode_nbytes;
151 /* Use 24 dummy cycles for memory array reads. */
152 *buf = SPINOR_REG_CYPRESS_CFR2_MEMLAT_11_24;
153 op = (struct spi_mem_op)
154 CYPRESS_NOR_WR_ANY_REG_OP(addr_mode_nbytes,
155 SPINOR_REG_CYPRESS_CFR2V, 1, buf);
157 ret = spi_nor_write_any_volatile_reg(nor, &op, nor->reg_proto);
161 nor->read_dummy = 24;
163 /* Set the octal and DTR enable bits. */
164 buf[0] = SPINOR_REG_CYPRESS_CFR5_OCT_DTR_EN;
165 op = (struct spi_mem_op)
166 CYPRESS_NOR_WR_ANY_REG_OP(addr_mode_nbytes,
167 SPINOR_REG_CYPRESS_CFR5V, 1, buf);
169 ret = spi_nor_write_any_volatile_reg(nor, &op, nor->reg_proto);
173 /* Read flash ID to make sure the switch was successful. */
174 ret = spi_nor_read_id(nor, nor->addr_nbytes, 3, buf,
175 SNOR_PROTO_8_8_8_DTR);
177 dev_dbg(nor->dev, "error %d reading JEDEC ID after enabling 8D-8D-8D mode\n", ret);
181 if (memcmp(buf, nor->info->id, nor->info->id_len))
187 static int cypress_nor_octal_dtr_dis(struct spi_nor *nor)
189 struct spi_mem_op op;
190 u8 *buf = nor->bouncebuf;
194 * The register is 1-byte wide, but 1-byte transactions are not allowed
195 * in 8D-8D-8D mode. Since there is no register at the next location,
196 * just initialize the value to 0 and let the transaction go on.
198 buf[0] = SPINOR_REG_CYPRESS_CFR5_OCT_DTR_DS;
200 op = (struct spi_mem_op)
201 CYPRESS_NOR_WR_ANY_REG_OP(nor->addr_nbytes,
202 SPINOR_REG_CYPRESS_CFR5V, 2, buf);
203 ret = spi_nor_write_any_volatile_reg(nor, &op, SNOR_PROTO_8_8_8_DTR);
207 /* Read flash ID to make sure the switch was successful. */
208 ret = spi_nor_read_id(nor, 0, 0, buf, SNOR_PROTO_1_1_1);
210 dev_dbg(nor->dev, "error %d reading JEDEC ID after disabling 8D-8D-8D mode\n", ret);
214 if (memcmp(buf, nor->info->id, nor->info->id_len))
220 static int cypress_nor_quad_enable_volatile_reg(struct spi_nor *nor, u64 addr)
222 struct spi_mem_op op;
223 u8 addr_mode_nbytes = nor->params->addr_mode_nbytes;
227 op = (struct spi_mem_op)
228 CYPRESS_NOR_RD_ANY_REG_OP(addr_mode_nbytes, addr, 0,
231 ret = spi_nor_read_any_reg(nor, &op, nor->reg_proto);
235 if (nor->bouncebuf[0] & SPINOR_REG_CYPRESS_CFR1_QUAD_EN)
238 /* Update the Quad Enable bit. */
239 nor->bouncebuf[0] |= SPINOR_REG_CYPRESS_CFR1_QUAD_EN;
240 op = (struct spi_mem_op)
241 CYPRESS_NOR_WR_ANY_REG_OP(addr_mode_nbytes, addr, 1,
243 ret = spi_nor_write_any_volatile_reg(nor, &op, nor->reg_proto);
247 cfr1v_written = nor->bouncebuf[0];
249 /* Read back and check it. */
250 op = (struct spi_mem_op)
251 CYPRESS_NOR_RD_ANY_REG_OP(addr_mode_nbytes, addr, 0,
253 ret = spi_nor_read_any_reg(nor, &op, nor->reg_proto);
257 if (nor->bouncebuf[0] != cfr1v_written) {
258 dev_err(nor->dev, "CFR1: Read back test failed\n");
266 * cypress_nor_quad_enable_volatile() - enable Quad I/O mode in volatile
268 * @nor: pointer to a 'struct spi_nor'
270 * It is recommended to update volatile registers in the field application due
271 * to a risk of the non-volatile registers corruption by power interrupt. This
272 * function sets Quad Enable bit in CFR1 volatile. If users set the Quad Enable
273 * bit in the CFR1 non-volatile in advance (typically by a Flash programmer
274 * before mounting Flash on PCB), the Quad Enable bit in the CFR1 volatile is
275 * also set during Flash power-up.
277 * Return: 0 on success, -errno otherwise.
279 static int cypress_nor_quad_enable_volatile(struct spi_nor *nor)
281 struct spi_nor_flash_parameter *params = nor->params;
287 return cypress_nor_quad_enable_volatile_reg(nor,
288 SPINOR_REG_CYPRESS_CFR1V);
290 for (i = 0; i < params->n_dice; i++) {
291 addr = params->vreg_offset[i] + SPINOR_REG_CYPRESS_CFR1;
292 ret = cypress_nor_quad_enable_volatile_reg(nor, addr);
301 * cypress_nor_determine_addr_mode_by_sr1() - Determine current address mode
302 * (3 or 4-byte) by querying status
304 * @nor: pointer to a 'struct spi_nor'
305 * @addr_mode: ponter to a buffer where we return the determined
308 * This function tries to determine current address mode by comparing SR1 value
309 * from RDSR1(no address), RDAR(3-byte address), and RDAR(4-byte address).
311 * Return: 0 on success, -errno otherwise.
313 static int cypress_nor_determine_addr_mode_by_sr1(struct spi_nor *nor,
316 struct spi_mem_op op =
317 CYPRESS_NOR_RD_ANY_REG_OP(3, SPINOR_REG_CYPRESS_STR1V, 0,
319 bool is3byte, is4byte;
322 ret = spi_nor_read_sr(nor, &nor->bouncebuf[1]);
326 ret = spi_nor_read_any_reg(nor, &op, nor->reg_proto);
330 is3byte = (nor->bouncebuf[0] == nor->bouncebuf[1]);
332 op = (struct spi_mem_op)
333 CYPRESS_NOR_RD_ANY_REG_OP(4, SPINOR_REG_CYPRESS_STR1V, 0,
335 ret = spi_nor_read_any_reg(nor, &op, nor->reg_proto);
339 is4byte = (nor->bouncebuf[0] == nor->bouncebuf[1]);
341 if (is3byte == is4byte)
352 * cypress_nor_set_addr_mode_nbytes() - Set the number of address bytes mode of
353 * current address mode.
354 * @nor: pointer to a 'struct spi_nor'
356 * Determine current address mode by reading SR1 with different methods, then
357 * query CFR2V[7] to confirm. If determination is failed, force enter to 4-byte
360 * Return: 0 on success, -errno otherwise.
362 static int cypress_nor_set_addr_mode_nbytes(struct spi_nor *nor)
364 struct spi_mem_op op;
369 * Read SR1 by RDSR1 and RDAR(3- AND 4-byte addr). Use write enable
370 * that sets bit-1 in SR1.
372 ret = spi_nor_write_enable(nor);
375 ret = cypress_nor_determine_addr_mode_by_sr1(nor, &addr_mode);
377 ret = spi_nor_set_4byte_addr_mode(nor, true);
380 return spi_nor_write_disable(nor);
382 ret = spi_nor_write_disable(nor);
387 * Query CFR2V and make sure no contradiction between determined address
390 op = (struct spi_mem_op)
391 CYPRESS_NOR_RD_ANY_REG_OP(addr_mode, SPINOR_REG_CYPRESS_CFR2V,
393 ret = spi_nor_read_any_reg(nor, &op, nor->reg_proto);
397 if (nor->bouncebuf[0] & SPINOR_REG_CYPRESS_CFR2_ADRBYT) {
399 return spi_nor_set_4byte_addr_mode(nor, true);
402 return spi_nor_set_4byte_addr_mode(nor, true);
405 nor->params->addr_nbytes = addr_mode;
406 nor->params->addr_mode_nbytes = addr_mode;
411 static int cypress_nor_get_page_size_single_chip(struct spi_nor *nor)
413 struct spi_mem_op op =
414 CYPRESS_NOR_RD_ANY_REG_OP(nor->params->addr_mode_nbytes,
415 SPINOR_REG_CYPRESS_CFR3V, 0,
419 ret = spi_nor_read_any_reg(nor, &op, nor->reg_proto);
423 if (nor->bouncebuf[0] & SPINOR_REG_CYPRESS_CFR3_PGSZ)
424 nor->params->page_size = 512;
426 nor->params->page_size = 256;
432 static int cypress_nor_get_page_size_mcp(struct spi_nor *nor)
434 struct spi_mem_op op =
435 CYPRESS_NOR_RD_ANY_REG_OP(nor->params->addr_mode_nbytes,
436 0, 0, nor->bouncebuf);
437 struct spi_nor_flash_parameter *params = nor->params;
442 * Use the minimum common page size configuration. Programming 256-byte
443 * under 512-byte page size configuration is safe.
445 params->page_size = 256;
446 for (i = 0; i < params->n_dice; i++) {
447 op.addr.val = params->vreg_offset[i] + SPINOR_REG_CYPRESS_CFR3;
449 ret = spi_nor_read_any_reg(nor, &op, nor->reg_proto);
453 if (!(nor->bouncebuf[0] & SPINOR_REG_CYPRESS_CFR3_PGSZ))
457 params->page_size = 512;
463 * cypress_nor_get_page_size() - Get flash page size configuration.
464 * @nor: pointer to a 'struct spi_nor'
466 * The BFPT table advertises a 512B or 256B page size depending on part but the
467 * page size is actually configurable (with the default being 256B). Read from
468 * CFR3V[4] and set the correct size.
470 * Return: 0 on success, -errno otherwise.
472 static int cypress_nor_get_page_size(struct spi_nor *nor)
474 if (nor->params->n_dice)
475 return cypress_nor_get_page_size_mcp(nor);
476 return cypress_nor_get_page_size_single_chip(nor);
479 static void cypress_nor_ecc_init(struct spi_nor *nor)
482 * Programming is supported only in 16-byte ECC data unit granularity.
483 * Byte-programming, bit-walking, or multiple program operations to the
484 * same ECC data unit without an erase are not allowed.
486 nor->params->writesize = 16;
487 nor->flags |= SNOR_F_ECC;
491 s25fs256t_post_bfpt_fixup(struct spi_nor *nor,
492 const struct sfdp_parameter_header *bfpt_header,
493 const struct sfdp_bfpt *bfpt)
495 struct spi_mem_op op;
498 ret = cypress_nor_set_addr_mode_nbytes(nor);
502 /* Read Architecture Configuration Register (ARCFN) */
503 op = (struct spi_mem_op)
504 CYPRESS_NOR_RD_ANY_REG_OP(nor->params->addr_mode_nbytes,
505 SPINOR_REG_CYPRESS_ARCFN, 1,
507 ret = spi_nor_read_any_reg(nor, &op, nor->reg_proto);
511 /* ARCFN value must be 0 if uniform sector is selected */
512 if (nor->bouncebuf[0])
515 return cypress_nor_get_page_size(nor);
518 static int s25fs256t_post_sfdp_fixup(struct spi_nor *nor)
520 struct spi_nor_flash_parameter *params = nor->params;
522 /* PP_1_1_4_4B is supported but missing in 4BAIT. */
523 params->hwcaps.mask |= SNOR_HWCAPS_PP_1_1_4;
524 spi_nor_set_pp_settings(¶ms->page_programs[SNOR_CMD_PP_1_1_4],
525 SPINOR_OP_PP_1_1_4_4B,
531 static void s25fs256t_late_init(struct spi_nor *nor)
533 cypress_nor_ecc_init(nor);
536 static struct spi_nor_fixups s25fs256t_fixups = {
537 .post_bfpt = s25fs256t_post_bfpt_fixup,
538 .post_sfdp = s25fs256t_post_sfdp_fixup,
539 .late_init = s25fs256t_late_init,
543 s25hx_t_post_bfpt_fixup(struct spi_nor *nor,
544 const struct sfdp_parameter_header *bfpt_header,
545 const struct sfdp_bfpt *bfpt)
549 ret = cypress_nor_set_addr_mode_nbytes(nor);
553 /* Replace Quad Enable with volatile version */
554 nor->params->quad_enable = cypress_nor_quad_enable_volatile;
559 static int s25hx_t_post_sfdp_fixup(struct spi_nor *nor)
561 struct spi_nor_erase_type *erase_type =
562 nor->params->erase_map.erase_type;
566 * In some parts, 3byte erase opcodes are advertised by 4BAIT.
567 * Convert them to 4byte erase opcodes.
569 for (i = 0; i < SNOR_ERASE_TYPE_MAX; i++) {
570 switch (erase_type[i].opcode) {
572 erase_type[i].opcode = SPINOR_OP_SE_4B;
574 case SPINOR_OP_BE_4K:
575 erase_type[i].opcode = SPINOR_OP_BE_4K_4B;
582 /* The 2 Gb parts duplicate info and advertise 4 dice instead of 2. */
583 if (nor->params->size == SZ_256M)
584 nor->params->n_dice = 2;
586 return cypress_nor_get_page_size(nor);
589 static void s25hx_t_late_init(struct spi_nor *nor)
591 struct spi_nor_flash_parameter *params = nor->params;
593 /* Fast Read 4B requires mode cycles */
594 params->reads[SNOR_CMD_READ_FAST].num_mode_clocks = 8;
596 cypress_nor_ecc_init(nor);
598 /* Replace ready() with multi die version */
600 params->ready = cypress_nor_sr_ready_and_clear;
603 static struct spi_nor_fixups s25hx_t_fixups = {
604 .post_bfpt = s25hx_t_post_bfpt_fixup,
605 .post_sfdp = s25hx_t_post_sfdp_fixup,
606 .late_init = s25hx_t_late_init,
610 * cypress_nor_octal_dtr_enable() - Enable octal DTR on Cypress flashes.
611 * @nor: pointer to a 'struct spi_nor'
612 * @enable: whether to enable or disable Octal DTR
614 * This also sets the memory access latency cycles to 24 to allow the flash to
615 * run at up to 200MHz.
617 * Return: 0 on success, -errno otherwise.
619 static int cypress_nor_octal_dtr_enable(struct spi_nor *nor, bool enable)
621 return enable ? cypress_nor_octal_dtr_en(nor) :
622 cypress_nor_octal_dtr_dis(nor);
625 static int s28hx_t_post_sfdp_fixup(struct spi_nor *nor)
628 * On older versions of the flash the xSPI Profile 1.0 table has the
629 * 8D-8D-8D Fast Read opcode as 0x00. But it actually should be 0xEE.
631 if (nor->params->reads[SNOR_CMD_READ_8_8_8_DTR].opcode == 0)
632 nor->params->reads[SNOR_CMD_READ_8_8_8_DTR].opcode =
633 SPINOR_OP_CYPRESS_RD_FAST;
635 /* This flash is also missing the 4-byte Page Program opcode bit. */
636 spi_nor_set_pp_settings(&nor->params->page_programs[SNOR_CMD_PP],
637 SPINOR_OP_PP_4B, SNOR_PROTO_1_1_1);
639 * Since xSPI Page Program opcode is backward compatible with
640 * Legacy SPI, use Legacy SPI opcode there as well.
642 spi_nor_set_pp_settings(&nor->params->page_programs[SNOR_CMD_PP_8_8_8_DTR],
643 SPINOR_OP_PP_4B, SNOR_PROTO_8_8_8_DTR);
646 * The xSPI Profile 1.0 table advertises the number of additional
647 * address bytes needed for Read Status Register command as 0 but the
648 * actual value for that is 4.
650 nor->params->rdsr_addr_nbytes = 4;
652 return cypress_nor_get_page_size(nor);
655 static int s28hx_t_post_bfpt_fixup(struct spi_nor *nor,
656 const struct sfdp_parameter_header *bfpt_header,
657 const struct sfdp_bfpt *bfpt)
661 ret = cypress_nor_set_addr_mode_nbytes(nor);
668 static void s28hx_t_late_init(struct spi_nor *nor)
670 nor->params->octal_dtr_enable = cypress_nor_octal_dtr_enable;
671 cypress_nor_ecc_init(nor);
674 static const struct spi_nor_fixups s28hx_t_fixups = {
675 .post_sfdp = s28hx_t_post_sfdp_fixup,
676 .post_bfpt = s28hx_t_post_bfpt_fixup,
677 .late_init = s28hx_t_late_init,
681 s25fs_s_nor_post_bfpt_fixups(struct spi_nor *nor,
682 const struct sfdp_parameter_header *bfpt_header,
683 const struct sfdp_bfpt *bfpt)
686 * The S25FS-S chip family reports 512-byte pages in BFPT but
687 * in reality the write buffer still wraps at the safe default
688 * of 256 bytes. Overwrite the page size advertised by BFPT
689 * to get the writes working.
691 nor->params->page_size = 256;
696 static const struct spi_nor_fixups s25fs_s_nor_fixups = {
697 .post_bfpt = s25fs_s_nor_post_bfpt_fixups,
700 static const struct flash_info spansion_nor_parts[] = {
701 /* Spansion/Cypress -- single (large) sector size only, at least
702 * for the chips listed here (without boot sectors).
704 { "s25sl032p", INFO(0x010215, 0x4d00, 64 * 1024, 64)
705 NO_SFDP_FLAGS(SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
706 { "s25sl064p", INFO(0x010216, 0x4d00, 64 * 1024, 128)
707 NO_SFDP_FLAGS(SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
708 { "s25fl128s0", INFO6(0x012018, 0x4d0080, 256 * 1024, 64)
709 NO_SFDP_FLAGS(SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ)
712 { "s25fl128s1", INFO6(0x012018, 0x4d0180, 64 * 1024, 256)
713 NO_SFDP_FLAGS(SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ)
716 { "s25fl256s0", INFO6(0x010219, 0x4d0080, 256 * 1024, 128)
717 NO_SFDP_FLAGS(SPI_NOR_SKIP_SFDP | SPI_NOR_DUAL_READ |
721 { "s25fl256s1", INFO6(0x010219, 0x4d0180, 64 * 1024, 512)
722 NO_SFDP_FLAGS(SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ)
725 { "s25fl512s", INFO6(0x010220, 0x4d0080, 256 * 1024, 256)
726 FLAGS(SPI_NOR_HAS_LOCK)
727 NO_SFDP_FLAGS(SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ)
730 { "s25fs128s1", INFO6(0x012018, 0x4d0181, 64 * 1024, 256)
731 NO_SFDP_FLAGS(SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ)
733 .fixups = &s25fs_s_nor_fixups, },
734 { "s25fs256s0", INFO6(0x010219, 0x4d0081, 256 * 1024, 128)
735 NO_SFDP_FLAGS(SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ)
738 { "s25fs256s1", INFO6(0x010219, 0x4d0181, 64 * 1024, 512)
739 NO_SFDP_FLAGS(SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ)
742 { "s25fs512s", INFO6(0x010220, 0x4d0081, 256 * 1024, 256)
743 NO_SFDP_FLAGS(SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ)
745 .fixups = &s25fs_s_nor_fixups, },
746 { "s25sl12800", INFO(0x012018, 0x0300, 256 * 1024, 64) },
747 { "s25sl12801", INFO(0x012018, 0x0301, 64 * 1024, 256) },
748 { "s25fl129p0", INFO(0x012018, 0x4d00, 256 * 1024, 64)
749 NO_SFDP_FLAGS(SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ)
752 { "s25fl129p1", INFO(0x012018, 0x4d01, 64 * 1024, 256)
753 NO_SFDP_FLAGS(SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ)
756 { "s25sl004a", INFO(0x010212, 0, 64 * 1024, 8) },
757 { "s25sl008a", INFO(0x010213, 0, 64 * 1024, 16) },
758 { "s25sl016a", INFO(0x010214, 0, 64 * 1024, 32) },
759 { "s25sl032a", INFO(0x010215, 0, 64 * 1024, 64) },
760 { "s25sl064a", INFO(0x010216, 0, 64 * 1024, 128) },
761 { "s25fl004k", INFO(0xef4013, 0, 64 * 1024, 8)
762 NO_SFDP_FLAGS(SECT_4K | SPI_NOR_DUAL_READ |
763 SPI_NOR_QUAD_READ) },
764 { "s25fl008k", INFO(0xef4014, 0, 64 * 1024, 16)
765 NO_SFDP_FLAGS(SECT_4K | SPI_NOR_DUAL_READ |
766 SPI_NOR_QUAD_READ) },
767 { "s25fl016k", INFO(0xef4015, 0, 64 * 1024, 32)
768 NO_SFDP_FLAGS(SECT_4K | SPI_NOR_DUAL_READ |
769 SPI_NOR_QUAD_READ) },
770 { "s25fl064k", INFO(0xef4017, 0, 64 * 1024, 128)
771 NO_SFDP_FLAGS(SECT_4K | SPI_NOR_DUAL_READ |
772 SPI_NOR_QUAD_READ) },
773 { "s25fl116k", INFO(0x014015, 0, 64 * 1024, 32)
774 NO_SFDP_FLAGS(SECT_4K | SPI_NOR_DUAL_READ |
775 SPI_NOR_QUAD_READ) },
776 { "s25fl132k", INFO(0x014016, 0, 64 * 1024, 64)
777 NO_SFDP_FLAGS(SECT_4K) },
778 { "s25fl164k", INFO(0x014017, 0, 64 * 1024, 128)
779 NO_SFDP_FLAGS(SECT_4K) },
780 { "s25fl204k", INFO(0x014013, 0, 64 * 1024, 8)
781 NO_SFDP_FLAGS(SECT_4K | SPI_NOR_DUAL_READ) },
782 { "s25fl208k", INFO(0x014014, 0, 64 * 1024, 16)
783 NO_SFDP_FLAGS(SECT_4K | SPI_NOR_DUAL_READ) },
784 { "s25fl064l", INFO(0x016017, 0, 64 * 1024, 128)
785 NO_SFDP_FLAGS(SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ)
786 FIXUP_FLAGS(SPI_NOR_4B_OPCODES) },
787 { "s25fl128l", INFO(0x016018, 0, 64 * 1024, 256)
788 NO_SFDP_FLAGS(SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ)
789 FIXUP_FLAGS(SPI_NOR_4B_OPCODES) },
790 { "s25fl256l", INFO(0x016019, 0, 64 * 1024, 512)
791 NO_SFDP_FLAGS(SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ)
792 FIXUP_FLAGS(SPI_NOR_4B_OPCODES) },
793 { "s25fs256t", INFO6(0x342b19, 0x0f0890, 0, 0)
795 .fixups = &s25fs256t_fixups },
796 { "s25hl512t", INFO6(0x342a1a, 0x0f0390, 256 * 1024, 256)
799 .fixups = &s25hx_t_fixups },
800 { "s25hl01gt", INFO6(0x342a1b, 0x0f0390, 256 * 1024, 512)
803 .fixups = &s25hx_t_fixups },
804 { "s25hl02gt", INFO6(0x342a1c, 0x0f0090, 0, 0)
807 .fixups = &s25hx_t_fixups },
808 { "s25hs512t", INFO6(0x342b1a, 0x0f0390, 256 * 1024, 256)
811 .fixups = &s25hx_t_fixups },
812 { "s25hs01gt", INFO6(0x342b1b, 0x0f0390, 256 * 1024, 512)
815 .fixups = &s25hx_t_fixups },
816 { "s25hs02gt", INFO6(0x342b1c, 0x0f0090, 0, 0)
819 .fixups = &s25hx_t_fixups },
820 { "cy15x104q", INFO6(0x042cc2, 0x7f7f7f, 512 * 1024, 1)
821 FLAGS(SPI_NOR_NO_ERASE) },
822 { "s28hl512t", INFO(0x345a1a, 0, 256 * 1024, 256)
824 .fixups = &s28hx_t_fixups,
826 { "s28hl01gt", INFO(0x345a1b, 0, 256 * 1024, 512)
828 .fixups = &s28hx_t_fixups,
830 { "s28hs512t", INFO(0x345b1a, 0, 256 * 1024, 256)
832 .fixups = &s28hx_t_fixups,
834 { "s28hs01gt", INFO(0x345b1b, 0, 256 * 1024, 512)
836 .fixups = &s28hx_t_fixups,
841 * spansion_nor_sr_ready_and_clear() - Query the Status Register to see if the
842 * flash is ready for new commands and clear it if there are any errors.
843 * @nor: pointer to 'struct spi_nor'.
845 * Return: 1 if ready, 0 if not ready, -errno on errors.
847 static int spansion_nor_sr_ready_and_clear(struct spi_nor *nor)
851 ret = spi_nor_read_sr(nor, nor->bouncebuf);
855 if (nor->bouncebuf[0] & (SR_E_ERR | SR_P_ERR)) {
856 if (nor->bouncebuf[0] & SR_E_ERR)
857 dev_err(nor->dev, "Erase Error occurred\n");
859 dev_err(nor->dev, "Programming Error occurred\n");
861 spansion_nor_clear_sr(nor);
864 * WEL bit remains set to one when an erase or page program
865 * error occurs. Issue a Write Disable command to protect
866 * against inadvertent writes that can possibly corrupt the
867 * contents of the memory.
869 ret = spi_nor_write_disable(nor);
876 return !(nor->bouncebuf[0] & SR_WIP);
879 static void spansion_nor_late_init(struct spi_nor *nor)
881 if (nor->params->size > SZ_16M) {
882 nor->flags |= SNOR_F_4B_OPCODES;
883 /* No small sector erase for 4-byte command set */
884 nor->erase_opcode = SPINOR_OP_SE;
885 nor->mtd.erasesize = nor->info->sector_size;
888 if (nor->info->mfr_flags & USE_CLSR)
889 nor->params->ready = spansion_nor_sr_ready_and_clear;
892 static const struct spi_nor_fixups spansion_nor_fixups = {
893 .late_init = spansion_nor_late_init,
896 const struct spi_nor_manufacturer spi_nor_spansion = {
898 .parts = spansion_nor_parts,
899 .nparts = ARRAY_SIZE(spansion_nor_parts),
900 .fixups = &spansion_nor_fixups,