xref: /rk3399_rockchip-uboot/drivers/ram/rockchip/rockchip_sdram.c (revision b8dc613cbc483a8abfcf4203e4fa0e18f60b1d27)
1cf41a383STang Yun ping // SPDX-License-Identifier: GPL-2.0
2cf41a383STang Yun ping /*
3cf41a383STang Yun ping  * (C) Copyright 2018 Rockchip Electronics Co., Ltd.
4cf41a383STang Yun ping  */
5cf41a383STang Yun ping 
6cf41a383STang Yun ping #include <common.h>
7cf41a383STang Yun ping #include <dm.h>
8cf41a383STang Yun ping #include <ram.h>
9cf41a383STang Yun ping #include <syscon.h>
10cf41a383STang Yun ping #include <asm/arch/clock.h>
11cf41a383STang Yun ping #include <asm/arch/grf_px30.h>
12e5f39383SZhihuan He #include <asm/arch/grf_rv1108.h>
13cf41a383STang Yun ping #include <asm/arch/grf_rk1808.h>
14cf41a383STang Yun ping #include <asm/arch/grf_rk3036.h>
15cf41a383STang Yun ping #include <asm/arch/grf_rk3308.h>
1616a92a42STang Yun ping #include <asm/arch/rockchip_dmc.h>
17*e1f97ec3SYouMin Chen #include <asm/arch/sdram.h>
18cf41a383STang Yun ping 
19cf41a383STang Yun ping DECLARE_GLOBAL_DATA_PTR;
20cf41a383STang Yun ping 
21cf41a383STang Yun ping #ifndef CONFIG_TPL_BUILD
22cf41a383STang Yun ping struct dram_info {
23cf41a383STang Yun ping 	struct ram_info info;
24cf41a383STang Yun ping };
25cf41a383STang Yun ping 
dmc_probe(struct udevice * dev)26cf41a383STang Yun ping static int dmc_probe(struct udevice *dev)
27cf41a383STang Yun ping {
2816a92a42STang Yun ping 	int ret = 0;
29cf41a383STang Yun ping 	struct dram_info *priv = dev_get_priv(dev);
30cf41a383STang Yun ping 
3116a92a42STang Yun ping 	if (!(gd->flags & GD_FLG_RELOC)) {
32e5f39383SZhihuan He #if defined(CONFIG_ROCKCHIP_RV1108)
33e5f39383SZhihuan He 		struct rv1108_grf *grf =
34e5f39383SZhihuan He 			syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
35e5f39383SZhihuan He 
36e5f39383SZhihuan He 		priv->info.size =
37e5f39383SZhihuan He 			rockchip_sdram_size((phys_addr_t)&grf->os_reg2);
38e5f39383SZhihuan He #elif defined(CONFIG_ROCKCHIP_RK3036)
3916a92a42STang Yun ping 		struct rk3036_grf *grf =
4016a92a42STang Yun ping 			syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
41cf41a383STang Yun ping 
4216a92a42STang Yun ping 		priv->info.size =
4316a92a42STang Yun ping 			rockchip_sdram_size((phys_addr_t)&grf->os_reg[1]);
44cf41a383STang Yun ping #elif defined(CONFIG_ROCKCHIP_RK3308)
4516a92a42STang Yun ping 		struct rk3308_grf *grf =
4616a92a42STang Yun ping 			syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
47cf41a383STang Yun ping 
4816a92a42STang Yun ping 		priv->info.size =
4916a92a42STang Yun ping 			rockchip_sdram_size((phys_addr_t)&grf->os_reg2);
50cf41a383STang Yun ping #elif defined(CONFIG_ROCKCHIP_PX30)
51cf41a383STang Yun ping 		struct px30_pmugrf *pmugrf =
52cf41a383STang Yun ping 			syscon_get_first_range(ROCKCHIP_SYSCON_PMUGRF);
53cf41a383STang Yun ping 
54cf41a383STang Yun ping 		priv->info.size =
55cf41a383STang Yun ping 			rockchip_sdram_size((phys_addr_t)&pmugrf->os_reg[2]);
56cf41a383STang Yun ping #elif defined(CONFIG_ROCKCHIP_RK1808)
57cf41a383STang Yun ping 		struct rk1808_pmugrf *pmugrf =
58cf41a383STang Yun ping 			syscon_get_first_range(ROCKCHIP_SYSCON_PMUGRF);
59cf41a383STang Yun ping 
60cf41a383STang Yun ping 		priv->info.size =
61cf41a383STang Yun ping 			rockchip_sdram_size((phys_addr_t)&pmugrf->os_reg[2]);
62cf41a383STang Yun ping #else
63cf41a383STang Yun ping #error chip error
64cf41a383STang Yun ping #endif
65cf41a383STang Yun ping 		priv->info.base = CONFIG_SYS_SDRAM_BASE;
6616a92a42STang Yun ping 	} else {
6716a92a42STang Yun ping #if defined(CONFIG_ROCKCHIP_PX30)
6816a92a42STang Yun ping #if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_ROCKCHIP_DMC)
6916a92a42STang Yun ping 		ret = rockchip_dmcfreq_probe(dev);
7016a92a42STang Yun ping #endif
7116a92a42STang Yun ping #endif
7216a92a42STang Yun ping 	}
73cf41a383STang Yun ping 
7416a92a42STang Yun ping 	return ret;
75cf41a383STang Yun ping }
76cf41a383STang Yun ping 
dmc_get_info(struct udevice * dev,struct ram_info * info)77cf41a383STang Yun ping static int dmc_get_info(struct udevice *dev, struct ram_info *info)
78cf41a383STang Yun ping {
79cf41a383STang Yun ping 	struct dram_info *priv = dev_get_priv(dev);
80cf41a383STang Yun ping 
81cf41a383STang Yun ping 	*info = priv->info;
82cf41a383STang Yun ping 
83cf41a383STang Yun ping 	return 0;
84cf41a383STang Yun ping }
85cf41a383STang Yun ping 
86cf41a383STang Yun ping static struct ram_ops dmc_ops = {
87cf41a383STang Yun ping 	.get_info = dmc_get_info,
88cf41a383STang Yun ping };
89cf41a383STang Yun ping 
90cf41a383STang Yun ping static const struct udevice_id dmc_ids[] = {
91e5f39383SZhihuan He #if defined(CONFIG_ROCKCHIP_RV1108)
92e5f39383SZhihuan He 	{ .compatible = "rockchip,rv1108-dmc" },
93e5f39383SZhihuan He #elif defined(CONFIG_ROCKCHIP_RK3036)
94cf41a383STang Yun ping 	{ .compatible = "rockchip,rk3036-dmc" },
95cf41a383STang Yun ping #elif defined(CONFIG_ROCKCHIP_RK3308)
96cf41a383STang Yun ping 	{ .compatible = "rockchip,rk3308-dmc" },
97cf41a383STang Yun ping #elif defined(CONFIG_ROCKCHIP_PX30)
98cf41a383STang Yun ping 	{ .compatible = "rockchip,px30-dmc" },
99cf41a383STang Yun ping #elif defined(CONFIG_ROCKCHIP_RK1808)
100cf41a383STang Yun ping 	{ .compatible = "rockchip,rk1808-dmc" },
101cf41a383STang Yun ping #endif
102cf41a383STang Yun ping 	{ }
103cf41a383STang Yun ping };
104cf41a383STang Yun ping 
105cf41a383STang Yun ping U_BOOT_DRIVER(dmc_tiny) = {
106cf41a383STang Yun ping 	.name = "rockchip_dmc",
107cf41a383STang Yun ping 	.id = UCLASS_RAM,
108cf41a383STang Yun ping 	.of_match = dmc_ids,
109cf41a383STang Yun ping 	.ops = &dmc_ops,
110cf41a383STang Yun ping 	.probe = dmc_probe,
111cf41a383STang Yun ping 	.priv_auto_alloc_size = sizeof(struct dram_info),
112cf41a383STang Yun ping };
113cf41a383STang Yun ping #endif
114