pause SMP and fix idle clk gate when change ddr frequence
[firefly-linux-kernel-4.4.55.git] / arch / arm / mach-rockchip / pm-rk3288.c
1
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>
9 #include <linux/wakeup_reason.h>
10 #include <linux/pm.h>
11 #include <linux/suspend.h>
12 #include <linux/of.h>
13 #include <asm/io.h>
14 #include <linux/of.h>
15 #include <linux/of_address.h>
16
17 #include <linux/rockchip/cpu.h>
18 //#include <linux/rockchip/cru.h>
19 #include <linux/rockchip/grf.h>
20 #include <linux/rockchip/iomap.h>
21 #include "pm.h"
22 #include <linux/irqchip/arm-gic.h>
23
24 #define CPU 3288
25 //#include "sram.h"
26 #include "pm-pie.c"
27
28 __weak void rk_usb_power_down(void);
29 __weak void rk_usb_power_up(void);
30
31 static void ddr_pin_set_pull(u8 port,u8 bank,u8 b_gpio,u8 fun);
32 static void ddr_gpio_set_in_output(u8 port,u8 bank,u8 b_gpio,u8 type);
33 static void ddr_pin_set_fun(u8 port,u8 bank,u8 b_gpio,u8 fun);
34
35
36 /*************************cru define********************************************/
37
38
39 #define RK3288_CRU_UNGATING_OPS(id) cru_writel(CRU_W_MSK_SETBITS(0,(id)%16,0x1),RK3288_CRU_GATEID_CONS((id)))
40 #define RK3288_CRU_GATING_OPS(id) cru_writel(CRU_W_MSK_SETBITS(1,(id)%16,0x1),RK3288_CRU_GATEID_CONS((id)))
41
42 enum rk_plls_id {
43         APLL_ID = 0,
44         DPLL_ID,
45         CPLL_ID,
46         GPLL_ID,
47         NPLL_ID,
48         END_PLL_ID,
49 };
50
51 #define RK3288_PLL_PWR_DN_MSK (0x1<<1)
52 #define RK3288_PLL_PWR_DN CRU_W_MSK_SETBITS(1,1,0x1)
53 #define RK3288_PLL_PWR_ON CRU_W_MSK_SETBITS(0,1,0x1)
54
55
56 #define RK3288_PLL_RESET                CRU_W_MSK_SETBITS(1,5,0x1)
57 #define RK3288_PLL_RESET_RESUME CRU_W_MSK_SETBITS(0,5,0x1)
58
59 #define RK3288_PLL_BYPASS_MSK (0x1<<0)
60 #define RK3288_PLL_BYPASS CRU_W_MSK_SETBITS(1,0,0x1)
61 #define RK3288_PLL_NO_BYPASS CRU_W_MSK_SETBITS(0,0,0x1)
62
63
64 /*******************************gpio define **********************************************/
65
66 /* GPIO control registers */
67 #define GPIO_SWPORT_DR          0x00
68 #define GPIO_SWPORT_DDR         0x04
69 #define GPIO_INTEN                      0x30
70 #define GPIO_INTMASK            0x34
71 #define GPIO_INTTYPE_LEVEL      0x38
72 #define GPIO_INT_POLARITY       0x3c
73 #define GPIO_INT_STATUS         0x40
74 #define GPIO_INT_RAWSTATUS      0x44
75 #define GPIO_DEBOUNCE           0x48
76 #define GPIO_PORTS_EOI          0x4c
77 #define GPIO_EXT_PORT           0x50
78 #define GPIO_LS_SYNC            0x60
79
80 /***********************************sleep func*********************************************/
81
82 #define RKPM_BOOTRAM_PHYS (RK3288_BOOTRAM_PHYS)
83 #define RKPM_BOOTRAM_BASE (RK_BOOTRAM_VIRT)
84 #define RKPM_BOOTRAM_SIZE (RK3288_BOOTRAM_SIZE)
85
86 // sys resume code in boot ram
87 #define  RKPM_BOOT_CODE_PHY  (RKPM_BOOTRAM_PHYS+RKPM_BOOT_CODE_OFFSET)
88 #define  RKPM_BOOT_CODE_BASE  (RKPM_BOOTRAM_BASE+RKPM_BOOT_CODE_OFFSET)
89
90
91 // sys resume data in boot ram
92 #define  RKPM_BOOT_DATA_PHY  (RKPM_BOOTRAM_PHYS+RKPM_BOOT_DATA_OFFSET)
93 #define  RKPM_BOOT_DATA_BASE  (RKPM_BOOTRAM_BASE+RKPM_BOOT_DATA_OFFSET)
94
95 // ddr resume data in boot ram
96 #define  RKPM_BOOT_DDRCODE_PHY   (RKPM_BOOTRAM_PHYS + RKPM_BOOT_DDRCODE_OFFSET)
97 #define  RKPM_BOOT_DDRCODE_BASE  (RKPM_BOOTRAM_BASE+RKPM_BOOT_DDRCODE_OFFSET)
98
99 #define RKPM_BOOT_CPUSP_PHY (RKPM_BOOTRAM_PHYS+((RKPM_BOOTRAM_SIZE-1)&~0x7))
100
101 // the value is used to control cpu resume flow
102 static u32 sleep_resume_data[RKPM_BOOTDATA_ARR_SIZE];
103 static char *resume_data_base=(char *)( RKPM_BOOT_DATA_BASE);
104 static char *resume_data_phy=  (char *)( RKPM_BOOT_DATA_PHY);
105
106
107
108 #define BOOT_RAM_SIZE   (4*1024)
109 #define INT_RAM_SIZE            (64*1024)
110
111 static char boot_ram_data[BOOT_RAM_SIZE+4*10];
112 static char int_ram_data[INT_RAM_SIZE];
113
114 char * ddr_get_resume_code_info(u32 *size);
115 char * ddr_get_resume_data_info(u32 *size);
116
117 /**
118 ddr code and data
119
120 *** code start
121 ---data offset-- 
122 ---code----
123 ---data----
124 */
125 static void sram_data_for_sleep(char *boot_save, char *int_save,u32 flag)
126 {       
127         
128         char *addr_base,*addr_phy,*data_src,*data_dst;
129         u32 sr_size,data_size;
130
131         addr_base=(char *)RKPM_BOOTRAM_BASE;
132         addr_phy=(char *)RKPM_BOOTRAM_PHYS;
133         sr_size=RKPM_BOOTRAM_SIZE;
134
135         // save boot sram
136          if(boot_save)
137                  memcpy(boot_save,addr_base, sr_size);
138
139         // move resume code and date to boot sram
140         // move sys code
141         data_dst=(char *)RKPM_BOOT_CODE_BASE;
142         data_src=(char *)rkpm_slp_cpu_resume;
143         data_size=RKPM_BOOT_CODE_SIZE;
144         memcpy((char *)data_dst,(char *)data_src, data_size);
145
146         // move sys data
147         data_dst=(char *)resume_data_base;
148         data_src=(char *)sleep_resume_data;
149         data_size=sizeof(sleep_resume_data);
150         memcpy((char *)data_dst,(char *)data_src, data_size);
151             
152         if(flag)
153         {
154                 /*************************ddr code cpy*************************************/
155                 // ddr code
156                 data_dst=(char *)(char *)RKPM_BOOT_DDRCODE_BASE;
157                 data_src=(char *)ddr_get_resume_code_info(&data_size);
158
159                 data_size=RKPM_ALIGN(data_size,4);
160
161                 memcpy((char *)data_dst,(char *)data_src, data_size);
162
163                 // ddr data
164                 data_dst=(char *)(data_dst+data_size);
165
166                 data_src=(char *)ddr_get_resume_data_info(&data_size);
167                 data_size=RKPM_ALIGN(data_size,4);
168                 memcpy((char *)data_dst,(char *)data_src, data_size);
169
170                 /*************************ddr code cpy  end*************************************/
171                 flush_icache_range((unsigned long)addr_base, (unsigned long)addr_base + sr_size);
172                 outer_clean_range((phys_addr_t) addr_phy, (phys_addr_t)(addr_phy)+sr_size);
173                 /*************************int mem bak*************************************/
174                 // int mem
175                 addr_base=(char *)rockchip_sram_virt;
176                 addr_phy=(char *)pie_to_phys(rockchip_pie_chunk,(unsigned long )rockchip_sram_virt);
177                 sr_size=rockchip_sram_size;
178                 //  rkpm_ddr_printascii("piephy\n");
179                 //rkpm_ddr_printhex(addr_phy);
180                 //mmap
181                 if(int_save)
182                     memcpy(int_save,addr_base, sr_size);
183
184                 flush_icache_range((unsigned long)addr_base, (unsigned long)addr_base + sr_size);
185                 outer_clean_range((phys_addr_t) addr_phy, (phys_addr_t)(addr_phy)+sr_size);
186         }    
187      
188  }
189
190 static void sram_data_resume(char *boot_save, char *int_save,u32 flag)
191 {  
192  
193     char *addr_base,*addr_phy;
194     u32 sr_size;
195     
196     addr_base=(char *)RKPM_BOOTRAM_BASE;
197     addr_phy=(char *)RKPM_BOOTRAM_PHYS;
198     sr_size=RKPM_BOOTRAM_SIZE;
199     // save boot sram
200     if(boot_save)
201         memcpy(addr_base,boot_save, sr_size);
202
203     flush_icache_range((unsigned long)addr_base, (unsigned long)addr_base + sr_size);
204     outer_clean_range((phys_addr_t) addr_phy, (phys_addr_t)addr_phy+sr_size);
205
206     if(flag)
207     {
208         // int mem
209         addr_base=(char *)rockchip_sram_virt;
210         addr_phy=(char *)pie_to_phys(rockchip_pie_chunk,(unsigned long )rockchip_sram_virt);
211         sr_size=rockchip_sram_size;
212
213         if(int_save)
214         memcpy(addr_base, int_save,sr_size);
215
216         flush_icache_range((unsigned long)addr_base, (unsigned long)addr_base + sr_size);
217         outer_clean_range((phys_addr_t) addr_phy,(unsigned long)addr_phy+sr_size);
218      }
219 }
220
221 /**************************************gic save and resume**************************/
222 #define  RK_GICD_BASE (RK_GIC_VIRT)
223 #define RK_GICC_BASE (RK_GIC_VIRT+RK3288_GIC_DIST_SIZE)
224
225 #define PM_IRQN_START 32
226 #define PM_IRQN_END     107//107
227 static void pm_gic_enable(u32 irqs)
228 {
229
230         int irqstart=0;
231         u32 bit_off;
232         void __iomem *reg_off;
233         unsigned int gic_irqs;
234
235         gic_irqs = PM_IRQN_END;
236         irqstart=PM_IRQN_START;//PM_IRQN_START;
237
238         reg_off=(irqs/32)*4+GIC_DIST_ENABLE_SET+RK_GICD_BASE;
239         bit_off=irqs%32;
240         writel_relaxed(readl_relaxed(reg_off)|(1<<bit_off),reg_off);
241
242         dsb();
243 }
244   
245 static void rkpm_gic_disable(u32 irqs)
246 {
247         int irqstart=0;
248         u32 bit_off;    
249         void __iomem *reg_off;
250         unsigned int gic_irqs;
251
252         gic_irqs = PM_IRQN_END;
253         irqstart=PM_IRQN_START;//PM_IRQN_START;
254
255         reg_off=(irqs/32)*4+GIC_DIST_ENABLE_CLEAR+RK_GICD_BASE;
256         bit_off=irqs%32;
257         writel_relaxed(readl_relaxed(reg_off)&~(1<<bit_off),reg_off);
258         dsb();
259 }
260   
261 #define gic_reg_dump(a,b,c)  {}//reg_dump((a),(b),(c))
262   
263 static u32 slp_gic_save[260+50];
264
265
266 static void rkpm_gic_dist_save(u32 *context)
267 {
268      int i = 0,j,irqstart=0;
269      unsigned int gic_irqs;
270      
271      gic_irqs = readl_relaxed(RK_GICD_BASE + GIC_DIST_CTR) & 0x1f;
272      gic_irqs = (gic_irqs + 1) * 32;
273      if (gic_irqs > 1020)
274      gic_irqs = 1020;
275      //printk("gic_irqs=%d\n",gic_irqs);
276      //gic_irqs = PM_IRQN_END;
277      irqstart=PM_IRQN_START;//PM_IRQN_START;
278      
279      i = 0;
280      //level
281      for (j = irqstart; j < gic_irqs; j += 16)
282       context[i++]=readl_relaxed(RK_GICD_BASE + GIC_DIST_CONFIG + (j * 4) / 16);
283      gic_reg_dump("gic level",j,RK_GICD_BASE + GIC_DIST_CONFIG);
284
285      /*
286      * Set all global interrupts to this CPU only.
287      */
288      for(j = 0; j < gic_irqs; j += 4)
289          context[i++]=readl_relaxed(RK_GICD_BASE + GIC_DIST_TARGET +    (j * 4) / 4);
290      
291      gic_reg_dump("gic trig",j,RK_GICD_BASE + GIC_DIST_TARGET);
292
293      //pri
294      for (j = 0; j < gic_irqs; j += 4)
295          context[i++]=readl_relaxed(RK_GICD_BASE+ GIC_DIST_PRI + (j * 4) / 4);
296      gic_reg_dump("gic pri",j,RK_GICD_BASE + GIC_DIST_PRI);      
297
298
299      
300
301      //secure
302      for (j = 0; j < gic_irqs; j += 32)
303          context[i++]=readl_relaxed(RK_GICD_BASE + 0x80 + (j * 4) / 32);
304      gic_reg_dump("gic secure",j,RK_GICD_BASE + 0x80); 
305          
306      for (j = irqstart; j < gic_irqs; j += 32)
307          context[i++]=readl_relaxed(RK_GICD_BASE + GIC_DIST_PENDING_SET + (j * 4) / 32);
308      
309      gic_reg_dump("gic PENDING",j,RK_GICD_BASE + GIC_DIST_PENDING_SET);  
310
311
312      
313     #if 0
314      //disable
315      for (j = 0; j < gic_irqs; j += 32)
316          context[i++]=readl_relaxed(RK_GICD_BASE + GIC_DIST_ENABLE_CLEAR + (j * 4) / 32);
317      
318      gic_reg_dump("gic dis",j,RK_GICD_BASE + GIC_DIST_ENABLE_CLEAR);
319     #endif
320      //enable
321      for (j = 0; j < gic_irqs; j += 32)
322          context[i++]=readl_relaxed(RK_GICD_BASE + GIC_DIST_ENABLE_SET + (j * 4) / 32);
323
324         //sram_printhex(j);
325      gic_reg_dump("gic en",j,RK_GICD_BASE + GIC_DIST_ENABLE_SET);  
326
327      
328      
329      gic_reg_dump("gicc",0x1c,RK_GICC_BASE);     
330      gic_reg_dump("giccfc",0,RK_GICC_BASE+0xfc);
331
332      context[i++]=readl_relaxed(RK_GICC_BASE + GIC_CPU_PRIMASK);
333      context[i++]=readl_relaxed(RK_GICC_BASE + GIC_CPU_CTRL);
334      context[i++]=readl_relaxed(RK_GICD_BASE + GIC_DIST_CTRL);
335
336      
337     #if 0
338      context[i++]=readl_relaxed(RK_GICC_BASE + GIC_CPU_BINPOINT);
339      context[i++]=readl_relaxed(RK_GICC_BASE + GIC_CPU_PRIMASK);
340      context[i++]=readl_relaxed(RK_GICC_BASE + GIC_DIST_SOFTINT);
341      context[i++]=readl_relaxed(RK_GICC_BASE + GIC_CPU_CTRL);
342      context[i++]=readl_relaxed(RK_GICD_BASE + GIC_DIST_CTRL);
343     #endif      
344     #if 0  //rk319x is not need
345     
346      for (j = irqstart; j < gic_irqs; j += 32)
347      {
348          writel_relaxed(0xffffffff, RK_GICD_BASE + GIC_DIST_ENABLE_CLEAR + j * 4 / 32);
349          dsb();
350
351      }
352     #endif  
353
354 }
355
356 static void rkpm_gic_dist_resume(u32 *context)
357 {
358
359          int i = 0,j,irqstart=0;
360          unsigned int gic_irqs;
361
362          
363          gic_irqs = readl_relaxed(RK_GICD_BASE + GIC_DIST_CTR) & 0x1f;
364          gic_irqs = (gic_irqs + 1) * 32;
365          if (gic_irqs > 1020)
366                  gic_irqs = 1020;
367          
368          
369          //gic_irqs = PM_IRQN_END;
370          irqstart=PM_IRQN_START;//PM_IRQN_START;
371
372          writel_relaxed(0,RK_GICC_BASE + GIC_CPU_CTRL);
373          dsb();
374          writel_relaxed(0,RK_GICD_BASE + GIC_DIST_CTRL);
375          dsb();
376          for (j = irqstart; j < gic_irqs; j += 32)
377          {
378                  writel_relaxed(0xffffffff, RK_GICD_BASE + GIC_DIST_ENABLE_CLEAR + j * 4 / 32);
379                  dsb();
380          }
381
382
383          i = 0;
384
385          //trig
386          for (j = irqstart; j < gic_irqs; j += 16)
387          {
388                  writel_relaxed(context[i++],RK_GICD_BASE + GIC_DIST_CONFIG + j * 4 / 16);
389                  dsb();
390          }
391          gic_reg_dump("gic level",j,RK_GICD_BASE + GIC_DIST_CONFIG);     
392
393          /*
394          * Set all global interrupts to this CPU only.
395          */
396          for (j = 0; j < gic_irqs; j += 4)
397          {
398                  writel_relaxed(context[i++],RK_GICD_BASE + GIC_DIST_TARGET +  (j * 4) / 4);
399                  dsb();
400          }
401          gic_reg_dump("gic target",j,RK_GICD_BASE + GIC_DIST_TARGET);  
402
403          //pri
404          for (j = 0; j < gic_irqs; j += 4)
405          {
406                  writel_relaxed(context[i++],RK_GICD_BASE+ GIC_DIST_PRI + (j * 4) / 4);
407                  
408                  dsb();
409          }
410          gic_reg_dump("gic pri",j,RK_GICD_BASE + GIC_DIST_PRI);  
411
412          
413          //secu
414          for (j = 0; j < gic_irqs; j += 32)
415          {
416                  writel_relaxed(context[i++],RK_GICD_BASE + 0x80 + (j * 4 )/ 32);
417                  #if 0
418                  sram_printhex((j * 4 )/ 32);
419                  
420                  sram_printch('_');
421                  sram_printhex(temp);
422                  
423                  sram_printch('_');
424                  sram_printhex(readl_relaxed(RK_GICD_BASE + 0x80 + (j * 4 )/ 32));
425                  sram_printch('\n');
426 #endif
427                  
428                  dsb();
429          }
430
431          gic_reg_dump("gic secu",j,RK_GICD_BASE + 0x80);         
432
433
434          //pending
435          for (j = irqstart; j < gic_irqs; j += 32)
436          {
437                  //writel_relaxed(context[i++],RK_GICD_BASE + GIC_DIST_PENDING_SET + j * 4 / 32);
438                  i++;
439                  dsb();
440          }
441          gic_reg_dump("gic pending",j,RK_GICD_BASE + GIC_DIST_PENDING_SET);      
442
443
444          //disable
445 #if 0
446          for (j = 0; j < gic_irqs; j += 32)
447          {
448                  writel_relaxed(context[i++],RK_GICD_BASE + GIC_DIST_ENABLE_CLEAR + j * 4 / 32);
449                  
450                  dsb();
451          }
452          gic_reg_dump("gic disable",j,RK_GICD_BASE + GIC_DIST_ENABLE_CLEAR);     
453          
454 #else
455         //for (j = 0; j < gic_irqs; j += 32)
456                 // writel_relaxed(0xffffffff,RK_GICD_BASE + GIC_DIST_ENABLE_CLEAR + j * 4 / 32);
457 #endif
458          
459                  
460          //enable
461          for (j = 0; j < gic_irqs; j += 32)
462          {
463                  writel_relaxed(context[i++],RK_GICD_BASE + GIC_DIST_ENABLE_SET + (j * 4) / 32);
464                  
465                  dsb();
466          }
467         // sram_printhex(j);
468          gic_reg_dump("gic enable",j,RK_GICD_BASE + GIC_DIST_ENABLE_SET);  
469
470          writel_relaxed(context[i++],RK_GICC_BASE + GIC_CPU_PRIMASK);
471          
472          writel_relaxed(context[i++],RK_GICC_BASE + GIC_CPU_CTRL);
473
474          writel_relaxed(context[i++],RK_GICD_BASE + GIC_DIST_CTRL);
475
476          gic_reg_dump("gicc",0x1c,RK_GICC_BASE);         
477          gic_reg_dump("giccfc",0,RK_GICC_BASE+0xfc);     
478  
479 }
480
481 /**************************************regs save and resume**************************/
482
483 void slp_regs_save(u32 *data,void __iomem * base,u32 st_offset,u32 end_offset)
484 {
485      u32 i;
486          u32 cnt=(end_offset-st_offset)/4+1;
487      for(i=0;i<cnt;i++)
488      {
489          data[i]=readl_relaxed(base+st_offset+i*4);
490      }   
491 }
492
493 void slp_regs_resume(u32 *data,void __iomem * base,u32 st_offset,u32 end_offset,u32 w_msk)
494 {
495      u32 i;
496      u32 cnt=(end_offset-st_offset)/4+1;
497      for(i=0;i<cnt;i++)
498      {           
499          reg_writel(data[i]|w_msk,(base+st_offset+i*4));
500      }   
501 }
502
503 void slp_regs_w_msk_resume(u32 *data,void __iomem * base,u32 st_offset,u32 end_offset,u32 *w_msk)
504 {
505         u32 i;
506         u32 cnt=(end_offset-st_offset)/4+1;
507          for(i=0;i<cnt;i++)
508          {               
509                  reg_writel(data[i]|w_msk[i],(base+st_offset+i*4));
510          }       
511 }
512
513 /**************************************uarts save and resume**************************/
514
515 #define RK3288_UART_NUM (4)
516
517 static void __iomem *slp_uart_base[RK3288_UART_NUM]={NULL};
518 static u32 slp_uart_phy[RK3288_UART_NUM]={(0xff180000),(0xff190000),(0xff690000),(0xff1b0000)};
519
520 static u32 slp_uart_data[RK3288_UART_NUM][10];
521 static u32 slp_uart_data_flag[RK3288_UART_NUM];
522
523  
524 #define UART_DLL        0       /* Out: Divisor Latch Low */
525 #define UART_DLM        1       /* Out: Divisor Latch High */
526
527 #define UART_IER        1
528 #define UART_FCR        2
529  
530 #define UART_LCR        3       /* Out: Line Control Register */
531 #define UART_MCR        4
532
533  void slp_uart_save(int ch)
534  {
535          int i=0;
536         void __iomem *b_addr=slp_uart_base[ch];
537          int idx=RK3288_CLKGATE_PCLK_UART0+ch;
538          u32 gate_reg;
539          if(b_addr==NULL || ch>=RK3288_UART_NUM)
540                 return; 
541      
542         if(ch==2)
543         {
544             idx=RK3288_CLKGATE_PCLK_UART2;
545             b_addr=RK_DEBUG_UART_VIRT;
546         }
547
548         
549         gate_reg=cru_readl(RK3288_CRU_GATEID_CONS(idx));     
550         RK3288_CRU_UNGATING_OPS(idx); 
551          i=0;
552          slp_uart_data[ch][i++]=readl_relaxed(b_addr+UART_LCR*4); 
553          writel_relaxed(readl_relaxed(b_addr+UART_LCR*4)|0x80,b_addr+UART_LCR*4);
554          
555          slp_uart_data[ch][i++]=readl_relaxed(b_addr+UART_DLL*4);
556          slp_uart_data[ch][i++]=readl_relaxed(b_addr+UART_DLM*4);
557          
558          writel_relaxed(readl_relaxed(b_addr+UART_LCR*4)&(~0x80),b_addr+UART_LCR*4);
559          slp_uart_data[ch][i++]=readl_relaxed(b_addr+UART_IER*4);
560          slp_uart_data[ch][i++]=readl_relaxed(b_addr+UART_FCR*4);
561          slp_uart_data[ch][i++]=readl_relaxed(b_addr+UART_MCR*4);
562          
563         cru_writel(gate_reg|CRU_W_MSK(idx%16,0x1),RK3288_CRU_GATEID_CONS(idx));         
564  
565  }
566  
567  void slp_uart_resume(int ch)
568  {       
569         int i=0;
570
571         u32 temp;
572         void __iomem *b_addr=slp_uart_base[ch];
573         int idx=RK3288_CLKGATE_PCLK_UART0+ch;
574         u32 gate_reg;
575         
576         //rkpm_ddr_printascii("\nch");
577      //   rkpm_ddr_printhex(b_addr);
578         
579         if(b_addr==NULL || ch>=RK3288_UART_NUM)
580             return;     
581         
582         if(ch==2)
583             idx=RK3288_CLKGATE_PCLK_UART2;
584
585         //rkpm_ddr_printhex(ch);
586
587         gate_reg=cru_readl(RK3288_CRU_GATEID_CONS(idx));     
588         RK3288_CRU_UNGATING_OPS(idx); 
589  
590          i=0;
591          temp=slp_uart_data[ch][i++];
592          writel_relaxed(readl_relaxed(b_addr+UART_LCR*4)|0x80,b_addr+UART_LCR*4);
593          
594          writel_relaxed(slp_uart_data[ch][i++],b_addr+UART_DLL*4);
595          writel_relaxed(slp_uart_data[ch][i++],b_addr+UART_DLM*4);
596          
597          writel_relaxed(readl_relaxed(b_addr+UART_LCR*4)&(~0x80),b_addr+UART_LCR*4);
598  
599          writel_relaxed(slp_uart_data[ch][i++],b_addr+UART_IER*4);
600          writel_relaxed(slp_uart_data[ch][i++],b_addr+UART_FCR*4);
601          writel_relaxed(slp_uart_data[ch][i++],b_addr+UART_MCR*4);
602          
603          writel_relaxed(temp,b_addr+UART_LCR*4);
604          
605          cru_writel(gate_reg|CRU_W_MSK(idx%16,0x1),RK3288_CRU_GATEID_CONS(idx));         
606  }
607  
608 /**************************************i2c save and resume**************************/
609
610 //#define RK3288_I2C_REG_DUMP
611 #define RK3288_I2C_NUM (6)
612 static u32 slp_i2c_phy[RK3288_I2C_NUM]={(0xff650000),(0xff140000),(0xff660000),(0xff150000),(0xff160000),(0xff170000)};
613 static void __iomem *slp_i2c_base[RK3288_I2C_NUM]={NULL};
614
615 static u32 slp_i2c_data[RK3288_I2C_NUM][10];
616
617 void slp_i2c_save(int ch)
618 {
619
620         void __iomem *b_addr=slp_i2c_base[ch];
621         int idx= (ch>1) ? (RK3288_CLKGATE_PCLK_I2C2+ch-2):(RK3288_CLKGATE_PCLK_I2C0+ch);
622         u32 gate_reg;
623
624         if(!b_addr)
625                 return;
626     
627         gate_reg=cru_readl(RK3288_CRU_GATEID_CONS(idx));     
628         RK3288_CRU_UNGATING_OPS(idx); 
629         
630         #ifdef RK3288_I2C_REG_DUMP
631         rkpm_ddr_printascii("i2c save");
632         rkpm_ddr_printhex(ch);
633         rkpm_ddr_printch('\n');        
634         rkpm_ddr_regs_dump(b_addr,0x0,0xc);
635         #endif
636         
637         slp_regs_save(&slp_i2c_data[ch][0],b_addr,0x0,0xc);  
638         
639
640         cru_writel(gate_reg|CRU_W_MSK(idx%16,0x1),RK3288_CRU_GATEID_CONS(idx));         
641
642 }
643 void slp_i2c_resume(int ch)
644 {
645         void __iomem *b_addr=slp_i2c_base[ch];
646         int idx= (ch>1) ? (RK3288_CLKGATE_PCLK_I2C2+ch-2):(RK3288_CLKGATE_PCLK_I2C0+ch);
647         u32 gate_reg;
648         
649         if(!b_addr)
650                 return;
651         gate_reg=cru_readl(RK3288_CRU_GATEID_CONS(idx));     
652         RK3288_CRU_UNGATING_OPS(idx); 
653
654         slp_regs_resume(&slp_i2c_data[ch][0],b_addr,0x0,0xc,0x0);  
655
656         #ifdef RK3288_I2C_REG_DUMP
657         rkpm_ddr_printascii("i2c resume");
658         rkpm_ddr_printhex(ch);
659         rkpm_ddr_printch('\n');        
660         rkpm_ddr_regs_dump(b_addr,0x0,0xc);
661         #endif
662   
663         cru_writel(gate_reg|CRU_W_MSK(idx%16,0x1),RK3288_CRU_GATEID_CONS(idx));         
664 }
665
666 /**************************************gpios save and resume**************************/
667 #define RK3288_GPIO_CH (9)
668 static u32 slp_gpio_data[RK3288_GPIO_CH][10]; 
669 static u32 slp_grf_iomux_data[RK3288_GPIO_CH*4];
670 static u32 slp_grf_io_pull_data[RK3288_GPIO_CH*4];
671
672 static void gpio_ddr_dump_reg(int ports)
673 {
674     void __iomem *b_addr=RK_GPIO_VIRT(ports);
675     
676     rkpm_ddr_printascii("gpio-");
677     rkpm_ddr_printhex(ports);
678     rkpm_ddr_printhex('\n');      
679     
680     rkpm_ddr_reg_offset_dump(b_addr,GPIO_SWPORT_DR);
681     rkpm_ddr_reg_offset_dump(b_addr,GPIO_SWPORT_DDR);      
682     rkpm_ddr_reg_offset_dump(b_addr,GPIO_INTEN);  
683     rkpm_ddr_reg_offset_dump(b_addr,GPIO_INTMASK);     
684     rkpm_ddr_reg_offset_dump(b_addr,GPIO_INTTYPE_LEVEL);  
685     rkpm_ddr_reg_offset_dump(b_addr,GPIO_INT_POLARITY);   
686     rkpm_ddr_reg_offset_dump(b_addr,GPIO_DEBOUNCE);   
687     rkpm_ddr_reg_offset_dump(b_addr,GPIO_LS_SYNC);    
688     rkpm_ddr_printhex('\n');      
689
690     rkpm_ddr_printascii("iomux\n");
691     rkpm_ddr_regs_dump(RK_GRF_VIRT,0x0+ports*4*4,0x0+ports*4*4+3*4);
692
693     rkpm_ddr_printascii("iomux\n");
694     rkpm_ddr_regs_dump(RK_GRF_VIRT,0x130+ports*4*4,ports*4*4+3*4);
695
696 }
697
698  static void slp_pin_gpio_save(int ports)
699  {
700         int i;
701         void __iomem *b_addr=RK_GPIO_VIRT(ports);
702         int idx=RK3288_CLKGATE_PCLK_GPIO1+ports-1;
703         u32 gate_reg;
704
705         if(ports==0||ports>=RK3288_GPIO_CH)
706                 return;
707         
708          gate_reg=cru_readl(RK3288_CRU_GATEID_CONS(idx));     
709          RK3288_CRU_UNGATING_OPS(idx); 
710          
711          //gpio_ddr_dump_reg(ports);          
712          i=0;
713          slp_gpio_data[ports][i++]=readl_relaxed(b_addr+GPIO_SWPORT_DR);
714          slp_gpio_data[ports][i++]=readl_relaxed(b_addr+GPIO_SWPORT_DDR);
715          slp_gpio_data[ports][i++]=readl_relaxed(b_addr+GPIO_INTEN);     
716          slp_gpio_data[ports][i++]=readl_relaxed(b_addr+GPIO_INTMASK);  
717          slp_gpio_data[ports][i++]=readl_relaxed(b_addr+GPIO_INTTYPE_LEVEL);     
718          slp_gpio_data[ports][i++]=readl_relaxed(b_addr+GPIO_INT_POLARITY);
719          slp_gpio_data[ports][i++]=readl_relaxed(b_addr+GPIO_DEBOUNCE);
720          slp_gpio_data[ports][i++]=readl_relaxed(b_addr+GPIO_LS_SYNC); 
721
722         if(ports>0)
723         {
724             slp_regs_save(&slp_grf_iomux_data[ports*4],RK_GRF_VIRT,0x0+ports*4*4,0x0+ports*4*4+3*4);  
725             slp_regs_save(&slp_grf_io_pull_data[ports*4],RK_GRF_VIRT,0x130+ports*4*4,ports*4*4+3*4);
726          }
727
728      
729         cru_writel(gate_reg|CRU_W_MSK(idx%16,0x1),RK3288_CRU_GATEID_CONS(idx));         
730  
731  }
732
733  static void slp_pin_gpio_resume (int ports)
734  {
735          int i;
736         void __iomem *b_addr=RK_GPIO_VIRT(ports);
737         int idx=RK3288_CLKGATE_PCLK_GPIO1+ports-1;
738          u32 gate_reg;
739          
740          if(ports==0||ports>=RK3288_GPIO_CH)
741                 return;
742           gate_reg=cru_readl(RK3288_CRU_GATEID_CONS(idx));     
743          RK3288_CRU_UNGATING_OPS(idx); 
744
745
746         if(ports>0)
747         {
748             slp_regs_resume(&slp_grf_iomux_data[ports*4],RK_GRF_VIRT,0x0+ports*4*4,0x0+ports*4*4+3*4,0xffff0000);  
749             slp_regs_resume(&slp_grf_io_pull_data[ports*4],RK_GRF_VIRT,0x130+ports*4*4,ports*4*4+3*4,0xffff0000);
750         }
751  
752         i=0;
753         writel_relaxed(slp_gpio_data[ports][i++],b_addr+GPIO_SWPORT_DR);
754         writel_relaxed(slp_gpio_data[ports][i++],b_addr+GPIO_SWPORT_DDR);
755         writel_relaxed(slp_gpio_data[ports][i++],b_addr+GPIO_INTEN);     
756         writel_relaxed(slp_gpio_data[ports][i++],b_addr+GPIO_INTMASK); 
757         writel_relaxed(slp_gpio_data[ports][i++],b_addr+GPIO_INTTYPE_LEVEL);     
758         writel_relaxed(slp_gpio_data[ports][i++],b_addr+GPIO_INT_POLARITY);
759         writel_relaxed(slp_gpio_data[ports][i++],b_addr+GPIO_DEBOUNCE);
760         writel_relaxed(slp_gpio_data[ports][i++],b_addr+GPIO_LS_SYNC);      
761         
762         //gpio_ddr_dump_reg(ports);     
763         cru_writel(gate_reg|CRU_W_MSK(idx%16,0x1),RK3288_CRU_GATEID_CONS(idx));         
764  
765  }
766  
767  static inline u32 rkpm_l2_config(void)
768  {
769      u32 l2ctlr;
770      asm("mrc p15, 1, %0, c9, c0, 2" : "=r" (l2ctlr));
771          return l2ctlr;
772  }
773 /**************************************sleep func**************************/
774
775 void ddr_reg_save(uint32_t *pArg);
776 void fiq_glue_resume(void);
777 void rk30_cpu_resume(void);
778 void rk30_l2_cache_init_pm(void);
779 //static void rk319x_pm_set_power_domain(enum pmu_power_domain pd, bool state);
780 void ddr_cfg_to_lp_mode(void);
781 void l2x0_inv_all_pm(void);
782 void rk30_cpu_while_tst(void);
783
784 #if 0
785 static u32 slp_grf_soc_con_data[5];
786 static u32 slp_grf_soc_con_w_msk[5]={0x70000,0x40ff0000,0xffff0000,0xffff0000,0xffff0000};
787
788 static u32 slp_grf_cpu_con_data[5];
789 static u32 slp_grf_cpu_con_w_msk[5]={0xefff0000,0xffff0000,0xcfff0000,0xffff0000,0x7fff0000};
790
791 static u32 slp_grf_uoc0_con_data[4];
792 static u32 slp_grf_uoc0_con_w_msk[4]={0xffff0000,0xffff0000,0x7dff0000,0x7fff0000};// uoc0_con4 bit 15?? 
793
794 static u32 slp_grf_uoc1_con_data[2];
795 static u32 slp_grf_uoc1_con_w_msk[2]={0x1fdc0000,0x047f0000};
796
797 static u32 slp_grf_uoc2_con_data[2];
798 static u32 slp_grf_uoc2_con_w_msk[2]={0x7fff0000,0x1f0000};
799
800 static u32 slp_grf_uoc3_con_data[2];
801 static u32 slp_grf_uoc3_con_w_msk[2]={0x3ff0000,0x0fff0000};
802
803 #endif
804 static u32 slp_pmu_pwrmode_con_data[1];
805
806
807 static u32 slp_nandc_data[8];
808 static void __iomem *rk30_nandc_base=NULL;
809
810 #define MS_37K (37)
811 #define US_24M (24)
812
813 void inline pm_io_base_map(void)
814 {
815         int i;
816         for(i=0;i<RK3288_I2C_NUM;i++)
817             slp_i2c_base[i]  = ioremap(slp_i2c_phy[i], 0x1000);
818
819         for(i=0;i<RK3288_UART_NUM;i++)
820             {
821                 if(i!=CONFIG_RK_DEBUG_UART)
822                     slp_uart_base[i]  = ioremap(slp_uart_phy[i], 0x1000);
823                 else
824                     slp_uart_base[i] = RK_DEBUG_UART_VIRT;
825             }
826         
827 }       
828 enum rk3288_pwr_mode_con {
829
830         pmu_pwr_mode_en=0,
831         pmu_clk_core_src_gate_en,
832         pmu_global_int_disable,
833         pmu_l2flush_en,
834         
835         pmu_bus_pd_en,
836         pmu_a12_0_pd_en,
837         pmu_scu_en,
838         pmu_pll_pd_en,
839         
840         pmu_chip_pd_en, // power off pin enable
841         pmu_pwroff_comb,
842         pmu_alive_use_lf,
843         pmu_pmu_use_lf,
844         
845         pmu_osc_24m_dis,
846         pmu_input_clamp_en,
847         pmu_wakeup_reset_en,
848         pmu_sref0_enter_en,
849         
850         pmu_sref1_enter_en,       
851         pmu_ddr0io_ret_en,
852         pmu_ddr1io_ret_en,
853         pmu_ddr0_gating_en,
854         
855         pmu_ddr1_gating_en,
856         pmu_ddr0io_ret_de_req,
857         pmu_ddr1io_ret_de_req
858
859 };
860  enum rk3288_pwr_mode_con1 {
861
862         pmu_clr_bus=0,
863         pmu_clr_core,
864         pmu_clr_cpup,
865         pmu_clr_alive,
866         
867         pmu_clr_dma,
868         pmu_clr_peri,
869         pmu_clr_gpu,
870         pmu_clr_video,
871         pmu_clr_hevc,
872         pmu_clr_vio
873   
874 };
875  static u32 rk3288_powermode=0;
876 static void ddr_pin_set_fun(u8 port,u8 bank,u8 b_gpio,u8 fun);
877
878 static u32 sgrf_soc_con0,pmu_wakeup_cfg0,pmu_wakeup_cfg1,pmu_pwr_mode_con0,pmu_pwr_mode_con1;
879
880 static u32  rkpm_slp_mode_set(u32 ctrbits)
881 {
882     u32 mode_set,mode_set1;
883     
884     // setting gpio0_a0 arm off pin
885
886     sgrf_soc_con0=reg_readl(RK_SGRF_VIRT+RK3288_SGRF_SOC_CON0);
887     
888     pmu_wakeup_cfg0=pmu_readl(RK3288_PMU_WAKEUP_CFG0);  
889     pmu_wakeup_cfg1=pmu_readl(RK3288_PMU_WAKEUP_CFG1);
890     
891     pmu_pwr_mode_con0=pmu_readl(RK3288_PMU_PWRMODE_CON);  
892     pmu_pwr_mode_con1=pmu_readl(RK3288_PMU_PWRMODE_CON1);
893     
894     ddr_pin_set_fun(0x0,0xa,0x0,0x1);
895
896
897     
898     //mode_set1=pmu_pwr_mode_con1;
899     //mode_set=pmu_pwr_mode_con0;
900   
901    //pmu_writel(0x1<<3,RK3188_PMU_WAKEUP_CFG1);  
902    pmu_writel(0x1<<0,RK3188_PMU_WAKEUP_CFG1);  
903
904     // enable boot ram    
905     reg_writel((0x1<<8)|(0x1<<(8+16)),RK_SGRF_VIRT+RK3288_SGRF_SOC_CON0);
906     dsb();
907     
908     reg_writel(RKPM_BOOTRAM_PHYS,RK_SGRF_VIRT+RK3288_SGRF_FAST_BOOT_ADDR);
909     dsb();
910
911     mode_set=  BIT(pmu_pwr_mode_en) |BIT(pmu_global_int_disable) | BIT(pmu_l2flush_en);
912      mode_set1=0;
913
914     if(rkpm_chk_val_ctrbits(ctrbits,RKPM_CTR_IDLEAUTO_MD))
915     {
916         rkpm_ddr_printascii("-autoidle-");
917         mode_set|=BIT(pmu_clk_core_src_gate_en);        
918     }
919     else if(rkpm_chk_val_ctrbits(ctrbits,RKPM_CTR_ARMDP_LPMD))
920     {
921         rkpm_ddr_printascii("-armdp-");            
922         mode_set|=BIT(pmu_a12_0_pd_en);
923     }
924     else if(rkpm_chk_val_ctrbits(ctrbits,RKPM_CTR_ARMOFF_LPMD))
925     {   
926         rkpm_ddr_printascii("-armoff-");                         
927         mode_set|=BIT(pmu_scu_en)
928                             //|BIT(pmu_a12_0_pd_en) 
929                             |BIT(pmu_clk_core_src_gate_en) // »½ÐѺóÒì³£
930                             |BIT(pmu_sref0_enter_en)|BIT(pmu_sref1_enter_en) 
931                             |BIT(pmu_ddr0_gating_en)|BIT(pmu_ddr1_gating_en)              
932                             //|BIT(pmu_ddr1io_ret_en)|BIT(pmu_ddr0io_ret_en)   
933                             |BIT(pmu_chip_pd_en);
934         mode_set1=BIT(pmu_clr_core)|BIT(pmu_clr_cpup)
935                                 |BIT(pmu_clr_alive)
936                                 |BIT(pmu_clr_peri)
937                                 |BIT(pmu_clr_bus)
938                                 |BIT(pmu_clr_dma)
939                                 ;
940     } 
941     else if(rkpm_chk_val_ctrbits(ctrbits,RKPM_CTR_ARMOFF_LOGDP_LPMD))
942     {
943     
944         rkpm_ddr_printascii("-armoff-logdp-");        
945         
946         mode_set|=BIT(pmu_scu_en)|BIT(pmu_bus_pd_en)
947                             |BIT(pmu_chip_pd_en)
948                             |BIT(pmu_sref0_enter_en)|BIT(pmu_sref1_enter_en) 
949                             |BIT(pmu_ddr0_gating_en)|BIT(pmu_ddr1_gating_en)              
950                             |BIT(pmu_ddr1io_ret_en)|BIT(pmu_ddr0io_ret_en)   
951                             |BIT(pmu_osc_24m_dis)|BIT(pmu_pmu_use_lf)|BIT(pmu_alive_use_lf)|BIT(pmu_pll_pd_en)
952                             ;
953         mode_set1=BIT(pmu_clr_core)|BIT(pmu_clr_cpup)
954                            |BIT(pmu_clr_alive)
955                            |BIT(pmu_clr_peri)
956                            |BIT(pmu_clr_bus) 
957                            |BIT(pmu_clr_dma)                                       
958                           ;
959      
960     } 
961     else
962     {
963         mode_set=0;
964         mode_set1=0;
965     }
966
967     
968     if(mode_set&BIT(pmu_osc_24m_dis))
969     {
970         rkpm_ddr_printascii("osc_off");        
971         pmu_writel(32*30,RK3288_PMU_OSC_CNT);  
972         pmu_writel(32*30,RK3288_PMU_STABL_CNT);  
973     }
974     else
975     {
976         pmu_writel(24*1000*10,RK3288_PMU_STABL_CNT);  
977         
978        // pmu_writel(24*1000*20,RK3288_PMU_CORE_PWRDWN_CNT);  
979     }
980
981     if(mode_set&BIT(pmu_ddr0io_ret_en))
982     {
983         rkpm_ddr_printascii("ddrc_off");  
984         ddr_pin_set_fun(0x0,0xa,0x1,0x1);
985         ddr_pin_set_fun(0x0,0xa,0x2,0x1);
986         ddr_pin_set_fun(0x0,0xa,0x3,0x1);
987     }
988
989     pmu_writel(mode_set,RK3288_PMU_PWRMODE_CON);  
990     pmu_writel(mode_set1,RK3288_PMU_PWRMODE_CON1);  
991     
992   //  rkpm_ddr_printhex(mode_set);
993   //  rkpm_ddr_printhex(pmu_readl(RK3288_PMU_PWRMODE_CON));
994   
995     return (pmu_readl(RK3288_PMU_PWRMODE_CON));  
996 }
997
998 static inline void  rkpm_slp_mode_set_resume(void)
999 {
1000
1001     pmu_writel(pmu_wakeup_cfg0,RK3288_PMU_WAKEUP_CFG0);  
1002     pmu_writel(pmu_wakeup_cfg1,RK3288_PMU_WAKEUP_CFG1);  
1003     
1004     pmu_writel(pmu_pwr_mode_con0,RK3288_PMU_PWRMODE_CON);  
1005     pmu_writel(pmu_pwr_mode_con1,RK3288_PMU_PWRMODE_CON1);  
1006     reg_writel(sgrf_soc_con0|(0x1<<(8+16)),RK_SGRF_VIRT+RK3288_SGRF_SOC_CON0);
1007     
1008 }
1009
1010 static void sram_code_data_save(u32 pwrmode)
1011 {
1012         char *code_src,*data_src;
1013         u32 code_size,data_size;
1014         u32 ddr_bits= RKPM_CTR_ARMLOGDP_LPMD|RKPM_CTR_ARMOFF_LOGDP_LPMD|RKPM_CTR_ARMLOGOFF_DLPMD;
1015      
1016         //u32 *p;
1017         if(pwrmode&(BIT(pmu_scu_en)|BIT(pmu_a12_0_pd_en)))
1018         {   
1019             sleep_resume_data[RKPM_BOOTDATA_L2LTY_F]=1;
1020             sleep_resume_data[RKPM_BOOTDATA_L2LTY]=rkpm_l2_config();// in sys resume ,ddr is need resume        
1021             sleep_resume_data[RKPM_BOOTDATA_CPUSP]=RKPM_BOOT_CPUSP_PHY;// in sys resume ,ddr is need resume     
1022             sleep_resume_data[RKPM_BOOTDATA_CPUCODE]=virt_to_phys(cpu_resume);// in sys resume ,ddr is need resume    
1023         }
1024         else
1025         {
1026             sleep_resume_data[RKPM_BOOTDATA_CPUCODE]=0;
1027             return ;
1028         }
1029         
1030         if(pwrmode&BIT(pmu_bus_pd_en))                
1031         {   
1032                 sleep_resume_data[RKPM_BOOTDATA_DDR_F]=1;// in sys resume ,ddr is need resume
1033                 sleep_resume_data[RKPM_BOOTDATA_DPLL_F]=1;// in ddr resume ,dpll is need resume
1034                 code_src=(char *)ddr_get_resume_code_info(&code_size);
1035                 sleep_resume_data[RKPM_BOOTDATA_DDRCODE]=RKPM_BOOT_DDRCODE_PHY;
1036                 sleep_resume_data[RKPM_BOOTDATA_DDRDATA]=RKPM_BOOT_DDRCODE_PHY+RKPM_ALIGN(code_size,4);
1037                 data_src=(char *)ddr_get_resume_data_info(&data_size);
1038                 ddr_reg_save((u32 *)(resume_data_phy+RKPM_BOOTDATA_DPLL_F*4));
1039        }
1040         else
1041         {
1042             sleep_resume_data[RKPM_BOOTDATA_DDR_F]=0;
1043         }
1044         
1045         sram_data_for_sleep(boot_ram_data,int_ram_data,sleep_resume_data[RKPM_BOOTDATA_DDR_F]);
1046     
1047         flush_cache_all();
1048         outer_flush_all();
1049         local_flush_tlb_all();
1050
1051 }
1052
1053 static inline void sram_code_data_resume(u32 pwrmode)
1054 {
1055          if(pwrmode&(BIT(pmu_scu_en)|BIT(pmu_a12_0_pd_en)))
1056         {
1057              sram_data_resume(boot_ram_data,int_ram_data,sleep_resume_data[RKPM_BOOTDATA_DDR_F]);
1058         }
1059              
1060 }
1061
1062 static void  rkpm_peri_save(u32 power_mode)
1063 {
1064     u32 gpio_gate[2];
1065
1066     if(power_mode&BIT(pmu_scu_en))
1067     {
1068         rkpm_gic_dist_save(&slp_gic_save[0]);   
1069     }
1070 #if 0
1071     gpio_gate[0]=cru_readl(RK3288_CRU_GATEID_CONS(RK3288_CLKGATE_PCLK_GPIO0));
1072     gpio_gate[1]=cru_readl(RK3288_CRU_GATEID_CONS(RK3288_CLKGATE_PCLK_GPIO1));
1073     RK3288_CRU_UNGATING_OPS(RK3288_CLKGATE_PCLK_GPIO0);
1074     cru_writel(0xff<<(RK3288_CLKGATE_PCLK_GPIO1%16+16),
1075                          RK3288_CRU_GATEID_CONS(RK3288_CLKGATE_PCLK_GPIO1));
1076 #endif
1077     
1078     if(power_mode&BIT(pmu_bus_pd_en))
1079    {  
1080        #if 0
1081         //gpio7_c6
1082         //gpio7_c7
1083         ddr_pin_set_pull(7,0xc,0x6,RKPM_GPIO_PULL_UP);
1084         ddr_gpio_set_in_output(7,0xc,0x6,RKPM_GPIO_INPUT);
1085         ddr_pin_set_fun(7,0xc,0x6,0);
1086         
1087         ddr_pin_set_pull(7,0xc,0x7,RKPM_GPIO_PULL_UP);
1088         ddr_gpio_set_in_output(7,0xc,0x7,RKPM_GPIO_INPUT);
1089         ddr_pin_set_fun(7,0xc,0x7,0);
1090         #endif
1091         slp_uart_save(2);
1092     #if 0
1093         ddr_pin_set_pull(0,0xb,0x7,RKPM_GPIO_PULL_UP);
1094         ddr_gpio_set_in_output(0,0xb,0x7,RKPM_GPIO_INPUT);
1095         ddr_pin_set_fun(0,0xb,0x7,0);
1096         
1097         ddr_pin_set_pull(0,0xc,0x0,RKPM_GPIO_PULL_UP);
1098         ddr_gpio_set_in_output(0,0xc,0x0,RKPM_GPIO_INPUT);
1099         ddr_pin_set_fun(0,0xc,0x0,0);
1100         #endif      
1101         slp_i2c_save(0);// i2c pmu gpio0b7 gpio0_c0
1102         //slp_i2c_save(2);//i2c audio
1103     }
1104
1105 #if 0
1106         cru_writel((0xff<<(RK3288_CLKGATE_PCLK_GPIO1%16+16))|gpio_gate[0],
1107                                       RK3288_CRU_GATEID_CONS(RK3288_CLKGATE_PCLK_GPIO1));
1108         cru_writel(gpio_gate[0]|CRU_W_MSK(RK3288_CLKGATE_PCLK_GPIO0%16,0x1),RK3288_CRU_GATEID_CONS(RK3288_CLKGATE_PCLK_GPIO0));         
1109 #endif
1110
1111 }
1112
1113 static inline void  rkpm_peri_resume(u32 power_mode)
1114 {
1115     if(power_mode&BIT(pmu_scu_en))
1116     {       
1117         //fiq_glue_resume();
1118         rkpm_gic_dist_resume(&slp_gic_save[0]);          
1119         fiq_glue_resume();
1120         //rkpm_ddr_printascii("gic res");       
1121     }  
1122     if(power_mode&BIT(pmu_bus_pd_en))
1123    {
1124         slp_i2c_resume(0);// i2c pmu
1125         slp_i2c_resume(2);//i2c audio
1126     }
1127
1128 }
1129
1130 static inline void  rkpm_peri_resume_first(u32 power_mode)
1131 {
1132       if(power_mode&BIT(pmu_bus_pd_en))
1133         slp_uart_resume(2);
1134 }
1135
1136 static void rkpm_slp_setting(void)
1137 {
1138         rk_usb_power_down();
1139
1140    //rkpm_gic_disable(130);
1141   //  rkpm_gic_disable(132);
1142
1143     //rkpm_ddr_printhex(pmu_readl(RK3288_PMU_WAKEUP_CFG1));
1144     //rkpm_ddr_printhex(pmu_readl(RK3288_PMU_PWRMODE_CON));
1145 }
1146
1147
1148 static void rkpm_save_setting_resume_first(void)
1149 {
1150         rk_usb_power_up();
1151         rkpm_peri_resume_first(rk3288_powermode);
1152         
1153         // rkpm_ddr_printhex(cru_readl(RK3288_CRU_MODE_CON));
1154         #if 0
1155         //rk319x_pm_set_power_domain(PD_PERI,true);
1156         //slp_regs_resume(slp_grf_io_pull_data,(u32)RK_GRF_VIRT+0x144,16,0xffff0000);
1157         slp_pin_gpio_resume(1);
1158         slp_pin_gpio_resume(2);
1159         slp_pin_gpio_resume(3);
1160         slp_pin_gpio_resume(4);
1161
1162         #if 0
1163         slp_regs_w_msk_resume(slp_grf_soc_con_data,(u32)RK_GRF_VIRT+0x60,5,slp_grf_soc_con_w_msk);
1164         slp_regs_w_msk_resume(slp_grf_cpu_con_data,(u32)RK_GRF_VIRT+0x9c,5,slp_grf_cpu_con_w_msk);
1165
1166         slp_regs_w_msk_resume(slp_grf_uoc0_con_data,(u32)RK_GRF_VIRT+0xc4,4,slp_grf_uoc0_con_w_msk);
1167         slp_regs_w_msk_resume(slp_grf_uoc1_con_data,(u32)RK_GRF_VIRT+0xd4,2,slp_grf_uoc1_con_w_msk);
1168         slp_regs_w_msk_resume(slp_grf_uoc2_con_data,(u32)RK_GRF_VIRT+0xe4,2,slp_grf_uoc2_con_w_msk);
1169         slp_regs_w_msk_resume(slp_grf_uoc3_con_data,(u32)RK_GRF_VIRT+0xec,2,slp_grf_uoc3_con_w_msk);
1170         #endif
1171         //sram_printch_uart_enable();
1172         slp_uart_resume(2);
1173        #endif
1174 }
1175
1176
1177
1178 static u32 rk3288_ctrbits=0;
1179
1180 static void rkpm_save_setting(u32 ctrbits)
1181 {
1182         //rk3288_ctrbits=ctrbits;        
1183         rk3288_powermode=rkpm_slp_mode_set(ctrbits);
1184         if(rk3288_powermode&BIT(pmu_pwr_mode_en))
1185        {
1186                 sram_code_data_save(rk3288_powermode);   
1187                 rkpm_peri_save(rk3288_powermode);                
1188         }
1189         else
1190              return ;
1191
1192 }
1193 static void rkpm_save_setting_resume(void)
1194 {
1195                    
1196          if(rk3288_powermode&BIT(pmu_pwr_mode_en))
1197         {
1198             sram_code_data_resume(rk3288_powermode); 
1199             rkpm_peri_resume(rk3288_powermode);
1200         }
1201          
1202          rkpm_slp_mode_set_resume();       
1203
1204 }
1205
1206
1207 /*******************************common code  for rkxxx*********************************/
1208 static void  inline uart_printch(char byte)
1209 {
1210         u32 reg_save[2];
1211         u32 u_clk_id=(RK3288_CLKGATE_UART0_SRC+CONFIG_RK_DEBUG_UART);
1212         u32 u_pclk_id=(RK3288_CLKGATE_PCLK_UART0+CONFIG_RK_DEBUG_UART);
1213         
1214         if(CONFIG_RK_DEBUG_UART==4)
1215             u_clk_id=RK3288_CLKGATE_UART4_SRC;
1216         if(CONFIG_RK_DEBUG_UART==2)
1217             u_pclk_id=RK3288_CLKGATE_PCLK_UART2;
1218             
1219         reg_save[0]=cru_readl(RK3288_CRU_GATEID_CONS(u_clk_id));
1220         reg_save[1]=cru_readl(RK3288_CRU_GATEID_CONS(u_pclk_id));
1221         RK3288_CRU_UNGATING_OPS(u_clk_id);
1222         RK3288_CRU_UNGATING_OPS(u_pclk_id);
1223         
1224         rkpm_udelay(1);
1225         
1226         writel_relaxed(byte, RK_DEBUG_UART_VIRT);
1227         dsb();
1228
1229         /* loop check LSR[6], Transmitter Empty bit */
1230         while (!(readl_relaxed(RK_DEBUG_UART_VIRT + 0x14) & 0x40))
1231                 barrier();
1232     
1233          cru_writel(reg_save[0]|CRU_W_MSK(u_clk_id%16,0x1),RK3288_CRU_GATEID_CONS(u_clk_id));         
1234          cru_writel(reg_save[1]|CRU_W_MSK(u_pclk_id%16,0x1),RK3288_CRU_GATEID_CONS(u_pclk_id));
1235         
1236         if (byte == '\n')
1237                 uart_printch('\r');
1238 }
1239
1240 void PIE_FUNC(sram_printch)(char byte)
1241 {
1242         uart_printch(byte);
1243 }
1244
1245 static void pll_udelay(u32 udelay);
1246
1247 static void  ddr_printch(char byte)
1248 {
1249         uart_printch(byte);
1250         pll_udelay(2);
1251 }
1252 /*******************************gpio func*******************************************/
1253 //#define RK3288_PMU_GPIO0_A_IOMUX      0x0084
1254 //#define RK3288_PMU_GPIO0_B_IOMUX      0x0088
1255 //#define RK3288_PMU_GPIO0_C_IOMUX      0x008c
1256 //#define RK3288_PMU_GPIO0_D_IOMUX      0x0090
1257 //pin=0x0a21  gpio0a2,port=0,bank=a,b_gpio=2,fun=1
1258 static inline void pin_set_fun(u8 port,u8 bank,u8 b_gpio,u8 fun)
1259
1260     u8 off_set;
1261     bank-=0xa;
1262
1263     if(port==0)
1264     { 
1265         if(bank>2)
1266             return;
1267             
1268         off_set=RK3288_PMU_GPIO0_A_IOMUX+bank*4;
1269         pmu_writel(RKPM_VAL_SETBITS(pmu_readl(off_set),fun,b_gpio*2,0x3),off_set);
1270     }
1271     else
1272     {    
1273     
1274         off_set=port*(4*4)+bank*4;
1275         //form RK3288_GRF_GPIO1D_IOMUX
1276          reg_writel(RKPM_W_MSK_SETBITS(fun,b_gpio*2,0x3),RK_GRF_VIRT+0+off_set);
1277     }
1278 }
1279
1280 static inline u8 pin_get_funset(u8 port,u8 bank,u8 b_gpio)
1281
1282     u8 off_set;
1283     bank-=0xa;
1284
1285     if(port==0)
1286     { 
1287       if(bank>2)
1288             return 0;
1289         off_set=RK3288_PMU_GPIO0_A_IOMUX+bank*4;
1290         return (pmu_readl(off_set)>>(b_gpio*2))&0x3;
1291     }
1292     else
1293     {    
1294     
1295         off_set=port*(4*4)+bank*4;
1296         //form RK3288_GRF_GPIO1D_IOMUX
1297          return (reg_readl(RK_GRF_VIRT+0+off_set)>>(b_gpio*2))&0x3;
1298     }
1299 }
1300
1301 static inline void pin_set_pull(u8 port,u8 bank,u8 b_gpio,u8 pull)
1302
1303     u8 off_set;
1304     
1305     bank-=0xa;
1306
1307     if(port > 0)
1308     {
1309         //gpio1_d st
1310         if(port==1&&bank<3)
1311          return;   
1312         //gpio1_d==0x14c ,form gpio0_a to gpio1_d offset 1*16+3*4= 0x1c
1313         off_set=0x14c-0x1c+port*(4*4)+bank*4;    
1314         reg_writel(RKPM_W_MSK_SETBITS(pull,b_gpio*2,0x3),RK_GRF_VIRT+off_set);
1315
1316     }
1317     else
1318     {
1319         if(bank>2)// gpio0_d is not support
1320             return; 
1321         pmu_writel(RKPM_VAL_SETBITS(pmu_readl(0x64+bank*4),pull,b_gpio*2,0x3),0x64+bank*4);
1322     }
1323         
1324 }
1325
1326 static inline u8 pin_get_pullset(u8 port,u8 bank,u8 b_gpio)
1327
1328     u8 off_set;
1329     
1330     bank-=0xa;
1331
1332     if(port > 0)
1333     {
1334         //gpio1_d st
1335         if(port==1&&bank<3)
1336             return 0;   
1337         //gpio1_d==0x14c ,form gpio0_a to gpio1_d offset 1*16+3*4= 0x1c
1338         off_set=0x14c-0x1c+port*(4*4)+bank*4;    
1339         return RKPM_GETBITS(reg_readl(RK_GRF_VIRT+off_set),b_gpio*2,0x3);
1340
1341     }
1342     else
1343     {
1344         if(bank>2)// gpio0_d is not support
1345             return 0;         
1346         return RKPM_GETBITS(pmu_readl(0x64+bank*4),b_gpio*2,0x3);
1347     }
1348         
1349 }
1350
1351
1352 //RKPM_GPIOS_INPUT
1353 static inline void gpio_set_in_output(u8 port,u8 bank,u8 b_gpio,u8 type)
1354 {
1355     u32 val;    
1356     
1357     bank-=0xa;
1358     b_gpio=bank*8+b_gpio;//
1359
1360     val=reg_readl(RK_GPIO_VIRT(port)+GPIO_SWPORT_DDR);
1361
1362     if(type==RKPM_GPIO_OUTPUT)
1363         val|=(0x1<<b_gpio);
1364     else
1365         val&=~(0x1<<b_gpio);
1366     
1367     reg_writel(val,RK_GPIO_VIRT(port)+GPIO_SWPORT_DDR);
1368 }
1369
1370 static inline u8 gpio_get_in_outputset(u8 port,u8 bank,u8 b_gpio)
1371 {
1372     bank-=0xa;
1373     b_gpio=bank*8+b_gpio;
1374     return reg_readl(RK_GPIO_VIRT(port)+GPIO_SWPORT_DDR)&(0x1<<b_gpio);
1375 }
1376
1377 //RKPM_GPIOS_OUT_L   RKPM_GPIOS_OUT_H
1378 static inline void gpio_set_output_level(u8 port,u8 bank,u8 b_gpio,u8 level)
1379 {
1380     u32 val;    
1381
1382     bank-=0xa;
1383     b_gpio=bank*8+b_gpio;
1384         
1385     val=reg_readl(RK_GPIO_VIRT(port)+GPIO_SWPORT_DR);
1386
1387     if(level==RKPM_GPIO_OUT_H)
1388         val|=(0x1<<b_gpio);
1389     else //
1390         val&=~(0x1<<b_gpio);
1391
1392      reg_writel(val,RK_GPIO_VIRT(port)+GPIO_SWPORT_DR);
1393 }
1394
1395 static inline u8 gpio_get_output_levelset(u8 port,u8 bank,u8 b_gpio)
1396 {     
1397     bank-=0xa;
1398     b_gpio=bank*8+b_gpio;
1399     return reg_readl(RK_GPIO_VIRT(port)+GPIO_SWPORT_DR)&(0x1<<b_gpio);
1400 }
1401
1402 static inline u8 gpio_get_input_level(u8 port,u8 bank,u8 b_gpio)
1403 {
1404
1405     bank-=0xa;
1406     b_gpio=bank*8+b_gpio;
1407
1408     return (reg_readl(RK_GPIO_VIRT(port)+GPIO_EXT_PORT)>>b_gpio)&0x1;
1409 }
1410 static inline void gpio_set_inten(u8 port,u8 bank,u8 b_gpio,u8 en)
1411 {
1412     u32 val;    
1413
1414     bank-=0xa;
1415     b_gpio=bank*8+b_gpio;
1416         
1417     val=reg_readl(RK_GPIO_VIRT(port)+GPIO_INTEN);
1418     rkpm_ddr_printascii("\n inten:");
1419     rkpm_ddr_printhex(val);
1420     
1421     rkpm_ddr_printascii("-");
1422     if(en==1)
1423         val|=(0x1<<b_gpio);
1424     else //
1425         val&=~(0x1<<b_gpio);
1426
1427     reg_writel(val,RK_GPIO_VIRT(port)+GPIO_INTEN);
1428     dsb();
1429      
1430      rkpm_ddr_printhex(val);
1431      rkpm_ddr_printascii("-");
1432      
1433      rkpm_ddr_printhex(reg_readl(RK_GPIO_VIRT(port)+GPIO_INTEN));
1434     
1435     rkpm_ddr_printascii("\n");
1436
1437      
1438 }
1439
1440 static void __sramfunc sram_pin_set_fun(u8 port,u8 bank,u8 b_gpio,u8 fun)
1441
1442         pin_set_fun(port,bank,b_gpio,fun); 
1443 }
1444 static u8 __sramfunc sram_pin_get_funset(u8 port,u8 bank,u8 b_gpio)
1445
1446     return pin_get_funset(port,bank,b_gpio); 
1447 }
1448
1449 static void __sramfunc sram_pin_set_pull(u8 port,u8 bank,u8 b_gpio,u8 fun)
1450
1451         pin_set_pull(port,bank,b_gpio,fun); 
1452 }
1453 static u8 __sramfunc sram_pin_get_pullset(u8 port,u8 bank,u8 b_gpio)
1454
1455     return pin_get_pullset(port,bank,b_gpio); 
1456 }
1457
1458 static void __sramfunc sram_gpio_set_in_output(u8 port,u8 bank,u8 b_gpio,u8 type)
1459 {
1460     gpio_set_in_output(port,bank,b_gpio,type);
1461 }
1462
1463 static u8 __sramfunc sram_gpio_get_in_outputset(u8 port,u8 bank,u8 b_gpio)
1464 {
1465     return gpio_get_in_outputset(port,bank,b_gpio);
1466 }
1467
1468 static void __sramfunc sram_gpio_set_output_level(u8 port,u8 bank,u8 b_gpio,u8 level)
1469 {
1470     
1471     gpio_set_output_level(port,bank,b_gpio,level);
1472
1473 }
1474
1475 static u8 __sramfunc sram_gpio_get_output_levelset(u8 port,u8 bank,u8 b_gpio)
1476 {
1477     return gpio_get_output_levelset(port,bank,b_gpio);
1478 }
1479
1480 static u8 __sramfunc sram_gpio_get_input_level(u8 port,u8 bank,u8 b_gpio)
1481 {
1482     return gpio_get_input_level(port,bank,b_gpio);
1483 }
1484 //ddr
1485 static void ddr_pin_set_fun(u8 port,u8 bank,u8 b_gpio,u8 fun)
1486
1487         pin_set_fun(port,bank,b_gpio,fun); 
1488 }
1489 static u8 ddr_pin_get_funset(u8 port,u8 bank,u8 b_gpio)
1490
1491     return pin_get_funset(port,bank,b_gpio); 
1492 }
1493
1494 static void ddr_pin_set_pull(u8 port,u8 bank,u8 b_gpio,u8 fun)
1495
1496         pin_set_pull(port,bank,b_gpio,fun); 
1497 }
1498 static u8 ddr_pin_get_pullset(u8 port,u8 bank,u8 b_gpio)
1499
1500     return pin_get_pullset(port,bank,b_gpio); 
1501 }
1502
1503 static void ddr_gpio_set_in_output(u8 port,u8 bank,u8 b_gpio,u8 type)
1504 {
1505     gpio_set_in_output(port,bank,b_gpio,type);
1506 }
1507
1508 static u8 ddr_gpio_get_in_outputset(u8 port,u8 bank,u8 b_gpio)
1509 {
1510     return gpio_get_in_outputset(port,bank,b_gpio);
1511 }
1512
1513 static void ddr_gpio_set_output_level(u8 port,u8 bank,u8 b_gpio,u8 level)
1514 {   
1515     gpio_set_output_level(port,bank,b_gpio,level);
1516 }
1517
1518 static u8 ddr_gpio_get_output_levelset(u8 port,u8 bank,u8 b_gpio)
1519 {
1520     return gpio_get_output_levelset(port,bank,b_gpio);
1521 }
1522
1523 static u8 ddr_gpio_get_input_level(u8 port,u8 bank,u8 b_gpio)
1524 {
1525     return gpio_get_input_level(port,bank,b_gpio);
1526 }
1527
1528
1529
1530 static  void __sramfunc rkpm_pin_gpio_config_sram(u32 pin_gpio_bits,u32 *save_bits)
1531 {
1532     
1533     u32 pins;
1534     u8 port,bank,b_gpio,fun,in_out, level, pull;
1535    
1536     pins=RKPM_PINGPIO_BITS_PIN(pin_gpio_bits);      
1537     in_out=RKPM_PINGPIO_BITS_INOUT(pin_gpio_bits);       
1538     pull=RKPM_PINGPIO_BITS_PULL(pin_gpio_bits);          
1539     level=RKPM_PINGPIO_BITS_LEVEL(pin_gpio_bits);     
1540
1541     port=RKPM_PINBITS_PORT(pins);
1542     bank=RKPM_PINBITS_BANK(pins);
1543     b_gpio=RKPM_PINBITS_BGPIO(pins);
1544     fun=RKPM_PINBITS_FUN(pins);
1545     
1546     //save pins info
1547     if(save_bits)
1548     {
1549         pins=RKPM_PINBITS_SET_FUN(pins,sram_pin_get_funset(port,bank,b_gpio));
1550        *save_bits=RKPM_PINGPIO_BITS(pins,sram_pin_get_pullset(port,bank,b_gpio),sram_gpio_get_in_outputset(port,bank,b_gpio),
1551                                                                                         sram_gpio_get_output_levelset(port,bank,b_gpio));
1552     }
1553     if(!fun&&(in_out==RKPM_GPIO_OUTPUT))
1554    {
1555         if(level==RKPM_GPIO_OUT_L)
1556             pull=RKPM_GPIO_PULL_DN;
1557         else
1558             pull=RKPM_GPIO_PULL_UP;
1559         
1560         sram_gpio_set_output_level(port,bank,b_gpio,level);
1561     }
1562         
1563     sram_pin_set_pull(port,bank,b_gpio,pull);                
1564     sram_pin_set_fun(port,bank,b_gpio,fun);
1565     
1566     if(!fun)
1567     {
1568         sram_gpio_set_in_output(port,bank,b_gpio,in_out);
1569     }      
1570     
1571 }
1572
1573 static inline void rkpm_pin_gpio_config_ddr(u32 pin_gpio_bits,u32 *save_bits)
1574 {
1575     
1576     u32 pins;
1577     u8 port,bank,b_gpio,fun,in_out, level, pull;
1578    
1579     pins=RKPM_PINGPIO_BITS_PIN(pin_gpio_bits);      
1580     in_out=RKPM_PINGPIO_BITS_INOUT(pin_gpio_bits);       
1581     pull=RKPM_PINGPIO_BITS_PULL(pin_gpio_bits);          
1582     level=RKPM_PINGPIO_BITS_LEVEL(pin_gpio_bits);     
1583
1584     port=RKPM_PINBITS_PORT(pins);
1585     bank=RKPM_PINBITS_BANK(pins);
1586     b_gpio=RKPM_PINBITS_BGPIO(pins);
1587     fun=RKPM_PINBITS_FUN(pins);
1588     
1589     //save pins info
1590     if(save_bits)
1591     {
1592         pins=RKPM_PINBITS_SET_FUN(pins,ddr_pin_get_funset(port,bank,b_gpio));
1593        *save_bits=RKPM_PINGPIO_BITS(pins,ddr_pin_get_pullset(port,bank,b_gpio),ddr_gpio_get_in_outputset(port,bank,b_gpio),
1594                                                                                         ddr_gpio_get_output_levelset(port,bank,b_gpio));
1595     }
1596     if(!fun&&(in_out==RKPM_GPIO_OUTPUT))
1597    {
1598         if(level==RKPM_GPIO_OUT_L)
1599             pull=RKPM_GPIO_PULL_DN;
1600         else
1601             pull=RKPM_GPIO_PULL_UP;
1602         
1603         ddr_gpio_set_output_level(port,bank,b_gpio,level);
1604     }
1605         
1606     ddr_pin_set_pull(port,bank,b_gpio,pull);                
1607     ddr_pin_set_fun(port,bank,b_gpio,fun);
1608     
1609     if(!fun)
1610     {
1611         ddr_gpio_set_in_output(port,bank,b_gpio,in_out);
1612     }      
1613     
1614 }
1615
1616
1617 #define GPIO_DTS_NUM 10
1618
1619 static  u32 gpio_dts_save[GPIO_DTS_NUM];
1620 static  u32 gpio_dts[GPIO_DTS_NUM];
1621
1622 #define PMICGPIO_DTS_NUM 3
1623
1624
1625 u32 DEFINE_PIE_DATA(pmicgpio_dts[PMICGPIO_DTS_NUM]);
1626 static u32 *p_pmicgpio_dts;
1627 static __sramdata u32 pmicgpio_dts_save[PMICGPIO_DTS_NUM];
1628
1629 static void __sramfunc pmic_gpio_suspend(void)
1630 {
1631        int i;   
1632        for(i=0;;i++)
1633        {
1634             if(DATA(pmicgpio_dts[i]))
1635                 rkpm_pin_gpio_config_sram(DATA(pmicgpio_dts[i]),& pmicgpio_dts_save[i]);
1636             else
1637             {
1638                     pmicgpio_dts_save[i]=0; 
1639                     break;
1640              }
1641        }
1642     #if 0       
1643          for(i=0;i<6;i++)
1644         {
1645             rkpm_sram_reg_dump(RK_GPIO_VIRT(i),0,0x4); 
1646         }
1647         //
1648         rkpm_sram_reg_dump(RK_GRF_VIRT,0xc,0x84); 
1649         rkpm_sram_reg_dump(RK_GRF_VIRT,0x14c,0x1b4);     
1650         rkpm_sram_reg_dump(RK_PMU_VIRT,0x64,0x6c);   
1651         rkpm_sram_reg_dump(RK_PMU_VIRT,0x84,0x9c); 
1652     #endif
1653
1654 }
1655
1656 static void  __sramfunc pmic_gpio_resume(void)
1657 {
1658        int i;   
1659        for(i=0;;i++)
1660        {
1661             if(pmicgpio_dts_save[i])
1662                 rkpm_pin_gpio_config_sram(pmicgpio_dts_save[i],NULL);     
1663        }
1664
1665 }
1666
1667 void PIE_FUNC(pmic_suspend)(void)
1668 {
1669     pmic_gpio_suspend();
1670
1671 }
1672
1673 void PIE_FUNC(pmic_resume)(void)
1674 {
1675     pmic_gpio_resume();
1676 }
1677
1678
1679 static void  rkpm_gpio_suspend(void)
1680 {
1681        int i;   
1682        for(i=0;;i++)
1683        {
1684             if(DATA(pmicgpio_dts[i]))
1685                 rkpm_pin_gpio_config_ddr(DATA(pmicgpio_dts[i]),& pmicgpio_dts_save[i]);
1686             else
1687             {
1688                     pmicgpio_dts_save[i]=0; 
1689                     break;
1690              }
1691        }
1692     #if 0       
1693          for(i=0;i<6;i++)
1694         {
1695             rkpm_ddr_reg_dump(RK_GPIO_VIRT(i),0,0x4); 
1696         }
1697         //
1698         rkpm_ddr_reg_dump(RK_GRF_VIRT,0xc,0x84); 
1699         rkpm_ddr_reg_dump(RK_GRF_VIRT,0x14c,0x1b4);     
1700         rkpm_ddr_reg_dump(RK_PMU_VIRT,0x64,0x6c);   
1701         rkpm_ddr_reg_dump(RK_PMU_VIRT,0x84,0x9c); 
1702     #endif
1703
1704 }
1705
1706 static void  rkpm_gpio_resume(void)
1707 {
1708        int i;   
1709        for(i=0;;i++)
1710        {
1711             if(pmicgpio_dts_save[i])
1712                 rkpm_pin_gpio_config_ddr(pmicgpio_dts_save[i],NULL);     
1713        }
1714
1715 }
1716 static void gpio_get_dts_info(struct device_node *parent)
1717 {
1718         int i;
1719
1720         for(i=0;i<PMICGPIO_DTS_NUM;i++)
1721             p_pmicgpio_dts[i]=0;
1722
1723         for(i=0;i<GPIO_DTS_NUM;i++)
1724             gpio_dts[i]=0;
1725
1726         
1727         p_pmicgpio_dts= kern_to_pie(rockchip_pie_chunk, &DATA(pmicgpio_dts[0]));
1728         
1729        if(of_property_read_u32_array(parent,"rockchip,pmic-gpios",p_pmicgpio_dts,PMICGPIO_DTS_NUM))
1730        {
1731                 p_pmicgpio_dts[0]=0;
1732                PM_ERR("%s:get pm ctr error\n",__FUNCTION__);
1733        }
1734        
1735        for(i=0;i<PMICGPIO_DTS_NUM;i++)
1736             printk("%s:pmic gpio(%x)\n",__FUNCTION__,p_pmicgpio_dts[i]);
1737
1738         if(of_property_read_u32_array(parent,"rockchip,pm-gpios",gpio_dts,GPIO_DTS_NUM))
1739         {
1740                  gpio_dts[0]=0;
1741                 PM_ERR("%s:get pm ctr error\n",__FUNCTION__);
1742         }
1743         for(i=0;i<GPIO_DTS_NUM;i++)
1744          printk("%s:pmic gpio(%x)\n",__FUNCTION__,gpio_dts[i]);
1745
1746     rkpm_set_ops_gpios(rkpm_gpio_suspend,rkpm_gpio_resume);
1747     rkpm_set_sram_ops_gtclks(fn_to_pie(rockchip_pie_chunk, &FUNC(pmic_suspend)), 
1748                   fn_to_pie(rockchip_pie_chunk, &FUNC(pmic_resume)));
1749
1750 }
1751
1752
1753 /*******************************clk gating config*******************************************/
1754 #define CLK_MSK_GATING(msk, con) cru_writel((msk << 16) | 0xffff, con)
1755 #define CLK_MSK_UNGATING(msk, con) cru_writel(((~msk) << 16) | 0xffff, con)
1756
1757
1758 static u32 clk_ungt_msk[RK3288_CRU_CLKGATES_CON_CNT];// first clk gating setting
1759 static u32 clk_ungt_msk_1[RK3288_CRU_CLKGATES_CON_CNT];// first clk gating setting
1760 static u32 clk_ungt_save[RK3288_CRU_CLKGATES_CON_CNT]; //first clk gating value saveing
1761
1762
1763 u32 DEFINE_PIE_DATA(rkpm_clkgt_last_set[RK3288_CRU_CLKGATES_CON_CNT]);
1764 static u32 *p_rkpm_clkgt_last_set;
1765
1766 static __sramdata u32 rkpm_clkgt_last_save[RK3288_CRU_CLKGATES_CON_CNT];
1767
1768 void PIE_FUNC(gtclks_sram_suspend)(void)
1769 {
1770     int i;
1771    // u32 u_clk_id=(RK3188_CLKGATE_UART0_SRC+CONFIG_RK_DEBUG_UART);
1772    // u32 u_pclk_id=(RK3188_CLKGATE_PCLK_UART0+CONFIG_RK_DEBUG_UART);
1773
1774     for(i=0;i<RK3288_CRU_CLKGATES_CON_CNT;i++)
1775     {
1776         rkpm_clkgt_last_save[i]=cru_readl(RK3288_CRU_CLKGATES_CON(i));     
1777         CLK_MSK_UNGATING( DATA(rkpm_clkgt_last_set[i]), RK3288_CRU_CLKGATES_CON(i));      
1778         #if 0
1779         rkpm_sram_printch('\n');   
1780         rkpm_sram_printhex(DATA(rkpm_clkgt_last_save[i]));
1781         rkpm_sram_printch('-');   
1782         rkpm_sram_printhex(DATA(rkpm_clkgt_last_set[i]));
1783         rkpm_sram_printch('-');   
1784         rkpm_sram_printhex(cru_readl(RK3188_CRU_CLKGATES_CON(i)));
1785         if(i==(RK3288_CRU_CLKGATES_CON_CNT-1))         
1786         rkpm_sram_printch('\n');   
1787         #endif
1788     }
1789     
1790         //RK3288_CRU_UNGATING_OPS(u_clk_id);
1791         //RK3288_CRU_UNGATING_OPS(u_pclk_id);
1792  
1793 }
1794
1795 void PIE_FUNC(gtclks_sram_resume)(void)
1796 {
1797     int i;
1798     for(i=0;i<RK3288_CRU_CLKGATES_CON_CNT;i++)
1799     {
1800         cru_writel(rkpm_clkgt_last_save[i]|0xffff0000, RK3288_CRU_CLKGATES_CON(i));
1801     }
1802 }
1803 #define grf_readl(offset)       readl_relaxed(RK_GRF_VIRT + offset)
1804 #define grf_writel(v, offset)   do { writel_relaxed(v, RK_GRF_VIRT + offset); dsb(); } while (0)
1805
1806 #define gpio7_readl(offset)     readl_relaxed(RK_GPIO_VIRT(7)+ offset)
1807 #define gpio7_writel(v, offset) do { writel_relaxed(v, RK_GPIO_VIRT(7) + offset); dsb(); } while (0)
1808
1809 int gpio7_pin_data1, gpio7_pin_dir1;
1810 int gpio7_pin_iomux1;
1811
1812 static void gtclks_suspend(void)
1813 {
1814     int i;
1815         gpio7_pin_data1= gpio7_readl(0);
1816         gpio7_pin_dir1 = gpio7_readl(0x04);
1817         gpio7_pin_iomux1 =  gpio7_readl(0x6c);
1818         grf_writel(0x00040000, 0x6c);
1819         gpio7_writel(gpio7_pin_dir1|0x2, 0x04);
1820         gpio7_writel((gpio7_pin_data1|2), 0x00);
1821
1822   // rkpm_ddr_regs_dump(RK_CRU_VIRT,RK3288_CRU_CLKGATES_CON(0)
1823                                           //          ,RK3288_CRU_CLKGATES_CON(RK3288_CRU_CLKGATES_CON_CNT-1));
1824     for(i=0;i<RK3288_CRU_CLKGATES_CON_CNT;i++)
1825     {
1826             clk_ungt_save[i]=cru_readl(RK3288_CRU_CLKGATES_CON(i));   
1827            // 160 1a8
1828            #if 0
1829            if(
1830                // RK3288_CRU_CLKGATES_CON(i)==0x160 ||
1831                 //RK3288_CRU_CLKGATES_CON(i)==0x164 ||
1832                 //RK3288_CRU_CLKGATES_CON(i)==0x168 ||
1833               //  RK3288_CRU_CLKGATES_CON(i)==0x16c ||
1834                 //RK3288_CRU_CLKGATES_CON(i)==0x170 ||
1835                // RK3288_CRU_CLKGATES_CON(i)==0x174 ||
1836                // RK3288_CRU_CLKGATES_CON(i)==0x178 ||
1837
1838            
1839                 //RK3288_CRU_CLKGATES_CON(i)==0x17c ||
1840                // RK3288_CRU_CLKGATES_CON(i)==0x180 ||
1841                // RK3288_CRU_CLKGATES_CON(i)==0x184 ||
1842                // RK3288_CRU_CLKGATES_CON(i)==0x188 ||
1843                 //RK3288_CRU_CLKGATES_CON(i)==0x18c ||
1844                 //RK3288_CRU_CLKGATES_CON(i)==0x190 ||
1845                 //RK3288_CRU_CLKGATES_CON(i)==0x194 ||
1846                 //RK3288_CRU_CLKGATES_CON(i)==0x198 ||
1847                 //RK3288_CRU_CLKGATES_CON(i)==0x19c ||
1848                 //RK3288_CRU_CLKGATES_CON(i)==0x1a0 ||
1849                 //RK3288_CRU_CLKGATES_CON(i)==0x1a4 ||      
1850                // RK3288_CRU_CLKGATES_CON(i)==0x1a8
1851                RK3288_CRU_CLKGATES_CON(i)==0xfff
1852             )
1853             {
1854             
1855                  cru_writel(0xffff0000, RK3288_CRU_CLKGATES_CON(i));
1856                // CLK_MSK_UNGATING(clk_ungt_msk[i],RK3288_CRU_CLKGATES_CON(i));
1857             
1858             }
1859            else
1860             #endif
1861             {
1862                // if(RK3288_CRU_CLKGATES_CON(i)!=0x188 )
1863                CLK_MSK_UNGATING(clk_ungt_msk[i],RK3288_CRU_CLKGATES_CON(i));
1864            }
1865            #if 0
1866             rkpm_ddr_printch('\n');   
1867             rkpm_ddr_printhex(RK3288_CRU_CLKGATES_CON(i));
1868             rkpm_ddr_printch('-');   
1869             rkpm_ddr_printhex(clk_ungt_msk[i]);
1870             rkpm_ddr_printch('-');   
1871             rkpm_ddr_printhex(cru_readl(RK3288_CRU_CLKGATES_CON(i))) ;  
1872             if(i==(RK3288_CRU_CLKGATES_CON_CNT-1))            
1873             rkpm_ddr_printch('\n');   
1874             #endif
1875     }
1876
1877 }
1878
1879 static void gtclks_resume(void)
1880 {
1881     int i;
1882      for(i=0;i<RK3288_CRU_CLKGATES_CON_CNT;i++)
1883     {
1884        cru_writel(clk_ungt_save[i]|0xffff0000,RK3288_CRU_CLKGATES_CON(i));       
1885      }
1886      //rkpm_ddr_regs_dump(RK_CRU_VIRT,RK3288_CRU_CLKGATES_CON(0)
1887                                                  //   ,RK3288_CRU_CLKGATES_CON(RK3288_CRU_CLKGATES_CON_CNT-1));
1888         grf_writel(0x00040004, 0x6c);
1889
1890 }
1891 /********************************pll power down***************************************/
1892
1893 static void pm_pll_wait_lock(u32 pll_idx)
1894 {
1895         u32 delay = 600000U;
1896        // u32 mode;
1897      //  mode=cru_readl(RK3288_CRU_MODE_CON);
1898         dsb();
1899         dsb();
1900         dsb();
1901         dsb();
1902         dsb();
1903         dsb();
1904         while (delay > 0) {
1905                 if ((cru_readl(RK3288_PLL_CONS(pll_idx,1))&(0x1<<31)))
1906                         break;
1907                 delay--;
1908         }
1909         if (delay == 0) {
1910                 rkpm_ddr_printascii("unlock-pll:");
1911                 rkpm_ddr_printhex(pll_idx);
1912                 rkpm_ddr_printch('\n');
1913         }
1914     //cru_writel(mode|(RK3288_PLL_MODE_MSK(pll_idx)<<16), RK3288_CRU_MODE_CON);
1915 }       
1916
1917 static void pll_udelay(u32 udelay)
1918 {
1919     u32 mode;
1920     mode=cru_readl(RK3288_CRU_MODE_CON);
1921     // delay in 24m
1922     cru_writel(RK3288_PLL_MODE_SLOW(APLL_ID), RK3288_CRU_MODE_CON);
1923     
1924     rkpm_udelay(udelay*5);
1925     
1926     cru_writel(mode|(RK3288_PLL_MODE_MSK(APLL_ID)<<16), RK3288_CRU_MODE_CON);
1927 }
1928
1929 static u32 plls_con0_save[END_PLL_ID];
1930 static u32 plls_con1_save[END_PLL_ID];
1931 static u32 plls_con2_save[END_PLL_ID];
1932 static u32 plls_con3_save[END_PLL_ID];
1933
1934 static u32 cru_mode_con;
1935
1936 static inline void plls_suspend(u32 pll_id)
1937 {
1938     plls_con0_save[pll_id]=cru_readl(RK3288_PLL_CONS((pll_id), 0));
1939     plls_con1_save[pll_id]=cru_readl(RK3288_PLL_CONS((pll_id), 1));
1940     plls_con2_save[pll_id]=cru_readl(RK3288_PLL_CONS((pll_id), 2));
1941     plls_con3_save[pll_id]=cru_readl(RK3288_PLL_CONS((pll_id), 3));
1942  
1943     cru_writel(RK3288_PLL_PWR_DN, RK3288_PLL_CONS((pll_id), 3));
1944     
1945 }
1946 static inline void plls_resume(u32 pll_id)
1947 {
1948         u32 pllcon0, pllcon1, pllcon2;
1949
1950         if((plls_con3_save[pll_id]&RK3288_PLL_PWR_DN_MSK))
1951             return ;
1952          
1953         //enter slowmode
1954         cru_writel(RK3288_PLL_MODE_SLOW(pll_id), RK3288_CRU_MODE_CON);      
1955         
1956         cru_writel(RK3288_PLL_PWR_ON, RK3288_PLL_CONS((pll_id),3));
1957         cru_writel(RK3288_PLL_NO_BYPASS, RK3288_PLL_CONS((pll_id),3));
1958         
1959         pllcon0 =plls_con0_save[pll_id];// cru_readl(RK3288_PLL_CONS((pll_id),0));
1960         pllcon1 = plls_con1_save[pll_id];//cru_readl(RK3288_PLL_CONS((pll_id),1));
1961         pllcon2 = plls_con2_save[pll_id];//cru_readl(RK3288_PLL_CONS((pll_id),2));
1962
1963         //enter rest
1964         cru_writel(RK3288_PLL_RESET, RK3288_PLL_CONS(pll_id,3));
1965         cru_writel(pllcon0|CRU_W_MSK(0,0xf)|CRU_W_MSK(8,0x3f), RK3288_PLL_CONS(pll_id,0));
1966         cru_writel(pllcon1, RK3288_PLL_CONS(pll_id,1));
1967         cru_writel(pllcon2, RK3288_PLL_CONS(pll_id,2));
1968         
1969         pll_udelay(5);
1970         //udelay(5); //timer7 delay
1971
1972         //return form rest
1973         cru_writel(RK3288_PLL_RESET_RESUME, RK3288_PLL_CONS(pll_id,3));
1974
1975         //wating lock state
1976         pll_udelay(168);
1977         pm_pll_wait_lock(pll_id);
1978         
1979         cru_writel(plls_con3_save[pll_id]|(RK3288_PLL_BYPASS_MSK<<16),RK3288_PLL_CONS(pll_id,3));
1980
1981 }
1982
1983 static u32 clk_sel0,clk_sel1, clk_sel10,clk_sel26,clk_sel33,clk_sel36, clk_sel37;
1984
1985 static void pm_plls_suspend(void)
1986 {
1987
1988    // rkpm_ddr_regs_dump(RK_CRU_VIRT,RK3288_PLL_CONS((0), 0),RK3288_PLL_CONS((4), 3)); 
1989    // rkpm_ddr_regs_dump(RK_CRU_VIRT,RK3288_CRU_MODE_CON,RK3288_CRU_MODE_CON);   
1990    // rkpm_ddr_regs_dump(RK_CRU_VIRT,RK3288_CRU_CLKSELS_CON(0),RK3288_CRU_CLKSELS_CON(42));
1991     
1992     clk_sel0=cru_readl(RK3288_CRU_CLKSELS_CON(0));
1993     clk_sel1=cru_readl(RK3288_CRU_CLKSELS_CON(1));
1994     clk_sel10=cru_readl(RK3288_CRU_CLKSELS_CON(10));
1995     clk_sel26=cru_readl(RK3288_CRU_CLKSELS_CON(26));    
1996     clk_sel33=cru_readl(RK3288_CRU_CLKSELS_CON(33));
1997     clk_sel36=cru_readl(RK3288_CRU_CLKSELS_CON(36));
1998     clk_sel37=cru_readl(RK3288_CRU_CLKSELS_CON(37));
1999     
2000     cru_mode_con = cru_readl(RK3288_CRU_MODE_CON);
2001
2002
2003     cru_writel(RK3288_PLL_MODE_SLOW(NPLL_ID), RK3288_CRU_MODE_CON);  
2004     plls_suspend(NPLL_ID);
2005     
2006 // cpll
2007     cru_writel(RK3288_PLL_MODE_SLOW(CPLL_ID), RK3288_CRU_MODE_CON);
2008   
2009 // gpll 
2010     cru_writel(RK3288_PLL_MODE_SLOW(GPLL_ID), RK3288_CRU_MODE_CON); 
2011
2012     // set 1,pdbus pll is gpll
2013     cru_writel(CRU_W_MSK_SETBITS(1,15,0x1), RK3288_CRU_CLKSELS_CON(1)); // 0 cpll 1gpll
2014
2015     // pd_bus clk 
2016     cru_writel(0
2017                         |CRU_W_MSK_SETBITS(0,0,0x7)  //  1  aclk
2018                         |CRU_W_MSK_SETBITS(0,3,0x1f) //  1   aclk src
2019                         |CRU_W_MSK_SETBITS(0,8,0x3) // 1   hclk 0~1 1 2 4
2020                         |CRU_W_MSK_SETBITS(0,12,0x7) //  3   pclk
2021                      , RK3288_CRU_CLKSELS_CON(1));
2022     
2023     //crypto for pd_bus
2024     cru_writel(CRU_W_MSK_SETBITS(3,6,0x3), RK3288_CRU_CLKSELS_CON(26));
2025
2026     // peri aclk hclk pclk
2027     cru_writel(0
2028                         |CRU_W_MSK_SETBITS(0,0,0x1f) // 1 aclk
2029                         |CRU_W_MSK_SETBITS(0,8,0x3) // 2   hclk 0 1:1,1 2:1 ,2 4:1
2030                         |CRU_W_MSK_SETBITS(0,12,0x3)// 2     0~3  1 2 4 8 div
2031                         , RK3288_CRU_CLKSELS_CON(10));
2032     // pmu alive 
2033     cru_writel(clk_sel33|CRU_W_MSK_SETBITS(0,0,0x1f)|CRU_W_MSK_SETBITS(0,8,0x1f), RK3288_CRU_CLKSELS_CON(33));
2034
2035     plls_suspend(CPLL_ID);
2036     plls_suspend(GPLL_ID);
2037
2038 //apll 
2039    cru_writel(RK3288_PLL_MODE_SLOW(APLL_ID), RK3288_CRU_MODE_CON);
2040      // core_m0 core_mp a12_core
2041     cru_writel(0
2042                         |CRU_W_MSK_SETBITS(0,0,0xf) // 1   axi_mo
2043                         |CRU_W_MSK_SETBITS(0,4,0xf) // 3  axi mp
2044                         |CRU_W_MSK_SETBITS(0,8,0x1f) // 0 a12 core div
2045                       , RK3288_CRU_CLKSELS_CON(0));
2046     // core0 core1 core2 core3
2047     cru_writel(0
2048                         |CRU_W_MSK_SETBITS(0,0,0x7) //core 0 div
2049                         |CRU_W_MSK_SETBITS(0,4,0x7) // core 1
2050                         |CRU_W_MSK_SETBITS(0,8,0x7) // core2
2051                         |CRU_W_MSK_SETBITS(0,12,0x7)//core3
2052                       , RK3288_CRU_CLKSELS_CON(36));
2053     // l2ram atclk pclk
2054     #if 1
2055     cru_writel(0
2056                     |CRU_W_MSK_SETBITS(3,0,0x7) // l2ram
2057                     |CRU_W_MSK_SETBITS(0xf,4,0x1f) // atclk
2058                      |CRU_W_MSK_SETBITS(0xf,9,0x1f) // pclk dbg
2059                      , RK3288_CRU_CLKSELS_CON(37));
2060     #else
2061     cru_writel(0
2062                       |CRU_W_MSK_SETBITS(0,0,0x7) // l2ram
2063                       |CRU_W_MSK_SETBITS(0x2,4,0x1f) // atclk
2064                        |CRU_W_MSK_SETBITS(0x2,9,0x1f) // pclk dbg
2065                        , RK3288_CRU_CLKSELS_CON(37));
2066     #endif
2067
2068     
2069     plls_suspend(APLL_ID);
2070
2071 }
2072
2073 static void pm_plls_resume(void)
2074 {
2075
2076
2077         // core_m0 core_mp a12_core
2078         cru_writel(clk_sel0|(CRU_W_MSK(0,0xf)|CRU_W_MSK(4,0xf)|CRU_W_MSK(8,0xf)),RK3288_CRU_CLKSELS_CON(0));
2079         // core0 core1 core2 core3
2080         cru_writel(clk_sel36|(CRU_W_MSK(0,0x7)|CRU_W_MSK(4,0x7)|CRU_W_MSK(8,0x7)|CRU_W_MSK(12,0x7))
2081                         , RK3288_CRU_CLKSELS_CON(36));
2082         // l2ram atclk pclk
2083         cru_writel(clk_sel37|(CRU_W_MSK(0,0x7)|CRU_W_MSK(4,0x1f)|CRU_W_MSK(9,0x1f)) , RK3288_CRU_CLKSELS_CON(37));
2084         
2085         plls_resume(APLL_ID);    
2086         cru_writel(cru_mode_con|(RK3288_PLL_MODE_MSK(APLL_ID)<<16), RK3288_CRU_MODE_CON);
2087         
2088         // peri aclk hclk pclk
2089         cru_writel(clk_sel10|(CRU_W_MSK(0,0x1f)|CRU_W_MSK(8,0x3)|CRU_W_MSK(12,0x3))
2090                                                                             , RK3288_CRU_CLKSELS_CON(10));
2091         //pd bus gpll sel
2092         cru_writel(clk_sel1|CRU_W_MSK(15,0x1), RK3288_CRU_CLKSELS_CON(1));
2093         // pd_bus clk 
2094         cru_writel(clk_sel1|(CRU_W_MSK(0,0x7)|CRU_W_MSK(3,0x1f)|CRU_W_MSK(8,0x3)|CRU_W_MSK(12,0x7))
2095                     , RK3288_CRU_CLKSELS_CON(1));
2096                 
2097         // crypto
2098         cru_writel(clk_sel26|CRU_W_MSK(6,0x3), RK3288_CRU_CLKSELS_CON(26));
2099     
2100         
2101           // pmu alive 
2102         cru_writel(clk_sel33|CRU_W_MSK(0,0x1f)|CRU_W_MSK(8,0x1f), RK3288_CRU_CLKSELS_CON(33));
2103
2104         plls_resume(GPLL_ID);   
2105         cru_writel(cru_mode_con|(RK3288_PLL_MODE_MSK(GPLL_ID)<<16), RK3288_CRU_MODE_CON);       
2106         
2107         plls_resume(CPLL_ID);    
2108         cru_writel(cru_mode_con|(RK3288_PLL_MODE_MSK(CPLL_ID)<<16), RK3288_CRU_MODE_CON);
2109         
2110         plls_resume(NPLL_ID);       
2111         cru_writel(cru_mode_con|(RK3288_PLL_MODE_MSK(NPLL_ID)<<16), RK3288_CRU_MODE_CON);
2112
2113        // rkpm_ddr_regs_dump(RK_CRU_VIRT,RK3288_PLL_CONS((0), 0),RK3288_PLL_CONS((4), 3)); 
2114        // rkpm_ddr_regs_dump(RK_CRU_VIRT,RK3288_CRU_MODE_CON,RK3288_CRU_MODE_CON);   
2115        // rkpm_ddr_regs_dump(RK_CRU_VIRT,RK3288_CRU_CLKSELS_CON(0),RK3288_CRU_CLKSELS_CON(42));
2116         
2117 }
2118
2119 static __sramdata u32  sysclk_clksel0_con,sysclk_clksel1_con,sysclk_clksel10_con,sysclk_mode_con;
2120
2121 void PIE_FUNC(sysclk_suspend)(u32 sel_clk)
2122 {
2123
2124     int div;  
2125     sysclk_clksel0_con = cru_readl(RK3288_CRU_CLKSELS_CON(0));
2126     sysclk_clksel1_con = cru_readl(RK3288_CRU_CLKSELS_CON(1));
2127     sysclk_clksel10_con= cru_readl(RK3288_CRU_CLKSELS_CON(10));
2128
2129
2130     if(sel_clk&(RKPM_CTR_SYSCLK_32K))
2131     {
2132         div=3;
2133         sysclk_mode_con= cru_readl(RK3288_CRU_MODE_CON);
2134         cru_writel(0
2135                 |RK3288_PLL_MODE_DEEP(APLL_ID)| RK3288_PLL_MODE_DEEP(CPLL_ID)
2136                 | RK3288_PLL_MODE_DEEP(GPLL_ID)|RK3288_PLL_MODE_DEEP(NPLL_ID)
2137                             , RK3288_CRU_MODE_CON);
2138     }
2139     else if(sel_clk&(RKPM_CTR_SYSCLK_DIV))
2140     {      
2141         div=31;
2142     }
2143
2144     cru_writel(CRU_W_MSK_SETBITS(div,8,0x1f), RK3188_CRU_CLKSELS_CON(0)); //pd core
2145     cru_writel(CRU_W_MSK_SETBITS(div,3,0x1f), RK3188_CRU_CLKSELS_CON(1));//pd bus
2146     cru_writel(CRU_W_MSK_SETBITS(div,0,0x1f), RK3188_CRU_CLKSELS_CON(10));//pd peri
2147     
2148 }
2149
2150 void PIE_FUNC(sysclk_resume)(u32 sel_clk)
2151 {
2152     
2153     cru_writel(sysclk_clksel0_con|CRU_W_MSK(8,0x1f), RK3188_CRU_CLKSELS_CON(0)); //pd core
2154     cru_writel(sysclk_clksel1_con|CRU_W_MSK(3,0x1f), RK3188_CRU_CLKSELS_CON(1));//pd bus
2155     cru_writel(sysclk_clksel10_con|CRU_W_MSK(0,0x1f), RK3188_CRU_CLKSELS_CON(10));//pd peri
2156     cru_writel(sysclk_mode_con|(RK3288_PLL_MODE_MSK(APLL_ID)<<16)
2157                             |(RK3288_PLL_MODE_MSK(CPLL_ID)<<16)
2158                             |(RK3288_PLL_MODE_MSK(GPLL_ID)<<16)
2159                             |(RK3288_PLL_MODE_MSK(NPLL_ID)<<16), RK3288_CRU_MODE_CON);
2160
2161 }
2162
2163
2164 static void clks_gating_suspend_init(void)
2165 {
2166     // get clk gating info
2167     if(rockchip_pie_chunk)
2168         p_rkpm_clkgt_last_set= kern_to_pie(rockchip_pie_chunk, &DATA(rkpm_clkgt_last_set[0]));
2169     else
2170         p_rkpm_clkgt_last_set=&clk_ungt_msk_1[0];
2171     if(clk_suspend_clkgt_info_get(clk_ungt_msk,p_rkpm_clkgt_last_set, RK3288_CRU_CLKGATES_CON_CNT) 
2172         ==RK3288_CRU_CLKGATES_CON(0))
2173     {
2174         rkpm_set_ops_gtclks(gtclks_suspend,gtclks_resume);
2175         if(rockchip_pie_chunk)
2176             rkpm_set_sram_ops_gtclks(fn_to_pie(rockchip_pie_chunk, &FUNC(gtclks_sram_suspend)), 
2177                                 fn_to_pie(rockchip_pie_chunk, &FUNC(gtclks_sram_resume)));
2178         
2179         PM_LOG("%s:clkgt info ok\n",__FUNCTION__);
2180
2181     }
2182     if(rockchip_pie_chunk)
2183         rkpm_set_sram_ops_sysclk(fn_to_pie(rockchip_pie_chunk, &FUNC(sysclk_suspend))
2184                                                 ,fn_to_pie(rockchip_pie_chunk, &FUNC(sysclk_resume))); 
2185 }
2186
2187 /***************************prepare and finish reg_pread***********************************/
2188
2189
2190
2191 #define GIC_DIST_PENDING_SET            0x200
2192 static noinline void rk3288_pm_dump_irq(void)
2193 {
2194         u32 irq_gpio = (readl_relaxed(RK_GIC_VIRT + GIC_DIST_PENDING_SET + 12) >> 17) & 0x1FF;
2195         u32 irq[4];
2196         int i;
2197
2198         for (i = 0; i < ARRAY_SIZE(irq); i++)
2199                 irq[i] = readl_relaxed(RK_GIC_VIRT + GIC_DIST_PENDING_SET + (1 + i) * 4);
2200         for (i = 0; i < ARRAY_SIZE(irq); i++) {
2201                 if (irq[i])
2202                         log_wakeup_reason(32 * (i + 1) + fls(irq[i]) - 1);
2203         }
2204         printk("wakeup irq: %08x %08x %08x %08x\n", irq[0], irq[1], irq[2], irq[3]);
2205         for (i = 0; i <= 8; i++) {
2206                 if (irq_gpio & (1 << i))
2207                         printk("wakeup gpio%d: %08x\n", i, readl_relaxed(RK_GPIO_VIRT(i) + GPIO_INT_STATUS));
2208         }
2209 }
2210
2211 #define DUMP_GPIO_INTEN(ID) \
2212 do { \
2213         u32 en = readl_relaxed(RK_GPIO_VIRT(ID) + GPIO_INTEN); \
2214         if (en) { \
2215                 rkpm_ddr_printascii("GPIO" #ID "_INTEN: "); \
2216                 rkpm_ddr_printhex(en); \
2217                 rkpm_ddr_printch('\n'); \
2218                 printk(KERN_DEBUG "GPIO%d_INTEN: %08x\n", ID, en); \
2219         } \
2220 } while (0)
2221
2222 //dump while irq is enable
2223 static noinline void rk3288_pm_dump_inten(void)
2224 {
2225         DUMP_GPIO_INTEN(0);
2226         DUMP_GPIO_INTEN(1);
2227         DUMP_GPIO_INTEN(2);
2228         DUMP_GPIO_INTEN(3);
2229         DUMP_GPIO_INTEN(4);
2230         DUMP_GPIO_INTEN(5);
2231         DUMP_GPIO_INTEN(6);
2232         DUMP_GPIO_INTEN(7);    
2233         DUMP_GPIO_INTEN(8);
2234 }
2235
2236 static  void rkpm_prepare(void)
2237 {   
2238         #if 0
2239         u32 temp =reg_readl(RK_GPIO_VIRT(0)+0x30);
2240
2241        // rkpm_ddr_printhex(temp);
2242         reg_writel(temp|0x1<<4,RK_GPIO_VIRT(0)+0x30);
2243         temp =reg_readl(RK_GPIO_VIRT(0)+0x30);
2244        // rkpm_ddr_printhex(temp);
2245         #endif             
2246         // dump GPIO INTEN for debug
2247         rk3288_pm_dump_inten();
2248 }
2249
2250 static void rkpm_finish(void)
2251 {
2252         rk3288_pm_dump_irq();
2253 }
2254
2255
2256 static  void interface_ctr_reg_pread(void)
2257 {
2258         //u32 addr;
2259         flush_cache_all();
2260         outer_flush_all();
2261         local_flush_tlb_all();
2262         #if 0  // do it in ddr suspend 
2263         for (addr = (u32)SRAM_CODE_OFFSET; addr < (u32)(SRAM_CODE_OFFSET+rockchip_sram_size); addr += PAGE_SIZE)
2264                 readl_relaxed(addr);
2265         #endif
2266         readl_relaxed(RK_PMU_VIRT);
2267         readl_relaxed(RK_GRF_VIRT);
2268         readl_relaxed(RK_DDR_VIRT);
2269         readl_relaxed(RK_GPIO_VIRT(0));     
2270         //readl_relaxed(RK30_I2C1_BASE+SZ_4K);
2271         //readl_relaxed(RK_GPIO_VIRT(3));
2272 }
2273 void PIE_FUNC(ddr_leakage_tst)(void)
2274 {
2275     cru_writel(RK3288_PLL_MODE_SLOW(DPLL_ID), RK3288_CRU_MODE_CON);    
2276     rkpm_sram_printch('\n');   
2277     rkpm_sram_printch('t');   
2278     rkpm_sram_printch('e');   
2279     rkpm_sram_printch('s');
2280     rkpm_sram_printch('t');   
2281     while(1);               
2282 }
2283
2284 static void __init  rk3288_suspend_init(void)
2285 {
2286     struct device_node *parent;
2287     u32 pm_ctrbits;
2288
2289     PM_LOG("%s enter\n",__FUNCTION__);
2290
2291     parent = of_find_node_by_name(NULL, "rockchip_suspend");    
2292
2293     if (IS_ERR_OR_NULL(parent)) {
2294                 PM_ERR("%s dev node err\n", __func__);
2295                 return;
2296         }
2297
2298
2299     if(of_property_read_u32_array(parent,"rockchip,ctrbits",&pm_ctrbits,1))
2300     {
2301             PM_ERR("%s:get pm ctr error\n",__FUNCTION__);
2302             return ;
2303     }
2304     PM_LOG("%s: pm_ctrbits =%x\n",__FUNCTION__,pm_ctrbits);
2305     pm_io_base_map();
2306     memset(&sleep_resume_data[0],0,sizeof(sleep_resume_data));
2307     rkpm_set_ctrbits(pm_ctrbits);
2308     
2309     clks_gating_suspend_init();
2310
2311     rkpm_set_ops_plls(pm_plls_suspend,pm_plls_resume);
2312     
2313     //rkpm_set_sram_ops_ddr(fn_to_pie(rockchip_pie_chunk, &FUNC(ddr_leakage_tst)),NULL);
2314     
2315     rkpm_set_ops_prepare_finish(rkpm_prepare,rkpm_finish);
2316     
2317     //rkpm_set_ops_regs_pread(interface_ctr_reg_pread);  
2318     
2319      rkpm_set_ops_save_setting(rkpm_save_setting,rkpm_save_setting_resume);
2320      rkpm_set_ops_regs_sleep(rkpm_slp_setting,rkpm_save_setting_resume_first);//rkpm_slp_setting
2321
2322     if(rockchip_pie_chunk)
2323         rkpm_set_sram_ops_printch(fn_to_pie(rockchip_pie_chunk, &FUNC(sram_printch)));
2324     
2325     rkpm_set_ops_printch(ddr_printch);  
2326 }