4 #include <linux/delay.h>
6 #include <linux/kernel.h>
7 #include <linux/init.h>
9 #include <linux/suspend.h>
10 #include <linux/random.h>
11 #include <linux/crc32.h>
12 #ifdef CONFIG_RK29_PWM_REGULATOR
13 #include <linux/regulator/rk29-pwm-regulator.h>
16 #include <linux/wakelock.h>
17 #include <asm/tlbflush.h>
18 #include <asm/hardware/gic.h>
20 #include <mach/rk29_iomap.h>
23 #include <mach/board.h>
24 #include <mach/system.h>
25 #include <mach/sram.h>
26 #include <mach/gpio.h>
28 #include <mach/memtester.h>
30 #define cru_readl(offset) readl(RK29_CRU_BASE + offset)
31 #define cru_writel(v, offset) do { writel(v, RK29_CRU_BASE + offset); readl(RK29_CRU_BASE + offset); } while (0)
32 #define pmu_readl(offset) readl(RK29_PMU_BASE + offset)
33 #define pmu_writel(v, offset) do { writel(v, RK29_PMU_BASE + offset); readl(RK29_PMU_BASE + offset); } while (0)
34 static unsigned long save_sp;
36 #define LOOPS_PER_USEC 13
37 #define LOOP(loops) do { int i = loops; barrier(); while (i--) barrier(); } while (0)
39 static inline void delay_500ns(void)
44 static inline void delay_300us(void)
46 LOOP(300 * LOOPS_PER_USEC);
50 static void/* inline*/ __sramfunc printch(char byte)
55 local_irq_save(flags);
56 gate1 = cru_readl(CRU_CLKGATE1_CON);
57 gate2 = cru_readl(CRU_CLKGATE2_CON);
58 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);
59 cru_writel(gate2 & ~(1 << CLK_GATE_UART1 % 32), CRU_CLKGATE2_CON);
62 writel(byte, RK29_UART1_BASE);
64 /* loop check LSR[6], Transmitter Empty bit */
65 while (!(readl(RK29_UART1_BASE + 0x14) & 0x40))
68 cru_writel(gate2, CRU_CLKGATE2_CON);
69 cru_writel(gate1, CRU_CLKGATE1_CON);
70 local_irq_restore(flags);
75 static void __sramfunc printascii(const char *s)
86 void print(const char *s)
91 void __sramfunc print_Hex(unsigned int hex)
97 unsigned char c = (hex & 0xF0000000) >> 28;
98 printch(c < 0xa ? c + '0' : c - 0xa + 'a');
103 void __sramfunc print_Dec (uint32_t n)
110 printch((char)(n + '0'));
113 void print_Dec_3(uint32_t value)
129 static void /* inline*/ __sramfunc printhex(unsigned int hex)
135 unsigned char c = (hex & 0xF0000000) >> 28;
136 printch(c < 0xa ? c + '0' : c - 0xa + 'a');
141 static void inline printch(char byte) {}
142 static void inline printascii(const char *s) {}
143 static void inline printhex(unsigned int hex) {}
146 #ifdef CONFIG_RK29_PWM_REGULATOR
147 #define pwm_write_reg(addr, val) __raw_writel(val, addr + (RK29_PWM_BASE + 2*0x10))
148 #define pwm_read_reg(addr) __raw_readl(addr + (RK29_PWM_BASE + 2*0x10))
150 static u32 __sramdata pwm_lrc, pwm_hrc;
151 static void __sramfunc rk29_set_core_voltage(int uV)
155 gate1 = cru_readl(CRU_CLKGATE1_CON);
156 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);
159 writel((readl(RK29_GRF_BASE + 0x58) & ~(0x3<<6)) | (0x2<<6), RK29_GRF_BASE + 0x58);
162 pwm_lrc = pwm_read_reg(PWM_REG_LRC);
163 pwm_hrc = pwm_read_reg(PWM_REG_HRC);
166 pwm_write_reg(PWM_REG_CTRL, PWM_DIV|PWM_RESET);
168 pwm_write_reg(PWM_REG_LRC, 12);
169 pwm_write_reg(PWM_REG_HRC, 10);
171 pwm_write_reg(PWM_REG_LRC, pwm_lrc);
172 pwm_write_reg(PWM_REG_HRC, pwm_hrc);
174 pwm_write_reg(PWM_REG_CNTR, 0);
175 pwm_write_reg(PWM_REG_CTRL, PWM_DIV|PWM_ENABLE|PWM_TimeEN);
177 LOOP(5 * 1000 * LOOPS_PER_USEC); /* delay 5ms */
179 cru_writel(gate1, CRU_CLKGATE1_CON);
181 #endif /* CONFIG_RK29_PWM_REGULATOR */
182 /*volatile __sramdata */int ddr_debug;
183 module_param(ddr_debug, int, 0644);
185 static int inline calc_crc32(u32 addr, size_t len)
187 return crc32_le(~0,(const unsigned char *)addr,len);
189 void __sramfunc ddr_testmode(void)
191 int32_t g_crc1,g_crc2;
194 extern char _stext[], _etext[];
204 g_crc1 = calc_crc32((u32)_stext, (size_t)(_etext-_stext));
205 nMHz = 333 + (random32()>>25);
211 //ddr_print("%s change freq to: %d MHz\n", __func__, nMHz);
212 ddr_change_freq(nMHz);
213 g_crc2 = calc_crc32((u32)_stext, (size_t)(_etext-_stext));
222 //ddr_print("check image crc32 success--crc value = 0x%x!, count:%d\n",g_crc1, n++);
223 // printascii("change freq success\n");
226 else if(ddr_debug == 2)
235 g_crc1 = calc_crc32((u32)_stext, (size_t)(_etext-_stext));
236 nMHz = (random32()>>13);// 16.7s max
243 g_crc2 = calc_crc32((u32)_stext, (size_t)(_etext-_stext));
252 // ddr_print("check image crc32 fail!, count:%d\n", n++);
253 // printascii("self refresh fail\n");
255 //ddr_print("check image crc32 success--crc value = 0x%x!, count:%d\n",g_crc1, n++);
256 // printascii("self refresh success\n");
259 else if(ddr_debug == 3)
265 void __sramfunc ddr_testmode(void)
269 static void __sramfunc rk29_sram_suspend(void)
273 if((ddr_debug == 1)||(ddr_debug == 2))
279 #ifdef CONFIG_RK29_PWM_REGULATOR
280 rk29_set_core_voltage(1000000);
283 clksel0 = cru_readl(CRU_CLKSEL0_CON);
284 /* set arm clk 24MHz/32 = 750KHz */
285 cru_writel(clksel0 | 0x1F, CRU_CLKSEL0_CON);
292 cru_writel(clksel0, CRU_CLKSEL0_CON);
295 #ifdef CONFIG_RK29_PWM_REGULATOR
296 rk29_set_core_voltage(0);
304 static void noinline rk29_suspend(void)
306 DDR_SAVE_SP(save_sp);
308 DDR_RESTORE_SP(save_sp);
311 static void dump_irq(void)
313 u32 irq_gpio = (readl(RK29_GICPERI_BASE + GIC_DIST_PENDING_SET + 8) >> 23) & 0x7F;
314 printk("wakeup irq: %08x %08x %01x\n",
315 readl(RK29_GICPERI_BASE + GIC_DIST_PENDING_SET + 4),
316 readl(RK29_GICPERI_BASE + GIC_DIST_PENDING_SET + 8),
317 readl(RK29_GICPERI_BASE + GIC_DIST_PENDING_SET + 12) & 0xf);
319 printk("wakeup gpio0: %08x\n", readl(RK29_GPIO0_BASE + GPIO_INT_STATUS));
321 printk("wakeup gpio1: %08x\n", readl(RK29_GPIO1_BASE + GPIO_INT_STATUS));
323 printk("wakeup gpio2: %08x\n", readl(RK29_GPIO2_BASE + GPIO_INT_STATUS));
325 printk("wakeup gpio3: %08x\n", readl(RK29_GPIO3_BASE + GPIO_INT_STATUS));
327 printk("wakeup gpio4: %08x\n", readl(RK29_GPIO4_BASE + GPIO_INT_STATUS));
329 printk("wakeup gpio5: %08x\n", readl(RK29_GPIO5_BASE + GPIO_INT_STATUS));
331 printk("wakeup gpio6: %08x\n", readl(RK29_GPIO6_BASE + GPIO_INT_STATUS));
334 static int rk29_pm_enter(suspend_state_t state)
336 u32 apll, cpll, gpll, mode, clksel0;
345 #ifdef CONFIG_RK29_PWM_REGULATOR
348 readl(RK29_PWM_BASE);
349 readl(RK29_GRF_BASE);
353 clkgate[0] = cru_readl(CRU_CLKGATE0_CON);
354 clkgate[1] = cru_readl(CRU_CLKGATE1_CON);
355 clkgate[2] = cru_readl(CRU_CLKGATE2_CON);
356 clkgate[3] = cru_clkgate3_con_mirror;
357 cru_writel(~((1 << CLK_GATE_CORE)
358 | (1 << CLK_GATE_ACLK_CPU)
359 | (1 << CLK_GATE_ACLK_CPU2)
360 | (1 << CLK_GATE_PCLK_CPU)
361 | (1 << CLK_GATE_GIC)
362 | (1 << CLK_GATE_INTMEM)
363 | (1 << CLK_GATE_DDR_PHY)
364 | (1 << CLK_GATE_DDR_REG)
365 | (1 << CLK_GATE_DDR_CPU)
366 | (1 << CLK_GATE_GPIO0)
367 | (1 << CLK_GATE_RTC)
368 | (1 << CLK_GATE_GRF)
369 ) | clkgate[0], CRU_CLKGATE0_CON);
370 cru_writel(~0, CRU_CLKGATE1_CON);
371 cru_writel(~((1 << CLK_GATE_GPIO1 % 32)
372 | (1 << CLK_GATE_GPIO2 % 32)
373 | (1 << CLK_GATE_GPIO3 % 32)
374 | (1 << CLK_GATE_GPIO4 % 32)
375 | (1 << CLK_GATE_GPIO5 % 32)
376 | (1 << CLK_GATE_GPIO6 % 32)
377 | (1 << CLK_GATE_PWM % 32)
378 ) | clkgate[2], CRU_CLKGATE2_CON);
379 cru_writel(~0, CRU_CLKGATE3_CON);
382 mode = cru_readl(CRU_MODE_CON);
383 clksel0 = cru_readl(CRU_CLKSEL0_CON);
385 /* suspend arm pll */
386 apll = cru_readl(CRU_APLL_CON);
387 cru_writel((cru_readl(CRU_MODE_CON) & ~CRU_CPU_MODE_MASK) | CRU_CPU_MODE_SLOW, CRU_MODE_CON);
388 cru_writel(apll | PLL_BYPASS, CRU_APLL_CON);
389 cru_writel(apll | PLL_PD | PLL_BYPASS, CRU_APLL_CON);
391 /* set core = aclk_cpu = hclk_cpu = pclk_cpu = 24MHz */
392 cru_writel(clksel0 & 0xFFFFF000, CRU_CLKSEL0_CON);
395 /* suspend codec pll */
396 cpll = cru_readl(CRU_CPLL_CON);
397 cru_writel((cru_readl(CRU_MODE_CON) & ~CRU_CODEC_MODE_MASK) | CRU_CODEC_MODE_SLOW, CRU_MODE_CON);
398 cru_writel(cpll | PLL_BYPASS, CRU_CPLL_CON);
399 cru_writel(cpll | PLL_PD | PLL_BYPASS, CRU_CPLL_CON);
403 /* suspend general pll */
404 gpll = cru_readl(CRU_GPLL_CON);
405 cru_writel((cru_readl(CRU_MODE_CON) & ~CRU_GENERAL_MODE_MASK) | CRU_GENERAL_MODE_SLOW, CRU_MODE_CON);
406 cru_writel(gpll | PLL_BYPASS, CRU_GPLL_CON);
407 cru_writel(gpll | PLL_PD | PLL_BYPASS, CRU_GPLL_CON);
409 /* set aclk_periph = hclk_periph = pclk_periph = 24MHz */
410 cru_writel(clksel0 & ~0x7FC000, CRU_CLKSEL0_CON);
416 /* resume general pll */
417 cru_writel(gpll, CRU_GPLL_CON);
419 /* restore aclk_periph/hclk_periph/pclk_periph */
420 cru_writel(cru_readl(CRU_CLKSEL0_CON) | (clksel0 & 0x7FC000), CRU_CLKSEL0_CON);
421 cru_writel((cru_readl(CRU_MODE_CON) & ~CRU_GENERAL_MODE_MASK) | (mode & CRU_GENERAL_MODE_MASK), CRU_MODE_CON);
424 /* resume codec pll */
425 cru_writel(cpll, CRU_CPLL_CON);
427 cru_writel((cru_readl(CRU_MODE_CON) & ~CRU_CODEC_MODE_MASK) | (mode & CRU_CODEC_MODE_MASK), CRU_MODE_CON);
431 cru_writel(apll, CRU_APLL_CON);
433 /* restore core/aclk_cpu/hclk_cpu/pclk_cpu */
434 cru_writel(cru_readl(CRU_CLKSEL0_CON) | (clksel0 & 0xFFF), CRU_CLKSEL0_CON);
435 cru_writel((cru_readl(CRU_MODE_CON) & ~CRU_CPU_MODE_MASK) | (mode & CRU_CPU_MODE_MASK), CRU_MODE_CON);
439 cru_writel(clkgate[0], CRU_CLKGATE0_CON);
440 cru_writel(clkgate[1], CRU_CLKGATE1_CON);
441 cru_writel(clkgate[2], CRU_CLKGATE2_CON);
442 cru_writel(clkgate[3], CRU_CLKGATE3_CON);
449 static int rk29_pm_prepare(void)
451 /* disable entering rk29_idle() by disable_hlt() */
456 static void rk29_pm_finish(void)
461 static struct platform_suspend_ops rk29_pm_ops = {
462 .enter = rk29_pm_enter,
463 .valid = suspend_valid_only_mem,
464 .prepare = rk29_pm_prepare,
465 .finish = rk29_pm_finish,
468 static void rk29_idle(void)
470 if (!need_resched()) {
472 #ifdef CONFIG_HAS_WAKELOCK
473 allow_sleep = !has_wake_lock(WAKE_LOCK_IDLE);
476 u32 mode_con = cru_readl(CRU_MODE_CON);
477 cru_writel((mode_con & ~CRU_CPU_MODE_MASK) | CRU_CPU_MODE_SLOW, CRU_MODE_CON);
479 cru_writel(mode_con, CRU_MODE_CON);
487 static int __init rk29_pm_init(void)
489 suspend_set_ops(&rk29_pm_ops);
491 /* set idle function */
497 __initcall(rk29_pm_init);