dsp: 移植.25,打开dsp时关闭arm电源域
author黄涛 <huangtao@rock-chips.com>
Tue, 21 Sep 2010 09:19:23 +0000 (17:19 +0800)
committer黄涛 <huangtao@rock-chips.com>
Tue, 21 Sep 2010 09:19:37 +0000 (17:19 +0800)
arch/arm/mach-rk2818/ddr.c
drivers/staging/rk2818/rk2818_dsp/rk2818_dsp.c

index 711236edde2b8dbdb03e4e3e3e2d67efc640d8d5..f18fd5512619eff764613ba98ac259ceda7fe46c 100644 (file)
@@ -1320,14 +1320,37 @@ static void __tcmfunc DDRUpdateTiming(void)
     pDDR_Reg->CTRL_REG_68 = ddrCTRL_REG_68;
 }
 
+/* we avoid to use stack and global var. six instr in one cycle.*/
+#if 0
+volatile uint32 __tcmdata for_ddr_delay;
 void __tcmfunc ddr_pll_delay( int loops ) 
 {
-        volatile int i;
-        for( i = loops ; i > 0 ; i-- ){
+        for_ddr_delay = loops;
+        for( ; for_ddr_delay > 0 ; for_ddr_delay-- ){
                 ;
         }
 }
-
+#else
+asm(   
+"      .section \".tcm.text\",\"ax\"\n"        
+"      .align\n"
+"      .type   ddr_pll_delay, #function\n"
+"               .global ddr_pll_delay\n"
+"ddr_pll_delay:\n"
+"               cmp r0,#0\n"
+"               movle  pc , lr\n"
+"1:    sub  r0,r0,#1\n"        
+"      mov r1,r1\n"    
+"      mov r1,r1\n"
+"      mov r1,r1\n"
+"      mov r2,r2\n"    
+"      mov r2,r2\n"
+"               cmp r0,#0\n"
+"               bgt     1b\n"
+"      mov pc,lr\n"
+"      .previous"
+);
+#endif
 /****************************************************************/
 //º¯ÊýÃû:SDRAM_BeforeUpdateFreq
 //ÃèÊö:µ÷ÕûSDRAM/DDRƵÂÊÇ°µ÷Óõĺ¯Êý£¬ÓÃÓÚµ÷ÕûSDRAM/DDRʱÐò²ÎÊý
index 0561611ad697c5e0a2abed9f1eb20039a12fe511..ead1f313858c7175aa7015ab50cb5515351ead2b 100755 (executable)
@@ -40,6 +40,7 @@
 #include <linux/wait.h>
 #include <linux/syscalls.h>
 #include <linux/timer.h>
+#include <asm/tcm.h>
 #include "rk2818_dsp.h"
 #include "queue.h"
 
@@ -339,17 +340,18 @@ void dsp_set_clk(int clkrate)
 }
 
 #ifdef CONFIG_CHIP_RK2818
-#include <asm/tcm.h>
-static void __tcmfunc dsp_subsys_power_on(void)
+static void __tcmfunc dsp_open_power( void )
 {
-       unsigned long flags;
-
-       local_irq_save(flags);
-       /* dsp subsys power on 0x21*/
-       tcm_udelay(1, 600);     //¿ªÖ®Ç°Ò²µÃ¼Ó,±ÜÃâ×ÜÏß»¹ÔÚ·ÃÎÊ
-       __raw_writel((__raw_readl(SCU_BASE_ADDR_VA+0x10) & (~0x21)) , SCU_BASE_ADDR_VA+0x10);
-       tcm_udelay(1, 600);     //¹ØÖжÏʱ¼ä²»ÄÜÌ«³¤ (´ó¸ÅΪ1us)
-       local_irq_restore(flags);
+        unsigned long flags;
+        dspprintk("enter %s!!\n",__func__);
+        local_irq_save(flags);
+        __raw_writel((__raw_readl(SCU_BASE_ADDR_VA+0xc) &(~0xc)) , SCU_BASE_ADDR_VA+0xc);
+        ddr_pll_delay(1);      //¿ªÖ®Ç°Ò²µÃ¼Ó,±ÜÃâ×ÜÏß»¹ÔÚ·ÃÎÊ
+        __raw_writel((__raw_readl(SCU_BASE_ADDR_VA+0x10) & (~0x21)) , SCU_BASE_ADDR_VA+0x10);
+        ddr_pll_delay(24);     //¹ØÖжÏʱ¼ä²»ÄÜÌ«³¤ (6000´ó¸ÅΪ1us)
+        __raw_writel((__raw_readl(SCU_BASE_ADDR_VA+0xc) |(1<<2)) , SCU_BASE_ADDR_VA+0xc);
+        local_irq_restore(flags);
+        dspprintk("exit %s!!\n",__func__);
 }
 #endif
 
@@ -363,7 +365,8 @@ void dsp_powerctl(int ctl, int arg)
     case DPC_NORMAL:
         {
 #ifdef CONFIG_CHIP_RK2818      //coreµçѹ²»ÎÈʱ,dspÉϵç»áµ¼ÖÂAHBÈ¡Ö¸´íÎó,ËùÒÔdspÉϵçºóµ½Îȶ¨Æڼ䲻²Ù×÷AHB
-            dsp_subsys_power_on();
+            /* dsp subsys power on 0x21*/
+            dsp_open_power();
             mdelay(10);
 #else
             /* dsp subsys power on 0x21*/