compatible = "rockchip,rk-clock-regs";
#address-cells = <1>;
#size-cells = <1>;
+ reg = <0x0000 0x3ff>;
ranges;
/* PLL control regs */
"clk_acc_efuse", "reserved",
"reserved", "reserved";
+ rockchip,suspend-clkgating-setting=<0x0fff 0x0fff>;
#clock-cells = <1>;
};
"clk_uart2_div", "uart2_frac",
"clk_uart3_div", "uart3_frac";
+ rockchip,suspend-clkgating-setting=<0x0 0x0>;
#clock-cells = <1>;
};
"clk_uart4_div", "uart4_frac",
"reserved", "reserved";
+ rockchip,suspend-clkgating-setting=<0x000f 0x000f>;
#clock-cells = <1>;
};
"clk_edp_24m", "clk_edp",
"clk_isp", "clk_isp_jpe";
+ rockchip,suspend-clkgating-setting=<0x0000 0x0000>;
#clock-cells = <1>;
};
"reserved", "reserved", /*"g_clk_ddrphy0", "g_clk_ddrphy1",*/
"clk_jtag", "reserved"; /*"testclk_gate_en";*/
+ rockchip,suspend-clkgating-setting=<0x7000 0xf000>;
#clock-cells = <1>;
};
"g_hdmi_hdcp_clk", "g_ps2c_clk",
"usbphy_480m", "g_mipidsi_24m";
+ rockchip,suspend-clkgating-setting=<0x0000 0x0000>;
#clock-cells = <1>;
};
"g_pclk_uart4", "g_pclk_i2c2",
"g_pclk_i2c3", "g_pclk_i2c4";
+ rockchip,suspend-clkgating-setting=<0x0003 0x0003>;
#clock-cells = <1>;
};
"g_h_emem_peri", "g_hclk_mem_peri",
"g_hclk_nandc0", "g_hclk_nandc1";
+ rockchip,suspend-clkgating-setting=<0x0c00 0xc000>;
#clock-cells = <1>;
};
"g_aclk_peri_mmu", "reserved",
"reserved", "reserved";
+ rockchip,suspend-clkgating-setting=<0x0000 0x0000>;
#clock-cells = <1>;
};
"reserved", "reserved",
"reserved", "reserved";
+ rockchip,suspend-clkgating-setting=<0x0 0x0>;
#clock-cells = <1>;
};
"g_aclk_dmac1", "g_aclk_strc_sys",
"g_p_ddrupctl0", "g_pclk_publ0";
+ rockchip,suspend-clkgating-setting=<0xe0f0 0xe0f0>;
#clock-cells = <1>;
};
"reserved", "reserved",
"reserved", "reserved";
+ rockchip,suspend-clkgating-setting=<0x0033 0x0033>;
#clock-cells = <1>;
};
"reserved", "reserved",
"reserved", "reserved";
+ rockchip,suspend-clkgating-setting=<0x0ff1 0x0ff1>;
#clock-cells = <1>;
};
"g_clk_wifi", "aclk_hevc",
"clk_hevc_cabac", "clk_hevc_core";
+ rockchip,suspend-clkgating-setting=<0x0 0x0>;
#clock-cells = <1>;
};
"g_p_alive_niu", "reserved",
"reserved", "reserved";
+ rockchip,suspend-clkgating-setting=<0xffff 0xffff>;
#clock-cells = <1>;
};
"g_aclk_vio1_niu", "g_aclk_vio2_niu",
"g_aclk_vip", "g_hclk_vip";
+ rockchip,suspend-clkgating-setting=<0x0 0x0>;
#clock-cells = <1>;
};
"reserved", "reserved",
"reserved", "reserved";
+ rockchip,suspend-clkgating-setting=<0x0 0x0>;
#clock-cells = <1>;
};
"reserved", "reserved",
"reserved", "reserved";
+ rockchip,suspend-clkgating-setting=<0x01f 0x01f>;
#clock-cells = <1>;
};
"reserved", "reserved",
"reserved", "reserved";
+ rockchip,suspend-clkgating-setting=<0x0 0x0>;
#clock-cells = <1>;
};
/ {
compatible = "rockchip,rk3288";
+ rockchip,sram = <&sram>;
interrupt-parent = <&gic>;
aliases {
rockchip_suspend {
rockchip,ctrbits = <
(0
- // RKPM_CTR_PWR_DMNS
+ //|RKPM_CTR_PWR_DMNS
//|RKPM_CTR_GTCLKS
//|RKPM_CTR_PLLS
//|RKPM_CTR_SYSCLK_DIV
- |RKPM_CTR_NORIDLE_MD
+ //|RKPM_CTR_NORIDLE_MD
)
>;
rockchip,pmic-gpios=<
if(DATA(pm_sram_ops).printch)
DATA(pm_sram_ops).printch(byte);
- if (byte == '\n')
- FUNC(rkpm_sram_printch_pie)('\r');
+ // if (byte == '\n')
+ //FUNC(rkpm_sram_printch_pie)('\r');
}
void PIE_FUNC(rkpm_sram_printhex_pie)(unsigned int hex)
}
static void rkpm_pie_init(void)
{
+ if(rockchip_pie_chunk)
+ {
rkpm_set_pie_info(kern_to_pie(rockchip_pie_chunk, &DATA(pm_sram_ops))
,fn_to_pie(rockchip_pie_chunk, &FUNC(rkpm_sram_suspend_arg)));
+ }
}
#include <linux/rockchip/iomap.h>
#include "pm.h"
-//#define CPU 3288
+#define CPU 3288
//#include "sram.h"
#include "pm-pie.c"
if(b_addr==NULL || ch>=RK3288_UART_NUM)
return;
if(ch==2)
+ {
idx=RK3288_CLKGATE_PCLK_UART2;
+ b_addr=RK_DEBUG_UART_VIRT;
+ }
gate_reg=cru_readl(RK3288_CRU_GATEID_CONS(idx));
}
-
-
-
-
-
/*******************************clk gating config*******************************************/
#define CLK_MSK_GATING(msk, con) cru_writel((msk << 16) | 0xffff, con)
#define CLK_MSK_UNGATING(msk, con) cru_writel(((~msk) << 16) | 0xffff, con)
static u32 clk_ungt_msk[RK3288_CRU_CLKGATES_CON_CNT];// first clk gating setting
+static u32 clk_ungt_msk_1[RK3288_CRU_CLKGATES_CON_CNT];// first clk gating setting
static u32 clk_ungt_save[RK3288_CRU_CLKGATES_CON_CNT]; //first clk gating value saveing
static void gtclks_suspend(void)
{
int i;
-
+
+ // rkpm_ddr_regs_dump(RK_CRU_VIRT,RK3288_CRU_CLKGATES_CON(0)
+ // ,RK3288_CRU_CLKGATES_CON(RK3288_CRU_CLKGATES_CON_CNT-1));
for(i=0;i<RK3288_CRU_CLKGATES_CON_CNT;i++)
{
-
- clk_ungt_save[i]=cru_readl(RK3288_CRU_CLKGATES_CON(i));
- //if(i!=4||i!=0)
- CLK_MSK_UNGATING(clk_ungt_msk[i],RK3288_CRU_CLKGATES_CON(i));
- #if 0
- rkpm_ddr_printch('\n');
- rkpm_ddr_printhex(clk_ungt_save[i]);
- rkpm_ddr_printch('-');
- rkpm_ddr_printhex(clk_ungt_msk[i]);
- rkpm_ddr_printch('-');
- rkpm_ddr_printhex(cru_readl(RK3188_CRU_CLKGATES_CON(i))) ;
- if(i==(RK3288_CRU_CLKGATES_CON_CNT-1))
+ clk_ungt_save[i]=cru_readl(RK3288_CRU_CLKGATES_CON(i));
+ //if(RK3288_CRU_CLKGATES_CON(i)<0x170||RK3288_CRU_CLKGATES_CON(i)>0x194)
+ {
+ CLK_MSK_UNGATING(clk_ungt_msk[i],RK3288_CRU_CLKGATES_CON(i));
+
+ }
+ #if 0
rkpm_ddr_printch('\n');
- #endif
+ rkpm_ddr_printhex(RK3288_CRU_CLKGATES_CON(i));
+ rkpm_ddr_printch('-');
+ rkpm_ddr_printhex(clk_ungt_msk[i]);
+ rkpm_ddr_printch('-');
+ rkpm_ddr_printhex(cru_readl(RK3288_CRU_CLKGATES_CON(i))) ;
+ if(i==(RK3288_CRU_CLKGATES_CON_CNT-1))
+ rkpm_ddr_printch('\n');
+ #endif
}
}
int i;
for(i=0;i<RK3288_CRU_CLKGATES_CON_CNT;i++)
{
- cru_writel(clk_ungt_save[i]|0xffff0000,RK3288_CRU_CLKGATES_CON(i));
+ cru_writel(clk_ungt_save[i]|0xffff0000,RK3288_CRU_CLKGATES_CON(i));
}
+ //rkpm_ddr_regs_dump(RK_CRU_VIRT,RK3288_CRU_CLKGATES_CON(0)
+ // ,RK3288_CRU_CLKGATES_CON(RK3288_CRU_CLKGATES_CON_CNT-1));
}
/********************************pll power down***************************************/
{
u32 pllcon0, pllcon1, pllcon2;
- if(plls_con3_save[pll_id]||RK3288_PLL_PWR_DN_MSK)
- return ;
+ // rkpm_ddr_printascii("ddr");
+ // rkpm_ddr_printhex(pll_id);
+
+ if(!(plls_con3_save[pll_id]&&RK3288_PLL_PWR_DN_MSK))
+ return ;
+ //rkpm_ddr_printascii("res\n");
//enter slowmode
cru_writel(RK3288_PLL_MODE_SLOW(pll_id), RK3288_CRU_MODE_CON);
static void pm_plls_suspend(void)
{
+
+ //rkpm_ddr_regs_dump(RK_CRU_VIRT,RK3288_PLL_CONS((0), 0),RK3288_PLL_CONS((4), 3));
+ //rkpm_ddr_regs_dump(RK_CRU_VIRT,RK3288_CRU_MODE_CON,RK3288_CRU_MODE_CON);
+ //rkpm_ddr_regs_dump(RK_CRU_VIRT,RK3288_CRU_CLKSELS_CON(0),RK3288_CRU_CLKSELS_CON(42));
+
clk_sel0=cru_readl(RK3288_CRU_CLKSELS_CON(0));
clk_sel1=cru_readl(RK3288_CRU_CLKSELS_CON(1));
clk_sel10=cru_readl(RK3288_CRU_CLKSELS_CON(10));
plls_resume(NPLL_ID);
cru_writel(cru_mode_con|(RK3288_PLL_MODE_MSK(NPLL_ID)<<16), RK3288_CRU_MODE_CON);
+ //rkpm_ddr_regs_dump(RK_CRU_VIRT,RK3288_PLL_CONS((0), 0),RK3288_PLL_CONS((4), 3));
+ // rkpm_ddr_regs_dump(RK_CRU_VIRT,RK3288_CRU_MODE_CON,RK3288_CRU_MODE_CON);
+ //rkpm_ddr_regs_dump(RK_CRU_VIRT,RK3288_CRU_CLKSELS_CON(0),RK3288_CRU_CLKSELS_CON(42));
+
}
static __sramdata u32 sysclk_clksel0_con,sysclk_clksel1_con,sysclk_clksel10_con,sysclk_mode_con;
static void clks_gating_suspend_init(void)
{
// get clk gating info
- p_rkpm_clkgt_last_set= kern_to_pie(rockchip_pie_chunk, &DATA(rkpm_clkgt_last_set[0]));
-
+ if(rockchip_pie_chunk)
+ p_rkpm_clkgt_last_set= kern_to_pie(rockchip_pie_chunk, &DATA(rkpm_clkgt_last_set[0]));
+ else
+ p_rkpm_clkgt_last_set=&clk_ungt_msk_1[0];
if(clk_suspend_clkgt_info_get(clk_ungt_msk,p_rkpm_clkgt_last_set, RK3288_CRU_CLKGATES_CON_CNT)
- ==RK3188_CRU_CLKGATES_CON(0))
+ ==RK3288_CRU_CLKGATES_CON(0))
{
rkpm_set_ops_gtclks(gtclks_suspend,gtclks_resume);
- rkpm_set_sram_ops_gtclks(fn_to_pie(rockchip_pie_chunk, &FUNC(gtclks_sram_suspend)),
- fn_to_pie(rockchip_pie_chunk, &FUNC(gtclks_sram_resume)));
+ if(rockchip_pie_chunk)
+ rkpm_set_sram_ops_gtclks(fn_to_pie(rockchip_pie_chunk, &FUNC(gtclks_sram_suspend)),
+ fn_to_pie(rockchip_pie_chunk, &FUNC(gtclks_sram_resume)));
PM_LOG("%s:clkgt info ok\n",__FUNCTION__);
}
- rkpm_set_sram_ops_sysclk(fn_to_pie(rockchip_pie_chunk, &FUNC(sysclk_suspend))
+ if(rockchip_pie_chunk)
+ rkpm_set_sram_ops_sysclk(fn_to_pie(rockchip_pie_chunk, &FUNC(sysclk_suspend))
,fn_to_pie(rockchip_pie_chunk, &FUNC(sysclk_resume)));
}
// rkpm_ddr_printhex(temp);
#endif
// dump GPIO INTEN for debug
- //rk30_pm_dump_inten();
+ rk30_pm_dump_inten();
}
static void rkpm_finish(void)
{
- //rk30_pm_dump_irq();
+ rk30_pm_dump_irq();
}
return ;
}
PM_LOG("%s: pm_ctrbits =%x\n",__FUNCTION__,pm_ctrbits);
-#if 0
- if(of_property_read_u32_array(parent,"rockchip,pmic-gpios",gpios_data,ARRAY_SIZE(gpios_data)))
- {
- PM_ERR("%s:get pm ctr error\n",__FUNCTION__);
- return ;
- }
-#endif
+
rkpm_set_ctrbits(pm_ctrbits);
clks_gating_suspend_init();
-
- rkpm_set_ops_plls(pm_plls_suspend,pm_plls_resume);
- //rkpm_set_ops_prepare_finish(rkpm_prepare,rkpm_finish);
- // rkpm_set_ops_regs_pread(interface_ctr_reg_pread);
- rkpm_set_sram_ops_printch(fn_to_pie(rockchip_pie_chunk, &FUNC(sram_printch)));
+ rkpm_set_ops_plls(pm_plls_suspend,pm_plls_resume);
+
+ rkpm_set_ops_prepare_finish(rkpm_prepare,rkpm_finish);
+ //rkpm_set_ops_regs_pread(interface_ctr_reg_pread);
+
+ if(rockchip_pie_chunk)
+ rkpm_set_sram_ops_printch(fn_to_pie(rockchip_pie_chunk, &FUNC(sram_printch)));
+
rkpm_set_ops_printch(ddr_printch);
}
void rkpm_ddr_regs_dump(void __iomem * base_addr,u32 start_offset,u32 end_offset)
{
u32 i;
-
+ u32 line=0;
+
+ rkpm_ddr_printascii("start from:");
+ rkpm_ddr_printhex((u32)(base_addr +start_offset));
+ rkpm_ddr_printch('\n');
+
for(i=start_offset;i<=end_offset;)
{
- rkpm_ddr_printhex(readl_relaxed((void *)(base_addr + i)));
- if((i!=0&!(i%6))||i==end_offset)
- rkpm_ddr_printch('\n');
+ rkpm_ddr_printhex(readl_relaxed((base_addr + i)));
+ line++;
+ if((line%4==0)||i==end_offset)
+ rkpm_ddr_printch('\n');
+ else
+ rkpm_ddr_printch('-');
i+=4;
}
{
if(pm_ops.printch)
pm_ops.printch(byte);
-
- if (byte == '\n')
- rkpm_ddr_printch('\r');
+ //if (byte == '\n')
+ //rkpm_ddr_printch('\r');
}
void rkpm_ddr_printascii(const char *s)
{
pm_log = false;
- if(rkpm_chk_jdg_ctrbit(RKPM_CTR_NORIDLE_MD))
+ if(rkpm_chk_jdg_ctrbit(RKPM_CTR_NORIDLE_MD)&&p_suspend_pie_cb)
call_with_stack(p_suspend_pie_cb,&rkpm_jdg_sram_ctrbits, rockchip_sram_stack);
+ else
+ {
+ dsb();
+ wfi();
+ }
pm_log = true;
-#ifndef __MACH_ROCKCHIP_PM1_H
-#define __MACH_ROCKCHIP_PM1_H
+#ifndef __MACH_ROCKCHIP_PM_H
+#define __MACH_ROCKCHIP_PM_H
#include <dt-bindings/suspend/rockchip-pm.h>
#define reg_readl(base) readl_relaxed(base)
#define reg_writel(v, base) do { writel_relaxed(v, base); dsb(); } while (0)
-
+#if 0
#define PM_ERR(fmt, args...) printk(KERN_ERR fmt, ##args)
#define PM_LOG(fmt, args...) printk(KERN_ERR fmt, ##args)
#define PM_WARNING(fmt, args...) printk(KERN_WARNING fmt, ##args)
+#else
+
+#define PM_ERR(fmt, args...) printk(fmt, ##args)
+#define PM_LOG(fmt, args...) printk(fmt, ##args)
+#define PM_WARNING(fmt, args...) printk(fmt, ##args)
+#endif
/*********************************pm control******************************************/
extern void rkpm_ddr_reg_offset_dump(void __iomem * base_addr,u32 _offset);
rockchip_sram_virt = kern_to_pie(rockchip_pie_chunk, &__pie_common_start[0]);
rockchip_sram_stack = kern_to_pie(rockchip_pie_chunk, (char *) DATA(sram_stack) + sizeof(DATA(sram_stack)));
-
return 0;
}
arch_initcall(rk3288_pie_init);
#ifdef CONFIG_PM
#include "pm-rk3288.c"
+int rk3288_sys_set_power_domain(enum pmu_power_domain pd, bool on)
+{
+ u32 clks_ungating[RK3288_CRU_CLKGATES_CON_CNT];
+ u32 clks_save[RK3288_CRU_CLKGATES_CON_CNT];
+ u32 i,ret;
+ for(i=0;i<RK3288_CRU_CLKGATES_CON_CNT;i++)
+ {
+ clks_save[i]=cru_readl(RK3288_CRU_CLKGATES_CON(i));
+ clks_ungating[i]=0;
+ }
+ switch(pd)
+ {
+ case PD_GPU:
+ clks_ungating[5]=0x1<<7;
+ break;
+ case PD_VIDEO:
+ clks_ungating[3]=0x1<<11|0x1<<10|0x1<<9;
+ break;
+ case PD_VIO:
+ clks_ungating[3]=0x1<<0|0x1<<2|0x1<<5|0x1<<4|0x1<<1|0x1<<3|0x1<<12|0x1<<13
+ |0x1<<14|0x1<<15|0x1<<12|0x1<<11;
+ break;
+ case PD_HEVC:
+ clks_ungating[13]=0x1<<15|0x1<<14|0x1<<13;
+ break;
+ #if 0
+ case PD_CS:
+ clks_ungating[12]=0x1<<11|0x1<10|0x1<<9|0x1<<8;
+ break;
+ #endif
+ default:
+ break;
+ }
+
+ for(i=0;i<RK3288_CRU_CLKGATES_CON_CNT;i++)
+ {
+ if(clks_ungating[i])
+ cru_writel(clks_ungating[i]<<16,RK3288_CRU_CLKGATES_CON(i));
+ }
+ ret=rk3288_pmu_set_power_domain(pd,on);
+
+ for(i=0;i<RK3288_CRU_CLKGATES_CON_CNT;i++)
+ {
+ if(clks_ungating[i])
+ cru_writel(clks_save[i]|0xffff0000,RK3288_CRU_CLKGATES_CON(i));
+ }
+
+ return ret;
+
+}
+
+static u32 rk_pmu_pwrdn_st;
+static inline void rk_pm_soc_pd_suspend(void)
+{
+ rk_pmu_pwrdn_st = pmu_readl(RK3288_PMU_PWR_STATE);
+
+ if(!(rk_pmu_pwrdn_st&BIT(pmu_pd_map[IDLE_REQ_GPU])))
+ rk3288_sys_set_power_domain(IDLE_REQ_GPU, false);
+
+ if(!(rk_pmu_pwrdn_st&BIT(pmu_pd_map[IDLE_REQ_HEVC])))
+ rk3288_sys_set_power_domain(IDLE_REQ_HEVC, false);
+
+ if(!(rk_pmu_pwrdn_st&BIT(pmu_pd_map[IDLE_REQ_VIO])))
+ rk3288_sys_set_power_domain(IDLE_REQ_VIO, false);
+
+ if(!(rk_pmu_pwrdn_st&BIT(pmu_pd_map[IDLE_REQ_VIDEO])))
+ rk3288_sys_set_power_domain(IDLE_REQ_VIDEO, false);
+
+ rkpm_ddr_printascii("pd state:");
+ rkpm_ddr_printhex(pmu_readl(RK3288_PMU_PWR_STATE));
+ rkpm_ddr_printascii("\n");
+
+}
+static inline void rk_pm_soc_pd_resume(void)
+{
+ if(!(rk_pmu_pwrdn_st&BIT(pmu_pd_map[IDLE_REQ_GPU])))
+ rk3288_sys_set_power_domain(IDLE_REQ_GPU, false);
+
+ if(!(rk_pmu_pwrdn_st&BIT(pmu_pd_map[IDLE_REQ_HEVC])))
+ rk3288_sys_set_power_domain(IDLE_REQ_HEVC, false);
+
+ if(!(rk_pmu_pwrdn_st&BIT(pmu_pd_map[IDLE_REQ_VIO])))
+ rk3288_sys_set_power_domain(IDLE_REQ_VIO, false);
+
+ if(!(rk_pmu_pwrdn_st&BIT(pmu_pd_map[IDLE_REQ_VIDEO])))
+ rk3288_sys_set_power_domain(IDLE_REQ_VIDEO, false);
+
+ rkpm_ddr_printascii("pd state:");
+ rkpm_ddr_printhex(pmu_readl(RK3288_PMU_PWR_STATE));
+ rkpm_ddr_printascii("\n");
+}
+//extern bool console_suspend_enabled;
static void __init rk3288_init_suspend(void)
{
- return;
- rockchip_suspend_init();
- rkpm_pie_init();
- rk3288_suspend_init();
+ return;
+ printk("%s\n",__FUNCTION__);
+ rockchip_suspend_init();
+ //rkpm_pie_init();
+ rk3288_suspend_init();
+ // rkpm_set_ops_pwr_dmns(rk_pm_soc_pd_suspend,rk_pm_soc_pd_resume);
+ //console_suspend_enabled=0;
+ //pm_suspend(PM_SUSPEND_MEM);
}
#endif