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