edit system suspend vol control code
authorroot <root@xxx-desktop.(none)>
Fri, 10 Jun 2011 09:38:57 +0000 (17:38 +0800)
committerroot <root@xxx-desktop.(none)>
Fri, 10 Jun 2011 09:38:57 +0000 (17:38 +0800)
arch/arm/mach-rk29/Kconfig
arch/arm/mach-rk29/Makefile
arch/arm/mach-rk29/include/mach/pm-vol.h [new file with mode: 0644]
arch/arm/mach-rk29/pm.c
arch/arm/mach-rk29/pwm_sram.c [new file with mode: 0644]
arch/arm/mach-rk29/spi_sram.c

index 91433adc823affe7aa2f62b6cc5f48a1c240e0f9..248bdb3e0a0c75579ad018beb2020ab3c1cd055b 100644 (file)
@@ -179,8 +179,15 @@ config RK29_LAST_LOG
        default y
        help
          It is only intended for debugging.
-config RK29_SRAM_SPI
-       tristate "Support spi driver codec run in sram"
+menu "The control interface support for RK29 suspend "
+config RK29_SPI_INSRAM
+       tristate "Support spi control interface"
+       depends on REGULATOR_WM831X
        default n
+config RK29_PWM_INSRAM
+       tristate "Support pwm control interface"
+       depends on RK29_PWM_REGULATOR
+       default y
+endmenu
 
 endif
index fc77b8e9baf5da6ea74118dd8e23d8a9bf474c00..39a6a7e66e20c970e4167fcfcca2b8aaa9c2c0e0 100644 (file)
@@ -9,7 +9,8 @@ obj-$(CONFIG_USB_GADGET) += usb_detect.o
 obj-$(CONFIG_PM) += pm.o
 obj-$(CONFIG_CPU_FREQ) += cpufreq.o
 obj-$(CONFIG_RK29_VPU) += vpu.o vpu_mem.o
-obj-$(CONFIG_RK29_SRAM_SPI) += spi_sram.o
+obj-$(CONFIG_RK29_SPI_INSRAM) += spi_sram.o
+obj-$(CONFIG_RK29_PWM_INSRAM) += pwm_sram.o
 obj-$(CONFIG_MACH_RK29SDK) += board-rk29sdk.o board-rk29sdk-key.o board-rk29sdk-rfkill.o board-rk29sdk-power.o
 obj-$(CONFIG_MACH_RK29SDK_DDR3) += board-rk29-ddr3sdk.o board-rk29sdk-key.o board-rk29sdk-rfkill.o board-rk29sdk-power.o
 obj-$(CONFIG_MACH_RK29WINACCORD) += board-rk29-winaccord.o board-rk29sdk-key.o
diff --git a/arch/arm/mach-rk29/include/mach/pm-vol.h b/arch/arm/mach-rk29/include/mach/pm-vol.h
new file mode 100644 (file)
index 0000000..b265f65
--- /dev/null
@@ -0,0 +1,21 @@
+#ifndef PM_VOL_H\r
+#define PM_VOL_H\r
+\r
+\r
+#if defined(CONFIG_RK29_SPI_INSRAM)||defined(CONFIG_RK29_PWM_INSRAM)\r
+\r
+void interface_ctr_reg_pread(void);\r
+unsigned int __sramfunc rk29_suspend_voltage_set(unsigned int vol);\r
+void __sramfunc rk29_suspend_voltage_resume(unsigned int vol);\r
+\r
+#else\r
+\r
+#define interface_ctr_reg_pread()\r
+static unsigned int __sramfunc rk29_suspend_voltage_set(unsigned int vol)\r
+{\r
+}\r
+#define rk29_suspend_voltage_resume(a)\r
+\r
+#endif\r
+\r
+#endif\r
index 9aab0ef6cd384e1705172a3648ebcbe8fbbc0d37..db55f2f27a9f32560d3791f4f88ee357f12e26ba 100644 (file)
@@ -9,9 +9,6 @@
 #include <linux/suspend.h>
 #include <linux/random.h> 
 #include <linux/crc32.h>
-#ifdef CONFIG_RK29_PWM_REGULATOR
-#include <linux/regulator/rk29-pwm-regulator.h>
-#endif
 #include <linux/io.h>
 #include <linux/wakelock.h>
 #include <asm/tlbflush.h>
 #include <mach/gpio.h>
 #include <mach/ddr.h>
 #include <mach/memtester.h>
-
 #include <mach/iomux.h>
