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