xref: /rk3399_rockchip-uboot/drivers/rkflash/rkflash_blk.c (revision 83ab7b4937c098a3febc8f361a6be16f28ae16aa)
1 /*
2  * Copyright (c) 2018 Fuzhou Rockchip Electronics Co., Ltd
3  *
4  * SPDX-License-Identifier: (GPL-2.0+ OR MIT)
5  */
6 
7 #include <common.h>
8 #include <dm.h>
9 #include <dm/device-internal.h>
10 #include <dm/lists.h>
11 #include <dm/root.h>
12 
13 #include "rkflash_blk.h"
14 #include "rkflash_debug.h"
15 
16 ulong rkflash_bread(struct udevice *udev, lbaint_t start,
17 		    lbaint_t blkcnt, void *dst)
18 {
19 	struct blk_desc *block_dev = dev_get_uclass_platdata(udev);
20 	struct rkflash_info *priv = dev_get_priv(udev->parent);
21 
22 	if (blkcnt == 0)
23 		return 0;
24 
25 	if ((start + blkcnt) > block_dev->lba)
26 		return 0;
27 
28 	if (!priv->read)
29 		return 0;
30 
31 	return (ulong)priv->read(udev->parent, (u32)start, (u32)blkcnt, dst);
32 }
33 
34 ulong rkflash_bwrite(struct udevice *udev, lbaint_t start,
35 		     lbaint_t blkcnt, const void *src)
36 {
37 	struct blk_desc *block_dev = dev_get_uclass_platdata(udev);
38 	struct rkflash_info *priv = dev_get_priv(udev->parent);
39 
40 	if (blkcnt == 0)
41 		return 0;
42 
43 	if ((start + blkcnt) > block_dev->lba)
44 		return 0;
45 
46 	if (!priv->write)
47 		return 0;
48 
49 	return (ulong)priv->write(udev->parent, (u32)start, (u32)blkcnt, src);
50 }
51 
52 ulong rkflash_berase(struct udevice *udev, lbaint_t start,
53 		     lbaint_t blkcnt)
54 {
55 	struct blk_desc *block_dev = dev_get_uclass_platdata(udev);
56 	struct rkflash_info *priv = dev_get_priv(udev->parent);
57 
58 	if (blkcnt == 0)
59 		return 0;
60 
61 	if ((start + blkcnt) > block_dev->lba)
62 		return 0;
63 
64 	if (!priv->erase)
65 		return 0;
66 
67 	return (ulong)priv->erase(udev->parent, (u32)start, (u32)blkcnt);
68 }
69 
70 static int rkflash_blk_probe(struct udevice *udev)
71 {
72 	struct rkflash_info *priv = dev_get_priv(udev->parent);
73 	struct blk_desc *desc = dev_get_uclass_platdata(udev);
74 
75 	debug("%s %d %p ndev = %p %p\n", __func__, __LINE__,
76 	      udev, priv, udev->parent);
77 	priv->child_dev = udev;
78 	if (priv->flash_con_type == FLASH_CON_TYPE_SFC)
79 		desc->if_type = IF_TYPE_RKSFC;
80 	desc->lba = priv->density;
81 	desc->log2blksz = 9;
82 	desc->blksz = 512;
83 	desc->bdev = udev;
84 	desc->devnum = 0;
85 	sprintf(desc->vendor, "0x%.4x", 0x0308);
86 	memcpy(desc->product, "rkflash", sizeof("rkflash"));
87 	memcpy(desc->revision, "V1.00", sizeof("V1.00"));
88 	part_init(desc);
89 	rkflash_test(udev);
90 
91 	return 0;
92 }
93 
94 static const struct blk_ops rkflash_blk_ops = {
95 	.read	= rkflash_bread,
96 	.write	= rkflash_bwrite,
97 	.erase	= rkflash_berase,
98 };
99 
100 U_BOOT_DRIVER(rkflash_blk) = {
101 	.name		= "rkflash_blk",
102 	.id		= UCLASS_BLK,
103 	.ops		= &rkflash_blk_ops,
104 	.probe		= rkflash_blk_probe,
105 };
106 
107