2 #include <linux/kernel.h>
3 #include <linux/init.h>
4 #include <asm/cacheflush.h>
5 #include <asm/tlbflush.h>
6 #include <asm/hardware/cache-l2x0.h>
7 #include <linux/module.h>
8 #include <linux/platform_device.h>
11 #include <linux/suspend.h>
15 #include <linux/of_address.h>
17 #include <linux/rockchip/cpu.h>
18 //#include <linux/rockchip/cru.h>
19 #include <linux/rockchip/grf.h>
20 #include <linux/rockchip/iomap.h>
22 #include <linux/irqchip/arm-gic.h>
29 static void ddr_pin_set_pull(u8 port,u8 bank,u8 b_gpio,u8 fun);
30 static void ddr_gpio_set_in_output(u8 port,u8 bank,u8 b_gpio,u8 type);
31 static void ddr_pin_set_fun(u8 port,u8 bank,u8 b_gpio,u8 fun);
34 /*************************cru define********************************************/
37 #define RK3288_CRU_UNGATING_OPS(id) cru_writel(CRU_W_MSK_SETBITS(0,(id)%16,0x1),RK3288_CRU_GATEID_CONS((id)))
38 #define RK3288_CRU_GATING_OPS(id) cru_writel(CRU_W_MSK_SETBITS(1,(id)%16,0x1),RK3288_CRU_GATEID_CONS((id)))
49 #define RK3288_PLL_PWR_DN_MSK (0x1<<1)
50 #define RK3288_PLL_PWR_DN CRU_W_MSK_SETBITS(1,1,0x1)
51 #define RK3288_PLL_PWR_ON CRU_W_MSK_SETBITS(0,1,0x1)
54 #define RK3288_PLL_RESET CRU_W_MSK_SETBITS(1,5,0x1)
55 #define RK3288_PLL_RESET_RESUME CRU_W_MSK_SETBITS(0,5,0x1)
57 #define RK3288_PLL_BYPASS_MSK (0x1<<0)
58 #define RK3288_PLL_BYPASS CRU_W_MSK_SETBITS(1,0,0x1)
59 #define RK3288_PLL_NO_BYPASS CRU_W_MSK_SETBITS(0,0,0x1)
62 /*******************************gpio define **********************************************/
64 /* GPIO control registers */
65 #define GPIO_SWPORT_DR 0x00
66 #define GPIO_SWPORT_DDR 0x04
67 #define GPIO_INTEN 0x30
68 #define GPIO_INTMASK 0x34
69 #define GPIO_INTTYPE_LEVEL 0x38
70 #define GPIO_INT_POLARITY 0x3c
71 #define GPIO_INT_STATUS 0x40
72 #define GPIO_INT_RAWSTATUS 0x44
73 #define GPIO_DEBOUNCE 0x48
74 #define GPIO_PORTS_EOI 0x4c
75 #define GPIO_EXT_PORT 0x50
76 #define GPIO_LS_SYNC 0x60
78 /***********************************sleep func*********************************************/
80 #define RKPM_BOOTRAM_PHYS (RK3288_BOOTRAM_PHYS)
81 #define RKPM_BOOTRAM_BASE (RK_BOOTRAM_VIRT)
82 #define RKPM_BOOTRAM_SIZE (RK3288_BOOTRAM_SIZE)
84 // sys resume code in boot ram
85 #define RKPM_BOOT_CODE_PHY (RKPM_BOOTRAM_PHYS+RKPM_BOOT_CODE_OFFSET)
86 #define RKPM_BOOT_CODE_BASE (RKPM_BOOTRAM_BASE+RKPM_BOOT_CODE_OFFSET)
89 // sys resume data in boot ram
90 #define RKPM_BOOT_DATA_PHY (RKPM_BOOTRAM_PHYS+RKPM_BOOT_DATA_OFFSET)
91 #define RKPM_BOOT_DATA_BASE (RKPM_BOOTRAM_BASE+RKPM_BOOT_DATA_OFFSET)
93 // ddr resume data in boot ram
94 #define RKPM_BOOT_DDRCODE_PHY (RKPM_BOOTRAM_PHYS + RKPM_BOOT_DDRCODE_OFFSET)
95 #define RKPM_BOOT_DDRCODE_BASE (RKPM_BOOTRAM_BASE+RKPM_BOOT_DDRCODE_OFFSET)
97 #define RKPM_BOOT_CPUSP_PHY (RKPM_BOOTRAM_PHYS+((RKPM_BOOTRAM_SIZE-1)&~0x7))
99 // the value is used to control cpu resume flow
100 static u32 sleep_resume_data[RKPM_BOOTDATA_ARR_SIZE];
101 static char *resume_data_base=(char *)( RKPM_BOOT_DATA_BASE);
102 static char *resume_data_phy= (char *)( RKPM_BOOT_DATA_PHY);
106 #define BOOT_RAM_SIZE (4*1024)
107 #define INT_RAM_SIZE (64*1024)
109 static char boot_ram_data[BOOT_RAM_SIZE+4*10];
110 static char int_ram_data[INT_RAM_SIZE];
112 char * ddr_get_resume_code_info(u32 *size);
113 char * ddr_get_resume_data_info(u32 *size);
123 static void sram_data_for_sleep(char *boot_save, char *int_save,u32 flag)
126 char *addr_base,*addr_phy,*data_src,*data_dst;
127 u32 sr_size,data_size;
129 addr_base=(char *)RKPM_BOOTRAM_BASE;
130 addr_phy=(char *)RKPM_BOOTRAM_PHYS;
131 sr_size=RKPM_BOOTRAM_SIZE;
135 memcpy(boot_save,addr_base, sr_size);
137 // move resume code and date to boot sram
139 data_dst=(char *)RKPM_BOOT_CODE_BASE;
140 data_src=(char *)rkpm_slp_cpu_resume;
141 data_size=RKPM_BOOT_CODE_SIZE;
142 memcpy((char *)data_dst,(char *)data_src, data_size);
145 data_dst=(char *)resume_data_base;
146 data_src=(char *)sleep_resume_data;
147 data_size=sizeof(sleep_resume_data);
148 memcpy((char *)data_dst,(char *)data_src, data_size);
152 /*************************ddr code cpy*************************************/
154 data_dst=(char *)(char *)RKPM_BOOT_DDRCODE_BASE;
155 data_src=(char *)ddr_get_resume_code_info(&data_size);
157 data_size=RKPM_ALIGN(data_size,4);
159 memcpy((char *)data_dst,(char *)data_src, data_size);
162 data_dst=(char *)(data_dst+data_size);
164 data_src=(char *)ddr_get_resume_data_info(&data_size);
165 data_size=RKPM_ALIGN(data_size,4);
166 memcpy((char *)data_dst,(char *)data_src, data_size);
168 /*************************ddr code cpy end*************************************/
169 flush_icache_range((unsigned long)addr_base, (unsigned long)addr_base + sr_size);
170 outer_clean_range((phys_addr_t) addr_phy, (phys_addr_t)(addr_phy)+sr_size);
171 /*************************int mem bak*************************************/
173 addr_base=(char *)rockchip_sram_virt;
174 addr_phy=(char *)pie_to_phys(rockchip_pie_chunk,(unsigned long )rockchip_sram_virt);
175 sr_size=rockchip_sram_size;
176 // rkpm_ddr_printascii("piephy\n");
177 //rkpm_ddr_printhex(addr_phy);
180 memcpy(int_save,addr_base, sr_size);
182 flush_icache_range((unsigned long)addr_base, (unsigned long)addr_base + sr_size);
183 outer_clean_range((phys_addr_t) addr_phy, (phys_addr_t)(addr_phy)+sr_size);
188 static void sram_data_resume(char *boot_save, char *int_save,u32 flag)
191 char *addr_base,*addr_phy;
194 addr_base=(char *)RKPM_BOOTRAM_BASE;
195 addr_phy=(char *)RKPM_BOOTRAM_PHYS;
196 sr_size=RKPM_BOOTRAM_SIZE;
199 memcpy(addr_base,boot_save, sr_size);
201 flush_icache_range((unsigned long)addr_base, (unsigned long)addr_base + sr_size);
202 outer_clean_range((phys_addr_t) addr_phy, (phys_addr_t)addr_phy+sr_size);
207 addr_base=(char *)rockchip_sram_virt;
208 addr_phy=(char *)pie_to_phys(rockchip_pie_chunk,(unsigned long )rockchip_sram_virt);
209 sr_size=rockchip_sram_size;
212 memcpy(addr_base, int_save,sr_size);
214 flush_icache_range((unsigned long)addr_base, (unsigned long)addr_base + sr_size);
215 outer_clean_range((phys_addr_t) addr_phy,(unsigned long)addr_phy+sr_size);
219 /**************************************gic save and resume**************************/
220 #define RK_GICD_BASE (RK_GIC_VIRT)
221 #define RK_GICC_BASE (RK_GIC_VIRT+RK3288_GIC_DIST_SIZE)
223 #define PM_IRQN_START 32
224 #define PM_IRQN_END 107//107
225 static void pm_gic_enable(u32 irqs)
230 void __iomem *reg_off;
231 unsigned int gic_irqs;
233 gic_irqs = PM_IRQN_END;
234 irqstart=PM_IRQN_START;//PM_IRQN_START;
236 reg_off=(irqs/32)*4+GIC_DIST_ENABLE_SET+RK_GICD_BASE;
238 writel_relaxed(readl_relaxed(reg_off)|(1<<bit_off),reg_off);
243 static void rkpm_gic_disable(u32 irqs)
247 void __iomem *reg_off;
248 unsigned int gic_irqs;
250 gic_irqs = PM_IRQN_END;
251 irqstart=PM_IRQN_START;//PM_IRQN_START;
253 reg_off=(irqs/32)*4+GIC_DIST_ENABLE_CLEAR+RK_GICD_BASE;
255 writel_relaxed(readl_relaxed(reg_off)&~(1<<bit_off),reg_off);
259 #define gic_reg_dump(a,b,c) {}//reg_dump((a),(b),(c))
261 static u32 slp_gic_save[260+50];
264 static void rkpm_gic_dist_save(u32 *context)
266 int i = 0,j,irqstart=0;
267 unsigned int gic_irqs;
269 gic_irqs = readl_relaxed(RK_GICD_BASE + GIC_DIST_CTR) & 0x1f;
270 gic_irqs = (gic_irqs + 1) * 32;
273 //printk("gic_irqs=%d\n",gic_irqs);
274 //gic_irqs = PM_IRQN_END;
275 irqstart=PM_IRQN_START;//PM_IRQN_START;
279 for (j = irqstart; j < gic_irqs; j += 16)
280 context[i++]=readl_relaxed(RK_GICD_BASE + GIC_DIST_CONFIG + (j * 4) / 16);
281 gic_reg_dump("gic level",j,RK_GICD_BASE + GIC_DIST_CONFIG);
284 * Set all global interrupts to this CPU only.
286 for(j = 0; j < gic_irqs; j += 4)
287 context[i++]=readl_relaxed(RK_GICD_BASE + GIC_DIST_TARGET + (j * 4) / 4);
289 gic_reg_dump("gic trig",j,RK_GICD_BASE + GIC_DIST_TARGET);
292 for (j = 0; j < gic_irqs; j += 4)
293 context[i++]=readl_relaxed(RK_GICD_BASE+ GIC_DIST_PRI + (j * 4) / 4);
294 gic_reg_dump("gic pri",j,RK_GICD_BASE + GIC_DIST_PRI);
300 for (j = 0; j < gic_irqs; j += 32)
301 context[i++]=readl_relaxed(RK_GICD_BASE + 0x80 + (j * 4) / 32);
302 gic_reg_dump("gic secure",j,RK_GICD_BASE + 0x80);
304 for (j = irqstart; j < gic_irqs; j += 32)
305 context[i++]=readl_relaxed(RK_GICD_BASE + GIC_DIST_PENDING_SET + (j * 4) / 32);
307 gic_reg_dump("gic PENDING",j,RK_GICD_BASE + GIC_DIST_PENDING_SET);
313 for (j = 0; j < gic_irqs; j += 32)
314 context[i++]=readl_relaxed(RK_GICD_BASE + GIC_DIST_ENABLE_CLEAR + (j * 4) / 32);
316 gic_reg_dump("gic dis",j,RK_GICD_BASE + GIC_DIST_ENABLE_CLEAR);
319 for (j = 0; j < gic_irqs; j += 32)
320 context[i++]=readl_relaxed(RK_GICD_BASE + GIC_DIST_ENABLE_SET + (j * 4) / 32);
323 gic_reg_dump("gic en",j,RK_GICD_BASE + GIC_DIST_ENABLE_SET);
327 gic_reg_dump("gicc",0x1c,RK_GICC_BASE);
328 gic_reg_dump("giccfc",0,RK_GICC_BASE+0xfc);
330 context[i++]=readl_relaxed(RK_GICC_BASE + GIC_CPU_PRIMASK);
331 context[i++]=readl_relaxed(RK_GICC_BASE + GIC_CPU_CTRL);
332 context[i++]=readl_relaxed(RK_GICD_BASE + GIC_DIST_CTRL);
336 context[i++]=readl_relaxed(RK_GICC_BASE + GIC_CPU_BINPOINT);
337 context[i++]=readl_relaxed(RK_GICC_BASE + GIC_CPU_PRIMASK);
338 context[i++]=readl_relaxed(RK_GICC_BASE + GIC_DIST_SOFTINT);
339 context[i++]=readl_relaxed(RK_GICC_BASE + GIC_CPU_CTRL);
340 context[i++]=readl_relaxed(RK_GICD_BASE + GIC_DIST_CTRL);
342 #if 0 //rk319x is not need
344 for (j = irqstart; j < gic_irqs; j += 32)
346 writel_relaxed(0xffffffff, RK_GICD_BASE + GIC_DIST_ENABLE_CLEAR + j * 4 / 32);
354 static void rkpm_gic_dist_resume(u32 *context)
357 int i = 0,j,irqstart=0;
358 unsigned int gic_irqs;
361 gic_irqs = readl_relaxed(RK_GICD_BASE + GIC_DIST_CTR) & 0x1f;
362 gic_irqs = (gic_irqs + 1) * 32;
367 //gic_irqs = PM_IRQN_END;
368 irqstart=PM_IRQN_START;//PM_IRQN_START;
370 writel_relaxed(0,RK_GICC_BASE + GIC_CPU_CTRL);
372 writel_relaxed(0,RK_GICD_BASE + GIC_DIST_CTRL);
374 for (j = irqstart; j < gic_irqs; j += 32)
376 writel_relaxed(0xffffffff, RK_GICD_BASE + GIC_DIST_ENABLE_CLEAR + j * 4 / 32);
384 for (j = irqstart; j < gic_irqs; j += 16)
386 writel_relaxed(context[i++],RK_GICD_BASE + GIC_DIST_CONFIG + j * 4 / 16);
389 gic_reg_dump("gic level",j,RK_GICD_BASE + GIC_DIST_CONFIG);
392 * Set all global interrupts to this CPU only.
394 for (j = 0; j < gic_irqs; j += 4)
396 writel_relaxed(context[i++],RK_GICD_BASE + GIC_DIST_TARGET + (j * 4) / 4);
399 gic_reg_dump("gic target",j,RK_GICD_BASE + GIC_DIST_TARGET);
402 for (j = 0; j < gic_irqs; j += 4)
404 writel_relaxed(context[i++],RK_GICD_BASE+ GIC_DIST_PRI + (j * 4) / 4);
408 gic_reg_dump("gic pri",j,RK_GICD_BASE + GIC_DIST_PRI);
412 for (j = 0; j < gic_irqs; j += 32)
414 writel_relaxed(context[i++],RK_GICD_BASE + 0x80 + (j * 4 )/ 32);
416 sram_printhex((j * 4 )/ 32);
422 sram_printhex(readl_relaxed(RK_GICD_BASE + 0x80 + (j * 4 )/ 32));
429 gic_reg_dump("gic secu",j,RK_GICD_BASE + 0x80);
433 for (j = irqstart; j < gic_irqs; j += 32)
435 //writel_relaxed(context[i++],RK_GICD_BASE + GIC_DIST_PENDING_SET + j * 4 / 32);
439 gic_reg_dump("gic pending",j,RK_GICD_BASE + GIC_DIST_PENDING_SET);
444 for (j = 0; j < gic_irqs; j += 32)
446 writel_relaxed(context[i++],RK_GICD_BASE + GIC_DIST_ENABLE_CLEAR + j * 4 / 32);
450 gic_reg_dump("gic disable",j,RK_GICD_BASE + GIC_DIST_ENABLE_CLEAR);
453 //for (j = 0; j < gic_irqs; j += 32)
454 // writel_relaxed(0xffffffff,RK_GICD_BASE + GIC_DIST_ENABLE_CLEAR + j * 4 / 32);
459 for (j = 0; j < gic_irqs; j += 32)
461 writel_relaxed(context[i++],RK_GICD_BASE + GIC_DIST_ENABLE_SET + (j * 4) / 32);
466 gic_reg_dump("gic enable",j,RK_GICD_BASE + GIC_DIST_ENABLE_SET);
468 writel_relaxed(context[i++],RK_GICC_BASE + GIC_CPU_PRIMASK);
470 writel_relaxed(context[i++],RK_GICC_BASE + GIC_CPU_CTRL);
472 writel_relaxed(context[i++],RK_GICD_BASE + GIC_DIST_CTRL);
474 gic_reg_dump("gicc",0x1c,RK_GICC_BASE);
475 gic_reg_dump("giccfc",0,RK_GICC_BASE+0xfc);
479 /**************************************regs save and resume**************************/
481 void slp_regs_save(u32 *data,void __iomem * base,u32 st_offset,u32 end_offset)
484 u32 cnt=(end_offset-st_offset)/4+1;
487 data[i]=readl_relaxed(base+st_offset+i*4);
491 void slp_regs_resume(u32 *data,void __iomem * base,u32 st_offset,u32 end_offset,u32 w_msk)
494 u32 cnt=(end_offset-st_offset)/4+1;
497 reg_writel(data[i]|w_msk,(base+st_offset+i*4));
501 void slp_regs_w_msk_resume(u32 *data,void __iomem * base,u32 st_offset,u32 end_offset,u32 *w_msk)
504 u32 cnt=(end_offset-st_offset)/4+1;
507 reg_writel(data[i]|w_msk[i],(base+st_offset+i*4));
511 /**************************************uarts save and resume**************************/
513 #define RK3288_UART_NUM (4)
515 static void __iomem *slp_uart_base[RK3288_UART_NUM]={NULL};
516 static u32 slp_uart_phy[RK3288_UART_NUM]={(0xff180000),(0xff190000),(0xff690000),(0xff1b0000)};
518 static u32 slp_uart_data[RK3288_UART_NUM][10];
519 static u32 slp_uart_data_flag[RK3288_UART_NUM];
522 #define UART_DLL 0 /* Out: Divisor Latch Low */
523 #define UART_DLM 1 /* Out: Divisor Latch High */
528 #define UART_LCR 3 /* Out: Line Control Register */
531 void slp_uart_save(int ch)
534 void __iomem *b_addr=slp_uart_base[ch];
535 int idx=RK3288_CLKGATE_PCLK_UART0+ch;
537 if(b_addr==NULL || ch>=RK3288_UART_NUM)
542 idx=RK3288_CLKGATE_PCLK_UART2;
543 b_addr=RK_DEBUG_UART_VIRT;
547 gate_reg=cru_readl(RK3288_CRU_GATEID_CONS(idx));
548 RK3288_CRU_UNGATING_OPS(idx);
550 slp_uart_data[ch][i++]=readl_relaxed(b_addr+UART_LCR*4);
551 writel_relaxed(readl_relaxed(b_addr+UART_LCR*4)|0x80,b_addr+UART_LCR*4);
553 slp_uart_data[ch][i++]=readl_relaxed(b_addr+UART_DLL*4);
554 slp_uart_data[ch][i++]=readl_relaxed(b_addr+UART_DLM*4);
556 writel_relaxed(readl_relaxed(b_addr+UART_LCR*4)&(~0x80),b_addr+UART_LCR*4);
557 slp_uart_data[ch][i++]=readl_relaxed(b_addr+UART_IER*4);
558 slp_uart_data[ch][i++]=readl_relaxed(b_addr+UART_FCR*4);
559 slp_uart_data[ch][i++]=readl_relaxed(b_addr+UART_MCR*4);
561 cru_writel(gate_reg|CRU_W_MSK(idx%16,0x1),RK3288_CRU_GATEID_CONS(idx));
565 void slp_uart_resume(int ch)
570 void __iomem *b_addr=slp_uart_base[ch];
571 int idx=RK3288_CLKGATE_PCLK_UART0+ch;
574 //rkpm_ddr_printascii("\nch");
575 // rkpm_ddr_printhex(b_addr);
577 if(b_addr==NULL || ch>=RK3288_UART_NUM)
581 idx=RK3288_CLKGATE_PCLK_UART2;
583 //rkpm_ddr_printhex(ch);
585 gate_reg=cru_readl(RK3288_CRU_GATEID_CONS(idx));
586 RK3288_CRU_UNGATING_OPS(idx);
589 temp=slp_uart_data[ch][i++];
590 writel_relaxed(readl_relaxed(b_addr+UART_LCR*4)|0x80,b_addr+UART_LCR*4);
592 writel_relaxed(slp_uart_data[ch][i++],b_addr+UART_DLL*4);
593 writel_relaxed(slp_uart_data[ch][i++],b_addr+UART_DLM*4);
595 writel_relaxed(readl_relaxed(b_addr+UART_LCR*4)&(~0x80),b_addr+UART_LCR*4);
597 writel_relaxed(slp_uart_data[ch][i++],b_addr+UART_IER*4);
598 writel_relaxed(slp_uart_data[ch][i++],b_addr+UART_FCR*4);
599 writel_relaxed(slp_uart_data[ch][i++],b_addr+UART_MCR*4);
601 writel_relaxed(temp,b_addr+UART_LCR*4);
603 cru_writel(gate_reg|CRU_W_MSK(idx%16,0x1),RK3288_CRU_GATEID_CONS(idx));
606 /**************************************i2c save and resume**************************/
608 //#define RK3288_I2C_REG_DUMP
609 #define RK3288_I2C_NUM (6)
610 static u32 slp_i2c_phy[RK3288_I2C_NUM]={(0xff650000),(0xff140000),(0xff660000),(0xff150000),(0xff160000),(0xff170000)};
611 static void __iomem *slp_i2c_base[RK3288_I2C_NUM]={NULL};
613 static u32 slp_i2c_data[RK3288_I2C_NUM][10];
615 void slp_i2c_save(int ch)
618 void __iomem *b_addr=slp_i2c_base[ch];
619 int idx= (ch>1) ? (RK3288_CLKGATE_PCLK_I2C2+ch-2):(RK3288_CLKGATE_PCLK_I2C0+ch);
625 gate_reg=cru_readl(RK3288_CRU_GATEID_CONS(idx));
626 RK3288_CRU_UNGATING_OPS(idx);
628 #ifdef RK3288_I2C_REG_DUMP
629 rkpm_ddr_printascii("i2c save");
630 rkpm_ddr_printhex(ch);
631 rkpm_ddr_printch('\n');
632 rkpm_ddr_regs_dump(b_addr,0x0,0xc);
635 slp_regs_save(&slp_i2c_data[ch][0],b_addr,0x0,0xc);
638 cru_writel(gate_reg|CRU_W_MSK(idx%16,0x1),RK3288_CRU_GATEID_CONS(idx));
641 void slp_i2c_resume(int ch)
643 void __iomem *b_addr=slp_i2c_base[ch];
644 int idx= (ch>1) ? (RK3288_CLKGATE_PCLK_I2C2+ch-2):(RK3288_CLKGATE_PCLK_I2C0+ch);
649 gate_reg=cru_readl(RK3288_CRU_GATEID_CONS(idx));
650 RK3288_CRU_UNGATING_OPS(idx);
652 slp_regs_resume(&slp_i2c_data[ch][0],b_addr,0x0,0xc,0x0);
654 #ifdef RK3288_I2C_REG_DUMP
655 rkpm_ddr_printascii("i2c resume");
656 rkpm_ddr_printhex(ch);
657 rkpm_ddr_printch('\n');
658 rkpm_ddr_regs_dump(b_addr,0x0,0xc);
661 cru_writel(gate_reg|CRU_W_MSK(idx%16,0x1),RK3288_CRU_GATEID_CONS(idx));
664 /**************************************gpios save and resume**************************/
665 #define RK3288_GPIO_CH (9)
666 static u32 slp_gpio_data[RK3288_GPIO_CH][10];
667 static u32 slp_grf_iomux_data[RK3288_GPIO_CH*4];
668 static u32 slp_grf_io_pull_data[RK3288_GPIO_CH*4];
670 static void gpio_ddr_dump_reg(int ports)
672 void __iomem *b_addr=RK_GPIO_VIRT(ports);
674 rkpm_ddr_printascii("gpio-");
675 rkpm_ddr_printhex(ports);
676 rkpm_ddr_printhex('\n');
678 rkpm_ddr_reg_offset_dump(b_addr,GPIO_SWPORT_DR);
679 rkpm_ddr_reg_offset_dump(b_addr,GPIO_SWPORT_DDR);
680 rkpm_ddr_reg_offset_dump(b_addr,GPIO_INTEN);
681 rkpm_ddr_reg_offset_dump(b_addr,GPIO_INTMASK);
682 rkpm_ddr_reg_offset_dump(b_addr,GPIO_INTTYPE_LEVEL);
683 rkpm_ddr_reg_offset_dump(b_addr,GPIO_INT_POLARITY);
684 rkpm_ddr_reg_offset_dump(b_addr,GPIO_DEBOUNCE);
685 rkpm_ddr_reg_offset_dump(b_addr,GPIO_LS_SYNC);
686 rkpm_ddr_printhex('\n');
688 rkpm_ddr_printascii("iomux\n");
689 rkpm_ddr_regs_dump(RK_GRF_VIRT,0x0+ports*4*4,0x0+ports*4*4+3*4);
691 rkpm_ddr_printascii("iomux\n");
692 rkpm_ddr_regs_dump(RK_GRF_VIRT,0x130+ports*4*4,ports*4*4+3*4);
696 static void slp_pin_gpio_save(int ports)
699 void __iomem *b_addr=RK_GPIO_VIRT(ports);
700 int idx=RK3288_CLKGATE_PCLK_GPIO1+ports-1;
703 if(ports==0||ports>=RK3288_GPIO_CH)
706 gate_reg=cru_readl(RK3288_CRU_GATEID_CONS(idx));
707 RK3288_CRU_UNGATING_OPS(idx);
709 //gpio_ddr_dump_reg(ports);
711 slp_gpio_data[ports][i++]=readl_relaxed(b_addr+GPIO_SWPORT_DR);
712 slp_gpio_data[ports][i++]=readl_relaxed(b_addr+GPIO_SWPORT_DDR);
713 slp_gpio_data[ports][i++]=readl_relaxed(b_addr+GPIO_INTEN);
714 slp_gpio_data[ports][i++]=readl_relaxed(b_addr+GPIO_INTMASK);
715 slp_gpio_data[ports][i++]=readl_relaxed(b_addr+GPIO_INTTYPE_LEVEL);
716 slp_gpio_data[ports][i++]=readl_relaxed(b_addr+GPIO_INT_POLARITY);
717 slp_gpio_data[ports][i++]=readl_relaxed(b_addr+GPIO_DEBOUNCE);
718 slp_gpio_data[ports][i++]=readl_relaxed(b_addr+GPIO_LS_SYNC);
722 slp_regs_save(&slp_grf_iomux_data[ports*4],RK_GRF_VIRT,0x0+ports*4*4,0x0+ports*4*4+3*4);
723 slp_regs_save(&slp_grf_io_pull_data[ports*4],RK_GRF_VIRT,0x130+ports*4*4,ports*4*4+3*4);
727 cru_writel(gate_reg|CRU_W_MSK(idx%16,0x1),RK3288_CRU_GATEID_CONS(idx));
731 static void slp_pin_gpio_resume (int ports)
734 void __iomem *b_addr=RK_GPIO_VIRT(ports);
735 int idx=RK3288_CLKGATE_PCLK_GPIO1+ports-1;
738 if(ports==0||ports>=RK3288_GPIO_CH)
740 gate_reg=cru_readl(RK3288_CRU_GATEID_CONS(idx));
741 RK3288_CRU_UNGATING_OPS(idx);
746 slp_regs_resume(&slp_grf_iomux_data[ports*4],RK_GRF_VIRT,0x0+ports*4*4,0x0+ports*4*4+3*4,0xffff0000);
747 slp_regs_resume(&slp_grf_io_pull_data[ports*4],RK_GRF_VIRT,0x130+ports*4*4,ports*4*4+3*4,0xffff0000);
751 writel_relaxed(slp_gpio_data[ports][i++],b_addr+GPIO_SWPORT_DR);
752 writel_relaxed(slp_gpio_data[ports][i++],b_addr+GPIO_SWPORT_DDR);
753 writel_relaxed(slp_gpio_data[ports][i++],b_addr+GPIO_INTEN);
754 writel_relaxed(slp_gpio_data[ports][i++],b_addr+GPIO_INTMASK);
755 writel_relaxed(slp_gpio_data[ports][i++],b_addr+GPIO_INTTYPE_LEVEL);
756 writel_relaxed(slp_gpio_data[ports][i++],b_addr+GPIO_INT_POLARITY);
757 writel_relaxed(slp_gpio_data[ports][i++],b_addr+GPIO_DEBOUNCE);
758 writel_relaxed(slp_gpio_data[ports][i++],b_addr+GPIO_LS_SYNC);
760 //gpio_ddr_dump_reg(ports);
761 cru_writel(gate_reg|CRU_W_MSK(idx%16,0x1),RK3288_CRU_GATEID_CONS(idx));
765 static inline u32 rkpm_l2_config(void)
768 asm("mrc p15, 1, %0, c9, c0, 2" : "=r" (l2ctlr));
771 /**************************************sleep func**************************/
773 void ddr_reg_save(uint32_t *pArg);
774 void fiq_glue_resume(void);
775 void rk30_cpu_resume(void);
776 void rk30_l2_cache_init_pm(void);
777 //static void rk319x_pm_set_power_domain(enum pmu_power_domain pd, bool state);
778 void ddr_cfg_to_lp_mode(void);
779 void l2x0_inv_all_pm(void);
780 void rk30_cpu_while_tst(void);
783 static u32 slp_grf_soc_con_data[5];
784 static u32 slp_grf_soc_con_w_msk[5]={0x70000,0x40ff0000,0xffff0000,0xffff0000,0xffff0000};
786 static u32 slp_grf_cpu_con_data[5];
787 static u32 slp_grf_cpu_con_w_msk[5]={0xefff0000,0xffff0000,0xcfff0000,0xffff0000,0x7fff0000};
789 static u32 slp_grf_uoc0_con_data[4];
790 static u32 slp_grf_uoc0_con_w_msk[4]={0xffff0000,0xffff0000,0x7dff0000,0x7fff0000};// uoc0_con4 bit 15??
792 static u32 slp_grf_uoc1_con_data[2];
793 static u32 slp_grf_uoc1_con_w_msk[2]={0x1fdc0000,0x047f0000};
795 static u32 slp_grf_uoc2_con_data[2];
796 static u32 slp_grf_uoc2_con_w_msk[2]={0x7fff0000,0x1f0000};
798 static u32 slp_grf_uoc3_con_data[2];
799 static u32 slp_grf_uoc3_con_w_msk[2]={0x3ff0000,0x0fff0000};
802 static u32 slp_pmu_pwrmode_con_data[1];
805 static u32 slp_nandc_data[8];
806 static void __iomem *rk30_nandc_base=NULL;
811 void inline pm_io_base_map(void)
814 for(i=0;i<RK3288_I2C_NUM;i++)
815 slp_i2c_base[i] = ioremap(slp_i2c_phy[i], 0x1000);
817 for(i=0;i<RK3288_UART_NUM;i++)
819 if(i!=CONFIG_RK_DEBUG_UART)
820 slp_uart_base[i] = ioremap(slp_uart_phy[i], 0x1000);
822 slp_uart_base[i] = RK_DEBUG_UART_VIRT;
826 enum rk3288_pwr_mode_con {
829 pmu_clk_core_src_gate_en,
830 pmu_global_int_disable,
838 pmu_chip_pd_en, // power off pin enable
854 pmu_ddr0io_ret_de_req,
855 pmu_ddr1io_ret_de_req
858 enum rk3288_pwr_mode_con1 {
873 static u32 rk3288_powermode=0;
875 static void ddr_pin_set_fun(u8 port,u8 bank,u8 b_gpio,u8 fun);
877 static u32 sgrf_soc_con0,pmu_pwr_mode_con0,pmu_pwr_mode_con1;
879 static u32 rkpm_slp_mode_set(u32 ctrbits)
881 u32 mode_set,mode_set1;
883 // setting gpio0_a0 arm off pin
885 ddr_pin_set_fun(0x0,0xa,0x0,0x1);
887 sgrf_soc_con0=reg_readl(RK_SGRF_VIRT+RK3288_SGRF_SOC_CON0);
888 pmu_pwr_mode_con0=pmu_readl(RK3288_PMU_PWRMODE_CON);
889 pmu_pwr_mode_con1=pmu_readl(RK3288_PMU_PWRMODE_CON1);
891 //mode_set1=pmu_pwr_mode_con1;
892 //mode_set=pmu_pwr_mode_con0;
894 //pmu_writel(0x1<<3,RK3188_PMU_WAKEUP_CFG1);
895 pmu_writel(0x1<<0,RK3188_PMU_WAKEUP_CFG1);
898 reg_writel((0x1<<8)|(0x1<<(8+16)),RK_SGRF_VIRT+RK3288_SGRF_SOC_CON0);
901 reg_writel(RKPM_BOOTRAM_PHYS,RK_SGRF_VIRT+RK3288_SGRF_FAST_BOOT_ADDR);
904 mode_set= BIT(pmu_pwr_mode_en) |BIT(pmu_global_int_disable) | BIT(pmu_l2flush_en);
907 if(rkpm_chk_val_ctrbits(ctrbits,RKPM_CTR_IDLEAUTO_MD))
909 rkpm_ddr_printascii("-autoidle-");
910 mode_set|=BIT(pmu_clk_core_src_gate_en);
912 else if(rkpm_chk_val_ctrbits(ctrbits,RKPM_CTR_ARMDP_LPMD))
914 rkpm_ddr_printascii("-armdp-");
915 mode_set|=BIT(pmu_a12_0_pd_en);
917 else if(rkpm_chk_val_ctrbits(ctrbits,RKPM_CTR_ARMOFF_LPMD))
919 rkpm_ddr_printascii("-armoff-");
920 mode_set|=BIT(pmu_scu_en)
921 //|BIT(pmu_a12_0_pd_en)
922 |BIT(pmu_clk_core_src_gate_en) // »½ÐѺóÒì³£
923 |BIT(pmu_sref0_enter_en)|BIT(pmu_sref1_enter_en)
924 |BIT(pmu_ddr0_gating_en)|BIT(pmu_ddr1_gating_en)
925 //|BIT(pmu_ddr1io_ret_en)|BIT(pmu_ddr0io_ret_en)
926 |BIT(pmu_chip_pd_en);
927 mode_set1=BIT(pmu_clr_core)|BIT(pmu_clr_cpup)
934 else if(rkpm_chk_val_ctrbits(ctrbits,RKPM_CTR_ARMOFF_LOGDP_LPMD))
937 rkpm_ddr_printascii("-armoff-logdp-");
939 mode_set|=BIT(pmu_scu_en)|BIT(pmu_bus_pd_en)
941 |BIT(pmu_sref0_enter_en)|BIT(pmu_sref1_enter_en)
942 |BIT(pmu_ddr0_gating_en)|BIT(pmu_ddr1_gating_en)
943 |BIT(pmu_ddr1io_ret_en)|BIT(pmu_ddr0io_ret_en)
944 |BIT(pmu_osc_24m_dis)|BIT(pmu_pmu_use_lf)|BIT(pmu_alive_use_lf)
946 mode_set1=BIT(pmu_clr_core)|BIT(pmu_clr_cpup)
961 if(mode_set&BIT(pmu_osc_24m_dis))
963 rkpm_ddr_printascii("osc_off");
964 pmu_writel(32*30,RK3288_PMU_OSC_CNT);
965 pmu_writel(32*30,RK3288_PMU_STABL_CNT);
969 pmu_writel(24*1000*10,RK3288_PMU_STABL_CNT);
971 // pmu_writel(24*1000*20,RK3288_PMU_CORE_PWRDWN_CNT);
974 if(mode_set&BIT(pmu_ddr0io_ret_en))
976 rkpm_ddr_printascii("ddrc_off");
977 ddr_pin_set_fun(0x0,0xa,0x1,0x1);
978 ddr_pin_set_fun(0x0,0xa,0x2,0x1);
979 ddr_pin_set_fun(0x0,0xa,0x3,0x1);
982 pmu_writel(mode_set,RK3288_PMU_PWRMODE_CON);
983 pmu_writel(mode_set1,RK3288_PMU_PWRMODE_CON1);
985 // rkpm_ddr_printhex(mode_set);
986 // rkpm_ddr_printhex(pmu_readl(RK3288_PMU_PWRMODE_CON));
988 return (pmu_readl(RK3288_PMU_PWRMODE_CON));
991 static inline void rkpm_slp_mode_set_resume(void)
994 pmu_writel(pmu_pwr_mode_con0,RK3288_PMU_PWRMODE_CON);
995 pmu_writel(pmu_pwr_mode_con1,RK3288_PMU_PWRMODE_CON1);
996 reg_writel(sgrf_soc_con0|(0x1<<(8+16)),RK_SGRF_VIRT+RK3288_SGRF_SOC_CON0);
1000 static void sram_code_data_save(u32 pwrmode)
1002 char *code_src,*data_src;
1003 u32 code_size,data_size;
1004 u32 ddr_bits= RKPM_CTR_ARMLOGDP_LPMD|RKPM_CTR_ARMOFF_LOGDP_LPMD|RKPM_CTR_ARMLOGOFF_DLPMD;
1007 if(pwrmode&(BIT(pmu_scu_en)|BIT(pmu_a12_0_pd_en)))
1009 sleep_resume_data[RKPM_BOOTDATA_L2LTY_F]=1;
1010 sleep_resume_data[RKPM_BOOTDATA_L2LTY]=rkpm_l2_config();// in sys resume ,ddr is need resume
1011 sleep_resume_data[RKPM_BOOTDATA_CPUSP]=RKPM_BOOT_CPUSP_PHY;// in sys resume ,ddr is need resume
1012 sleep_resume_data[RKPM_BOOTDATA_CPUCODE]=virt_to_phys(cpu_resume);// in sys resume ,ddr is need resume
1016 sleep_resume_data[RKPM_BOOTDATA_CPUCODE]=0;
1020 if(pwrmode&BIT(pmu_bus_pd_en))
1022 sleep_resume_data[RKPM_BOOTDATA_DDR_F]=1;// in sys resume ,ddr is need resume
1023 sleep_resume_data[RKPM_BOOTDATA_DPLL_F]=1;// in ddr resume ,dpll is need resume
1024 code_src=(char *)ddr_get_resume_code_info(&code_size);
1025 sleep_resume_data[RKPM_BOOTDATA_DDRCODE]=RKPM_BOOT_DDRCODE_PHY;
1026 sleep_resume_data[RKPM_BOOTDATA_DDRDATA]=RKPM_BOOT_DDRCODE_PHY+RKPM_ALIGN(code_size,4);
1027 data_src=(char *)ddr_get_resume_data_info(&data_size);
1028 ddr_reg_save((u32 *)(resume_data_phy+RKPM_BOOTDATA_DPLL_F*4));
1032 sleep_resume_data[RKPM_BOOTDATA_DDR_F]=0;
1035 sram_data_for_sleep(boot_ram_data,int_ram_data,sleep_resume_data[RKPM_BOOTDATA_DDR_F]);
1039 local_flush_tlb_all();
1043 static inline void sram_code_data_resume(u32 pwrmode)
1045 if(pwrmode&(BIT(pmu_scu_en)|BIT(pmu_a12_0_pd_en)))
1047 sram_data_resume(boot_ram_data,int_ram_data,sleep_resume_data[RKPM_BOOTDATA_DDR_F]);
1052 static void rkpm_peri_save(u32 power_mode)
1056 if(power_mode&BIT(pmu_scu_en))
1058 rkpm_gic_dist_save(&slp_gic_save[0]);
1061 gpio_gate[0]=cru_readl(RK3288_CRU_GATEID_CONS(RK3288_CLKGATE_PCLK_GPIO0));
1062 gpio_gate[1]=cru_readl(RK3288_CRU_GATEID_CONS(RK3288_CLKGATE_PCLK_GPIO1));
1063 RK3288_CRU_UNGATING_OPS(RK3288_CLKGATE_PCLK_GPIO0);
1064 cru_writel(0xff<<(RK3288_CLKGATE_PCLK_GPIO1%16+16),
1065 RK3288_CRU_GATEID_CONS(RK3288_CLKGATE_PCLK_GPIO1));
1068 if(power_mode&BIT(pmu_bus_pd_en))
1073 ddr_pin_set_pull(7,0xc,0x6,RKPM_GPIO_PULL_UP);
1074 ddr_gpio_set_in_output(7,0xc,0x6,RKPM_GPIO_INPUT);
1075 ddr_pin_set_fun(7,0xc,0x6,0);
1077 ddr_pin_set_pull(7,0xc,0x7,RKPM_GPIO_PULL_UP);
1078 ddr_gpio_set_in_output(7,0xc,0x7,RKPM_GPIO_INPUT);
1079 ddr_pin_set_fun(7,0xc,0x7,0);
1083 ddr_pin_set_pull(0,0xb,0x7,RKPM_GPIO_PULL_UP);
1084 ddr_gpio_set_in_output(0,0xb,0x7,RKPM_GPIO_INPUT);
1085 ddr_pin_set_fun(0,0xb,0x7,0);
1087 ddr_pin_set_pull(0,0xc,0x0,RKPM_GPIO_PULL_UP);
1088 ddr_gpio_set_in_output(0,0xc,0x0,RKPM_GPIO_INPUT);
1089 ddr_pin_set_fun(0,0xc,0x0,0);
1091 slp_i2c_save(0);// i2c pmu gpio0b7 gpio0_c0
1092 //slp_i2c_save(2);//i2c audio
1096 cru_writel((0xff<<(RK3288_CLKGATE_PCLK_GPIO1%16+16))|gpio_gate[0],
1097 RK3288_CRU_GATEID_CONS(RK3288_CLKGATE_PCLK_GPIO1));
1098 cru_writel(gpio_gate[0]|CRU_W_MSK(RK3288_CLKGATE_PCLK_GPIO0%16,0x1),RK3288_CRU_GATEID_CONS(RK3288_CLKGATE_PCLK_GPIO0));
1103 static inline void rkpm_peri_resume(u32 power_mode)
1105 if(power_mode&BIT(pmu_scu_en))
1107 //fiq_glue_resume();
1108 rkpm_gic_dist_resume(&slp_gic_save[0]);
1110 //rkpm_ddr_printascii("gic res");
1112 if(power_mode&BIT(pmu_bus_pd_en))
1114 slp_i2c_resume(0);// i2c pmu
1115 slp_i2c_resume(2);//i2c audio
1120 static inline void rkpm_peri_resume_first(u32 power_mode)
1122 if(power_mode&BIT(pmu_bus_pd_en))
1126 static void rkpm_slp_setting(void)
1128 //rkpm_gic_disable(130);
1129 // rkpm_gic_disable(132);
1131 //rkpm_ddr_printhex(pmu_readl(RK3288_PMU_WAKEUP_CFG1));
1132 //rkpm_ddr_printhex(pmu_readl(RK3288_PMU_PWRMODE_CON));
1136 static void rkpm_save_setting_resume_first(void)
1138 rkpm_peri_resume_first(rk3288_powermode);
1140 // rkpm_ddr_printhex(cru_readl(RK3288_CRU_MODE_CON));
1142 //rk319x_pm_set_power_domain(PD_PERI,true);
1143 //slp_regs_resume(slp_grf_io_pull_data,(u32)RK_GRF_VIRT+0x144,16,0xffff0000);
1144 slp_pin_gpio_resume(1);
1145 slp_pin_gpio_resume(2);
1146 slp_pin_gpio_resume(3);
1147 slp_pin_gpio_resume(4);
1150 slp_regs_w_msk_resume(slp_grf_soc_con_data,(u32)RK_GRF_VIRT+0x60,5,slp_grf_soc_con_w_msk);
1151 slp_regs_w_msk_resume(slp_grf_cpu_con_data,(u32)RK_GRF_VIRT+0x9c,5,slp_grf_cpu_con_w_msk);
1153 slp_regs_w_msk_resume(slp_grf_uoc0_con_data,(u32)RK_GRF_VIRT+0xc4,4,slp_grf_uoc0_con_w_msk);
1154 slp_regs_w_msk_resume(slp_grf_uoc1_con_data,(u32)RK_GRF_VIRT+0xd4,2,slp_grf_uoc1_con_w_msk);
1155 slp_regs_w_msk_resume(slp_grf_uoc2_con_data,(u32)RK_GRF_VIRT+0xe4,2,slp_grf_uoc2_con_w_msk);
1156 slp_regs_w_msk_resume(slp_grf_uoc3_con_data,(u32)RK_GRF_VIRT+0xec,2,slp_grf_uoc3_con_w_msk);
1158 //sram_printch_uart_enable();
1165 static u32 rk3288_ctrbits=0;
1167 static void rkpm_save_setting(u32 ctrbits)
1169 //rk3288_ctrbits=ctrbits;
1170 rk3288_powermode=rkpm_slp_mode_set(ctrbits);
1171 if(rk3288_powermode&BIT(pmu_pwr_mode_en))
1173 sram_code_data_save(rk3288_powermode);
1174 rkpm_peri_save(rk3288_powermode);
1180 static void rkpm_save_setting_resume(void)
1183 if(rk3288_powermode&BIT(pmu_pwr_mode_en))
1185 sram_code_data_resume(rk3288_powermode);
1186 rkpm_peri_resume(rk3288_powermode);
1189 rkpm_slp_mode_set_resume();
1194 /*******************************common code for rkxxx*********************************/
1195 static void inline uart_printch(char byte)
1198 u32 u_clk_id=(RK3288_CLKGATE_UART0_SRC+CONFIG_RK_DEBUG_UART);
1199 u32 u_pclk_id=(RK3288_CLKGATE_PCLK_UART0+CONFIG_RK_DEBUG_UART);
1201 if(CONFIG_RK_DEBUG_UART==4)
1202 u_clk_id=RK3288_CLKGATE_UART4_SRC;
1203 if(CONFIG_RK_DEBUG_UART==2)
1204 u_pclk_id=RK3288_CLKGATE_PCLK_UART2;
1206 reg_save[0]=cru_readl(RK3288_CRU_GATEID_CONS(u_clk_id));
1207 reg_save[1]=cru_readl(RK3288_CRU_GATEID_CONS(u_pclk_id));
1208 RK3288_CRU_UNGATING_OPS(u_clk_id);
1209 RK3288_CRU_UNGATING_OPS(u_pclk_id);
1213 writel_relaxed(byte, RK_DEBUG_UART_VIRT);
1216 /* loop check LSR[6], Transmitter Empty bit */
1217 while (!(readl_relaxed(RK_DEBUG_UART_VIRT + 0x14) & 0x40))
1220 cru_writel(reg_save[0]|CRU_W_MSK(u_clk_id%16,0x1),RK3288_CRU_GATEID_CONS(u_clk_id));
1221 cru_writel(reg_save[1]|CRU_W_MSK(u_pclk_id%16,0x1),RK3288_CRU_GATEID_CONS(u_pclk_id));
1227 void PIE_FUNC(sram_printch)(char byte)
1232 static void pll_udelay(u32 udelay);
1234 static void ddr_printch(char byte)
1239 /*******************************gpio func*******************************************/
1240 //#define RK3288_PMU_GPIO0_A_IOMUX 0x0084
1241 //#define RK3288_PMU_GPIO0_B_IOMUX 0x0088
1242 //#define RK3288_PMU_GPIO0_C_IOMUX 0x008c
1243 //#define RK3288_PMU_GPIO0_D_IOMUX 0x0090
1244 //pin=0x0a21 gpio0a2,port=0,bank=a,b_gpio=2,fun=1
1245 static inline void pin_set_fun(u8 port,u8 bank,u8 b_gpio,u8 fun)
1255 off_set=RK3288_PMU_GPIO0_A_IOMUX+bank*4;
1256 pmu_writel(RKPM_VAL_SETBITS(pmu_readl(off_set),fun,b_gpio*2,0x3),off_set);
1261 off_set=port*(4*4)+bank*4;
1262 //form RK3288_GRF_GPIO1D_IOMUX
1263 reg_writel(RKPM_W_MSK_SETBITS(fun,b_gpio*2,0x3),RK_GRF_VIRT+0+off_set);
1267 static inline u8 pin_get_funset(u8 port,u8 bank,u8 b_gpio)
1276 off_set=RK3288_PMU_GPIO0_A_IOMUX+bank*4;
1277 return (pmu_readl(off_set)>>(b_gpio*2))&0x3;
1282 off_set=port*(4*4)+bank*4;
1283 //form RK3288_GRF_GPIO1D_IOMUX
1284 return (reg_readl(RK_GRF_VIRT+0+off_set)>>(b_gpio*2))&0x3;
1288 static inline void pin_set_pull(u8 port,u8 bank,u8 b_gpio,u8 pull)
1299 //gpio1_d==0x14c ,form gpio0_a to gpio1_d offset 1*16+3*4= 0x1c
1300 off_set=0x14c-0x1c+port*(4*4)+bank*4;
1301 reg_writel(RKPM_W_MSK_SETBITS(pull,b_gpio*2,0x3),RK_GRF_VIRT+off_set);
1306 if(bank>2)// gpio0_d is not support
1308 pmu_writel(RKPM_VAL_SETBITS(pmu_readl(0x64+bank*4),pull,b_gpio*2,0x3),0x64+bank*4);
1313 static inline u8 pin_get_pullset(u8 port,u8 bank,u8 b_gpio)
1324 //gpio1_d==0x14c ,form gpio0_a to gpio1_d offset 1*16+3*4= 0x1c
1325 off_set=0x14c-0x1c+port*(4*4)+bank*4;
1326 return RKPM_GETBITS(reg_readl(RK_GRF_VIRT+off_set),b_gpio*2,0x3);
1331 if(bank>2)// gpio0_d is not support
1333 return RKPM_GETBITS(pmu_readl(0x64+bank*4),b_gpio*2,0x3);
1340 static inline void gpio_set_in_output(u8 port,u8 bank,u8 b_gpio,u8 type)
1345 b_gpio=bank*8+b_gpio;//
1347 val=reg_readl(RK_GPIO_VIRT(port)+GPIO_SWPORT_DDR);
1349 if(type==RKPM_GPIO_OUTPUT)
1352 val&=~(0x1<<b_gpio);
1354 reg_writel(val,RK_GPIO_VIRT(port)+GPIO_SWPORT_DDR);
1357 static inline u8 gpio_get_in_outputset(u8 port,u8 bank,u8 b_gpio)
1360 b_gpio=bank*8+b_gpio;
1361 return reg_readl(RK_GPIO_VIRT(port)+GPIO_SWPORT_DDR)&(0x1<<b_gpio);
1364 //RKPM_GPIOS_OUT_L RKPM_GPIOS_OUT_H
1365 static inline void gpio_set_output_level(u8 port,u8 bank,u8 b_gpio,u8 level)
1370 b_gpio=bank*8+b_gpio;
1372 val=reg_readl(RK_GPIO_VIRT(port)+GPIO_SWPORT_DR);
1374 if(level==RKPM_GPIO_OUT_H)
1377 val&=~(0x1<<b_gpio);
1379 reg_writel(val,RK_GPIO_VIRT(port)+GPIO_SWPORT_DR);
1382 static inline u8 gpio_get_output_levelset(u8 port,u8 bank,u8 b_gpio)
1385 b_gpio=bank*8+b_gpio;
1386 return reg_readl(RK_GPIO_VIRT(port)+GPIO_SWPORT_DR)&(0x1<<b_gpio);
1389 static inline u8 gpio_get_input_level(u8 port,u8 bank,u8 b_gpio)
1393 b_gpio=bank*8+b_gpio;
1395 return (reg_readl(RK_GPIO_VIRT(port)+GPIO_EXT_PORT)>>b_gpio)&0x1;
1397 static inline void gpio_set_inten(u8 port,u8 bank,u8 b_gpio,u8 en)
1402 b_gpio=bank*8+b_gpio;
1404 val=reg_readl(RK_GPIO_VIRT(port)+GPIO_INTEN);
1405 rkpm_ddr_printascii("\n inten:");
1406 rkpm_ddr_printhex(val);
1408 rkpm_ddr_printascii("-");
1412 val&=~(0x1<<b_gpio);
1414 reg_writel(val,RK_GPIO_VIRT(port)+GPIO_INTEN);
1417 rkpm_ddr_printhex(val);
1418 rkpm_ddr_printascii("-");
1420 rkpm_ddr_printhex(reg_readl(RK_GPIO_VIRT(port)+GPIO_INTEN));
1422 rkpm_ddr_printascii("\n");
1427 static void __sramfunc sram_pin_set_fun(u8 port,u8 bank,u8 b_gpio,u8 fun)
1429 pin_set_fun(port,bank,b_gpio,fun);
1431 static u8 __sramfunc sram_pin_get_funset(u8 port,u8 bank,u8 b_gpio)
1433 return pin_get_funset(port,bank,b_gpio);
1436 static void __sramfunc sram_pin_set_pull(u8 port,u8 bank,u8 b_gpio,u8 fun)
1438 pin_set_pull(port,bank,b_gpio,fun);
1440 static u8 __sramfunc sram_pin_get_pullset(u8 port,u8 bank,u8 b_gpio)
1442 return pin_get_pullset(port,bank,b_gpio);
1445 static void __sramfunc sram_gpio_set_in_output(u8 port,u8 bank,u8 b_gpio,u8 type)
1447 gpio_set_in_output(port,bank,b_gpio,type);
1450 static u8 __sramfunc sram_gpio_get_in_outputset(u8 port,u8 bank,u8 b_gpio)
1452 return gpio_get_in_outputset(port,bank,b_gpio);
1455 static void __sramfunc sram_gpio_set_output_level(u8 port,u8 bank,u8 b_gpio,u8 level)
1458 gpio_set_output_level(port,bank,b_gpio,level);
1462 static u8 __sramfunc sram_gpio_get_output_levelset(u8 port,u8 bank,u8 b_gpio)
1464 return gpio_get_output_levelset(port,bank,b_gpio);
1467 static u8 __sramfunc sram_gpio_get_input_level(u8 port,u8 bank,u8 b_gpio)
1469 return gpio_get_input_level(port,bank,b_gpio);
1472 static void ddr_pin_set_fun(u8 port,u8 bank,u8 b_gpio,u8 fun)
1474 pin_set_fun(port,bank,b_gpio,fun);
1476 static u8 ddr_pin_get_funset(u8 port,u8 bank,u8 b_gpio)
1478 return pin_get_funset(port,bank,b_gpio);
1481 static void ddr_pin_set_pull(u8 port,u8 bank,u8 b_gpio,u8 fun)
1483 pin_set_pull(port,bank,b_gpio,fun);
1485 static u8 ddr_pin_get_pullset(u8 port,u8 bank,u8 b_gpio)
1487 return pin_get_pullset(port,bank,b_gpio);
1490 static void ddr_gpio_set_in_output(u8 port,u8 bank,u8 b_gpio,u8 type)
1492 gpio_set_in_output(port,bank,b_gpio,type);
1495 static u8 ddr_gpio_get_in_outputset(u8 port,u8 bank,u8 b_gpio)
1497 return gpio_get_in_outputset(port,bank,b_gpio);
1500 static void ddr_gpio_set_output_level(u8 port,u8 bank,u8 b_gpio,u8 level)
1502 gpio_set_output_level(port,bank,b_gpio,level);
1505 static u8 ddr_gpio_get_output_levelset(u8 port,u8 bank,u8 b_gpio)
1507 return gpio_get_output_levelset(port,bank,b_gpio);
1510 static u8 ddr_gpio_get_input_level(u8 port,u8 bank,u8 b_gpio)
1512 return gpio_get_input_level(port,bank,b_gpio);
1517 static void __sramfunc rkpm_pin_gpio_config_sram(u32 pin_gpio_bits,u32 *save_bits)
1521 u8 port,bank,b_gpio,fun,in_out, level, pull;
1523 pins=RKPM_PINGPIO_BITS_PIN(pin_gpio_bits);
1524 in_out=RKPM_PINGPIO_BITS_INOUT(pin_gpio_bits);
1525 pull=RKPM_PINGPIO_BITS_PULL(pin_gpio_bits);
1526 level=RKPM_PINGPIO_BITS_LEVEL(pin_gpio_bits);
1528 port=RKPM_PINBITS_PORT(pins);
1529 bank=RKPM_PINBITS_BANK(pins);
1530 b_gpio=RKPM_PINBITS_BGPIO(pins);
1531 fun=RKPM_PINBITS_FUN(pins);
1536 pins=RKPM_PINBITS_SET_FUN(pins,sram_pin_get_funset(port,bank,b_gpio));
1537 *save_bits=RKPM_PINGPIO_BITS(pins,sram_pin_get_pullset(port,bank,b_gpio),sram_gpio_get_in_outputset(port,bank,b_gpio),
1538 sram_gpio_get_output_levelset(port,bank,b_gpio));
1540 if(!fun&&(in_out==RKPM_GPIO_OUTPUT))
1542 if(level==RKPM_GPIO_OUT_L)
1543 pull=RKPM_GPIO_PULL_DN;
1545 pull=RKPM_GPIO_PULL_UP;
1547 sram_gpio_set_output_level(port,bank,b_gpio,level);
1550 sram_pin_set_pull(port,bank,b_gpio,pull);
1551 sram_pin_set_fun(port,bank,b_gpio,fun);
1555 sram_gpio_set_in_output(port,bank,b_gpio,in_out);
1560 static inline void rkpm_pin_gpio_config_ddr(u32 pin_gpio_bits,u32 *save_bits)
1564 u8 port,bank,b_gpio,fun,in_out, level, pull;
1566 pins=RKPM_PINGPIO_BITS_PIN(pin_gpio_bits);
1567 in_out=RKPM_PINGPIO_BITS_INOUT(pin_gpio_bits);
1568 pull=RKPM_PINGPIO_BITS_PULL(pin_gpio_bits);
1569 level=RKPM_PINGPIO_BITS_LEVEL(pin_gpio_bits);
1571 port=RKPM_PINBITS_PORT(pins);
1572 bank=RKPM_PINBITS_BANK(pins);
1573 b_gpio=RKPM_PINBITS_BGPIO(pins);
1574 fun=RKPM_PINBITS_FUN(pins);
1579 pins=RKPM_PINBITS_SET_FUN(pins,ddr_pin_get_funset(port,bank,b_gpio));
1580 *save_bits=RKPM_PINGPIO_BITS(pins,ddr_pin_get_pullset(port,bank,b_gpio),ddr_gpio_get_in_outputset(port,bank,b_gpio),
1581 ddr_gpio_get_output_levelset(port,bank,b_gpio));
1583 if(!fun&&(in_out==RKPM_GPIO_OUTPUT))
1585 if(level==RKPM_GPIO_OUT_L)
1586 pull=RKPM_GPIO_PULL_DN;
1588 pull=RKPM_GPIO_PULL_UP;
1590 ddr_gpio_set_output_level(port,bank,b_gpio,level);
1593 ddr_pin_set_pull(port,bank,b_gpio,pull);
1594 ddr_pin_set_fun(port,bank,b_gpio,fun);
1598 ddr_gpio_set_in_output(port,bank,b_gpio,in_out);
1604 #define GPIO_DTS_NUM 10
1606 static u32 gpio_dts_save[GPIO_DTS_NUM];
1607 static u32 gpio_dts[GPIO_DTS_NUM];
1609 #define PMICGPIO_DTS_NUM 3
1612 u32 DEFINE_PIE_DATA(pmicgpio_dts[PMICGPIO_DTS_NUM]);
1613 static u32 *p_pmicgpio_dts;
1614 static __sramdata u32 pmicgpio_dts_save[PMICGPIO_DTS_NUM];
1616 static void __sramfunc pmic_gpio_suspend(void)
1621 if(DATA(pmicgpio_dts[i]))
1622 rkpm_pin_gpio_config_sram(DATA(pmicgpio_dts[i]),& pmicgpio_dts_save[i]);
1625 pmicgpio_dts_save[i]=0;
1632 rkpm_sram_reg_dump(RK_GPIO_VIRT(i),0,0x4);
1635 rkpm_sram_reg_dump(RK_GRF_VIRT,0xc,0x84);
1636 rkpm_sram_reg_dump(RK_GRF_VIRT,0x14c,0x1b4);
1637 rkpm_sram_reg_dump(RK_PMU_VIRT,0x64,0x6c);
1638 rkpm_sram_reg_dump(RK_PMU_VIRT,0x84,0x9c);
1643 static void __sramfunc pmic_gpio_resume(void)
1648 if(pmicgpio_dts_save[i])
1649 rkpm_pin_gpio_config_sram(pmicgpio_dts_save[i],NULL);
1654 void PIE_FUNC(pmic_suspend)(void)
1656 pmic_gpio_suspend();
1660 void PIE_FUNC(pmic_resume)(void)
1666 static void rkpm_gpio_suspend(void)
1671 if(DATA(pmicgpio_dts[i]))
1672 rkpm_pin_gpio_config_ddr(DATA(pmicgpio_dts[i]),& pmicgpio_dts_save[i]);
1675 pmicgpio_dts_save[i]=0;
1682 rkpm_ddr_reg_dump(RK_GPIO_VIRT(i),0,0x4);
1685 rkpm_ddr_reg_dump(RK_GRF_VIRT,0xc,0x84);
1686 rkpm_ddr_reg_dump(RK_GRF_VIRT,0x14c,0x1b4);
1687 rkpm_ddr_reg_dump(RK_PMU_VIRT,0x64,0x6c);
1688 rkpm_ddr_reg_dump(RK_PMU_VIRT,0x84,0x9c);
1693 static void rkpm_gpio_resume(void)
1698 if(pmicgpio_dts_save[i])
1699 rkpm_pin_gpio_config_ddr(pmicgpio_dts_save[i],NULL);
1703 static void gpio_get_dts_info(struct device_node *parent)
1707 for(i=0;i<PMICGPIO_DTS_NUM;i++)
1708 p_pmicgpio_dts[i]=0;
1710 for(i=0;i<GPIO_DTS_NUM;i++)
1714 p_pmicgpio_dts= kern_to_pie(rockchip_pie_chunk, &DATA(pmicgpio_dts[0]));
1716 if(of_property_read_u32_array(parent,"rockchip,pmic-gpios",p_pmicgpio_dts,PMICGPIO_DTS_NUM))
1718 p_pmicgpio_dts[0]=0;
1719 PM_ERR("%s:get pm ctr error\n",__FUNCTION__);
1722 for(i=0;i<PMICGPIO_DTS_NUM;i++)
1723 printk("%s:pmic gpio(%x)\n",__FUNCTION__,p_pmicgpio_dts[i]);
1725 if(of_property_read_u32_array(parent,"rockchip,pm-gpios",gpio_dts,GPIO_DTS_NUM))
1728 PM_ERR("%s:get pm ctr error\n",__FUNCTION__);
1730 for(i=0;i<GPIO_DTS_NUM;i++)
1731 printk("%s:pmic gpio(%x)\n",__FUNCTION__,gpio_dts[i]);
1733 rkpm_set_ops_gpios(rkpm_gpio_suspend,rkpm_gpio_resume);
1734 rkpm_set_sram_ops_gtclks(fn_to_pie(rockchip_pie_chunk, &FUNC(pmic_suspend)),
1735 fn_to_pie(rockchip_pie_chunk, &FUNC(pmic_resume)));
1740 /*******************************clk gating config*******************************************/
1741 #define CLK_MSK_GATING(msk, con) cru_writel((msk << 16) | 0xffff, con)
1742 #define CLK_MSK_UNGATING(msk, con) cru_writel(((~msk) << 16) | 0xffff, con)
1745 static u32 clk_ungt_msk[RK3288_CRU_CLKGATES_CON_CNT];// first clk gating setting
1746 static u32 clk_ungt_msk_1[RK3288_CRU_CLKGATES_CON_CNT];// first clk gating setting
1747 static u32 clk_ungt_save[RK3288_CRU_CLKGATES_CON_CNT]; //first clk gating value saveing
1750 u32 DEFINE_PIE_DATA(rkpm_clkgt_last_set[RK3288_CRU_CLKGATES_CON_CNT]);
1751 static u32 *p_rkpm_clkgt_last_set;
1753 static __sramdata u32 rkpm_clkgt_last_save[RK3288_CRU_CLKGATES_CON_CNT];
1755 void PIE_FUNC(gtclks_sram_suspend)(void)
1758 // u32 u_clk_id=(RK3188_CLKGATE_UART0_SRC+CONFIG_RK_DEBUG_UART);
1759 // u32 u_pclk_id=(RK3188_CLKGATE_PCLK_UART0+CONFIG_RK_DEBUG_UART);
1761 for(i=0;i<RK3288_CRU_CLKGATES_CON_CNT;i++)
1763 rkpm_clkgt_last_save[i]=cru_readl(RK3288_CRU_CLKGATES_CON(i));
1764 CLK_MSK_UNGATING( DATA(rkpm_clkgt_last_set[i]), RK3288_CRU_CLKGATES_CON(i));
1766 rkpm_sram_printch('\n');
1767 rkpm_sram_printhex(DATA(rkpm_clkgt_last_save[i]));
1768 rkpm_sram_printch('-');
1769 rkpm_sram_printhex(DATA(rkpm_clkgt_last_set[i]));
1770 rkpm_sram_printch('-');
1771 rkpm_sram_printhex(cru_readl(RK3188_CRU_CLKGATES_CON(i)));
1772 if(i==(RK3288_CRU_CLKGATES_CON_CNT-1))
1773 rkpm_sram_printch('\n');
1777 //RK3288_CRU_UNGATING_OPS(u_clk_id);
1778 //RK3288_CRU_UNGATING_OPS(u_pclk_id);
1782 void PIE_FUNC(gtclks_sram_resume)(void)
1785 for(i=0;i<RK3288_CRU_CLKGATES_CON_CNT;i++)
1787 cru_writel(rkpm_clkgt_last_save[i]|0xffff0000, RK3288_CRU_CLKGATES_CON(i));
1791 static void gtclks_suspend(void)
1795 // rkpm_ddr_regs_dump(RK_CRU_VIRT,RK3288_CRU_CLKGATES_CON(0)
1796 // ,RK3288_CRU_CLKGATES_CON(RK3288_CRU_CLKGATES_CON_CNT-1));
1797 for(i=0;i<RK3288_CRU_CLKGATES_CON_CNT;i++)
1799 clk_ungt_save[i]=cru_readl(RK3288_CRU_CLKGATES_CON(i));
1803 // RK3288_CRU_CLKGATES_CON(i)==0x160 ||
1804 //RK3288_CRU_CLKGATES_CON(i)==0x164 ||
1805 //RK3288_CRU_CLKGATES_CON(i)==0x168 ||
1806 // RK3288_CRU_CLKGATES_CON(i)==0x16c ||
1807 //RK3288_CRU_CLKGATES_CON(i)==0x170 ||
1808 // RK3288_CRU_CLKGATES_CON(i)==0x174 ||
1809 // RK3288_CRU_CLKGATES_CON(i)==0x178 ||
1812 //RK3288_CRU_CLKGATES_CON(i)==0x17c ||
1813 // RK3288_CRU_CLKGATES_CON(i)==0x180 ||
1814 // RK3288_CRU_CLKGATES_CON(i)==0x184 ||
1815 // RK3288_CRU_CLKGATES_CON(i)==0x188 ||
1816 //RK3288_CRU_CLKGATES_CON(i)==0x18c ||
1817 //RK3288_CRU_CLKGATES_CON(i)==0x190 ||
1818 //RK3288_CRU_CLKGATES_CON(i)==0x194 ||
1819 //RK3288_CRU_CLKGATES_CON(i)==0x198 ||
1820 //RK3288_CRU_CLKGATES_CON(i)==0x19c ||
1821 //RK3288_CRU_CLKGATES_CON(i)==0x1a0 ||
1822 //RK3288_CRU_CLKGATES_CON(i)==0x1a4 ||
1823 // RK3288_CRU_CLKGATES_CON(i)==0x1a8
1824 RK3288_CRU_CLKGATES_CON(i)==0xfff
1828 cru_writel(0xffff0000, RK3288_CRU_CLKGATES_CON(i));
1829 // CLK_MSK_UNGATING(clk_ungt_msk[i],RK3288_CRU_CLKGATES_CON(i));
1835 // if(RK3288_CRU_CLKGATES_CON(i)!=0x188 )
1836 CLK_MSK_UNGATING(clk_ungt_msk[i],RK3288_CRU_CLKGATES_CON(i));
1839 rkpm_ddr_printch('\n');
1840 rkpm_ddr_printhex(RK3288_CRU_CLKGATES_CON(i));
1841 rkpm_ddr_printch('-');
1842 rkpm_ddr_printhex(clk_ungt_msk[i]);
1843 rkpm_ddr_printch('-');
1844 rkpm_ddr_printhex(cru_readl(RK3288_CRU_CLKGATES_CON(i))) ;
1845 if(i==(RK3288_CRU_CLKGATES_CON_CNT-1))
1846 rkpm_ddr_printch('\n');
1852 static void gtclks_resume(void)
1855 for(i=0;i<RK3288_CRU_CLKGATES_CON_CNT;i++)
1857 cru_writel(clk_ungt_save[i]|0xffff0000,RK3288_CRU_CLKGATES_CON(i));
1859 //rkpm_ddr_regs_dump(RK_CRU_VIRT,RK3288_CRU_CLKGATES_CON(0)
1860 // ,RK3288_CRU_CLKGATES_CON(RK3288_CRU_CLKGATES_CON_CNT-1));
1863 /********************************pll power down***************************************/
1865 static void pm_pll_wait_lock(u32 pll_idx)
1867 u32 delay = 600000U;
1869 // mode=cru_readl(RK3288_CRU_MODE_CON);
1877 if ((cru_readl(RK3288_PLL_CONS(pll_idx,1))&(0x1<<31)))
1882 rkpm_ddr_printascii("unlock-pll:");
1883 rkpm_ddr_printhex(pll_idx);
1884 rkpm_ddr_printch('\n');
1886 //cru_writel(mode|(RK3288_PLL_MODE_MSK(pll_idx)<<16), RK3288_CRU_MODE_CON);
1889 static void pll_udelay(u32 udelay)
1892 mode=cru_readl(RK3288_CRU_MODE_CON);
1894 cru_writel(RK3288_PLL_MODE_SLOW(APLL_ID), RK3288_CRU_MODE_CON);
1896 rkpm_udelay(udelay*5);
1898 cru_writel(mode|(RK3288_PLL_MODE_MSK(APLL_ID)<<16), RK3288_CRU_MODE_CON);
1901 static u32 plls_con0_save[END_PLL_ID];
1902 static u32 plls_con1_save[END_PLL_ID];
1903 static u32 plls_con2_save[END_PLL_ID];
1904 static u32 plls_con3_save[END_PLL_ID];
1906 static u32 cru_mode_con;
1908 static inline void plls_suspend(u32 pll_id)
1910 plls_con0_save[pll_id]=cru_readl(RK3288_PLL_CONS((pll_id), 0));
1911 plls_con1_save[pll_id]=cru_readl(RK3288_PLL_CONS((pll_id), 1));
1912 plls_con2_save[pll_id]=cru_readl(RK3288_PLL_CONS((pll_id), 2));
1913 plls_con3_save[pll_id]=cru_readl(RK3288_PLL_CONS((pll_id), 3));
1915 cru_writel(RK3288_PLL_PWR_DN, RK3288_PLL_CONS((pll_id), 3));
1918 static inline void plls_resume(u32 pll_id)
1920 u32 pllcon0, pllcon1, pllcon2;
1922 if((plls_con3_save[pll_id]&RK3288_PLL_PWR_DN_MSK))
1926 cru_writel(RK3288_PLL_MODE_SLOW(pll_id), RK3288_CRU_MODE_CON);
1928 cru_writel(RK3288_PLL_PWR_ON, RK3288_PLL_CONS((pll_id),3));
1929 cru_writel(RK3288_PLL_NO_BYPASS, RK3288_PLL_CONS((pll_id),3));
1931 pllcon0 =plls_con0_save[pll_id];// cru_readl(RK3288_PLL_CONS((pll_id),0));
1932 pllcon1 = plls_con1_save[pll_id];//cru_readl(RK3288_PLL_CONS((pll_id),1));
1933 pllcon2 = plls_con2_save[pll_id];//cru_readl(RK3288_PLL_CONS((pll_id),2));
1936 cru_writel(RK3288_PLL_RESET, RK3288_PLL_CONS(pll_id,3));
1937 cru_writel(pllcon0|CRU_W_MSK(0,0xf)|CRU_W_MSK(8,0x3f), RK3288_PLL_CONS(pll_id,0));
1938 cru_writel(pllcon1, RK3288_PLL_CONS(pll_id,1));
1939 cru_writel(pllcon2, RK3288_PLL_CONS(pll_id,2));
1942 //udelay(5); //timer7 delay
1945 cru_writel(RK3288_PLL_RESET_RESUME, RK3288_PLL_CONS(pll_id,3));
1949 pm_pll_wait_lock(pll_id);
1951 cru_writel(plls_con3_save[pll_id]|(RK3288_PLL_BYPASS_MSK<<16),RK3288_PLL_CONS(pll_id,3));
1955 static u32 clk_sel0,clk_sel1, clk_sel10,clk_sel26,clk_sel33,clk_sel36, clk_sel37;
1957 static void pm_plls_suspend(void)
1960 // rkpm_ddr_regs_dump(RK_CRU_VIRT,RK3288_PLL_CONS((0), 0),RK3288_PLL_CONS((4), 3));
1961 // rkpm_ddr_regs_dump(RK_CRU_VIRT,RK3288_CRU_MODE_CON,RK3288_CRU_MODE_CON);
1962 // rkpm_ddr_regs_dump(RK_CRU_VIRT,RK3288_CRU_CLKSELS_CON(0),RK3288_CRU_CLKSELS_CON(42));
1964 clk_sel0=cru_readl(RK3288_CRU_CLKSELS_CON(0));
1965 clk_sel1=cru_readl(RK3288_CRU_CLKSELS_CON(1));
1966 clk_sel10=cru_readl(RK3288_CRU_CLKSELS_CON(10));
1967 clk_sel26=cru_readl(RK3288_CRU_CLKSELS_CON(26));
1968 clk_sel33=cru_readl(RK3288_CRU_CLKSELS_CON(33));
1969 clk_sel36=cru_readl(RK3288_CRU_CLKSELS_CON(36));
1970 clk_sel37=cru_readl(RK3288_CRU_CLKSELS_CON(37));
1972 cru_mode_con = cru_readl(RK3288_CRU_MODE_CON);
1975 cru_writel(RK3288_PLL_MODE_SLOW(NPLL_ID), RK3288_CRU_MODE_CON);
1976 plls_suspend(NPLL_ID);
1979 cru_writel(RK3288_PLL_MODE_SLOW(CPLL_ID), RK3288_CRU_MODE_CON);
1982 cru_writel(RK3288_PLL_MODE_SLOW(GPLL_ID), RK3288_CRU_MODE_CON);
1984 // set 1,pdbus pll is gpll
1985 cru_writel(CRU_W_MSK_SETBITS(1,15,0x1), RK3288_CRU_CLKSELS_CON(1)); // 0 cpll 1gpll
1989 |CRU_W_MSK_SETBITS(0,0,0x7) // 1 aclk
1990 |CRU_W_MSK_SETBITS(0,3,0x1f) // 1 aclk src
1991 |CRU_W_MSK_SETBITS(0,8,0x3) // 1 hclk 0~1 1 2 4
1992 |CRU_W_MSK_SETBITS(0,12,0x7) // 3 pclk
1993 , RK3288_CRU_CLKSELS_CON(1));
1996 cru_writel(CRU_W_MSK_SETBITS(3,6,0x3), RK3288_CRU_CLKSELS_CON(26));
1998 // peri aclk hclk pclk
2000 |CRU_W_MSK_SETBITS(0,0,0x1f) // 1 aclk
2001 |CRU_W_MSK_SETBITS(0,8,0x3) // 2 hclk 0 1:1,1 2:1 ,2 4:1
2002 |CRU_W_MSK_SETBITS(0,12,0x3)// 2 0~3 1 2 4 8 div
2003 , RK3288_CRU_CLKSELS_CON(10));
2005 cru_writel(clk_sel33|CRU_W_MSK_SETBITS(0,0,0x1f)|CRU_W_MSK_SETBITS(0,8,0x1f), RK3288_CRU_CLKSELS_CON(33));
2007 plls_suspend(CPLL_ID);
2008 plls_suspend(GPLL_ID);
2011 cru_writel(RK3288_PLL_MODE_SLOW(APLL_ID), RK3288_CRU_MODE_CON);
2012 // core_m0 core_mp a12_core
2014 |CRU_W_MSK_SETBITS(0,0,0xf) // 1 axi_mo
2015 |CRU_W_MSK_SETBITS(0,4,0xf) // 3 axi mp
2016 |CRU_W_MSK_SETBITS(0,8,0x1f) // 0 a12 core div
2017 , RK3288_CRU_CLKSELS_CON(0));
2018 // core0 core1 core2 core3
2020 |CRU_W_MSK_SETBITS(0,0,0x7) //core 0 div
2021 |CRU_W_MSK_SETBITS(0,4,0x7) // core 1
2022 |CRU_W_MSK_SETBITS(0,8,0x7) // core2
2023 |CRU_W_MSK_SETBITS(0,12,0x7)//core3
2024 , RK3288_CRU_CLKSELS_CON(36));
2028 |CRU_W_MSK_SETBITS(3,0,0x7) // l2ram
2029 |CRU_W_MSK_SETBITS(0xf,4,0x1f) // atclk
2030 |CRU_W_MSK_SETBITS(0xf,9,0x1f) // pclk dbg
2031 , RK3288_CRU_CLKSELS_CON(37));
2034 |CRU_W_MSK_SETBITS(0,0,0x7) // l2ram
2035 |CRU_W_MSK_SETBITS(0x2,4,0x1f) // atclk
2036 |CRU_W_MSK_SETBITS(0x2,9,0x1f) // pclk dbg
2037 , RK3288_CRU_CLKSELS_CON(37));
2041 plls_suspend(APLL_ID);
2045 static void pm_plls_resume(void)
2049 // core_m0 core_mp a12_core
2050 cru_writel(clk_sel0|(CRU_W_MSK(0,0xf)|CRU_W_MSK(4,0xf)|CRU_W_MSK(8,0xf)),RK3288_CRU_CLKSELS_CON(0));
2051 // core0 core1 core2 core3
2052 cru_writel(clk_sel36|(CRU_W_MSK(0,0x7)|CRU_W_MSK(4,0x7)|CRU_W_MSK(8,0x7)|CRU_W_MSK(12,0x7))
2053 , RK3288_CRU_CLKSELS_CON(36));
2055 cru_writel(clk_sel37|(CRU_W_MSK(0,0x7)|CRU_W_MSK(4,0x1f)|CRU_W_MSK(9,0x1f)) , RK3288_CRU_CLKSELS_CON(37));
2057 plls_resume(APLL_ID);
2058 cru_writel(cru_mode_con|(RK3288_PLL_MODE_MSK(APLL_ID)<<16), RK3288_CRU_MODE_CON);
2060 // peri aclk hclk pclk
2061 cru_writel(clk_sel10|(CRU_W_MSK(0,0x1f)|CRU_W_MSK(8,0x3)|CRU_W_MSK(12,0x3))
2062 , RK3288_CRU_CLKSELS_CON(10));
2064 cru_writel(clk_sel1|CRU_W_MSK(15,0x1), RK3288_CRU_CLKSELS_CON(1));
2066 cru_writel(clk_sel1|(CRU_W_MSK(0,0x7)|CRU_W_MSK(3,0x1f)|CRU_W_MSK(8,0x3)|CRU_W_MSK(12,0x7))
2067 , RK3288_CRU_CLKSELS_CON(1));
2070 cru_writel(clk_sel26|CRU_W_MSK(6,0x3), RK3288_CRU_CLKSELS_CON(26));
2074 cru_writel(clk_sel33|CRU_W_MSK(0,0x1f)|CRU_W_MSK(8,0x1f), RK3288_CRU_CLKSELS_CON(33));
2076 plls_resume(GPLL_ID);
2077 cru_writel(cru_mode_con|(RK3288_PLL_MODE_MSK(GPLL_ID)<<16), RK3288_CRU_MODE_CON);
2079 plls_resume(CPLL_ID);
2080 cru_writel(cru_mode_con|(RK3288_PLL_MODE_MSK(CPLL_ID)<<16), RK3288_CRU_MODE_CON);
2082 plls_resume(NPLL_ID);
2083 cru_writel(cru_mode_con|(RK3288_PLL_MODE_MSK(NPLL_ID)<<16), RK3288_CRU_MODE_CON);
2085 // rkpm_ddr_regs_dump(RK_CRU_VIRT,RK3288_PLL_CONS((0), 0),RK3288_PLL_CONS((4), 3));
2086 // rkpm_ddr_regs_dump(RK_CRU_VIRT,RK3288_CRU_MODE_CON,RK3288_CRU_MODE_CON);
2087 // rkpm_ddr_regs_dump(RK_CRU_VIRT,RK3288_CRU_CLKSELS_CON(0),RK3288_CRU_CLKSELS_CON(42));
2091 static __sramdata u32 sysclk_clksel0_con,sysclk_clksel1_con,sysclk_clksel10_con,sysclk_mode_con;
2093 void PIE_FUNC(sysclk_suspend)(u32 sel_clk)
2097 sysclk_clksel0_con = cru_readl(RK3288_CRU_CLKSELS_CON(0));
2098 sysclk_clksel1_con = cru_readl(RK3288_CRU_CLKSELS_CON(1));
2099 sysclk_clksel10_con= cru_readl(RK3288_CRU_CLKSELS_CON(10));
2102 if(sel_clk&(RKPM_CTR_SYSCLK_32K))
2105 sysclk_mode_con= cru_readl(RK3288_CRU_MODE_CON);
2107 |RK3288_PLL_MODE_DEEP(APLL_ID)| RK3288_PLL_MODE_DEEP(CPLL_ID)
2108 | RK3288_PLL_MODE_DEEP(GPLL_ID)|RK3288_PLL_MODE_DEEP(NPLL_ID)
2109 , RK3288_CRU_MODE_CON);
2111 else if(sel_clk&(RKPM_CTR_SYSCLK_DIV))
2116 cru_writel(CRU_W_MSK_SETBITS(div,8,0x1f), RK3188_CRU_CLKSELS_CON(0)); //pd core
2117 cru_writel(CRU_W_MSK_SETBITS(div,3,0x1f), RK3188_CRU_CLKSELS_CON(1));//pd bus
2118 cru_writel(CRU_W_MSK_SETBITS(div,0,0x1f), RK3188_CRU_CLKSELS_CON(10));//pd peri
2122 void PIE_FUNC(sysclk_resume)(u32 sel_clk)
2125 cru_writel(sysclk_clksel0_con|CRU_W_MSK(8,0x1f), RK3188_CRU_CLKSELS_CON(0)); //pd core
2126 cru_writel(sysclk_clksel1_con|CRU_W_MSK(3,0x1f), RK3188_CRU_CLKSELS_CON(1));//pd bus
2127 cru_writel(sysclk_clksel10_con|CRU_W_MSK(0,0x1f), RK3188_CRU_CLKSELS_CON(10));//pd peri
2128 cru_writel(sysclk_mode_con|(RK3288_PLL_MODE_MSK(APLL_ID)<<16)
2129 |(RK3288_PLL_MODE_MSK(CPLL_ID)<<16)
2130 |(RK3288_PLL_MODE_MSK(GPLL_ID)<<16)
2131 |(RK3288_PLL_MODE_MSK(NPLL_ID)<<16), RK3288_CRU_MODE_CON);
2136 static void clks_gating_suspend_init(void)
2138 // get clk gating info
2139 if(rockchip_pie_chunk)
2140 p_rkpm_clkgt_last_set= kern_to_pie(rockchip_pie_chunk, &DATA(rkpm_clkgt_last_set[0]));
2142 p_rkpm_clkgt_last_set=&clk_ungt_msk_1[0];
2143 if(clk_suspend_clkgt_info_get(clk_ungt_msk,p_rkpm_clkgt_last_set, RK3288_CRU_CLKGATES_CON_CNT)
2144 ==RK3288_CRU_CLKGATES_CON(0))
2146 rkpm_set_ops_gtclks(gtclks_suspend,gtclks_resume);
2147 if(rockchip_pie_chunk)
2148 rkpm_set_sram_ops_gtclks(fn_to_pie(rockchip_pie_chunk, &FUNC(gtclks_sram_suspend)),
2149 fn_to_pie(rockchip_pie_chunk, &FUNC(gtclks_sram_resume)));
2151 PM_LOG("%s:clkgt info ok\n",__FUNCTION__);
2154 if(rockchip_pie_chunk)
2155 rkpm_set_sram_ops_sysclk(fn_to_pie(rockchip_pie_chunk, &FUNC(sysclk_suspend))
2156 ,fn_to_pie(rockchip_pie_chunk, &FUNC(sysclk_resume)));
2159 /***************************prepare and finish reg_pread***********************************/
2163 #define GIC_DIST_PENDING_SET 0x200
2164 #define DUMP_GPIO_INT_STATUS(ID) \
2166 if (irq_gpio & (1 << ID)) \
2167 printk("wakeup gpio" #ID ": %08x\n", readl_relaxed(RK_GPIO_VIRT(ID) + GPIO_INT_STATUS)); \
2169 static noinline void rk30_pm_dump_irq(void)
2171 u32 irq_gpio = (readl_relaxed(RK_GIC_VIRT + GIC_DIST_PENDING_SET + 12) >> 17) & 0x1FF;
2172 printk("wakeup irq: %08x %08x %08x %08x\n",
2173 readl_relaxed(RK_GIC_VIRT + GIC_DIST_PENDING_SET + 4),
2174 readl_relaxed(RK_GIC_VIRT + GIC_DIST_PENDING_SET + 8),
2175 readl_relaxed(RK_GIC_VIRT + GIC_DIST_PENDING_SET + 12),
2176 readl_relaxed(RK_GIC_VIRT + GIC_DIST_PENDING_SET + 16));
2177 DUMP_GPIO_INT_STATUS(0);
2178 DUMP_GPIO_INT_STATUS(1);
2179 DUMP_GPIO_INT_STATUS(2);
2180 DUMP_GPIO_INT_STATUS(3);
2181 DUMP_GPIO_INT_STATUS(4);
2182 DUMP_GPIO_INT_STATUS(5);
2183 DUMP_GPIO_INT_STATUS(6);
2184 DUMP_GPIO_INT_STATUS(7);
2185 DUMP_GPIO_INT_STATUS(8);
2189 #define DUMP_GPIO_INTEN(ID) \
2191 u32 en = readl_relaxed(RK_GPIO_VIRT(ID) + GPIO_INTEN); \
2193 rkpm_ddr_printascii("GPIO" #ID "_INTEN: "); \
2194 rkpm_ddr_printhex(en); \
2195 rkpm_ddr_printch('\n'); \
2196 printk(KERN_DEBUG "GPIO%d_INTEN: %08x\n", ID, en); \
2200 //dump while irq is enable
2201 static noinline void rk30_pm_dump_inten(void)
2214 static void rkpm_prepare(void)
2217 u32 temp =reg_readl(RK_GPIO_VIRT(0)+0x30);
2219 // rkpm_ddr_printhex(temp);
2220 reg_writel(temp|0x1<<4,RK_GPIO_VIRT(0)+0x30);
2221 temp =reg_readl(RK_GPIO_VIRT(0)+0x30);
2222 // rkpm_ddr_printhex(temp);
2224 // dump GPIO INTEN for debug
2225 rk30_pm_dump_inten();
2228 static void rkpm_finish(void)
2234 static void interface_ctr_reg_pread(void)
2239 local_flush_tlb_all();
2240 #if 0 // do it in ddr suspend
2241 for (addr = (u32)SRAM_CODE_OFFSET; addr < (u32)(SRAM_CODE_OFFSET+rockchip_sram_size); addr += PAGE_SIZE)
2242 readl_relaxed(addr);
2244 readl_relaxed(RK_PMU_VIRT);
2245 readl_relaxed(RK_GRF_VIRT);
2246 readl_relaxed(RK_DDR_VIRT);
2247 readl_relaxed(RK_GPIO_VIRT(0));
2248 //readl_relaxed(RK30_I2C1_BASE+SZ_4K);
2249 //readl_relaxed(RK_GPIO_VIRT(3));
2251 void PIE_FUNC(ddr_leakage_tst)(void)
2253 cru_writel(RK3288_PLL_MODE_SLOW(DPLL_ID), RK3288_CRU_MODE_CON);
2254 rkpm_sram_printch('\n');
2255 rkpm_sram_printch('t');
2256 rkpm_sram_printch('e');
2257 rkpm_sram_printch('s');
2258 rkpm_sram_printch('t');
2262 static void __init rk3288_suspend_init(void)
2264 struct device_node *parent;
2267 PM_LOG("%s enter\n",__FUNCTION__);
2269 parent = of_find_node_by_name(NULL, "rockchip_suspend");
2271 if (IS_ERR_OR_NULL(parent)) {
2272 PM_ERR("%s dev node err\n", __func__);
2277 if(of_property_read_u32_array(parent,"rockchip,ctrbits",&pm_ctrbits,1))
2279 PM_ERR("%s:get pm ctr error\n",__FUNCTION__);
2282 PM_LOG("%s: pm_ctrbits =%x\n",__FUNCTION__,pm_ctrbits);
2284 memset(&sleep_resume_data[0],0,sizeof(sleep_resume_data));
2285 rkpm_set_ctrbits(pm_ctrbits);
2287 clks_gating_suspend_init();
2289 rkpm_set_ops_plls(pm_plls_suspend,pm_plls_resume);
2291 //rkpm_set_sram_ops_ddr(fn_to_pie(rockchip_pie_chunk, &FUNC(ddr_leakage_tst)),NULL);
2293 rkpm_set_ops_prepare_finish(rkpm_prepare,rkpm_finish);
2295 //rkpm_set_ops_regs_pread(interface_ctr_reg_pread);
2297 rkpm_set_ops_save_setting(rkpm_save_setting,rkpm_save_setting_resume);
2298 rkpm_set_ops_regs_sleep(rkpm_slp_setting,rkpm_save_setting_resume_first);//rkpm_slp_setting
2300 if(rockchip_pie_chunk)
2301 rkpm_set_sram_ops_printch(fn_to_pie(rockchip_pie_chunk, &FUNC(sram_printch)));
2303 rkpm_set_ops_printch(ddr_printch);