xref: /rk3399_rockchip-uboot/drivers/ram/ramdisk-uclass.c (revision bc04a3dd9a41813372820ba50655022a6a28bfbf)
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 int bramdisk_initialize(void)
16 {
17 	struct udevice *dev;
18 
19 	return uclass_get_device(UCLASS_BLK, 0, &dev);
20 }
21 
22 static ulong ramdisk_bread(struct udevice *dev, lbaint_t start,
23 			   lbaint_t blkcnt, void *dst)
24 {
25 	const struct ramdisk_ops *ops = dev_get_driver_ops(dev->parent);
26 	struct blk_desc *desc = dev_get_uclass_platdata(dev);
27 
28 	if (!blkcnt)
29 		return 0;
30 
31 	if (!ops->read)
32 		return -ENOSYS;
33 
34 	return ops->read(desc, start, blkcnt, dst);
35 }
36 
37 static ulong ramdisk_bwrite(struct udevice *dev, lbaint_t start,
38 			    lbaint_t blkcnt, const void *src)
39 {
40 	const struct ramdisk_ops *ops = dev_get_driver_ops(dev->parent);
41 	struct blk_desc *desc = dev_get_uclass_platdata(dev);
42 
43 	if (!blkcnt)
44 		return 0;
45 
46 	if (!ops->write)
47 		return -ENOSYS;
48 
49 	return ops->write(desc, start, blkcnt, src);
50 }
51 
52 static ulong ramdisk_berase(struct udevice *dev,
53 			    lbaint_t start, lbaint_t blkcnt)
54 {
55 	const struct ramdisk_ops *ops = dev_get_driver_ops(dev->parent);
56 	struct blk_desc *desc = dev_get_uclass_platdata(dev);
57 
58 	if (!blkcnt)
59 		return 0;
60 
61 	if (!ops->erase)
62 		return -ENOSYS;
63 
64 	return ops->erase(desc, start, blkcnt);
65 }
66 
67 static const struct blk_ops ramdisk_blk_ops = {
68 	.read	= ramdisk_bread,
69 #ifndef CONFIG_SPL_BUILD
70 	.write	= ramdisk_bwrite,
71 	.erase	= ramdisk_berase,
72 #endif
73 };
74 
75 U_BOOT_DRIVER(ramdisk_blk) = {
76 	.name		= "ramdisk_blk",
77 	.id		= UCLASS_BLK,
78 	.ops		= &ramdisk_blk_ops,
79 };
80 
81 UCLASS_DRIVER(ramdisk) = {
82 	.id		= UCLASS_RAMDISK,
83 	.name		= "ramdisk",
84 	.flags		= DM_UC_FLAG_SEQ_ALIAS,
85 };
86