xref: /rk3399_rockchip-uboot/drivers/mtd/mtd_blk.c (revision ffa55e18238b8457fb51fce46a63ef28dfbc33ce)
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