From 7e937c0cfdb6d6d4d20869909e8a34ea9ffdfc52 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=E5=BC=A0=E6=99=B4?= Date: Mon, 28 May 2012 18:35:21 +0800 Subject: [PATCH] rk30:phone loquat:add clk switch from 24M to 32K when in sleep --- arch/arm/configs/rk30_phone_loquat_defconfig | 1 + arch/arm/mach-rk30/board-rk30-phone-loquat.c | 3 +- arch/arm/mach-rk30/board-rk30-phone-twl60xx.c | 35 +++++++++++++++---- 3 files changed, 32 insertions(+), 7 deletions(-) diff --git a/arch/arm/configs/rk30_phone_loquat_defconfig b/arch/arm/configs/rk30_phone_loquat_defconfig index 1886ef13d907..6de798ffb216 100755 --- a/arch/arm/configs/rk30_phone_loquat_defconfig +++ b/arch/arm/configs/rk30_phone_loquat_defconfig @@ -25,6 +25,7 @@ CONFIG_ARCH_RK30=y CONFIG_DDR_SDRAM_FREQ=300 CONFIG_WIFI_CONTROL_FUNC=y CONFIG_MACH_RK30_PHONE_LOQUAT=y +CONFIG_CLK_SWITCH_TO_32K=y # CONFIG_SWP_EMULATE is not set CONFIG_FIQ_DEBUGGER=y CONFIG_FIQ_DEBUGGER_NO_SLEEP=y diff --git a/arch/arm/mach-rk30/board-rk30-phone-loquat.c b/arch/arm/mach-rk30/board-rk30-phone-loquat.c index 15fb41da4351..319bacb04a92 100755 --- a/arch/arm/mach-rk30/board-rk30-phone-loquat.c +++ b/arch/arm/mach-rk30/board-rk30-phone-loquat.c @@ -720,7 +720,7 @@ static int rk29_backlight_pwm_suspend(void) printk("func %s, line %d: request gpio fail\n", __FUNCTION__, __LINE__); return -1; } - gpio_direction_output(PWM_GPIO, GPIO_LOW); + gpio_direction_output(PWM_GPIO, GPIO_HIGH); #ifdef LCD_DISP_ON_PIN gpio_direction_output(BL_EN_PIN, 0); gpio_set_value(BL_EN_PIN, !BL_EN_VALUE); @@ -730,6 +730,7 @@ static int rk29_backlight_pwm_suspend(void) static int rk29_backlight_pwm_resume(void) { + gpio_direction_output(PWM_GPIO, GPIO_LOW); gpio_free(PWM_GPIO); rk30_mux_api_set(PWM_MUX_NAME, PWM_MUX_MODE); #ifdef LCD_DISP_ON_PIN diff --git a/arch/arm/mach-rk30/board-rk30-phone-twl60xx.c b/arch/arm/mach-rk30/board-rk30-phone-twl60xx.c index 198db66d1f5a..c9408d315ceb 100755 --- a/arch/arm/mach-rk30/board-rk30-phone-twl60xx.c +++ b/arch/arm/mach-rk30/board-rk30-phone-twl60xx.c @@ -15,6 +15,11 @@ #define GPIO6_PB3_DO_HIGH 0x08000800 #define GPIO6_PB3_EN_MASK 0x08000800 #define GPIO6_PB3_UNEN_MASK 0x08000000 +#define GPIO6_PB1_DIR_OUT 0x02000200 +#define GPIO6_PB1_DO_LOW 0x02000000 +#define GPIO6_PB1_DO_HIGH 0x02000200 +#define GPIO6_PB1_EN_MASK 0x02000200 +#define GPIO6_PB1_UNEN_MASK 0x02000000 #define TWL60xx_IRQ_BASE (NR_GIC_IRQS + NR_GPIO_IRQS ) #ifdef CONFIG_TWL4030_CORE @@ -98,16 +103,19 @@ static inline int twl_reg_write(unsigned base, unsigned slave_subgp, } #define PMU_POWER_SLEEP RK30_PIN6_PB3 - +#define PMU_CHRG_DET_N RK30_PIN0_PC7 int tps80032_pre_init(void){ printk("%s\n", __func__); gpio_request(PMU_POWER_SLEEP, "NULL"); gpio_direction_output(PMU_POWER_SLEEP, GPIO_LOW); + + gpio_request(PMU_CHRG_DET_N, "NULL"); + gpio_direction_output(PMU_CHRG_DET_N, GPIO_HIGH); - twl_reg_write(PREQ1_RES_ASS_A,TWL_MODULE_PM_SLAVE_RES,0x0b); - twl_reg_write(PREQ1_RES_ASS_B,TWL_MODULE_PM_SLAVE_RES,0x10); + twl_reg_write(PREQ1_RES_ASS_A,TWL_MODULE_PM_SLAVE_RES,0x2b); + twl_reg_write(PREQ1_RES_ASS_B,TWL_MODULE_PM_SLAVE_RES,0x50); twl_reg_write(PREQ1_RES_ASS_C,TWL_MODULE_PM_SLAVE_RES,0x27); twl_reg_write(PHOENIX_MSK_TRANSITION,TWL_MODULE_PM_MASTER,0x00); twl_reg_write(PHOENIX_SENS_TRANSITION,TWL_MODULE_PM_MASTER,0xc0); //set pmu enter sleep on a preq1 rising edge @@ -119,9 +127,9 @@ int tps80032_pre_init(void){ twl_reg_write(CLK32KG_CFG_STATE,TWL_MODULE_PM_SLAVE_RES,0x01); //set clk32kg on when we use twl_reg_write(CLK32KAUDIO_CFG_STATE,TWL_MODULE_PM_SLAVE_RES,0x01); //set clk32kaudio on when we use -// twl_reg_write(LDO5_CFG_TRANS,TWL_MODULE_PM_RECEIVER,0x03); //set ldo5 is disabled when in sleep mode -// twl_reg_write(LDO7_CFG_TRANS,TWL_MODULE_PM_RECEIVER,0x03); //set ldo7 is disabled when in sleep mode - + twl_reg_write(LDO5_CFG_TRANS,TWL_MODULE_PM_RECEIVER,0x03); //set ldo5 is disabled when in sleep mode + twl_reg_write(LDO7_CFG_TRANS,TWL_MODULE_PM_RECEIVER,0x03); //set ldo7 is disabled when in sleep mode + twl_reg_write(LDOUSB_CFG_TRANS,TWL_MODULE_PM_RECEIVER,0x03); return 0; } @@ -782,16 +790,31 @@ static struct twl4030_power_data tps80032_scripts_data __initdata = { void __sramfunc board_pmu_suspend(void) { + #ifdef CONFIG_CLK_SWITCH_TO_32K //switch clk to 32k + grf_writel(GPIO6_PB1_DIR_OUT, GRF_GPIO6L_DIR_ADDR); + grf_writel(GPIO6_PB1_DO_HIGH, GRF_GPIO6L_DO_ADDR); //set gpio6_b1 output low + grf_writel(GPIO6_PB1_EN_MASK, GRF_GPIO6L_EN_ADDR); + #endif + grf_writel(GPIO6_PB3_DIR_OUT, GRF_GPIO6L_DIR_ADDR); grf_writel(GPIO6_PB3_DO_HIGH, GRF_GPIO6L_DO_ADDR); //set gpio6_b3 output low grf_writel(GPIO6_PB3_EN_MASK, GRF_GPIO6L_EN_ADDR); + } void __sramfunc board_pmu_resume(void) { grf_writel(GPIO6_PB3_DIR_OUT, GRF_GPIO6L_DIR_ADDR); grf_writel(GPIO6_PB3_DO_LOW, GRF_GPIO6L_DO_ADDR); //set gpio6_b3 output high grf_writel(GPIO6_PB3_EN_MASK, GRF_GPIO6L_EN_ADDR); + + #ifdef CONFIG_CLK_SWITCH_TO_32K //switch clk to 24M + grf_writel(GPIO6_PB1_DIR_OUT, GRF_GPIO6L_DIR_ADDR); + grf_writel(GPIO6_PB1_DO_LOW, GRF_GPIO6L_DO_ADDR); //set gpio6_b1 output low + grf_writel(GPIO6_PB1_EN_MASK, GRF_GPIO6L_EN_ADDR); + sram_32k_udelay(10000); + #else sram_udelay(2000); + #endif } static struct twl4030_platform_data tps80032_data = { -- 2.34.1