xref: /OK3568_Linux_fs/u-boot/drivers/rkflash/rknandc_base.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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 
rknand_scan_namespace(void)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 
rknand_blk_bind(struct udevice * udev)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 
rockchip_nand_ofdata_to_platdata(struct udevice * dev)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 
rockchip_nand_probe(struct udevice * udev)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