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