From d966cddbfd8f5224426e4adf42c265869ad61e54 Mon Sep 17 00:00:00 2001 From: xxx Date: Thu, 26 Jun 2014 15:15:58 +0800 Subject: [PATCH] fixed: suspend gpios setting --- arch/arm/boot/dts/rk3288.dtsi | 10 +- arch/arm/mach-rockchip/pm-rk3288.c | 407 ++++++++++------------ include/dt-bindings/suspend/rockchip-pm.h | 4 +- 3 files changed, 197 insertions(+), 224 deletions(-) diff --git a/arch/arm/boot/dts/rk3288.dtsi b/arch/arm/boot/dts/rk3288.dtsi index 14f2a108bcd9..5657cbecf371 100755 --- a/arch/arm/boot/dts/rk3288.dtsi +++ b/arch/arm/boot/dts/rk3288.dtsi @@ -1193,16 +1193,20 @@ |RKPM_CTR_PWR_DMNS |RKPM_CTR_GTCLKS |RKPM_CTR_PLLS + // |RKPM_CTR_GPIOS // |RKPM_CTR_SYSCLK_DIV // |RKPM_CTR_IDLEAUTO_MD // |RKPM_CTR_ARMOFF_LPMD |RKPM_CTR_ARMOFF_LOGDP_LPMD ) >; - rockchip,pmic-gpios = < - RKPM_PINGPIO_BITS_OUTPUT(GPIO0_A0,RKPM_GPIO_OUT_L) - RKPM_PINGPIO_BITS_INTPUT(GPIO0_A1,RKPM_GPIO_PULL_UP) + rockchip,pmic-suspend_gpios = < + RKPM_PINGPIO_BITS_OUTPUT(GPIO7_A1,RKPM_GPIO_OUT_H) >; + rockchip,pmic-resume_gpios = < + RKPM_PINGPIO_BITS_FUN(PWM1,RKPM_GPIO_PULL_DN) + >; + }; isp: isp@ff910000{ diff --git a/arch/arm/mach-rockchip/pm-rk3288.c b/arch/arm/mach-rockchip/pm-rk3288.c index b6db3936a322..1e0e2a36e2b7 100755 --- a/arch/arm/mach-rockchip/pm-rk3288.c +++ b/arch/arm/mach-rockchip/pm-rk3288.c @@ -28,8 +28,8 @@ __weak void rk_usb_power_down(void); __weak void rk_usb_power_up(void); -static void ddr_pin_set_pull(u8 port,u8 bank,u8 b_gpio,u8 fun); -static void ddr_gpio_set_in_output(u8 port,u8 bank,u8 b_gpio,u8 type); +//static void ddr_pin_set_pull(u8 port,u8 bank,u8 b_gpio,u8 fun); +//static void ddr_gpio_set_in_output(u8 port,u8 bank,u8 b_gpio,u8 type); static void ddr_pin_set_fun(u8 port,u8 bank,u8 b_gpio,u8 fun); @@ -983,7 +983,7 @@ static u32 rkpm_slp_mode_set(u32 ctrbits) else if(rkpm_chk_val_ctrbits(ctrbits,RKPM_CTR_ARMOFF_LOGDP_LPMD)) { - rkpm_ddr_printascii("-armoff-logdp1-"); + rkpm_ddr_printascii("-armoff-logdp-"); mode_set|=BIT(pmu_scu_en)|BIT(pmu_bus_pd_en) |BIT(pmu_chip_pd_en) @@ -1131,7 +1131,7 @@ static void rkpm_peri_save(u32 power_mode) ddr_pin_set_fun(7,0xc,0x7,0); #endif //slp_uart_save(2); - #if 0 + #if 0 ddr_pin_set_pull(0,0xb,0x7,RKPM_GPIO_PULL_UP); ddr_gpio_set_in_output(0,0xb,0x7,RKPM_GPIO_INPUT); ddr_pin_set_fun(0,0xb,0x7,0); @@ -1343,7 +1343,7 @@ static void ddr_printch(char byte) //pin=0x0a21 gpio0a2,port=0,bank=a,b_gpio=2,fun=1 static inline void pin_set_fun(u8 port,u8 bank,u8 b_gpio,u8 fun) { - u8 off_set; + u32 off_set; bank-=0xa; if(port==0) @@ -1425,41 +1425,35 @@ static inline void pin_set_fun(u8 port,u8 bank,u8 b_gpio,u8 fun) } - +#if 0 static inline u8 pin_get_funset(u8 port,u8 bank,u8 b_gpio) { - u8 off_set; - bank-=0xa; - - if(port==0) - { - if(bank>2) - return 0; - off_set=RK3288_PMU_GPIO0_A_IOMUX+bank*4; - return (pmu_readl(off_set)>>(b_gpio*2))&0x3; - } - else - { - - off_set=port*(4*4)+bank*4; - //form RK3288_GRF_GPIO1D_IOMUX - return (reg_readl(RK_GRF_VIRT+0+off_set)>>(b_gpio*2))&0x3; - } + } - +#endif static inline void pin_set_pull(u8 port,u8 bank,u8 b_gpio,u8 pull) { - u8 off_set; + u32 off_set; bank-=0xa; if(port > 0) { //gpio1_d st - if(port==1&&bank<3) - return; + //if(port==1&&bank<3) + // return; //gpio1_d==0x14c ,form gpio0_a to gpio1_d offset 1*16+3*4= 0x1c - off_set=0x14c-0x1c+port*(4*4)+bank*4; + off_set=(0x14c-0x1c)+port*(4*4)+bank*4; + + #if 0 + rkpm_ddr_printascii("gpio pull\n"); + rkpm_ddr_printhex((u32)RK_GPIO_VIRT(port)); + rkpm_ddr_printhex(b_gpio); + rkpm_ddr_printhex(pull); + rkpm_ddr_printhex(off_set); + rkpm_ddr_printhex(RKPM_W_MSK_SETBITS(pull,b_gpio*2,0x3)); + #endif + reg_writel(RKPM_W_MSK_SETBITS(pull,b_gpio*2,0x3),RK_GRF_VIRT+off_set); } @@ -1474,7 +1468,7 @@ static inline void pin_set_pull(u8 port,u8 bank,u8 b_gpio,u8 pull) static inline u8 pin_get_pullset(u8 port,u8 bank,u8 b_gpio) { - u8 off_set; + u32 off_set; bank-=0xa; @@ -1512,8 +1506,19 @@ static inline void gpio_set_in_output(u8 port,u8 bank,u8 b_gpio,u8 type) val|=(0x1<value) + return 0; + return prop->length; } -static inline void rkpm_pin_gpio_config_ddr(u32 pin_gpio_bits,u32 *save_bits) +static void rkpm_pin_gpio_config(u32 pin_gpio_bits) { u32 pins; @@ -1736,168 +1716,156 @@ static inline void rkpm_pin_gpio_config_ddr(u32 pin_gpio_bits,u32 *save_bits) b_gpio=RKPM_PINBITS_BGPIO(pins); fun=RKPM_PINBITS_FUN(pins); - //save pins info - if(save_bits) - { - pins=RKPM_PINBITS_SET_FUN(pins,ddr_pin_get_funset(port,bank,b_gpio)); - *save_bits=RKPM_PINGPIO_BITS(pins,ddr_pin_get_pullset(port,bank,b_gpio),ddr_gpio_get_in_outputset(port,bank,b_gpio), - ddr_gpio_get_output_levelset(port,bank,b_gpio)); - } - if(!fun&&(in_out==RKPM_GPIO_OUTPUT)) + + if(!fun) { - if(level==RKPM_GPIO_OUT_L) - pull=RKPM_GPIO_PULL_DN; - else - pull=RKPM_GPIO_PULL_UP; - - ddr_gpio_set_output_level(port,bank,b_gpio,level); + if(in_out==RKPM_GPIO_OUTPUT) + { + if(level==RKPM_GPIO_OUT_L) + pull=RKPM_GPIO_PULL_DN; + else + pull=RKPM_GPIO_PULL_UP; + + ddr_gpio_set_output_level(port,bank,b_gpio,level); + } + //rkpm_ddr_printhex(pins); + + ddr_gpio_set_in_output(port,bank,b_gpio,in_out); } - + ddr_pin_set_pull(port,bank,b_gpio,pull); ddr_pin_set_fun(port,bank,b_gpio,fun); - if(!fun) - { - ddr_gpio_set_in_output(port,bank,b_gpio,in_out); - } + } +#define RKPM_PINGPIO_BITS_PINTOPORT(pin_gpio_bits) RKPM_PINBITS_PORT(RKPM_PINGPIO_BITS_PIN((pin_gpio_bits))) +#define rkpm_gpio_pclk_idx(port) ((port)==0) ? RK3288_CLKGATE_PCLK_GPIO0 : (RK3288_CLKGATE_PCLK_GPIO1+(port)-1) -#define GPIO_DTS_NUM 10 - -//static u32 gpio_dts_save[GPIO_DTS_NUM]; -//static u32 gpio_dts[GPIO_DTS_NUM]; - -#define PMICGPIO_DTS_NUM 3 - - -u32 DEFINE_PIE_DATA(pmicgpio_dts[PMICGPIO_DTS_NUM]); -//static u32 *p_pmicgpio_dts; -static __sramdata u32 pmicgpio_dts_save[PMICGPIO_DTS_NUM]; - -static void __sramfunc pmic_gpio_suspend(void) +//rk3288_powermode +static void rkpm_pins_setting(u32 *gpios,u32 cnt) { - int i; - for(i=0;;i++) - { - if(DATA(pmicgpio_dts[i])) - rkpm_pin_gpio_config_sram(DATA(pmicgpio_dts[i]),& pmicgpio_dts_save[i]); - else - { - pmicgpio_dts_save[i]=0; - break; - } - } - #if 0 - for(i=0;i<6;i++) + u32 i,clk_id; + u32 gpio_clk_reg[9]; + u8 port; + + // rkpm_ddr_printascii("\ngpios"); + + for(i=0;i<9;i++) { - rkpm_sram_reg_dump(RK_GPIO_VIRT(i),0,0x4); + gpio_clk_reg[i]=0xffff0000; } - // - rkpm_sram_reg_dump(RK_GRF_VIRT,0xc,0x84); - rkpm_sram_reg_dump(RK_GRF_VIRT,0x14c,0x1b4); - rkpm_sram_reg_dump(RK_PMU_VIRT,0x64,0x6c); - rkpm_sram_reg_dump(RK_PMU_VIRT,0x84,0x9c); - #endif - -} - -static void __sramfunc pmic_gpio_resume(void) -{ - int i; - for(i=0;;i++) + + for(i=0;i