edit system suspend vol control code

This commit is contained in:
root
2011-06-10 17:38:57 +08:00
parent 67aeaa07c6
commit 09af8dc558
6 changed files with 487 additions and 182 deletions

View 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

View 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

View File

@@ -0,0 +1,21 @@
#ifndef PM_VOL_H
#define PM_VOL_H
#if defined(CONFIG_RK29_SPI_INSRAM)||defined(CONFIG_RK29_PWM_INSRAM)
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);
#else
#define interface_ctr_reg_pread()
static unsigned int __sramfunc rk29_suspend_voltage_set(unsigned int vol)
{
}
#define rk29_suspend_voltage_resume(a)
#endif
#endif

View 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>
@@ -26,18 +23,8 @@
#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();

View File

@@ -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)
{
}
*/

View File

@@ -1,131 +1,388 @@
#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;
spibase=spi_base[ch];
ret=readl(spibase + SPIM_ENR);
writel(ret&~(0x1<<0), spibase + SPIM_ENR); //disable SPI reg
ret = readl(spibase + SPIM_SER);
writel(ret&~(0xffffffff)|(0x1<<cs), spibase + SPIM_SER); //cs0\1
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
static void __sramfunc sram_spi_deinit(void)
{
sram_spi_dis();
ret=readl(spibase + SPIM_ENR);
writel(ret|0x1, spibase + SPIM_ENR); //enable spi
spi_writel(spi_data[SPI_CTRLR0],SPIM_CTRLR0);
spi_writel(spi_data[SPI_BAUDR],SPIM_BAUDR);
spi_writel(spi_data[SPI_SER],SPIM_SER);
}
void __sramfunc spi_deinit(void){
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);
}
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
}
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 spi_write(unsigned int add,unsigned int data){
static void __sramfunc sram_spi_init(void)
{
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);
/***************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
/***************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
writel((spi_data[GRF_IOM5c]&~(0xf3<<(SRAM_SPI_CH*8)))
|(0x51<<(SRAM_SPI_CH*8)),RK29_GRF_BASE +0x5c); //spi clk\txd\rxd iomux
/***************spi ctr*******************/
//spibase=spi_base[ch];
//sram_spi_cs=cs;
sram_spi_dis();// disable spi
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
}
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;
}
#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_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();
}
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();
}
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();
#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