17e8f6066SKever Yang /*
27e8f6066SKever Yang * (C) Copyright 2017 Rockchip Electronics Co., Ltd.
37e8f6066SKever Yang *
47e8f6066SKever Yang * SPDX-License-Identifier: GPL-2.0
57e8f6066SKever Yang */
67e8f6066SKever Yang
77e8f6066SKever Yang #include <common.h>
87e8f6066SKever Yang #include <dm.h>
97e8f6066SKever Yang #include <ram.h>
107e8f6066SKever Yang #include <syscon.h>
117e8f6066SKever Yang #include <asm/arch/clock.h>
127e8f6066SKever Yang #include <asm/arch/grf_rk3128.h>
13*e1f97ec3SYouMin Chen #include <asm/arch/sdram.h>
147e8f6066SKever Yang
157e8f6066SKever Yang DECLARE_GLOBAL_DATA_PTR;
167e8f6066SKever Yang struct dram_info {
177e8f6066SKever Yang struct ram_info info;
187e8f6066SKever Yang struct rk3128_grf *grf;
197e8f6066SKever Yang };
207e8f6066SKever Yang
rk3128_dmc_probe(struct udevice * dev)217e8f6066SKever Yang static int rk3128_dmc_probe(struct udevice *dev)
227e8f6066SKever Yang {
237e8f6066SKever Yang struct dram_info *priv = dev_get_priv(dev);
247e8f6066SKever Yang
257e8f6066SKever Yang priv->grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
26dd3941eeSJoseph Chen debug("%s: grf=%p\n", __func__, priv->grf);
277e8f6066SKever Yang priv->info.base = CONFIG_SYS_SDRAM_BASE;
287e8f6066SKever Yang priv->info.size = rockchip_sdram_size(
297e8f6066SKever Yang (phys_addr_t)&priv->grf->os_reg[1]);
307e8f6066SKever Yang
317e8f6066SKever Yang return 0;
327e8f6066SKever Yang }
337e8f6066SKever Yang
rk3128_dmc_get_info(struct udevice * dev,struct ram_info * info)347e8f6066SKever Yang static int rk3128_dmc_get_info(struct udevice *dev, struct ram_info *info)
357e8f6066SKever Yang {
367e8f6066SKever Yang struct dram_info *priv = dev_get_priv(dev);
377e8f6066SKever Yang
387e8f6066SKever Yang *info = priv->info;
397e8f6066SKever Yang
407e8f6066SKever Yang return 0;
417e8f6066SKever Yang }
427e8f6066SKever Yang
437e8f6066SKever Yang static struct ram_ops rk3128_dmc_ops = {
447e8f6066SKever Yang .get_info = rk3128_dmc_get_info,
457e8f6066SKever Yang };
467e8f6066SKever Yang
477e8f6066SKever Yang
487e8f6066SKever Yang static const struct udevice_id rk3128_dmc_ids[] = {
497e8f6066SKever Yang { .compatible = "rockchip,rk3128-dmc" },
507e8f6066SKever Yang { }
517e8f6066SKever Yang };
527e8f6066SKever Yang
537e8f6066SKever Yang U_BOOT_DRIVER(dmc_rk3128) = {
547e8f6066SKever Yang .name = "rockchip_rk3128_dmc",
557e8f6066SKever Yang .id = UCLASS_RAM,
567e8f6066SKever Yang .of_match = rk3128_dmc_ids,
577e8f6066SKever Yang .ops = &rk3128_dmc_ops,
587e8f6066SKever Yang .probe = rk3128_dmc_probe,
597e8f6066SKever Yang .priv_auto_alloc_size = sizeof(struct dram_info),
607e8f6066SKever Yang };
61