Lines Matching +full:dev +full:- +full:size

4  * SPDX-License-Identifier: Apache-2.0
37 #define flash_andes_qspi_cmd_read(dev, opcode, dest, length) \ argument
38 flash_andes_qspi_access(dev, opcode, 0, 0, dest, length)
39 #define flash_andes_qspi_cmd_addr_read(dev, opcode, addr, dest, length) \ argument
40 flash_andes_qspi_access(dev, opcode, ANDES_ACCESS_ADDRESSED, addr, \
42 #define flash_andes_qspi_cmd_write(dev, opcode) \ argument
43 flash_andes_qspi_access(dev, opcode, ANDES_ACCESS_WRITE, 0, NULL, 0)
44 #define flash_andes_qspi_cmd_addr_write(dev, opcode, addr, src, length) \ argument
45 flash_andes_qspi_access(dev, opcode, \
89 static int flash_andes_qspi_write_protection_set(const struct device *dev,
94 dev_erase_types(const struct device *dev) in dev_erase_types() argument
96 const struct flash_andes_qspi_data *dev_data = dev->data; in dev_erase_types()
98 return dev_data->erase_types; in dev_erase_types()
101 /* Get the size of the flash device. */
102 static inline uint32_t dev_flash_size(const struct device *dev) in dev_flash_size() argument
105 const struct flash_andes_qspi_data *dev_data = dev->data; in dev_flash_size()
107 return dev_data->flash_size; in dev_flash_size()
109 const struct flash_andes_qspi_config *config = dev->config; in dev_flash_size()
111 return config->flash_size; in dev_flash_size()
115 /* Get the flash device page size. */
116 static inline uint16_t dev_page_size(const struct device *dev) in dev_page_size() argument
118 const struct flash_andes_qspi_data *dev_data = dev->data; in dev_page_size()
120 return dev_data->page_size; in dev_page_size()
126 * @param dev Device struct
131 * @param length The size of the buffer
134 static int flash_andes_qspi_access(const struct device *const dev, in flash_andes_qspi_access() argument
138 struct flash_andes_qspi_data *dev_data = dev->data; in flash_andes_qspi_access()
139 const struct flash_andes_qspi_config *config = dev->config; in flash_andes_qspi_access()
140 uint32_t base = config->base; in flash_andes_qspi_access()
167 dev_data->tx_ptr = 0; in flash_andes_qspi_access()
168 dev_data->tx_buf = (uint8_t *)data; in flash_andes_qspi_access()
169 dev_data->tx_len = length; in flash_andes_qspi_access()
172 ((length - 1) << TCTRL_WR_TCNT_OFFSET)); in flash_andes_qspi_access()
175 dev_data->rx_ptr = 0; in flash_andes_qspi_access()
176 dev_data->rx_buf = (uint8_t *)data; in flash_andes_qspi_access()
179 ((length - 1) << TCTRL_RD_TCNT_OFFSET)); in flash_andes_qspi_access()
213 k_sem_take(&dev_data->device_sync_sem, K_FOREVER); in flash_andes_qspi_access()
219 static void acquire_device(const struct device *dev) in acquire_device() argument
221 struct flash_andes_qspi_data *dev_data = dev->data; in acquire_device()
223 k_sem_take(&dev_data->sem, K_FOREVER); in acquire_device()
227 static void release_device(const struct device *dev) in release_device() argument
229 struct flash_andes_qspi_data *dev_data = dev->data; in release_device()
231 k_sem_give(&dev_data->sem); in release_device()
237 * @param dev The device structure
240 static int flash_andes_qspi_wait_until_ready(const struct device *dev) in flash_andes_qspi_wait_until_ready() argument
246 ret = flash_andes_qspi_cmd_read(dev, in flash_andes_qspi_wait_until_ready()
261 * @param dev Device struct
264 * @param length The size of the buffer
267 static int read_sfdp(const struct device *const dev, in read_sfdp() argument
270 /* READ_SFDP requires a 24-bit address followed by a single in read_sfdp()
271 * byte for a wait state. This is effected by using 32-bit in read_sfdp()
272 * address by shifting the 24-bit address up 8 bits. in read_sfdp()
274 return flash_andes_qspi_access(dev, JESD216_CMD_READ_SFDP, in read_sfdp()
286 * @param dev Device struct
291 static int flash_andes_qspi_wrsr(const struct device *dev, in flash_andes_qspi_wrsr() argument
294 int ret = flash_andes_qspi_cmd_write(dev, FLASH_ANDES_CMD_WREN); in flash_andes_qspi_wrsr()
297 ret = flash_andes_qspi_access(dev, FLASH_ANDES_CMD_WRSR, in flash_andes_qspi_wrsr()
300 flash_andes_qspi_wait_until_ready(dev); in flash_andes_qspi_wrsr()
306 static int flash_andes_qspi_read(const struct device *dev, in flash_andes_qspi_read() argument
307 off_t addr, void *dest, size_t size) in flash_andes_qspi_read() argument
309 const size_t flash_size = dev_flash_size(dev); in flash_andes_qspi_read()
310 size_t to_read = size; in flash_andes_qspi_read()
314 /* should be between 0 and flash size */ in flash_andes_qspi_read()
315 if ((addr < 0 || addr >= flash_size || ((flash_size - addr) < size))) { in flash_andes_qspi_read()
316 return -EINVAL; in flash_andes_qspi_read()
319 if (size == 0) { in flash_andes_qspi_read()
323 acquire_device(dev); in flash_andes_qspi_read()
326 /* Get the adequate size to receive */ in flash_andes_qspi_read()
327 to_read = MIN(MAX_TRANSFER_CNT, size); in flash_andes_qspi_read()
329 ret = flash_andes_qspi_cmd_addr_read(dev, in flash_andes_qspi_read()
336 size -= to_read; in flash_andes_qspi_read()
340 flash_andes_qspi_wait_until_ready(dev); in flash_andes_qspi_read()
341 } while (size > 0); in flash_andes_qspi_read()
343 release_device(dev); in flash_andes_qspi_read()
347 static int flash_andes_qspi_write(const struct device *dev, off_t addr, in flash_andes_qspi_write() argument
348 const void *src, size_t size) in flash_andes_qspi_write() argument
350 const size_t flash_size = dev_flash_size(dev); in flash_andes_qspi_write()
351 const uint16_t page_size = dev_page_size(dev); in flash_andes_qspi_write()
352 size_t to_write = size; in flash_andes_qspi_write()
355 /* should be between 0 and flash size */ in flash_andes_qspi_write()
356 if ((addr < 0 || addr >= flash_size || ((flash_size - addr) < size))) { in flash_andes_qspi_write()
357 return -EINVAL; in flash_andes_qspi_write()
360 if (size == 0) { in flash_andes_qspi_write()
364 acquire_device(dev); in flash_andes_qspi_write()
366 ret = flash_andes_qspi_write_protection_set(dev, false); in flash_andes_qspi_write()
373 /* Get the adequate size to send*/ in flash_andes_qspi_write()
374 to_write = MIN(page_size - (addr % page_size), size); in flash_andes_qspi_write()
376 flash_andes_qspi_cmd_write(dev, FLASH_ANDES_CMD_WREN); in flash_andes_qspi_write()
378 ret = flash_andes_qspi_cmd_addr_write(dev, in flash_andes_qspi_write()
385 size -= to_write; in flash_andes_qspi_write()
389 flash_andes_qspi_wait_until_ready(dev); in flash_andes_qspi_write()
390 } while (size > 0); in flash_andes_qspi_write()
393 int ret2 = flash_andes_qspi_write_protection_set(dev, true); in flash_andes_qspi_write()
400 release_device(dev); in flash_andes_qspi_write()
404 static int flash_andes_qspi_erase(const struct device *dev, in flash_andes_qspi_erase() argument
405 off_t addr, size_t size) in flash_andes_qspi_erase() argument
407 const size_t flash_size = dev_flash_size(dev); in flash_andes_qspi_erase()
411 if ((addr < 0 || addr >= flash_size || ((flash_size - addr) < size))) { in flash_andes_qspi_erase()
412 return -EINVAL; in flash_andes_qspi_erase()
415 if (size == 0) { in flash_andes_qspi_erase()
419 /* address must be sector-aligned */ in flash_andes_qspi_erase()
421 return -EINVAL; in flash_andes_qspi_erase()
424 /* size must be a multiple of sectors */ in flash_andes_qspi_erase()
425 if ((size % SPI_NOR_SECTOR_SIZE) != 0) { in flash_andes_qspi_erase()
426 return -EINVAL; in flash_andes_qspi_erase()
429 acquire_device(dev); in flash_andes_qspi_erase()
431 ret = flash_andes_qspi_write_protection_set(dev, false); in flash_andes_qspi_erase()
437 if (size == flash_size) { in flash_andes_qspi_erase()
439 flash_andes_qspi_cmd_write(dev, FLASH_ANDES_CMD_CE); in flash_andes_qspi_erase()
440 size -= flash_size; in flash_andes_qspi_erase()
441 flash_andes_qspi_wait_until_ready(dev); in flash_andes_qspi_erase()
444 while (size > 0) { in flash_andes_qspi_erase()
446 dev_erase_types(dev); in flash_andes_qspi_erase()
453 if ((etp->exp != 0) && in flash_andes_qspi_erase()
454 SPI_NOR_IS_ALIGNED(addr, etp->exp) && in flash_andes_qspi_erase()
455 SPI_NOR_IS_ALIGNED(size, etp->exp) && in flash_andes_qspi_erase()
456 ((bet == NULL) || (etp->exp > bet->exp))) { in flash_andes_qspi_erase()
462 flash_andes_qspi_cmd_addr_write(dev, bet->cmd, in flash_andes_qspi_erase()
464 addr += BIT(bet->exp); in flash_andes_qspi_erase()
465 size -= BIT(bet->exp); in flash_andes_qspi_erase()
468 size, (long)addr); in flash_andes_qspi_erase()
469 ret = -EINVAL; in flash_andes_qspi_erase()
473 flash_andes_qspi_wait_until_ready(dev); in flash_andes_qspi_erase()
476 int ret2 = flash_andes_qspi_write_protection_set(dev, true); in flash_andes_qspi_erase()
483 release_device(dev); in flash_andes_qspi_erase()
488 static int flash_andes_qspi_write_protection_set(const struct device *dev, in flash_andes_qspi_write_protection_set() argument
491 return flash_andes_qspi_cmd_write(dev, (write_protect) ? in flash_andes_qspi_write_protection_set()
497 static int flash_andes_qspi_sfdp_read(const struct device *dev, off_t addr, in flash_andes_qspi_sfdp_read() argument
498 void *dest, size_t size) in flash_andes_qspi_sfdp_read() argument
500 acquire_device(dev); in flash_andes_qspi_sfdp_read()
502 int ret = read_sfdp(dev, addr, dest, size); in flash_andes_qspi_sfdp_read()
504 release_device(dev); in flash_andes_qspi_sfdp_read()
511 static int flash_andes_qspi_read_jedec_id(const struct device *dev, in flash_andes_qspi_read_jedec_id() argument
515 return -EINVAL; in flash_andes_qspi_read_jedec_id()
518 acquire_device(dev); in flash_andes_qspi_read_jedec_id()
520 int ret = flash_andes_qspi_cmd_read(dev, FLASH_ANDES_CMD_RDID, id, 3); in flash_andes_qspi_read_jedec_id()
522 release_device(dev); in flash_andes_qspi_read_jedec_id()
527 static int spi_nor_process_bfp(const struct device *dev, in spi_nor_process_bfp() argument
531 struct flash_andes_qspi_data *dev_data = dev->data; in spi_nor_process_bfp()
532 struct jesd216_erase_type *etp = dev_data->erase_types; in spi_nor_process_bfp()
535 LOG_DBG("%s: %u MiBy flash", dev->name, (uint32_t)(flash_size >> 20)); in spi_nor_process_bfp()
540 memset(dev_data->erase_types, 0, sizeof(dev_data->erase_types)); in spi_nor_process_bfp()
541 for (uint8_t ti = 1; ti <= ARRAY_SIZE(dev_data->erase_types); ++ti) { in spi_nor_process_bfp()
544 (uint32_t)BIT(etp->exp), etp->cmd); in spi_nor_process_bfp()
549 dev_data->page_size = jesd216_bfp_page_size(php, bfp); in spi_nor_process_bfp()
551 dev_data->flash_size = flash_size; in spi_nor_process_bfp()
553 if (flash_size != dev_flash_size(dev)) { in spi_nor_process_bfp()
554 LOG_ERR("BFP flash size mismatch with devicetree"); in spi_nor_process_bfp()
555 return -EINVAL; in spi_nor_process_bfp()
562 static int spi_nor_process_sfdp(const struct device *dev) in spi_nor_process_sfdp() argument
576 ret = read_sfdp(dev, 0, u_header.raw, sizeof(u_header.raw)); in spi_nor_process_sfdp()
586 return -EINVAL; in spi_nor_process_sfdp()
589 LOG_DBG("%s: SFDP v %u.%u AP %x with %u PH", dev->name, in spi_nor_process_sfdp()
590 hp->rev_major, hp->rev_minor, hp->access, 1 + hp->nph); in spi_nor_process_sfdp()
592 const struct jesd216_param_header *php = hp->phdr; in spi_nor_process_sfdp()
594 php + MIN(decl_nph, 1 + hp->nph); in spi_nor_process_sfdp()
600 (php - hp->phdr), id, php->rev_major, php->rev_minor, in spi_nor_process_sfdp()
601 php->len_dw, jesd216_param_addr(php)); in spi_nor_process_sfdp()
605 uint32_t dw[MIN(php->len_dw, 20)]; in spi_nor_process_sfdp()
610 ret = read_sfdp(dev, in spi_nor_process_sfdp()
617 ret = spi_nor_process_bfp(dev, php, bfp); in spi_nor_process_sfdp()
629 const struct flash_andes_qspi_config *config = dev->config; in spi_nor_process_sfdp()
631 .len_dw = config->bfp_len, in spi_nor_process_sfdp()
634 ret = spi_nor_process_bfp(dev, &bfp_hdr, config->bfp); in spi_nor_process_sfdp()
642 static int setup_pages_layout(const struct device *dev) in setup_pages_layout() argument
648 struct flash_andes_qspi_data *dev_data = dev->data; in setup_pages_layout()
649 const size_t flash_size = dev_flash_size(dev); in setup_pages_layout()
654 /* Find the smallest erase size. */ in setup_pages_layout()
655 for (size_t i = 0; i < ARRAY_SIZE(dev_data->erase_types); ++i) { in setup_pages_layout()
657 &dev_data->erase_types[i]; in setup_pages_layout()
659 if ((etp->cmd != 0) && in setup_pages_layout()
660 ((exponent == 0) || (etp->exp < exponent))) { in setup_pages_layout()
661 exponent = etp->exp; in setup_pages_layout()
666 return -ENOTSUP; in setup_pages_layout()
671 /* Error if layout page size is not a multiple of smallest in setup_pages_layout()
672 * erase size. in setup_pages_layout()
675 LOG_ERR("layout page %u not compatible with erase size %u", in setup_pages_layout()
677 return -EINVAL; in setup_pages_layout()
684 LOG_WRN("layout page %u wastes space with device size %zu", in setup_pages_layout()
688 dev_data->layout.pages_size = layout_page_size; in setup_pages_layout()
689 dev_data->layout.pages_count = flash_size / layout_page_size; in setup_pages_layout()
690 LOG_DBG("layout %zu x %zu By pages", dev_data->layout.pages_count, in setup_pages_layout()
691 dev_data->layout.pages_size); in setup_pages_layout()
694 const struct flash_andes_qspi_config *config = dev->config; in setup_pages_layout()
695 const struct flash_pages_layout *layout = &config->layout; in setup_pages_layout()
696 const size_t flash_size = dev_flash_size(dev); in setup_pages_layout()
697 size_t layout_size = layout->pages_size * layout->pages_count; in setup_pages_layout()
699 if (!SPI_NOR_IS_SECTOR_ALIGNED(layout->pages_size)) { in setup_pages_layout()
702 return -EINVAL; in setup_pages_layout()
706 LOG_ERR("device size %zu mismatch %zu * %zu By pages", in setup_pages_layout()
707 flash_size, layout->pages_count, layout->pages_size); in setup_pages_layout()
708 return -EINVAL; in setup_pages_layout()
717 static int qspi_andes_configure(const struct device *dev) in qspi_andes_configure() argument
719 const struct flash_andes_qspi_config *config = dev->config; in qspi_andes_configure()
720 uint32_t base = config->base; in qspi_andes_configure()
747 static void qspi_andes_irq_handler(const struct device *dev) in qspi_andes_irq_handler() argument
749 struct flash_andes_qspi_data *data = dev->data; in qspi_andes_irq_handler()
750 const struct flash_andes_qspi_config *config = dev->config; in qspi_andes_irq_handler()
751 uint32_t base = config->base; in qspi_andes_irq_handler()
765 tx_num = data->tx_fifo_size - cur_tx_fifo_num; in qspi_andes_irq_handler()
767 if (tx_num > data->tx_len) { in qspi_andes_irq_handler()
768 tx_num = data->tx_len; in qspi_andes_irq_handler()
771 for (i = tx_num; i > 0; i--) { in qspi_andes_irq_handler()
772 tx_data = data->tx_buf[data->tx_ptr]; in qspi_andes_irq_handler()
774 data->tx_ptr++; in qspi_andes_irq_handler()
775 if (data->tx_ptr == data->tx_len) { in qspi_andes_irq_handler()
786 for (i = cur_rx_fifo_num; i > 0; i--) { in qspi_andes_irq_handler()
788 data->rx_buf[data->rx_ptr] = rx_data; in qspi_andes_irq_handler()
789 data->rx_ptr++; in qspi_andes_irq_handler()
790 if (data->rx_ptr == data->rx_len) { in qspi_andes_irq_handler()
806 k_sem_give(&data->device_sync_sem); in qspi_andes_irq_handler()
816 static int flash_andes_qspi_init(const struct device *dev) in flash_andes_qspi_init() argument
818 const struct flash_andes_qspi_config *config = dev->config; in flash_andes_qspi_init()
819 struct flash_andes_qspi_data *dev_data = dev->data; in flash_andes_qspi_init()
820 uint32_t base = config->base; in flash_andes_qspi_init()
826 if (config->qspi_cfg_rom) { in flash_andes_qspi_init()
827 return -EINVAL; in flash_andes_qspi_init()
830 k_sem_init(&dev_data->sem, 1, 1); in flash_andes_qspi_init()
831 k_sem_init(&dev_data->device_sync_sem, 0, 1); in flash_andes_qspi_init()
833 /* Get the TX/RX FIFO size of this device */ in flash_andes_qspi_init()
834 dev_data->tx_fifo_size = TX_FIFO_SIZE(base); in flash_andes_qspi_init()
835 dev_data->rx_fifo_size = RX_FIFO_SIZE(base); in flash_andes_qspi_init()
837 config->cfg_func(); in flash_andes_qspi_init()
838 irq_enable(config->irq_num); in flash_andes_qspi_init()
840 qspi_andes_configure(dev); in flash_andes_qspi_init()
842 ret = flash_andes_qspi_read_jedec_id(dev, jedec_id); in flash_andes_qspi_init()
845 return -ENODEV; in flash_andes_qspi_init()
850 if (memcmp(jedec_id, config->jedec_id, sizeof(jedec_id)) != 0) { in flash_andes_qspi_init()
853 config->jedec_id[0], config->jedec_id[1], config->jedec_id[2]); in flash_andes_qspi_init()
854 return -EINVAL; in flash_andes_qspi_init()
858 ret = spi_nor_process_sfdp(dev); in flash_andes_qspi_init()
861 return -ENODEV; in flash_andes_qspi_init()
865 ret = setup_pages_layout(dev); in flash_andes_qspi_init()
868 return -ENODEV; in flash_andes_qspi_init()
873 flash_andes_qspi_wrsr(dev, reg); in flash_andes_qspi_init()
879 static void flash_andes_qspi_pages_layout(const struct device *dev, in flash_andes_qspi_pages_layout() argument
884 const struct flash_andes_qspi_data *dev_data = dev->data; in flash_andes_qspi_pages_layout()
886 *layout = &dev_data->layout; in flash_andes_qspi_pages_layout()
888 const struct flash_andes_qspi_config *config = dev->config; in flash_andes_qspi_pages_layout()
890 *layout = &config->layout; in flash_andes_qspi_pages_layout()
898 flash_andes_qspi_get_parameters(const struct device *dev) in flash_andes_qspi_get_parameters() argument
900 const struct flash_andes_qspi_config *config = dev->config; in flash_andes_qspi_get_parameters()
902 return &config->parameters; in flash_andes_qspi_get_parameters()
938 .pages_count = ((DT_INST_PROP(n, size) / 8) / \
955 .flash_size = DT_INST_PROP(n, size) / 8, \