xref: /openbmc/linux/arch/arm/mach-rockchip/rockchip.c (revision c900529f3d9161bfde5cca0754f83b4d3c3e0220)
1c942fddfSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later
2d63dc051SHeiko Stuebner /*
3d63dc051SHeiko Stuebner  * Device Tree support for Rockchip SoCs
4d63dc051SHeiko Stuebner  *
5d63dc051SHeiko Stuebner  * Copyright (c) 2013 MundoReader S.L.
6d63dc051SHeiko Stuebner  * Author: Heiko Stuebner <heiko@sntech.de>
7d63dc051SHeiko Stuebner  */
8d63dc051SHeiko Stuebner 
9d63dc051SHeiko Stuebner #include <linux/kernel.h>
10d63dc051SHeiko Stuebner #include <linux/init.h>
1162e59c4eSStephen Boyd #include <linux/io.h>
12*ab7c1ad1SRob Herring #include <linux/of.h>
1337aed36cSGeert Uytterhoeven #include <linux/of_clk.h>
14c9b75d51SHeiko Stübner #include <linux/clocksource.h>
15d63dc051SHeiko Stuebner #include <asm/mach/arch.h>
16d63dc051SHeiko Stuebner #include <asm/mach/map.h>
17a7a2b311SHeiko Stuebner #include "core.h"
189c1ec8e1SChris Zhong #include "pm.h"
19d63dc051SHeiko Stuebner 
202a9fe3caSHeiko Stuebner #define RK3288_TIMER6_7_PHYS 0xff810000
21c9b75d51SHeiko Stübner 
rockchip_timer_init(void)22c9b75d51SHeiko Stübner static void __init rockchip_timer_init(void)
23c9b75d51SHeiko Stübner {
24c9b75d51SHeiko Stübner 	if (of_machine_is_compatible("rockchip,rk3288")) {
252a9fe3caSHeiko Stuebner 		void __iomem *reg_base;
262a9fe3caSHeiko Stuebner 
272a9fe3caSHeiko Stuebner 		/*
282a9fe3caSHeiko Stuebner 		 * Most/all uboot versions for rk3288 don't enable timer7
292a9fe3caSHeiko Stuebner 		 * which is needed for the architected timer to work.
302a9fe3caSHeiko Stuebner 		 * So make sure it is running during early boot.
312a9fe3caSHeiko Stuebner 		 */
322a9fe3caSHeiko Stuebner 		reg_base = ioremap(RK3288_TIMER6_7_PHYS, SZ_16K);
332a9fe3caSHeiko Stuebner 		if (reg_base) {
342a9fe3caSHeiko Stuebner 			writel(0, reg_base + 0x30);
352a9fe3caSHeiko Stuebner 			writel(0xffffffff, reg_base + 0x20);
362a9fe3caSHeiko Stuebner 			writel(0xffffffff, reg_base + 0x24);
372a9fe3caSHeiko Stuebner 			writel(1, reg_base + 0x30);
382a9fe3caSHeiko Stuebner 			dsb();
392a9fe3caSHeiko Stuebner 			iounmap(reg_base);
402a9fe3caSHeiko Stuebner 		} else {
412a9fe3caSHeiko Stuebner 			pr_err("rockchip: could not map timer7 registers\n");
422a9fe3caSHeiko Stuebner 		}
43c9b75d51SHeiko Stübner 	}
44c9b75d51SHeiko Stübner 
45c9b75d51SHeiko Stübner 	of_clk_init(NULL);
46ba5d08c0SDaniel Lezcano 	timer_probe();
47c9b75d51SHeiko Stübner }
48c9b75d51SHeiko Stübner 
rockchip_dt_init(void)4947b06fc2SHeiko Stuebner static void __init rockchip_dt_init(void)
5047b06fc2SHeiko Stuebner {
519c1ec8e1SChris Zhong 	rockchip_suspend_init();
5247b06fc2SHeiko Stuebner }
5347b06fc2SHeiko Stuebner 
54d63dc051SHeiko Stuebner static const char * const rockchip_board_dt_compat[] = {
55d63dc051SHeiko Stuebner 	"rockchip,rk2928",
56d63dc051SHeiko Stuebner 	"rockchip,rk3066a",
57d63dc051SHeiko Stuebner 	"rockchip,rk3066b",
58d63dc051SHeiko Stuebner 	"rockchip,rk3188",
592608224cSJeffy Chen 	"rockchip,rk3228",
607a1917abSHeiko Stuebner 	"rockchip,rk3288",
6151f6bfc7SAndy Yan 	"rockchip,rv1108",
62d63dc051SHeiko Stuebner 	NULL,
63d63dc051SHeiko Stuebner };
64d63dc051SHeiko Stuebner 
658c421241SHeiko Stuebner DT_MACHINE_START(ROCKCHIP_DT, "Rockchip (Device Tree)")
662a2d2fffSRussell King 	.l2c_aux_val	= 0,
672a2d2fffSRussell King 	.l2c_aux_mask	= ~0,
68c9b75d51SHeiko Stübner 	.init_time	= rockchip_timer_init,
69d63dc051SHeiko Stuebner 	.dt_compat	= rockchip_board_dt_compat,
7047b06fc2SHeiko Stuebner 	.init_machine	= rockchip_dt_init,
71d63dc051SHeiko Stuebner MACHINE_END
72