1*5eeb396bSKever Yang /* 2*5eeb396bSKever Yang * (C) Copyright 2017 Rockchip Electronics Co., Ltd. 3*5eeb396bSKever Yang * 4*5eeb396bSKever Yang * SPDX-License-Identifier: GPL-2.0 5*5eeb396bSKever Yang */ 6*5eeb396bSKever Yang 7*5eeb396bSKever Yang #include <common.h> 8*5eeb396bSKever Yang #include <dm.h> 9*5eeb396bSKever Yang #include <ram.h> 10*5eeb396bSKever Yang #include <syscon.h> 11*5eeb396bSKever Yang #include <asm/arch/clock.h> 12*5eeb396bSKever Yang #include <asm/arch/grf_px30.h> 13*5eeb396bSKever Yang #include <asm/arch/sdram_common.h> 14*5eeb396bSKever Yang 15*5eeb396bSKever Yang DECLARE_GLOBAL_DATA_PTR; 16*5eeb396bSKever Yang struct dram_info { 17*5eeb396bSKever Yang struct ram_info info; 18*5eeb396bSKever Yang struct px30_pmugrf *pmugrf; 19*5eeb396bSKever Yang }; 20*5eeb396bSKever Yang 21*5eeb396bSKever Yang static int px30_dmc_probe(struct udevice *dev) 22*5eeb396bSKever Yang { 23*5eeb396bSKever Yang struct dram_info *priv = dev_get_priv(dev); 24*5eeb396bSKever Yang 25*5eeb396bSKever Yang priv->pmugrf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 26*5eeb396bSKever Yang debug("%s: pmugrf=%p\n", __func__, priv->pmugrf); 27*5eeb396bSKever Yang priv->info.base = CONFIG_SYS_SDRAM_BASE; 28*5eeb396bSKever Yang priv->info.size = rockchip_sdram_size( 29*5eeb396bSKever Yang (phys_addr_t)&priv->pmugrf->os_reg[2]); 30*5eeb396bSKever Yang 31*5eeb396bSKever Yang return 0; 32*5eeb396bSKever Yang } 33*5eeb396bSKever Yang 34*5eeb396bSKever Yang static int px30_dmc_get_info(struct udevice *dev, struct ram_info *info) 35*5eeb396bSKever Yang { 36*5eeb396bSKever Yang struct dram_info *priv = dev_get_priv(dev); 37*5eeb396bSKever Yang 38*5eeb396bSKever Yang *info = priv->info; 39*5eeb396bSKever Yang 40*5eeb396bSKever Yang return 0; 41*5eeb396bSKever Yang } 42*5eeb396bSKever Yang 43*5eeb396bSKever Yang static struct ram_ops px30_dmc_ops = { 44*5eeb396bSKever Yang .get_info = px30_dmc_get_info, 45*5eeb396bSKever Yang }; 46*5eeb396bSKever Yang 47*5eeb396bSKever Yang 48*5eeb396bSKever Yang static const struct udevice_id px30_dmc_ids[] = { 49*5eeb396bSKever Yang { .compatible = "rockchip,px30-dmc" }, 50*5eeb396bSKever Yang { } 51*5eeb396bSKever Yang }; 52*5eeb396bSKever Yang 53*5eeb396bSKever Yang U_BOOT_DRIVER(dmc_px30) = { 54*5eeb396bSKever Yang .name = "rockchip_px30_dmc", 55*5eeb396bSKever Yang .id = UCLASS_RAM, 56*5eeb396bSKever Yang .of_match = px30_dmc_ids, 57*5eeb396bSKever Yang .ops = &px30_dmc_ops, 58*5eeb396bSKever Yang .probe = px30_dmc_probe, 59*5eeb396bSKever Yang .priv_auto_alloc_size = sizeof(struct dram_info), 60*5eeb396bSKever Yang }; 61