Lines Matching defs:nor

10 #include <linux/mtd/spi-nor.h>
78 * @nor: pointer to 'struct spi_nor'.
80 static void spansion_nor_clear_sr(struct spi_nor *nor)
82 const struct spansion_nor_params *priv_params = nor->params->priv;
85 if (nor->spimem) {
88 spi_nor_spimem_setup_op(nor, &op, nor->reg_proto);
90 ret = spi_mem_exec_op(nor->spimem, &op);
92 ret = spi_nor_controller_ops_write_reg(nor, SPINOR_OP_CLSR,
97 dev_dbg(nor->dev, "error %d clearing SR\n", ret);
100 static int cypress_nor_sr_ready_and_clear_reg(struct spi_nor *nor, u64 addr)
102 struct spi_nor_flash_parameter *params = nor->params;
105 0, nor->bouncebuf);
108 if (nor->reg_proto == SNOR_PROTO_8_8_8_DTR) {
113 ret = spi_nor_read_any_reg(nor, &op, nor->reg_proto);
117 if (nor->bouncebuf[0] & (SR_E_ERR | SR_P_ERR)) {
118 if (nor->bouncebuf[0] & SR_E_ERR)
119 dev_err(nor->dev, "Erase Error occurred\n");
121 dev_err(nor->dev, "Programming Error occurred\n");
123 spansion_nor_clear_sr(nor);
125 ret = spi_nor_write_disable(nor);
132 return !(nor->bouncebuf[0] & SR_WIP);
138 * @nor: pointer to 'struct spi_nor'.
142 static int cypress_nor_sr_ready_and_clear(struct spi_nor *nor)
144 struct spi_nor_flash_parameter *params = nor->params;
151 ret = cypress_nor_sr_ready_and_clear_reg(nor, addr);
161 static int cypress_nor_set_memlat(struct spi_nor *nor, u64 addr)
164 u8 *buf = nor->bouncebuf;
166 u8 addr_mode_nbytes = nor->params->addr_mode_nbytes;
171 ret = spi_nor_read_any_reg(nor, &op, nor->reg_proto);
182 ret = spi_nor_write_any_volatile_reg(nor, &op, nor->reg_proto);
186 nor->read_dummy = 24;
191 static int cypress_nor_set_octal_dtr_bits(struct spi_nor *nor, u64 addr)
194 u8 *buf = nor->bouncebuf;
199 CYPRESS_NOR_WR_ANY_REG_OP(nor->params->addr_mode_nbytes,
202 return spi_nor_write_any_volatile_reg(nor, &op, nor->reg_proto);
205 static int cypress_nor_octal_dtr_en(struct spi_nor *nor)
207 const struct spi_nor_flash_parameter *params = nor->params;
208 u8 *buf = nor->bouncebuf;
214 ret = cypress_nor_set_memlat(nor, addr);
219 ret = cypress_nor_set_octal_dtr_bits(nor, addr);
225 ret = spi_nor_read_id(nor, nor->addr_nbytes, 3, buf,
228 dev_dbg(nor->dev, "error %d reading JEDEC ID after enabling 8D-8D-8D mode\n", ret);
232 if (memcmp(buf, nor->info->id->bytes, nor->info->id->len))
238 static int cypress_nor_set_single_spi_bits(struct spi_nor *nor, u64 addr)
241 u8 *buf = nor->bouncebuf;
251 CYPRESS_NOR_WR_ANY_REG_OP(nor->addr_nbytes, addr, 2, buf);
252 return spi_nor_write_any_volatile_reg(nor, &op, SNOR_PROTO_8_8_8_DTR);
255 static int cypress_nor_octal_dtr_dis(struct spi_nor *nor)
257 const struct spi_nor_flash_parameter *params = nor->params;
258 u8 *buf = nor->bouncebuf;
264 ret = cypress_nor_set_single_spi_bits(nor, addr);
270 ret = spi_nor_read_id(nor, 0, 0, buf, SNOR_PROTO_1_1_1);
272 dev_dbg(nor->dev, "error %d reading JEDEC ID after disabling 8D-8D-8D mode\n", ret);
276 if (memcmp(buf, nor->info->id->bytes, nor->info->id->len))
282 static int cypress_nor_quad_enable_volatile_reg(struct spi_nor *nor, u64 addr)
285 u8 addr_mode_nbytes = nor->params->addr_mode_nbytes;
291 nor->bouncebuf);
293 ret = spi_nor_read_any_reg(nor, &op, nor->reg_proto);
297 if (nor->bouncebuf[0] & SPINOR_REG_CYPRESS_CFR1_QUAD_EN)
301 nor->bouncebuf[0] |= SPINOR_REG_CYPRESS_CFR1_QUAD_EN;
304 nor->bouncebuf);
305 ret = spi_nor_write_any_volatile_reg(nor, &op, nor->reg_proto);
309 cfr1v_written = nor->bouncebuf[0];
314 nor->bouncebuf);
315 ret = spi_nor_read_any_reg(nor, &op, nor->reg_proto);
319 if (nor->bouncebuf[0] != cfr1v_written) {
320 dev_err(nor->dev, "CFR1: Read back test failed\n");
330 * @nor: pointer to a 'struct spi_nor'
341 static int cypress_nor_quad_enable_volatile(struct spi_nor *nor)
343 struct spi_nor_flash_parameter *params = nor->params;
350 ret = cypress_nor_quad_enable_volatile_reg(nor, addr);
362 * @nor: pointer to a 'struct spi_nor'
371 static int cypress_nor_determine_addr_mode_by_sr1(struct spi_nor *nor,
376 nor->bouncebuf);
380 ret = spi_nor_read_sr(nor, &nor->bouncebuf[1]);
384 ret = spi_nor_read_any_reg(nor, &op, nor->reg_proto);
388 is3byte = (nor->bouncebuf[0] == nor->bouncebuf[1]);
392 nor->bouncebuf);
393 ret = spi_nor_read_any_reg(nor, &op, nor->reg_proto);
397 is4byte = (nor->bouncebuf[0] == nor->bouncebuf[1]);
412 * @nor: pointer to a 'struct spi_nor'
420 static int cypress_nor_set_addr_mode_nbytes(struct spi_nor *nor)
430 ret = spi_nor_write_enable(nor);
433 ret = cypress_nor_determine_addr_mode_by_sr1(nor, &addr_mode);
435 ret = spi_nor_set_4byte_addr_mode(nor, true);
438 return spi_nor_write_disable(nor);
440 ret = spi_nor_write_disable(nor);
450 0, nor->bouncebuf);
451 ret = spi_nor_read_any_reg(nor, &op, nor->reg_proto);
455 if (nor->bouncebuf[0] & SPINOR_REG_CYPRESS_CFR2_ADRBYT) {
457 return spi_nor_set_4byte_addr_mode(nor, true);
460 return spi_nor_set_4byte_addr_mode(nor, true);
463 nor->params->addr_nbytes = addr_mode;
464 nor->params->addr_mode_nbytes = addr_mode;
471 * @nor: pointer to a 'struct spi_nor'
479 static int cypress_nor_get_page_size(struct spi_nor *nor)
482 CYPRESS_NOR_RD_ANY_REG_OP(nor->params->addr_mode_nbytes,
483 0, 0, nor->bouncebuf);
484 struct spi_nor_flash_parameter *params = nor->params;
496 ret = spi_nor_read_any_reg(nor, &op, nor->reg_proto);
500 if (!(nor->bouncebuf[0] & SPINOR_REG_CYPRESS_CFR3_PGSZ))
509 static void cypress_nor_ecc_init(struct spi_nor *nor)
516 nor->params->writesize = 16;
517 nor->flags |= SNOR_F_ECC;
521 s25fs256t_post_bfpt_fixup(struct spi_nor *nor,
528 ret = cypress_nor_set_addr_mode_nbytes(nor);
534 CYPRESS_NOR_RD_ANY_REG_OP(nor->params->addr_mode_nbytes,
536 nor->bouncebuf);
537 ret = spi_nor_read_any_reg(nor, &op, nor->reg_proto);
542 if (nor->bouncebuf[0])
548 static int s25fs256t_post_sfdp_fixup(struct spi_nor *nor)
550 struct spi_nor_flash_parameter *params = nor->params;
557 params->vreg_offset = devm_kmalloc(nor->dev, sizeof(u32), GFP_KERNEL);
570 return cypress_nor_get_page_size(nor);
573 static int s25fs256t_late_init(struct spi_nor *nor)
575 cypress_nor_ecc_init(nor);
587 s25hx_t_post_bfpt_fixup(struct spi_nor *nor,
593 ret = cypress_nor_set_addr_mode_nbytes(nor);
598 nor->params->quad_enable = cypress_nor_quad_enable_volatile;
603 static int s25hx_t_post_sfdp_fixup(struct spi_nor *nor)
605 struct spi_nor_flash_parameter *params = nor->params;
610 dev_err(nor->dev, "%s failed. The volatile register offset could not be retrieved from SFDP.\n",
636 return cypress_nor_get_page_size(nor);
639 static int s25hx_t_late_init(struct spi_nor *nor)
641 struct spi_nor_flash_parameter *params = nor->params;
646 cypress_nor_ecc_init(nor);
660 * @nor: pointer to a 'struct spi_nor'
668 static int cypress_nor_set_octal_dtr(struct spi_nor *nor, bool enable)
670 return enable ? cypress_nor_octal_dtr_en(nor) :
671 cypress_nor_octal_dtr_dis(nor);
674 static int s28hx_t_post_sfdp_fixup(struct spi_nor *nor)
676 struct spi_nor_flash_parameter *params = nor->params;
679 dev_err(nor->dev, "%s failed. The volatile register offset could not be retrieved from SFDP.\n",
713 return cypress_nor_get_page_size(nor);
716 static int s28hx_t_post_bfpt_fixup(struct spi_nor *nor,
720 return cypress_nor_set_addr_mode_nbytes(nor);
723 static int s28hx_t_late_init(struct spi_nor *nor)
725 struct spi_nor_flash_parameter *params = nor->params;
729 cypress_nor_ecc_init(nor);
741 s25fs_s_nor_post_bfpt_fixups(struct spi_nor *nor,
751 nor->params->page_size = 256;
1010 * @nor: pointer to 'struct spi_nor'.
1014 static int spansion_nor_sr_ready_and_clear(struct spi_nor *nor)
1018 ret = spi_nor_read_sr(nor, nor->bouncebuf);
1022 if (nor->bouncebuf[0] & (SR_E_ERR | SR_P_ERR)) {
1023 if (nor->bouncebuf[0] & SR_E_ERR)
1024 dev_err(nor->dev, "Erase Error occurred\n");
1026 dev_err(nor->dev, "Programming Error occurred\n");
1028 spansion_nor_clear_sr(nor);
1036 ret = spi_nor_write_disable(nor);
1043 return !(nor->bouncebuf[0] & SR_WIP);
1046 static int spansion_nor_late_init(struct spi_nor *nor)
1048 struct spi_nor_flash_parameter *params = nor->params;
1050 u8 mfr_flags = nor->info->mfr_flags;
1053 nor->flags |= SNOR_F_4B_OPCODES;
1055 nor->erase_opcode = SPINOR_OP_SE;
1056 nor->mtd.erasesize = nor->info->sector_size ?:
1061 priv_params = devm_kmalloc(nor->dev, sizeof(*priv_params),