-
-#if defined(CONFIG_RK29_SRAM_SPI)
-void sram_spi_pread(void);
-void __sramfunc rk29_spi_ctr_vol_sleep(void);
-void __sramfunc rk29_spi_ctr_vol_resume(void);
-#else
-#define sram_spi_pread()
-#define rk29_spi_ctr_vol_sleep()
-#define rk29_spi_ctr_vol_resume()
-#endif
+#include <mach/pm-vol.h>
 
 #define grf_readl(offset) readl(RK29_GRF_BASE + offset)
 #define grf_writel(v, offset) do { writel(v, RK29_GRF_BASE + offset); readl(RK29_GRF_BASE + offset); } while (0)
@@ -151,42 +138,6 @@ static void inline printascii(const char *s) {}
 static void inline printhex(unsigned int hex) {}
 #endif /* DEBUG */
 
-#ifdef CONFIG_RK29_PWM_REGULATOR
-#define pwm_write_reg(addr, val)       __raw_writel(val, addr + (RK29_PWM_BASE + 2*0x10))
-#define pwm_read_reg(addr)             __raw_readl(addr + (RK29_PWM_BASE + 2*0x10))
-
-static u32 __sramdata pwm_lrc, pwm_hrc;
-static void __sramfunc rk29_set_core_voltage(int uV)
-{
-       u32 gate1;
-
-       gate1 = cru_readl(CRU_CLKGATE1_CON);
-       cru_writel(gate1 & ~((1 << CLK_GATE_PCLK_PEIRPH % 32) | (1 << CLK_GATE_ACLK_PEIRPH % 32) | (1 << CLK_GATE_ACLK_CPU_PERI % 32)), CRU_CLKGATE1_CON);
-
-       /* iomux pwm2 */
-       writel((readl(RK29_GRF_BASE + 0x58) & ~(0x3<<6)) | (0x2<<6), RK29_GRF_BASE + 0x58);
-
-       if (uV) {
-               pwm_lrc = pwm_read_reg(PWM_REG_LRC);
-               pwm_hrc = pwm_read_reg(PWM_REG_HRC);
-       }
-
-       pwm_write_reg(PWM_REG_CTRL, PWM_DIV|PWM_RESET);
-       if (uV == 1000000) {
-               pwm_write_reg(PWM_REG_LRC, 12);
-               pwm_write_reg(PWM_REG_HRC, 10);
-       } else {
-               pwm_write_reg(PWM_REG_LRC, pwm_lrc);
-               pwm_write_reg(PWM_REG_HRC, pwm_hrc);
-       }
-       pwm_write_reg(PWM_REG_CNTR, 0);
-       pwm_write_reg(PWM_REG_CTRL, PWM_DIV|PWM_ENABLE|PWM_TimeEN);
-
-       LOOP(5 * 1000 * LOOPS_PER_USEC); /* delay 5ms */
-
-       cru_writel(gate1, CRU_CLKGATE1_CON);
-}
-#endif /* CONFIG_RK29_PWM_REGULATOR */
 /*volatile __sramdata */int ddr_debug;
 module_param(ddr_debug, int, 0644);
 #if 1
