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