From: xxx <xxx@rock-chips.com>
Date: Sat, 27 Jul 2013 07:26:42 +0000 (+0800)
Subject: rk3026 pm.c: fix ctr bits parameter to support help inf,add arm\logic suspend volt... 
X-Git-Tag: firefly_0821_release~6833
X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=f67fa5646730b4d79fb0a8123d6785c296f157b3;p=firefly-linux-kernel-4.4.55.git

rk3026 pm.c: fix ctr bits parameter to support help inf,add arm\logic suspend volt parameter
---

diff --git a/arch/arm/mach-rk2928/pm.c b/arch/arm/mach-rk2928/pm.c
old mode 100644
new mode 100755
index 2fe23220cc5e..4cf0a5adb7f3
--- a/arch/arm/mach-rk2928/pm.c
+++ b/arch/arm/mach-rk2928/pm.c
@@ -22,6 +22,8 @@
 #include <mach/iomux.h>
 #include <mach/cru.h>
 #include <mach/debug_uart.h>
+#include <linux/regulator/machine.h>
+
 
 #define cru_readl(offset)	readl_relaxed(RK2928_CRU_BASE + offset)
 #define cru_writel(v, offset)	do { writel_relaxed(v, RK2928_CRU_BASE + offset); dsb(); } while (0)
@@ -120,17 +122,29 @@ struct rk_soc_pm_info_st rk_soc_pm_helps[] = {
 	RK_SOC_PM_HELP_(WAKE_UP_KEY, "send a power key to wake up lcd"),
 };
 
-ssize_t rk_soc_pm_helps_print(char *buf)
+ssize_t rk_soc_pm_helps_sprintf(char *buf)
 {
 	char *s = buf;
 	int i;
 
-	for (i = 0; i < ARRAY_SIZE(rk_soc_pm_helps); i++) {
-		s += sprintf(s, "bit(%d): %s\n", rk_soc_pm_helps[i].offset, rk_soc_pm_helps[i].name);
+	for(i=0;i<ARRAY_SIZE(rk_soc_pm_helps);i++)
+	{
+		s += sprintf(s, "bit(%d): %s\n", rk_soc_pm_helps[i].offset,rk_soc_pm_helps[i].name);
 	}
 
-	return (s - buf);
-}
+	return (s-buf);
+}	
+
+void rk_soc_pm_helps_printk(void)
+{
+	int i;
+	printk("**************rk_suspend_ctr_bits bits help***********:\n");
+	for(i=0;i<ARRAY_SIZE(rk_soc_pm_helps);i++)
+	{
+		printk("bit(%d): %s\n", rk_soc_pm_helps[i].offset,rk_soc_pm_helps[i].name);
+	}
+}	
+
 
 // pm enter return directly
 #define RK_SUSPEND_RET_DIRT_BITS ((1<<RK_PM_CTR_RET_DIRT))
@@ -143,14 +157,27 @@ ssize_t rk_soc_pm_helps_print(char *buf)
 static u32  __sramdata rk_soc_pm_ctr_flags_sram = 0;
 static u32  rk_soc_pm_ctr_flags = 0;
 
+static int arm_suspend_volt = 0;
+static int logic_suspend_volt = 0;
+
+
 static int __init early_param_rk_soc_pm_ctr(char *str)
 {
 	get_option(&str, &rk_soc_pm_ctr_flags);
-	printk("early_param_rk_soc_pm_ctr=%x\n", rk_soc_pm_ctr_flags);
+	
+	printk("********rk_suspend_ctr_bits information is following:*********\n");
+	printk("rk_suspend_ctr_bits=%x\n",rk_soc_pm_ctr_flags);
+	if(rk_soc_pm_ctr_flags)
+	{
+		rk_soc_pm_helps_printk();
+	}
+	printk("********rk_suspend_ctr_bits information end*********\n");
 	return 0;
 }
 
-early_param("rk_soc_pm_ctr", early_param_rk_soc_pm_ctr);
+early_param("rk_suspend_ctr_bits", early_param_rk_soc_pm_ctr);
+
+
 
 void  rk_soc_pm_ctr_bits_set(u32 flags)
 {
@@ -189,6 +216,58 @@ void rk_soc_pm_ctr_bits_prepare(void)
 	}
 }
 
+
+
+	
+static int __init set_arm_suspend_volt(char *str)
+{
+	get_option(&str, &arm_suspend_volt);
+	printk("rk_suspend_arm_volt=%dmV\n", arm_suspend_volt);
+	return 0;
+}
+early_param("rk_suspend_arm_volt", set_arm_suspend_volt);
+
+static int __init set_logic_suspend_volt(char *str)
+{
+	get_option(&str, &logic_suspend_volt);
+	printk("rk_suspend_logic_volt=%dmV\n", logic_suspend_volt);
+	return 0;
+}
+early_param("rk_suspend_logic_volt", set_logic_suspend_volt);
+
+
+
+static int __init pm_suspend_volt_seting(void)
+{
+	struct regulator *regulator;	
+
+	printk("pmic set pm_suspend_volt:\n");
+	if (arm_suspend_volt){
+		regulator = regulator_get(NULL, "vdd_cpu");
+		if (IS_ERR(regulator)){
+			printk("%s:get vdd_cpu regulator err\n", __func__);
+			return 0;
+		}
+		regulator_set_suspend_voltage(regulator, arm_suspend_volt);
+		regulator_put(regulator);
+	}
+
+	if (logic_suspend_volt){
+		regulator = regulator_get(NULL, "vdd_core");
+		if (IS_ERR(regulator)){
+			printk("%s:get vdd_core regulator err\n", __func__);
+			return 0;
+		}
+		regulator_set_suspend_voltage(regulator, logic_suspend_volt);	
+		regulator_put(regulator);
+	}
+	return 0;
+}
+
+device_initcall_sync(pm_suspend_volt_seting);
+
+
+/*********************************pm main function******************************************/
 __weak void __sramfunc ddr_suspend(void) {}
 __weak void __sramfunc ddr_resume(void) {}
 __weak uint32_t __sramfunc ddr_change_freq(uint32_t nMHz)