From d47b22f1f0c8998b83d34ccfb63d7a61a5d2f7f4 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=E9=99=88=E4=BA=AE?= Date: Thu, 31 Jul 2014 05:21:43 -0700 Subject: [PATCH] rk312x: init rockchip_pmu_ops --- arch/arm/mach-rockchip/rk312x.c | 42 +++++++++++++++++++++++++++++++++ include/linux/rockchip/cru.h | 5 ++++ 2 files changed, 47 insertions(+) diff --git a/arch/arm/mach-rockchip/rk312x.c b/arch/arm/mach-rockchip/rk312x.c index b6473e34eff9..8fc06d08d0f0 100755 --- a/arch/arm/mach-rockchip/rk312x.c +++ b/arch/arm/mach-rockchip/rk312x.c @@ -108,8 +108,50 @@ static void __init rk3128_dt_map_io(void) rk312x_dt_map_io(); } +extern void secondary_startup(void); +static int rk312x_sys_set_power_domain(enum pmu_power_domain pd, bool on) +{ + if (on) { +#ifdef CONFIG_SMP + if (pd >= PD_CPU_1 && pd <= PD_CPU_3) { + writel_relaxed(0x20000 << (pd - PD_CPU_1), + RK_CRU_VIRT + RK312X_CRU_SOFTRSTS_CON(0)); + dsb(); + udelay(10); + writel_relaxed(virt_to_phys(secondary_startup), + RK312X_IMEM_VIRT + 8); + writel_relaxed(0xDEADBEAF, RK312X_IMEM_VIRT + 4); + dsb_sev(); + } +#endif + } else { +#ifdef CONFIG_SMP + if (pd >= PD_CPU_1 && pd <= PD_CPU_3) { + writel_relaxed(0x20002 << (pd - PD_CPU_1), + RK_CRU_VIRT + RK312X_CRU_SOFTRSTS_CON(0)); + dsb(); + } +#endif + } + + return 0; +} + +static bool rk312x_pmu_power_domain_is_on(enum pmu_power_domain pd) +{ + return 1; +} + +static int rk312x_pmu_set_idle_request(enum pmu_idle_req req, bool idle) +{ + return 0; +} + static void __init rk312x_dt_init_timer(void) { + rockchip_pmu_ops.set_power_domain = rk312x_sys_set_power_domain; + rockchip_pmu_ops.power_domain_is_on = rk312x_pmu_power_domain_is_on; + rockchip_pmu_ops.set_idle_request = rk312x_pmu_set_idle_request; of_clk_init(NULL); clocksource_of_init(); of_dvfs_init(); diff --git a/include/linux/rockchip/cru.h b/include/linux/rockchip/cru.h index 2205d5b6c20a..bad44d358ccc 100755 --- a/include/linux/rockchip/cru.h +++ b/include/linux/rockchip/cru.h @@ -161,4 +161,9 @@ static inline void rk3288_cru_set_soft_reset(u32 idx, bool on) #define RK3036_CRU_SOFTRSTS_CON_CNT (9) #define RK3036_CRU_SOFTRSTS_CON(i) (RK3036_CRU_SOFTRST_CON + ((i) * 4)) +#define RK312X_CRU_SOFTRST_CON 0x110 + +#define RK312X_CRU_SOFTRSTS_CON_CNT (9) +#define RK312X_CRU_SOFTRSTS_CON(i) (RK312X_CRU_SOFTRST_CON + ((i) * 4)) + #endif -- 2.34.1