xref: /rk3399_rockchip-uboot/drivers/ram/rockchip/sdram_px30.c (revision 5eeb396bc2d65e95bffd9db7b21e552b53009bb6)
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