xref: /rk3399_rockchip-uboot/drivers/rkflash/rknandc_base.c (revision e7b5bb3cc9527752c2c01acb4325fc0721fb75aa)
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