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 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 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