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