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