Lines Matching +full:rk +full:- +full:nand
4 * SPDX-License-Identifier: GPL-2.0+
15 #include <nand.h>
18 #include <dm/device-internal.h>
19 #include <linux/mtd/spi-nor.h>
21 #include <linux/mtd/nand.h>
28 #define MTD_BLK_TABLE_BLOCK_UNKNOWN (-2)
29 #define MTD_BLK_TABLE_BLOCK_SHIFT (-1)
42 return -ENODEV; in mtd_blk_map_table_init()
44 switch (desc->devnum) { in mtd_blk_map_table_init()
47 mtd = desc->bdev->priv; in mtd_blk_map_table_init()
54 return -ENODEV; in mtd_blk_map_table_init()
56 blk_total = (mtd->size + mtd->erasesize - 1) >> mtd->erasesize_shift; in mtd_blk_map_table_init()
60 return -ENOMEM; in mtd_blk_map_table_init()
65 blk_begin = (u32)offset >> mtd->erasesize_shift; in mtd_blk_map_table_init()
66 blk_cnt = ((u32)((offset & mtd->erasesize_mask) + length + \ in mtd_blk_map_table_init()
67 mtd->erasesize - 1) >> mtd->erasesize_shift); in mtd_blk_map_table_init()
70 return -EINVAL; in mtd_blk_map_table_init()
73 blk_cnt = blk_total - blk_begin; in mtd_blk_map_table_init()
84 if (!mtd_block_isbad(mtd, (blk_begin + j) << mtd->erasesize_shift)) { in mtd_blk_map_table_init()
102 size_t block_offset = offset & (mtd->erasesize - 1); in get_mtd_blk_map_address()
106 mtd_map_blk_table[(u64)offset >> mtd->erasesize_shift] == in get_mtd_blk_map_address()
108 mtd_map_blk_table[(u64)offset >> mtd->erasesize_shift] == in get_mtd_blk_map_address()
114 mtd->erasesize_shift] << mtd->erasesize_shift) + block_offset); in get_mtd_blk_map_address()
127 if (desc->if_type != IF_TYPE_MTD) in mtd_blk_map_partitions()
148 if (desc->if_type != IF_TYPE_MTD) in mtd_blk_map_fit()
151 if (desc->devnum == BLK_MTD_NAND) { in mtd_blk_map_fit()
153 mtd = dev_get_priv(desc->bdev->parent); in mtd_blk_map_fit()
155 } else if (desc->devnum == BLK_MTD_SPI_NAND) { in mtd_blk_map_fit()
157 mtd = desc->bdev->priv; in mtd_blk_map_fit()
166 if (mtd_blk_map_table_init(desc, sector << 9, totalsize + (size_t)mtd->erasesize)) in mtd_blk_map_fit()
180 size_t block_offset = offset & (mtd->erasesize - 1); in mtd_map_read()
184 if (offset >= mtd->size) in mtd_map_read()
190 ~(mtd->erasesize - 1))) { in mtd_map_read()
192 offset & ~(mtd->erasesize - 1)); in mtd_map_read()
193 offset += mtd->erasesize - block_offset; in mtd_map_read()
198 if (left_to_read < (mtd->erasesize - block_offset)) in mtd_map_read()
201 read_length = mtd->erasesize - block_offset; in mtd_map_read()
205 if (rval && rval != -EUCLEAN) { in mtd_map_read()
206 printf("NAND read from offset %llx failed %d\n", in mtd_map_read()
208 *length -= left_to_read; in mtd_map_read()
212 left_to_read -= read_length; in mtd_map_read()
229 blocksize = mtd->erasesize; in mtd_map_write()
242 if ((offset & (mtd->writesize - 1)) != 0) { in mtd_map_write()
243 printf("Attempt to write non page-aligned data\n"); in mtd_map_write()
245 return -EINVAL; in mtd_map_write()
249 size_t block_offset = offset & (mtd->erasesize - 1); in mtd_map_write()
253 if (offset >= mtd->size) in mtd_map_write()
259 ~(mtd->erasesize - 1))) { in mtd_map_write()
261 offset & ~(mtd->erasesize - 1)); in mtd_map_write()
262 offset += mtd->erasesize - block_offset; in mtd_map_write()
267 if (!(mapped_offset & mtd->erasesize_mask)) { in mtd_map_write()
270 ei.len = mtd->erasesize; in mtd_map_write()
279 if (left_to_write < (blocksize - block_offset)) in mtd_map_write()
282 write_size = blocksize - block_offset; in mtd_map_write()
292 printf("NAND write to offset %llx failed %d\n", in mtd_map_write()
294 *length -= left_to_write; in mtd_map_write()
298 left_to_write -= write_size; in mtd_map_write()
314 if ((pos & mtd->erasesize_mask) || (len & mtd->erasesize_mask)) { in mtd_map_erase()
315 pr_err("Attempt to erase non block-aligned data, pos= %llx, len= %llx\n", in mtd_map_erase()
318 return -EINVAL; in mtd_map_erase()
329 pos += mtd->erasesize; in mtd_map_erase()
336 ei.len = mtd->erasesize; in mtd_map_erase()
344 pos += mtd->erasesize; in mtd_map_erase()
345 len -= mtd->erasesize; in mtd_map_erase()
368 mtd = (struct mtd_info *)dev_desc->bdev->priv; in mtd_part_parse()
379 snprintf(mtd_part_info_p, data_len - 1, "%s%s:", in mtd_part_parse()
381 dev_desc->product); in mtd_part_parse()
382 data_len -= strlen(mtd_part_info_p); in mtd_part_parse()
393 snprintf(mtd_part_info_p, data_len - 1, "0x%x@0x%x(%s)", in mtd_part_parse()
397 snprintf(mtd_part_info_temp, MTD_SINGLE_PART_INFO_MAX_SIZE - 1, in mtd_part_parse()
405 if ((info.size + info.start + 64) >= dev_desc->lba) { in mtd_part_parse()
406 if (dev_desc->devnum == BLK_MTD_SPI_NOR) { in mtd_part_parse()
412 snprintf(mtd_part_info_p, data_len - 1, "0x%x@0x%x(%s)", in mtd_part_parse()
413 (int)(size_t)(info.size - in mtd_part_parse()
414 (info.size - 1) % in mtd_part_parse()
415 (0x10000 >> 9) - 1) << 9, in mtd_part_parse()
420 /* Nand flash is erased by block and gpt table just in mtd_part_parse()
425 snprintf(mtd_part_info_p, data_len - 1, "0x%x@0x%x(%s)", in mtd_part_parse()
426 (int)(size_t)(info.size - in mtd_part_parse()
427 (info.size - 1) % in mtd_part_parse()
428 (mtd->erasesize >> 9) - 1) << 9, in mtd_part_parse()
434 snprintf(mtd_part_info_temp, MTD_SINGLE_PART_INFO_MAX_SIZE - 1, in mtd_part_parse()
443 data_len -= length; in mtd_part_parse()
465 mtd = desc->bdev->priv; in mtd_dread()
472 pr_debug("mtd dread %s %lx %lx\n", mtd->name, start, blkcnt); in mtd_dread()
474 if (desc->devnum == BLK_MTD_NAND) { in mtd_dread()
476 NULL, mtd->size, in mtd_dread()
482 } else if (desc->devnum == BLK_MTD_SPI_NAND) { in mtd_dread()
484 NULL, mtd->size, in mtd_dread()
490 } else if (desc->devnum == BLK_MTD_SPI_NOR) { in mtd_dread()
492 struct spi_nor *nor = (struct spi_nor *)mtd->priv; in mtd_dread()
493 struct spi_slave *spi = nor->spi; in mtd_dread()
496 if (desc->op_flag == BLK_PRE_RW) in mtd_dread()
497 spi->mode |= SPI_DMA_PREPARE; in mtd_dread()
499 if (desc->op_flag == BLK_PRE_RW) in mtd_dread()
500 spi->mode &= ~SPI_DMA_PREPARE; in mtd_dread()
527 mtd = desc->bdev->priv; in mtd_dwrite()
531 pr_debug("mtd dwrite %s %lx %lx\n", mtd->name, start, blkcnt); in mtd_dwrite()
536 if (desc->devnum == BLK_MTD_NAND || in mtd_dwrite()
537 desc->devnum == BLK_MTD_SPI_NAND || in mtd_dwrite()
538 desc->devnum == BLK_MTD_SPI_NOR) { in mtd_dwrite()
539 if (desc->op_flag == BLK_MTD_CONT_WRITE) { in mtd_dwrite()
541 NULL, mtd->size, in mtd_dwrite()
552 alinged = off & mtd->erasesize_mask; in mtd_dwrite()
553 off_aligned = off - alinged; in mtd_dwrite()
555 rwsize_aligned = (rwsize_aligned + mtd->erasesize - 1) & in mtd_dwrite()
556 ~(mtd->erasesize - 1); in mtd_dwrite()
565 NULL, mtd->size, in mtd_dwrite()
575 NULL, mtd->size, in mtd_dwrite()
604 mtd = desc->bdev->priv; in mtd_derase()
608 pr_debug("mtd derase %s %lx %lx\n", mtd->name, start, blkcnt); in mtd_derase()
613 if (desc->devnum == BLK_MTD_NAND || in mtd_derase()
614 desc->devnum == BLK_MTD_SPI_NAND || in mtd_derase()
615 desc->devnum == BLK_MTD_SPI_NOR) { in mtd_derase()
633 mtd = dev_get_uclass_priv(udev->parent); in mtd_blk_probe()
634 if (mtd->type == MTD_NANDFLASH && desc->devnum == BLK_MTD_NAND) { in mtd_blk_probe()
636 mtd = dev_get_priv(udev->parent); in mtd_blk_probe()
641 if (is_power_of_2(mtd->erasesize)) in mtd_blk_probe()
642 mtd->erasesize_shift = ffs(mtd->erasesize) - 1; in mtd_blk_probe()
644 mtd->erasesize_shift = 0; in mtd_blk_probe()
646 if (is_power_of_2(mtd->writesize)) in mtd_blk_probe()
647 mtd->writesize_shift = ffs(mtd->writesize) - 1; in mtd_blk_probe()
649 mtd->writesize_shift = 0; in mtd_blk_probe()
651 mtd->erasesize_mask = (1 << mtd->erasesize_shift) - 1; in mtd_blk_probe()
652 mtd->writesize_mask = (1 << mtd->writesize_shift) - 1; in mtd_blk_probe()
654 desc->bdev->priv = mtd; in mtd_blk_probe()
655 sprintf(desc->vendor, "0x%.4x", 0x2207); in mtd_blk_probe()
656 if (strncmp(mtd->name, "nand", 4) == 0) in mtd_blk_probe()
657 memcpy(desc->product, "rk-nand", strlen("rk-nand")); in mtd_blk_probe()
659 memcpy(desc->product, mtd->name, strlen(mtd->name)); in mtd_blk_probe()
660 memcpy(desc->revision, "V1.00", sizeof("V1.00")); in mtd_blk_probe()
661 if (mtd->type == MTD_NANDFLASH) { in mtd_blk_probe()
663 if (desc->devnum == BLK_MTD_NAND) in mtd_blk_probe()
665 else if (desc->devnum == BLK_MTD_SPI_NAND) in mtd_blk_probe()
671 * and it is the end lba of the nand storage. in mtd_blk_probe()
673 for (; i < (mtd->size / mtd->erasesize); i++) { in mtd_blk_probe()
675 mtd->size - mtd->erasesize * (i + 1)); in mtd_blk_probe()
677 desc->lba = (mtd->size >> 9) - in mtd_blk_probe()
678 (mtd->erasesize >> 9) * i; in mtd_blk_probe()
683 desc->lba = mtd->size >> 9; in mtd_blk_probe()
686 debug("MTD: desc->lba is %lx\n", desc->lba); in mtd_blk_probe()