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