rk312x: init rockchip_pmu_ops
author陈亮 <cl@rock-chips.com>
Thu, 31 Jul 2014 12:21:43 +0000 (05:21 -0700)
committer陈亮 <cl@rock-chips.com>
Thu, 31 Jul 2014 12:21:43 +0000 (05:21 -0700)
arch/arm/mach-rockchip/rk312x.c
include/linux/rockchip/cru.h

index b6473e34eff970c4385478f0840bc89f4d4fafbb..8fc06d08d0f0bf26696b6095fec52a7946c34b75 100755 (executable)
@@ -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();
index 2205d5b6c20a364f4cc4d8316548a3780a9e19e0..bad44d358ccc1a6eb481f6456eb3a6246ba50169 100755 (executable)
@@ -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