Lines Matching +full:spi +full:- +full:nor
1 // SPDX-License-Identifier: GPL-2.0
17 #include <linux/mtd/spi-nor.h>
23 #include <linux/spi/flash.h>
30 * For everything but full-chip erase; probably could be much smaller, but kept
36 * For full-chip erase, calibrated to a 2MB flash (M25P16); should be scaled up
47 * spi_nor_get_cmd_ext() - Get the command opcode extension based on the
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()
62 return ~op->cmd.opcode; in spi_nor_get_cmd_ext()
65 return op->cmd.opcode; in spi_nor_get_cmd_ext()
68 dev_err(nor->dev, "Unknown command extension type\n"); in spi_nor_get_cmd_ext()
74 * spi_nor_spimem_setup_op() - Set up common properties of a spi-mem op.
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
86 op->cmd.buswidth = spi_nor_get_protocol_inst_nbits(proto); in spi_nor_spimem_setup_op()
88 if (op->addr.nbytes) in spi_nor_spimem_setup_op()
89 op->addr.buswidth = spi_nor_get_protocol_addr_nbits(proto); in spi_nor_spimem_setup_op()
91 if (op->dummy.nbytes) in spi_nor_spimem_setup_op()
92 op->dummy.buswidth = spi_nor_get_protocol_addr_nbits(proto); in spi_nor_spimem_setup_op()
94 if (op->data.nbytes) in spi_nor_spimem_setup_op()
95 op->data.buswidth = spi_nor_get_protocol_data_nbits(proto); in spi_nor_spimem_setup_op()
101 * something like 4S-4D-4D, but SPI NOR can't. So, set all 4 in spi_nor_spimem_setup_op()
104 op->cmd.dtr = true; in spi_nor_spimem_setup_op()
105 op->addr.dtr = true; in spi_nor_spimem_setup_op()
106 op->dummy.dtr = true; in spi_nor_spimem_setup_op()
107 op->data.dtr = true; in spi_nor_spimem_setup_op()
110 op->dummy.nbytes *= 2; in spi_nor_spimem_setup_op()
112 ext = spi_nor_get_cmd_ext(nor, op); in spi_nor_spimem_setup_op()
113 op->cmd.opcode = (op->cmd.opcode << 8) | ext; in spi_nor_spimem_setup_op()
114 op->cmd.nbytes = 2; in spi_nor_spimem_setup_op()
119 * spi_nor_spimem_bounce() - check if a bounce buffer is needed for the data
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
130 /* op->data.buf.in occupies the same memory as op->data.buf.out */ in spi_nor_spimem_bounce()
131 if (object_is_on_stack(op->data.buf.in) || in spi_nor_spimem_bounce()
132 !virt_addr_valid(op->data.buf.in)) { in spi_nor_spimem_bounce()
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()
143 * spi_nor_spimem_exec_op() - execute a memory operation
144 * @nor: pointer to 'struct spi_nor'
147 * Return: 0 on success, -error otherwise.
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()
164 return -EOPNOTSUPP; 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()
173 return -EOPNOTSUPP; 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()
181 return -EOPNOTSUPP; in spi_nor_controller_ops_erase()
183 return nor->controller_ops->erase(nor, offs); in spi_nor_controller_ops_erase()
187 * spi_nor_spimem_read_data() - read data from flash's memory region via
188 * spi-mem
189 * @nor: pointer to 'struct spi_nor'
194 * Return: number of bytes read successfully, -errno otherwise
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()
234 * spi_nor_read_data() - read data from flash memory
235 * @nor: pointer to 'struct spi_nor'
240 * Return: number of bytes read successfully, -errno otherwise
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()
251 * spi_nor_spimem_write_data() - write data to flash memory via
252 * spi-mem
253 * @nor: pointer to 'struct spi_nor'
258 * Return: number of bytes written successfully, -errno otherwise
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()
293 * spi_nor_write_data() - write data to flash memory
294 * @nor: pointer to 'struct spi_nor'
299 * Return: number of bytes written successfully, -errno otherwise
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()
311 * spi_nor_read_any_reg() - read any register from flash memory, nonvolatile or
313 * @nor: pointer to 'struct spi_nor'.
314 * @op: SPI memory operation. op->data.buf must be DMA-able.
315 * @proto: SPI protocol to use for the register operation.
317 * Return: zero on success, -errno otherwise
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()
323 return -EOPNOTSUPP; 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()
330 * spi_nor_write_any_volatile_reg() - write any volatile register to flash
332 * @nor: pointer to 'struct spi_nor'
333 * @op: SPI memory operation. op->data.buf must be DMA-able.
334 * @proto: SPI protocol to use for the register operation.
339 * Return: zero on success, -errno otherwise
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()
347 return -EOPNOTSUPP; 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()
357 * spi_nor_write_enable() - Set write enable latch with Write Enable command.
358 * @nor: pointer to 'struct spi_nor'.
360 * Return: 0 on success, -errno otherwise.
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()
384 * spi_nor_write_disable() - Send Write Disable instruction to the chip.
385 * @nor: pointer to 'struct spi_nor'.
387 * Return: 0 on success, -errno otherwise.
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()
411 * spi_nor_read_id() - Read the JEDEC ID.
412 * @nor: pointer to 'struct spi_nor'.
417 * @id: pointer to a DMA-able buffer where the value of the JEDEC ID
419 * @proto: the SPI protocol for register operation.
421 * Return: 0 on success, -errno otherwise.
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()
442 * spi_nor_read_sr() - Read the Status Register.
443 * @nor: pointer to 'struct spi_nor'.
444 * @sr: pointer to a DMA-able buffer where the value of the
447 * Return: 0 on success, -errno otherwise.
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()
481 * spi_nor_read_cr() - Read the Configuration Register using the
483 * @nor: pointer to 'struct spi_nor'
484 * @cr: pointer to a DMA-able buffer where the value of the
487 * Return: 0 on success, -errno otherwise.
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()
511 * spi_nor_set_4byte_addr_mode_en4b_ex4b() - Enter/Exit 4-byte address mode
514 * @nor: pointer to 'struct spi_nor'.
515 * @enable: true to enter the 4-byte address mode, false to exit the 4-byte
518 * Return: 0 on success, -errno otherwise.
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()
544 * spi_nor_set_4byte_addr_mode_wren_en4b_ex4b() - Set 4-byte address mode using
547 * @nor: pointer to 'struct spi_nor'.
548 * @enable: true to enter the 4-byte address mode, false to exit the 4-byte
551 * Return: 0 on success, -errno otherwise.
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()
569 * spi_nor_set_4byte_addr_mode_brwr() - Set 4-byte address mode using
571 * @nor: pointer to 'struct spi_nor'.
572 * @enable: true to enter the 4-byte address mode, false to exit the 4-byte
575 * 8-bit volatile bank register used to define A[30:A24] bits. MSB (bit[7]) is
576 * used to enable/disable 4-byte address mode. When MSB is set to ‘1’, 4-byte
580 * Return: 0 on success, -errno otherwise.
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()
606 * spi_nor_sr_ready() - Query the Status Register to see if the flash is ready
608 * @nor: pointer to 'struct spi_nor'.
610 * Return: 1 if ready, 0 if not ready, -errno on errors.
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()
624 * spi_nor_use_parallel_locking() - Checks if RWW locking scheme shall be used
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()
638 int ret = -EAGAIN; in spi_nor_rww_start_rdst()
640 mutex_lock(&nor->lock); in spi_nor_rww_start_rdst()
642 if (rww->ongoing_io || rww->ongoing_rd) in spi_nor_rww_start_rdst()
645 rww->ongoing_io = true; in spi_nor_rww_start_rdst()
646 rww->ongoing_rd = true; 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()
660 rww->ongoing_io = false; in spi_nor_rww_end_rdst()
661 rww->ongoing_rd = false; 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()
683 * spi_nor_ready() - Query the flash to see if it is ready for new commands.
684 * @nor: pointer to 'struct spi_nor'.
686 * Return: 1 if ready, 0 if not ready, -errno on errors.
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()
708 * spi_nor_wait_till_ready_with_timeout() - Service routine to read the
710 * @nor: pointer to "struct spi_nor".
713 * Return: 0 on success, -errno otherwise.
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()
738 return -ETIMEDOUT; in spi_nor_wait_till_ready_with_timeout()
742 * spi_nor_wait_till_ready() - Wait for a predefined amount of time for the
744 * @nor: pointer to "struct spi_nor".
746 * Return: 0 on success, -errno otherwise.
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()
755 * spi_nor_global_block_unlock() - Unlock Global Block Protection.
756 * @nor: pointer to 'struct spi_nor'.
758 * Return: 0 on success, -errno otherwise.
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()
788 * spi_nor_write_sr() - Write the Status Register.
789 * @nor: pointer to 'struct spi_nor'.
790 * @sr: pointer to DMA-able buffer to write to the Status Register.
793 * Return: 0 on success, -errno otherwise.
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()
823 * spi_nor_write_sr1_and_check() - Write one byte to the Status Register 1 and
825 * @nor: pointer to a 'struct spi_nor'.
828 * Return: 0 on success, -errno otherwise.
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()
846 return -EIO; in spi_nor_write_sr1_and_check()
853 * spi_nor_write_16bit_sr_and_check() - Write the Status Register 1 and the
855 * Register 1 match the received value, and that the 16-bit Write did not
857 * @nor: pointer to a 'struct spi_nor'.
860 * Return: 0 on success, -errno otherwise.
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()
886 * bits 22:20, the 16-bit Write Status (01h) command is 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()
907 return -EIO; 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()
921 return -EIO; in spi_nor_write_16bit_sr_and_check()
928 * spi_nor_write_16bit_cr_and_check() - Write the Status Register 1 and the
930 * Configuration Register match the received value, and that the 16-bit Write
932 * @nor: pointer to a 'struct spi_nor'.
935 * Return: 0 on success, -errno otherwise.
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()
962 return -EIO; 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()
974 return -EIO; in spi_nor_write_16bit_cr_and_check()
981 * spi_nor_write_sr_and_check() - Write the Status Register 1 and ensure that
984 * @nor: pointer to a 'struct spi_nor'.
987 * Return: 0 on success, -errno otherwise.
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()
998 * spi_nor_write_sr2() - Write the Status Register 2 using the
1000 * @nor: pointer to 'struct spi_nor'.
1001 * @sr2: pointer to DMA-able buffer to write to the Status Register 2.
1003 * Return: 0 on success, -errno otherwise.
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()
1033 * spi_nor_read_sr2() - Read the Status Register 2 using the
1035 * @nor: pointer to 'struct spi_nor'.
1036 * @sr2: pointer to DMA-able buffer where the value of the
1039 * Return: 0 on success, -errno otherwise.
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()
1063 * spi_nor_erase_die() - Erase the entire die.
1064 * @nor: pointer to 'struct spi_nor'.
1068 * Return: 0 on success, -errno otherwise.
1070 static int spi_nor_erase_die(struct spi_nor *nor, loff_t addr, size_t die_size) in spi_nor_erase_die() argument
1072 bool multi_die = nor->mtd.size != die_size; in spi_nor_erase_die()
1075 dev_dbg(nor->dev, " %lldKiB\n", (long long)(die_size >> 10)); in spi_nor_erase_die()
1077 if (nor->spimem) { in spi_nor_erase_die()
1079 SPI_NOR_DIE_ERASE_OP(nor->params->die_erase_opcode, in spi_nor_erase_die()
1080 nor->addr_nbytes, addr, multi_die); in spi_nor_erase_die()
1082 spi_nor_spimem_setup_op(nor, &op, nor->reg_proto); in spi_nor_erase_die()
1084 ret = spi_mem_exec_op(nor->spimem, &op); in spi_nor_erase_die()
1087 return -EOPNOTSUPP; in spi_nor_erase_die()
1089 ret = spi_nor_controller_ops_write_reg(nor, in spi_nor_erase_die()
1095 dev_dbg(nor->dev, "error %d erasing chip\n", ret); in spi_nor_erase_die()
1159 static bool spi_nor_has_uniform_erase(const struct spi_nor *nor) in spi_nor_has_uniform_erase() argument
1161 return !!nor->params->erase_map.uniform_erase_type; in spi_nor_has_uniform_erase()
1164 static void spi_nor_set_4byte_opcodes(struct spi_nor *nor) in spi_nor_set_4byte_opcodes() argument
1166 nor->read_opcode = spi_nor_convert_3to4_read(nor->read_opcode); in spi_nor_set_4byte_opcodes()
1167 nor->program_opcode = spi_nor_convert_3to4_program(nor->program_opcode); in spi_nor_set_4byte_opcodes()
1168 nor->erase_opcode = spi_nor_convert_3to4_erase(nor->erase_opcode); in spi_nor_set_4byte_opcodes()
1170 if (!spi_nor_has_uniform_erase(nor)) { in spi_nor_set_4byte_opcodes()
1171 struct spi_nor_erase_map *map = &nor->params->erase_map; in spi_nor_set_4byte_opcodes()
1176 erase = &map->erase_type[i]; in spi_nor_set_4byte_opcodes()
1177 erase->opcode = in spi_nor_set_4byte_opcodes()
1178 spi_nor_convert_3to4_erase(erase->opcode); in spi_nor_set_4byte_opcodes()
1183 static int spi_nor_prep(struct spi_nor *nor) in spi_nor_prep() argument
1187 if (nor->controller_ops && nor->controller_ops->prepare) in spi_nor_prep()
1188 ret = nor->controller_ops->prepare(nor); in spi_nor_prep()
1193 static void spi_nor_unprep(struct spi_nor *nor) in spi_nor_unprep() argument
1195 if (nor->controller_ops && nor->controller_ops->unprepare) in spi_nor_unprep()
1196 nor->controller_ops->unprepare(nor); in spi_nor_unprep()
1204 *last = DIV_ROUND_DOWN_ULL(start + len - 1, bank_size); in spi_nor_offset_to_banks()
1208 static bool spi_nor_rww_start_io(struct spi_nor *nor) in spi_nor_rww_start_io() argument
1210 struct spi_nor_rww *rww = &nor->rww; in spi_nor_rww_start_io()
1213 mutex_lock(&nor->lock); in spi_nor_rww_start_io()
1215 if (rww->ongoing_io) in spi_nor_rww_start_io()
1218 rww->ongoing_io = true; in spi_nor_rww_start_io()
1222 mutex_unlock(&nor->lock); in spi_nor_rww_start_io()
1226 static void spi_nor_rww_end_io(struct spi_nor *nor) in spi_nor_rww_end_io() argument
1228 mutex_lock(&nor->lock); in spi_nor_rww_end_io()
1229 nor->rww.ongoing_io = false; in spi_nor_rww_end_io()
1230 mutex_unlock(&nor->lock); in spi_nor_rww_end_io()
1233 static int spi_nor_lock_device(struct spi_nor *nor) in spi_nor_lock_device() argument
1235 if (!spi_nor_use_parallel_locking(nor)) in spi_nor_lock_device()
1238 return wait_event_killable(nor->rww.wait, spi_nor_rww_start_io(nor)); in spi_nor_lock_device()
1241 static void spi_nor_unlock_device(struct spi_nor *nor) in spi_nor_unlock_device() argument
1243 if (spi_nor_use_parallel_locking(nor)) { in spi_nor_unlock_device()
1244 spi_nor_rww_end_io(nor); in spi_nor_unlock_device()
1245 wake_up(&nor->rww.wait); in spi_nor_unlock_device()
1250 static bool spi_nor_rww_start_exclusive(struct spi_nor *nor) in spi_nor_rww_start_exclusive() argument
1252 struct spi_nor_rww *rww = &nor->rww; in spi_nor_rww_start_exclusive()
1255 mutex_lock(&nor->lock); in spi_nor_rww_start_exclusive()
1257 if (rww->ongoing_io || rww->ongoing_rd || rww->ongoing_pe) in spi_nor_rww_start_exclusive()
1260 rww->ongoing_io = true; in spi_nor_rww_start_exclusive()
1261 rww->ongoing_rd = true; in spi_nor_rww_start_exclusive()
1262 rww->ongoing_pe = true; in spi_nor_rww_start_exclusive()
1266 mutex_unlock(&nor->lock); in spi_nor_rww_start_exclusive()
1270 static void spi_nor_rww_end_exclusive(struct spi_nor *nor) in spi_nor_rww_end_exclusive() argument
1272 struct spi_nor_rww *rww = &nor->rww; in spi_nor_rww_end_exclusive()
1274 mutex_lock(&nor->lock); in spi_nor_rww_end_exclusive()
1275 rww->ongoing_io = false; in spi_nor_rww_end_exclusive()
1276 rww->ongoing_rd = false; in spi_nor_rww_end_exclusive()
1277 rww->ongoing_pe = false; in spi_nor_rww_end_exclusive()
1278 mutex_unlock(&nor->lock); in spi_nor_rww_end_exclusive()
1281 int spi_nor_prep_and_lock(struct spi_nor *nor) in spi_nor_prep_and_lock() argument
1285 ret = spi_nor_prep(nor); in spi_nor_prep_and_lock()
1289 if (!spi_nor_use_parallel_locking(nor)) in spi_nor_prep_and_lock()
1290 mutex_lock(&nor->lock); in spi_nor_prep_and_lock()
1292 ret = wait_event_killable(nor->rww.wait, in spi_nor_prep_and_lock()
1293 spi_nor_rww_start_exclusive(nor)); in spi_nor_prep_and_lock()
1298 void spi_nor_unlock_and_unprep(struct spi_nor *nor) in spi_nor_unlock_and_unprep() argument
1300 if (!spi_nor_use_parallel_locking(nor)) { in spi_nor_unlock_and_unprep()
1301 mutex_unlock(&nor->lock); in spi_nor_unlock_and_unprep()
1303 spi_nor_rww_end_exclusive(nor); in spi_nor_unlock_and_unprep()
1304 wake_up(&nor->rww.wait); in spi_nor_unlock_and_unprep()
1307 spi_nor_unprep(nor); in spi_nor_unlock_and_unprep()
1311 static bool spi_nor_rww_start_pe(struct spi_nor *nor, loff_t start, size_t len) in spi_nor_rww_start_pe() argument
1313 struct spi_nor_rww *rww = &nor->rww; in spi_nor_rww_start_pe()
1319 mutex_lock(&nor->lock); in spi_nor_rww_start_pe()
1321 if (rww->ongoing_io || rww->ongoing_rd || rww->ongoing_pe) in spi_nor_rww_start_pe()
1324 spi_nor_offset_to_banks(nor->params->bank_size, start, len, &first, &last); in spi_nor_rww_start_pe()
1326 if (rww->used_banks & BIT(bank)) in spi_nor_rww_start_pe()
1332 rww->used_banks |= used_banks; in spi_nor_rww_start_pe()
1333 rww->ongoing_pe = true; in spi_nor_rww_start_pe()
1337 mutex_unlock(&nor->lock); in spi_nor_rww_start_pe()
1341 static void spi_nor_rww_end_pe(struct spi_nor *nor, loff_t start, size_t len) in spi_nor_rww_end_pe() argument
1343 struct spi_nor_rww *rww = &nor->rww; in spi_nor_rww_end_pe()
1347 mutex_lock(&nor->lock); in spi_nor_rww_end_pe()
1349 spi_nor_offset_to_banks(nor->params->bank_size, start, len, &first, &last); in spi_nor_rww_end_pe()
1351 rww->used_banks &= ~BIT(bank); in spi_nor_rww_end_pe()
1353 rww->ongoing_pe = false; in spi_nor_rww_end_pe()
1355 mutex_unlock(&nor->lock); in spi_nor_rww_end_pe()
1358 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
1362 ret = spi_nor_prep(nor); in spi_nor_prep_and_lock_pe()
1366 if (!spi_nor_use_parallel_locking(nor)) in spi_nor_prep_and_lock_pe()
1367 mutex_lock(&nor->lock); in spi_nor_prep_and_lock_pe()
1369 ret = wait_event_killable(nor->rww.wait, in spi_nor_prep_and_lock_pe()
1370 spi_nor_rww_start_pe(nor, start, len)); in spi_nor_prep_and_lock_pe()
1375 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
1377 if (!spi_nor_use_parallel_locking(nor)) { in spi_nor_unlock_and_unprep_pe()
1378 mutex_unlock(&nor->lock); in spi_nor_unlock_and_unprep_pe()
1380 spi_nor_rww_end_pe(nor, start, len); in spi_nor_unlock_and_unprep_pe()
1381 wake_up(&nor->rww.wait); in spi_nor_unlock_and_unprep_pe()
1384 spi_nor_unprep(nor); in spi_nor_unlock_and_unprep_pe()
1388 static bool spi_nor_rww_start_rd(struct spi_nor *nor, loff_t start, size_t len) in spi_nor_rww_start_rd() argument
1390 struct spi_nor_rww *rww = &nor->rww; in spi_nor_rww_start_rd()
1396 mutex_lock(&nor->lock); in spi_nor_rww_start_rd()
1398 if (rww->ongoing_io || rww->ongoing_rd) in spi_nor_rww_start_rd()
1401 spi_nor_offset_to_banks(nor->params->bank_size, start, len, &first, &last); in spi_nor_rww_start_rd()
1403 if (rww->used_banks & BIT(bank)) in spi_nor_rww_start_rd()
1409 rww->used_banks |= used_banks; in spi_nor_rww_start_rd()
1410 rww->ongoing_io = true; in spi_nor_rww_start_rd()
1411 rww->ongoing_rd = true; in spi_nor_rww_start_rd()
1415 mutex_unlock(&nor->lock); in spi_nor_rww_start_rd()
1419 static void spi_nor_rww_end_rd(struct spi_nor *nor, loff_t start, size_t len) in spi_nor_rww_end_rd() argument
1421 struct spi_nor_rww *rww = &nor->rww; in spi_nor_rww_end_rd()
1425 mutex_lock(&nor->lock); in spi_nor_rww_end_rd()
1427 spi_nor_offset_to_banks(nor->params->bank_size, start, len, &first, &last); in spi_nor_rww_end_rd()
1429 nor->rww.used_banks &= ~BIT(bank); in spi_nor_rww_end_rd()
1431 rww->ongoing_io = false; in spi_nor_rww_end_rd()
1432 rww->ongoing_rd = false; in spi_nor_rww_end_rd()
1434 mutex_unlock(&nor->lock); in spi_nor_rww_end_rd()
1437 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
1441 ret = spi_nor_prep(nor); in spi_nor_prep_and_lock_rd()
1445 if (!spi_nor_use_parallel_locking(nor)) in spi_nor_prep_and_lock_rd()
1446 mutex_lock(&nor->lock); in spi_nor_prep_and_lock_rd()
1448 ret = wait_event_killable(nor->rww.wait, in spi_nor_prep_and_lock_rd()
1449 spi_nor_rww_start_rd(nor, start, len)); in spi_nor_prep_and_lock_rd()
1454 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
1456 if (!spi_nor_use_parallel_locking(nor)) { in spi_nor_unlock_and_unprep_rd()
1457 mutex_unlock(&nor->lock); in spi_nor_unlock_and_unprep_rd()
1459 spi_nor_rww_end_rd(nor, start, len); in spi_nor_unlock_and_unprep_rd()
1460 wake_up(&nor->rww.wait); in spi_nor_unlock_and_unprep_rd()
1463 spi_nor_unprep(nor); in spi_nor_unlock_and_unprep_rd()
1466 static u32 spi_nor_convert_addr(struct spi_nor *nor, loff_t addr) in spi_nor_convert_addr() argument
1468 if (!nor->params->convert_addr) in spi_nor_convert_addr()
1471 return nor->params->convert_addr(nor, addr); in spi_nor_convert_addr()
1477 int spi_nor_erase_sector(struct spi_nor *nor, u32 addr) in spi_nor_erase_sector() argument
1481 addr = spi_nor_convert_addr(nor, addr); in spi_nor_erase_sector()
1483 if (nor->spimem) { in spi_nor_erase_sector()
1485 SPI_NOR_SECTOR_ERASE_OP(nor->erase_opcode, in spi_nor_erase_sector()
1486 nor->addr_nbytes, addr); in spi_nor_erase_sector()
1488 spi_nor_spimem_setup_op(nor, &op, nor->reg_proto); in spi_nor_erase_sector()
1490 return spi_mem_exec_op(nor->spimem, &op); in spi_nor_erase_sector()
1491 } else if (nor->controller_ops->erase) { in spi_nor_erase_sector()
1492 return spi_nor_controller_ops_erase(nor, addr); in spi_nor_erase_sector()
1499 for (i = nor->addr_nbytes - 1; i >= 0; i--) { in spi_nor_erase_sector()
1500 nor->bouncebuf[i] = addr & 0xff; in spi_nor_erase_sector()
1504 return spi_nor_controller_ops_write_reg(nor, nor->erase_opcode, in spi_nor_erase_sector()
1505 nor->bouncebuf, nor->addr_nbytes); in spi_nor_erase_sector()
1509 * spi_nor_div_by_erase_size() - calculate remainder and update new dividend
1510 * @erase: pointer to a structure that describes a SPI NOR erase type
1520 *remainder = (u32)dividend & erase->size_mask; in spi_nor_div_by_erase_size()
1521 return dividend >> erase->size_shift; in spi_nor_div_by_erase_size()
1525 * spi_nor_find_best_erase_type() - find the best erase type for the given
1530 * @map: the erase map of the SPI NOR
1531 * @region: pointer to a structure that describes a SPI NOR erase region
1545 u8 erase_mask = region->offset & SNOR_ERASE_TYPE_MASK; in spi_nor_find_best_erase_type()
1551 for (i = SNOR_ERASE_TYPE_MAX - 1; i >= 0; i--) { in spi_nor_find_best_erase_type()
1556 erase = &map->erase_type[i]; in spi_nor_find_best_erase_type()
1557 if (!erase->size) in spi_nor_find_best_erase_type()
1561 if (region->offset & SNOR_OVERLAID_REGION && in spi_nor_find_best_erase_type()
1562 region->size <= len) in spi_nor_find_best_erase_type()
1566 if (erase->size > len) in spi_nor_find_best_erase_type()
1579 return region->offset & SNOR_LAST_REGION; in spi_nor_region_is_last()
1584 return (region->offset & ~SNOR_ERASE_FLAGS_MASK) + region->size; in spi_nor_region_end()
1588 * spi_nor_region_next() - get the next spi nor region
1589 * @region: pointer to a structure that describes a SPI NOR erase region
1591 * Return: the next spi nor region or NULL if last region.
1603 * spi_nor_find_erase_region() - find the region of the serial flash memory in
1605 * @map: the erase map of the SPI NOR
1608 * Return: a pointer to the spi_nor_erase_region struct, ERR_PTR(-errno)
1614 struct spi_nor_erase_region *region = map->regions; in spi_nor_find_erase_region()
1615 u64 region_start = region->offset & ~SNOR_ERASE_FLAGS_MASK; in spi_nor_find_erase_region()
1616 u64 region_end = region_start + region->size; in spi_nor_find_erase_region()
1621 return ERR_PTR(-EINVAL); in spi_nor_find_erase_region()
1623 region_start = region->offset & ~SNOR_ERASE_FLAGS_MASK; in spi_nor_find_erase_region()
1624 region_end = region_start + region->size; in spi_nor_find_erase_region()
1631 * spi_nor_init_erase_cmd() - initialize an erase command
1632 * @region: pointer to a structure that describes a SPI NOR erase region
1633 * @erase: pointer to a structure that describes a SPI NOR erase type
1635 * Return: the pointer to the allocated erase command, ERR_PTR(-errno)
1646 return ERR_PTR(-ENOMEM); in spi_nor_init_erase_cmd()
1648 INIT_LIST_HEAD(&cmd->list); in spi_nor_init_erase_cmd()
1649 cmd->opcode = erase->opcode; in spi_nor_init_erase_cmd()
1650 cmd->count = 1; in spi_nor_init_erase_cmd()
1652 if (region->offset & SNOR_OVERLAID_REGION) in spi_nor_init_erase_cmd()
1653 cmd->size = region->size; in spi_nor_init_erase_cmd()
1655 cmd->size = erase->size; in spi_nor_init_erase_cmd()
1661 * spi_nor_destroy_erase_cmd_list() - destroy erase command list
1669 list_del(&cmd->list); in spi_nor_destroy_erase_cmd_list()
1675 * spi_nor_init_erase_cmd_list() - initialize erase command list
1676 * @nor: pointer to a 'struct spi_nor'
1685 * Return: 0 on success, -errno otherwise.
1687 static int spi_nor_init_erase_cmd_list(struct spi_nor *nor, in spi_nor_init_erase_cmd_list() argument
1691 const struct spi_nor_erase_map *map = &nor->params->erase_map; in spi_nor_init_erase_cmd_list()
1696 int ret = -EINVAL; in spi_nor_init_erase_cmd_list()
1710 erase->size != cmd->size || in spi_nor_init_erase_cmd_list()
1711 region->offset & SNOR_OVERLAID_REGION) { in spi_nor_init_erase_cmd_list()
1718 list_add_tail(&cmd->list, erase_list); in spi_nor_init_erase_cmd_list()
1720 cmd->count++; in spi_nor_init_erase_cmd_list()
1723 addr += cmd->size; in spi_nor_init_erase_cmd_list()
1724 len -= cmd->size; in spi_nor_init_erase_cmd_list()
1744 * spi_nor_erase_multi_sectors() - perform a non-uniform erase
1745 * @nor: pointer to a 'struct spi_nor'
1752 * Return: 0 on success, -errno otherwise.
1754 static int spi_nor_erase_multi_sectors(struct spi_nor *nor, u64 addr, u32 len) in spi_nor_erase_multi_sectors() argument
1760 ret = spi_nor_init_erase_cmd_list(nor, &erase_list, addr, len); in spi_nor_erase_multi_sectors()
1765 nor->erase_opcode = cmd->opcode; in spi_nor_erase_multi_sectors()
1766 while (cmd->count) { in spi_nor_erase_multi_sectors()
1767 …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()
1768 cmd->size, cmd->opcode, cmd->count); in spi_nor_erase_multi_sectors()
1770 ret = spi_nor_lock_device(nor); in spi_nor_erase_multi_sectors()
1774 ret = spi_nor_write_enable(nor); in spi_nor_erase_multi_sectors()
1776 spi_nor_unlock_device(nor); in spi_nor_erase_multi_sectors()
1780 ret = spi_nor_erase_sector(nor, addr); in spi_nor_erase_multi_sectors()
1781 spi_nor_unlock_device(nor); in spi_nor_erase_multi_sectors()
1785 ret = spi_nor_wait_till_ready(nor); in spi_nor_erase_multi_sectors()
1789 addr += cmd->size; in spi_nor_erase_multi_sectors()
1790 cmd->count--; in spi_nor_erase_multi_sectors()
1792 list_del(&cmd->list); in spi_nor_erase_multi_sectors()
1803 static int spi_nor_erase_dice(struct spi_nor *nor, loff_t addr, in spi_nor_erase_dice() argument
1817 (unsigned long)(nor->mtd.size / SZ_2M)); in spi_nor_erase_dice()
1820 ret = spi_nor_lock_device(nor); in spi_nor_erase_dice()
1824 ret = spi_nor_write_enable(nor); in spi_nor_erase_dice()
1826 spi_nor_unlock_device(nor); in spi_nor_erase_dice()
1830 ret = spi_nor_erase_die(nor, addr, die_size); in spi_nor_erase_dice()
1832 spi_nor_unlock_device(nor); in spi_nor_erase_dice()
1836 ret = spi_nor_wait_till_ready_with_timeout(nor, timeout); in spi_nor_erase_dice()
1841 len -= die_size; in spi_nor_erase_dice()
1849 * Erase an address range on the nor chip. The address range may extend
1854 struct spi_nor *nor = mtd_to_spi_nor(mtd); in spi_nor_erase() local
1855 u8 n_dice = nor->params->n_dice; in spi_nor_erase()
1861 dev_dbg(nor->dev, "at 0x%llx, len %lld\n", (long long)instr->addr, in spi_nor_erase()
1862 (long long)instr->len); in spi_nor_erase()
1864 if (spi_nor_has_uniform_erase(nor)) { in spi_nor_erase()
1865 div_u64_rem(instr->len, mtd->erasesize, &rem); in spi_nor_erase()
1867 return -EINVAL; in spi_nor_erase()
1870 addr = instr->addr; in spi_nor_erase()
1871 len = instr->len; in spi_nor_erase()
1874 die_size = div_u64(mtd->size, n_dice); in spi_nor_erase()
1875 if (!(len & (die_size - 1)) && !(addr & (die_size - 1))) in spi_nor_erase()
1878 die_size = mtd->size; in spi_nor_erase()
1881 ret = spi_nor_prep_and_lock_pe(nor, instr->addr, instr->len); in spi_nor_erase()
1886 if ((len == mtd->size && !(nor->flags & SNOR_F_NO_OP_CHIP_ERASE)) || in spi_nor_erase()
1888 ret = spi_nor_erase_dice(nor, addr, len, die_size); in spi_nor_erase()
1897 /* "sector"-at-a-time erase */ in spi_nor_erase()
1898 } else if (spi_nor_has_uniform_erase(nor)) { in spi_nor_erase()
1900 ret = spi_nor_lock_device(nor); in spi_nor_erase()
1904 ret = spi_nor_write_enable(nor); in spi_nor_erase()
1906 spi_nor_unlock_device(nor); in spi_nor_erase()
1910 ret = spi_nor_erase_sector(nor, addr); in spi_nor_erase()
1911 spi_nor_unlock_device(nor); in spi_nor_erase()
1915 ret = spi_nor_wait_till_ready(nor); in spi_nor_erase()
1919 addr += mtd->erasesize; in spi_nor_erase()
1920 len -= mtd->erasesize; in spi_nor_erase()
1925 ret = spi_nor_erase_multi_sectors(nor, addr, len); in spi_nor_erase()
1930 ret = spi_nor_write_disable(nor); in spi_nor_erase()
1933 spi_nor_unlock_and_unprep_pe(nor, instr->addr, instr->len); in spi_nor_erase()
1939 * spi_nor_sr1_bit6_quad_enable() - Set the Quad Enable BIT(6) in the Status
1941 * @nor: pointer to a 'struct spi_nor'
1945 * Return: 0 on success, -errno otherwise.
1947 int spi_nor_sr1_bit6_quad_enable(struct spi_nor *nor) in spi_nor_sr1_bit6_quad_enable() argument
1951 ret = spi_nor_read_sr(nor, nor->bouncebuf); in spi_nor_sr1_bit6_quad_enable()
1955 if (nor->bouncebuf[0] & SR1_QUAD_EN_BIT6) in spi_nor_sr1_bit6_quad_enable()
1958 nor->bouncebuf[0] |= SR1_QUAD_EN_BIT6; in spi_nor_sr1_bit6_quad_enable()
1960 return spi_nor_write_sr1_and_check(nor, nor->bouncebuf[0]); in spi_nor_sr1_bit6_quad_enable()
1964 * spi_nor_sr2_bit1_quad_enable() - set the Quad Enable BIT(1) in the Status
1966 * @nor: pointer to a 'struct spi_nor'.
1970 * Return: 0 on success, -errno otherwise.
1972 int spi_nor_sr2_bit1_quad_enable(struct spi_nor *nor) in spi_nor_sr2_bit1_quad_enable() argument
1976 if (nor->flags & SNOR_F_NO_READ_CR) in spi_nor_sr2_bit1_quad_enable()
1977 return spi_nor_write_16bit_cr_and_check(nor, SR2_QUAD_EN_BIT1); in spi_nor_sr2_bit1_quad_enable()
1979 ret = spi_nor_read_cr(nor, nor->bouncebuf); in spi_nor_sr2_bit1_quad_enable()
1983 if (nor->bouncebuf[0] & SR2_QUAD_EN_BIT1) in spi_nor_sr2_bit1_quad_enable()
1986 nor->bouncebuf[0] |= SR2_QUAD_EN_BIT1; in spi_nor_sr2_bit1_quad_enable()
1988 return spi_nor_write_16bit_cr_and_check(nor, nor->bouncebuf[0]); in spi_nor_sr2_bit1_quad_enable()
1992 * spi_nor_sr2_bit7_quad_enable() - set QE bit in Status Register 2.
1993 * @nor: pointer to a 'struct spi_nor'
2001 * Return: 0 on success, -errno otherwise.
2003 int spi_nor_sr2_bit7_quad_enable(struct spi_nor *nor) in spi_nor_sr2_bit7_quad_enable() argument
2005 u8 *sr2 = nor->bouncebuf; in spi_nor_sr2_bit7_quad_enable()
2010 ret = spi_nor_read_sr2(nor, sr2); in spi_nor_sr2_bit7_quad_enable()
2019 ret = spi_nor_write_sr2(nor, sr2); in spi_nor_sr2_bit7_quad_enable()
2026 ret = spi_nor_read_sr2(nor, sr2); in spi_nor_sr2_bit7_quad_enable()
2031 dev_dbg(nor->dev, "SR2: Read back test failed\n"); in spi_nor_sr2_bit7_quad_enable()
2032 return -EIO; in spi_nor_sr2_bit7_quad_enable()
2057 .name = "spi-nor-generic",
2060 static const struct flash_info *spi_nor_match_id(struct spi_nor *nor, in spi_nor_match_id() argument
2067 for (j = 0; j < manufacturers[i]->nparts; j++) { in spi_nor_match_id()
2068 part = &manufacturers[i]->parts[j]; in spi_nor_match_id()
2069 if (part->id && in spi_nor_match_id()
2070 !memcmp(part->id->bytes, id, part->id->len)) { in spi_nor_match_id()
2071 nor->manufacturer = manufacturers[i]; in spi_nor_match_id()
2080 static const struct flash_info *spi_nor_detect(struct spi_nor *nor) in spi_nor_detect() argument
2083 u8 *id = nor->bouncebuf; in spi_nor_detect()
2086 ret = spi_nor_read_id(nor, 0, 0, id, nor->reg_proto); in spi_nor_detect()
2088 dev_dbg(nor->dev, "error %d reading JEDEC ID\n", ret); in spi_nor_detect()
2093 nor->id = devm_kmemdup(nor->dev, id, SPI_NOR_MAX_ID_LEN, GFP_KERNEL); in spi_nor_detect()
2094 if (!nor->id) in spi_nor_detect()
2095 return ERR_PTR(-ENOMEM); in spi_nor_detect()
2097 info = spi_nor_match_id(nor, id); in spi_nor_detect()
2101 ret = spi_nor_check_sfdp_signature(nor); in spi_nor_detect()
2107 dev_err(nor->dev, "unrecognized JEDEC id bytes: %*ph\n", in spi_nor_detect()
2109 return ERR_PTR(-ENODEV); in spi_nor_detect()
2117 struct spi_nor *nor = mtd_to_spi_nor(mtd); in spi_nor_read() local
2122 dev_dbg(nor->dev, "from 0x%08x, len %zd\n", (u32)from, len); in spi_nor_read()
2124 ret = spi_nor_prep_and_lock_rd(nor, from_lock, len_lock); in spi_nor_read()
2131 addr = spi_nor_convert_addr(nor, addr); in spi_nor_read()
2133 ret = spi_nor_read_data(nor, addr, len, buf); in spi_nor_read()
2135 /* We shouldn't see 0-length reads */ in spi_nor_read()
2136 ret = -EIO; in spi_nor_read()
2146 len -= ret; in spi_nor_read()
2151 spi_nor_unlock_and_unprep_rd(nor, from_lock, len_lock); in spi_nor_read()
2157 * Write an address range to the nor chip. Data must be written in
2164 struct spi_nor *nor = mtd_to_spi_nor(mtd); in spi_nor_write() local
2167 u32 page_size = nor->params->page_size; in spi_nor_write()
2169 dev_dbg(nor->dev, "to 0x%08x, len %zd\n", (u32)to, len); in spi_nor_write()
2171 ret = spi_nor_prep_and_lock_pe(nor, to, len); in spi_nor_write()
2185 page_offset = addr & (page_size - 1); in spi_nor_write()
2192 page_remain = min_t(size_t, page_size - page_offset, len - i); in spi_nor_write()
2194 addr = spi_nor_convert_addr(nor, addr); in spi_nor_write()
2196 ret = spi_nor_lock_device(nor); in spi_nor_write()
2200 ret = spi_nor_write_enable(nor); in spi_nor_write()
2202 spi_nor_unlock_device(nor); in spi_nor_write()
2206 ret = spi_nor_write_data(nor, addr, page_remain, buf + i); in spi_nor_write()
2207 spi_nor_unlock_device(nor); in spi_nor_write()
2212 ret = spi_nor_wait_till_ready(nor); in spi_nor_write()
2220 spi_nor_unlock_and_unprep_pe(nor, to, len); in spi_nor_write()
2225 static int spi_nor_check(struct spi_nor *nor) in spi_nor_check() argument
2227 if (!nor->dev || in spi_nor_check()
2228 (!nor->spimem && !nor->controller_ops) || in spi_nor_check()
2229 (!nor->spimem && nor->controller_ops && in spi_nor_check()
2230 (!nor->controller_ops->read || in spi_nor_check()
2231 !nor->controller_ops->write || in spi_nor_check()
2232 !nor->controller_ops->read_reg || in spi_nor_check()
2233 !nor->controller_ops->write_reg))) { in spi_nor_check()
2234 pr_err("spi-nor: please fill all the necessary fields!\n"); in spi_nor_check()
2235 return -EINVAL; in spi_nor_check()
2238 if (nor->spimem && nor->controller_ops) { in spi_nor_check()
2239 …dev_err(nor->dev, "nor->spimem and nor->controller_ops are mutually exclusive, please set just one… in spi_nor_check()
2240 return -EINVAL; in spi_nor_check()
2253 read->num_mode_clocks = num_mode_clocks; in spi_nor_set_read_settings()
2254 read->num_wait_states = num_wait_states; in spi_nor_set_read_settings()
2255 read->opcode = opcode; in spi_nor_set_read_settings()
2256 read->proto = proto; in spi_nor_set_read_settings()
2262 pp->opcode = opcode; in spi_nor_set_pp_settings()
2263 pp->proto = proto; in spi_nor_set_pp_settings()
2274 return -EINVAL; in spi_nor_hwcaps2cmd()
2320 * spi_nor_spimem_check_op - check if the operation is supported
2322 *@nor: pointer to a 'struct spi_nor'
2325 * Returns 0 if operation is supported, -EOPNOTSUPP otherwise.
2327 static int spi_nor_spimem_check_op(struct spi_nor *nor, in spi_nor_spimem_check_op() argument
2333 * SPI controller implementation should not check the opcode, in spi_nor_spimem_check_op()
2336 op->addr.nbytes = 4; in spi_nor_spimem_check_op()
2337 if (!spi_mem_supports_op(nor->spimem, op)) { in spi_nor_spimem_check_op()
2338 if (nor->params->size > SZ_16M) in spi_nor_spimem_check_op()
2339 return -EOPNOTSUPP; in spi_nor_spimem_check_op()
2342 op->addr.nbytes = 3; in spi_nor_spimem_check_op()
2343 if (!spi_mem_supports_op(nor->spimem, op)) in spi_nor_spimem_check_op()
2344 return -EOPNOTSUPP; in spi_nor_spimem_check_op()
2351 * spi_nor_spimem_check_readop - check if the read op is supported
2353 *@nor: pointer to a 'struct spi_nor'
2356 * Returns 0 if operation is supported, -EOPNOTSUPP otherwise.
2358 static int spi_nor_spimem_check_readop(struct spi_nor *nor, in spi_nor_spimem_check_readop() argument
2361 struct spi_mem_op op = SPI_NOR_READ_OP(read->opcode); in spi_nor_spimem_check_readop()
2363 spi_nor_spimem_setup_op(nor, &op, read->proto); in spi_nor_spimem_check_readop()
2366 op.dummy.nbytes = (read->num_mode_clocks + read->num_wait_states) * in spi_nor_spimem_check_readop()
2368 if (spi_nor_protocol_is_dtr(nor->read_proto)) in spi_nor_spimem_check_readop()
2371 return spi_nor_spimem_check_op(nor, &op); in spi_nor_spimem_check_readop()
2375 * spi_nor_spimem_check_pp - check if the page program op is supported
2377 *@nor: pointer to a 'struct spi_nor'
2380 * Returns 0 if operation is supported, -EOPNOTSUPP otherwise.
2382 static int spi_nor_spimem_check_pp(struct spi_nor *nor, in spi_nor_spimem_check_pp() argument
2385 struct spi_mem_op op = SPI_NOR_PP_OP(pp->opcode); in spi_nor_spimem_check_pp()
2387 spi_nor_spimem_setup_op(nor, &op, pp->proto); in spi_nor_spimem_check_pp()
2389 return spi_nor_spimem_check_op(nor, &op); in spi_nor_spimem_check_pp()
2393 * spi_nor_spimem_adjust_hwcaps - Find optimal Read/Write protocol
2394 * based on SPI controller capabilities
2395 * @nor: pointer to a 'struct spi_nor'
2400 spi_nor_spimem_adjust_hwcaps(struct spi_nor *nor, u32 *hwcaps) in spi_nor_spimem_adjust_hwcaps() argument
2402 struct spi_nor_flash_parameter *params = nor->params; in spi_nor_spimem_adjust_hwcaps()
2405 /* X-X-X modes are not supported yet, mask them all. */ in spi_nor_spimem_adjust_hwcaps()
2412 if (nor->flags & SNOR_F_BROKEN_RESET) in spi_nor_spimem_adjust_hwcaps()
2423 spi_nor_spimem_check_readop(nor, ¶ms->reads[rdidx])) in spi_nor_spimem_adjust_hwcaps()
2430 if (spi_nor_spimem_check_pp(nor, in spi_nor_spimem_adjust_hwcaps()
2431 ¶ms->page_programs[ppidx])) in spi_nor_spimem_adjust_hwcaps()
2437 * spi_nor_set_erase_type() - set a SPI NOR erase type
2438 * @erase: pointer to a structure that describes a SPI NOR erase type
2440 * @opcode: the SPI command op code to erase the sector/block
2445 erase->size = size; in spi_nor_set_erase_type()
2446 erase->opcode = opcode; in spi_nor_set_erase_type()
2448 erase->size_shift = ffs(erase->size) - 1; in spi_nor_set_erase_type()
2449 erase->size_mask = (1 << erase->size_shift) - 1; in spi_nor_set_erase_type()
2453 * spi_nor_mask_erase_type() - mask out a SPI NOR erase type
2454 * @erase: pointer to a structure that describes a SPI NOR erase type
2458 erase->size = 0; in spi_nor_mask_erase_type()
2462 * spi_nor_init_uniform_erase_map() - Initialize uniform erase map
2463 * @map: the erase map of the SPI NOR
2466 * @flash_size: the spi nor flash memory size
2472 map->uniform_region.offset = (erase_mask & SNOR_ERASE_TYPE_MASK) | in spi_nor_init_uniform_erase_map()
2474 map->uniform_region.size = flash_size; in spi_nor_init_uniform_erase_map()
2475 map->regions = &map->uniform_region; in spi_nor_init_uniform_erase_map()
2476 map->uniform_erase_type = erase_mask; in spi_nor_init_uniform_erase_map()
2479 int spi_nor_post_bfpt_fixups(struct spi_nor *nor, in spi_nor_post_bfpt_fixups() argument
2485 if (nor->manufacturer && nor->manufacturer->fixups && in spi_nor_post_bfpt_fixups()
2486 nor->manufacturer->fixups->post_bfpt) { in spi_nor_post_bfpt_fixups()
2487 ret = nor->manufacturer->fixups->post_bfpt(nor, bfpt_header, in spi_nor_post_bfpt_fixups()
2493 if (nor->info->fixups && nor->info->fixups->post_bfpt) in spi_nor_post_bfpt_fixups()
2494 return nor->info->fixups->post_bfpt(nor, bfpt_header, bfpt); in spi_nor_post_bfpt_fixups()
2499 static int spi_nor_select_read(struct spi_nor *nor, in spi_nor_select_read() argument
2502 int cmd, best_match = fls(shared_hwcaps & SNOR_HWCAPS_READ_MASK) - 1; in spi_nor_select_read()
2506 return -EINVAL; in spi_nor_select_read()
2510 return -EINVAL; in spi_nor_select_read()
2512 read = &nor->params->reads[cmd]; in spi_nor_select_read()
2513 nor->read_opcode = read->opcode; in spi_nor_select_read()
2514 nor->read_proto = read->proto; in spi_nor_select_read()
2517 * In the SPI NOR framework, we don't need to make the difference in spi_nor_select_read()
2520 * flash memory to know whether it should enter or leave its 0-4-4 in spi_nor_select_read()
2522 * eXecution In Place is out of the scope of the mtd sub-system. in spi_nor_select_read()
2526 nor->read_dummy = read->num_mode_clocks + read->num_wait_states; in spi_nor_select_read()
2530 static int spi_nor_select_pp(struct spi_nor *nor, in spi_nor_select_pp() argument
2533 int cmd, best_match = fls(shared_hwcaps & SNOR_HWCAPS_PP_MASK) - 1; in spi_nor_select_pp()
2537 return -EINVAL; in spi_nor_select_pp()
2541 return -EINVAL; in spi_nor_select_pp()
2543 pp = &nor->params->page_programs[cmd]; in spi_nor_select_pp()
2544 nor->program_opcode = pp->opcode; in spi_nor_select_pp()
2545 nor->write_proto = pp->proto; in spi_nor_select_pp()
2550 * spi_nor_select_uniform_erase() - select optimum uniform erase type
2551 * @map: the erase map of the SPI NOR
2563 u8 uniform_erase_type = map->uniform_erase_type; in spi_nor_select_uniform_erase()
2569 for (i = SNOR_ERASE_TYPE_MAX - 1; i >= 0; i--) { in spi_nor_select_uniform_erase()
2573 tested_erase = &map->erase_type[i]; in spi_nor_select_uniform_erase()
2576 if (!tested_erase->size) in spi_nor_select_uniform_erase()
2584 tested_erase->size == SZ_4K) { in spi_nor_select_uniform_erase()
2593 if (!erase && tested_erase->size) in spi_nor_select_uniform_erase()
2602 map->uniform_erase_type &= ~SNOR_ERASE_TYPE_MASK; in spi_nor_select_uniform_erase()
2603 map->uniform_erase_type |= BIT(erase - map->erase_type); in spi_nor_select_uniform_erase()
2607 static int spi_nor_select_erase(struct spi_nor *nor) in spi_nor_select_erase() argument
2609 struct spi_nor_erase_map *map = &nor->params->erase_map; in spi_nor_select_erase()
2611 struct mtd_info *mtd = &nor->mtd; in spi_nor_select_erase()
2616 * that the SPI flash memory has an uniform layout then used only one in spi_nor_select_erase()
2619 * manage the SPI flash memory as uniform with a single erase sector in spi_nor_select_erase()
2622 if (spi_nor_has_uniform_erase(nor)) { in spi_nor_select_erase()
2625 return -EINVAL; in spi_nor_select_erase()
2626 nor->erase_opcode = erase->opcode; in spi_nor_select_erase()
2627 mtd->erasesize = erase->size; in spi_nor_select_erase()
2632 * For non-uniform SPI flash memory, set mtd->erasesize to the in spi_nor_select_erase()
2633 * maximum erase sector size. No need to set nor->erase_opcode. in spi_nor_select_erase()
2635 for (i = SNOR_ERASE_TYPE_MAX - 1; i >= 0; i--) { in spi_nor_select_erase()
2636 if (map->erase_type[i].size) { in spi_nor_select_erase()
2637 erase = &map->erase_type[i]; in spi_nor_select_erase()
2643 return -EINVAL; in spi_nor_select_erase()
2645 mtd->erasesize = erase->size; in spi_nor_select_erase()
2649 static int spi_nor_default_setup(struct spi_nor *nor, in spi_nor_default_setup() argument
2652 struct spi_nor_flash_parameter *params = nor->params; in spi_nor_default_setup()
2657 * Keep only the hardware capabilities supported by both the SPI in spi_nor_default_setup()
2658 * controller and the SPI flash memory. in spi_nor_default_setup()
2660 shared_mask = hwcaps->mask & params->hwcaps.mask; in spi_nor_default_setup()
2662 if (nor->spimem) { in spi_nor_default_setup()
2665 * need to discard some of them based on what the SPI in spi_nor_default_setup()
2668 spi_nor_spimem_adjust_hwcaps(nor, &shared_mask); in spi_nor_default_setup()
2671 * SPI n-n-n protocols are not supported when the SPI in spi_nor_default_setup()
2673 * Yet another reason to switch to spi-mem. in spi_nor_default_setup()
2677 dev_dbg(nor->dev, in spi_nor_default_setup()
2678 "SPI n-n-n protocols are not supported.\n"); in spi_nor_default_setup()
2684 err = spi_nor_select_read(nor, shared_mask); in spi_nor_default_setup()
2686 dev_dbg(nor->dev, in spi_nor_default_setup()
2687 "can't select read settings supported by both the SPI controller and memory.\n"); in spi_nor_default_setup()
2692 err = spi_nor_select_pp(nor, shared_mask); in spi_nor_default_setup()
2694 dev_dbg(nor->dev, in spi_nor_default_setup()
2695 "can't select write settings supported by both the SPI controller and memory.\n"); in spi_nor_default_setup()
2700 err = spi_nor_select_erase(nor); in spi_nor_default_setup()
2702 dev_dbg(nor->dev, in spi_nor_default_setup()
2703 "can't select erase settings supported by both the SPI controller and memory.\n"); in spi_nor_default_setup()
2710 static int spi_nor_set_addr_nbytes(struct spi_nor *nor) in spi_nor_set_addr_nbytes() argument
2712 if (nor->params->addr_nbytes) { in spi_nor_set_addr_nbytes()
2713 nor->addr_nbytes = nor->params->addr_nbytes; in spi_nor_set_addr_nbytes()
2714 } else if (nor->read_proto == SNOR_PROTO_8_8_8_DTR) { in spi_nor_set_addr_nbytes()
2716 * In 8D-8D-8D mode, one byte takes half a cycle to transfer. So in spi_nor_set_addr_nbytes()
2724 * Force all 8D-8D-8D flashes to use an addr_nbytes of 4 to in spi_nor_set_addr_nbytes()
2727 nor->addr_nbytes = 4; in spi_nor_set_addr_nbytes()
2728 } else if (nor->info->addr_nbytes) { in spi_nor_set_addr_nbytes()
2729 nor->addr_nbytes = nor->info->addr_nbytes; in spi_nor_set_addr_nbytes()
2731 nor->addr_nbytes = 3; in spi_nor_set_addr_nbytes()
2734 if (nor->addr_nbytes == 3 && nor->params->size > 0x1000000) { in spi_nor_set_addr_nbytes()
2735 /* enable 4-byte addressing if the device exceeds 16MiB */ in spi_nor_set_addr_nbytes()
2736 nor->addr_nbytes = 4; in spi_nor_set_addr_nbytes()
2739 if (nor->addr_nbytes > SPI_NOR_MAX_ADDR_NBYTES) { in spi_nor_set_addr_nbytes()
2740 dev_dbg(nor->dev, "The number of address bytes is too large: %u\n", in spi_nor_set_addr_nbytes()
2741 nor->addr_nbytes); in spi_nor_set_addr_nbytes()
2742 return -EINVAL; in spi_nor_set_addr_nbytes()
2746 if (nor->addr_nbytes == 4 && nor->flags & SNOR_F_4B_OPCODES && in spi_nor_set_addr_nbytes()
2747 !(nor->flags & SNOR_F_HAS_4BAIT)) in spi_nor_set_addr_nbytes()
2748 spi_nor_set_4byte_opcodes(nor); in spi_nor_set_addr_nbytes()
2753 static int spi_nor_setup(struct spi_nor *nor, in spi_nor_setup() argument
2758 if (nor->params->setup) in spi_nor_setup()
2759 ret = nor->params->setup(nor, hwcaps); in spi_nor_setup()
2761 ret = spi_nor_default_setup(nor, hwcaps); in spi_nor_setup()
2765 return spi_nor_set_addr_nbytes(nor); in spi_nor_setup()
2769 * spi_nor_manufacturer_init_params() - Initialize the flash's parameters and
2770 * settings based on MFR register and ->default_init() hook.
2771 * @nor: pointer to a 'struct spi_nor'.
2773 static void spi_nor_manufacturer_init_params(struct spi_nor *nor) in spi_nor_manufacturer_init_params() argument
2775 if (nor->manufacturer && nor->manufacturer->fixups && in spi_nor_manufacturer_init_params()
2776 nor->manufacturer->fixups->default_init) in spi_nor_manufacturer_init_params()
2777 nor->manufacturer->fixups->default_init(nor); in spi_nor_manufacturer_init_params()
2779 if (nor->info->fixups && nor->info->fixups->default_init) in spi_nor_manufacturer_init_params()
2780 nor->info->fixups->default_init(nor); in spi_nor_manufacturer_init_params()
2784 * spi_nor_no_sfdp_init_params() - Initialize the flash's parameters and
2785 * settings based on nor->info->sfdp_flags. This method should be called only by
2790 * @nor: pointer to a 'struct spi_nor'.
2792 static void spi_nor_no_sfdp_init_params(struct spi_nor *nor) in spi_nor_no_sfdp_init_params() argument
2794 struct spi_nor_flash_parameter *params = nor->params; in spi_nor_no_sfdp_init_params()
2795 struct spi_nor_erase_map *map = ¶ms->erase_map; in spi_nor_no_sfdp_init_params()
2796 const struct flash_info *info = nor->info; in spi_nor_no_sfdp_init_params()
2797 const u8 no_sfdp_flags = info->no_sfdp_flags; in spi_nor_no_sfdp_init_params()
2801 params->hwcaps.mask |= SNOR_HWCAPS_READ_1_1_2; in spi_nor_no_sfdp_init_params()
2802 spi_nor_set_read_settings(¶ms->reads[SNOR_CMD_READ_1_1_2], in spi_nor_no_sfdp_init_params()
2808 params->hwcaps.mask |= SNOR_HWCAPS_READ_1_1_4; in spi_nor_no_sfdp_init_params()
2809 spi_nor_set_read_settings(¶ms->reads[SNOR_CMD_READ_1_1_4], in spi_nor_no_sfdp_init_params()
2815 params->hwcaps.mask |= SNOR_HWCAPS_READ_1_1_8; in spi_nor_no_sfdp_init_params()
2816 spi_nor_set_read_settings(¶ms->reads[SNOR_CMD_READ_1_1_8], in spi_nor_no_sfdp_init_params()
2822 params->hwcaps.mask |= SNOR_HWCAPS_READ_8_8_8_DTR; in spi_nor_no_sfdp_init_params()
2823 spi_nor_set_read_settings(¶ms->reads[SNOR_CMD_READ_8_8_8_DTR], in spi_nor_no_sfdp_init_params()
2829 params->hwcaps.mask |= SNOR_HWCAPS_PP_8_8_8_DTR; in spi_nor_no_sfdp_init_params()
2832 * Legacy SPI, use Legacy SPI opcode there as well. in spi_nor_no_sfdp_init_params()
2834 spi_nor_set_pp_settings(¶ms->page_programs[SNOR_CMD_PP_8_8_8_DTR], in spi_nor_no_sfdp_init_params()
2846 spi_nor_set_erase_type(&map->erase_type[i], 4096u, in spi_nor_no_sfdp_init_params()
2851 spi_nor_set_erase_type(&map->erase_type[i], in spi_nor_no_sfdp_init_params()
2852 info->sector_size ?: SPI_NOR_DEFAULT_SECTOR_SIZE, in spi_nor_no_sfdp_init_params()
2854 spi_nor_init_uniform_erase_map(map, erase_mask, params->size); in spi_nor_no_sfdp_init_params()
2858 * spi_nor_init_flags() - Initialize NOR flags for settings that are not defined
2860 * @nor: pointer to a 'struct spi_nor'
2862 static void spi_nor_init_flags(struct spi_nor *nor) in spi_nor_init_flags() argument
2864 struct device_node *np = spi_nor_get_flash_node(nor); in spi_nor_init_flags()
2865 const u16 flags = nor->info->flags; in spi_nor_init_flags()
2867 if (of_property_read_bool(np, "broken-flash-reset")) in spi_nor_init_flags()
2868 nor->flags |= SNOR_F_BROKEN_RESET; in spi_nor_init_flags()
2870 if (of_property_read_bool(np, "no-wp")) in spi_nor_init_flags()
2871 nor->flags |= SNOR_F_NO_WP; in spi_nor_init_flags()
2874 nor->flags |= SNOR_F_SWP_IS_VOLATILE; in spi_nor_init_flags()
2877 nor->flags |= SNOR_F_HAS_LOCK; in spi_nor_init_flags()
2880 nor->flags |= SNOR_F_HAS_SR_TB; in spi_nor_init_flags()
2882 nor->flags |= SNOR_F_HAS_SR_TB_BIT6; in spi_nor_init_flags()
2886 nor->flags |= SNOR_F_HAS_4BIT_BP; in spi_nor_init_flags()
2888 nor->flags |= SNOR_F_HAS_SR_BP3_BIT6; in spi_nor_init_flags()
2891 if (flags & SPI_NOR_RWW && nor->params->n_banks > 1 && in spi_nor_init_flags()
2892 !nor->controller_ops) in spi_nor_init_flags()
2893 nor->flags |= SNOR_F_RWW; in spi_nor_init_flags()
2897 * spi_nor_init_fixup_flags() - Initialize NOR flags for settings that can not
2902 * @nor: pointer to a 'struct spi_nor'
2904 static void spi_nor_init_fixup_flags(struct spi_nor *nor) in spi_nor_init_fixup_flags() argument
2906 const u8 fixup_flags = nor->info->fixup_flags; in spi_nor_init_fixup_flags()
2909 nor->flags |= SNOR_F_4B_OPCODES; in spi_nor_init_fixup_flags()
2912 nor->flags |= SNOR_F_IO_MODE_EN_VOLATILE; in spi_nor_init_fixup_flags()
2916 * spi_nor_late_init_params() - Late initialization of default flash parameters.
2917 * @nor: pointer to a 'struct spi_nor'
2923 static int spi_nor_late_init_params(struct spi_nor *nor) in spi_nor_late_init_params() argument
2925 struct spi_nor_flash_parameter *params = nor->params; in spi_nor_late_init_params()
2928 if (nor->manufacturer && nor->manufacturer->fixups && in spi_nor_late_init_params()
2929 nor->manufacturer->fixups->late_init) { in spi_nor_late_init_params()
2930 ret = nor->manufacturer->fixups->late_init(nor); in spi_nor_late_init_params()
2936 spi_nor_init_flags(nor); in spi_nor_late_init_params()
2938 if (nor->info->fixups && nor->info->fixups->late_init) { in spi_nor_late_init_params()
2939 ret = nor->info->fixups->late_init(nor); in spi_nor_late_init_params()
2944 if (!nor->params->die_erase_opcode) in spi_nor_late_init_params()
2945 nor->params->die_erase_opcode = SPINOR_OP_CHIP_ERASE; in spi_nor_late_init_params()
2948 if (!params->set_4byte_addr_mode) in spi_nor_late_init_params()
2949 params->set_4byte_addr_mode = spi_nor_set_4byte_addr_mode_brwr; in spi_nor_late_init_params()
2951 spi_nor_init_fixup_flags(nor); in spi_nor_late_init_params()
2954 * NOR protection support. When locking_ops are not provided, we pick in spi_nor_late_init_params()
2957 if (nor->flags & SNOR_F_HAS_LOCK && !nor->params->locking_ops) in spi_nor_late_init_params()
2958 spi_nor_init_default_locking_ops(nor); in spi_nor_late_init_params()
2960 if (params->n_banks > 1) in spi_nor_late_init_params()
2961 params->bank_size = div64_u64(params->size, params->n_banks); in spi_nor_late_init_params()
2967 * spi_nor_sfdp_init_params_deprecated() - Deprecated way of initializing flash
2969 * @nor: pointer to a 'struct spi_nor'.
2971 * The method has a roll-back mechanism: in case the SFDP parsing fails, the
2974 static void spi_nor_sfdp_init_params_deprecated(struct spi_nor *nor) in spi_nor_sfdp_init_params_deprecated() argument
2978 memcpy(&sfdp_params, nor->params, sizeof(sfdp_params)); in spi_nor_sfdp_init_params_deprecated()
2980 if (spi_nor_parse_sfdp(nor)) { in spi_nor_sfdp_init_params_deprecated()
2981 memcpy(nor->params, &sfdp_params, sizeof(*nor->params)); in spi_nor_sfdp_init_params_deprecated()
2982 nor->flags &= ~SNOR_F_4B_OPCODES; in spi_nor_sfdp_init_params_deprecated()
2987 * spi_nor_init_params_deprecated() - Deprecated way of initializing flash
2989 * @nor: pointer to a 'struct spi_nor'.
2995 static void spi_nor_init_params_deprecated(struct spi_nor *nor) in spi_nor_init_params_deprecated() argument
2997 spi_nor_no_sfdp_init_params(nor); in spi_nor_init_params_deprecated()
2999 spi_nor_manufacturer_init_params(nor); in spi_nor_init_params_deprecated()
3001 if (nor->info->no_sfdp_flags & (SPI_NOR_DUAL_READ | in spi_nor_init_params_deprecated()
3005 spi_nor_sfdp_init_params_deprecated(nor); in spi_nor_init_params_deprecated()
3009 * spi_nor_init_default_params() - Default initialization of flash parameters
3012 * @nor: pointer to a 'struct spi_nor'.
3014 static void spi_nor_init_default_params(struct spi_nor *nor) in spi_nor_init_default_params() argument
3016 struct spi_nor_flash_parameter *params = nor->params; in spi_nor_init_default_params()
3017 const struct flash_info *info = nor->info; in spi_nor_init_default_params()
3018 struct device_node *np = spi_nor_get_flash_node(nor); in spi_nor_init_default_params()
3020 params->quad_enable = spi_nor_sr2_bit1_quad_enable; in spi_nor_init_default_params()
3021 params->otp.org = info->otp; in spi_nor_init_default_params()
3023 /* Default to 16-bit Write Status (01h) Command */ in spi_nor_init_default_params()
3024 nor->flags |= SNOR_F_HAS_16BIT_SR; in spi_nor_init_default_params()
3026 /* Set SPI NOR sizes. */ in spi_nor_init_default_params()
3027 params->writesize = 1; in spi_nor_init_default_params()
3028 params->size = info->size; in spi_nor_init_default_params()
3029 params->bank_size = params->size; in spi_nor_init_default_params()
3030 params->page_size = info->page_size ?: SPI_NOR_DEFAULT_PAGE_SIZE; in spi_nor_init_default_params()
3031 params->n_banks = info->n_banks ?: SPI_NOR_DEFAULT_N_BANKS; in spi_nor_init_default_params()
3033 if (!(info->flags & SPI_NOR_NO_FR)) { in spi_nor_init_default_params()
3034 /* Default to Fast Read for DT and non-DT platform devices. */ in spi_nor_init_default_params()
3035 params->hwcaps.mask |= SNOR_HWCAPS_READ_FAST; in spi_nor_init_default_params()
3038 if (np && !of_property_read_bool(np, "m25p,fast-read")) in spi_nor_init_default_params()
3039 params->hwcaps.mask &= ~SNOR_HWCAPS_READ_FAST; in spi_nor_init_default_params()
3043 params->hwcaps.mask |= SNOR_HWCAPS_READ; in spi_nor_init_default_params()
3044 spi_nor_set_read_settings(¶ms->reads[SNOR_CMD_READ], in spi_nor_init_default_params()
3048 if (params->hwcaps.mask & SNOR_HWCAPS_READ_FAST) in spi_nor_init_default_params()
3049 spi_nor_set_read_settings(¶ms->reads[SNOR_CMD_READ_FAST], in spi_nor_init_default_params()
3053 params->hwcaps.mask |= SNOR_HWCAPS_PP; in spi_nor_init_default_params()
3054 spi_nor_set_pp_settings(¶ms->page_programs[SNOR_CMD_PP], in spi_nor_init_default_params()
3057 if (info->flags & SPI_NOR_QUAD_PP) { in spi_nor_init_default_params()
3058 params->hwcaps.mask |= SNOR_HWCAPS_PP_1_1_4; in spi_nor_init_default_params()
3059 spi_nor_set_pp_settings(¶ms->page_programs[SNOR_CMD_PP_1_1_4], in spi_nor_init_default_params()
3065 * spi_nor_init_params() - Initialize the flash's parameters and settings.
3066 * @nor: pointer to a 'struct spi_nor'.
3072 * based on nor->info data:
3078 * based on MFR, by using specific flash_info tweeks, ->default_init():
3086 * Please note that there is a ->post_bfpt() fixup hook that can overwrite
3099 * Return: 0 on success, -errno otherwise.
3101 static int spi_nor_init_params(struct spi_nor *nor) in spi_nor_init_params() argument
3105 nor->params = devm_kzalloc(nor->dev, sizeof(*nor->params), GFP_KERNEL); in spi_nor_init_params()
3106 if (!nor->params) in spi_nor_init_params()
3107 return -ENOMEM; in spi_nor_init_params()
3109 spi_nor_init_default_params(nor); in spi_nor_init_params()
3111 if (spi_nor_needs_sfdp(nor)) { in spi_nor_init_params()
3112 ret = spi_nor_parse_sfdp(nor); in spi_nor_init_params()
3114 …dev_err(nor->dev, "BFPT parsing failed. Please consider using SPI_NOR_SKIP_SFDP when declaring the… in spi_nor_init_params()
3117 } else if (nor->info->no_sfdp_flags & SPI_NOR_SKIP_SFDP) { in spi_nor_init_params()
3118 spi_nor_no_sfdp_init_params(nor); in spi_nor_init_params()
3120 spi_nor_init_params_deprecated(nor); in spi_nor_init_params()
3123 return spi_nor_late_init_params(nor); in spi_nor_init_params()
3126 /** spi_nor_set_octal_dtr() - enable or disable Octal DTR I/O.
3127 * @nor: pointer to a 'struct spi_nor'
3130 * Return: 0 on success, -errno otherwise.
3132 static int spi_nor_set_octal_dtr(struct spi_nor *nor, bool enable) in spi_nor_set_octal_dtr() argument
3136 if (!nor->params->set_octal_dtr) in spi_nor_set_octal_dtr()
3139 if (!(nor->read_proto == SNOR_PROTO_8_8_8_DTR && in spi_nor_set_octal_dtr()
3140 nor->write_proto == SNOR_PROTO_8_8_8_DTR)) in spi_nor_set_octal_dtr()
3143 if (!(nor->flags & SNOR_F_IO_MODE_EN_VOLATILE)) in spi_nor_set_octal_dtr()
3146 ret = nor->params->set_octal_dtr(nor, enable); in spi_nor_set_octal_dtr()
3151 nor->reg_proto = SNOR_PROTO_8_8_8_DTR; in spi_nor_set_octal_dtr()
3153 nor->reg_proto = SNOR_PROTO_1_1_1; in spi_nor_set_octal_dtr()
3159 * spi_nor_quad_enable() - enable Quad I/O if needed.
3160 * @nor: pointer to a 'struct spi_nor'
3162 * Return: 0 on success, -errno otherwise.
3164 static int spi_nor_quad_enable(struct spi_nor *nor) in spi_nor_quad_enable() argument
3166 if (!nor->params->quad_enable) in spi_nor_quad_enable()
3169 if (!(spi_nor_get_protocol_width(nor->read_proto) == 4 || in spi_nor_quad_enable()
3170 spi_nor_get_protocol_width(nor->write_proto) == 4)) in spi_nor_quad_enable()
3173 return nor->params->quad_enable(nor); in spi_nor_quad_enable()
3177 * spi_nor_set_4byte_addr_mode() - Set address mode.
3178 * @nor: pointer to a 'struct spi_nor'.
3181 * Return: 0 on success, -errno otherwise.
3183 int spi_nor_set_4byte_addr_mode(struct spi_nor *nor, bool enable) in spi_nor_set_4byte_addr_mode() argument
3185 struct spi_nor_flash_parameter *params = nor->params; in spi_nor_set_4byte_addr_mode()
3196 WARN_ONCE(nor->flags & SNOR_F_BROKEN_RESET, in spi_nor_set_4byte_addr_mode()
3200 ret = params->set_4byte_addr_mode(nor, enable); in spi_nor_set_4byte_addr_mode()
3201 if (ret && ret != -EOPNOTSUPP) in spi_nor_set_4byte_addr_mode()
3205 params->addr_nbytes = 4; in spi_nor_set_4byte_addr_mode()
3206 params->addr_mode_nbytes = 4; in spi_nor_set_4byte_addr_mode()
3208 params->addr_nbytes = 3; in spi_nor_set_4byte_addr_mode()
3209 params->addr_mode_nbytes = 3; in spi_nor_set_4byte_addr_mode()
3215 static int spi_nor_init(struct spi_nor *nor) in spi_nor_init() argument
3219 err = spi_nor_set_octal_dtr(nor, true); in spi_nor_init()
3221 dev_dbg(nor->dev, "octal mode not supported\n"); in spi_nor_init()
3225 err = spi_nor_quad_enable(nor); in spi_nor_init()
3227 dev_dbg(nor->dev, "quad mode not supported\n"); in spi_nor_init()
3232 * Some SPI NOR flashes are write protected by default after a power-on in spi_nor_init()
3233 * reset cycle, in order to avoid inadvertent writes during power-up. in spi_nor_init()
3235 * array at power-up by default. Depending on the kernel configuration in spi_nor_init()
3243 nor->flags & SNOR_F_SWP_IS_VOLATILE)) in spi_nor_init()
3244 spi_nor_try_unlock_all(nor); in spi_nor_init()
3246 if (nor->addr_nbytes == 4 && in spi_nor_init()
3247 nor->read_proto != SNOR_PROTO_8_8_8_DTR && in spi_nor_init()
3248 !(nor->flags & SNOR_F_4B_OPCODES)) in spi_nor_init()
3249 return spi_nor_set_4byte_addr_mode(nor, true); in spi_nor_init()
3255 * spi_nor_soft_reset() - Perform a software reset
3256 * @nor: pointer to 'struct spi_nor'
3259 * the device to its power-on-reset state. This is useful when the software has
3267 * Return: 0 on success, -errno otherwise.
3269 static void spi_nor_soft_reset(struct spi_nor *nor) in spi_nor_soft_reset() argument
3276 spi_nor_spimem_setup_op(nor, &op, nor->reg_proto); in spi_nor_soft_reset()
3278 ret = spi_mem_exec_op(nor->spimem, &op); in spi_nor_soft_reset()
3280 if (ret != -EOPNOTSUPP) in spi_nor_soft_reset()
3281 dev_warn(nor->dev, "Software reset failed: %d\n", ret); in spi_nor_soft_reset()
3287 spi_nor_spimem_setup_op(nor, &op, nor->reg_proto); in spi_nor_soft_reset()
3289 ret = spi_mem_exec_op(nor->spimem, &op); in spi_nor_soft_reset()
3291 dev_warn(nor->dev, "Software reset failed: %d\n", ret); in spi_nor_soft_reset()
3298 * microseconds. So, sleep for a range of 200-400 us. in spi_nor_soft_reset()
3306 struct spi_nor *nor = mtd_to_spi_nor(mtd); in spi_nor_suspend() local
3310 ret = spi_nor_set_octal_dtr(nor, false); in spi_nor_suspend()
3312 dev_err(nor->dev, "suspend() failed\n"); in spi_nor_suspend()
3320 struct spi_nor *nor = mtd_to_spi_nor(mtd); in spi_nor_resume() local
3321 struct device *dev = nor->dev; in spi_nor_resume()
3324 /* re-initialize the nor chip */ in spi_nor_resume()
3325 ret = spi_nor_init(nor); in spi_nor_resume()
3333 struct spi_nor *nor = mtd_to_spi_nor(master); in spi_nor_get_device() local
3336 if (nor->spimem) in spi_nor_get_device()
3337 dev = nor->spimem->spi->controller->dev.parent; in spi_nor_get_device()
3339 dev = nor->dev; in spi_nor_get_device()
3341 if (!try_module_get(dev->driver->owner)) in spi_nor_get_device()
3342 return -ENODEV; in spi_nor_get_device()
3350 struct spi_nor *nor = mtd_to_spi_nor(master); in spi_nor_put_device() local
3353 if (nor->spimem) in spi_nor_put_device()
3354 dev = nor->spimem->spi->controller->dev.parent; in spi_nor_put_device()
3356 dev = nor->dev; in spi_nor_put_device()
3358 module_put(dev->driver->owner); in spi_nor_put_device()
3361 static void spi_nor_restore(struct spi_nor *nor) in spi_nor_restore() argument
3366 if (nor->addr_nbytes == 4 && !(nor->flags & SNOR_F_4B_OPCODES) && in spi_nor_restore()
3367 nor->flags & SNOR_F_BROKEN_RESET) { in spi_nor_restore()
3368 ret = spi_nor_set_4byte_addr_mode(nor, false); in spi_nor_restore()
3372 * will default to the 3-byte address mode after the in spi_nor_restore()
3375 dev_err(nor->dev, "Failed to exit 4-byte address mode, err = %d\n", ret); in spi_nor_restore()
3378 if (nor->flags & SNOR_F_SOFT_RESET) in spi_nor_restore()
3379 spi_nor_soft_reset(nor); in spi_nor_restore()
3382 static const struct flash_info *spi_nor_match_name(struct spi_nor *nor, in spi_nor_match_name() argument
3388 for (j = 0; j < manufacturers[i]->nparts; j++) { in spi_nor_match_name()
3389 if (!strcmp(name, manufacturers[i]->parts[j].name)) { in spi_nor_match_name()
3390 nor->manufacturer = manufacturers[i]; in spi_nor_match_name()
3391 return &manufacturers[i]->parts[j]; in spi_nor_match_name()
3399 static const struct flash_info *spi_nor_get_flash_info(struct spi_nor *nor, in spi_nor_get_flash_info() argument
3405 info = spi_nor_match_name(nor, name); in spi_nor_get_flash_info()
3406 /* Try to auto-detect if chip name wasn't specified or not found */ in spi_nor_get_flash_info()
3408 return spi_nor_detect(nor); in spi_nor_get_flash_info()
3414 if (name && info->id) { in spi_nor_get_flash_info()
3417 jinfo = spi_nor_detect(nor); in spi_nor_get_flash_info()
3425 * marked read-only, and we don't want to loose that in spi_nor_get_flash_info()
3428 dev_warn(nor->dev, "found %s, expected %s\n", in spi_nor_get_flash_info()
3429 jinfo->name, info->name); in spi_nor_get_flash_info()
3437 static void spi_nor_set_mtd_info(struct spi_nor *nor) in spi_nor_set_mtd_info() argument
3439 struct mtd_info *mtd = &nor->mtd; in spi_nor_set_mtd_info()
3440 struct device *dev = nor->dev; in spi_nor_set_mtd_info()
3442 spi_nor_set_mtd_locking_ops(nor); in spi_nor_set_mtd_info()
3443 spi_nor_set_mtd_otp_ops(nor); in spi_nor_set_mtd_info()
3445 mtd->dev.parent = dev; in spi_nor_set_mtd_info()
3446 if (!mtd->name) in spi_nor_set_mtd_info()
3447 mtd->name = dev_name(dev); in spi_nor_set_mtd_info()
3448 mtd->type = MTD_NORFLASH; in spi_nor_set_mtd_info()
3449 mtd->flags = MTD_CAP_NORFLASH; in spi_nor_set_mtd_info()
3450 /* Unset BIT_WRITEABLE to enable JFFS2 write buffer for ECC'd NOR */ in spi_nor_set_mtd_info()
3451 if (nor->flags & SNOR_F_ECC) in spi_nor_set_mtd_info()
3452 mtd->flags &= ~MTD_BIT_WRITEABLE; in spi_nor_set_mtd_info()
3453 if (nor->info->flags & SPI_NOR_NO_ERASE) in spi_nor_set_mtd_info()
3454 mtd->flags |= MTD_NO_ERASE; in spi_nor_set_mtd_info()
3456 mtd->_erase = spi_nor_erase; in spi_nor_set_mtd_info()
3457 mtd->writesize = nor->params->writesize; in spi_nor_set_mtd_info()
3458 mtd->writebufsize = nor->params->page_size; in spi_nor_set_mtd_info()
3459 mtd->size = nor->params->size; in spi_nor_set_mtd_info()
3460 mtd->_read = spi_nor_read; in spi_nor_set_mtd_info()
3462 if (!mtd->_write) in spi_nor_set_mtd_info()
3463 mtd->_write = spi_nor_write; in spi_nor_set_mtd_info()
3464 mtd->_suspend = spi_nor_suspend; in spi_nor_set_mtd_info()
3465 mtd->_resume = spi_nor_resume; in spi_nor_set_mtd_info()
3466 mtd->_get_device = spi_nor_get_device; in spi_nor_set_mtd_info()
3467 mtd->_put_device = spi_nor_put_device; in spi_nor_set_mtd_info()
3470 static int spi_nor_hw_reset(struct spi_nor *nor) in spi_nor_hw_reset() argument
3474 reset = devm_gpiod_get_optional(nor->dev, "reset", GPIOD_OUT_LOW); in spi_nor_hw_reset()
3491 int spi_nor_scan(struct spi_nor *nor, const char *name, in spi_nor_scan() argument
3495 struct device *dev = nor->dev; in spi_nor_scan()
3498 ret = spi_nor_check(nor); in spi_nor_scan()
3502 /* Reset SPI protocol for all commands. */ in spi_nor_scan()
3503 nor->reg_proto = SNOR_PROTO_1_1_1; in spi_nor_scan()
3504 nor->read_proto = SNOR_PROTO_1_1_1; in spi_nor_scan()
3505 nor->write_proto = SNOR_PROTO_1_1_1; in spi_nor_scan()
3509 * through the spi-mem layer (buffers have to be DMA-able). in spi_nor_scan()
3510 * For spi-mem drivers, we'll reallocate a new buffer if in spi_nor_scan()
3511 * nor->params->page_size turns out to be greater than PAGE_SIZE (which in spi_nor_scan()
3512 * shouldn't happen before long since NOR pages are usually less in spi_nor_scan()
3515 nor->bouncebuf_size = PAGE_SIZE; in spi_nor_scan()
3516 nor->bouncebuf = devm_kmalloc(dev, nor->bouncebuf_size, in spi_nor_scan()
3518 if (!nor->bouncebuf) in spi_nor_scan()
3519 return -ENOMEM; in spi_nor_scan()
3521 ret = spi_nor_hw_reset(nor); in spi_nor_scan()
3525 info = spi_nor_get_flash_info(nor, name); in spi_nor_scan()
3529 nor->info = info; in spi_nor_scan()
3531 mutex_init(&nor->lock); in spi_nor_scan()
3534 ret = spi_nor_init_params(nor); in spi_nor_scan()
3538 if (spi_nor_use_parallel_locking(nor)) in spi_nor_scan()
3539 init_waitqueue_head(&nor->rww.wait); in spi_nor_scan()
3542 * Configure the SPI memory: in spi_nor_scan()
3543 * - select op codes for (Fast) Read, Page Program and Sector Erase. in spi_nor_scan()
3544 * - set the number of dummy cycles (mode cycles + wait states). in spi_nor_scan()
3545 * - set the SPI protocols for register and memory accesses. in spi_nor_scan()
3546 * - set the number of address bytes. in spi_nor_scan()
3548 ret = spi_nor_setup(nor, hwcaps); in spi_nor_scan()
3552 /* Send all the required SPI flash commands to initialize device */ in spi_nor_scan()
3553 ret = spi_nor_init(nor); in spi_nor_scan()
3558 spi_nor_set_mtd_info(nor); in spi_nor_scan()
3561 SPI_NOR_MAX_ID_LEN, nor->id); in spi_nor_scan()
3567 static int spi_nor_create_read_dirmap(struct spi_nor *nor) in spi_nor_create_read_dirmap() argument
3570 .op_tmpl = SPI_MEM_OP(SPI_MEM_OP_CMD(nor->read_opcode, 0), in spi_nor_create_read_dirmap()
3571 SPI_MEM_OP_ADDR(nor->addr_nbytes, 0, 0), in spi_nor_create_read_dirmap()
3572 SPI_MEM_OP_DUMMY(nor->read_dummy, 0), in spi_nor_create_read_dirmap()
3575 .length = nor->params->size, in spi_nor_create_read_dirmap()
3579 spi_nor_spimem_setup_op(nor, op, nor->read_proto); in spi_nor_create_read_dirmap()
3582 op->dummy.nbytes = (nor->read_dummy * op->dummy.buswidth) / 8; in spi_nor_create_read_dirmap()
3583 if (spi_nor_protocol_is_dtr(nor->read_proto)) in spi_nor_create_read_dirmap()
3584 op->dummy.nbytes *= 2; in spi_nor_create_read_dirmap()
3588 * of data bytes is non-zero, the data buswidth won't be set here. So, in spi_nor_create_read_dirmap()
3591 op->data.buswidth = spi_nor_get_protocol_data_nbits(nor->read_proto); in spi_nor_create_read_dirmap()
3593 nor->dirmap.rdesc = devm_spi_mem_dirmap_create(nor->dev, nor->spimem, in spi_nor_create_read_dirmap()
3595 return PTR_ERR_OR_ZERO(nor->dirmap.rdesc); in spi_nor_create_read_dirmap()
3598 static int spi_nor_create_write_dirmap(struct spi_nor *nor) in spi_nor_create_write_dirmap() argument
3601 .op_tmpl = SPI_MEM_OP(SPI_MEM_OP_CMD(nor->program_opcode, 0), in spi_nor_create_write_dirmap()
3602 SPI_MEM_OP_ADDR(nor->addr_nbytes, 0, 0), in spi_nor_create_write_dirmap()
3606 .length = nor->params->size, in spi_nor_create_write_dirmap()
3610 if (nor->program_opcode == SPINOR_OP_AAI_WP && nor->sst_write_second) in spi_nor_create_write_dirmap()
3611 op->addr.nbytes = 0; in spi_nor_create_write_dirmap()
3613 spi_nor_spimem_setup_op(nor, op, nor->write_proto); in spi_nor_create_write_dirmap()
3617 * of data bytes is non-zero, the data buswidth won't be set here. So, in spi_nor_create_write_dirmap()
3620 op->data.buswidth = spi_nor_get_protocol_data_nbits(nor->write_proto); in spi_nor_create_write_dirmap()
3622 nor->dirmap.wdesc = devm_spi_mem_dirmap_create(nor->dev, nor->spimem, in spi_nor_create_write_dirmap()
3624 return PTR_ERR_OR_ZERO(nor->dirmap.wdesc); in spi_nor_create_write_dirmap()
3629 struct spi_device *spi = spimem->spi; in spi_nor_probe() local
3630 struct flash_platform_data *data = dev_get_platdata(&spi->dev); in spi_nor_probe()
3631 struct spi_nor *nor; in spi_nor_probe() local
3640 nor = devm_kzalloc(&spi->dev, sizeof(*nor), GFP_KERNEL); in spi_nor_probe()
3641 if (!nor) in spi_nor_probe()
3642 return -ENOMEM; in spi_nor_probe()
3644 nor->spimem = spimem; in spi_nor_probe()
3645 nor->dev = &spi->dev; in spi_nor_probe()
3646 spi_nor_set_flash_node(nor, spi->dev.of_node); in spi_nor_probe()
3648 spi_mem_set_drvdata(spimem, nor); in spi_nor_probe()
3650 if (data && data->name) in spi_nor_probe()
3651 nor->mtd.name = data->name; in spi_nor_probe()
3653 if (!nor->mtd.name) in spi_nor_probe()
3654 nor->mtd.name = spi_mem_get_name(spimem); in spi_nor_probe()
3662 if (data && data->type) in spi_nor_probe()
3663 flash_name = data->type; in spi_nor_probe()
3664 else if (!strcmp(spi->modalias, "spi-nor")) in spi_nor_probe()
3665 flash_name = NULL; /* auto-detect */ in spi_nor_probe()
3667 flash_name = spi->modalias; in spi_nor_probe()
3669 ret = spi_nor_scan(nor, flash_name, &hwcaps); in spi_nor_probe()
3673 spi_nor_debugfs_register(nor); in spi_nor_probe()
3678 * a NOR we don't end up with buffer overflows. in spi_nor_probe()
3680 if (nor->params->page_size > PAGE_SIZE) { in spi_nor_probe()
3681 nor->bouncebuf_size = nor->params->page_size; in spi_nor_probe()
3682 devm_kfree(nor->dev, nor->bouncebuf); in spi_nor_probe()
3683 nor->bouncebuf = devm_kmalloc(nor->dev, in spi_nor_probe()
3684 nor->bouncebuf_size, in spi_nor_probe()
3686 if (!nor->bouncebuf) in spi_nor_probe()
3687 return -ENOMEM; in spi_nor_probe()
3690 ret = spi_nor_create_read_dirmap(nor); in spi_nor_probe()
3694 ret = spi_nor_create_write_dirmap(nor); in spi_nor_probe()
3698 return mtd_device_register(&nor->mtd, data ? data->parts : NULL, in spi_nor_probe()
3699 data ? data->nr_parts : 0); in spi_nor_probe()
3704 struct spi_nor *nor = spi_mem_get_drvdata(spimem); in spi_nor_remove() local
3706 spi_nor_restore(nor); in spi_nor_remove()
3709 return mtd_device_unregister(&nor->mtd); in spi_nor_remove()
3714 struct spi_nor *nor = spi_mem_get_drvdata(spimem); in spi_nor_shutdown() local
3716 spi_nor_restore(nor); in spi_nor_shutdown()
3724 * differences can often be differentiated by the JEDEC read-ID command, we
3725 * encourage new users to add support to the spi-nor library, and simply bind
3726 * against a generic string here (e.g., "jedec,spi-nor").
3733 * Allow non-DT platform devices to bind to the "spi-nor" modalias, and
3734 * hack around the fact that the SPI core does not provide uevent
3737 {"spi-nor"},
3741 * them with "spi-nor" in platform data.
3746 * Entries that were used in DTs without "jedec,spi-nor" fallback and
3762 {"m25p05-nonjedec"}, {"m25p10-nonjedec"}, {"m25p20-nonjedec"},
3763 {"m25p40-nonjedec"}, {"m25p80-nonjedec"}, {"m25p16-nonjedec"},
3764 {"m25p32-nonjedec"}, {"m25p64-nonjedec"}, {"m25p128-nonjedec"},
3766 /* Everspin MRAMs (non-JEDEC) */
3774 MODULE_DEVICE_TABLE(spi, spi_nor_dev_ids);
3778 * Generic compatibility for SPI NOR that can be identified by the
3781 { .compatible = "jedec,spi-nor" },
3787 * REVISIT: many of these chips have deep power-down modes, which
3794 .name = "spi-nor",
3821 MODULE_DESCRIPTION("framework for SPI NOR");