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