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