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