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 10 #include "rkflash_api.h" 11 #include "rkflash_blk.h" 12 13 #ifdef CONFIG_RKSFC_NOR 14 int rksfc_nor_init(struct udevice *udev) 15 { 16 struct rkflash_info *priv = dev_get_priv(udev); 17 struct SFNOR_DEV *p_dev = (struct SFNOR_DEV *)&priv->flash_dev_info; 18 19 return snor_init(p_dev); 20 } 21 22 u32 rksfc_nor_get_capacity(struct udevice *udev) 23 { 24 struct rkflash_info *priv = dev_get_priv(udev); 25 struct SFNOR_DEV *p_dev = (struct SFNOR_DEV *)&priv->flash_dev_info; 26 27 return snor_get_capacity(p_dev); 28 } 29 30 int rksfc_nor_read(struct udevice *udev, u32 sec, u32 n_sec, void *p_data) 31 { 32 u32 ret; 33 u32 offset, count = 0; 34 char *buf = (char *)p_data; 35 struct rkflash_info *priv = dev_get_priv(udev); 36 struct SFNOR_DEV *p_dev = (struct SFNOR_DEV *)&priv->flash_dev_info; 37 38 if (sec + n_sec - 1 < FLASH_VENDOR_PART_START || 39 sec > FLASH_VENDOR_PART_END) { 40 ret = snor_read(p_dev, sec, n_sec, p_data); 41 if (ret != n_sec) 42 return ret; 43 } else { 44 memset(p_data, 0, 512 * n_sec); 45 if (sec < FLASH_VENDOR_PART_START) { 46 count = FLASH_VENDOR_PART_START - sec; 47 buf = (char *)p_data; 48 ret = snor_read(p_dev, sec, count, buf); 49 if (ret != count) 50 return ret; 51 } 52 if ((sec + n_sec - 1) > FLASH_VENDOR_PART_END) { 53 count = sec + n_sec - 1 - FLASH_VENDOR_PART_END; 54 offset = FLASH_VENDOR_PART_END - sec + 1; 55 buf = (char *)p_data + offset * 512; 56 ret = snor_read(p_dev, 57 FLASH_VENDOR_PART_END + 1, 58 count, buf); 59 if (ret != count) 60 return ret; 61 } 62 } 63 64 return n_sec; 65 } 66 67 int rksfc_nor_write(struct udevice *udev, 68 u32 sec, 69 u32 n_sec, 70 const void *p_data) 71 { 72 u32 ret; 73 u32 offset, count = 0; 74 char *buf = (char *)p_data; 75 struct rkflash_info *priv = dev_get_priv(udev); 76 struct SFNOR_DEV *p_dev = (struct SFNOR_DEV *)&priv->flash_dev_info; 77 78 if (sec + n_sec - 1 < FLASH_VENDOR_PART_START || 79 sec > FLASH_VENDOR_PART_END) { 80 ret = snor_write(p_dev, sec, n_sec, p_data); 81 if (ret != n_sec) 82 return ret; 83 } else { 84 if (sec < FLASH_VENDOR_PART_START) { 85 count = FLASH_VENDOR_PART_START - sec; 86 buf = (char *)p_data; 87 ret = snor_write(p_dev, sec, count, buf); 88 if (ret != count) 89 return ret; 90 } 91 if ((sec + n_sec - 1) > FLASH_VENDOR_PART_END) { 92 count = sec + n_sec - 1 - FLASH_VENDOR_PART_END; 93 offset = FLASH_VENDOR_PART_END - sec + 1; 94 buf = (char *)p_data + offset * 512; 95 ret = snor_write(p_dev, 96 FLASH_VENDOR_PART_END + 1, 97 count, buf); 98 if (ret != count) 99 return ret; 100 } 101 } 102 103 return n_sec; 104 } 105 106 int rksfc_nor_vendor_read(struct blk_desc *dev_desc, 107 u32 sec, 108 u32 n_sec, 109 void *p_data) 110 { 111 struct rkflash_info *priv = dev_get_priv(dev_desc->bdev->parent); 112 struct SFNOR_DEV *p_dev = (struct SFNOR_DEV *)&priv->flash_dev_info; 113 114 return snor_read(p_dev, sec, n_sec, p_data); 115 } 116 117 int rksfc_nor_vendor_write(struct blk_desc *dev_desc, 118 u32 sec, 119 u32 n_sec, 120 void *p_data) 121 { 122 struct rkflash_info *priv = dev_get_priv(dev_desc->bdev->parent); 123 struct SFNOR_DEV *p_dev = (struct SFNOR_DEV *)&priv->flash_dev_info; 124 125 return snor_write(p_dev, sec, n_sec, p_data); 126 } 127 128 #endif 129 130 #ifdef CONFIG_RKSFC_NAND 131 int rksfc_nand_init(struct udevice *udev) 132 { 133 int ret; 134 135 ret = sfc_nand_init(); 136 if (ret) 137 return ret; 138 else 139 return sftl_init(); 140 } 141 142 int rksfc_nand_read(struct udevice *udev, u32 index, u32 count, void *buf) 143 { 144 int ret; 145 146 ret = sftl_read(index, count, (u8 *)buf); 147 if (!ret) 148 return count; 149 else 150 return -EIO; 151 } 152 153 int rksfc_nand_write(struct udevice *udev, 154 u32 index, 155 u32 count, 156 const void *buf) 157 { 158 int ret; 159 160 ret = sftl_write(index, count, (u8 *)buf); 161 if (!ret) 162 return count; 163 else 164 return -EIO; 165 } 166 167 u32 rksfc_nand_get_density(struct udevice *udev) 168 { 169 return sftl_get_density(); 170 } 171 #endif 172 173 #ifdef CONFIG_RKNANDC_NAND 174 int rknand_flash_init(struct udevice *udev) 175 { 176 return sftl_init(); 177 } 178 179 int rknand_flash_read(struct udevice *udev, u32 index, u32 count, void *buf) 180 { 181 int ret; 182 183 ret = sftl_read(index, count, (u8 *)buf); 184 if (!ret) 185 return count; 186 else 187 return -EIO; 188 } 189 190 int rknand_flash_write(struct udevice *udev, 191 u32 index, 192 u32 count, 193 const void *buf) 194 { 195 int ret; 196 197 ret = sftl_write(index, count, (u8 *)buf); 198 if (!ret) 199 return count; 200 else 201 return -EIO; 202 } 203 204 u32 rknand_flash_get_density(struct udevice *udev) 205 { 206 return sftl_get_density(); 207 } 208 #endif 209