1 /* 2 * (C) Copyright 2019 Rockchip Electronics Co., Ltd 3 * 4 * SPDX-License-Identifier: GPL-2.0+ 5 */ 6 7 #include <common.h> 8 #include <dm.h> 9 #include <errno.h> 10 #include <nand.h> 11 #include <dm/device-internal.h> 12 13 ulong mtd_dread(struct udevice *udev, lbaint_t start, 14 lbaint_t blkcnt, void *dst) 15 { 16 struct blk_desc *desc = dev_get_uclass_platdata(udev); 17 18 if (!desc) 19 return 0; 20 21 if (blkcnt == 0) 22 return 0; 23 24 if (desc->devnum == BLK_MTD_NAND) { 25 int ret = 0; 26 size_t rwsize = blkcnt * 512; 27 struct mtd_info *mtd = dev_get_priv(udev->parent); 28 struct nand_chip *chip = mtd_to_nand(mtd); 29 loff_t off = (loff_t)(start * 512); 30 31 if (!mtd) { 32 puts("\nno mtd available\n"); 33 return 0; 34 } 35 36 if (!chip) { 37 puts("\nno chip available\n"); 38 return 0; 39 } 40 41 ret = nand_read_skip_bad(&chip->mtd, off, &rwsize, 42 NULL, chip->mtd.size, 43 (u_char *)(dst)); 44 if (ret) 45 return 0; 46 else 47 return blkcnt; 48 } else if (desc->devnum == BLK_MTD_SPI_NAND) { 49 /* Not implemented */ 50 return 0; 51 } else if (desc->devnum == BLK_MTD_SPI_NOR) { 52 /* Not implemented */ 53 return 0; 54 } else { 55 return 0; 56 } 57 } 58 59 ulong mtd_dwrite(struct udevice *udev, lbaint_t start, 60 lbaint_t blkcnt, const void *src) 61 { 62 /* Not implemented */ 63 return 0; 64 } 65 66 ulong mtd_derase(struct udevice *udev, lbaint_t start, 67 lbaint_t blkcnt) 68 { 69 /* Not implemented */ 70 return 0; 71 } 72 73 static int mtd_blk_probe(struct udevice *udev) 74 { 75 struct blk_desc *desc = dev_get_uclass_platdata(udev); 76 struct mtd_info *mtd = dev_get_priv(udev->parent); 77 78 sprintf(desc->vendor, "0x%.4x", 0x2207); 79 memcpy(desc->product, mtd->name, strlen(mtd->name)); 80 memcpy(desc->revision, "V1.00", sizeof("V1.00")); 81 if (mtd->type == MTD_NANDFLASH) { 82 /* Reserve 4 blocks for BBT(Bad Block Table) */ 83 desc->lba = (mtd->size >> 9) - (mtd->erasesize >> 9) * 4; 84 } else { 85 desc->lba = mtd->size >> 9; 86 } 87 88 return 0; 89 } 90 91 static const struct blk_ops mtd_blk_ops = { 92 .read = mtd_dread, 93 #ifndef CONFIG_SPL_BUILD 94 .write = mtd_dwrite, 95 .erase = mtd_derase, 96 #endif 97 }; 98 99 U_BOOT_DRIVER(mtd_blk) = { 100 .name = "mtd_blk", 101 .id = UCLASS_BLK, 102 .ops = &mtd_blk_ops, 103 .probe = mtd_blk_probe, 104 }; 105