@@ -277,6 +228,7 @@ void __sramfunc ddr_testmode(void)
 static void __sramfunc rk29_sram_suspend(void)
 {
        u32 clksel0;
+       u32 vol;
 
        if ((ddr_debug == 1) || (ddr_debug == 2))
                ddr_testmode();
@@ -285,13 +237,7 @@ static void __sramfunc rk29_sram_suspend(void)
        ddr_suspend();
 
        printch('6');
-#ifdef CONFIG_RK29_PWM_REGULATOR
-       rk29_set_core_voltage(1000000);
-#endif
-#if defined(CONFIG_RK29_SRAM_SPI)
-       rk29_spi_ctr_vol_sleep();
-#endif
-
+       vol=rk29_suspend_voltage_set(1000000);
        printch('7');
        clksel0 = cru_readl(CRU_CLKSEL0_CON);
        /* set arm clk 24MHz/32 = 750KHz */
@@ -306,12 +252,8 @@ static void __sramfunc rk29_sram_suspend(void)
        cru_writel(clksel0, CRU_CLKSEL0_CON);
        printch('7');
 
-#ifdef CONFIG_RK29_PWM_REGULATOR
-       rk29_set_core_voltage(0);
-#endif
-#if defined(CONFIG_RK29_SRAM_SPI)
-       rk29_spi_ctr_vol_resume();
-#endif
+       rk29_suspend_voltage_resume(vol);
+
 
        printch('6');
 
@@ -409,13 +351,8 @@ static int rk29_pm_enter(suspend_state_t state)
 #endif
 
        printch('0');
+       interface_ctr_reg_pread();
 
-#ifdef CONFIG_RK29_PWM_REGULATOR
-       /* touch TLB */
-       flush_tlb_all();
-       readl(RK29_PWM_BASE);
-       readl(RK29_GRF_BASE);
-#endif
 
        /* disable clock */
        clkgate[0] = cru_readl(CRU_CLKGATE0_CON);
@@ -486,9 +423,7 @@ static int rk29_pm_enter(suspend_state_t state)
        delay_500ns();
        /* set aclk_periph = hclk_periph = pclk_periph = 24MHz */
        cru_writel(clksel0 & ~0x7FC000, CRU_CLKSEL0_CON);
-#if defined(CONFIG_RK29_SRAM_SPI)
-       sram_spi_pread();
-#endif
+
        printch('4');
        
        rk29_suspend();
diff --git a/arch/arm/mach-rk29/pwm_sram.c b/arch/arm/mach-rk29/pwm_sram.c
new file mode 100644 (file)
index 0000000..ce83773
--- /dev/null
@@ -0,0 +1,84 @@
+
+#include <mach/rk29_iomap.h>
+#include <mach/board.h>
+#include <mach/sram.h>
+#include <asm/io.h>
+#include <asm/tlbflush.h>
+#include <mach/cru.h>
+#include <linux/regulator/rk29-pwm-regulator.h>
+
+#define pwm_write_reg(addr, val)       __raw_writel(val, addr + (RK29_PWM_BASE + 2*0x10))
+#define pwm_read_reg(addr)             __raw_readl(addr + (RK29_PWM_BASE + 2*0x10))
+#define cru_readl(offset)      readl(RK29_CRU_BASE + offset)
+#define cru_writel(v, offset)  do { writel(v, RK29_CRU_BASE + offset); dsb(); } while (0)
+
+void interface_ctr_reg_pread(void)
+{
+       flush_tlb_all();
+       readl(RK29_PWM_BASE);
+       readl(RK29_GRF_BASE);
+}
+static unsigned int __sramdata pwm_lrc,pwm_hrc;
+
+static void __sramfunc rk29_pwm_set_core_voltage(unsigned int uV)
+{
+       u32 gate1;
+
+       gate1 = cru_readl(CRU_CLKGATE1_CON);
+       cru_writel(gate1 & ~((1 << CLK_GATE_PCLK_PEIRPH % 32) | (1 << CLK_GATE_ACLK_PEIRPH % 32) | (1 << CLK_GATE_ACLK_CPU_PERI % 32)), CRU_CLKGATE1_CON);
+
+       /* iomux pwm2 */
+       writel((readl(RK29_GRF_BASE + 0x58) & ~(0x3<<6)) | (0x2<<6), RK29_GRF_BASE + 0x58);
+
+       if (uV) {
+               pwm_lrc = pwm_read_reg(PWM_REG_LRC);
+               pwm_hrc = pwm_read_reg(PWM_REG_HRC);
+       }
+
+       pwm_write_reg(PWM_REG_CTRL, PWM_DIV|PWM_RESET);
+       if (uV == 1000000) {
+               pwm_write_reg(PWM_REG_LRC, 12);
+               pwm_write_reg(PWM_REG_HRC, 10);
+       } else {
+               pwm_write_reg(PWM_REG_LRC, pwm_lrc);
+               pwm_write_reg(PWM_REG_HRC, pwm_hrc);
+       }
+       pwm_write_reg(PWM_REG_CNTR, 0);
+       pwm_write_reg(PWM_REG_CTRL, PWM_DIV|PWM_ENABLE|PWM_TimeEN);
+
+       LOOP(5 * 1000 * LOOPS_PER_USEC); /* delay 5ms */
+
+       cru_writel(gate1, CRU_CLKGATE1_CON);
+}
+
+unsigned int __sramfunc rk29_suspend_voltage_set(unsigned int vol)
+{
+       
+       rk29_pwm_set_core_voltage(1000000);
+       return 0;
+
+}
+void __sramfunc rk29_suspend_voltage_resume(unsigned int vol)
+{
+       rk29_pwm_set_core_voltage(0);
+       return 0;
+}
+
+/*
+void interface_ctr_reg_pread(void)
+{
+}
+unsigned int __sramfunc rk29_suspend_voltage_set(unsigned int vol)
+{
+}
+void __sramfunc rk29_suspend_voltage_resume(unsigned int vol)
+{
+}
+*/
+
+
+
+
+
+
+
index 2c7eb33580156e27a9070bc2755381bd9f217b8d..7052d36755690e4f1514fc758724145bea8df799 100644 (file)
 
-#include <mach/spi_sram.h>
+#include <mach/rk29_iomap.h>
+#include <mach/board.h>
+#include <mach/sram.h>
+#include <asm/io.h>
 
-unsigned __sramdata  int spibase;
-u32 __sramdata spi_base[2]={RK29_SPI0_BASE,RK29_SPI1_BASE};
-u32 __sramdata spi_data[6]={};
 
-//chcs : &0xf0->ch(spi1spi0), &ox0f->cs(cs1cs0)
+#define SPI_KHZ (1000)
+#define SPI_MHZ (1000*1000) 
+#define GPLL_SPEED (24*SPI_MHZ)
+#define SPI_SR_SPEED (2*SPI_MHZ)
 
-void __sramfunc delay_test(int delay_time)
+#if defined(CONFIG_MACH_RK29_A22)||defined(CONFIG_MACH_RK29_PHONESDK)
+#define SRAM_SPI_CH 1
+#define SRAM_SPI_CS 1
+#define SRAM_SPI_DATA_BYTE 2
+#define SRAM_SPI_ADDRBASE RK29_SPI1_BASE//RK29_SPI0_BASE
+#define SPI_SPEED (500*SPI_KHZ)
+//#elif defined()
+#else
+#define SRAM_SPI_CH 1
+#define SRAM_SPI_CS 1
+#define SRAM_SPI_DATA_BYTE 2
+#define SRAM_SPI_ADDRBASE RK29_SPI1_BASE//RK29_SPI0_BASE
+#define SPI_SPEED (500*SPI_KHZ)
+#endif
+
+#define SRAM_SPI_SR_DIV (GPLL_SPEED/SPI_SR_SPEED-1)  //
+#define SRAM_SPI_DIV (SPI_SR_SPEED/SPI_SPEED)
+
+
+
+
+//#include <mach/spi_sram.h>
+
+#define SPIM_ENR       0x0008
+#define SPIM_SER       0x000C
+#define SPIM_CTRLR0    0x0000
+#define SPIM_BAUDR     0x0010
+#define SPIM_TXFTLR    0x0014
+#define SPIM_RXFLR     0x0020
+
+#define SPIM_SR                0x0024
+
+#define SPIM_IMR       0x002c
+#define SPIM_TXDR      0x400
+#define SPIM_RXDR      0x800
+/* Bit fields in rxflr, */
+#define RXFLR_MASK     (0x3f)
+/* Bit fields in SR, 7 bits */
+#define SR_MASK                                0x7f            /* cover 7 bits */
+#define SR_BUSY                                (1 << 0)
+#define SR_TF_FULL                 (1 << 1)
+#define SR_TF_EMPT                     (1 << 2)
+#define SR_RF_EMPT                 (1 << 3)
+#define SR_RF_FULL                     (1 << 4)
+
+
+#define CRU_CLKSEL6_CON        0x2C
+#define CRU_CLKGATE2_CON       0x64
+#define CRU_CLKGATE1_CON       0x60
+
+
+
+#define spi_readl(offset) readl(SRAM_SPI_ADDRBASE + offset)
+#define spi_writel(v, offset) writel(v, SRAM_SPI_ADDRBASE + offset)
+
+enum
+{
+GRF_IOM50=0,
+GRF_IOM5c,
+CLKGATE1,
+CLKGATE2,      
+CLKSEL6,
+SPI_CTRLR0,
+SPI_BAUDR,
+SPI_SER,
+DATE_END,
+};
+
+/*unsigned int __sramdata spibase;
+unsigned int __sramdata sram_spi_cs;
+u32 __sramdata spi_base[2]={RK29_SPI0_BASE,RK29_SPI1_BASE};*/
+u32 __sramdata spi_data[DATE_END]={};
+#define sram_spi_dis()  spi_writel(spi_readl(SPIM_ENR)&~(0x1<<0),SPIM_ENR)
+#define sram_spi_en()  spi_writel(spi_readl(SPIM_ENR)|(0x1<<0),SPIM_ENR)
+#define sram_spi_cs_dis()  spi_writel(spi_readl(SPIM_SER)&~0x3,SPIM_SER)
+#define sram_spi_cs_en()  spi_writel((spi_readl(SPIM_SER)&~0x3)|(0x1<<SRAM_SPI_CS),SPIM_SER);
+#define sram_spi_busy() (spi_readl(SPIM_SR)&SR_BUSY)
+
+#define wm831x_RD_MSK (0x1<<15)
+#define wm831x_RD_VOID (0x7FFF)
+#define spi_ctr0_mask 0x1fffc3
+
+
+
+#if 0
+void __sramfunc sram_printch(char byte);
+void __sramfunc sram_printHX(unsigned int hex);
+#else
+#define sram_printch(a)
+#define sram_printHX(a)
+#endif
+
+#define LOOPS_PER_USEC 13
+#define LOOP(loops) do { int i = loops; barrier(); while (i--) barrier(); } while (0)
+
+#define sram_udelay(usecs,a) LOOP((usecs)*LOOPS_PER_USEC)
+/*
+#define SRAM_ASM_LOOP_INSTRUCTION_NUM    8
+static void __sramfunc sram_udelay(unsigned long usecs, unsigned long arm_freq_mhz)
+{
+       unsigned int cycle;
+
+       cycle = usecs * arm_freq_mhz / SRAM_ASM_LOOP_INSTRUCTION_NUM;
+
+       while (cycle--) {
+               nop();
+               nop();
+               nop();
+               barrier();
+       }
+}*/
+       
+/*void __sramfunc delay_test(int delay_time)
 {
     int n = 100 * delay_time;
     while(n--)
     {
         __asm__ __volatile__("");
     }
+}*/
+       
+#define SPI_GATE1_MASK 0xCF
+
+void interface_ctr_reg_pread(void)
+{
+       unsigned int temp,temp2; 
+       
+       temp=readl(RK29_CRU_BASE + CRU_CLKGATE1_CON);
+    temp2=readl(RK29_CRU_BASE + CRU_CLKGATE2_CON);
+
+    writel(temp&~(SPI_GATE1_MASK),RK29_CRU_BASE + CRU_CLKGATE1_CON);
+    writel(temp2&~(1<<(15+SRAM_SPI_CH)),RK29_CRU_BASE + CRU_CLKGATE2_CON);
+
+    readl(SRAM_SPI_ADDRBASE);
+
+    writel(temp2,RK29_CRU_BASE + CRU_CLKGATE2_CON);
+    writel(temp,RK29_CRU_BASE + CRU_CLKGATE1_CON);
+
 }
 
-void  __sramfunc spi_reg_init(unsigned char size,unsigned char ch,unsigned char cs){
-       unsigned int ret=0;
+
+static void  __sramfunc sram_spi_deinit(void)
+{
+        sram_spi_dis();
+
+        spi_writel(spi_data[SPI_CTRLR0],SPIM_CTRLR0);   
+        spi_writel(spi_data[SPI_BAUDR],SPIM_BAUDR);      
+        spi_writel(spi_data[SPI_SER],SPIM_SER);        
+
+        
+        writel(spi_data[GRF_IOM5c],RK29_GRF_BASE + 0x5c);       
+        writel(spi_data[GRF_IOM50],RK29_GRF_BASE +0x50);
+
+        writel(spi_data[CLKSEL6], RK29_CRU_BASE + CRU_CLKSEL6_CON);
+        writel(spi_data[CLKGATE2],RK29_CRU_BASE + CRU_CLKGATE2_CON); 
+        writel(spi_data[CLKGATE1],RK29_CRU_BASE + CRU_CLKGATE1_CON);
+}
+
+static void __sramfunc sram_spi_init(void)
+{
        
-       spibase=spi_base[ch];
-       ret=readl(spibase + SPIM_ENR);
-        writel(ret&~(0x1<<0), spibase + SPIM_ENR);  //disable SPI reg
+       sram_printch('V');
+       /***************prihp clk*******************/
+       spi_data[CLKGATE1]=readl(RK29_CRU_BASE + CRU_CLKGATE1_CON);
+       writel(spi_data[CLKGATE1]&~(SPI_GATE1_MASK),RK29_CRU_BASE + CRU_CLKGATE1_CON);
 
-        ret = readl(spibase + SPIM_SER);
-       writel(ret&~(0xffffffff)|(0x1<<cs), spibase + SPIM_SER);    //cs0\1  
+       /***************spi sr clk speed*******************/
+       spi_data[CLKSEL6]=readl(RK29_CRU_BASE + CRU_CLKSEL6_CON);
+       writel((spi_data[CLKSEL6]&~(0x7f<<(2+SRAM_SPI_CH*9)))|(SRAM_SPI_SR_DIV<<(2+SRAM_SPI_CH*9)),
+               RK29_CRU_BASE + CRU_CLKSEL6_CON);//spi sr clk speed
+
+       
+       /***************spi clk enable*******************/
+       spi_data[CLKGATE2]=readl(RK29_CRU_BASE + CRU_CLKGATE2_CON);
+       writel(spi_data[CLKGATE2]&~(1<<(15+SRAM_SPI_CH)),RK29_CRU_BASE + CRU_CLKGATE2_CON);//spi clk enable
        
-       ret = readl(spibase + SPIM_CTRLR0);     
-       spi_data[5]=ret&~(1<<18)&~(1<<13)&~(1<<8)&~(0x3<<1)|(1<<11);
-       writel(spi_data[5]|size,spibase + SPIM_CTRLR0);             //  16\8\4 wei
-                                                 
-       ret=readl(spibase + SPIM_BAUDR);
-       writel(ret&(~0xffff)|0x2,spibase + SPIM_BAUDR);          //sout clk
+       /***************spi iomox*******************/
+       spi_data[GRF_IOM50]=readl(RK29_GRF_BASE +0x50);
+       spi_data[GRF_IOM5c]=readl(RK29_GRF_BASE +0x5c);
+       if(SRAM_SPI_CS)
+               writel((spi_data[GRF_IOM50]&~(0x3<<(8-2*SRAM_SPI_CH)))|(0x2<<(8-2*SRAM_SPI_CH)),RK29_GRF_BASE +0x50);    //spi cs1  iomux
+       else
+               writel((spi_data[GRF_IOM5c]&~(0x3<<(2+8*SRAM_SPI_CH)))|(0x1<<(2+8*SRAM_SPI_CH)),RK29_GRF_BASE +0x5c);   //spi cs0 iomux
 
-       ret=readl(spibase + SPIM_ENR);
-       writel(ret|0x1, spibase + SPIM_ENR);                         //enable spi
+       writel((spi_data[GRF_IOM5c]&~(0xf3<<(SRAM_SPI_CH*8)))
+               |(0x51<<(SRAM_SPI_CH*8)),RK29_GRF_BASE +0x5c);  //spi clk\txd\rxd iomux 
 
-}
-void  __sramfunc spi_deinit(void){
+
+       /***************spi ctr*******************/
+        
+       //spibase=spi_base[ch];
+       //sram_spi_cs=cs;
+
+       sram_spi_dis();// disable spi
        
-       writel(spi_data[0],RK29_GRF_BASE + 0x5c);       
-       writel(spi_data[1],RK29_GRF_BASE +0x50);
-       writel(0, spibase + SPIM_ENR);  
-       writel(spi_data[2], RK29_CRU_BASE + CRU_CLKSEL6_CON);
-       writel(spi_data[3],RK29_CRU_BASE + CRU_CLKGATE2_CON); 
-       writel(spi_data[4],RK29_CRU_BASE + CRU_CLKGATE1_CON);
+       spi_data[SPI_CTRLR0] = spi_readl(SPIM_CTRLR0); 
+       spi_writel((spi_data[SPI_CTRLR0]&~0x1fffc3)|0x1<<11|(SRAM_SPI_DATA_BYTE),SPIM_CTRLR0);//spi setting
+       spi_writel((spi_data[SPIM_BAUDR]&(~0xffff))|SRAM_SPI_DIV,SPIM_BAUDR);//setting spi speed
+       spi_data[SPI_SER]=spi_readl(SPIM_SER);//spi cs
        
-}
- void __sramfunc spi_init( unsigned char ch,unsigned char cs){
-       unsigned int ret=0;
-       ret=readl(RK29_CRU_BASE + CRU_CLKGATE1_CON);
-       spi_data[4]=ret;
-       writel(ret&~(1<<3)&~(1<<2)&~(1<<1)&~(1<<0),RK29_CRU_BASE + CRU_CLKGATE1_CON);
-       spi_data[3]=readl(RK29_CRU_BASE + CRU_CLKGATE2_CON);
-       spi_data[0]=readl(RK29_GRF_BASE +0x5c);
-       spi_data[2]=readl(RK29_CRU_BASE + CRU_CLKSEL6_CON);
-       spi_data[1]=readl(RK29_GRF_BASE +0x50);
-       writel(spi_data[3]&~(1<<(15+ch)),RK29_CRU_BASE + CRU_CLKGATE2_CON);   //spi0\1  clk enable
-       writel(spi_data[1]&~(1<<(8-2*ch))|(1<<(9-2*ch)),RK29_GRF_BASE +0x50);    //sp0\1 cs1  iomux
-       writel(spi_data[0]&~(1<<(3+8*ch))|(1<<(2+8*ch)),RK29_GRF_BASE +0x5c);   //spi0\1 cs0 iomux
-       if(ch!=0){
-               writel(spi_data[2]&~(0x7f<<11)|(0x0b<<11),RK29_CRU_BASE + CRU_CLKSEL6_CON);     //spi1 clk speed
-               writel(spi_data[0]&~(1<<15)&~(1<<13)&~(1<<9)|(1<<14)|(1<<12)|(1<<8),RK29_GRF_BASE +0x5c);   //spi1 clk\txd\rxd iomux 
-       }
-       else{
-               writel(spi_data[2]&~(0x7f<<2)|(0x0b<<2),RK29_CRU_BASE + CRU_CLKSEL6_CON);     //spi0 clk speed
-               writel(spi_data[0]&~(1<<7)&~(1<<5)&~(1<<1)|(1<<6)|(1<<4)|(1<<0),RK29_GRF_BASE +0x5c);   //spi0 clk\txd\rxd iomux
-       }
 }
 
-static void __sramfunc spi_write(unsigned int add,unsigned int data){
+static void __sramfunc sram_spi_write(unsigned short add,unsigned short data){
        unsigned int ret=0;
-       spi_reg_init(2,1,1);
-       writel(add, spibase + SPIM_TXDR);
-       delay_test(100);
-       writel(data, spibase + SPIM_TXDR);
-       delay_test(100);
-       ret = readl(spibase + SPIM_SER);
-       writel(ret&~(0xffffffff), spibase + SPIM_SER);    
 
+       sram_spi_cs_en();
+       sram_udelay(10,24);
+       sram_spi_en();
+               
+       spi_writel(add,SPIM_TXDR);
+       spi_writel(data,SPIM_TXDR);
+       //delay_test(100);
+
+       sram_udelay(100,24);
+
+       while(sram_spi_busy())
+       {
+               sram_udelay(1,24);
+               sram_printch('B');
+       }
+
+       sram_spi_dis();
+       sram_udelay(10,24);
+       sram_spi_cs_dis();
 }
- static unsigned int __sramfunc spi_read(unsigned int add,unsigned int data){
-       unsigned int ret=0,ret1=0;
-       spi_reg_init(2,1,1);
-       writel(add, spibase + SPIM_TXDR);
-       delay_test(100);
-       writel(data, spibase + SPIM_TXDR);
-       delay_test(100);
-       ret=readl(spibase + SPIM_RXDR); 
-       //printhex(ret);
-       //printch('\n');
-       ret1=readl(spibase + SPIM_RXDR); 
-       //printhex(ret1);
-       //printch('\n');
-       return ret1;
-       ret = readl(spibase + SPIM_SER);
-       writel(ret&~(0xffffffff), spibase + SPIM_SER);  
+static unsigned short __sramfunc sram_spi_read(unsigned short add,unsigned short data){
+       unsigned short ret=-1,ret1;
+       
+       sram_spi_cs_en();
+       sram_udelay(10,24);
+       sram_spi_en();
+       
+       spi_writel(add,SPIM_TXDR);
+       //delay_test(100);
+       spi_writel(data,SPIM_TXDR);
+       while(sram_spi_busy())
+       {
+               sram_udelay(1,24);
+               sram_printch('B');
+       }
+       sram_udelay(100,24);
+
+       ret1=spi_readl(SPIM_RXDR);
+       ret=spi_readl(SPIM_RXDR); 
+
+       while(sram_spi_busy())
+       {
+               sram_udelay(1,24);
+               sram_printch('B');
+       }
        
+       sram_spi_dis();
+       sram_udelay(10,24);
+       sram_spi_cs_dis();
+       return ret;
 }
-void __sramfunc rk29_wm831x_sleep_test(void){
-     
-       unsigned int data2 = 0xc003, data1 = 0x4128,ret = 0; 
-       unsigned int addw2 = 0x4003,addw1 = 0x405d;
-       unsigned int addr2= 0xc003,addr1= 0xc05d;
-       unsigned int size=2,ch=1,cs=1;    //DATA SIZE IS 2^(size+2)  (16wei)   ch0\1 is spi0\1     
-       //printch('\n');
-       spi_init(ch,cs);    //iomux  clk
-       spi_reg_init(2,1,1);  //spi reg     size, ch,cs
-       spi_write(addw1,data1);
-       ret=spi_read(addr1,data1);
-       spi_write(addw2,data2); 
-       spi_deinit();
+
+
+#if defined(CONFIG_MACH_RK29_A22)||defined(CONFIG_MACH_RK29_PHONESDK)
+
+unsigned int __sramfunc rk29_suspend_voltage_set(unsigned int vol)
+{
+#if 1 //test
+       unsigned short addr_4003=0x4003,addr_405d=0x405d,
+               addr_4059=0x4059,addr_405e=0x405e,addr_4063=0x4063;
+       unsigned short data_4003,data_405d,
+               data_405e,data_4059,data_4063;
+
+       sram_printch('s');
+       sram_spi_init();
+       sram_printch('\n');
+       sram_printch('M');
+       data_4059=sram_spi_read(addr_4059|wm831x_RD_MSK,wm831x_RD_VOID);
+       sram_printHX(data_4059);//dc1 sleep
+
+       data_405e=sram_spi_read(addr_405e|wm831x_RD_MSK,wm831x_RD_VOID);
+       sram_printHX(data_405e);//dc2 sleep
+
+       data_4063=sram_spi_read(addr_4063|wm831x_RD_MSK,wm831x_RD_VOID);
+       sram_printHX(data_405e);//dc3 sleep
+
+       
+       
+       data_4003=sram_spi_read(addr_4003|wm831x_RD_MSK,wm831x_RD_VOID);
+       sram_printHX(data_4003);//sleep ctr
+       
+       
+
+
+
+       sram_printch('N');
+
+       data_4059=(data_4059&~(0x7f))|0x68;
+       sram_spi_write(addr_4059,data_4059);//dc1 sleep 3.0v
+
+       data_405e=(data_405e&~(0x7f))|0x28;//1.2 0x38 / 1.0 0x28,1.3 0x40
+       sram_spi_write(addr_405e,data_405e);//dc2 sleep
+
+       data_4063=(data_4063&~(0x7f))|0x56;
+       sram_spi_write(addr_4063,data_4063);//dc3 sleep 1.8V
+
+
+
+       sram_printch('J');
+       data_4003|=(0x1<<14);
+       sram_spi_write(addr_4003,data_4003);// sleep
+       
+       sram_printch('L');
+       data_4059=sram_spi_read(addr_4059|wm831x_RD_MSK,wm831x_RD_VOID);
+       sram_printHX(data_4059);
+                       
+       data_405e=sram_spi_read(addr_405e|wm831x_RD_MSK,wm831x_RD_VOID);
+       sram_printHX(data_405e);
+
+       
+       data_4063=sram_spi_read(addr_4063|wm831x_RD_MSK,wm831x_RD_VOID);
+       sram_printHX(data_4063);
+       
+       data_4003=sram_spi_read(addr_4003|wm831x_RD_MSK,wm831x_RD_VOID);
+       sram_printHX(data_4003);
+
                
+               
+       sram_spi_deinit();
+       #else
+               unsigned short addr_4003=0x4003;
+               unsigned short data_4003;
+               sram_spi_init();        //iomux  clk
+       
+               data_4003=sram_spi_read(addr_4003|wm831x_RD_MSK,wm831x_RD_VOID);
+               sram_printHX(data_4003);//sleep ctr
+       
+               sram_printch('G');
+               data_4003|=(0x1<<14);
+               sram_spi_write(addr_4003,data_4003);// sleep
+       
+               data_4003=sram_spi_read(addr_4003|wm831x_RD_MSK,wm831x_RD_VOID);
+               sram_printHX(data_4003);//sleep ctr
+               sram_spi_deinit();
+       #endif
 } 
-void __sramfunc rk29_wm831x_resume_test(void){
-     
-       unsigned int data4 = 0x8003, data3 = 0x4140,ret = 0; 
-       unsigned int addw4 = 0x4003,addw3 = 0x405d;
-       unsigned int addr4= 0xc003,addr3= 0xc05d;
-       unsigned int size=2,ch=1,cs=1;
-       //printch('\n');
-       spi_init(ch,cs);          // clk iomux
-       spi_reg_init(2,1,1);         //spi reg       size,ch,cs
-       spi_write(addw3,data3);  
-       ret=spi_read(addr3,data3);
-       spi_write(addw4,data4); 
-       spi_deinit();   
+void __sramfunc rk29_suspend_voltage_resume(unsigned int vol)
+{
+
+       unsigned short addr_4003=0x4003;
+       unsigned short data_4003;
+       sram_spi_init();    //iomux  clk
+
+       data_4003=sram_spi_read(addr_4003|wm831x_RD_MSK,wm831x_RD_VOID);
+       sram_printHX(data_4003);//sleep ctr
+
+       sram_printch('G');
+       data_4003&=~(0x1<<14);
+       sram_spi_write(addr_4003,data_4003);// sleep
+
+       data_4003=sram_spi_read(addr_4003|wm831x_RD_MSK,wm831x_RD_VOID);
+       sram_printHX(data_4003);//sleep ctr
+
+       
+       sram_spi_deinit();
+       
 }
 
 
+#else
+void interface_ctr_reg_pread(void)
+{
+}
+unsigned int __sramfunc rk29_suspend_voltage_set(unsigned int vol)
+{
+}
+void __sramfunc rk29_suspend_voltage_resume(unsigned int vol)
+{
+}
+#endif
+