From 30d38160f89c43f07c84f35525da6059ef5498b6 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=E5=BC=A0=E6=99=B4?= Date: Mon, 9 Jul 2012 09:49:32 +0800 Subject: [PATCH] rk30:phone:support pmic tps80032 vbat low detection,support pmic tps80032 early suspend --- arch/arm/mach-rk30/board-rk30-phone-twl60xx.c | 21 +++++++++++++++++++ drivers/mfd/twl-core.c | 15 +++++++++++++ drivers/mfd/twl6030-irq.c | 6 +++++- drivers/power/Kconfig | 4 ++++ 4 files changed, 45 insertions(+), 1 deletion(-) diff --git a/arch/arm/mach-rk30/board-rk30-phone-twl60xx.c b/arch/arm/mach-rk30/board-rk30-phone-twl60xx.c index ea28129bfe28..913055c06c78 100755 --- a/arch/arm/mach-rk30/board-rk30-phone-twl60xx.c +++ b/arch/arm/mach-rk30/board-rk30-phone-twl60xx.c @@ -737,6 +737,27 @@ static struct twl4030_power_data tps80032_scripts_data __initdata = { .resource_config = twl4030_rconfig, }; +#ifdef CONFIG_HAS_EARLYSUSPEND +void twl60xx_pmu_early_suspend(struct regulator_dev *rdev) +{ + printk("%s\n", __func__); + + twl_reg_write(0x06,TWL_MODULE_PIH, 0x00); +} +void twl60xx_pmu_early_resume(struct regulator_dev *rdev) +{ + printk("%s\n", __func__); + + twl_reg_write(0x06,TWL_MODULE_PIH, 0x04); +} +#else +void twl60xx_pmu_early_suspend(struct regulator_dev *rdev) +{ +} +void twl60xx_pmu_early_resume(struct regulator_dev *rdev) +{ +} +#endif void __sramfunc board_pmu_suspend(void) { diff --git a/drivers/mfd/twl-core.c b/drivers/mfd/twl-core.c index d6187db14aa2..3dedd5a0df15 100755 --- a/drivers/mfd/twl-core.c +++ b/drivers/mfd/twl-core.c @@ -41,6 +41,11 @@ #include #include "twl-core.h" +#include +#ifdef CONFIG_HAS_EARLYSUSPEND +static struct early_suspend twl60xx_early_suspend; +#endif + #if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) #include #endif @@ -1381,6 +1386,9 @@ static int __devexit twl_remove(struct i2c_client *client) } /* NOTE: this driver only handles a single twl4030/tps659x0 chip */ +__weak void twl60xx_pmu_early_suspend(struct regulator_dev *rdev) {} +__weak void twl60xx_pmu_early_resume(struct regulator_dev *rdev) {} + static int __devinit twl_probe(struct i2c_client *client, const struct i2c_device_id *id) { @@ -1508,6 +1516,13 @@ twl_probe(struct i2c_client *client, const struct i2c_device_id *id) printk(" tps80032 set_init() failed\n"); } } + #ifdef CONFIG_HAS_EARLYSUSPEND + twl60xx_early_suspend.level = 0xffff; + twl60xx_early_suspend.suspend = twl60xx_pmu_early_suspend; + twl60xx_early_suspend.resume = twl60xx_pmu_early_resume; + register_early_suspend(&twl60xx_early_suspend); + #endif + fail: if (status < 0) diff --git a/drivers/mfd/twl6030-irq.c b/drivers/mfd/twl6030-irq.c index 05c4b478052f..59e2ea63e188 100755 --- a/drivers/mfd/twl6030-irq.c +++ b/drivers/mfd/twl6030-irq.c @@ -42,6 +42,7 @@ #include "twl-core.h" +#include /* * TWL6030 (unlike its predecessors, which had two level interrupt handling) * three interrupt registers INT_STS_A, INT_STS_B and INT_STS_C. @@ -265,9 +266,11 @@ static irqreturn_t handle_twl6030_pih(int irq, void *devid) */ static irqreturn_t handle_twl6030_vlow(int irq, void *unused) { +#ifdef CONFIG_TWL60xx_VBAT_LOW_DETECTION + rk28_send_wakeup_key(); +#else pr_err("twl6030: BAT_VLOW interrupt; threshold=%dmV\n", 2300 + (vbatmin_hi_threshold - 0b110) * 50); - #if 1 /* temporary */ pr_err("%s: disabling BAT_VLOW interrupt\n", __func__); disable_irq_nosync(twl6030_irq_base + TWL_VLOW_INTR_OFFSET); @@ -275,6 +278,7 @@ static irqreturn_t handle_twl6030_vlow(int irq, void *unused) #else pr_emerg("handle_twl6030_vlow: kernel_power_off()\n"); kernel_power_off(); +#endif #endif return IRQ_HANDLED; } diff --git a/drivers/power/Kconfig b/drivers/power/Kconfig index 9ba570d708a4..acd40a735dab 100755 --- a/drivers/power/Kconfig +++ b/drivers/power/Kconfig @@ -342,4 +342,8 @@ config WM8326_VBAT_LOW_DETECTION tristate "Support for WM8326 battery voltage detection." default n +config TWL60xx_VBAT_LOW_DETECTION + tristate "Support for twl60xx low battery detection." + default n + endif # POWER_SUPPLY -- 2.34.1