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_rk1808.h> 13 #include <asm/arch/grf_rk3036.h> 14 #include <asm/arch/grf_rk3308.h> 15 #include <asm/arch/rockchip_dmc.h> 16 #include <asm/arch/sdram_common.h> 17 18 DECLARE_GLOBAL_DATA_PTR; 19 20 #ifndef CONFIG_TPL_BUILD 21 struct dram_info { 22 struct ram_info info; 23 }; 24 25 static int dmc_probe(struct udevice *dev) 26 { 27 int ret = 0; 28 struct dram_info *priv = dev_get_priv(dev); 29 30 if (!(gd->flags & GD_FLG_RELOC)) { 31 #if defined(CONFIG_ROCKCHIP_RK3036) 32 struct rk3036_grf *grf = 33 syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 34 35 priv->info.size = 36 rockchip_sdram_size((phys_addr_t)&grf->os_reg[1]); 37 #elif defined(CONFIG_ROCKCHIP_RK3308) 38 struct rk3308_grf *grf = 39 syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 40 41 priv->info.size = 42 rockchip_sdram_size((phys_addr_t)&grf->os_reg2); 43 #elif defined(CONFIG_ROCKCHIP_PX30) 44 struct px30_pmugrf *pmugrf = 45 syscon_get_first_range(ROCKCHIP_SYSCON_PMUGRF); 46 47 priv->info.size = 48 rockchip_sdram_size((phys_addr_t)&pmugrf->os_reg[2]); 49 #elif defined(CONFIG_ROCKCHIP_RK1808) 50 struct rk1808_pmugrf *pmugrf = 51 syscon_get_first_range(ROCKCHIP_SYSCON_PMUGRF); 52 53 priv->info.size = 54 rockchip_sdram_size((phys_addr_t)&pmugrf->os_reg[2]); 55 #else 56 #error chip error 57 #endif 58 priv->info.base = CONFIG_SYS_SDRAM_BASE; 59 } else { 60 #if defined(CONFIG_ROCKCHIP_PX30) 61 #if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_ROCKCHIP_DMC) 62 ret = rockchip_dmcfreq_probe(dev); 63 #endif 64 #endif 65 } 66 67 return ret; 68 } 69 70 static int dmc_get_info(struct udevice *dev, struct ram_info *info) 71 { 72 struct dram_info *priv = dev_get_priv(dev); 73 74 *info = priv->info; 75 76 return 0; 77 } 78 79 static struct ram_ops dmc_ops = { 80 .get_info = dmc_get_info, 81 }; 82 83 static const struct udevice_id dmc_ids[] = { 84 #if defined(CONFIG_ROCKCHIP_RK3036) 85 { .compatible = "rockchip,rk3036-dmc" }, 86 #elif defined(CONFIG_ROCKCHIP_RK3308) 87 { .compatible = "rockchip,rk3308-dmc" }, 88 #elif defined(CONFIG_ROCKCHIP_PX30) 89 { .compatible = "rockchip,px30-dmc" }, 90 #elif defined(CONFIG_ROCKCHIP_RK1808) 91 { .compatible = "rockchip,rk1808-dmc" }, 92 #endif 93 { } 94 }; 95 96 U_BOOT_DRIVER(dmc_tiny) = { 97 .name = "rockchip_dmc", 98 .id = UCLASS_RAM, 99 .of_match = dmc_ids, 100 .ops = &dmc_ops, 101 .probe = dmc_probe, 102 .priv_auto_alloc_size = sizeof(struct dram_info), 103 }; 104 #endif 105