xref: /rk3399_rockchip-uboot/drivers/ram/ramdisk-uclass.c (revision 0e00a84cdedf7a1949486746225b35984b351eca)
1 // SPDX-License-Identifier:     GPL-2.0+
2 /*
3  * (C) Copyright 2018 Rockchip Electronics Co., Ltd
4  */
5 
6 #include <common.h>
7 #include <dm.h>
8 #include <dm/device-internal.h>
9 #include <dm/lists.h>
10 #include <dm/root.h>
11 #include <ramdisk.h>
12 
13 DECLARE_GLOBAL_DATA_PTR;
14 
15 static ulong ramdisk_bread(struct udevice *dev, lbaint_t start,
16 			   lbaint_t blkcnt, void *dst)
17 {
18 	const struct ramdisk_ops *ops = dev_get_driver_ops(dev->parent);
19 	struct blk_desc *desc = dev_get_uclass_platdata(dev);
20 
21 	if (!blkcnt)
22 		return 0;
23 
24 	if (!ops->read)
25 		return -ENOSYS;
26 
27 	return ops->read(desc, start, blkcnt, dst);
28 }
29 
30 static ulong ramdisk_bwrite(struct udevice *dev, lbaint_t start,
31 			    lbaint_t blkcnt, const void *src)
32 {
33 	const struct ramdisk_ops *ops = dev_get_driver_ops(dev->parent);
34 	struct blk_desc *desc = dev_get_uclass_platdata(dev);
35 
36 	if (!blkcnt)
37 		return 0;
38 
39 	if (!ops->write)
40 		return -ENOSYS;
41 
42 	return ops->write(desc, start, blkcnt, src);
43 }
44 
45 static ulong ramdisk_berase(struct udevice *dev,
46 			    lbaint_t start, lbaint_t blkcnt)
47 {
48 	const struct ramdisk_ops *ops = dev_get_driver_ops(dev->parent);
49 	struct blk_desc *desc = dev_get_uclass_platdata(dev);
50 
51 	if (!blkcnt)
52 		return 0;
53 
54 	if (!ops->erase)
55 		return -ENOSYS;
56 
57 	return ops->erase(desc, start, blkcnt);
58 }
59 
60 static const struct blk_ops ramdisk_blk_ops = {
61 	.read	= ramdisk_bread,
62 #ifndef CONFIG_SPL_BUILD
63 	.write	= ramdisk_bwrite,
64 	.erase	= ramdisk_berase,
65 #endif
66 };
67 
68 U_BOOT_DRIVER(ramdisk_blk) = {
69 	.name		= "ramdisk_blk",
70 	.id		= UCLASS_BLK,
71 	.ops		= &ramdisk_blk_ops,
72 };
73 
74 UCLASS_DRIVER(ramdisk) = {
75 	.id		= UCLASS_RAMDISK,
76 	.name		= "ramdisk",
77 	.flags		= DM_UC_FLAG_SEQ_ALIAS,
78 };
79