From da2e4ebd026d21409ced84bd85c61749374388ee Mon Sep 17 00:00:00 2001 From: zhangqing Date: Mon, 8 Jun 2015 10:30:41 -0700 Subject: [PATCH] rk3x: pmic: rk818: support low battery detect,and slove otg error. Add function: 1)battery voltage low then 3.0V not allow to power on. 2)battery voltage low then 3.4V have irq to wakeup from deep sleep. 3)disable otg_en when rk818 shutdown.. Signed-off-by: zhangqing --- drivers/mfd/rk818.c | 39 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/drivers/mfd/rk818.c b/drivers/mfd/rk818.c index c72a04a555c2..aabee82ae19b 100755 --- a/drivers/mfd/rk818.c +++ b/drivers/mfd/rk818.c @@ -1029,6 +1029,9 @@ static void rk818_shutdown(void) pr_info("%s\n", __func__); ret = rk818_set_bits(rk818, RK818_INT_STS_MSK_REG1,(0x3<<5),(0x3<<5)); //close rtc int when power off ret = rk818_clear_bits(rk818, RK818_RTC_INT_REG,(0x3<<2)); //close rtc int when power off + /*disable otg_en*/ + ret = rk818_clear_bits(rk818, RK818_DCDC_EN_REG, (0x1<<7)); + mutex_lock(&rk818->io_lock); mdelay(100); } @@ -1063,14 +1066,43 @@ __weak void rk818_device_suspend(void) {} __weak void rk818_device_resume(void) {} #ifdef CONFIG_PM static int rk818_suspend(struct i2c_client *i2c, pm_message_t mesg) -{ +{ + int ret, val; + struct rk818 *rk818 = g_rk818; + rk818_device_suspend(); + /************set vbat low 3v4 to irq**********/ + val = rk818_reg_read(rk818, RK818_VB_MON_REG); + val &= (~(VBAT_LOW_VOL_MASK | VBAT_LOW_ACT_MASK)); + val |= (RK818_VBAT_LOW_3V4 | EN_VBAT_LOW_IRQ); + ret = rk818_reg_write(rk818, RK818_VB_MON_REG, val); + if (ret < 0) { + pr_err("Unable to write RK818_VB_MON_REG reg\n"); + return ret; + } + /*enable low irq*/ + rk818_set_bits(rk818, 0x4d, (0x1 << 1), (0x0 << 1)); return 0; } static int rk818_resume(struct i2c_client *i2c) { + int ret, val; + struct rk818 *rk818 = g_rk818; + rk818_device_resume(); + /********set vbat low 3v0 to shutdown**********/ + val = rk818_reg_read(rk818, RK818_VB_MON_REG); + val &= (~(VBAT_LOW_VOL_MASK | VBAT_LOW_ACT_MASK)); + val |= (RK818_VBAT_LOW_3V0 | EN_VABT_LOW_SHUT_DOWN); + ret = rk818_reg_write(rk818, RK818_VB_MON_REG, val); + if (ret < 0) { + pr_err("Unable to write RK818_VB_MON_REG reg\n"); + return ret; + } + /*disable low irq*/ + rk818_set_bits(rk818, 0x4d, (0x1 << 1), (0x1 << 1)); + return 0; } #else @@ -1105,11 +1137,10 @@ static int rk818_pre_init(struct rk818 *rk818) return ret; } /****************************************/ - /****************set vbat low **********/ val = rk818_reg_read(rk818,RK818_VB_MON_REG); val &=(~(VBAT_LOW_VOL_MASK | VBAT_LOW_ACT_MASK)); - val |= (RK818_VBAT_LOW_3V5 | EN_VBAT_LOW_IRQ); + val |= (RK818_VBAT_LOW_3V0 | EN_VABT_LOW_SHUT_DOWN); ret = rk818_reg_write(rk818,RK818_VB_MON_REG,val); if (ret <0) { printk(KERN_ERR "Unable to write RK818_VB_MON_REG reg\n"); @@ -1118,6 +1149,7 @@ static int rk818_pre_init(struct rk818 *rk818) /**************************************/ /**********mask int****************/ + val = rk818_reg_read(rk818,RK818_INT_STS_MSK_REG1); val |= (0x1<<0); //mask vout_lo_int ret = rk818_reg_write(rk818,RK818_INT_STS_MSK_REG1,val); @@ -1125,6 +1157,7 @@ static int rk818_pre_init(struct rk818 *rk818) printk(KERN_ERR "Unable to write RK818_INT_STS_MSK_REG1 reg\n"); return ret; } + /**********************************/ /**********enable clkout2****************/ ret = rk818_reg_write(rk818,RK818_CLK32OUT_REG,0x01); -- 2.34.1