1 /* 2 * Copyright (c) 2018 Fuzhou Rockchip Electronics Co., Ltd 3 * 4 * SPDX-License-Identifier: (GPL-2.0+ OR MIT) 5 */ 6 7 #include <common.h> 8 #include <dm.h> 9 #include <dm/device-internal.h> 10 #include <dm/lists.h> 11 #include <dm/root.h> 12 13 #include "rkflash_blk.h" 14 #include "rkflash_debug.h" 15 16 ulong rkflash_bread(struct udevice *udev, lbaint_t start, 17 lbaint_t blkcnt, void *dst) 18 { 19 struct blk_desc *block_dev = dev_get_uclass_platdata(udev); 20 struct rkflash_info *priv = dev_get_priv(udev->parent); 21 22 if (blkcnt == 0) 23 return 0; 24 25 if ((start + blkcnt) > block_dev->lba) 26 return 0; 27 28 if (!priv->read) 29 return 0; 30 31 return (ulong)priv->read(udev->parent, (u32)start, (u32)blkcnt, dst); 32 } 33 34 ulong rkflash_bwrite(struct udevice *udev, lbaint_t start, 35 lbaint_t blkcnt, const void *src) 36 { 37 struct blk_desc *block_dev = dev_get_uclass_platdata(udev); 38 struct rkflash_info *priv = dev_get_priv(udev->parent); 39 40 if (blkcnt == 0) 41 return 0; 42 43 if ((start + blkcnt) > block_dev->lba) 44 return 0; 45 46 if (!priv->write) 47 return 0; 48 49 return (ulong)priv->write(udev->parent, (u32)start, (u32)blkcnt, src); 50 } 51 52 ulong rkflash_berase(struct udevice *udev, lbaint_t start, 53 lbaint_t blkcnt) 54 { 55 struct blk_desc *block_dev = dev_get_uclass_platdata(udev); 56 struct rkflash_info *priv = dev_get_priv(udev->parent); 57 58 if (blkcnt == 0) 59 return 0; 60 61 if ((start + blkcnt) > block_dev->lba) 62 return 0; 63 64 if (!priv->erase) 65 return 0; 66 67 return (ulong)priv->erase(udev->parent, (u32)start, (u32)blkcnt); 68 } 69 70 static int rkflash_blk_probe(struct udevice *udev) 71 { 72 struct rkflash_info *priv = dev_get_priv(udev->parent); 73 struct blk_desc *desc = dev_get_uclass_platdata(udev); 74 75 debug("%s %d %p ndev = %p %p\n", __func__, __LINE__, 76 udev, priv, udev->parent); 77 priv->child_dev = udev; 78 if (priv->flash_con_type == FLASH_CON_TYPE_SFC) 79 desc->if_type = IF_TYPE_RKSFC; 80 desc->lba = priv->density; 81 desc->log2blksz = 9; 82 desc->blksz = 512; 83 desc->bdev = udev; 84 desc->devnum = 0; 85 sprintf(desc->vendor, "0x%.4x", 0x0308); 86 memcpy(desc->product, "rkflash", sizeof("rkflash")); 87 memcpy(desc->revision, "V1.00", sizeof("V1.00")); 88 part_init(desc); 89 rkflash_test(udev); 90 91 return 0; 92 } 93 94 static const struct blk_ops rkflash_blk_ops = { 95 .read = rkflash_bread, 96 .write = rkflash_bwrite, 97 .erase = rkflash_berase, 98 }; 99 100 U_BOOT_DRIVER(rkflash_blk) = { 101 .name = "rkflash_blk", 102 .id = UCLASS_BLK, 103 .ops = &rkflash_blk_ops, 104 .probe = rkflash_blk_probe, 105 }; 106 107