2 * Device Tree support for Rockchip RK3036
4 * Copyright (C) 2014 ROCKCHIP, Inc.
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
17 #include <linux/clk-provider.h>
18 #include <linux/clocksource.h>
19 #include <linux/cpuidle.h>
20 #include <linux/delay.h>
21 #include <linux/init.h>
22 #include <linux/irqchip.h>
23 #include <linux/kernel.h>
24 #include <linux/of_address.h>
25 #include <linux/of_platform.h>
26 #include <linux/wakeup_reason.h>
27 #include <linux/rockchip/common.h>
28 #include <linux/rockchip/cpu.h>
29 #include <linux/rockchip/cru.h>
30 #include <linux/rockchip/dvfs.h>
31 #include <linux/rockchip/grf.h>
32 #include <linux/rockchip/iomap.h>
33 #include <linux/rockchip/pmu.h>
34 #include <asm/cpuidle.h>
35 #include <asm/cputype.h>
36 #include <asm/mach/arch.h>
37 #include <asm/mach/map.h>
44 #define RK3036_DEVICE(name) \
46 .virtual = (unsigned long) RK_##name##_VIRT, \
47 .pfn = __phys_to_pfn(RK3036_##name##_PHYS), \
48 .length = RK3036_##name##_SIZE, \
52 #define RK3036_IMEM_VIRT (RK_BOOTRAM_VIRT + SZ_32K)
53 #define RK3036_TIMER5_VIRT (RK_TIMER_VIRT + 0xa0)
55 static struct map_desc rk3036_io_desc[] __initdata = {
60 RK3036_DEVICE(CPU_AXI_BUS),
61 RK_DEVICE(RK_DDR_VIRT, RK3036_DDR_PCTL_PHYS, RK3036_DDR_PCTL_SIZE),
62 RK_DEVICE(RK_DDR_VIRT + RK3036_DDR_PCTL_SIZE, RK3036_DDR_PHY_PHYS,
64 RK_DEVICE(RK_GPIO_VIRT(0), RK3036_GPIO0_PHYS, RK3036_GPIO_SIZE),
65 RK_DEVICE(RK_GPIO_VIRT(1), RK3036_GPIO1_PHYS, RK3036_GPIO_SIZE),
66 RK_DEVICE(RK_GPIO_VIRT(2), RK3036_GPIO2_PHYS, RK3036_GPIO_SIZE),
67 RK_DEVICE(RK_DEBUG_UART_VIRT, RK3036_UART2_PHYS, RK3036_UART_SIZE),
68 RK_DEVICE(RK_GIC_VIRT, RK3036_GIC_DIST_PHYS, RK3036_GIC_DIST_SIZE),
69 RK_DEVICE(RK_GIC_VIRT + RK3036_GIC_DIST_SIZE, RK3036_GIC_CPU_PHYS,
71 RK_DEVICE(RK3036_IMEM_VIRT, RK3036_IMEM_PHYS, SZ_4K),
72 RK_DEVICE(RK_TIMER_VIRT, RK3036_TIMER_PHYS, RK3036_TIMER_SIZE),
75 static void __init rk3036_boot_mode_init(void)
77 u32 flag = readl_relaxed(RK_GRF_VIRT + RK3036_GRF_OS_REG4);
78 u32 mode = readl_relaxed(RK_GRF_VIRT + RK3036_GRF_OS_REG5);
79 u32 rst_st = readl_relaxed(RK_CRU_VIRT + RK3036_CRU_RST_ST);
81 if (flag == (SYS_KERNRL_REBOOT_FLAG | BOOT_RECOVER))
82 mode = BOOT_MODE_RECOVERY;
83 if (rst_st & ((1 << 2) | (1 << 3)))
84 mode = BOOT_MODE_WATCHDOG;
85 rockchip_boot_mode_init(flag, mode);
88 static void usb_uart_init(void)
90 #ifdef CONFIG_RK_USB_UART
91 u32 soc_status0 = readl_relaxed(RK_GRF_VIRT + RK3036_GRF_SOC_STATUS0);
93 writel_relaxed(0x34000000, RK_GRF_VIRT + RK3036_GRF_UOC1_CON4);
94 #ifdef CONFIG_RK_USB_UART
95 if (!(soc_status0 & (1 << 14)) && (soc_status0 & (1 << 17))) {
96 /* software control usb phy enable */
97 writel_relaxed(0x007f0055, RK_GRF_VIRT + RK3036_GRF_UOC0_CON5);
98 writel_relaxed(0x34003000, RK_GRF_VIRT + RK3036_GRF_UOC1_CON4);
102 writel_relaxed(0x07, RK_DEBUG_UART_VIRT + 0x88);
103 writel_relaxed(0x00, RK_DEBUG_UART_VIRT + 0x04);
104 writel_relaxed(0x83, RK_DEBUG_UART_VIRT + 0x0c);
105 writel_relaxed(0x0d, RK_DEBUG_UART_VIRT + 0x00);
106 writel_relaxed(0x00, RK_DEBUG_UART_VIRT + 0x04);
107 writel_relaxed(0x03, RK_DEBUG_UART_VIRT + 0x0c);
110 static void __init rk3036_dt_map_io(void)
112 rockchip_soc_id = ROCKCHIP_SOC_RK3036;
114 iotable_init(rk3036_io_desc, ARRAY_SIZE(rk3036_io_desc));
118 /* enable timer5 for core */
119 writel_relaxed(0, RK3036_TIMER5_VIRT + 0x10);
121 writel_relaxed(0xFFFFFFFF, RK3036_TIMER5_VIRT + 0x00);
122 writel_relaxed(0xFFFFFFFF, RK3036_TIMER5_VIRT + 0x04);
124 writel_relaxed(1, RK3036_TIMER5_VIRT + 0x10);
127 rk3036_boot_mode_init();
130 extern void secondary_startup(void);
131 static int rk3036_sys_set_power_domain(enum pmu_power_domain pd, bool on)
135 if (PD_CPU_1 == pd) {
136 writel_relaxed(0x20000
137 , RK_CRU_VIRT + RK3036_CRU_SOFTRST0_CON);
140 writel_relaxed(virt_to_phys(secondary_startup),
141 RK3036_IMEM_VIRT + 8);
142 writel_relaxed(0xDEADBEAF, RK3036_IMEM_VIRT + 4);
148 if (PD_CPU_1 == pd) {
149 writel_relaxed(0x20002
150 , RK_CRU_VIRT + RK3036_CRU_SOFTRST0_CON);
159 static bool rk3036_pmu_power_domain_is_on(enum pmu_power_domain pd)
164 static int rk3036_pmu_set_idle_request(enum pmu_idle_req req, bool idle)
169 static void __init rk3036_dt_init_timer(void)
171 rockchip_pmu_ops.set_power_domain = rk3036_sys_set_power_domain;
172 rockchip_pmu_ops.power_domain_is_on = rk3036_pmu_power_domain_is_on;
173 rockchip_pmu_ops.set_idle_request = rk3036_pmu_set_idle_request;
175 clocksource_of_init();
179 static inline void rk3036_uart_printch(char byte)
182 writel_relaxed(byte, RK_DEBUG_UART_VIRT);
185 /* loop check LSR[6], Transmitter Empty bit */
186 while (!(readl_relaxed(RK_DEBUG_UART_VIRT + 0x14) & 0x40))
195 static void rk3036_ddr_printch(char byte)
197 rk3036_uart_printch(byte);
199 rk_last_log_text(&byte, 1);
203 rk_last_log_text(&byte, 1);
214 #define GPIO_INTEN 0x30
215 #define GPIO_INT_STATUS 0x40
216 #define GIC_DIST_PENDING_SET 0x200
217 static void rk3036_pm_dump_irq(void)
219 u32 irq_gpio = (readl_relaxed(RK_GIC_VIRT
220 + GIC_DIST_PENDING_SET + 8) >> 4) & 7;
224 for (i = 0; i < ARRAY_SIZE(irq); i++) {
225 irq[i] = readl_relaxed(RK_GIC_VIRT + GIC_DIST_PENDING_SET +
228 log_wakeup_reason(32 * (i + 1) + fls(irq[i]) - 1);
230 pr_info("wakeup irq: %08x %08x %08x %08x\n",
231 irq[0], irq[1], irq[2], irq[3]);
232 for (i = 0; i <= 2; i++) {
233 if (irq_gpio & (1 << i))
234 pr_info("wakeup gpio%d: %08x\n", i,
235 readl_relaxed(RK_GPIO_VIRT(i) +
240 #define DUMP_GPIO_INTEN(ID) \
242 u32 en = readl_relaxed(RK_GPIO_VIRT(ID) + GPIO_INTEN); \
244 pr_info("GPIO%d_INTEN: %08x\n", ID, en); \
248 static void rk3036_pm_dump_inten(void)
255 static u32 clk_ungt_msk[RK3036_CRU_CLKGATES_CON_CNT];
256 /*first clk gating setting*/
258 static u32 clk_ungt_msk_1[RK3036_CRU_CLKGATES_CON_CNT];
259 /* first clk gating setting*/
261 static u32 clk_ungt_save[RK3036_CRU_CLKGATES_CON_CNT];
262 /*first clk gating value saveing*/
264 static u32 *p_rkpm_clkgt_last_set;
265 #define CLK_MSK_GATING(msk, con) cru_writel((msk << 16) | 0xffff, con)
266 #define CLK_MSK_UNGATING(msk, con) cru_writel(((~msk) << 16) | 0xffff, con)
268 static void gtclks_suspend(void)
272 for (i = 0; i < RK3036_CRU_CLKGATES_CON_CNT; i++) {
273 clk_ungt_save[i] = cru_readl(RK3036_CRU_CLKGATES_CON(i));
275 CLK_MSK_UNGATING(clk_ungt_msk[i]
276 , RK3036_CRU_CLKGATES_CON(i));
278 cru_writel(clk_ungt_msk[i], RK3036_CRU_CLKGATES_CON(i));
281 /*gpio0_a1 clk gate should be disable for volt adjust*/
282 if (cru_readl(RK3036_CRU_CLKGATES_CON(8)) & 0x200)
283 cru_writel(0x02000000, RK3036_CRU_CLKGATES_CON(8));
286 static void gtclks_resume(void)
290 for (i = 0; i < RK3036_CRU_CLKGATES_CON_CNT; i++) {
292 cru_writel(clk_ungt_save[i] | 0xffff0000
293 , RK3036_CRU_CLKGATES_CON(i));
295 cru_writel(clk_ungt_save[i]
296 , RK3036_CRU_CLKGATES_CON(i));
300 static void clks_gating_suspend_init(void)
302 p_rkpm_clkgt_last_set = &clk_ungt_msk_1[0];
303 if (clk_suspend_clkgt_info_get(clk_ungt_msk, p_rkpm_clkgt_last_set
304 , RK3036_CRU_CLKGATES_CON_CNT) == RK3036_CRU_CLKGATES_CON(0))
305 rkpm_set_ops_gtclks(gtclks_suspend, gtclks_resume);
308 #define RK3036_PLL_BYPASS CRU_W_MSK_SETBITS(1, 0xF, 0x01)
309 #define RK3036_PLL_NOBYPASS CRU_W_MSK_SETBITS(0, 0xF, 0x01)
311 #define grf_readl(offset) readl_relaxed(RK_GRF_VIRT + offset)
312 #define grf_writel(v, offset) do { writel_relaxed(v, \
313 RK_GRF_VIRT + offset); dsb(); } while (0)
315 #define gpio0_readl(offset) readl_relaxed(RK_GPIO_VIRT(0) + offset)
316 #define gpio0_writel(v, offset) do { writel_relaxed(v, RK_GPIO_VIRT(0) \
317 + offset); dsb(); } while (0)
319 static u32 plls_con0_save[RK3036_END_PLL_ID];
320 static u32 plls_con1_save[RK3036_END_PLL_ID];
321 static u32 plls_con2_save[RK3036_END_PLL_ID];
323 static u32 cru_mode_con;
324 static u32 clk_sel0, clk_sel1, clk_sel10;
325 static int goio0_pin_iomux, gpio0_pin_data, gpio0_pin_dir;
327 static void pm_pll_wait_lock(u32 pll_idx)
338 if ((cru_readl(RK3036_PLL_CONS(pll_idx, 1)) & (0x1 << 10)))
343 rkpm_ddr_printascii("unlock-pll:");
344 rkpm_ddr_printhex(pll_idx);
345 rkpm_ddr_printch('\n');
349 static void pll_udelay(u32 udelay)
353 mode = cru_readl(RK3036_CRU_MODE_CON);
354 cru_writel(RK3036_PLL_MODE_SLOW(APLL_ID), RK3036_CRU_MODE_CON);
355 rkpm_udelay(udelay * 5);
356 cru_writel(mode|(RK3036_PLL_MODE_MSK(APLL_ID)
357 << 16), RK3036_CRU_MODE_CON);
360 static inline void plls_suspend(u32 pll_id)
362 plls_con0_save[pll_id] = cru_readl(RK3036_PLL_CONS((pll_id), 0));
363 plls_con1_save[pll_id] = cru_readl(RK3036_PLL_CONS((pll_id), 1));
364 plls_con2_save[pll_id] = cru_readl(RK3036_PLL_CONS((pll_id), 2));
366 cru_writel(RK3036_PLL_BYPASS, RK3036_PLL_CONS((pll_id), 0));
368 static inline void plls_resume(u32 pll_id)
370 u32 pllcon0, pllcon1, pllcon2;
372 pllcon0 = plls_con0_save[pll_id];
373 pllcon1 = plls_con1_save[pll_id];
374 pllcon2 = plls_con2_save[pll_id];
376 cru_writel(pllcon0 | 0xffff0000, RK3036_PLL_CONS(pll_id, 0));
377 cru_writel(pllcon1 | 0xf5ff0000, RK3036_PLL_CONS(pll_id, 1));
378 cru_writel(pllcon2, RK3036_PLL_CONS(pll_id, 2));
384 pm_pll_wait_lock(pll_id);
387 static void pm_plls_suspend(void)
389 cru_mode_con = cru_readl(RK3036_CRU_MODE_CON);
391 clk_sel0 = cru_readl(RK3036_CRU_CLKSELS_CON(0));
392 clk_sel1 = cru_readl(RK3036_CRU_CLKSELS_CON(1));
393 clk_sel10 = cru_readl(RK3036_CRU_CLKSELS_CON(10));
395 cru_writel(RK3036_PLL_MODE_SLOW(GPLL_ID), RK3036_CRU_MODE_CON);
397 |CRU_W_MSK_SETBITS(0, 0, 0x1f)
398 |CRU_W_MSK_SETBITS(0, 8, 0x3)
399 |CRU_W_MSK_SETBITS(0, 12, 0x3)
400 , RK3036_CRU_CLKSELS_CON(10));
401 plls_suspend(GPLL_ID);
404 cru_writel(RK3036_PLL_MODE_SLOW(APLL_ID), RK3036_CRU_MODE_CON);
407 |CRU_W_MSK_SETBITS(0, 0, 0x1f)
408 |CRU_W_MSK_SETBITS(0, 8, 0x1f)
409 , RK3036_CRU_CLKSELS_CON(0));
412 |CRU_W_MSK_SETBITS(0, 0, 0xf)
413 |CRU_W_MSK_SETBITS(0, 4, 0x7)
414 |CRU_W_MSK_SETBITS(0, 8, 0x3)
415 |CRU_W_MSK_SETBITS(0, 12, 0x7)
416 , RK3036_CRU_CLKSELS_CON(1));
418 plls_suspend(APLL_ID);
420 goio0_pin_iomux = grf_readl(0xa8);
421 grf_writel(0x000c0000, 0xa8);
423 gpio0_pin_data = gpio0_readl(0x0);
424 gpio0_pin_dir = gpio0_readl(0x04);
426 gpio0_writel(gpio0_pin_dir | 0x2, 0x04);
427 gpio0_writel(gpio0_pin_data | 0x2, 0x00);
430 static void pm_plls_resume(void)
432 gpio0_writel(gpio0_pin_dir, 0x04);
433 gpio0_writel(gpio0_pin_data, 0x00);
434 grf_writel(0x000c0008, 0xa8);
436 cru_writel(clk_sel0 | (CRU_W_MSK(0, 0x1f) | CRU_W_MSK(8, 0x1f))
437 , RK3036_CRU_CLKSELS_CON(0));
438 cru_writel(clk_sel1 | (CRU_W_MSK(0, 0xf) | CRU_W_MSK(4, 0x7)
439 |CRU_W_MSK(8, 0x3) | CRU_W_MSK(12, 0x7))
440 , RK3036_CRU_CLKSELS_CON(1));
442 plls_resume(APLL_ID);
443 cru_writel(cru_mode_con | (RK3036_PLL_MODE_MSK(APLL_ID) << 16)
444 , RK3036_CRU_MODE_CON);
445 cru_writel(clk_sel10 | (CRU_W_MSK(0, 0x1f) | CRU_W_MSK(8, 0x3)
446 | CRU_W_MSK(12, 0x3)), RK3036_CRU_CLKSELS_CON(10));
447 plls_resume(GPLL_ID);
448 cru_writel(cru_mode_con | (RK3036_PLL_MODE_MSK(GPLL_ID)
449 << 16), RK3036_CRU_MODE_CON);
452 #include "ddr_rk3036.c"
455 char PIE_DATA(sram_stack)[1024];
456 EXPORT_PIE_SYMBOL(DATA(sram_stack));
458 static int __init rk3036_pie_init(void)
462 if (!cpu_is_rk3036())
465 err = rockchip_pie_init();
469 rockchip_pie_chunk = pie_load_sections(rockchip_sram_pool, rk3036);
470 if (IS_ERR(rockchip_pie_chunk)) {
471 err = PTR_ERR(rockchip_pie_chunk);
472 pr_err("%s: failed to load section %d\n", __func__, err);
473 rockchip_pie_chunk = NULL;
477 rockchip_sram_virt = kern_to_pie(rockchip_pie_chunk
478 , &__pie_common_start[0]);
479 rockchip_sram_stack = kern_to_pie(rockchip_pie_chunk
480 , (char *)DATA(sram_stack) + sizeof(DATA(sram_stack)));
484 arch_initcall(rk3036_pie_init);
486 static void reg_pread(void)
491 volatile u32 *temp = (volatile unsigned int *)rockchip_sram_virt;
495 local_flush_tlb_all();
497 for (i = 0; i < 2; i++) {
502 n = readl_relaxed(RK_GPIO_VIRT(0));
503 n = readl_relaxed(RK_GPIO_VIRT(1));
504 n = readl_relaxed(RK_GPIO_VIRT(2));
506 n = readl_relaxed(RK_DEBUG_UART_VIRT);
507 n = readl_relaxed(RK_CPU_AXI_BUS_VIRT);
508 n = readl_relaxed(RK_DDR_VIRT);
509 n = readl_relaxed(RK_GRF_VIRT);
510 n = readl_relaxed(RK_CRU_VIRT);
513 #define RK3036_CRU_UNGATING_OPS(id) cru_writel(\
514 CRU_W_MSK_SETBITS(0, (id), 0x1), RK3036_CRU_UART_GATE)
515 #define RK3036_CRU_GATING_OPS(id) cru_writel(\
516 CRU_W_MSK_SETBITS(1, (id), 0x1), RK3036_CRU_UART_GATE)
518 static inline void uart_printch(char bbyte)
521 u32 u_clk_id = (RK3036_CLKGATE_UART0_SRC + CONFIG_RK_DEBUG_UART * 2);
522 u32 u_pclk_id = (RK3036_CLKGATE_UART0_PCLK + CONFIG_RK_DEBUG_UART * 2);
524 reg_save = cru_readl(RK3036_CRU_UART_GATE);
525 RK3036_CRU_UNGATING_OPS(u_clk_id);
526 RK3036_CRU_UNGATING_OPS(u_pclk_id);
531 writel_relaxed(bbyte, RK_DEBUG_UART_VIRT);
534 while (!(readl_relaxed(RK_DEBUG_UART_VIRT + 0x14) & 0x40))
542 cru_writel(reg_save | CRU_W_MSK(u_clk_id
543 , 0x1), RK3036_CRU_UART_GATE);
544 cru_writel(reg_save | CRU_W_MSK(u_pclk_id
545 , 0x1), RK3036_CRU_UART_GATE);
550 writel_relaxed(bbyte, RK_DEBUG_UART_VIRT);
553 while (!(readl_relaxed(RK_DEBUG_UART_VIRT + 0x14) & 0x40))
563 void PIE_FUNC(sram_printch)(char byte)
568 static void __init rk3036_suspend_init(void)
570 struct device_node *parent;
573 PM_LOG("%s enter\n", __func__);
575 parent = of_find_node_by_name(NULL, "rockchip_suspend");
577 if (IS_ERR_OR_NULL(parent)) {
578 PM_ERR("%s dev node err\n", __func__);
582 if (of_property_read_u32_array(parent, "rockchip,ctrbits"
584 PM_ERR("%s:get pm ctr error\n", __func__);
587 PM_LOG("%s: pm_ctrbits =%x\n", __func__, pm_ctrbits);
588 rkpm_set_ctrbits(pm_ctrbits);
590 clks_gating_suspend_init();
591 rkpm_set_ops_plls(pm_plls_suspend, pm_plls_resume);
593 rkpm_set_ops_regs_pread(reg_pread);
594 rkpm_set_sram_ops_ddr(fn_to_pie(rockchip_pie_chunk
595 , &FUNC(ddr_suspend))
596 , fn_to_pie(rockchip_pie_chunk, &FUNC(ddr_resume)));
598 rkpm_set_ops_prepare_finish(rk3036_pm_dump_inten
599 , rk3036_pm_dump_irq);
601 rkpm_set_sram_ops_printch(fn_to_pie(rockchip_pie_chunk
602 , &FUNC(sram_printch)));
603 rkpm_set_ops_printch(rk3036_ddr_printch);
607 static void __init rk3036_init_suspend(void)
609 pr_info("%s\n", __func__);
610 rockchip_suspend_init();
612 rk3036_suspend_init();
615 static void __init rk3036_init_late(void)
618 rk3036_init_suspend();
622 static void __init rk3036_reserve(void)
624 /* reserve memory for ION */
625 rockchip_ion_reserve();
628 static void rk3036_restart(char mode, const char *cmd)
630 u32 boot_flag, boot_mode;
632 rockchip_restart_get_boot_mode(cmd, &boot_flag, &boot_mode);
634 writel_relaxed(boot_flag, RK_GRF_VIRT + RK3036_GRF_OS_REG4);
636 writel_relaxed(boot_mode, RK_GRF_VIRT + RK3036_GRF_OS_REG5);
639 /* pll enter slow mode */
640 writel_relaxed(0x30110000, RK_CRU_VIRT + RK3036_CRU_MODE_CON);
642 writel_relaxed(0xeca8, RK_CRU_VIRT + RK3036_CRU_GLB_SRST_SND_VALUE);
646 static const char *const rk3036_dt_compat[] __initconst = {
651 DT_MACHINE_START(RK3036_DT, "Rockchip RK3036")
652 .dt_compat = rk3036_dt_compat,
653 .smp = smp_ops(rockchip_smp_ops),
654 .reserve = rk3036_reserve,
655 .map_io = rk3036_dt_map_io,
656 .init_time = rk3036_dt_init_timer,
657 .init_late = rk3036_init_late,
658 .reserve = rk3036_reserve,
659 .restart = rk3036_restart,