Lines Matching full:nor
17 #include <linux/mtd/spi-nor.h>
49 * @nor: pointer to a 'struct spi_nor'
57 static u8 spi_nor_get_cmd_ext(const struct spi_nor *nor, in spi_nor_get_cmd_ext() argument
60 switch (nor->cmd_ext_type) { in spi_nor_get_cmd_ext()
68 dev_err(nor->dev, "Unknown command extension type\n"); in spi_nor_get_cmd_ext()
75 * @nor: pointer to a 'struct spi_nor'
80 void spi_nor_spimem_setup_op(const struct spi_nor *nor, in spi_nor_spimem_setup_op() argument
101 * something like 4S-4D-4D, but SPI NOR can't. So, set all 4 in spi_nor_spimem_setup_op()
112 ext = spi_nor_get_cmd_ext(nor, op); in spi_nor_spimem_setup_op()
121 * @nor: pointer to 'struct spi_nor'
128 static bool spi_nor_spimem_bounce(struct spi_nor *nor, struct spi_mem_op *op) in spi_nor_spimem_bounce() argument
133 if (op->data.nbytes > nor->bouncebuf_size) in spi_nor_spimem_bounce()
134 op->data.nbytes = nor->bouncebuf_size; in spi_nor_spimem_bounce()
135 op->data.buf.in = nor->bouncebuf; in spi_nor_spimem_bounce()
144 * @nor: pointer to 'struct spi_nor'
149 static int spi_nor_spimem_exec_op(struct spi_nor *nor, struct spi_mem_op *op) in spi_nor_spimem_exec_op() argument
153 error = spi_mem_adjust_op_size(nor->spimem, op); in spi_nor_spimem_exec_op()
157 return spi_mem_exec_op(nor->spimem, op); in spi_nor_spimem_exec_op()
160 int spi_nor_controller_ops_read_reg(struct spi_nor *nor, u8 opcode, in spi_nor_controller_ops_read_reg() argument
163 if (spi_nor_protocol_is_dtr(nor->reg_proto)) in spi_nor_controller_ops_read_reg()
166 return nor->controller_ops->read_reg(nor, opcode, buf, len); in spi_nor_controller_ops_read_reg()
169 int spi_nor_controller_ops_write_reg(struct spi_nor *nor, u8 opcode, in spi_nor_controller_ops_write_reg() argument
172 if (spi_nor_protocol_is_dtr(nor->reg_proto)) in spi_nor_controller_ops_write_reg()
175 return nor->controller_ops->write_reg(nor, opcode, buf, len); in spi_nor_controller_ops_write_reg()
178 static int spi_nor_controller_ops_erase(struct spi_nor *nor, loff_t offs) in spi_nor_controller_ops_erase() argument
180 if (spi_nor_protocol_is_dtr(nor->reg_proto)) in spi_nor_controller_ops_erase()
183 return nor->controller_ops->erase(nor, offs); in spi_nor_controller_ops_erase()
189 * @nor: pointer to 'struct spi_nor'
196 static ssize_t spi_nor_spimem_read_data(struct spi_nor *nor, loff_t from, in spi_nor_spimem_read_data() argument
200 SPI_MEM_OP(SPI_MEM_OP_CMD(nor->read_opcode, 0), in spi_nor_spimem_read_data()
201 SPI_MEM_OP_ADDR(nor->addr_nbytes, from, 0), in spi_nor_spimem_read_data()
202 SPI_MEM_OP_DUMMY(nor->read_dummy, 0), in spi_nor_spimem_read_data()
208 spi_nor_spimem_setup_op(nor, &op, nor->read_proto); in spi_nor_spimem_read_data()
211 op.dummy.nbytes = (nor->read_dummy * op.dummy.buswidth) / 8; in spi_nor_spimem_read_data()
212 if (spi_nor_protocol_is_dtr(nor->read_proto)) in spi_nor_spimem_read_data()
215 usebouncebuf = spi_nor_spimem_bounce(nor, &op); in spi_nor_spimem_read_data()
217 if (nor->dirmap.rdesc) { in spi_nor_spimem_read_data()
218 nbytes = spi_mem_dirmap_read(nor->dirmap.rdesc, op.addr.val, in spi_nor_spimem_read_data()
221 error = spi_nor_spimem_exec_op(nor, &op); in spi_nor_spimem_read_data()
235 * @nor: pointer to 'struct spi_nor'
242 ssize_t spi_nor_read_data(struct spi_nor *nor, loff_t from, size_t len, u8 *buf) in spi_nor_read_data() argument
244 if (nor->spimem) in spi_nor_read_data()
245 return spi_nor_spimem_read_data(nor, from, len, buf); in spi_nor_read_data()
247 return nor->controller_ops->read(nor, from, len, buf); in spi_nor_read_data()
253 * @nor: pointer to 'struct spi_nor'
260 static ssize_t spi_nor_spimem_write_data(struct spi_nor *nor, loff_t to, in spi_nor_spimem_write_data() argument
264 SPI_MEM_OP(SPI_MEM_OP_CMD(nor->program_opcode, 0), in spi_nor_spimem_write_data()
265 SPI_MEM_OP_ADDR(nor->addr_nbytes, to, 0), in spi_nor_spimem_write_data()
271 if (nor->program_opcode == SPINOR_OP_AAI_WP && nor->sst_write_second) in spi_nor_spimem_write_data()
274 spi_nor_spimem_setup_op(nor, &op, nor->write_proto); in spi_nor_spimem_write_data()
276 if (spi_nor_spimem_bounce(nor, &op)) in spi_nor_spimem_write_data()
277 memcpy(nor->bouncebuf, buf, op.data.nbytes); in spi_nor_spimem_write_data()
279 if (nor->dirmap.wdesc) { in spi_nor_spimem_write_data()
280 nbytes = spi_mem_dirmap_write(nor->dirmap.wdesc, op.addr.val, in spi_nor_spimem_write_data()
283 error = spi_nor_spimem_exec_op(nor, &op); in spi_nor_spimem_write_data()
294 * @nor: pointer to 'struct spi_nor'
301 ssize_t spi_nor_write_data(struct spi_nor *nor, loff_t to, size_t len, in spi_nor_write_data() argument
304 if (nor->spimem) in spi_nor_write_data()
305 return spi_nor_spimem_write_data(nor, to, len, buf); in spi_nor_write_data()
307 return nor->controller_ops->write(nor, to, len, buf); in spi_nor_write_data()
313 * @nor: pointer to 'struct spi_nor'.
319 int spi_nor_read_any_reg(struct spi_nor *nor, struct spi_mem_op *op, in spi_nor_read_any_reg() argument
322 if (!nor->spimem) in spi_nor_read_any_reg()
325 spi_nor_spimem_setup_op(nor, op, proto); in spi_nor_read_any_reg()
326 return spi_nor_spimem_exec_op(nor, op); in spi_nor_read_any_reg()
332 * @nor: pointer to 'struct spi_nor'
341 int spi_nor_write_any_volatile_reg(struct spi_nor *nor, struct spi_mem_op *op, in spi_nor_write_any_volatile_reg() argument
346 if (!nor->spimem) in spi_nor_write_any_volatile_reg()
349 ret = spi_nor_write_enable(nor); in spi_nor_write_any_volatile_reg()
352 spi_nor_spimem_setup_op(nor, op, proto); in spi_nor_write_any_volatile_reg()
353 return spi_nor_spimem_exec_op(nor, op); in spi_nor_write_any_volatile_reg()
358 * @nor: pointer to 'struct spi_nor'.
362 int spi_nor_write_enable(struct spi_nor *nor) in spi_nor_write_enable() argument
366 if (nor->spimem) { in spi_nor_write_enable()
369 spi_nor_spimem_setup_op(nor, &op, nor->reg_proto); in spi_nor_write_enable()
371 ret = spi_mem_exec_op(nor->spimem, &op); in spi_nor_write_enable()
373 ret = spi_nor_controller_ops_write_reg(nor, SPINOR_OP_WREN, in spi_nor_write_enable()
378 dev_dbg(nor->dev, "error %d on Write Enable\n", ret); in spi_nor_write_enable()
385 * @nor: pointer to 'struct spi_nor'.
389 int spi_nor_write_disable(struct spi_nor *nor) in spi_nor_write_disable() argument
393 if (nor->spimem) { in spi_nor_write_disable()
396 spi_nor_spimem_setup_op(nor, &op, nor->reg_proto); in spi_nor_write_disable()
398 ret = spi_mem_exec_op(nor->spimem, &op); in spi_nor_write_disable()
400 ret = spi_nor_controller_ops_write_reg(nor, SPINOR_OP_WRDI, in spi_nor_write_disable()
405 dev_dbg(nor->dev, "error %d on Write Disable\n", ret); in spi_nor_write_disable()
412 * @nor: pointer to 'struct spi_nor'.
423 int spi_nor_read_id(struct spi_nor *nor, u8 naddr, u8 ndummy, u8 *id, in spi_nor_read_id() argument
428 if (nor->spimem) { in spi_nor_read_id()
432 spi_nor_spimem_setup_op(nor, &op, proto); in spi_nor_read_id()
433 ret = spi_mem_exec_op(nor->spimem, &op); in spi_nor_read_id()
435 ret = nor->controller_ops->read_reg(nor, SPINOR_OP_RDID, id, in spi_nor_read_id()
443 * @nor: pointer to 'struct spi_nor'.
449 int spi_nor_read_sr(struct spi_nor *nor, u8 *sr) in spi_nor_read_sr() argument
453 if (nor->spimem) { in spi_nor_read_sr()
456 if (nor->reg_proto == SNOR_PROTO_8_8_8_DTR) { in spi_nor_read_sr()
457 op.addr.nbytes = nor->params->rdsr_addr_nbytes; in spi_nor_read_sr()
458 op.dummy.nbytes = nor->params->rdsr_dummy; in spi_nor_read_sr()
466 spi_nor_spimem_setup_op(nor, &op, nor->reg_proto); in spi_nor_read_sr()
468 ret = spi_mem_exec_op(nor->spimem, &op); in spi_nor_read_sr()
470 ret = spi_nor_controller_ops_read_reg(nor, SPINOR_OP_RDSR, sr, in spi_nor_read_sr()
475 dev_dbg(nor->dev, "error %d reading SR\n", ret); in spi_nor_read_sr()
483 * @nor: pointer to 'struct spi_nor'
489 int spi_nor_read_cr(struct spi_nor *nor, u8 *cr) in spi_nor_read_cr() argument
493 if (nor->spimem) { in spi_nor_read_cr()
496 spi_nor_spimem_setup_op(nor, &op, nor->reg_proto); in spi_nor_read_cr()
498 ret = spi_mem_exec_op(nor->spimem, &op); in spi_nor_read_cr()
500 ret = spi_nor_controller_ops_read_reg(nor, SPINOR_OP_RDCR, cr, in spi_nor_read_cr()
505 dev_dbg(nor->dev, "error %d reading CR\n", ret); in spi_nor_read_cr()
514 * @nor: pointer to 'struct spi_nor'.
520 int spi_nor_set_4byte_addr_mode_en4b_ex4b(struct spi_nor *nor, bool enable) in spi_nor_set_4byte_addr_mode_en4b_ex4b() argument
524 if (nor->spimem) { in spi_nor_set_4byte_addr_mode_en4b_ex4b()
527 spi_nor_spimem_setup_op(nor, &op, nor->reg_proto); in spi_nor_set_4byte_addr_mode_en4b_ex4b()
529 ret = spi_mem_exec_op(nor->spimem, &op); in spi_nor_set_4byte_addr_mode_en4b_ex4b()
531 ret = spi_nor_controller_ops_write_reg(nor, in spi_nor_set_4byte_addr_mode_en4b_ex4b()
538 dev_dbg(nor->dev, "error %d setting 4-byte mode\n", ret); in spi_nor_set_4byte_addr_mode_en4b_ex4b()
547 * @nor: pointer to 'struct spi_nor'.
553 int spi_nor_set_4byte_addr_mode_wren_en4b_ex4b(struct spi_nor *nor, bool enable) in spi_nor_set_4byte_addr_mode_wren_en4b_ex4b() argument
557 ret = spi_nor_write_enable(nor); in spi_nor_set_4byte_addr_mode_wren_en4b_ex4b()
561 ret = spi_nor_set_4byte_addr_mode_en4b_ex4b(nor, enable); in spi_nor_set_4byte_addr_mode_wren_en4b_ex4b()
565 return spi_nor_write_disable(nor); in spi_nor_set_4byte_addr_mode_wren_en4b_ex4b()
571 * @nor: pointer to 'struct spi_nor'.
582 int spi_nor_set_4byte_addr_mode_brwr(struct spi_nor *nor, bool enable) in spi_nor_set_4byte_addr_mode_brwr() argument
586 nor->bouncebuf[0] = enable << 7; in spi_nor_set_4byte_addr_mode_brwr()
588 if (nor->spimem) { in spi_nor_set_4byte_addr_mode_brwr()
589 struct spi_mem_op op = SPI_NOR_BRWR_OP(nor->bouncebuf); in spi_nor_set_4byte_addr_mode_brwr()
591 spi_nor_spimem_setup_op(nor, &op, nor->reg_proto); in spi_nor_set_4byte_addr_mode_brwr()
593 ret = spi_mem_exec_op(nor->spimem, &op); in spi_nor_set_4byte_addr_mode_brwr()
595 ret = spi_nor_controller_ops_write_reg(nor, SPINOR_OP_BRWR, in spi_nor_set_4byte_addr_mode_brwr()
596 nor->bouncebuf, 1); in spi_nor_set_4byte_addr_mode_brwr()
600 dev_dbg(nor->dev, "error %d setting 4-byte mode\n", ret); in spi_nor_set_4byte_addr_mode_brwr()
608 * @nor: pointer to 'struct spi_nor'.
612 int spi_nor_sr_ready(struct spi_nor *nor) in spi_nor_sr_ready() argument
616 ret = spi_nor_read_sr(nor, nor->bouncebuf); in spi_nor_sr_ready()
620 return !(nor->bouncebuf[0] & SR_WIP); in spi_nor_sr_ready()
625 * @nor: pointer to 'struct spi_nor'.
629 static bool spi_nor_use_parallel_locking(struct spi_nor *nor) in spi_nor_use_parallel_locking() argument
631 return nor->flags & SNOR_F_RWW; in spi_nor_use_parallel_locking()
635 static int spi_nor_rww_start_rdst(struct spi_nor *nor) in spi_nor_rww_start_rdst() argument
637 struct spi_nor_rww *rww = &nor->rww; in spi_nor_rww_start_rdst()
640 mutex_lock(&nor->lock); in spi_nor_rww_start_rdst()
650 mutex_unlock(&nor->lock); in spi_nor_rww_start_rdst()
654 static void spi_nor_rww_end_rdst(struct spi_nor *nor) in spi_nor_rww_end_rdst() argument
656 struct spi_nor_rww *rww = &nor->rww; in spi_nor_rww_end_rdst()
658 mutex_lock(&nor->lock); in spi_nor_rww_end_rdst()
663 mutex_unlock(&nor->lock); in spi_nor_rww_end_rdst()
666 static int spi_nor_lock_rdst(struct spi_nor *nor) in spi_nor_lock_rdst() argument
668 if (spi_nor_use_parallel_locking(nor)) in spi_nor_lock_rdst()
669 return spi_nor_rww_start_rdst(nor); in spi_nor_lock_rdst()
674 static void spi_nor_unlock_rdst(struct spi_nor *nor) in spi_nor_unlock_rdst() argument
676 if (spi_nor_use_parallel_locking(nor)) { in spi_nor_unlock_rdst()
677 spi_nor_rww_end_rdst(nor); in spi_nor_unlock_rdst()
678 wake_up(&nor->rww.wait); in spi_nor_unlock_rdst()
684 * @nor: pointer to 'struct spi_nor'.
688 static int spi_nor_ready(struct spi_nor *nor) in spi_nor_ready() argument
692 ret = spi_nor_lock_rdst(nor); in spi_nor_ready()
697 if (nor->params->ready) in spi_nor_ready()
698 ret = nor->params->ready(nor); in spi_nor_ready()
700 ret = spi_nor_sr_ready(nor); in spi_nor_ready()
702 spi_nor_unlock_rdst(nor); in spi_nor_ready()
710 * @nor: pointer to "struct spi_nor".
715 static int spi_nor_wait_till_ready_with_timeout(struct spi_nor *nor, in spi_nor_wait_till_ready_with_timeout() argument
727 ret = spi_nor_ready(nor); in spi_nor_wait_till_ready_with_timeout()
736 dev_dbg(nor->dev, "flash operation timed out\n"); in spi_nor_wait_till_ready_with_timeout()
744 * @nor: pointer to "struct spi_nor".
748 int spi_nor_wait_till_ready(struct spi_nor *nor) in spi_nor_wait_till_ready() argument
750 return spi_nor_wait_till_ready_with_timeout(nor, in spi_nor_wait_till_ready()
756 * @nor: pointer to 'struct spi_nor'.
760 int spi_nor_global_block_unlock(struct spi_nor *nor) in spi_nor_global_block_unlock() argument
764 ret = spi_nor_write_enable(nor); in spi_nor_global_block_unlock()
768 if (nor->spimem) { in spi_nor_global_block_unlock()
771 spi_nor_spimem_setup_op(nor, &op, nor->reg_proto); in spi_nor_global_block_unlock()
773 ret = spi_mem_exec_op(nor->spimem, &op); in spi_nor_global_block_unlock()
775 ret = spi_nor_controller_ops_write_reg(nor, SPINOR_OP_GBULK, in spi_nor_global_block_unlock()
780 dev_dbg(nor->dev, "error %d on Global Block Unlock\n", ret); in spi_nor_global_block_unlock()
784 return spi_nor_wait_till_ready(nor); in spi_nor_global_block_unlock()
789 * @nor: pointer to 'struct spi_nor'.
795 int spi_nor_write_sr(struct spi_nor *nor, const u8 *sr, size_t len) in spi_nor_write_sr() argument
799 ret = spi_nor_write_enable(nor); in spi_nor_write_sr()
803 if (nor->spimem) { in spi_nor_write_sr()
806 spi_nor_spimem_setup_op(nor, &op, nor->reg_proto); in spi_nor_write_sr()
808 ret = spi_mem_exec_op(nor->spimem, &op); in spi_nor_write_sr()
810 ret = spi_nor_controller_ops_write_reg(nor, SPINOR_OP_WRSR, sr, in spi_nor_write_sr()
815 dev_dbg(nor->dev, "error %d writing SR\n", ret); in spi_nor_write_sr()
819 return spi_nor_wait_till_ready(nor); in spi_nor_write_sr()
825 * @nor: pointer to a 'struct spi_nor'.
830 static int spi_nor_write_sr1_and_check(struct spi_nor *nor, u8 sr1) in spi_nor_write_sr1_and_check() argument
834 nor->bouncebuf[0] = sr1; in spi_nor_write_sr1_and_check()
836 ret = spi_nor_write_sr(nor, nor->bouncebuf, 1); in spi_nor_write_sr1_and_check()
840 ret = spi_nor_read_sr(nor, nor->bouncebuf); in spi_nor_write_sr1_and_check()
844 if (nor->bouncebuf[0] != sr1) { in spi_nor_write_sr1_and_check()
845 dev_dbg(nor->dev, "SR1: read back test failed\n"); in spi_nor_write_sr1_and_check()
857 * @nor: pointer to a 'struct spi_nor'.
862 static int spi_nor_write_16bit_sr_and_check(struct spi_nor *nor, u8 sr1) in spi_nor_write_16bit_sr_and_check() argument
865 u8 *sr_cr = nor->bouncebuf; in spi_nor_write_16bit_sr_and_check()
869 if (!(nor->flags & SNOR_F_NO_READ_CR)) { in spi_nor_write_16bit_sr_and_check()
870 ret = spi_nor_read_cr(nor, &sr_cr[1]); in spi_nor_write_16bit_sr_and_check()
873 } else if (spi_nor_get_protocol_width(nor->read_proto) == 4 && in spi_nor_write_16bit_sr_and_check()
874 spi_nor_get_protocol_width(nor->write_proto) == 4 && in spi_nor_write_16bit_sr_and_check()
875 nor->params->quad_enable) { in spi_nor_write_16bit_sr_and_check()
883 * consequence of the nor->params->quad_enable() call. in spi_nor_write_16bit_sr_and_check()
897 ret = spi_nor_write_sr(nor, sr_cr, 2); in spi_nor_write_16bit_sr_and_check()
901 ret = spi_nor_read_sr(nor, sr_cr); in spi_nor_write_16bit_sr_and_check()
906 dev_dbg(nor->dev, "SR: Read back test failed\n"); in spi_nor_write_16bit_sr_and_check()
910 if (nor->flags & SNOR_F_NO_READ_CR) in spi_nor_write_16bit_sr_and_check()
915 ret = spi_nor_read_cr(nor, &sr_cr[1]); in spi_nor_write_16bit_sr_and_check()
920 dev_dbg(nor->dev, "CR: read back test failed\n"); in spi_nor_write_16bit_sr_and_check()
932 * @nor: pointer to a 'struct spi_nor'.
937 int spi_nor_write_16bit_cr_and_check(struct spi_nor *nor, u8 cr) in spi_nor_write_16bit_cr_and_check() argument
940 u8 *sr_cr = nor->bouncebuf; in spi_nor_write_16bit_cr_and_check()
944 ret = spi_nor_read_sr(nor, sr_cr); in spi_nor_write_16bit_cr_and_check()
950 ret = spi_nor_write_sr(nor, sr_cr, 2); in spi_nor_write_16bit_cr_and_check()
956 ret = spi_nor_read_sr(nor, sr_cr); in spi_nor_write_16bit_cr_and_check()
961 dev_dbg(nor->dev, "SR: Read back test failed\n"); in spi_nor_write_16bit_cr_and_check()
965 if (nor->flags & SNOR_F_NO_READ_CR) in spi_nor_write_16bit_cr_and_check()
968 ret = spi_nor_read_cr(nor, &sr_cr[1]); in spi_nor_write_16bit_cr_and_check()
973 dev_dbg(nor->dev, "CR: read back test failed\n"); in spi_nor_write_16bit_cr_and_check()
984 * @nor: pointer to a 'struct spi_nor'.
989 int spi_nor_write_sr_and_check(struct spi_nor *nor, u8 sr1) in spi_nor_write_sr_and_check() argument
991 if (nor->flags & SNOR_F_HAS_16BIT_SR) in spi_nor_write_sr_and_check()
992 return spi_nor_write_16bit_sr_and_check(nor, sr1); in spi_nor_write_sr_and_check()
994 return spi_nor_write_sr1_and_check(nor, sr1); in spi_nor_write_sr_and_check()
1000 * @nor: pointer to 'struct spi_nor'.
1005 static int spi_nor_write_sr2(struct spi_nor *nor, const u8 *sr2) in spi_nor_write_sr2() argument
1009 ret = spi_nor_write_enable(nor); in spi_nor_write_sr2()
1013 if (nor->spimem) { in spi_nor_write_sr2()
1016 spi_nor_spimem_setup_op(nor, &op, nor->reg_proto); in spi_nor_write_sr2()
1018 ret = spi_mem_exec_op(nor->spimem, &op); in spi_nor_write_sr2()
1020 ret = spi_nor_controller_ops_write_reg(nor, SPINOR_OP_WRSR2, in spi_nor_write_sr2()
1025 dev_dbg(nor->dev, "error %d writing SR2\n", ret); in spi_nor_write_sr2()
1029 return spi_nor_wait_till_ready(nor); in spi_nor_write_sr2()
1035 * @nor: pointer to 'struct spi_nor'.
1041 static int spi_nor_read_sr2(struct spi_nor *nor, u8 *sr2) in spi_nor_read_sr2() argument
1045 if (nor->spimem) { in spi_nor_read_sr2()
1048 spi_nor_spimem_setup_op(nor, &op, nor->reg_proto); in spi_nor_read_sr2()
1050 ret = spi_mem_exec_op(nor->spimem, &op); in spi_nor_read_sr2()
1052 ret = spi_nor_controller_ops_read_reg(nor, SPINOR_OP_RDSR2, sr2, in spi_nor_read_sr2()
1057 dev_dbg(nor->dev, "error %d reading SR2\n", ret); in spi_nor_read_sr2()
1064 * @nor: pointer to 'struct spi_nor'.
1068 static int spi_nor_erase_chip(struct spi_nor *nor) in spi_nor_erase_chip() argument
1072 dev_dbg(nor->dev, " %lldKiB\n", (long long)(nor->mtd.size >> 10)); in spi_nor_erase_chip()
1074 if (nor->spimem) { in spi_nor_erase_chip()
1077 spi_nor_spimem_setup_op(nor, &op, nor->reg_proto); in spi_nor_erase_chip()
1079 ret = spi_mem_exec_op(nor->spimem, &op); in spi_nor_erase_chip()
1081 ret = spi_nor_controller_ops_write_reg(nor, in spi_nor_erase_chip()
1087 dev_dbg(nor->dev, "error %d erasing chip\n", ret); in spi_nor_erase_chip()
1151 static bool spi_nor_has_uniform_erase(const struct spi_nor *nor) in spi_nor_has_uniform_erase() argument
1153 return !!nor->params->erase_map.uniform_erase_type; in spi_nor_has_uniform_erase()
1156 static void spi_nor_set_4byte_opcodes(struct spi_nor *nor) in spi_nor_set_4byte_opcodes() argument
1158 nor->read_opcode = spi_nor_convert_3to4_read(nor->read_opcode); in spi_nor_set_4byte_opcodes()
1159 nor->program_opcode = spi_nor_convert_3to4_program(nor->program_opcode); in spi_nor_set_4byte_opcodes()
1160 nor->erase_opcode = spi_nor_convert_3to4_erase(nor->erase_opcode); in spi_nor_set_4byte_opcodes()
1162 if (!spi_nor_has_uniform_erase(nor)) { in spi_nor_set_4byte_opcodes()
1163 struct spi_nor_erase_map *map = &nor->params->erase_map; in spi_nor_set_4byte_opcodes()
1175 static int spi_nor_prep(struct spi_nor *nor) in spi_nor_prep() argument
1179 if (nor->controller_ops && nor->controller_ops->prepare) in spi_nor_prep()
1180 ret = nor->controller_ops->prepare(nor); in spi_nor_prep()
1185 static void spi_nor_unprep(struct spi_nor *nor) in spi_nor_unprep() argument
1187 if (nor->controller_ops && nor->controller_ops->unprepare) in spi_nor_unprep()
1188 nor->controller_ops->unprepare(nor); in spi_nor_unprep()
1200 static bool spi_nor_rww_start_io(struct spi_nor *nor) in spi_nor_rww_start_io() argument
1202 struct spi_nor_rww *rww = &nor->rww; in spi_nor_rww_start_io()
1205 mutex_lock(&nor->lock); in spi_nor_rww_start_io()
1214 mutex_unlock(&nor->lock); in spi_nor_rww_start_io()
1218 static void spi_nor_rww_end_io(struct spi_nor *nor) in spi_nor_rww_end_io() argument
1220 mutex_lock(&nor->lock); in spi_nor_rww_end_io()
1221 nor->rww.ongoing_io = false; in spi_nor_rww_end_io()
1222 mutex_unlock(&nor->lock); in spi_nor_rww_end_io()
1225 static int spi_nor_lock_device(struct spi_nor *nor) in spi_nor_lock_device() argument
1227 if (!spi_nor_use_parallel_locking(nor)) in spi_nor_lock_device()
1230 return wait_event_killable(nor->rww.wait, spi_nor_rww_start_io(nor)); in spi_nor_lock_device()
1233 static void spi_nor_unlock_device(struct spi_nor *nor) in spi_nor_unlock_device() argument
1235 if (spi_nor_use_parallel_locking(nor)) { in spi_nor_unlock_device()
1236 spi_nor_rww_end_io(nor); in spi_nor_unlock_device()
1237 wake_up(&nor->rww.wait); in spi_nor_unlock_device()
1242 static bool spi_nor_rww_start_exclusive(struct spi_nor *nor) in spi_nor_rww_start_exclusive() argument
1244 struct spi_nor_rww *rww = &nor->rww; in spi_nor_rww_start_exclusive()
1247 mutex_lock(&nor->lock); in spi_nor_rww_start_exclusive()
1258 mutex_unlock(&nor->lock); in spi_nor_rww_start_exclusive()
1262 static void spi_nor_rww_end_exclusive(struct spi_nor *nor) in spi_nor_rww_end_exclusive() argument
1264 struct spi_nor_rww *rww = &nor->rww; in spi_nor_rww_end_exclusive()
1266 mutex_lock(&nor->lock); in spi_nor_rww_end_exclusive()
1270 mutex_unlock(&nor->lock); in spi_nor_rww_end_exclusive()
1273 int spi_nor_prep_and_lock(struct spi_nor *nor) in spi_nor_prep_and_lock() argument
1277 ret = spi_nor_prep(nor); in spi_nor_prep_and_lock()
1281 if (!spi_nor_use_parallel_locking(nor)) in spi_nor_prep_and_lock()
1282 mutex_lock(&nor->lock); in spi_nor_prep_and_lock()
1284 ret = wait_event_killable(nor->rww.wait, in spi_nor_prep_and_lock()
1285 spi_nor_rww_start_exclusive(nor)); in spi_nor_prep_and_lock()
1290 void spi_nor_unlock_and_unprep(struct spi_nor *nor) in spi_nor_unlock_and_unprep() argument
1292 if (!spi_nor_use_parallel_locking(nor)) { in spi_nor_unlock_and_unprep()
1293 mutex_unlock(&nor->lock); in spi_nor_unlock_and_unprep()
1295 spi_nor_rww_end_exclusive(nor); in spi_nor_unlock_and_unprep()
1296 wake_up(&nor->rww.wait); in spi_nor_unlock_and_unprep()
1299 spi_nor_unprep(nor); in spi_nor_unlock_and_unprep()
1303 static bool spi_nor_rww_start_pe(struct spi_nor *nor, loff_t start, size_t len) in spi_nor_rww_start_pe() argument
1305 struct spi_nor_rww *rww = &nor->rww; in spi_nor_rww_start_pe()
1311 mutex_lock(&nor->lock); in spi_nor_rww_start_pe()
1316 spi_nor_offset_to_banks(nor->params->bank_size, start, len, &first, &last); in spi_nor_rww_start_pe()
1329 mutex_unlock(&nor->lock); in spi_nor_rww_start_pe()
1333 static void spi_nor_rww_end_pe(struct spi_nor *nor, loff_t start, size_t len) in spi_nor_rww_end_pe() argument
1335 struct spi_nor_rww *rww = &nor->rww; in spi_nor_rww_end_pe()
1339 mutex_lock(&nor->lock); in spi_nor_rww_end_pe()
1341 spi_nor_offset_to_banks(nor->params->bank_size, start, len, &first, &last); in spi_nor_rww_end_pe()
1347 mutex_unlock(&nor->lock); in spi_nor_rww_end_pe()
1350 static int spi_nor_prep_and_lock_pe(struct spi_nor *nor, loff_t start, size_t len) in spi_nor_prep_and_lock_pe() argument
1354 ret = spi_nor_prep(nor); in spi_nor_prep_and_lock_pe()
1358 if (!spi_nor_use_parallel_locking(nor)) in spi_nor_prep_and_lock_pe()
1359 mutex_lock(&nor->lock); in spi_nor_prep_and_lock_pe()
1361 ret = wait_event_killable(nor->rww.wait, in spi_nor_prep_and_lock_pe()
1362 spi_nor_rww_start_pe(nor, start, len)); in spi_nor_prep_and_lock_pe()
1367 static void spi_nor_unlock_and_unprep_pe(struct spi_nor *nor, loff_t start, size_t len) in spi_nor_unlock_and_unprep_pe() argument
1369 if (!spi_nor_use_parallel_locking(nor)) { in spi_nor_unlock_and_unprep_pe()
1370 mutex_unlock(&nor->lock); in spi_nor_unlock_and_unprep_pe()
1372 spi_nor_rww_end_pe(nor, start, len); in spi_nor_unlock_and_unprep_pe()
1373 wake_up(&nor->rww.wait); in spi_nor_unlock_and_unprep_pe()
1376 spi_nor_unprep(nor); in spi_nor_unlock_and_unprep_pe()
1380 static bool spi_nor_rww_start_rd(struct spi_nor *nor, loff_t start, size_t len) in spi_nor_rww_start_rd() argument
1382 struct spi_nor_rww *rww = &nor->rww; in spi_nor_rww_start_rd()
1388 mutex_lock(&nor->lock); in spi_nor_rww_start_rd()
1393 spi_nor_offset_to_banks(nor->params->bank_size, start, len, &first, &last); in spi_nor_rww_start_rd()
1407 mutex_unlock(&nor->lock); in spi_nor_rww_start_rd()
1411 static void spi_nor_rww_end_rd(struct spi_nor *nor, loff_t start, size_t len) in spi_nor_rww_end_rd() argument
1413 struct spi_nor_rww *rww = &nor->rww; in spi_nor_rww_end_rd()
1417 mutex_lock(&nor->lock); in spi_nor_rww_end_rd()
1419 spi_nor_offset_to_banks(nor->params->bank_size, start, len, &first, &last); in spi_nor_rww_end_rd()
1421 nor->rww.used_banks &= ~BIT(bank); in spi_nor_rww_end_rd()
1426 mutex_unlock(&nor->lock); in spi_nor_rww_end_rd()
1429 static int spi_nor_prep_and_lock_rd(struct spi_nor *nor, loff_t start, size_t len) in spi_nor_prep_and_lock_rd() argument
1433 ret = spi_nor_prep(nor); in spi_nor_prep_and_lock_rd()
1437 if (!spi_nor_use_parallel_locking(nor)) in spi_nor_prep_and_lock_rd()
1438 mutex_lock(&nor->lock); in spi_nor_prep_and_lock_rd()
1440 ret = wait_event_killable(nor->rww.wait, in spi_nor_prep_and_lock_rd()
1441 spi_nor_rww_start_rd(nor, start, len)); in spi_nor_prep_and_lock_rd()
1446 static void spi_nor_unlock_and_unprep_rd(struct spi_nor *nor, loff_t start, size_t len) in spi_nor_unlock_and_unprep_rd() argument
1448 if (!spi_nor_use_parallel_locking(nor)) { in spi_nor_unlock_and_unprep_rd()
1449 mutex_unlock(&nor->lock); in spi_nor_unlock_and_unprep_rd()
1451 spi_nor_rww_end_rd(nor, start, len); in spi_nor_unlock_and_unprep_rd()
1452 wake_up(&nor->rww.wait); in spi_nor_unlock_and_unprep_rd()
1455 spi_nor_unprep(nor); in spi_nor_unlock_and_unprep_rd()
1458 static u32 spi_nor_convert_addr(struct spi_nor *nor, loff_t addr) in spi_nor_convert_addr() argument
1460 if (!nor->params->convert_addr) in spi_nor_convert_addr()
1463 return nor->params->convert_addr(nor, addr); in spi_nor_convert_addr()
1469 int spi_nor_erase_sector(struct spi_nor *nor, u32 addr) in spi_nor_erase_sector() argument
1473 addr = spi_nor_convert_addr(nor, addr); in spi_nor_erase_sector()
1475 if (nor->spimem) { in spi_nor_erase_sector()
1477 SPI_NOR_SECTOR_ERASE_OP(nor->erase_opcode, in spi_nor_erase_sector()
1478 nor->addr_nbytes, addr); in spi_nor_erase_sector()
1480 spi_nor_spimem_setup_op(nor, &op, nor->reg_proto); in spi_nor_erase_sector()
1482 return spi_mem_exec_op(nor->spimem, &op); in spi_nor_erase_sector()
1483 } else if (nor->controller_ops->erase) { in spi_nor_erase_sector()
1484 return spi_nor_controller_ops_erase(nor, addr); in spi_nor_erase_sector()
1491 for (i = nor->addr_nbytes - 1; i >= 0; i--) { in spi_nor_erase_sector()
1492 nor->bouncebuf[i] = addr & 0xff; in spi_nor_erase_sector()
1496 return spi_nor_controller_ops_write_reg(nor, nor->erase_opcode, in spi_nor_erase_sector()
1497 nor->bouncebuf, nor->addr_nbytes); in spi_nor_erase_sector()
1502 * @erase: pointer to a structure that describes a SPI NOR erase type
1522 * @map: the erase map of the SPI NOR
1523 * @region: pointer to a structure that describes a SPI NOR erase region
1580 * spi_nor_region_next() - get the next spi nor region
1581 * @region: pointer to a structure that describes a SPI NOR erase region
1583 * Return: the next spi nor region or NULL if last region.
1597 * @map: the erase map of the SPI NOR
1624 * @region: pointer to a structure that describes a SPI NOR erase region
1625 * @erase: pointer to a structure that describes a SPI NOR erase type
1668 * @nor: pointer to a 'struct spi_nor'
1679 static int spi_nor_init_erase_cmd_list(struct spi_nor *nor, in spi_nor_init_erase_cmd_list() argument
1683 const struct spi_nor_erase_map *map = &nor->params->erase_map; in spi_nor_init_erase_cmd_list()
1737 * @nor: pointer to a 'struct spi_nor'
1746 static int spi_nor_erase_multi_sectors(struct spi_nor *nor, u64 addr, u32 len) in spi_nor_erase_multi_sectors() argument
1752 ret = spi_nor_init_erase_cmd_list(nor, &erase_list, addr, len); in spi_nor_erase_multi_sectors()
1757 nor->erase_opcode = cmd->opcode; in spi_nor_erase_multi_sectors()
1759 …dev_vdbg(nor->dev, "erase_cmd->size = 0x%08x, erase_cmd->opcode = 0x%02x, erase_cmd->count = %u\n", in spi_nor_erase_multi_sectors()
1762 ret = spi_nor_lock_device(nor); in spi_nor_erase_multi_sectors()
1766 ret = spi_nor_write_enable(nor); in spi_nor_erase_multi_sectors()
1768 spi_nor_unlock_device(nor); in spi_nor_erase_multi_sectors()
1772 ret = spi_nor_erase_sector(nor, addr); in spi_nor_erase_multi_sectors()
1773 spi_nor_unlock_device(nor); in spi_nor_erase_multi_sectors()
1777 ret = spi_nor_wait_till_ready(nor); in spi_nor_erase_multi_sectors()
1796 * Erase an address range on the nor chip. The address range may extend
1801 struct spi_nor *nor = mtd_to_spi_nor(mtd); in spi_nor_erase() local
1806 dev_dbg(nor->dev, "at 0x%llx, len %lld\n", (long long)instr->addr, in spi_nor_erase()
1809 if (spi_nor_has_uniform_erase(nor)) { in spi_nor_erase()
1818 ret = spi_nor_prep_and_lock_pe(nor, instr->addr, instr->len); in spi_nor_erase()
1823 if (len == mtd->size && !(nor->flags & SNOR_F_NO_OP_CHIP_ERASE)) { in spi_nor_erase()
1826 ret = spi_nor_lock_device(nor); in spi_nor_erase()
1830 ret = spi_nor_write_enable(nor); in spi_nor_erase()
1832 spi_nor_unlock_device(nor); in spi_nor_erase()
1836 ret = spi_nor_erase_chip(nor); in spi_nor_erase()
1837 spi_nor_unlock_device(nor); in spi_nor_erase()
1850 ret = spi_nor_wait_till_ready_with_timeout(nor, timeout); in spi_nor_erase()
1860 } else if (spi_nor_has_uniform_erase(nor)) { in spi_nor_erase()
1862 ret = spi_nor_lock_device(nor); in spi_nor_erase()
1866 ret = spi_nor_write_enable(nor); in spi_nor_erase()
1868 spi_nor_unlock_device(nor); in spi_nor_erase()
1872 ret = spi_nor_erase_sector(nor, addr); in spi_nor_erase()
1873 spi_nor_unlock_device(nor); in spi_nor_erase()
1877 ret = spi_nor_wait_till_ready(nor); in spi_nor_erase()
1887 ret = spi_nor_erase_multi_sectors(nor, addr, len); in spi_nor_erase()
1892 ret = spi_nor_write_disable(nor); in spi_nor_erase()
1895 spi_nor_unlock_and_unprep_pe(nor, instr->addr, instr->len); in spi_nor_erase()
1903 * @nor: pointer to a 'struct spi_nor'
1909 int spi_nor_sr1_bit6_quad_enable(struct spi_nor *nor) in spi_nor_sr1_bit6_quad_enable() argument
1913 ret = spi_nor_read_sr(nor, nor->bouncebuf); in spi_nor_sr1_bit6_quad_enable()
1917 if (nor->bouncebuf[0] & SR1_QUAD_EN_BIT6) in spi_nor_sr1_bit6_quad_enable()
1920 nor->bouncebuf[0] |= SR1_QUAD_EN_BIT6; in spi_nor_sr1_bit6_quad_enable()
1922 return spi_nor_write_sr1_and_check(nor, nor->bouncebuf[0]); in spi_nor_sr1_bit6_quad_enable()
1928 * @nor: pointer to a 'struct spi_nor'.
1934 int spi_nor_sr2_bit1_quad_enable(struct spi_nor *nor) in spi_nor_sr2_bit1_quad_enable() argument
1938 if (nor->flags & SNOR_F_NO_READ_CR) in spi_nor_sr2_bit1_quad_enable()
1939 return spi_nor_write_16bit_cr_and_check(nor, SR2_QUAD_EN_BIT1); in spi_nor_sr2_bit1_quad_enable()
1941 ret = spi_nor_read_cr(nor, nor->bouncebuf); in spi_nor_sr2_bit1_quad_enable()
1945 if (nor->bouncebuf[0] & SR2_QUAD_EN_BIT1) in spi_nor_sr2_bit1_quad_enable()
1948 nor->bouncebuf[0] |= SR2_QUAD_EN_BIT1; in spi_nor_sr2_bit1_quad_enable()
1950 return spi_nor_write_16bit_cr_and_check(nor, nor->bouncebuf[0]); in spi_nor_sr2_bit1_quad_enable()
1955 * @nor: pointer to a 'struct spi_nor'
1965 int spi_nor_sr2_bit7_quad_enable(struct spi_nor *nor) in spi_nor_sr2_bit7_quad_enable() argument
1967 u8 *sr2 = nor->bouncebuf; in spi_nor_sr2_bit7_quad_enable()
1972 ret = spi_nor_read_sr2(nor, sr2); in spi_nor_sr2_bit7_quad_enable()
1981 ret = spi_nor_write_sr2(nor, sr2); in spi_nor_sr2_bit7_quad_enable()
1988 ret = spi_nor_read_sr2(nor, sr2); in spi_nor_sr2_bit7_quad_enable()
1993 dev_dbg(nor->dev, "SR2: Read back test failed\n"); in spi_nor_sr2_bit7_quad_enable()
2021 .name = "spi-nor-generic",
2031 static const struct flash_info *spi_nor_match_id(struct spi_nor *nor, in spi_nor_match_id() argument
2042 nor->manufacturer = manufacturers[i]; in spi_nor_match_id()
2051 static const struct flash_info *spi_nor_detect(struct spi_nor *nor) in spi_nor_detect() argument
2054 u8 *id = nor->bouncebuf; in spi_nor_detect()
2057 ret = spi_nor_read_id(nor, 0, 0, id, nor->reg_proto); in spi_nor_detect()
2059 dev_dbg(nor->dev, "error %d reading JEDEC ID\n", ret); in spi_nor_detect()
2064 nor->id = devm_kmemdup(nor->dev, id, SPI_NOR_MAX_ID_LEN, GFP_KERNEL); in spi_nor_detect()
2065 if (!nor->id) in spi_nor_detect()
2068 info = spi_nor_match_id(nor, id); in spi_nor_detect()
2072 ret = spi_nor_check_sfdp_signature(nor); in spi_nor_detect()
2078 dev_err(nor->dev, "unrecognized JEDEC id bytes: %*ph\n", in spi_nor_detect()
2088 struct spi_nor *nor = mtd_to_spi_nor(mtd); in spi_nor_read() local
2093 dev_dbg(nor->dev, "from 0x%08x, len %zd\n", (u32)from, len); in spi_nor_read()
2095 ret = spi_nor_prep_and_lock_rd(nor, from_lock, len_lock); in spi_nor_read()
2102 addr = spi_nor_convert_addr(nor, addr); in spi_nor_read()
2104 ret = spi_nor_read_data(nor, addr, len, buf); in spi_nor_read()
2122 spi_nor_unlock_and_unprep_rd(nor, from_lock, len_lock); in spi_nor_read()
2128 * Write an address range to the nor chip. Data must be written in
2135 struct spi_nor *nor = mtd_to_spi_nor(mtd); in spi_nor_write() local
2138 u32 page_size = nor->params->page_size; in spi_nor_write()
2140 dev_dbg(nor->dev, "to 0x%08x, len %zd\n", (u32)to, len); in spi_nor_write()
2142 ret = spi_nor_prep_and_lock_pe(nor, to, len); in spi_nor_write()
2165 addr = spi_nor_convert_addr(nor, addr); in spi_nor_write()
2167 ret = spi_nor_lock_device(nor); in spi_nor_write()
2171 ret = spi_nor_write_enable(nor); in spi_nor_write()
2173 spi_nor_unlock_device(nor); in spi_nor_write()
2177 ret = spi_nor_write_data(nor, addr, page_remain, buf + i); in spi_nor_write()
2178 spi_nor_unlock_device(nor); in spi_nor_write()
2183 ret = spi_nor_wait_till_ready(nor); in spi_nor_write()
2191 spi_nor_unlock_and_unprep_pe(nor, to, len); in spi_nor_write()
2196 static int spi_nor_check(struct spi_nor *nor) in spi_nor_check() argument
2198 if (!nor->dev || in spi_nor_check()
2199 (!nor->spimem && !nor->controller_ops) || in spi_nor_check()
2200 (!nor->spimem && nor->controller_ops && in spi_nor_check()
2201 (!nor->controller_ops->read || in spi_nor_check()
2202 !nor->controller_ops->write || in spi_nor_check()
2203 !nor->controller_ops->read_reg || in spi_nor_check()
2204 !nor->controller_ops->write_reg))) { in spi_nor_check()
2205 pr_err("spi-nor: please fill all the necessary fields!\n"); in spi_nor_check()
2209 if (nor->spimem && nor->controller_ops) { in spi_nor_check()
2210 …dev_err(nor->dev, "nor->spimem and nor->controller_ops are mutually exclusive, please set just one… in spi_nor_check()
2293 *@nor: pointer to a 'struct spi_nor'
2298 static int spi_nor_spimem_check_op(struct spi_nor *nor, in spi_nor_spimem_check_op() argument
2308 if (!spi_mem_supports_op(nor->spimem, op)) { in spi_nor_spimem_check_op()
2309 if (nor->params->size > SZ_16M) in spi_nor_spimem_check_op()
2314 if (!spi_mem_supports_op(nor->spimem, op)) in spi_nor_spimem_check_op()
2324 *@nor: pointer to a 'struct spi_nor'
2329 static int spi_nor_spimem_check_readop(struct spi_nor *nor, in spi_nor_spimem_check_readop() argument
2334 spi_nor_spimem_setup_op(nor, &op, read->proto); in spi_nor_spimem_check_readop()
2339 if (spi_nor_protocol_is_dtr(nor->read_proto)) in spi_nor_spimem_check_readop()
2342 return spi_nor_spimem_check_op(nor, &op); in spi_nor_spimem_check_readop()
2348 *@nor: pointer to a 'struct spi_nor'
2353 static int spi_nor_spimem_check_pp(struct spi_nor *nor, in spi_nor_spimem_check_pp() argument
2358 spi_nor_spimem_setup_op(nor, &op, pp->proto); in spi_nor_spimem_check_pp()
2360 return spi_nor_spimem_check_op(nor, &op); in spi_nor_spimem_check_pp()
2366 * @nor: pointer to a 'struct spi_nor'
2371 spi_nor_spimem_adjust_hwcaps(struct spi_nor *nor, u32 *hwcaps) in spi_nor_spimem_adjust_hwcaps() argument
2373 struct spi_nor_flash_parameter *params = nor->params; in spi_nor_spimem_adjust_hwcaps()
2383 if (nor->flags & SNOR_F_BROKEN_RESET) in spi_nor_spimem_adjust_hwcaps()
2394 spi_nor_spimem_check_readop(nor, ¶ms->reads[rdidx])) in spi_nor_spimem_adjust_hwcaps()
2401 if (spi_nor_spimem_check_pp(nor, in spi_nor_spimem_adjust_hwcaps()
2408 * spi_nor_set_erase_type() - set a SPI NOR erase type
2409 * @erase: pointer to a structure that describes a SPI NOR erase type
2424 * spi_nor_mask_erase_type() - mask out a SPI NOR erase type
2425 * @erase: pointer to a structure that describes a SPI NOR erase type
2434 * @map: the erase map of the SPI NOR
2437 * @flash_size: the spi nor flash memory size
2450 int spi_nor_post_bfpt_fixups(struct spi_nor *nor, in spi_nor_post_bfpt_fixups() argument
2456 if (nor->manufacturer && nor->manufacturer->fixups && in spi_nor_post_bfpt_fixups()
2457 nor->manufacturer->fixups->post_bfpt) { in spi_nor_post_bfpt_fixups()
2458 ret = nor->manufacturer->fixups->post_bfpt(nor, bfpt_header, in spi_nor_post_bfpt_fixups()
2464 if (nor->info->fixups && nor->info->fixups->post_bfpt) in spi_nor_post_bfpt_fixups()
2465 return nor->info->fixups->post_bfpt(nor, bfpt_header, bfpt); in spi_nor_post_bfpt_fixups()
2470 static int spi_nor_select_read(struct spi_nor *nor, in spi_nor_select_read() argument
2483 read = &nor->params->reads[cmd]; in spi_nor_select_read()
2484 nor->read_opcode = read->opcode; in spi_nor_select_read()
2485 nor->read_proto = read->proto; in spi_nor_select_read()
2488 * In the SPI NOR framework, we don't need to make the difference in spi_nor_select_read()
2497 nor->read_dummy = read->num_mode_clocks + read->num_wait_states; in spi_nor_select_read()
2501 static int spi_nor_select_pp(struct spi_nor *nor, in spi_nor_select_pp() argument
2514 pp = &nor->params->page_programs[cmd]; in spi_nor_select_pp()
2515 nor->program_opcode = pp->opcode; in spi_nor_select_pp()
2516 nor->write_proto = pp->proto; in spi_nor_select_pp()
2522 * @map: the erase map of the SPI NOR
2581 static int spi_nor_select_erase(struct spi_nor *nor) in spi_nor_select_erase() argument
2583 struct spi_nor_erase_map *map = &nor->params->erase_map; in spi_nor_select_erase()
2585 struct mtd_info *mtd = &nor->mtd; in spi_nor_select_erase()
2586 u32 wanted_size = nor->info->sector_size; in spi_nor_select_erase()
2602 if (spi_nor_has_uniform_erase(nor)) { in spi_nor_select_erase()
2606 nor->erase_opcode = erase->opcode; in spi_nor_select_erase()
2613 * maximum erase sector size. No need to set nor->erase_opcode. in spi_nor_select_erase()
2629 static int spi_nor_default_setup(struct spi_nor *nor, in spi_nor_default_setup() argument
2632 struct spi_nor_flash_parameter *params = nor->params; in spi_nor_default_setup()
2642 if (nor->spimem) { in spi_nor_default_setup()
2648 spi_nor_spimem_adjust_hwcaps(nor, &shared_mask); in spi_nor_default_setup()
2657 dev_dbg(nor->dev, in spi_nor_default_setup()
2664 err = spi_nor_select_read(nor, shared_mask); in spi_nor_default_setup()
2666 dev_dbg(nor->dev, in spi_nor_default_setup()
2672 err = spi_nor_select_pp(nor, shared_mask); in spi_nor_default_setup()
2674 dev_dbg(nor->dev, in spi_nor_default_setup()
2680 err = spi_nor_select_erase(nor); in spi_nor_default_setup()
2682 dev_dbg(nor->dev, in spi_nor_default_setup()
2690 static int spi_nor_set_addr_nbytes(struct spi_nor *nor) in spi_nor_set_addr_nbytes() argument
2692 if (nor->params->addr_nbytes) { in spi_nor_set_addr_nbytes()
2693 nor->addr_nbytes = nor->params->addr_nbytes; in spi_nor_set_addr_nbytes()
2694 } else if (nor->read_proto == SNOR_PROTO_8_8_8_DTR) { in spi_nor_set_addr_nbytes()
2707 nor->addr_nbytes = 4; in spi_nor_set_addr_nbytes()
2708 } else if (nor->info->addr_nbytes) { in spi_nor_set_addr_nbytes()
2709 nor->addr_nbytes = nor->info->addr_nbytes; in spi_nor_set_addr_nbytes()
2711 nor->addr_nbytes = 3; in spi_nor_set_addr_nbytes()
2714 if (nor->addr_nbytes == 3 && nor->params->size > 0x1000000) { in spi_nor_set_addr_nbytes()
2716 nor->addr_nbytes = 4; in spi_nor_set_addr_nbytes()
2719 if (nor->addr_nbytes > SPI_NOR_MAX_ADDR_NBYTES) { in spi_nor_set_addr_nbytes()
2720 dev_dbg(nor->dev, "The number of address bytes is too large: %u\n", in spi_nor_set_addr_nbytes()
2721 nor->addr_nbytes); in spi_nor_set_addr_nbytes()
2726 if (nor->addr_nbytes == 4 && nor->flags & SNOR_F_4B_OPCODES && in spi_nor_set_addr_nbytes()
2727 !(nor->flags & SNOR_F_HAS_4BAIT)) in spi_nor_set_addr_nbytes()
2728 spi_nor_set_4byte_opcodes(nor); in spi_nor_set_addr_nbytes()
2733 static int spi_nor_setup(struct spi_nor *nor, in spi_nor_setup() argument
2738 if (nor->params->setup) in spi_nor_setup()
2739 ret = nor->params->setup(nor, hwcaps); in spi_nor_setup()
2741 ret = spi_nor_default_setup(nor, hwcaps); in spi_nor_setup()
2745 return spi_nor_set_addr_nbytes(nor); in spi_nor_setup()
2751 * @nor: pointer to a 'struct spi_nor'.
2753 static void spi_nor_manufacturer_init_params(struct spi_nor *nor) in spi_nor_manufacturer_init_params() argument
2755 if (nor->manufacturer && nor->manufacturer->fixups && in spi_nor_manufacturer_init_params()
2756 nor->manufacturer->fixups->default_init) in spi_nor_manufacturer_init_params()
2757 nor->manufacturer->fixups->default_init(nor); in spi_nor_manufacturer_init_params()
2759 if (nor->info->fixups && nor->info->fixups->default_init) in spi_nor_manufacturer_init_params()
2760 nor->info->fixups->default_init(nor); in spi_nor_manufacturer_init_params()
2765 * settings based on nor->info->sfdp_flags. This method should be called only by
2770 * @nor: pointer to a 'struct spi_nor'.
2772 static void spi_nor_no_sfdp_init_params(struct spi_nor *nor) in spi_nor_no_sfdp_init_params() argument
2774 struct spi_nor_flash_parameter *params = nor->params; in spi_nor_no_sfdp_init_params()
2776 const u8 no_sfdp_flags = nor->info->no_sfdp_flags; in spi_nor_no_sfdp_init_params()
2830 spi_nor_set_erase_type(&map->erase_type[i], nor->info->sector_size, in spi_nor_no_sfdp_init_params()
2836 * spi_nor_init_flags() - Initialize NOR flags for settings that are not defined
2838 * @nor: pointer to a 'struct spi_nor'
2840 static void spi_nor_init_flags(struct spi_nor *nor) in spi_nor_init_flags() argument
2842 struct device_node *np = spi_nor_get_flash_node(nor); in spi_nor_init_flags()
2843 const u16 flags = nor->info->flags; in spi_nor_init_flags()
2846 nor->flags |= SNOR_F_BROKEN_RESET; in spi_nor_init_flags()
2849 nor->flags |= SNOR_F_NO_WP; in spi_nor_init_flags()
2852 nor->flags |= SNOR_F_SWP_IS_VOLATILE; in spi_nor_init_flags()
2855 nor->flags |= SNOR_F_HAS_LOCK; in spi_nor_init_flags()
2858 nor->flags |= SNOR_F_HAS_SR_TB; in spi_nor_init_flags()
2860 nor->flags |= SNOR_F_HAS_SR_TB_BIT6; in spi_nor_init_flags()
2864 nor->flags |= SNOR_F_HAS_4BIT_BP; in spi_nor_init_flags()
2866 nor->flags |= SNOR_F_HAS_SR_BP3_BIT6; in spi_nor_init_flags()
2870 nor->flags |= SNOR_F_NO_OP_CHIP_ERASE; in spi_nor_init_flags()
2872 if (flags & SPI_NOR_RWW && nor->info->n_banks > 1 && in spi_nor_init_flags()
2873 !nor->controller_ops) in spi_nor_init_flags()
2874 nor->flags |= SNOR_F_RWW; in spi_nor_init_flags()
2878 * spi_nor_init_fixup_flags() - Initialize NOR flags for settings that can not
2883 * @nor: pointer to a 'struct spi_nor'
2885 static void spi_nor_init_fixup_flags(struct spi_nor *nor) in spi_nor_init_fixup_flags() argument
2887 const u8 fixup_flags = nor->info->fixup_flags; in spi_nor_init_fixup_flags()
2890 nor->flags |= SNOR_F_4B_OPCODES; in spi_nor_init_fixup_flags()
2893 nor->flags |= SNOR_F_IO_MODE_EN_VOLATILE; in spi_nor_init_fixup_flags()
2898 * @nor: pointer to a 'struct spi_nor'
2904 static int spi_nor_late_init_params(struct spi_nor *nor) in spi_nor_late_init_params() argument
2906 struct spi_nor_flash_parameter *params = nor->params; in spi_nor_late_init_params()
2909 if (nor->manufacturer && nor->manufacturer->fixups && in spi_nor_late_init_params()
2910 nor->manufacturer->fixups->late_init) { in spi_nor_late_init_params()
2911 ret = nor->manufacturer->fixups->late_init(nor); in spi_nor_late_init_params()
2916 if (nor->info->fixups && nor->info->fixups->late_init) { in spi_nor_late_init_params()
2917 ret = nor->info->fixups->late_init(nor); in spi_nor_late_init_params()
2926 spi_nor_init_flags(nor); in spi_nor_late_init_params()
2927 spi_nor_init_fixup_flags(nor); in spi_nor_late_init_params()
2930 * NOR protection support. When locking_ops are not provided, we pick in spi_nor_late_init_params()
2933 if (nor->flags & SNOR_F_HAS_LOCK && !nor->params->locking_ops) in spi_nor_late_init_params()
2934 spi_nor_init_default_locking_ops(nor); in spi_nor_late_init_params()
2936 if (nor->info->n_banks > 1) in spi_nor_late_init_params()
2937 params->bank_size = div64_u64(params->size, nor->info->n_banks); in spi_nor_late_init_params()
2945 * @nor: pointer to a 'struct spi_nor'.
2950 static void spi_nor_sfdp_init_params_deprecated(struct spi_nor *nor) in spi_nor_sfdp_init_params_deprecated() argument
2954 memcpy(&sfdp_params, nor->params, sizeof(sfdp_params)); in spi_nor_sfdp_init_params_deprecated()
2956 if (spi_nor_parse_sfdp(nor)) { in spi_nor_sfdp_init_params_deprecated()
2957 memcpy(nor->params, &sfdp_params, sizeof(*nor->params)); in spi_nor_sfdp_init_params_deprecated()
2958 nor->flags &= ~SNOR_F_4B_OPCODES; in spi_nor_sfdp_init_params_deprecated()
2965 * @nor: pointer to a 'struct spi_nor'.
2971 static void spi_nor_init_params_deprecated(struct spi_nor *nor) in spi_nor_init_params_deprecated() argument
2973 spi_nor_no_sfdp_init_params(nor); in spi_nor_init_params_deprecated()
2975 spi_nor_manufacturer_init_params(nor); in spi_nor_init_params_deprecated()
2977 if (nor->info->no_sfdp_flags & (SPI_NOR_DUAL_READ | in spi_nor_init_params_deprecated()
2981 spi_nor_sfdp_init_params_deprecated(nor); in spi_nor_init_params_deprecated()
2988 * @nor: pointer to a 'struct spi_nor'.
2990 static void spi_nor_init_default_params(struct spi_nor *nor) in spi_nor_init_default_params() argument
2992 struct spi_nor_flash_parameter *params = nor->params; in spi_nor_init_default_params()
2993 const struct flash_info *info = nor->info; in spi_nor_init_default_params()
2994 struct device_node *np = spi_nor_get_flash_node(nor); in spi_nor_init_default_params()
3000 nor->flags |= SNOR_F_HAS_16BIT_SR; in spi_nor_init_default_params()
3002 /* Set SPI NOR sizes. */ in spi_nor_init_default_params()
3041 * @nor: pointer to a 'struct spi_nor'.
3047 * based on nor->info data:
3076 static int spi_nor_init_params(struct spi_nor *nor) in spi_nor_init_params() argument
3080 nor->params = devm_kzalloc(nor->dev, sizeof(*nor->params), GFP_KERNEL); in spi_nor_init_params()
3081 if (!nor->params) in spi_nor_init_params()
3084 spi_nor_init_default_params(nor); in spi_nor_init_params()
3086 if (nor->info->parse_sfdp) { in spi_nor_init_params()
3087 ret = spi_nor_parse_sfdp(nor); in spi_nor_init_params()
3089 …dev_err(nor->dev, "BFPT parsing failed. Please consider using SPI_NOR_SKIP_SFDP when declaring the… in spi_nor_init_params()
3092 } else if (nor->info->no_sfdp_flags & SPI_NOR_SKIP_SFDP) { in spi_nor_init_params()
3093 spi_nor_no_sfdp_init_params(nor); in spi_nor_init_params()
3095 spi_nor_init_params_deprecated(nor); in spi_nor_init_params()
3098 return spi_nor_late_init_params(nor); in spi_nor_init_params()
3102 * @nor: pointer to a 'struct spi_nor'
3107 static int spi_nor_set_octal_dtr(struct spi_nor *nor, bool enable) in spi_nor_set_octal_dtr() argument
3111 if (!nor->params->set_octal_dtr) in spi_nor_set_octal_dtr()
3114 if (!(nor->read_proto == SNOR_PROTO_8_8_8_DTR && in spi_nor_set_octal_dtr()
3115 nor->write_proto == SNOR_PROTO_8_8_8_DTR)) in spi_nor_set_octal_dtr()
3118 if (!(nor->flags & SNOR_F_IO_MODE_EN_VOLATILE)) in spi_nor_set_octal_dtr()
3121 ret = nor->params->set_octal_dtr(nor, enable); in spi_nor_set_octal_dtr()
3126 nor->reg_proto = SNOR_PROTO_8_8_8_DTR; in spi_nor_set_octal_dtr()
3128 nor->reg_proto = SNOR_PROTO_1_1_1; in spi_nor_set_octal_dtr()
3135 * @nor: pointer to a 'struct spi_nor'
3139 static int spi_nor_quad_enable(struct spi_nor *nor) in spi_nor_quad_enable() argument
3141 if (!nor->params->quad_enable) in spi_nor_quad_enable()
3144 if (!(spi_nor_get_protocol_width(nor->read_proto) == 4 || in spi_nor_quad_enable()
3145 spi_nor_get_protocol_width(nor->write_proto) == 4)) in spi_nor_quad_enable()
3148 return nor->params->quad_enable(nor); in spi_nor_quad_enable()
3153 * @nor: pointer to a 'struct spi_nor'.
3158 int spi_nor_set_4byte_addr_mode(struct spi_nor *nor, bool enable) in spi_nor_set_4byte_addr_mode() argument
3160 struct spi_nor_flash_parameter *params = nor->params; in spi_nor_set_4byte_addr_mode()
3163 ret = params->set_4byte_addr_mode(nor, enable); in spi_nor_set_4byte_addr_mode()
3178 static int spi_nor_init(struct spi_nor *nor) in spi_nor_init() argument
3182 err = spi_nor_set_octal_dtr(nor, true); in spi_nor_init()
3184 dev_dbg(nor->dev, "octal mode not supported\n"); in spi_nor_init()
3188 err = spi_nor_quad_enable(nor); in spi_nor_init()
3190 dev_dbg(nor->dev, "quad mode not supported\n"); in spi_nor_init()
3195 * Some SPI NOR flashes are write protected by default after a power-on in spi_nor_init()
3206 nor->flags & SNOR_F_SWP_IS_VOLATILE)) in spi_nor_init()
3207 spi_nor_try_unlock_all(nor); in spi_nor_init()
3209 if (nor->addr_nbytes == 4 && in spi_nor_init()
3210 nor->read_proto != SNOR_PROTO_8_8_8_DTR && in spi_nor_init()
3211 !(nor->flags & SNOR_F_4B_OPCODES)) { in spi_nor_init()
3219 WARN_ONCE(nor->flags & SNOR_F_BROKEN_RESET, in spi_nor_init()
3221 err = spi_nor_set_4byte_addr_mode(nor, true); in spi_nor_init()
3231 * @nor: pointer to 'struct spi_nor'
3244 static void spi_nor_soft_reset(struct spi_nor *nor) in spi_nor_soft_reset() argument
3251 spi_nor_spimem_setup_op(nor, &op, nor->reg_proto); in spi_nor_soft_reset()
3253 ret = spi_mem_exec_op(nor->spimem, &op); in spi_nor_soft_reset()
3255 dev_warn(nor->dev, "Software reset failed: %d\n", ret); in spi_nor_soft_reset()
3261 spi_nor_spimem_setup_op(nor, &op, nor->reg_proto); in spi_nor_soft_reset()
3263 ret = spi_mem_exec_op(nor->spimem, &op); in spi_nor_soft_reset()
3265 dev_warn(nor->dev, "Software reset failed: %d\n", ret); in spi_nor_soft_reset()
3280 struct spi_nor *nor = mtd_to_spi_nor(mtd); in spi_nor_suspend() local
3284 ret = spi_nor_set_octal_dtr(nor, false); in spi_nor_suspend()
3286 dev_err(nor->dev, "suspend() failed\n"); in spi_nor_suspend()
3294 struct spi_nor *nor = mtd_to_spi_nor(mtd); in spi_nor_resume() local
3295 struct device *dev = nor->dev; in spi_nor_resume()
3298 /* re-initialize the nor chip */ in spi_nor_resume()
3299 ret = spi_nor_init(nor); in spi_nor_resume()
3307 struct spi_nor *nor = mtd_to_spi_nor(master); in spi_nor_get_device() local
3310 if (nor->spimem) in spi_nor_get_device()
3311 dev = nor->spimem->spi->controller->dev.parent; in spi_nor_get_device()
3313 dev = nor->dev; in spi_nor_get_device()
3324 struct spi_nor *nor = mtd_to_spi_nor(master); in spi_nor_put_device() local
3327 if (nor->spimem) in spi_nor_put_device()
3328 dev = nor->spimem->spi->controller->dev.parent; in spi_nor_put_device()
3330 dev = nor->dev; in spi_nor_put_device()
3335 static void spi_nor_restore(struct spi_nor *nor) in spi_nor_restore() argument
3340 if (nor->addr_nbytes == 4 && !(nor->flags & SNOR_F_4B_OPCODES) && in spi_nor_restore()
3341 nor->flags & SNOR_F_BROKEN_RESET) { in spi_nor_restore()
3342 ret = spi_nor_set_4byte_addr_mode(nor, false); in spi_nor_restore()
3349 dev_err(nor->dev, "Failed to exit 4-byte address mode, err = %d\n", ret); in spi_nor_restore()
3352 if (nor->flags & SNOR_F_SOFT_RESET) in spi_nor_restore()
3353 spi_nor_soft_reset(nor); in spi_nor_restore()
3356 static const struct flash_info *spi_nor_match_name(struct spi_nor *nor, in spi_nor_match_name() argument
3364 nor->manufacturer = manufacturers[i]; in spi_nor_match_name()
3373 static const struct flash_info *spi_nor_get_flash_info(struct spi_nor *nor, in spi_nor_get_flash_info() argument
3379 info = spi_nor_match_name(nor, name); in spi_nor_get_flash_info()
3382 return spi_nor_detect(nor); in spi_nor_get_flash_info()
3391 jinfo = spi_nor_detect(nor); in spi_nor_get_flash_info()
3402 dev_warn(nor->dev, "found %s, expected %s\n", in spi_nor_get_flash_info()
3411 static void spi_nor_set_mtd_info(struct spi_nor *nor) in spi_nor_set_mtd_info() argument
3413 struct mtd_info *mtd = &nor->mtd; in spi_nor_set_mtd_info()
3414 struct device *dev = nor->dev; in spi_nor_set_mtd_info()
3416 spi_nor_set_mtd_locking_ops(nor); in spi_nor_set_mtd_info()
3417 spi_nor_set_mtd_otp_ops(nor); in spi_nor_set_mtd_info()
3424 /* Unset BIT_WRITEABLE to enable JFFS2 write buffer for ECC'd NOR */ in spi_nor_set_mtd_info()
3425 if (nor->flags & SNOR_F_ECC) in spi_nor_set_mtd_info()
3427 if (nor->info->flags & SPI_NOR_NO_ERASE) in spi_nor_set_mtd_info()
3431 mtd->writesize = nor->params->writesize; in spi_nor_set_mtd_info()
3432 mtd->writebufsize = nor->params->page_size; in spi_nor_set_mtd_info()
3433 mtd->size = nor->params->size; in spi_nor_set_mtd_info()
3444 static int spi_nor_hw_reset(struct spi_nor *nor) in spi_nor_hw_reset() argument
3448 reset = devm_gpiod_get_optional(nor->dev, "reset", GPIOD_OUT_LOW); in spi_nor_hw_reset()
3465 int spi_nor_scan(struct spi_nor *nor, const char *name, in spi_nor_scan() argument
3469 struct device *dev = nor->dev; in spi_nor_scan()
3470 struct mtd_info *mtd = &nor->mtd; in spi_nor_scan()
3474 ret = spi_nor_check(nor); in spi_nor_scan()
3479 nor->reg_proto = SNOR_PROTO_1_1_1; in spi_nor_scan()
3480 nor->read_proto = SNOR_PROTO_1_1_1; in spi_nor_scan()
3481 nor->write_proto = SNOR_PROTO_1_1_1; in spi_nor_scan()
3487 * nor->params->page_size turns out to be greater than PAGE_SIZE (which in spi_nor_scan()
3488 * shouldn't happen before long since NOR pages are usually less in spi_nor_scan()
3491 nor->bouncebuf_size = PAGE_SIZE; in spi_nor_scan()
3492 nor->bouncebuf = devm_kmalloc(dev, nor->bouncebuf_size, in spi_nor_scan()
3494 if (!nor->bouncebuf) in spi_nor_scan()
3497 ret = spi_nor_hw_reset(nor); in spi_nor_scan()
3501 info = spi_nor_get_flash_info(nor, name); in spi_nor_scan()
3505 nor->info = info; in spi_nor_scan()
3507 mutex_init(&nor->lock); in spi_nor_scan()
3510 ret = spi_nor_init_params(nor); in spi_nor_scan()
3514 if (spi_nor_use_parallel_locking(nor)) in spi_nor_scan()
3515 init_waitqueue_head(&nor->rww.wait); in spi_nor_scan()
3524 ret = spi_nor_setup(nor, hwcaps); in spi_nor_scan()
3529 ret = spi_nor_init(nor); in spi_nor_scan()
3534 spi_nor_set_mtd_info(nor); in spi_nor_scan()
3559 static int spi_nor_create_read_dirmap(struct spi_nor *nor) in spi_nor_create_read_dirmap() argument
3562 .op_tmpl = SPI_MEM_OP(SPI_MEM_OP_CMD(nor->read_opcode, 0), in spi_nor_create_read_dirmap()
3563 SPI_MEM_OP_ADDR(nor->addr_nbytes, 0, 0), in spi_nor_create_read_dirmap()
3564 SPI_MEM_OP_DUMMY(nor->read_dummy, 0), in spi_nor_create_read_dirmap()
3567 .length = nor->params->size, in spi_nor_create_read_dirmap()
3571 spi_nor_spimem_setup_op(nor, op, nor->read_proto); in spi_nor_create_read_dirmap()
3574 op->dummy.nbytes = (nor->read_dummy * op->dummy.buswidth) / 8; in spi_nor_create_read_dirmap()
3575 if (spi_nor_protocol_is_dtr(nor->read_proto)) in spi_nor_create_read_dirmap()
3583 op->data.buswidth = spi_nor_get_protocol_data_nbits(nor->read_proto); in spi_nor_create_read_dirmap()
3585 nor->dirmap.rdesc = devm_spi_mem_dirmap_create(nor->dev, nor->spimem, in spi_nor_create_read_dirmap()
3587 return PTR_ERR_OR_ZERO(nor->dirmap.rdesc); in spi_nor_create_read_dirmap()
3590 static int spi_nor_create_write_dirmap(struct spi_nor *nor) in spi_nor_create_write_dirmap() argument
3593 .op_tmpl = SPI_MEM_OP(SPI_MEM_OP_CMD(nor->program_opcode, 0), in spi_nor_create_write_dirmap()
3594 SPI_MEM_OP_ADDR(nor->addr_nbytes, 0, 0), in spi_nor_create_write_dirmap()
3598 .length = nor->params->size, in spi_nor_create_write_dirmap()
3602 if (nor->program_opcode == SPINOR_OP_AAI_WP && nor->sst_write_second) in spi_nor_create_write_dirmap()
3605 spi_nor_spimem_setup_op(nor, op, nor->write_proto); in spi_nor_create_write_dirmap()
3612 op->data.buswidth = spi_nor_get_protocol_data_nbits(nor->write_proto); in spi_nor_create_write_dirmap()
3614 nor->dirmap.wdesc = devm_spi_mem_dirmap_create(nor->dev, nor->spimem, in spi_nor_create_write_dirmap()
3616 return PTR_ERR_OR_ZERO(nor->dirmap.wdesc); in spi_nor_create_write_dirmap()
3623 struct spi_nor *nor; in spi_nor_probe() local
3632 nor = devm_kzalloc(&spi->dev, sizeof(*nor), GFP_KERNEL); in spi_nor_probe()
3633 if (!nor) in spi_nor_probe()
3636 nor->spimem = spimem; in spi_nor_probe()
3637 nor->dev = &spi->dev; in spi_nor_probe()
3638 spi_nor_set_flash_node(nor, spi->dev.of_node); in spi_nor_probe()
3640 spi_mem_set_drvdata(spimem, nor); in spi_nor_probe()
3643 nor->mtd.name = data->name; in spi_nor_probe()
3645 if (!nor->mtd.name) in spi_nor_probe()
3646 nor->mtd.name = spi_mem_get_name(spimem); in spi_nor_probe()
3656 else if (!strcmp(spi->modalias, "spi-nor")) in spi_nor_probe()
3661 ret = spi_nor_scan(nor, flash_name, &hwcaps); in spi_nor_probe()
3665 spi_nor_debugfs_register(nor); in spi_nor_probe()
3670 * a NOR we don't end up with buffer overflows. in spi_nor_probe()
3672 if (nor->params->page_size > PAGE_SIZE) { in spi_nor_probe()
3673 nor->bouncebuf_size = nor->params->page_size; in spi_nor_probe()
3674 devm_kfree(nor->dev, nor->bouncebuf); in spi_nor_probe()
3675 nor->bouncebuf = devm_kmalloc(nor->dev, in spi_nor_probe()
3676 nor->bouncebuf_size, in spi_nor_probe()
3678 if (!nor->bouncebuf) in spi_nor_probe()
3682 ret = spi_nor_create_read_dirmap(nor); in spi_nor_probe()
3686 ret = spi_nor_create_write_dirmap(nor); in spi_nor_probe()
3690 return mtd_device_register(&nor->mtd, data ? data->parts : NULL, in spi_nor_probe()
3696 struct spi_nor *nor = spi_mem_get_drvdata(spimem); in spi_nor_remove() local
3698 spi_nor_restore(nor); in spi_nor_remove()
3701 return mtd_device_unregister(&nor->mtd); in spi_nor_remove()
3706 struct spi_nor *nor = spi_mem_get_drvdata(spimem); in spi_nor_shutdown() local
3708 spi_nor_restore(nor); in spi_nor_shutdown()
3717 * encourage new users to add support to the spi-nor library, and simply bind
3718 * against a generic string here (e.g., "jedec,spi-nor").
3725 * Allow non-DT platform devices to bind to the "spi-nor" modalias, and
3729 {"spi-nor"},
3733 * them with "spi-nor" in platform data.
3738 * Entries that were used in DTs without "jedec,spi-nor" fallback and
3770 * Generic compatibility for SPI NOR that can be identified by the
3773 { .compatible = "jedec,spi-nor" },
3786 .name = "spi-nor",
3813 MODULE_DESCRIPTION("framework for SPI NOR");