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 <clk.h> 9 #include <dm.h> 10 #include <dm/device-internal.h> 11 #include <asm/arch/clock.h> 12 #include <asm/arch/vendor.h> 13 14 #include "rkflash_blk.h" 15 #include "rkflash_api.h" 16 17 static struct flash_operation nandc_flash_op = { 18 #ifdef CONFIG_RKNANDC_NAND 19 IF_TYPE_RKNAND, 20 rknand_flash_init, 21 rknand_flash_get_density, 22 rknand_flash_read, 23 rknand_flash_write, 24 NULL, 25 rknand_flash_vendor_read, 26 rknand_flash_vendor_write, 27 #else 28 -1, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 29 #endif 30 }; 31 32 int rknand_scan_namespace(void) 33 { 34 struct uclass *uc; 35 struct udevice *dev; 36 int ret; 37 38 ret = uclass_get(UCLASS_RKNAND, &uc); 39 if (ret) 40 return ret; 41 42 uclass_foreach_dev(dev, uc) { 43 debug("%s %d %p\n", __func__, __LINE__, dev); 44 ret = device_probe(dev); 45 if (ret) 46 return ret; 47 } 48 49 return 0; 50 } 51 52 static int rknand_blk_bind(struct udevice *udev) 53 { 54 struct udevice *bdev; 55 int ret; 56 57 ret = blk_create_devicef(udev, "rkflash_blk", "blk", 58 IF_TYPE_RKNAND, 59 0, 512, 0, &bdev); 60 if (ret) { 61 debug("Cannot create block device\n"); 62 return ret; 63 } 64 65 return 0; 66 } 67 68 static int rockchip_nand_ofdata_to_platdata(struct udevice *dev) 69 { 70 struct rkflash_info *priv = dev_get_priv(dev); 71 72 priv->ioaddr = dev_read_addr_ptr(dev); 73 74 return 0; 75 } 76 77 static int rockchip_nand_probe(struct udevice *udev) 78 { 79 int ret; 80 struct rkflash_info *priv = dev_get_priv(udev); 81 82 debug("%s %d %p ndev = %p\n", __func__, __LINE__, udev, priv); 83 84 ret = nandc_flash_init(priv->ioaddr); 85 if (ret) { 86 debug("nandc_flash_init failed, ret %d", ret); 87 return ret; 88 } 89 ret = nandc_flash_op.flash_init(udev); 90 if (!ret) { 91 priv->flash_con_type = nandc_flash_op.id; 92 priv->density = nandc_flash_op.flash_get_capacity(udev); 93 priv->read = nandc_flash_op.flash_read; 94 priv->write = nandc_flash_op.flash_write; 95 priv->erase = nandc_flash_op.flash_erase; 96 #ifdef CONFIG_ROCKCHIP_VENDOR_PARTITION 97 flash_vendor_dev_ops_register(nandc_flash_op.vendor_read, 98 nandc_flash_op.vendor_write); 99 #endif 100 debug("%s probe success\n", __func__); 101 } else { 102 pr_err("ret %d\n", ret); 103 } 104 105 return ret; 106 } 107 108 UCLASS_DRIVER(rknand) = { 109 .id = UCLASS_RKNAND, 110 .name = "rknand", 111 .flags = DM_UC_FLAG_SEQ_ALIAS, 112 }; 113 114 static const struct udevice_id rockchip_nand_ids[] = { 115 { .compatible = "rockchip,rk-nandc" }, 116 { } 117 }; 118 119 U_BOOT_DRIVER(rknand) = { 120 .name = "rknand", 121 .id = UCLASS_RKNAND, 122 .of_match = rockchip_nand_ids, 123 .bind = rknand_blk_bind, 124 .probe = rockchip_nand_probe, 125 .priv_auto_alloc_size = sizeof(struct rkflash_info), 126 .ofdata_to_platdata = rockchip_nand_ofdata_to_platdata, 127 }; 128 129