rk2928 ddr:add auto-self-refresh when early suspend
authorcym <cym@rock-chips.com>
Wed, 12 Sep 2012 10:04:53 +0000 (18:04 +0800)
committercym <cym@rock-chips.com>
Wed, 12 Sep 2012 10:06:20 +0000 (18:06 +0800)
arch/arm/mach-rk2928/Makefile
arch/arm/mach-rk2928/ddr.c
arch/arm/mach-rk2928/ddr_freq.c [new file with mode: 0644]

index cbcfe87cf074e28e3117fcf00360df6bd0b8c216..9c99e31323edcf9cbd49e789952ca29d6bcf82fb 100755 (executable)
@@ -7,6 +7,7 @@ obj-y += iomux.o
 obj-y += ../plat-rk/clock.o
 obj-y += clock_data.o
 obj-y += ddr.o
+obj-$(CONFIG_DDR_FREQ) += ddr_freq.o
 obj-$(CONFIG_CPU_FREQ) += cpufreq.o
 obj-$(CONFIG_DVFS) += dvfs.o
 obj-$(CONFIG_PM) += pm.o
index 61fcfa754ab3aa064112f2b8143b553eb5359958..bfa7b27a1672c106204fd0f541a1190dc87235b3 100755 (executable)
@@ -1978,6 +1978,8 @@ void ddr_set_auto_self_refresh(bool en)
 {
     //set auto self-refresh idle
     ddr_sr_idle = en ? SR_IDLE : 0;
+    ddr_move_to_Config_state();
+    ddr_move_to_Access_state();
 }
 EXPORT_SYMBOL(ddr_set_auto_self_refresh);
 
diff --git a/arch/arm/mach-rk2928/ddr_freq.c b/arch/arm/mach-rk2928/ddr_freq.c
new file mode 100644 (file)
index 0000000..5a42d4a
--- /dev/null
@@ -0,0 +1,50 @@
+#include <mach/ddr.h>
+
+#include <linux/earlysuspend.h>
+#include <linux/delay.h>
+
+#define ddr_print(x...) printk( "DDR DEBUG: " x )
+
+struct ddr {
+       int suspend;
+       struct early_suspend early_suspend;
+       struct clk *ddr_pll;
+};
+
+static void ddr_early_suspend(struct early_suspend *h);
+static void ddr_late_resume(struct early_suspend *h);
+
+static struct ddr ddr = {
+       .early_suspend = {
+               .suspend = ddr_early_suspend,
+               .resume = ddr_late_resume,
+               .level = EARLY_SUSPEND_LEVEL_DISABLE_FB + 50,
+       },
+};
+
+#ifdef CONFIG_HAS_EARLYSUSPEND
+static void ddr_early_suspend(struct early_suspend *h)
+{
+    //Enable auto self refresh  0x01*32 DDR clk cycle
+    ddr_print("run in %s\n",__func__);
+    ddr_set_auto_self_refresh(true);
+    
+    return;
+}
+
+static void ddr_late_resume(struct early_suspend *h)
+{
+    //Disable auto self refresh
+    ddr_print("run in %s\n",__func__);
+    ddr_set_auto_self_refresh(false);
+
+    return;
+}
+
+static int rk30_ddr_late_init (void)
+{
+    register_early_suspend(&ddr.early_suspend);
+    return 0;
+}
+late_initcall(rk30_ddr_late_init);
+#endif