xref: /rk3399_rockchip-uboot/drivers/ram/ramdisk_ro.c (revision 0476014ebb59f4b6ab5b30c8b192ebec6ac99655)
1*0476014eSJoseph Chen // SPDX-License-Identifier:     GPL-2.0+
2*0476014eSJoseph Chen /*
3*0476014eSJoseph Chen  * (C) Copyright 2018 Rockchip Electronics Co., Ltd
4*0476014eSJoseph Chen  */
5*0476014eSJoseph Chen 
6*0476014eSJoseph Chen #include <common.h>
7*0476014eSJoseph Chen #include <dm.h>
8*0476014eSJoseph Chen #include <dm/device-internal.h>
9*0476014eSJoseph Chen #include <dm/lists.h>
10*0476014eSJoseph Chen #include <dm/root.h>
11*0476014eSJoseph Chen #include <ramdisk.h>
12*0476014eSJoseph Chen 
13*0476014eSJoseph Chen DECLARE_GLOBAL_DATA_PTR;
14*0476014eSJoseph Chen 
15*0476014eSJoseph Chen static ulong ramdisk_ro_bread(struct blk_desc *desc, lbaint_t start,
16*0476014eSJoseph Chen 			      lbaint_t blkcnt, void *dst)
17*0476014eSJoseph Chen {
18*0476014eSJoseph Chen 	unsigned long b_size, b_start;
19*0476014eSJoseph Chen 
20*0476014eSJoseph Chen 	/* Byte */
21*0476014eSJoseph Chen 	b_start = start * desc->blksz;
22*0476014eSJoseph Chen 	b_size = blkcnt * desc->blksz;
23*0476014eSJoseph Chen 	memcpy((char *)dst, (char *)b_start, b_size);
24*0476014eSJoseph Chen 
25*0476014eSJoseph Chen 	debug("%s: b_start=0x%lx, b_size=0x%lx. dst=%p\n",
26*0476014eSJoseph Chen 	      __func__, b_start, b_size, dst);
27*0476014eSJoseph Chen 
28*0476014eSJoseph Chen 	return blkcnt;
29*0476014eSJoseph Chen }
30*0476014eSJoseph Chen 
31*0476014eSJoseph Chen static int ramdisk_ro_bind(struct udevice *dev)
32*0476014eSJoseph Chen {
33*0476014eSJoseph Chen 	struct udevice *bdev;
34*0476014eSJoseph Chen 	int ret;
35*0476014eSJoseph Chen 
36*0476014eSJoseph Chen 	ret = blk_create_devicef(dev, "ramdisk_blk", "blk",
37*0476014eSJoseph Chen 				 IF_TYPE_RAMDISK, 0, 512, 0, &bdev);
38*0476014eSJoseph Chen 	if (ret) {
39*0476014eSJoseph Chen 		debug("Can't create block device\n");
40*0476014eSJoseph Chen 		return ret;
41*0476014eSJoseph Chen 	}
42*0476014eSJoseph Chen 
43*0476014eSJoseph Chen 	return 0;
44*0476014eSJoseph Chen }
45*0476014eSJoseph Chen 
46*0476014eSJoseph Chen static const struct ramdisk_ops ramdisk_ro_ops = {
47*0476014eSJoseph Chen 	.read = ramdisk_ro_bread,
48*0476014eSJoseph Chen };
49*0476014eSJoseph Chen 
50*0476014eSJoseph Chen static const struct udevice_id ramdisk_ro_ids[] = {
51*0476014eSJoseph Chen 	{ .compatible = "ramdisk-ro" },
52*0476014eSJoseph Chen 	{ }
53*0476014eSJoseph Chen };
54*0476014eSJoseph Chen 
55*0476014eSJoseph Chen U_BOOT_DRIVER(ramdisk_ro) = {
56*0476014eSJoseph Chen 	.name		= "ramdisk-ro",
57*0476014eSJoseph Chen 	.id		= UCLASS_RAMDISK,
58*0476014eSJoseph Chen 	.ops		= &ramdisk_ro_ops,
59*0476014eSJoseph Chen 	.of_match	= ramdisk_ro_ids,
60*0476014eSJoseph Chen 	.bind		= ramdisk_ro_bind,
61*0476014eSJoseph Chen };
62