From 0bf9d0684ae3052da72e56d49d8465bb26cc12ba Mon Sep 17 00:00:00 2001 From: root Date: Mon, 6 Jun 2011 04:08:43 +0800 Subject: [PATCH] add a function that spi driver codecs can run in sram --- arch/arm/mach-rk29/Kconfig | 3 + arch/arm/mach-rk29/Makefile | 1 + arch/arm/mach-rk29/include/mach/rk29_iomap.h | 2 + arch/arm/mach-rk29/io.c | 2 + arch/arm/mach-rk29/pm.c | 21 ++- arch/arm/mach-rk29/spi_sram.c | 131 +++++++++++++++++++ 6 files changed, 159 insertions(+), 1 deletion(-) mode change 100755 => 100644 arch/arm/mach-rk29/Kconfig mode change 100644 => 100755 arch/arm/mach-rk29/include/mach/rk29_iomap.h mode change 100755 => 100644 arch/arm/mach-rk29/pm.c create mode 100644 arch/arm/mach-rk29/spi_sram.c diff --git a/arch/arm/mach-rk29/Kconfig b/arch/arm/mach-rk29/Kconfig old mode 100755 new mode 100644 index f52d25e83502..91433adc823a --- a/arch/arm/mach-rk29/Kconfig +++ b/arch/arm/mach-rk29/Kconfig @@ -179,5 +179,8 @@ 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" + default n endif diff --git a/arch/arm/mach-rk29/Makefile b/arch/arm/mach-rk29/Makefile index e2c0ed70b24f..fc77b8e9baf5 100644 --- a/arch/arm/mach-rk29/Makefile +++ b/arch/arm/mach-rk29/Makefile @@ -9,6 +9,7 @@ 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_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/rk29_iomap.h b/arch/arm/mach-rk29/include/mach/rk29_iomap.h old mode 100644 new mode 100755 index f089fcbec7a5..200113c5e195 --- a/arch/arm/mach-rk29/include/mach/rk29_iomap.h +++ b/arch/arm/mach-rk29/include/mach/rk29_iomap.h @@ -169,8 +169,10 @@ #define RK29_ADC_PHYS 0x2006C000 #define RK29_ADC_SIZE SZ_16K #define RK29_SPI0_PHYS 0x20070000 +#define RK29_SPI0_BASE (RK29_ADDR_BASE1+0x70000) #define RK29_SPI0_SIZE SZ_16K #define RK29_SPI1_PHYS 0x20074000 +#define RK29_SPI1_BASE (RK29_ADDR_BASE1+0x74000) #define RK29_SPI1_SIZE SZ_16K #define RK29_DMAC1_PHYS 0x20078000 #define RK29_DMAC1_SIZE SZ_16K diff --git a/arch/arm/mach-rk29/io.c b/arch/arm/mach-rk29/io.c index 9815a2734756..b2e930417e95 100644 --- a/arch/arm/mach-rk29/io.c +++ b/arch/arm/mach-rk29/io.c @@ -50,6 +50,8 @@ static struct map_desc rk29_io_desc[] __initdata = { RK29_DEVICE(GPIO5), RK29_DEVICE(GPIO6), RK29_DEVICE(NANDC), + RK29_DEVICE(SPI0), + RK29_DEVICE(SPI1), }; void __init rk29_map_common_io(void) diff --git a/arch/arm/mach-rk29/pm.c b/arch/arm/mach-rk29/pm.c old mode 100755 new mode 100644 index 0fa338fb037e..9aab0ef6cd38 --- a/arch/arm/mach-rk29/pm.c +++ b/arch/arm/mach-rk29/pm.c @@ -29,6 +29,15 @@ #include +#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 #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) @@ -279,6 +288,10 @@ static void __sramfunc rk29_sram_suspend(void) #ifdef CONFIG_RK29_PWM_REGULATOR rk29_set_core_voltage(1000000); #endif +#if defined(CONFIG_RK29_SRAM_SPI) + rk29_spi_ctr_vol_sleep(); +#endif + printch('7'); clksel0 = cru_readl(CRU_CLKSEL0_CON); /* set arm clk 24MHz/32 = 750KHz */ @@ -296,6 +309,10 @@ static void __sramfunc rk29_sram_suspend(void) #ifdef CONFIG_RK29_PWM_REGULATOR rk29_set_core_voltage(0); #endif +#if defined(CONFIG_RK29_SRAM_SPI) + rk29_spi_ctr_vol_resume(); +#endif + printch('6'); ddr_resume(); @@ -469,7 +486,9 @@ 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/spi_sram.c b/arch/arm/mach-rk29/spi_sram.c new file mode 100644 index 000000000000..2c7eb3358015 --- /dev/null +++ b/arch/arm/mach-rk29/spi_sram.c @@ -0,0 +1,131 @@ + +#include + +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) + +void __sramfunc delay_test(int delay_time) +{ + int n = 100 * delay_time; + while(n--) + { + __asm__ __volatile__(""); + } +} + +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<