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>
28 /*************************cru define********************************************/
29 #define RK3288_CRU_UNGATING_OPS(id) cru_writel(CRU_W_MSK_SETBITS(0,id%16,0x1),RK3288_CRU_GATEID_CONS(id))
30 #define RK3288_CRU_GATING_OPS(id) cru_writel(CRU_W_MSK_SETBITS(1,id%16,0x1),RK3288_CRU_GATEID_CONS(id))
32 /*******************************gpio define **********************************************/
34 /* GPIO control registers */
35 #define GPIO_SWPORT_DR 0x00
36 #define GPIO_SWPORT_DDR 0x04
37 #define GPIO_INTEN 0x30
38 #define GPIO_INTMASK 0x34
39 #define GPIO_INTTYPE_LEVEL 0x38
40 #define GPIO_INT_POLARITY 0x3c
41 #define GPIO_INT_STATUS 0x40
42 #define GPIO_INT_RAWSTATUS 0x44
43 #define GPIO_DEBOUNCE 0x48
44 #define GPIO_PORTS_EOI 0x4c
45 #define GPIO_EXT_PORT 0x50
46 #define GPIO_LS_SYNC 0x60
48 /***********************************sleep func*********************************************/
50 // sys resume data in boot ram
51 #define SLP_DATA_SAVE_PHY (RK3288_BOOTRAM_PHYS+PM_BOOT_CODE_OFFSET+PM_BOOT_CODE_SIZE)
52 #define SLP_DATA_SAVE_BASE (RK_BOOTRAM_VIRT+PM_BOOT_CODE_OFFSET+PM_BOOT_CODE_SIZE)
54 // ddr resume data in boot ram
55 #define SLP_DDR_DATA_SAVE_PHY (RK3288_BOOTRAM_PHYS + PM_BOOT_DDR_CODE_OFFSET)
56 #define SLP_DDR_DATA_SAVE_BASE (RK_BOOTRAM_VIRT+PM_BOOT_DDR_CODE_OFFSET)
58 #define PM_BOOT_DDR_CODE_OFFSET (((PM_BOOT_CODE_OFFSET+PM_BOOT_CODE_SIZE+PM_BOOT_DATA_SIZE)/4+2)*4)
59 #define PM_BOOT_CODE_SP (RK3288_BOOTRAM_PHYS+((RK3288_BOOTRAM_SIZE-1)&~0x7))
62 #define BOOT_RAM_SIZE (4*1024)
63 #define INT_RAM_SIZE (64*1024)
65 static char boot_ram_data[BOOT_RAM_SIZE+4*10];
66 static char int_ram_data[INT_RAM_SIZE];
69 // the value is used to control cpu resume flow
70 static u32 sleep_resume_data[SLPDATA_SLEEP_RES_CON_CNT];
71 static char *resume_data_base=(char *)(SLP_DATA_SAVE_BASE);
72 static char *resume_data_phy= (char *)(SLP_DATA_SAVE_PHY);
74 static void sram_code_reset(char *data, char *save, char* sram_base,char* sram_phy,u32 _size)
76 char *addr_d=(char *)sram_base;
79 memcpy(save,addr_d, _size);
81 memcpy((char *)addr_d,(char *)data, _size);
82 flush_icache_range((unsigned long)addr_d, (unsigned long)addr_d + _size);
83 outer_clean_range((phys_addr_t) sram_phy, _size);
94 static void sram_data_for_sleep(char *boot_save, char *int_save)
97 char *addr_base,*addr_phy,*data_src,*data_dst;
98 u32 sr_size,data_size;
100 addr_base=(char *)RK_BOOTRAM_VIRT;
101 addr_phy=(char *)RK3288_BOOTRAM_PHYS;
102 sr_size=RK3288_BOOTRAM_SIZE;
106 memcpy(boot_save,addr_base, sr_size);
108 // move resume code and date to boot sram
110 data_dst=(char *)RK_BOOTRAM_VIRT+PM_BOOT_CODE_OFFSET;
111 data_src=(char *)rkpm_slp_cpu_resume;
112 data_size=PM_BOOT_CODE_SIZE;
113 memcpy((char *)data_dst,(char *)data_src, data_size);
116 data_dst=(char *)resume_data_base;
117 data_src=(char *)sleep_resume_data;
118 data_size=sizeof(sleep_resume_data);
119 memcpy((char *)data_dst,(char *)data_src, data_size);
121 /*************************ddr code cpy*************************************/
123 data_dst=(char *)(char *)SLP_DDR_DATA_SAVE_BASE;
124 data_src=(char *)ddr_get_resume_code_info(&data_size);
126 data_size=(data_size/4+1)*4;
128 memcpy((char *)data_dst,(char *)data_src, data_size);
131 data_dst=(char *)(data_dst+data_size);
133 data_src=(char *)ddr_get_resume_data_info(&data_size);
134 data_size=(data_size/4+1)*4;
135 memcpy((char *)data_dst,(char *)data_src, data_size);
137 /*************************ddr code cpy end*************************************/
139 flush_icache_range((unsigned long)addr_base, (unsigned long)addr_base + sr_size);
140 outer_clean_range((phys_addr_t) addr_phy, (phys_addr_t)(addr_phy)+sr_size);
142 /*************************int mem bak*************************************/
144 addr_base=(char *)rockchip_sram_virt;
145 //addr_phy=(char *)RK319X_IMEM_PHYS;
146 sr_size=rockchip_sram_size;
149 memcpy(int_save,addr_base, sr_size);
151 flush_icache_range((unsigned long)addr_base, (unsigned long)addr_base + sr_size);
152 // outer_clean_range((phys_addr_t) addr_phy, sr_size);
156 static void sram_data_resume(char *boot_save, char *int_save)
159 char *addr_base,*addr_phy;
162 addr_base=(char *)RK_BOOTRAM_VIRT;
163 addr_phy=(char *)RK3288_BOOTRAM_PHYS;
164 sr_size=RK3288_BOOTRAM_SIZE;
167 memcpy(addr_base,boot_save, sr_size);
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);
174 addr_base=(char *)RK319X_IMEM_BASE;
175 addr_phy=(char *)RK319X_IMEM_PHYS;
176 sr_size=RK319X_IMEM_SIZE;
179 memcpy(addr_base, int_save,sr_size);
181 flush_icache_range((unsigned long)addr_base, (unsigned long)addr_base + sr_size);
182 outer_clean_range((phys_addr_t) addr_phy, sr_size);
186 /**************************************gic save and resume**************************/
187 #define RK_GICD_BASE (RK_GIC_VIRT)
188 #define RK_GICC_BASE (RK_GIC_VIRT+RK3288_GIC_DIST_SIZE)
190 #define PM_IRQN_START 32
191 #define PM_IRQN_END 107//107
192 static void pm_gic_enable(u32 irqs)
197 void __iomem *reg_off;
198 unsigned int gic_irqs;
200 gic_irqs = PM_IRQN_END;
201 irqstart=PM_IRQN_START;//PM_IRQN_START;
203 reg_off=(irqs/32)*4+GIC_DIST_ENABLE_SET+RK_GICD_BASE;
205 writel_relaxed(readl_relaxed(reg_off)|(1<<bit_off),reg_off);
210 static void rkpm_gic_disable(u32 irqs)
214 void __iomem *reg_off;
215 unsigned int gic_irqs;
217 gic_irqs = PM_IRQN_END;
218 irqstart=PM_IRQN_START;//PM_IRQN_START;
220 reg_off=(irqs/32)*4+GIC_DIST_ENABLE_CLEAR+RK_GICD_BASE;
222 writel_relaxed(readl_relaxed(reg_off)&~(1<<bit_off),reg_off);
226 #define gic_reg_dump(a,b,c) {}//reg_dump((a),(b),(c))
228 static u32 slp_gic_save[260+50];
230 static void rkpm_gic_dist_save(u32 *context)
232 int i = 0,j,irqstart=0;
233 unsigned int gic_irqs;
235 gic_irqs = readl_relaxed(RK_GICD_BASE + GIC_DIST_CTR) & 0x1f;
236 gic_irqs = (gic_irqs + 1) * 32;
239 //printk("gic_irqs=%d\n",gic_irqs);
240 //gic_irqs = PM_IRQN_END;
241 irqstart=PM_IRQN_START;//PM_IRQN_START;
245 for (j = irqstart; j < gic_irqs; j += 16)
246 context[i++]=readl_relaxed(RK_GICD_BASE + GIC_DIST_CONFIG + (j * 4) / 16);
247 gic_reg_dump("gic level",j,RK_GICD_BASE + GIC_DIST_CONFIG);
250 * Set all global interrupts to this CPU only.
252 for(j = 0; j < gic_irqs; j += 4)
253 context[i++]=readl_relaxed(RK_GICD_BASE + GIC_DIST_TARGET + (j * 4) / 4);
255 gic_reg_dump("gic trig",j,RK_GICD_BASE + GIC_DIST_TARGET);
258 for (j = 0; j < gic_irqs; j += 4)
259 context[i++]=readl_relaxed(RK_GICD_BASE+ GIC_DIST_PRI + (j * 4) / 4);
260 gic_reg_dump("gic pri",j,RK_GICD_BASE + GIC_DIST_PRI);
266 for (j = 0; j < gic_irqs; j += 32)
267 context[i++]=readl_relaxed(RK_GICD_BASE + 0x80 + (j * 4) / 32);
268 gic_reg_dump("gic secure",j,RK_GICD_BASE + 0x80);
270 for (j = irqstart; j < gic_irqs; j += 32)
271 context[i++]=readl_relaxed(RK_GICD_BASE + GIC_DIST_PENDING_SET + (j * 4) / 32);
273 gic_reg_dump("gic PENDING",j,RK_GICD_BASE + GIC_DIST_PENDING_SET);
279 for (j = 0; j < gic_irqs; j += 32)
280 context[i++]=readl_relaxed(RK_GICD_BASE + GIC_DIST_ENABLE_CLEAR + (j * 4) / 32);
282 gic_reg_dump("gic dis",j,RK_GICD_BASE + GIC_DIST_ENABLE_CLEAR);
285 for (j = 0; j < gic_irqs; j += 32)
286 context[i++]=readl_relaxed(RK_GICD_BASE + GIC_DIST_ENABLE_SET + (j * 4) / 32);
289 gic_reg_dump("gic en",j,RK_GICD_BASE + GIC_DIST_ENABLE_SET);
293 gic_reg_dump("gicc",0x1c,RK_GICC_BASE);
294 gic_reg_dump("giccfc",0,RK_GICC_BASE+0xfc);
296 context[i++]=readl_relaxed(RK_GICC_BASE + GIC_CPU_PRIMASK);
297 context[i++]=readl_relaxed(RK_GICC_BASE + GIC_CPU_CTRL);
298 context[i++]=readl_relaxed(RK_GICD_BASE + GIC_DIST_CTRL);
302 context[i++]=readl_relaxed(RK_GICC_BASE + GIC_CPU_BINPOINT);
303 context[i++]=readl_relaxed(RK_GICC_BASE + GIC_CPU_PRIMASK);
304 context[i++]=readl_relaxed(RK_GICC_BASE + GIC_DIST_SOFTINT);
305 context[i++]=readl_relaxed(RK_GICC_BASE + GIC_CPU_CTRL);
306 context[i++]=readl_relaxed(RK_GICD_BASE + GIC_DIST_CTRL);
308 #if 0 //rk319x is not need
309 for (j = irqstart; j < gic_irqs; j += 32)
311 writel_relaxed(0xffffffff, RK_GICD_BASE + GIC_DIST_ENABLE_CLEAR + j * 4 / 32);
319 static void rkpm_gic_dist_resume(u32 *context)
322 int i = 0,j,irqstart=0;
323 unsigned int gic_irqs;
325 gic_irqs = readl_relaxed(RK_GICD_BASE + GIC_DIST_CTR) & 0x1f;
326 gic_irqs = (gic_irqs + 1) * 32;
331 //gic_irqs = PM_IRQN_END;
332 irqstart=PM_IRQN_START;//PM_IRQN_START;
334 writel_relaxed(0,RK_GICC_BASE + GIC_CPU_CTRL);
336 writel_relaxed(0,RK_GICD_BASE + GIC_DIST_CTRL);
338 for (j = irqstart; j < gic_irqs; j += 32)
340 writel_relaxed(0xffffffff, RK_GICD_BASE + GIC_DIST_ENABLE_CLEAR + j * 4 / 32);
348 for (j = irqstart; j < gic_irqs; j += 16)
350 writel_relaxed(context[i++],RK_GICD_BASE + GIC_DIST_CONFIG + j * 4 / 16);
353 gic_reg_dump("gic level",j,RK_GICD_BASE + GIC_DIST_CONFIG);
356 * Set all global interrupts to this CPU only.
358 for (j = 0; j < gic_irqs; j += 4)
360 writel_relaxed(context[i++],RK_GICD_BASE + GIC_DIST_TARGET + (j * 4) / 4);
363 gic_reg_dump("gic target",j,RK_GICD_BASE + GIC_DIST_TARGET);
366 for (j = 0; j < gic_irqs; j += 4)
368 writel_relaxed(context[i++],RK_GICD_BASE+ GIC_DIST_PRI + (j * 4) / 4);
372 gic_reg_dump("gic pri",j,RK_GICD_BASE + GIC_DIST_PRI);
376 for (j = 0; j < gic_irqs; j += 32)
378 writel_relaxed(context[i++],RK_GICD_BASE + 0x80 + (j * 4 )/ 32);
380 sram_printhex((j * 4 )/ 32);
386 sram_printhex(readl_relaxed(RK_GICD_BASE + 0x80 + (j * 4 )/ 32));
393 gic_reg_dump("gic secu",j,RK_GICD_BASE + 0x80);
397 for (j = irqstart; j < gic_irqs; j += 32)
399 //writel_relaxed(context[i++],RK_GICD_BASE + GIC_DIST_PENDING_SET + j * 4 / 32);
403 gic_reg_dump("gic pending",j,RK_GICD_BASE + GIC_DIST_PENDING_SET);
408 for (j = 0; j < gic_irqs; j += 32)
410 writel_relaxed(context[i++],RK_GICD_BASE + GIC_DIST_ENABLE_CLEAR + j * 4 / 32);
414 gic_reg_dump("gic disable",j,RK_GICD_BASE + GIC_DIST_ENABLE_CLEAR);
417 //for (j = 0; j < gic_irqs; j += 32)
418 // writel_relaxed(0xffffffff,RK_GICD_BASE + GIC_DIST_ENABLE_CLEAR + j * 4 / 32);
423 for (j = 0; j < gic_irqs; j += 32)
425 writel_relaxed(context[i++],RK_GICD_BASE + GIC_DIST_ENABLE_SET + (j * 4) / 32);
430 gic_reg_dump("gic enable",j,RK_GICD_BASE + GIC_DIST_ENABLE_SET);
432 writel_relaxed(context[i++],RK_GICC_BASE + GIC_CPU_PRIMASK);
434 writel_relaxed(context[i++],RK_GICC_BASE + GIC_CPU_CTRL);
436 writel_relaxed(context[i++],RK_GICD_BASE + GIC_DIST_CTRL);
438 gic_reg_dump("gicc",0x1c,RK_GICC_BASE);
439 gic_reg_dump("giccfc",0,RK_GICC_BASE+0xfc);
445 /**************************************regs save and resume**************************/
446 void slp_regs_save(u32 *data,void __iomem * base,u32 st_offset,u32 end_offset)
449 u32 cnt=(end_offset-st_offset)/4+1;
452 data[i]=readl_relaxed(base+st_offset+i*4);
456 void slp_regs_resume(u32 *data,void __iomem * base,u32 st_offset,u32 end_offset,u32 w_msk)
459 u32 cnt=(end_offset-st_offset)/4+1;
462 reg_writel(data[i]|w_msk,(base+st_offset+i*4));
466 void slp_regs_w_msk_resume(u32 *data,void __iomem * base,u32 st_offset,u32 end_offset,u32 *w_msk)
469 u32 cnt=(end_offset-st_offset)/4+1;
472 reg_writel(data[i]|w_msk[i],(base+st_offset+i*4));
476 /**************************************uarts save and resume**************************/
478 #define RK3288_UART_NUM (4)
480 static void __iomem *slp_uart_base[RK3288_UART_NUM]={NULL};
481 static u32 slp_uart_phy[RK3288_UART_NUM]={(0xff180000),(0xff190000),(0xff690000),(0xff1b0000)};
483 static u32 slp_uart_data[RK3288_UART_NUM][10];
485 #define UART_DLL 0 /* Out: Divisor Latch Low */
486 #define UART_DLM 1 /* Out: Divisor Latch High */
491 #define UART_LCR 3 /* Out: Line Control Register */
494 void slp_uart_save(int ch)
497 void __iomem *b_addr=slp_uart_base[ch];
498 int idx=RK3288_CLKGATE_PCLK_UART0+ch;
500 if(b_addr==NULL || ch>=RK3288_UART_NUM)
504 idx=RK3288_CLKGATE_PCLK_UART2;
505 b_addr=RK_DEBUG_UART_VIRT;
509 gate_reg=cru_readl(RK3288_CRU_GATEID_CONS(idx));
510 RK3288_CRU_UNGATING_OPS(idx);
512 slp_uart_data[ch][i++]=readl_relaxed(b_addr+UART_LCR*4);
513 writel_relaxed(readl_relaxed(b_addr+UART_LCR*4)|0x80,b_addr+UART_LCR*4);
515 slp_uart_data[ch][i++]=readl_relaxed(b_addr+UART_DLL*4);
516 slp_uart_data[ch][i++]=readl_relaxed(b_addr+UART_DLM*4);
518 writel_relaxed(readl_relaxed(b_addr+UART_LCR*4)&(~0x80),b_addr+UART_LCR*4);
519 slp_uart_data[ch][i++]=readl_relaxed(b_addr+UART_IER*4);
520 slp_uart_data[ch][i++]=readl_relaxed(b_addr+UART_FCR*4);
521 slp_uart_data[ch][i++]=readl_relaxed(b_addr+UART_MCR*4);
523 cru_writel(gate_reg|CRU_W_MSK(idx%16,0x1),RK3288_CRU_GATEID_CONS(idx));
527 void slp_uart_resume(int ch)
532 void __iomem *b_addr=slp_uart_base[ch];
533 int idx=RK3288_CLKGATE_PCLK_UART0+ch;
536 if(b_addr==NULL || ch>=RK3288_UART_NUM)
540 idx=RK3288_CLKGATE_PCLK_UART2;
543 gate_reg=cru_readl(RK3288_CRU_GATEID_CONS(idx));
544 RK3288_CRU_UNGATING_OPS(idx);
547 temp=slp_uart_data[ch][i++];
548 writel_relaxed(readl_relaxed(b_addr+UART_LCR*4)|0x80,b_addr+UART_LCR*4);
550 writel_relaxed(slp_uart_data[ch][i++],b_addr+UART_DLL*4);
551 writel_relaxed(slp_uart_data[ch][i++],b_addr+UART_DLM*4);
553 writel_relaxed(readl_relaxed(b_addr+UART_LCR*4)&(~0x80),b_addr+UART_LCR*4);
555 writel_relaxed(slp_uart_data[ch][i++],b_addr+UART_IER*4);
556 writel_relaxed(slp_uart_data[ch][i++],b_addr+UART_FCR*4);
557 writel_relaxed(slp_uart_data[ch][i++],b_addr+UART_MCR*4);
559 writel_relaxed(temp,b_addr+UART_LCR*4);
561 cru_writel(gate_reg|CRU_W_MSK(idx%16,0x1),RK3288_CRU_GATEID_CONS(idx));
564 /**************************************i2c save and resume**************************/
566 //#define RK3288_I2C_REG_DUMP
567 #define RK3288_I2C_NUM (6)
568 static u32 slp_i2c_phy[RK3288_I2C_NUM]={(0xff650000),(0xff140000),(0xff660000),(0xff150000),(0xff160000),(0xff170000)};
569 static void __iomem *slp_i2c_base[RK3288_I2C_NUM]={NULL};
571 static u32 slp_i2c_data[RK3288_I2C_NUM][10];
573 void slp_i2c_save(int ch)
576 void __iomem *b_addr=slp_i2c_base[ch];
577 int idx= (ch>1) ? (RK3288_CLKGATE_PCLK_I2C2+ch-2):(RK3288_CLKGATE_PCLK_I2C0+ch);
583 gate_reg=cru_readl(RK3288_CRU_GATEID_CONS(idx));
584 RK3288_CRU_UNGATING_OPS(idx);
586 #ifdef RK3288_I2C_REG_DUMP
587 rkpm_ddr_printascii("i2c save");
588 rkpm_ddr_printhex(ch);
589 rkpm_ddr_printch('\n');
590 rkpm_ddr_regs_dump(b_addr,0x0,0xc);
593 slp_regs_save(&slp_i2c_data[ch][0],b_addr,0x0,0xc);
596 cru_writel(gate_reg|CRU_W_MSK(idx%16,0x1),RK3288_CRU_GATEID_CONS(idx));
599 void slp_i2c_resume(int ch)
601 void __iomem *b_addr=slp_i2c_base[ch];
602 int idx= (ch>1) ? (RK3288_CLKGATE_PCLK_I2C2+ch-2):(RK3288_CLKGATE_PCLK_I2C0+ch);
607 gate_reg=cru_readl(RK3288_CRU_GATEID_CONS(idx));
608 RK3288_CRU_UNGATING_OPS(idx);
610 slp_regs_resume(&slp_i2c_data[ch][0],b_addr,0x0,0xc,0x0);
612 #ifdef RK3288_I2C_REG_DUMP
613 rkpm_ddr_printascii("i2c resume");
614 rkpm_ddr_printhex(ch);
615 rkpm_ddr_printch('\n');
616 rkpm_ddr_regs_dump(b_addr,0x0,0xc);
619 cru_writel(gate_reg|CRU_W_MSK(idx%16,0x1),RK3288_CRU_GATEID_CONS(idx));
622 /**************************************gpios save and resume**************************/
623 #define RK3288_GPIO_CH (9)
624 static u32 slp_gpio_data[RK3288_GPIO_CH][10];
625 static u32 slp_grf_iomux_data[RK3288_GPIO_CH*4];
626 static u32 slp_grf_io_pull_data[RK3288_GPIO_CH*4];
628 static void gpio_ddr_dump_reg(int ports)
630 void __iomem *b_addr=RK_GPIO_VIRT(ports);
632 rkpm_ddr_printascii("gpio-");
633 rkpm_ddr_printhex(ports);
634 rkpm_ddr_printhex('\n');
636 rkpm_ddr_reg_offset_dump(b_addr,GPIO_SWPORT_DR);
637 rkpm_ddr_reg_offset_dump(b_addr,GPIO_SWPORT_DDR);
638 rkpm_ddr_reg_offset_dump(b_addr,GPIO_INTEN);
639 rkpm_ddr_reg_offset_dump(b_addr,GPIO_INTMASK);
640 rkpm_ddr_reg_offset_dump(b_addr,GPIO_INTTYPE_LEVEL);
641 rkpm_ddr_reg_offset_dump(b_addr,GPIO_INT_POLARITY);
642 rkpm_ddr_reg_offset_dump(b_addr,GPIO_DEBOUNCE);
643 rkpm_ddr_reg_offset_dump(b_addr,GPIO_LS_SYNC);
644 rkpm_ddr_printhex('\n');
646 rkpm_ddr_printascii("iomux\n");
647 rkpm_ddr_regs_dump(RK_GRF_VIRT,0x0+ports*4*4,0x0+ports*4*4+3*4);
649 rkpm_ddr_printascii("iomux\n");
650 rkpm_ddr_regs_dump(RK_GRF_VIRT,0x130+ports*4*4,ports*4*4+3*4);
654 static void slp_pin_gpio_save(int ports)
657 void __iomem *b_addr=RK_GPIO_VIRT(ports);
658 int idx=RK3288_CLKGATE_PCLK_GPIO1+ports-1;
661 if(ports==0||ports>=RK3288_GPIO_CH)
664 gate_reg=cru_readl(RK3288_CRU_GATEID_CONS(idx));
665 RK3288_CRU_UNGATING_OPS(idx);
667 //gpio_ddr_dump_reg(ports);
669 slp_gpio_data[ports][i++]=readl_relaxed(b_addr+GPIO_SWPORT_DR);
670 slp_gpio_data[ports][i++]=readl_relaxed(b_addr+GPIO_SWPORT_DDR);
671 slp_gpio_data[ports][i++]=readl_relaxed(b_addr+GPIO_INTEN);
672 slp_gpio_data[ports][i++]=readl_relaxed(b_addr+GPIO_INTMASK);
673 slp_gpio_data[ports][i++]=readl_relaxed(b_addr+GPIO_INTTYPE_LEVEL);
674 slp_gpio_data[ports][i++]=readl_relaxed(b_addr+GPIO_INT_POLARITY);
675 slp_gpio_data[ports][i++]=readl_relaxed(b_addr+GPIO_DEBOUNCE);
676 slp_gpio_data[ports][i++]=readl_relaxed(b_addr+GPIO_LS_SYNC);
680 slp_regs_save(&slp_grf_iomux_data[ports*4],RK_GRF_VIRT,0x0+ports*4*4,0x0+ports*4*4+3*4);
681 slp_regs_save(&slp_grf_io_pull_data[ports*4],RK_GRF_VIRT,0x130+ports*4*4,ports*4*4+3*4);
685 cru_writel(gate_reg|CRU_W_MSK(idx%16,0x1),RK3288_CRU_GATEID_CONS(idx));
689 static void slp_pin_gpio_resume (int ports)
692 void __iomem *b_addr=RK_GPIO_VIRT(ports);
693 int idx=RK3288_CLKGATE_PCLK_GPIO1+ports-1;
696 if(ports==0||ports>=RK3288_GPIO_CH)
698 gate_reg=cru_readl(RK3288_CRU_GATEID_CONS(idx));
699 RK3288_CRU_UNGATING_OPS(idx);
704 slp_regs_resume(&slp_grf_iomux_data[ports*4],RK_GRF_VIRT,0x0+ports*4*4,0x0+ports*4*4+3*4,0xffff0000);
705 slp_regs_resume(&slp_grf_io_pull_data[ports*4],RK_GRF_VIRT,0x130+ports*4*4,ports*4*4+3*4,0xffff0000);
709 writel_relaxed(slp_gpio_data[ports][i++],b_addr+GPIO_SWPORT_DR);
710 writel_relaxed(slp_gpio_data[ports][i++],b_addr+GPIO_SWPORT_DDR);
711 writel_relaxed(slp_gpio_data[ports][i++],b_addr+GPIO_INTEN);
712 writel_relaxed(slp_gpio_data[ports][i++],b_addr+GPIO_INTMASK);
713 writel_relaxed(slp_gpio_data[ports][i++],b_addr+GPIO_INTTYPE_LEVEL);
714 writel_relaxed(slp_gpio_data[ports][i++],b_addr+GPIO_INT_POLARITY);
715 writel_relaxed(slp_gpio_data[ports][i++],b_addr+GPIO_DEBOUNCE);
716 writel_relaxed(slp_gpio_data[ports][i++],b_addr+GPIO_LS_SYNC);
718 //gpio_ddr_dump_reg(ports);
719 cru_writel(gate_reg|CRU_W_MSK(idx%16,0x1),RK3288_CRU_GATEID_CONS(idx));
723 /**************************************sleep func**************************/
725 void ddr_reg_save(uint32_t *pArg);
726 void fiq_glue_resume(void);
727 void rk30_cpu_resume(void);
728 void rk30_l2_cache_init_pm(void);
729 //static void rk319x_pm_set_power_domain(enum pmu_power_domain pd, bool state);
730 void ddr_cfg_to_lp_mode(void);
731 void l2x0_inv_all_pm(void);
732 void rk30_cpu_while_tst(void);
735 static u32 slp_grf_soc_con_data[5];
736 static u32 slp_grf_soc_con_w_msk[5]={0x70000,0x40ff0000,0xffff0000,0xffff0000,0xffff0000};
738 static u32 slp_grf_cpu_con_data[5];
739 static u32 slp_grf_cpu_con_w_msk[5]={0xefff0000,0xffff0000,0xcfff0000,0xffff0000,0x7fff0000};
741 static u32 slp_grf_uoc0_con_data[4];
742 static u32 slp_grf_uoc0_con_w_msk[4]={0xffff0000,0xffff0000,0x7dff0000,0x7fff0000};// uoc0_con4 bit 15??
744 static u32 slp_grf_uoc1_con_data[2];
745 static u32 slp_grf_uoc1_con_w_msk[2]={0x1fdc0000,0x047f0000};
747 static u32 slp_grf_uoc2_con_data[2];
748 static u32 slp_grf_uoc2_con_w_msk[2]={0x7fff0000,0x1f0000};
750 static u32 slp_grf_uoc3_con_data[2];
751 static u32 slp_grf_uoc3_con_w_msk[2]={0x3ff0000,0x0fff0000};
754 static u32 slp_pmu_pwrmode_con_data[1];
757 static u32 slp_nandc_data[8];
758 static void __iomem *rk30_nandc_base=NULL;
763 void inline pm_io_base_map(void)
766 for(i=0;i<RK3288_I2C_NUM;i++)
767 slp_i2c_base[i] = ioremap(slp_i2c_phy[i], 0x1000);
769 for(i=0;i<RK3288_UART_NUM;i++)
771 if(i!=CONFIG_RK_DEBUG_UART)
772 slp_uart_base[i] = ioremap(slp_uart_phy[i], 0x1000);
774 slp_uart_base[i] = RK_DEBUG_UART_VIRT;
779 void pm_gpio_setting(void)
782 //gpio wake up setting
783 gpio0_lp_wakeup_en(1,3);
784 gpio0s_lp_wakeup_type(1);
785 gpio0_lp_wakeup_en(6,3);
789 enum rk3288_pwr_mode_con {
792 pmu_clk_core_src_gate_en,
793 pmu_global_int_disable,
801 pmu_chip_pd_en, // power off pin enable
817 pmu_ddr0io_ret_de_req,
818 pmu_ddr1io_ret_de_req
821 enum rk3288_pwr_mode_con1 {
837 static void ddr_pin_set_fun(u8 port,u8 bank,u8 b_gpio,u8 fun);
839 static u32 sgrf_soc_con0,pmu_pwr_mode_con0,pmu_pwr_mode_con1;
841 static void rkpm_slp_mode_set(u32 val)
843 u32 mode_set,mode_set1;
845 // setting gpio0_a0 arm off pin
846 ddr_pin_set_fun(0x0,0xa,0x0,0x1);
848 sgrf_soc_con0=reg_readl(RK_SGRF_VIRT+RK3288_SGRF_SOC_CON0);
849 pmu_pwr_mode_con0=pmu_readl(RK3288_PMU_PWRMODE_CON);
850 pmu_pwr_mode_con1=pmu_readl(RK3288_PMU_PWRMODE_CON1);
852 mode_set1=pmu_pwr_mode_con1;
853 mode_set=pmu_pwr_mode_con0;
856 pmu_writel(0x1<<3,RK3188_PMU_WAKEUP_CFG1);
859 reg_writel((0x1<<8)|(0x1<<(8+16)),RK_SGRF_VIRT+RK3288_SGRF_SOC_CON0);
860 reg_writel(RK3288_BOOTRAM_PHYS,RK_SGRF_VIRT+RK3288_SGRF_FAST_BOOT_ADDR);
862 mode_set|= BIT(pmu_pwr_mode_en)|BIT(pmu_global_int_disable)
863 | BIT(pmu_l2flush_en)
864 |BIT(pmu_sref0_enter_en)|BIT(pmu_sref1_enter_en) |BIT(pmu_ddr0_gating_en)|BIT(pmu_ddr1_gating_en);
867 if(rkpm_chk_val_ctrbit(val,RKPM_CTR_IDLEAUTO_MD))
869 rkpm_ddr_printascii("-autoidle-");
870 mode_set|=BIT(pmu_clk_core_src_gate_en);
872 else if(rkpm_chk_val_ctrbit(val,RKPM_CTR_ARMDP_LPMD))
874 rkpm_ddr_printascii("-armdp-");
875 //rkpm_ddr_printhex(cru_readl(RK3288_CRU_MODE_CON));
877 // pmu_writel(0x1<<3,RK3188_PMU_WAKEUP_CFG1);
878 mode_set|=BIT(pmu_a12_0_pd_en);
880 else if(rkpm_chk_val_ctrbit(val,RKPM_CTR_ARMOFF_LPMD))
883 rkpm_ddr_printascii("-armoff-");
884 //rkpm_ddr_printhex(cru_readl(RK3288_CRU_MODE_CON));
886 mode_set|=BIT(pmu_scu_en)|BIT(pmu_chip_pd_en);
887 mode_set1|=BIT(pmu_clr_core)|BIT(pmu_clr_cpup);
891 mode_set=pmu_pwr_mode_con0;
892 mode_set1=pmu_pwr_mode_con1;
896 pmu_writel(mode_set,RK3288_PMU_PWRMODE_CON);
897 pmu_writel(mode_set1,RK3288_PMU_PWRMODE_CON1);
901 static inline void rkpm_slp_mode_set_resume(void)
904 pmu_writel(pmu_pwr_mode_con0,RK3288_PMU_PWRMODE_CON);
905 pmu_writel(pmu_pwr_mode_con1,RK3288_PMU_PWRMODE_CON1);
906 reg_writel(sgrf_soc_con0|(0x1<<(8+16)),RK_SGRF_VIRT+RK3288_SGRF_SOC_CON0);
910 static inline u32 rkpm_l2_config(void)
913 asm("mrc p15, 1, %0, c9, c0, 2" : "=r" (l2ctlr));
918 static int sleep_resume_all=0;
919 void pm_sleep_func_save(void)
925 sleep_resume_data[SLPDATA_L2_CON]=rkpm_l2_config();// in sys resume ,ddr is need resume
926 sleep_resume_data[SLPDATA_SP_ADDR]=PM_BOOT_CODE_SP;// in sys resume ,ddr is need resume
927 sleep_resume_data[SLPDATA_SP_CPU_RESUME]=virt_to_phys(cpu_resume);// in sys resume ,ddr is need resume
928 sleep_resume_data[SLPDATA_DDR_NEED_RES]=0;// in sys resume ,ddr is need resume
929 sleep_resume_data[SLPDATA_DPLL_NEED_RES]=0;// in ddr resume ,dpll is need resume
930 //data_src=(char *)ddr_get_resume_code_info(&data_size);
931 //sleep_resume_data[SLPDATA_DDR_CODE_PHY]=SLP_DDR_DATA_SAVE_PHY;
932 //sleep_resume_data[SLPDATA_DDR_DATA_PHY]=SLP_DDR_DATA_SAVE_PHY+(data_size/4+1)*4;
934 //ddr_reg_save(resume_data_phy+SLP_DPLL_NEED_RES*4);
935 sram_data_for_sleep(boot_ram_data,int_ram_data);
936 rkpm_gic_dist_save(&slp_gic_save[0]);
939 local_flush_tlb_all();
941 //slp_regs_save(slp_grf_iomux_data,(u32)RK_GRF_VIRT+0x10,16);
942 //slp_regs_save(slp_nandc_data,(u32)rk30_nandc_base,8);
944 //slp_pin_gpio_save(1);
945 //slp_pin_gpio_save(2);
946 //slp_pin_gpio_save(3);
947 //slp_pin_gpio_save(4);
950 rkpm_ddr_printascii("l2-");
951 rkpm_ddr_printhex(sleep_resume_data[SLPDATA_L2_CON]);
952 rkpm_ddr_printascii("\n");
957 void pm_sleep_func_rusume_first(void)
960 // rkpm_ddr_printhex(cru_readl(RK3288_CRU_MODE_CON));
962 //rk319x_pm_set_power_domain(PD_PERI,true);
963 //slp_regs_resume(slp_grf_io_pull_data,(u32)RK_GRF_VIRT+0x144,16,0xffff0000);
964 slp_pin_gpio_resume(1);
965 slp_pin_gpio_resume(2);
966 slp_pin_gpio_resume(3);
967 slp_pin_gpio_resume(4);
970 slp_regs_w_msk_resume(slp_grf_soc_con_data,(u32)RK_GRF_VIRT+0x60,5,slp_grf_soc_con_w_msk);
971 slp_regs_w_msk_resume(slp_grf_cpu_con_data,(u32)RK_GRF_VIRT+0x9c,5,slp_grf_cpu_con_w_msk);
973 slp_regs_w_msk_resume(slp_grf_uoc0_con_data,(u32)RK_GRF_VIRT+0xc4,4,slp_grf_uoc0_con_w_msk);
974 slp_regs_w_msk_resume(slp_grf_uoc1_con_data,(u32)RK_GRF_VIRT+0xd4,2,slp_grf_uoc1_con_w_msk);
975 slp_regs_w_msk_resume(slp_grf_uoc2_con_data,(u32)RK_GRF_VIRT+0xe4,2,slp_grf_uoc2_con_w_msk);
976 slp_regs_w_msk_resume(slp_grf_uoc3_con_data,(u32)RK_GRF_VIRT+0xec,2,slp_grf_uoc3_con_w_msk);
978 //sram_printch_uart_enable();
987 void pm_sleep_func_rusume_last(void)
992 // slp_uart_resume(0);
993 // slp_uart_resume(1);
994 // slp_uart_resume(3);
995 // slp_regs_resume(slp_nandc_data,(u32)rk30_nandc_base,8,0);
997 //rkpm_ddr_printch('g');
998 rkpm_gic_dist_resume(&slp_gic_save[0]);
1002 rkpm_ddr_printascii("l2-");
1003 rkpm_ddr_printhex(rkpm_l2_config());
1004 rkpm_ddr_printascii("\n");
1008 rkpm_slp_mode_set_resume();
1009 sram_data_resume(boot_ram_data,int_ram_data);
1012 /*******************************common code for rkxxx*********************************/
1013 static void inline uart_printch(char byte)
1016 u32 u_clk_id=(RK3288_CLKGATE_UART0_SRC+CONFIG_RK_DEBUG_UART);
1017 u32 u_pclk_id=(RK3288_CLKGATE_PCLK_UART0+CONFIG_RK_DEBUG_UART);
1019 if(CONFIG_RK_DEBUG_UART==4)
1020 u_clk_id=RK3288_CLKGATE_UART4_SRC;
1021 if(CONFIG_RK_DEBUG_UART==2)
1022 u_pclk_id=RK3288_CLKGATE_PCLK_UART2;
1024 reg_save[0]=cru_readl(RK3288_CRU_GATEID_CONS(u_clk_id));
1025 reg_save[1]=cru_readl(RK3288_CRU_GATEID_CONS(u_pclk_id));
1026 RK3288_CRU_UNGATING_OPS(u_clk_id);
1027 RK3288_CRU_UNGATING_OPS(u_pclk_id);
1031 writel_relaxed(byte, RK_DEBUG_UART_VIRT);
1034 /* loop check LSR[6], Transmitter Empty bit */
1035 while (!(readl_relaxed(RK_DEBUG_UART_VIRT + 0x14) & 0x40))
1038 cru_writel(reg_save[0]|CRU_W_MSK(u_clk_id%16,0x1),RK3288_CRU_GATEID_CONS(u_clk_id));
1039 cru_writel(reg_save[1]|CRU_W_MSK(u_pclk_id%16,0x1),RK3288_CRU_GATEID_CONS(u_pclk_id));
1045 void PIE_FUNC(sram_printch)(char byte)
1050 static void pll_udelay(u32 udelay);
1052 static void ddr_printch(char byte)
1057 /*******************************gpio func*******************************************/
1058 //#define RK3288_PMU_GPIO0_A_IOMUX 0x0084
1059 //#define RK3288_PMU_GPIO0_B_IOMUX 0x0088
1060 //#define RK3288_PMU_GPIO0_C_IOMUX 0x008c
1061 //#define RK3288_PMU_GPIO0_D_IOMUX 0x0090
1064 //pin=0x0a21 gpio0a2,port=0,bank=a,b_gpio=2,fun=1
1065 static inline void pin_set_fun(u8 port,u8 bank,u8 b_gpio,u8 fun)
1075 off_set=RK3288_PMU_GPIO0_A_IOMUX+bank*4;
1076 pmu_writel(RKPM_VAL_SETBITS(pmu_readl(off_set),fun,b_gpio*2,0x3),off_set);
1081 off_set=port*(4*4)+bank*4;
1082 //form RK3288_GRF_GPIO1D_IOMUX
1083 reg_writel(RKPM_W_MSK_SETBITS(fun,b_gpio*2,0x3),RK_GRF_VIRT+0+off_set);
1087 static inline u8 pin_get_funset(u8 port,u8 bank,u8 b_gpio)
1096 off_set=RK3288_PMU_GPIO0_A_IOMUX+bank*4;
1097 return (pmu_readl(off_set)>>(b_gpio*2))&0x3;
1102 off_set=port*(4*4)+bank*4;
1103 //form RK3288_GRF_GPIO1D_IOMUX
1104 return (reg_readl(RK_GRF_VIRT+0+off_set)>>(b_gpio*2))&0x3;
1108 static inline void pin_set_pull(u8 port,u8 bank,u8 b_gpio,u8 pull)
1119 //gpio1_d==0x14c ,form gpio0_a to gpio1_d offset 1*16+3*4= 0x1c
1120 off_set=0x14c-0x1c+port*(4*4)+bank*4;
1121 reg_writel(RKPM_W_MSK_SETBITS(pull,b_gpio*2,0x3),RK_GRF_VIRT+off_set);
1126 if(bank>2)// gpio0_d is not support
1128 pmu_writel(RKPM_VAL_SETBITS(pmu_readl(0x64+bank*4),pull,b_gpio*2,0x3),0x64+bank*4);
1133 static inline u8 pin_get_pullset(u8 port,u8 bank,u8 b_gpio)
1144 //gpio1_d==0x14c ,form gpio0_a to gpio1_d offset 1*16+3*4= 0x1c
1145 off_set=0x14c-0x1c+port*(4*4)+bank*4;
1146 return RKPM_GETBITS(reg_readl(RK_GRF_VIRT+off_set),b_gpio*2,0x3);
1151 if(bank>2)// gpio0_d is not support
1153 return RKPM_GETBITS(pmu_readl(0x64+bank*4),b_gpio*2,0x3);
1160 static inline void gpio_set_in_output(u8 port,u8 bank,u8 b_gpio,u8 type)
1165 b_gpio=bank*8+b_gpio;//
1167 val=reg_readl(RK_GPIO_VIRT(port)+GPIO_SWPORT_DDR);
1169 if(type==RKPM_GPIO_OUTPUT)
1172 val&=~(0x1<<b_gpio);
1174 reg_writel(val,RK_GPIO_VIRT(port)+GPIO_SWPORT_DDR);
1177 static inline u8 gpio_get_in_outputset(u8 port,u8 bank,u8 b_gpio)
1180 b_gpio=bank*8+b_gpio;
1181 return reg_readl(RK_GPIO_VIRT(port)+GPIO_SWPORT_DDR)&(0x1<<b_gpio);
1184 //RKPM_GPIOS_OUT_L RKPM_GPIOS_OUT_H
1185 static inline void gpio_set_output_level(u8 port,u8 bank,u8 b_gpio,u8 level)
1190 b_gpio=bank*8+b_gpio;
1192 val=reg_readl(RK_GPIO_VIRT(port)+GPIO_SWPORT_DR);
1194 if(level==RKPM_GPIO_OUT_H)
1197 val&=~(0x1<<b_gpio);
1199 reg_writel(val,RK_GPIO_VIRT(port)+GPIO_SWPORT_DR);
1202 static inline u8 gpio_get_output_levelset(u8 port,u8 bank,u8 b_gpio)
1205 b_gpio=bank*8+b_gpio;
1206 return reg_readl(RK_GPIO_VIRT(port)+GPIO_SWPORT_DR)&(0x1<<b_gpio);
1209 static inline u8 gpio_get_input_level(u8 port,u8 bank,u8 b_gpio)
1213 b_gpio=bank*8+b_gpio;
1215 return (reg_readl(RK_GPIO_VIRT(port)+GPIO_EXT_PORT)>>b_gpio)&0x1;
1218 static void __sramfunc sram_pin_set_fun(u8 port,u8 bank,u8 b_gpio,u8 fun)
1220 pin_set_fun(port,bank,b_gpio,fun);
1222 static u8 __sramfunc sram_pin_get_funset(u8 port,u8 bank,u8 b_gpio)
1224 return pin_get_funset(port,bank,b_gpio);
1227 static void __sramfunc sram_pin_set_pull(u8 port,u8 bank,u8 b_gpio,u8 fun)
1229 pin_set_pull(port,bank,b_gpio,fun);
1231 static u8 __sramfunc sram_pin_get_pullset(u8 port,u8 bank,u8 b_gpio)
1233 return pin_get_pullset(port,bank,b_gpio);
1236 static void __sramfunc sram_gpio_set_in_output(u8 port,u8 bank,u8 b_gpio,u8 type)
1238 gpio_set_in_output(port,bank,b_gpio,type);
1241 static u8 __sramfunc sram_gpio_get_in_outputset(u8 port,u8 bank,u8 b_gpio)
1243 return gpio_get_in_outputset(port,bank,b_gpio);
1246 static void __sramfunc sram_gpio_set_output_level(u8 port,u8 bank,u8 b_gpio,u8 level)
1249 gpio_set_output_level(port,bank,b_gpio,level);
1253 static u8 __sramfunc sram_gpio_get_output_levelset(u8 port,u8 bank,u8 b_gpio)
1255 return gpio_get_output_levelset(port,bank,b_gpio);
1258 static u8 __sramfunc sram_gpio_get_input_level(u8 port,u8 bank,u8 b_gpio)
1260 return gpio_get_input_level(port,bank,b_gpio);
1263 static void ddr_pin_set_fun(u8 port,u8 bank,u8 b_gpio,u8 fun)
1265 pin_set_fun(port,bank,b_gpio,fun);
1267 static u8 ddr_pin_get_funset(u8 port,u8 bank,u8 b_gpio)
1269 return pin_get_funset(port,bank,b_gpio);
1272 static void ddr_pin_set_pull(u8 port,u8 bank,u8 b_gpio,u8 fun)
1274 pin_set_pull(port,bank,b_gpio,fun);
1276 static u8 ddr_pin_get_pullset(u8 port,u8 bank,u8 b_gpio)
1278 return pin_get_pullset(port,bank,b_gpio);
1281 static void ddr_gpio_set_in_output(u8 port,u8 bank,u8 b_gpio,u8 type)
1283 gpio_set_in_output(port,bank,b_gpio,type);
1286 static u8 ddr_gpio_get_in_outputset(u8 port,u8 bank,u8 b_gpio)
1288 return gpio_get_in_outputset(port,bank,b_gpio);
1291 static void ddr_gpio_set_output_level(u8 port,u8 bank,u8 b_gpio,u8 level)
1293 gpio_set_output_level(port,bank,b_gpio,level);
1296 static u8 ddr_gpio_get_output_levelset(u8 port,u8 bank,u8 b_gpio)
1298 return gpio_get_output_levelset(port,bank,b_gpio);
1301 static u8 ddr_gpio_get_input_level(u8 port,u8 bank,u8 b_gpio)
1303 return gpio_get_input_level(port,bank,b_gpio);
1308 static void __sramfunc rkpm_pin_gpio_config_sram(u32 pin_gpio_bits,u32 *save_bits)
1312 u8 port,bank,b_gpio,fun,in_out, level, pull;
1314 pins=RKPM_PINGPIO_BITS_PIN(pin_gpio_bits);
1315 in_out=RKPM_PINGPIO_BITS_INOUT(pin_gpio_bits);
1316 pull=RKPM_PINGPIO_BITS_PULL(pin_gpio_bits);
1317 level=RKPM_PINGPIO_BITS_LEVEL(pin_gpio_bits);
1319 port=RKPM_PINBITS_PORT(pins);
1320 bank=RKPM_PINBITS_BANK(pins);
1321 b_gpio=RKPM_PINBITS_BGPIO(pins);
1322 fun=RKPM_PINBITS_FUN(pins);
1327 pins=RKPM_PINBITS_SET_FUN(pins,sram_pin_get_funset(port,bank,b_gpio));
1328 *save_bits=RKPM_PINGPIO_BITS(pins,sram_pin_get_pullset(port,bank,b_gpio),sram_gpio_get_in_outputset(port,bank,b_gpio),
1329 sram_gpio_get_output_levelset(port,bank,b_gpio));
1331 if(!fun&&(in_out==RKPM_GPIO_OUTPUT))
1333 if(level==RKPM_GPIO_OUT_L)
1334 pull=RKPM_GPIO_PULL_DN;
1336 pull=RKPM_GPIO_PULL_UP;
1338 sram_gpio_set_output_level(port,bank,b_gpio,level);
1341 sram_pin_set_pull(port,bank,b_gpio,pull);
1342 sram_pin_set_fun(port,bank,b_gpio,fun);
1346 sram_gpio_set_in_output(port,bank,b_gpio,in_out);
1351 static inline void rkpm_pin_gpio_config_ddr(u32 pin_gpio_bits,u32 *save_bits)
1355 u8 port,bank,b_gpio,fun,in_out, level, pull;
1357 pins=RKPM_PINGPIO_BITS_PIN(pin_gpio_bits);
1358 in_out=RKPM_PINGPIO_BITS_INOUT(pin_gpio_bits);
1359 pull=RKPM_PINGPIO_BITS_PULL(pin_gpio_bits);
1360 level=RKPM_PINGPIO_BITS_LEVEL(pin_gpio_bits);
1362 port=RKPM_PINBITS_PORT(pins);
1363 bank=RKPM_PINBITS_BANK(pins);
1364 b_gpio=RKPM_PINBITS_BGPIO(pins);
1365 fun=RKPM_PINBITS_FUN(pins);
1370 pins=RKPM_PINBITS_SET_FUN(pins,ddr_pin_get_funset(port,bank,b_gpio));
1371 *save_bits=RKPM_PINGPIO_BITS(pins,ddr_pin_get_pullset(port,bank,b_gpio),ddr_gpio_get_in_outputset(port,bank,b_gpio),
1372 ddr_gpio_get_output_levelset(port,bank,b_gpio));
1374 if(!fun&&(in_out==RKPM_GPIO_OUTPUT))
1376 if(level==RKPM_GPIO_OUT_L)
1377 pull=RKPM_GPIO_PULL_DN;
1379 pull=RKPM_GPIO_PULL_UP;
1381 ddr_gpio_set_output_level(port,bank,b_gpio,level);
1384 ddr_pin_set_pull(port,bank,b_gpio,pull);
1385 ddr_pin_set_fun(port,bank,b_gpio,fun);
1389 ddr_gpio_set_in_output(port,bank,b_gpio,in_out);
1395 #define GPIO_DTS_NUM 10
1397 static u32 gpio_dts_save[GPIO_DTS_NUM];
1398 static u32 gpio_dts[GPIO_DTS_NUM];
1400 #define PMICGPIO_DTS_NUM 3
1403 u32 DEFINE_PIE_DATA(pmicgpio_dts[PMICGPIO_DTS_NUM]);
1404 static u32 *p_pmicgpio_dts;
1405 static __sramdata u32 pmicgpio_dts_save[PMICGPIO_DTS_NUM];
1407 static void __sramfunc pmic_gpio_suspend(void)
1412 if(DATA(pmicgpio_dts[i]))
1413 rkpm_pin_gpio_config_sram(DATA(pmicgpio_dts[i]),& pmicgpio_dts_save[i]);
1416 pmicgpio_dts_save[i]=0;
1423 rkpm_sram_reg_dump(RK_GPIO_VIRT(i),0,0x4);
1426 rkpm_sram_reg_dump(RK_GRF_VIRT,0xc,0x84);
1427 rkpm_sram_reg_dump(RK_GRF_VIRT,0x14c,0x1b4);
1428 rkpm_sram_reg_dump(RK_PMU_VIRT,0x64,0x6c);
1429 rkpm_sram_reg_dump(RK_PMU_VIRT,0x84,0x9c);
1434 static void __sramfunc pmic_gpio_resume(void)
1439 if(pmicgpio_dts_save[i])
1440 rkpm_pin_gpio_config_sram(pmicgpio_dts_save[i],NULL);
1445 void PIE_FUNC(pmic_suspend)(void)
1447 pmic_gpio_suspend();
1451 void PIE_FUNC(pmic_resume)(void)
1457 static void rkpm_gpio_suspend(void)
1462 if(DATA(pmicgpio_dts[i]))
1463 rkpm_pin_gpio_config_ddr(DATA(pmicgpio_dts[i]),& pmicgpio_dts_save[i]);
1466 pmicgpio_dts_save[i]=0;
1473 rkpm_ddr_reg_dump(RK_GPIO_VIRT(i),0,0x4);
1476 rkpm_ddr_reg_dump(RK_GRF_VIRT,0xc,0x84);
1477 rkpm_ddr_reg_dump(RK_GRF_VIRT,0x14c,0x1b4);
1478 rkpm_ddr_reg_dump(RK_PMU_VIRT,0x64,0x6c);
1479 rkpm_ddr_reg_dump(RK_PMU_VIRT,0x84,0x9c);
1484 static void rkpm_gpio_resume(void)
1489 if(pmicgpio_dts_save[i])
1490 rkpm_pin_gpio_config_ddr(pmicgpio_dts_save[i],NULL);
1494 static void gpio_get_dts_info(struct device_node *parent)
1498 for(i=0;i<PMICGPIO_DTS_NUM;i++)
1499 p_pmicgpio_dts[i]=0;
1501 for(i=0;i<GPIO_DTS_NUM;i++)
1505 p_pmicgpio_dts= kern_to_pie(rockchip_pie_chunk, &DATA(pmicgpio_dts[0]));
1507 if(of_property_read_u32_array(parent,"rockchip,pmic-gpios",p_pmicgpio_dts,PMICGPIO_DTS_NUM))
1509 p_pmicgpio_dts[0]=0;
1510 PM_ERR("%s:get pm ctr error\n",__FUNCTION__);
1513 for(i=0;i<PMICGPIO_DTS_NUM;i++)
1514 printk("%s:pmic gpio(%x)\n",__FUNCTION__,p_pmicgpio_dts[i]);
1516 if(of_property_read_u32_array(parent,"rockchip,pm-gpios",gpio_dts,GPIO_DTS_NUM))
1519 PM_ERR("%s:get pm ctr error\n",__FUNCTION__);
1521 for(i=0;i<GPIO_DTS_NUM;i++)
1522 printk("%s:pmic gpio(%x)\n",__FUNCTION__,gpio_dts[i]);
1524 rkpm_set_ops_gpios(rkpm_gpio_suspend,rkpm_gpio_resume);
1525 rkpm_set_sram_ops_gtclks(fn_to_pie(rockchip_pie_chunk, &FUNC(pmic_suspend)),
1526 fn_to_pie(rockchip_pie_chunk, &FUNC(pmic_resume)));
1531 /*******************************clk gating config*******************************************/
1532 #define CLK_MSK_GATING(msk, con) cru_writel((msk << 16) | 0xffff, con)
1533 #define CLK_MSK_UNGATING(msk, con) cru_writel(((~msk) << 16) | 0xffff, con)
1536 static u32 clk_ungt_msk[RK3288_CRU_CLKGATES_CON_CNT];// first clk gating setting
1537 static u32 clk_ungt_msk_1[RK3288_CRU_CLKGATES_CON_CNT];// first clk gating setting
1538 static u32 clk_ungt_save[RK3288_CRU_CLKGATES_CON_CNT]; //first clk gating value saveing
1541 u32 DEFINE_PIE_DATA(rkpm_clkgt_last_set[RK3288_CRU_CLKGATES_CON_CNT]);
1542 static u32 *p_rkpm_clkgt_last_set;
1544 static __sramdata u32 rkpm_clkgt_last_save[RK3288_CRU_CLKGATES_CON_CNT];
1546 void PIE_FUNC(gtclks_sram_suspend)(void)
1549 // u32 u_clk_id=(RK3188_CLKGATE_UART0_SRC+CONFIG_RK_DEBUG_UART);
1550 // u32 u_pclk_id=(RK3188_CLKGATE_PCLK_UART0+CONFIG_RK_DEBUG_UART);
1552 for(i=0;i<RK3288_CRU_CLKGATES_CON_CNT;i++)
1554 rkpm_clkgt_last_save[i]=cru_readl(RK3288_CRU_CLKGATES_CON(i));
1555 CLK_MSK_UNGATING( DATA(rkpm_clkgt_last_set[i]), RK3288_CRU_CLKGATES_CON(i));
1557 rkpm_sram_printch('\n');
1558 rkpm_sram_printhex(DATA(rkpm_clkgt_last_save[i]));
1559 rkpm_sram_printch('-');
1560 rkpm_sram_printhex(DATA(rkpm_clkgt_last_set[i]));
1561 rkpm_sram_printch('-');
1562 rkpm_sram_printhex(cru_readl(RK3188_CRU_CLKGATES_CON(i)));
1563 if(i==(RK3288_CRU_CLKGATES_CON_CNT-1))
1564 rkpm_sram_printch('\n');
1568 //RK3288_CRU_UNGATING_OPS(u_clk_id);
1569 //RK3288_CRU_UNGATING_OPS(u_pclk_id);
1573 void PIE_FUNC(gtclks_sram_resume)(void)
1576 for(i=0;i<RK3288_CRU_CLKGATES_CON_CNT;i++)
1578 cru_writel(rkpm_clkgt_last_save[i]|0xffff0000, RK3288_CRU_CLKGATES_CON(i));
1582 static void gtclks_suspend(void)
1586 // rkpm_ddr_regs_dump(RK_CRU_VIRT,RK3288_CRU_CLKGATES_CON(0)
1587 // ,RK3288_CRU_CLKGATES_CON(RK3288_CRU_CLKGATES_CON_CNT-1));
1588 for(i=0;i<RK3288_CRU_CLKGATES_CON_CNT;i++)
1590 clk_ungt_save[i]=cru_readl(RK3288_CRU_CLKGATES_CON(i));
1591 //if(RK3288_CRU_CLKGATES_CON(i)<0x170||RK3288_CRU_CLKGATES_CON(i)>0x194)
1593 CLK_MSK_UNGATING(clk_ungt_msk[i],RK3288_CRU_CLKGATES_CON(i));
1597 rkpm_ddr_printch('\n');
1598 rkpm_ddr_printhex(RK3288_CRU_CLKGATES_CON(i));
1599 rkpm_ddr_printch('-');
1600 rkpm_ddr_printhex(clk_ungt_msk[i]);
1601 rkpm_ddr_printch('-');
1602 rkpm_ddr_printhex(cru_readl(RK3288_CRU_CLKGATES_CON(i))) ;
1603 if(i==(RK3288_CRU_CLKGATES_CON_CNT-1))
1604 rkpm_ddr_printch('\n');
1610 static void gtclks_resume(void)
1613 for(i=0;i<RK3288_CRU_CLKGATES_CON_CNT;i++)
1615 cru_writel(clk_ungt_save[i]|0xffff0000,RK3288_CRU_CLKGATES_CON(i));
1617 //rkpm_ddr_regs_dump(RK_CRU_VIRT,RK3288_CRU_CLKGATES_CON(0)
1618 // ,RK3288_CRU_CLKGATES_CON(RK3288_CRU_CLKGATES_CON_CNT-1));
1621 /********************************pll power down***************************************/
1632 #define RK3288_PLL_PWR_DN_MSK (0x1<<1)
1633 #define RK3288_PLL_PWR_DN CRU_W_MSK_SETBITS(1,1,0x1)
1634 #define RK3288_PLL_PWR_ON CRU_W_MSK_SETBITS(0,1,0x1)
1637 #define RK3288_PLL_RESET CRU_W_MSK_SETBITS(1,5,0x1)
1638 #define RK3288_PLL_RESET_RESUME CRU_W_MSK_SETBITS(0,5,0x1)
1640 #define RK3288_PLL_BYPASS_MSK (0x1<<0)
1641 #define RK3288_PLL_BYPASS CRU_W_MSK_SETBITS(1,0,0x1)
1642 #define RK3288_PLL_NO_BYPASS CRU_W_MSK_SETBITS(0,0,0x1)
1644 static void pm_pll_wait_lock(u32 pll_idx)
1646 u32 delay = 600000U;
1648 // mode=cru_readl(RK3288_CRU_MODE_CON);
1656 if ((cru_readl(RK3288_PLL_CONS(pll_idx,1))&(0x1<<31)))
1661 rkpm_ddr_printascii("unlock-pll:");
1662 rkpm_ddr_printhex(pll_idx);
1663 rkpm_ddr_printch('\n');
1665 //cru_writel(mode|(RK3288_PLL_MODE_MSK(pll_idx)<<16), RK3288_CRU_MODE_CON);
1668 static void pll_udelay(u32 udelay)
1671 mode=cru_readl(RK3288_CRU_MODE_CON);
1673 cru_writel(RK3288_PLL_MODE_SLOW(APLL_ID), RK3288_CRU_MODE_CON);
1675 rkpm_udelay(udelay*5);
1677 cru_writel(mode|(RK3288_PLL_MODE_MSK(APLL_ID)<<16), RK3288_CRU_MODE_CON);
1680 static u32 plls_con0_save[END_PLL_ID];
1681 static u32 plls_con1_save[END_PLL_ID];
1682 static u32 plls_con2_save[END_PLL_ID];
1683 static u32 plls_con3_save[END_PLL_ID];
1685 static u32 cru_mode_con;
1687 static inline void plls_suspend(u32 pll_id)
1689 plls_con0_save[pll_id]=cru_readl(RK3288_PLL_CONS((pll_id), 0));
1690 plls_con1_save[pll_id]=cru_readl(RK3288_PLL_CONS((pll_id), 1));
1691 plls_con2_save[pll_id]=cru_readl(RK3288_PLL_CONS((pll_id), 2));
1692 plls_con3_save[pll_id]=cru_readl(RK3288_PLL_CONS((pll_id), 3));
1694 cru_writel(RK3288_PLL_PWR_DN, RK3288_PLL_CONS((pll_id), 3));
1697 static inline void plls_resume(u32 pll_id)
1699 u32 pllcon0, pllcon1, pllcon2;
1701 if((plls_con3_save[pll_id]&RK3288_PLL_PWR_DN_MSK))
1705 cru_writel(RK3288_PLL_MODE_SLOW(pll_id), RK3288_CRU_MODE_CON);
1707 cru_writel(RK3288_PLL_PWR_ON, RK3288_PLL_CONS((pll_id),3));
1708 cru_writel(RK3288_PLL_NO_BYPASS, RK3288_PLL_CONS((pll_id),3));
1710 pllcon0 =plls_con0_save[pll_id];// cru_readl(RK3288_PLL_CONS((pll_id),0));
1711 pllcon1 = plls_con1_save[pll_id];//cru_readl(RK3288_PLL_CONS((pll_id),1));
1712 pllcon2 = plls_con2_save[pll_id];//cru_readl(RK3288_PLL_CONS((pll_id),2));
1715 cru_writel(RK3288_PLL_RESET, RK3288_PLL_CONS(pll_id,3));
1716 cru_writel(pllcon0|CRU_W_MSK(0,0xf)|CRU_W_MSK(8,0x3f), RK3288_PLL_CONS(pll_id,0));
1717 cru_writel(pllcon1, RK3288_PLL_CONS(pll_id,1));
1718 cru_writel(pllcon2, RK3288_PLL_CONS(pll_id,2));
1721 //udelay(5); //timer7 delay
1724 cru_writel(RK3288_PLL_RESET_RESUME, RK3288_PLL_CONS(pll_id,3));
1728 pm_pll_wait_lock(pll_id);
1730 cru_writel(plls_con3_save[pll_id]|(RK3288_PLL_BYPASS_MSK<<16),RK3288_PLL_CONS(pll_id,3));
1734 static u32 clk_sel0,clk_sel1, clk_sel10,clk_sel26,clk_sel33,clk_sel36, clk_sel37;
1736 static void pm_plls_suspend(void)
1739 // rkpm_ddr_regs_dump(RK_CRU_VIRT,RK3288_PLL_CONS((0), 0),RK3288_PLL_CONS((4), 3));
1740 // rkpm_ddr_regs_dump(RK_CRU_VIRT,RK3288_CRU_MODE_CON,RK3288_CRU_MODE_CON);
1741 // rkpm_ddr_regs_dump(RK_CRU_VIRT,RK3288_CRU_CLKSELS_CON(0),RK3288_CRU_CLKSELS_CON(42));
1743 clk_sel0=cru_readl(RK3288_CRU_CLKSELS_CON(0));
1744 clk_sel1=cru_readl(RK3288_CRU_CLKSELS_CON(1));
1745 clk_sel10=cru_readl(RK3288_CRU_CLKSELS_CON(10));
1746 clk_sel26=cru_readl(RK3288_CRU_CLKSELS_CON(26));
1747 clk_sel33=cru_readl(RK3288_CRU_CLKSELS_CON(33));
1748 clk_sel36=cru_readl(RK3288_CRU_CLKSELS_CON(36));
1749 clk_sel37=cru_readl(RK3288_CRU_CLKSELS_CON(37));
1751 cru_mode_con = cru_readl(RK3288_CRU_MODE_CON);
1754 cru_writel(RK3288_PLL_MODE_SLOW(NPLL_ID), RK3288_CRU_MODE_CON);
1755 plls_suspend(NPLL_ID);
1758 cru_writel(RK3288_PLL_MODE_SLOW(CPLL_ID), RK3288_CRU_MODE_CON);
1761 cru_writel(RK3288_PLL_MODE_SLOW(GPLL_ID), RK3288_CRU_MODE_CON);
1763 // set 1,pdbus pll is gpll
1764 cru_writel(CRU_W_MSK_SETBITS(1,15,0x1), RK3288_CRU_CLKSELS_CON(1)); // 0 cpll 1gpll
1768 |CRU_W_MSK_SETBITS(0,0,0x7) // 1 aclk
1769 |CRU_W_MSK_SETBITS(0,3,0x1f) // 1 aclk src
1770 |CRU_W_MSK_SETBITS(0,8,0x3) // 1 hclk 0~1 1 2 4
1771 |CRU_W_MSK_SETBITS(0,12,0x7) // 3 pclk
1772 , RK3288_CRU_CLKSELS_CON(1));
1775 cru_writel(CRU_W_MSK_SETBITS(3,6,0x3), RK3288_CRU_CLKSELS_CON(26));
1777 // peri aclk hclk pclk
1779 |CRU_W_MSK_SETBITS(0,0,0x1f) // 1 aclk
1780 |CRU_W_MSK_SETBITS(0,8,0x3) // 2 hclk 0 1:1,1 2:1 ,2 4:1
1781 |CRU_W_MSK_SETBITS(0,12,0x3)// 2 0~3 1 2 4 8 div
1782 , RK3288_CRU_CLKSELS_CON(10));
1784 plls_suspend(CPLL_ID);
1785 plls_suspend(GPLL_ID);
1788 cru_writel(RK3288_PLL_MODE_SLOW(APLL_ID), RK3288_CRU_MODE_CON);
1789 // core_m0 core_mp a12_core
1791 |CRU_W_MSK_SETBITS(0,0,0xf) // 1 axi_mo
1792 |CRU_W_MSK_SETBITS(0,4,0xf) // 3 axi mp
1793 |CRU_W_MSK_SETBITS(0,8,0x1f) // 0 a12 core div
1794 , RK3288_CRU_CLKSELS_CON(0));
1795 // core0 core1 core2 core3
1797 |CRU_W_MSK_SETBITS(0,0,0x7) //core 0 div
1798 |CRU_W_MSK_SETBITS(0,4,0x7) // core 1
1799 |CRU_W_MSK_SETBITS(0,8,0x7) // core2
1800 |CRU_W_MSK_SETBITS(0,12,0x7)//core3
1801 , RK3288_CRU_CLKSELS_CON(36));
1804 |CRU_W_MSK_SETBITS(3,0,0x7) // l2ram
1805 |CRU_W_MSK_SETBITS(0xf,4,0x1f) // atclk
1806 |CRU_W_MSK_SETBITS(0xf,9,0x1f) // pclk dbg
1807 , RK3288_CRU_CLKSELS_CON(37));
1808 plls_suspend(APLL_ID);
1812 static void pm_plls_resume(void)
1815 plls_resume(APLL_ID);
1817 // core_m0 core_mp a12_core
1818 cru_writel(clk_sel0|(CRU_W_MSK(0,0xf)|CRU_W_MSK(4,0xf)|CRU_W_MSK(8,0xf)),RK3288_CRU_CLKSELS_CON(0));
1819 // core0 core1 core2 core3
1820 cru_writel(clk_sel36|(CRU_W_MSK(0,0x7)|CRU_W_MSK(4,0x7)|CRU_W_MSK(8,0x7)|CRU_W_MSK(12,0x7))
1821 , RK3288_CRU_CLKSELS_CON(36));
1823 cru_writel(clk_sel37|(CRU_W_MSK(0,0x7)|CRU_W_MSK(4,0x1f)|CRU_W_MSK(9,0x1f)) , RK3288_CRU_CLKSELS_CON(37));
1825 cru_writel(cru_mode_con|(RK3288_PLL_MODE_MSK(APLL_ID)<<16), RK3288_CRU_MODE_CON);
1828 plls_resume(GPLL_ID);
1829 plls_resume(CPLL_ID);
1831 // peri aclk hclk pclk
1832 cru_writel(clk_sel10|(CRU_W_MSK(0,0x1f)|CRU_W_MSK(8,0x3)|CRU_W_MSK(12,0x3))
1833 , RK3288_CRU_CLKSELS_CON(10));
1835 cru_writel(clk_sel1|CRU_W_MSK(15,0x1), RK3288_CRU_CLKSELS_CON(1));
1837 cru_writel(clk_sel1|(CRU_W_MSK(0,0x7)|CRU_W_MSK(3,0x1f)|CRU_W_MSK(8,0x3)|CRU_W_MSK(12,0x7))
1838 , RK3288_CRU_CLKSELS_CON(1));
1841 cru_writel(clk_sel26|CRU_W_MSK(6,0x3), RK3288_CRU_CLKSELS_CON(26));
1845 cru_writel(clk_sel33|CRU_W_MSK(0,0x1f)|CRU_W_MSK(8,0x1f), RK3288_CRU_CLKSELS_CON(33));
1847 cru_writel(cru_mode_con|(RK3288_PLL_MODE_MSK(GPLL_ID)<<16), RK3288_CRU_MODE_CON);
1848 cru_writel(cru_mode_con|(RK3288_PLL_MODE_MSK(CPLL_ID)<<16), RK3288_CRU_MODE_CON);
1850 plls_resume(NPLL_ID);
1851 cru_writel(cru_mode_con|(RK3288_PLL_MODE_MSK(NPLL_ID)<<16), RK3288_CRU_MODE_CON);
1853 // rkpm_ddr_regs_dump(RK_CRU_VIRT,RK3288_PLL_CONS((0), 0),RK3288_PLL_CONS((4), 3));
1854 // rkpm_ddr_regs_dump(RK_CRU_VIRT,RK3288_CRU_MODE_CON,RK3288_CRU_MODE_CON);
1855 // rkpm_ddr_regs_dump(RK_CRU_VIRT,RK3288_CRU_CLKSELS_CON(0),RK3288_CRU_CLKSELS_CON(42));
1859 static __sramdata u32 sysclk_clksel0_con,sysclk_clksel1_con,sysclk_clksel10_con,sysclk_mode_con;
1861 void PIE_FUNC(sysclk_suspend)(u32 sel_clk)
1865 sysclk_clksel0_con = cru_readl(RK3288_CRU_CLKSELS_CON(0));
1866 sysclk_clksel1_con = cru_readl(RK3288_CRU_CLKSELS_CON(1));
1867 sysclk_clksel10_con= cru_readl(RK3288_CRU_CLKSELS_CON(10));
1870 if(sel_clk&(RKPM_CTR_SYSCLK_32K))
1873 sysclk_mode_con= cru_readl(RK3288_CRU_MODE_CON);
1875 |RK3288_PLL_MODE_DEEP(APLL_ID)| RK3288_PLL_MODE_DEEP(CPLL_ID)
1876 | RK3288_PLL_MODE_DEEP(GPLL_ID)|RK3288_PLL_MODE_DEEP(NPLL_ID)
1877 , RK3288_CRU_MODE_CON);
1879 else if(sel_clk&(RKPM_CTR_SYSCLK_DIV))
1884 cru_writel(CRU_W_MSK_SETBITS(div,8,0x1f), RK3188_CRU_CLKSELS_CON(0)); //pd core
1885 cru_writel(CRU_W_MSK_SETBITS(div,3,0x1f), RK3188_CRU_CLKSELS_CON(1));//pd bus
1886 cru_writel(CRU_W_MSK_SETBITS(div,0,0x1f), RK3188_CRU_CLKSELS_CON(10));//pd peri
1890 void PIE_FUNC(sysclk_resume)(u32 sel_clk)
1893 cru_writel(sysclk_clksel0_con|CRU_W_MSK(8,0x1f), RK3188_CRU_CLKSELS_CON(0)); //pd core
1894 cru_writel(sysclk_clksel1_con|CRU_W_MSK(3,0x1f), RK3188_CRU_CLKSELS_CON(1));//pd bus
1895 cru_writel(sysclk_clksel10_con|CRU_W_MSK(0,0x1f), RK3188_CRU_CLKSELS_CON(10));//pd peri
1896 cru_writel(sysclk_mode_con|(RK3288_PLL_MODE_MSK(APLL_ID)<<16)
1897 |(RK3288_PLL_MODE_MSK(CPLL_ID)<<16)
1898 |(RK3288_PLL_MODE_MSK(GPLL_ID)<<16)
1899 |(RK3288_PLL_MODE_MSK(NPLL_ID)<<16), RK3288_CRU_MODE_CON);
1904 static void clks_gating_suspend_init(void)
1906 // get clk gating info
1907 if(rockchip_pie_chunk)
1908 p_rkpm_clkgt_last_set= kern_to_pie(rockchip_pie_chunk, &DATA(rkpm_clkgt_last_set[0]));
1910 p_rkpm_clkgt_last_set=&clk_ungt_msk_1[0];
1911 if(clk_suspend_clkgt_info_get(clk_ungt_msk,p_rkpm_clkgt_last_set, RK3288_CRU_CLKGATES_CON_CNT)
1912 ==RK3288_CRU_CLKGATES_CON(0))
1914 rkpm_set_ops_gtclks(gtclks_suspend,gtclks_resume);
1915 if(rockchip_pie_chunk)
1916 rkpm_set_sram_ops_gtclks(fn_to_pie(rockchip_pie_chunk, &FUNC(gtclks_sram_suspend)),
1917 fn_to_pie(rockchip_pie_chunk, &FUNC(gtclks_sram_resume)));
1919 PM_LOG("%s:clkgt info ok\n",__FUNCTION__);
1922 if(rockchip_pie_chunk)
1923 rkpm_set_sram_ops_sysclk(fn_to_pie(rockchip_pie_chunk, &FUNC(sysclk_suspend))
1924 ,fn_to_pie(rockchip_pie_chunk, &FUNC(sysclk_resume)));
1927 /***************************prepare and finish reg_pread***********************************/
1931 #define GIC_DIST_PENDING_SET 0x200
1932 #define DUMP_GPIO_INT_STATUS(ID) \
1934 if (irq_gpio & (1 << ID)) \
1935 printk("wakeup gpio" #ID ": %08x\n", readl_relaxed(RK_GPIO_VIRT(ID) + GPIO_INT_STATUS)); \
1937 static noinline void rk30_pm_dump_irq(void)
1939 u32 irq_gpio = (readl_relaxed(RK_GIC_VIRT + GIC_DIST_PENDING_SET + 12) >> 17) & 0x1FF;
1940 printk("wakeup irq: %08x %08x %08x %08x\n",
1941 readl_relaxed(RK_GIC_VIRT + GIC_DIST_PENDING_SET + 4),
1942 readl_relaxed(RK_GIC_VIRT + GIC_DIST_PENDING_SET + 8),
1943 readl_relaxed(RK_GIC_VIRT + GIC_DIST_PENDING_SET + 12),
1944 readl_relaxed(RK_GIC_VIRT + GIC_DIST_PENDING_SET + 16));
1945 DUMP_GPIO_INT_STATUS(0);
1946 DUMP_GPIO_INT_STATUS(1);
1947 DUMP_GPIO_INT_STATUS(2);
1948 DUMP_GPIO_INT_STATUS(3);
1949 DUMP_GPIO_INT_STATUS(4);
1950 DUMP_GPIO_INT_STATUS(5);
1951 DUMP_GPIO_INT_STATUS(6);
1952 DUMP_GPIO_INT_STATUS(7);
1953 DUMP_GPIO_INT_STATUS(8);
1957 #define DUMP_GPIO_INTEN(ID) \
1959 u32 en = readl_relaxed(RK_GPIO_VIRT(ID) + GPIO_INTEN); \
1961 rkpm_ddr_printascii("GPIO" #ID "_INTEN: "); \
1962 rkpm_ddr_printhex(en); \
1963 rkpm_ddr_printch('\n'); \
1964 printk(KERN_DEBUG "GPIO%d_INTEN: %08x\n", ID, en); \
1968 //dump while irq is enable
1969 static noinline void rk30_pm_dump_inten(void)
1982 static void rkpm_prepare(void)
1985 u32 temp =reg_readl(RK_GPIO_VIRT(0)+0x30);
1987 // rkpm_ddr_printhex(temp);
1988 reg_writel(temp|0x1<<4,RK_GPIO_VIRT(0)+0x30);
1989 temp =reg_readl(RK_GPIO_VIRT(0)+0x30);
1990 // rkpm_ddr_printhex(temp);
1992 // dump GPIO INTEN for debug
1993 rk30_pm_dump_inten();
1996 static void rkpm_finish(void)
2002 static void interface_ctr_reg_pread(void)
2007 local_flush_tlb_all();
2008 #if 0 // do it in ddr suspend
2009 for (addr = (u32)SRAM_CODE_OFFSET; addr < (u32)(SRAM_CODE_OFFSET+rockchip_sram_size); addr += PAGE_SIZE)
2010 readl_relaxed(addr);
2012 readl_relaxed(RK_PMU_VIRT);
2013 readl_relaxed(RK_GRF_VIRT);
2014 readl_relaxed(RK_DDR_VIRT);
2015 readl_relaxed(RK_GPIO_VIRT(0));
2016 //readl_relaxed(RK30_I2C1_BASE+SZ_4K);
2017 //readl_relaxed(RK_GPIO_VIRT(3));
2019 void PIE_FUNC(ddr_leakage_tst)(void)
2021 cru_writel(RK3288_PLL_MODE_SLOW(DPLL_ID), RK3288_CRU_MODE_CON);
2022 rkpm_sram_printch('\n');
2023 rkpm_sram_printch('t');
2024 rkpm_sram_printch('e');
2025 rkpm_sram_printch('s');
2026 rkpm_sram_printch('t');
2030 static void __init rk3288_suspend_init(void)
2032 struct device_node *parent;
2035 PM_LOG("%s enter\n",__FUNCTION__);
2037 parent = of_find_node_by_name(NULL, "rockchip_suspend");
2039 if (IS_ERR_OR_NULL(parent)) {
2040 PM_ERR("%s dev node err\n", __func__);
2045 if(of_property_read_u32_array(parent,"rockchip,ctrbits",&pm_ctrbits,1))
2047 PM_ERR("%s:get pm ctr error\n",__FUNCTION__);
2050 PM_LOG("%s: pm_ctrbits =%x\n",__FUNCTION__,pm_ctrbits);
2052 rkpm_set_ctrbits(pm_ctrbits);
2054 clks_gating_suspend_init();
2056 rkpm_set_ops_plls(pm_plls_suspend,pm_plls_resume);
2058 //rkpm_set_sram_ops_ddr(fn_to_pie(rockchip_pie_chunk, &FUNC(ddr_leakage_tst)),NULL);
2059 rkpm_set_ops_prepare_finish(rkpm_prepare,rkpm_finish);
2060 //rkpm_set_ops_regs_pread(interface_ctr_reg_pread);
2062 rkpm_set_ops_regs_sleep(pm_sleep_func_save,rkpm_slp_mode_set,pm_sleep_func_rusume_first,pm_sleep_func_rusume_last);
2063 if(rockchip_pie_chunk)
2064 rkpm_set_sram_ops_printch(fn_to_pie(rockchip_pie_chunk, &FUNC(sram_printch)));
2066 rkpm_set_ops_printch(ddr_printch);