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