Merge remote-tracking branch 'linux-2.6.32.y/master' into develop
[firefly-linux-kernel-4.4.55.git] / arch / arm / mach-rk29 / pwm_sram.c
1
2 #include <mach/rk29_iomap.h>
3 #include <mach/board.h>
4 #include <mach/sram.h>
5 #include <asm/io.h>
6 #include <asm/tlbflush.h>
7 #include <mach/cru.h>
8 #include <linux/regulator/rk29-pwm-regulator.h>
9
10 #define pwm_write_reg(addr, val)        __raw_writel(val, addr + (RK29_PWM_BASE + 2*0x10))
11 #define pwm_read_reg(addr)              __raw_readl(addr + (RK29_PWM_BASE + 2*0x10))
12 #define cru_readl(offset)       readl(RK29_CRU_BASE + offset)
13 #define cru_writel(v, offset)   do { writel(v, RK29_CRU_BASE + offset); dsb(); } while (0)
14
15 void interface_ctr_reg_pread(void)
16 {
17         flush_tlb_all();
18         readl(RK29_PWM_BASE);
19         readl(RK29_GRF_BASE);
20 }
21 static unsigned int __sramdata pwm_lrc,pwm_hrc;
22
23 static void __sramfunc rk29_pwm_set_core_voltage(unsigned int uV)
24 {
25         u32 gate1;
26
27         gate1 = cru_readl(CRU_CLKGATE1_CON);
28         cru_writel(gate1 & ~((1 << CLK_GATE_PCLK_PEIRPH % 32) | (1 << CLK_GATE_ACLK_PEIRPH % 32) | (1 << CLK_GATE_ACLK_CPU_PERI % 32)), CRU_CLKGATE1_CON);
29
30         /* iomux pwm2 */
31         writel((readl(RK29_GRF_BASE + 0x58) & ~(0x3<<6)) | (0x2<<6), RK29_GRF_BASE + 0x58);
32
33         if (uV) {
34                 pwm_lrc = pwm_read_reg(PWM_REG_LRC);
35                 pwm_hrc = pwm_read_reg(PWM_REG_HRC);
36         }
37
38         pwm_write_reg(PWM_REG_CTRL, PWM_DIV|PWM_RESET);
39         if (uV == 1000000) {
40                 pwm_write_reg(PWM_REG_LRC, 12);
41                 pwm_write_reg(PWM_REG_HRC, 10);
42         } else {
43                 pwm_write_reg(PWM_REG_LRC, pwm_lrc);
44                 pwm_write_reg(PWM_REG_HRC, pwm_hrc);
45         }
46         pwm_write_reg(PWM_REG_CNTR, 0);
47         pwm_write_reg(PWM_REG_CTRL, PWM_DIV|PWM_ENABLE|PWM_TimeEN);
48
49         LOOP(5 * 1000 * LOOPS_PER_USEC); /* delay 5ms */
50
51         cru_writel(gate1, CRU_CLKGATE1_CON);
52 }
53
54 unsigned int __sramfunc rk29_suspend_voltage_set(unsigned int vol)
55 {
56         
57         rk29_pwm_set_core_voltage(1000000);
58         return 0;
59
60 }
61 void __sramfunc rk29_suspend_voltage_resume(unsigned int vol)
62 {
63         rk29_pwm_set_core_voltage(0);
64         return 0;
65 }
66
67 /*
68 void interface_ctr_reg_pread(void)
69 {
70 }
71 unsigned int __sramfunc rk29_suspend_voltage_set(unsigned int vol)
72 {
73 }
74 void __sramfunc rk29_suspend_voltage_resume(unsigned int vol)
75 {
76 }
77 */
78
79
80
81
82
83
84