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