RK3188:ddr_freq_mode add DDR_FREQ_DUALVIEW for HDMI
authorcym <cym@rock-chips.com>
Sun, 28 Apr 2013 08:39:26 +0000 (16:39 +0800)
committercym <cym@rock-chips.com>
Sun, 28 Apr 2013 08:42:01 +0000 (16:42 +0800)
arch/arm/mach-rk30/board-rk3168-tb.c
arch/arm/plat-rk/ddr_freq.c
arch/arm/plat-rk/include/plat/board.h

index dac7fbd3ca9b6483c63628c3d3bab70f861118ba..6608973c67d55316cebede5c1bc0c487687eb8ca 100644 (file)
@@ -2532,6 +2532,7 @@ static struct cpufreq_frequency_table dvfs_ddr_table_volt_level0[] = {
        {.frequency = 200 * 1000 + DDR_FREQ_SUSPEND,    .index = 950 * 1000},
        {.frequency = 300 * 1000 + DDR_FREQ_VIDEO,      .index = 1000 * 1000},
        {.frequency = 396 * 1000 + DDR_FREQ_NORMAL,     .index = 1100 * 1000},
+        {.frequency = 460 * 1000 + DDR_FREQ_DUALVIEW,     .index = 1150 * 1000},
        //{.frequency = 528 * 1000 + DDR_FREQ_NORMAL,     .index = 1200 * 1000},
        {.frequency = CPUFREQ_TABLE_END},
 };
index 8e2af89442f84cbe24f854945ec7aea27c3b3931..f971a99183eb3ec1cfc170a0388c5615ebdeb2c0 100755 (executable)
@@ -39,6 +39,8 @@ enum SYS_STATUS {
        SYS_STATUS_CIF0,        // 0x10
        SYS_STATUS_CIF1,        // 0x20
        SYS_STATUS_REBOOT,      // 0x40
+       SYS_STATUS_LCDC0,       // 0x80
+       SYS_STATUS_LCDC1,       // 0x100
 };
 
 struct ddr {
@@ -49,6 +51,7 @@ struct ddr {
        struct clk *clk;
        unsigned long normal_rate;
        unsigned long video_rate;
+       unsigned long dualview_rate;
        unsigned long idle_rate;
        unsigned long suspend_rate;
        unsigned long reboot_rate;
@@ -109,6 +112,11 @@ static noinline void ddrfreq_work(unsigned long sys_status)
                ddrfreq_mode(false, &ddr.reboot_rate, "shutdown/reboot");
        } else if (ddr.suspend_rate && (s & (1 << SYS_STATUS_SUSPEND))) {
                ddrfreq_mode(true, &ddr.suspend_rate, "suspend");
+       } else if (ddr.dualview_rate
+             && (s & (1 << SYS_STATUS_LCDC0))
+             && (s & (1 << SYS_STATUS_LCDC1))
+             ) {
+               ddrfreq_mode(false, &ddr.dualview_rate, "dual-view");
        } else if (ddr.video_rate && (s & (1 << SYS_STATUS_VIDEO))) {
                ddrfreq_mode(false, &ddr.video_rate, "video");
        } else if (ddr.idle_rate
@@ -307,6 +315,8 @@ CLK_NOTIFIER(pd_gpu, GPU);
 CLK_NOTIFIER(pd_rga, RGA);
 CLK_NOTIFIER(pd_cif0, CIF0);
 CLK_NOTIFIER(pd_cif1, CIF1);
+CLK_NOTIFIER(pd_lcdc0, LCDC0);
+CLK_NOTIFIER(pd_lcdc1, LCDC1);
 
 static int ddrfreq_reboot_notifier_event(struct notifier_block *this, unsigned long event, void *ptr)
 {
@@ -405,6 +415,7 @@ static int ddrfreq_init(void)
        }
        if (!new_version) {
                ddr.video_rate = 300 * MHZ;
+               ddr.dualview_rate = ddr.normal_rate;
                ddr.suspend_rate = 200 * MHZ;
        }
        for (i = 0; new_version && table && table[i].frequency != CPUFREQ_TABLE_END; i++) {
@@ -421,6 +432,9 @@ static int ddrfreq_init(void)
                case DDR_FREQ_VIDEO:
                        ddr.video_rate = rate;
                        break;
+               case DDR_FREQ_DUALVIEW:
+                       ddr.dualview_rate= rate;
+                       break;
                case DDR_FREQ_IDLE:
                        ddr.idle_rate = rate;
                        break;
@@ -437,6 +451,11 @@ static int ddrfreq_init(void)
                REGISTER_CLK_NOTIFIER(pd_cif1);
        }
 
+       if (ddr.dualview_rate) {
+             REGISTER_CLK_NOTIFIER(pd_lcdc0);
+             REGISTER_CLK_NOTIFIER(pd_lcdc1);
+       }
+
        return 0;
 
 }
@@ -482,9 +501,9 @@ static int ddrfreq_late_init(void)
 
        register_reboot_notifier(&ddrfreq_reboot_notifier);
 
-       pr_info("verion 2.2\n");
-       dprintk(DEBUG_DDR, "normal %luMHz video %luMHz idle %luMHz suspend %luMHz reboot %luMHz\n",
-               ddr.normal_rate / MHZ, ddr.video_rate / MHZ, ddr.idle_rate / MHZ, ddr.suspend_rate / MHZ, ddr.reboot_rate / MHZ);
+       pr_info("verion 2.4 20130427\n");
+       dprintk(DEBUG_DDR, "normal %luMHz video %luMHz dualview %luMHz idle %luMHz suspend %luMHz reboot %luMHz\n",
+               ddr.normal_rate / MHZ, ddr.video_rate / MHZ, ddr.dualview_rate / MHZ,ddr.idle_rate / MHZ, ddr.suspend_rate / MHZ, ddr.reboot_rate / MHZ);
 
        return 0;
 
@@ -500,6 +519,10 @@ err:
                UNREGISTER_CLK_NOTIFIER(pd_cif0);
                UNREGISTER_CLK_NOTIFIER(pd_cif1);
        }
+       if (ddr.dualview_rate) {
+        UNREGISTER_CLK_NOTIFIER(pd_lcdc0);
+        UNREGISTER_CLK_NOTIFIER(pd_lcdc1);
+       }
 
        return ret;
 }
index 6bd1ec3f5d5778ebb69d5152e743fcb35f93ccaa..4529b1ea789a5432555e37f7642e56223bf36f73 100755 (executable)
@@ -531,6 +531,7 @@ void __sramfunc board_pmu_resume(void);
 enum ddr_freq_mode {
        DDR_FREQ_NORMAL = 1,    // default
        DDR_FREQ_VIDEO,         // when video is playing
+       DDR_FREQ_DUALVIEW,     // when dual view,lcdc0 and lcdc1 open at the same time
        DDR_FREQ_IDLE,          // when screen is idle
        DDR_FREQ_SUSPEND,       // when early suspend
 };