1185377Ssam// SPDX-License-Identifier: GPL-2.0+
2185377Ssam/*
3185377Ssam * (C) Copyright 2021 Rockchip Electronics Co., Ltd.
4185377Ssam */
5185377Ssam
6185377Ssam#include <common.h>
7185377Ssam#include <dm.h>
8185377Ssam#include <ram.h>
9185377Ssam#include <syscon.h>
10185377Ssam#include <asm/arch-rockchip/clock.h>
11185377Ssam#include <asm/arch-rockchip/grf_rk3568.h>
12185377Ssam#include <asm/arch-rockchip/sdram.h>
13185377Ssam
14185377Ssamstruct dram_info {
15185377Ssam	struct ram_info info;
16185377Ssam	struct rk3568_pmugrf *pmugrf;
17203158Srpaulo};
18185377Ssam
19185377Ssamstatic int rk3568_dmc_probe(struct udevice *dev)
20185377Ssam{
21185377Ssam	struct dram_info *priv = dev_get_priv(dev);
22185377Ssam
23185377Ssam	priv->pmugrf = syscon_get_first_range(ROCKCHIP_SYSCON_PMUGRF);
24185377Ssam	priv->info.base = CFG_SYS_SDRAM_BASE;
25185377Ssam	priv->info.size =
26185377Ssam		rockchip_sdram_size((phys_addr_t)&priv->pmugrf->pmu_os_reg2);
27185377Ssam
28185377Ssam	return 0;
29185377Ssam}
30231368Sadrian
31231368Sadrianstatic int rk3568_dmc_get_info(struct udevice *dev, struct ram_info *info)
32185377Ssam{
33203750Srpaulo	struct dram_info *priv = dev_get_priv(dev);
34185377Ssam
35185377Ssam	*info = priv->info;
36185377Ssam
37185377Ssam	return 0;
38185377Ssam}
39185377Ssam
40185377Ssamstatic struct ram_ops rk3568_dmc_ops = {
41185377Ssam	.get_info = rk3568_dmc_get_info,
42185377Ssam};
43217634Sadrian
44217634Sadrianstatic const struct udevice_id rk3568_dmc_ids[] = {
45185377Ssam	{ .compatible = "rockchip,rk3568-dmc" },
46185377Ssam	{ }
47217634Sadrian};
48217634Sadrian
49217634SadrianU_BOOT_DRIVER(dmc_rk3568) = {
50185377Ssam	.name = "rockchip_rk3568_dmc",
51185377Ssam	.id = UCLASS_RAM,
52185377Ssam	.of_match = rk3568_dmc_ids,
53185377Ssam	.ops = &rk3568_dmc_ops,
54217634Sadrian	.probe = rk3568_dmc_probe,
55185377Ssam	.priv_auto = sizeof(struct dram_info),
56185377Ssam};
57185377Ssam