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