Lines Matching full:nor

10 #include <linux/mtd/spi-nor.h>
49 /* Cypress SPI NOR flash operations. */
86 * @nor: pointer to 'struct spi_nor'.
88 static void spansion_nor_clear_sr(struct spi_nor *nor)
90 const struct spansion_nor_params *priv_params = nor->params->priv;
93 if (nor->spimem) {
96 spi_nor_spimem_setup_op(nor, &op, nor->reg_proto);
98 ret = spi_mem_exec_op(nor->spimem, &op);
100 ret = spi_nor_controller_ops_write_reg(nor, SPINOR_OP_CLSR,
105 dev_dbg(nor->dev, "error %d clearing SR\n", ret);
108 static int cypress_nor_sr_ready_and_clear_reg(struct spi_nor *nor, u64 addr)
110 struct spi_nor_flash_parameter *params = nor->params;
113 0, nor->bouncebuf);
116 if (nor->reg_proto == SNOR_PROTO_8_8_8_DTR) {
117 op.addr.nbytes = nor->addr_nbytes;
122 ret = spi_nor_read_any_reg(nor, &op, nor->reg_proto);
126 if (nor->bouncebuf[0] & (SR_E_ERR | SR_P_ERR)) {
127 if (nor->bouncebuf[0] & SR_E_ERR)
128 dev_err(nor->dev, "Erase Error occurred\n");
130 dev_err(nor->dev, "Programming Error occurred\n");
132 spansion_nor_clear_sr(nor);
134 ret = spi_nor_write_disable(nor);
141 return !(nor->bouncebuf[0] & SR_WIP);
147 * @nor: pointer to 'struct spi_nor'.
151 static int cypress_nor_sr_ready_and_clear(struct spi_nor *nor)
153 struct spi_nor_flash_parameter *params = nor->params;
160 ret = cypress_nor_sr_ready_and_clear_reg(nor, addr);
170 static int cypress_nor_set_memlat(struct spi_nor *nor, u64 addr)
173 u8 *buf = nor->bouncebuf;
175 u8 addr_mode_nbytes = nor->params->addr_mode_nbytes;
180 ret = spi_nor_read_any_reg(nor, &op, nor->reg_proto);
191 ret = spi_nor_write_any_volatile_reg(nor, &op, nor->reg_proto);
195 nor->read_dummy = 24;
200 static int cypress_nor_set_octal_dtr_bits(struct spi_nor *nor, u64 addr)
203 u8 *buf = nor->bouncebuf;
208 CYPRESS_NOR_WR_ANY_REG_OP(nor->params->addr_mode_nbytes,
211 return spi_nor_write_any_volatile_reg(nor, &op, nor->reg_proto);
214 static int cypress_nor_octal_dtr_en(struct spi_nor *nor)
216 const struct spi_nor_flash_parameter *params = nor->params;
217 u8 *buf = nor->bouncebuf;
223 ret = cypress_nor_set_memlat(nor, addr);
228 ret = cypress_nor_set_octal_dtr_bits(nor, addr);
234 ret = spi_nor_read_id(nor, nor->addr_nbytes, 3, buf,
237 dev_dbg(nor->dev, "error %d reading JEDEC ID after enabling 8D-8D-8D mode\n", ret);
241 if (memcmp(buf, nor->info->id->bytes, nor->info->id->len))
247 static int cypress_nor_set_single_spi_bits(struct spi_nor *nor, u64 addr)
250 u8 *buf = nor->bouncebuf;
260 CYPRESS_NOR_WR_ANY_REG_OP(nor->addr_nbytes, addr, 2, buf);
261 return spi_nor_write_any_volatile_reg(nor, &op, SNOR_PROTO_8_8_8_DTR);
264 static int cypress_nor_octal_dtr_dis(struct spi_nor *nor)
266 const struct spi_nor_flash_parameter *params = nor->params;
267 u8 *buf = nor->bouncebuf;
273 ret = cypress_nor_set_single_spi_bits(nor, addr);
279 ret = spi_nor_read_id(nor, 0, 0, buf, SNOR_PROTO_1_1_1);
281 dev_dbg(nor->dev, "error %d reading JEDEC ID after disabling 8D-8D-8D mode\n", ret);
285 if (memcmp(buf, nor->info->id->bytes, nor->info->id->len))
291 static int cypress_nor_quad_enable_volatile_reg(struct spi_nor *nor, u64 addr)
294 u8 addr_mode_nbytes = nor->params->addr_mode_nbytes;
300 nor->bouncebuf);
302 ret = spi_nor_read_any_reg(nor, &op, nor->reg_proto);
306 if (nor->bouncebuf[0] & SPINOR_REG_CYPRESS_CFR1_QUAD_EN)
310 nor->bouncebuf[0] |= SPINOR_REG_CYPRESS_CFR1_QUAD_EN;
313 nor->bouncebuf);
314 ret = spi_nor_write_any_volatile_reg(nor, &op, nor->reg_proto);
318 cfr1v_written = nor->bouncebuf[0];
323 nor->bouncebuf);
324 ret = spi_nor_read_any_reg(nor, &op, nor->reg_proto);
328 if (nor->bouncebuf[0] != cfr1v_written) {
329 dev_err(nor->dev, "CFR1: Read back test failed\n");
339 * @nor: pointer to a 'struct spi_nor'
350 static int cypress_nor_quad_enable_volatile(struct spi_nor *nor)
352 struct spi_nor_flash_parameter *params = nor->params;
359 ret = cypress_nor_quad_enable_volatile_reg(nor, addr);
367 static int cypress_nor_set_4byte_addr_mode(struct spi_nor *nor, bool enable)
372 spi_nor_spimem_setup_op(nor, &op, nor->reg_proto);
374 ret = spi_mem_exec_op(nor->spimem, &op);
376 dev_dbg(nor->dev, "error %d setting 4-byte mode\n", ret);
385 * @nor: pointer to a 'struct spi_nor'
394 static int cypress_nor_determine_addr_mode_by_sr1(struct spi_nor *nor,
399 nor->bouncebuf);
403 ret = spi_nor_read_sr(nor, &nor->bouncebuf[1]);
407 ret = spi_nor_read_any_reg(nor, &op, nor->reg_proto);
411 is3byte = (nor->bouncebuf[0] == nor->bouncebuf[1]);
415 nor->bouncebuf);
416 ret = spi_nor_read_any_reg(nor, &op, nor->reg_proto);
420 is4byte = (nor->bouncebuf[0] == nor->bouncebuf[1]);
435 * @nor: pointer to a 'struct spi_nor'
443 static int cypress_nor_set_addr_mode_nbytes(struct spi_nor *nor)
453 ret = spi_nor_write_enable(nor);
456 ret = cypress_nor_determine_addr_mode_by_sr1(nor, &addr_mode);
458 ret = spi_nor_set_4byte_addr_mode(nor, true);
461 return spi_nor_write_disable(nor);
463 ret = spi_nor_write_disable(nor);
473 0, nor->bouncebuf);
474 ret = spi_nor_read_any_reg(nor, &op, nor->reg_proto);
478 if (nor->bouncebuf[0] & SPINOR_REG_CYPRESS_CFR2_ADRBYT) {
480 return spi_nor_set_4byte_addr_mode(nor, true);
483 return spi_nor_set_4byte_addr_mode(nor, true);
486 nor->params->addr_nbytes = addr_mode;
487 nor->params->addr_mode_nbytes = addr_mode;
494 * @nor: pointer to a 'struct spi_nor'
502 static int cypress_nor_get_page_size(struct spi_nor *nor)
505 CYPRESS_NOR_RD_ANY_REG_OP(nor->params->addr_mode_nbytes,
506 0, 0, nor->bouncebuf);
507 struct spi_nor_flash_parameter *params = nor->params;
519 ret = spi_nor_read_any_reg(nor, &op, nor->reg_proto);
523 if (!(nor->bouncebuf[0] & SPINOR_REG_CYPRESS_CFR3_PGSZ))
532 static void cypress_nor_ecc_init(struct spi_nor *nor)
539 nor->params->writesize = 16;
540 nor->flags |= SNOR_F_ECC;
544 s25fs256t_post_bfpt_fixup(struct spi_nor *nor,
552 nor->params->set_4byte_addr_mode = cypress_nor_set_4byte_addr_mode;
554 ret = cypress_nor_set_addr_mode_nbytes(nor);
560 CYPRESS_NOR_RD_ANY_REG_OP(nor->params->addr_mode_nbytes,
562 nor->bouncebuf);
563 ret = spi_nor_read_any_reg(nor, &op, nor->reg_proto);
568 if (nor->bouncebuf[0])
574 static int s25fs256t_post_sfdp_fixup(struct spi_nor *nor)
576 struct spi_nor_flash_parameter *params = nor->params;
583 params->vreg_offset = devm_kmalloc(nor->dev, sizeof(u32), GFP_KERNEL);
596 return cypress_nor_get_page_size(nor);
599 static int s25fs256t_late_init(struct spi_nor *nor)
601 cypress_nor_ecc_init(nor);
613 s25hx_t_post_bfpt_fixup(struct spi_nor *nor,
620 nor->params->set_4byte_addr_mode = cypress_nor_set_4byte_addr_mode;
622 ret = cypress_nor_set_addr_mode_nbytes(nor);
627 nor->params->quad_enable = cypress_nor_quad_enable_volatile;
632 static int s25hx_t_post_sfdp_fixup(struct spi_nor *nor)
634 struct spi_nor_flash_parameter *params = nor->params;
639 dev_err(nor->dev, "%s failed. The volatile register offset could not be retrieved from SFDP.\n",
665 return cypress_nor_get_page_size(nor);
668 static int s25hx_t_late_init(struct spi_nor *nor)
670 struct spi_nor_flash_parameter *params = nor->params;
675 cypress_nor_ecc_init(nor);
689 * @nor: pointer to a 'struct spi_nor'
697 static int cypress_nor_set_octal_dtr(struct spi_nor *nor, bool enable)
699 return enable ? cypress_nor_octal_dtr_en(nor) :
700 cypress_nor_octal_dtr_dis(nor);
703 static int s28hx_t_post_sfdp_fixup(struct spi_nor *nor)
705 struct spi_nor_flash_parameter *params = nor->params;
708 dev_err(nor->dev, "%s failed. The volatile register offset could not be retrieved from SFDP.\n",
742 return cypress_nor_get_page_size(nor);
745 static int s28hx_t_post_bfpt_fixup(struct spi_nor *nor,
750 nor->params->set_4byte_addr_mode = cypress_nor_set_4byte_addr_mode;
752 return cypress_nor_set_addr_mode_nbytes(nor);
755 static int s28hx_t_late_init(struct spi_nor *nor)
757 struct spi_nor_flash_parameter *params = nor->params;
761 cypress_nor_ecc_init(nor);
773 s25fs_s_nor_post_bfpt_fixups(struct spi_nor *nor,
783 nor->params->page_size = 256;
1056 * @nor: pointer to 'struct spi_nor'.
1060 static int spansion_nor_sr_ready_and_clear(struct spi_nor *nor)
1064 ret = spi_nor_read_sr(nor, nor->bouncebuf);
1068 if (nor->bouncebuf[0] & (SR_E_ERR | SR_P_ERR)) {
1069 if (nor->bouncebuf[0] & SR_E_ERR)
1070 dev_err(nor->dev, "Erase Error occurred\n");
1072 dev_err(nor->dev, "Programming Error occurred\n");
1074 spansion_nor_clear_sr(nor);
1082 ret = spi_nor_write_disable(nor);
1089 return !(nor->bouncebuf[0] & SR_WIP);
1092 static int spansion_nor_late_init(struct spi_nor *nor)
1094 struct spi_nor_flash_parameter *params = nor->params;
1096 u8 mfr_flags = nor->info->mfr_flags;
1099 nor->flags |= SNOR_F_4B_OPCODES;
1101 nor->erase_opcode = SPINOR_OP_SE;
1102 nor->mtd.erasesize = nor->info->sector_size ?:
1107 priv_params = devm_kmalloc(nor->dev, sizeof(*priv_params),