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 77 sprintf(desc->vendor, "0x%.4x", 0x2207); 78 memcpy(desc->product, "MTD", sizeof("MTD")); 79 memcpy(desc->revision, "V1.00", sizeof("V1.00")); 80 81 return 0; 82 } 83 84 static const struct blk_ops mtd_blk_ops = { 85 .read = mtd_dread, 86 #ifndef CONFIG_SPL_BUILD 87 .write = mtd_dwrite, 88 .erase = mtd_derase, 89 #endif 90 }; 91 92 U_BOOT_DRIVER(mtd_blk) = { 93 .name = "mtd_blk", 94 .id = UCLASS_BLK, 95 .ops = &mtd_blk_ops, 96 .probe = mtd_blk_probe, 97 }; 98