input: touchscreen: add touch screen of gslx680 for rk3399-firefly-edp
[firefly-linux-kernel-4.4.55.git] / drivers / mfd / rk818.c
index c72a04a555c21b9c8ca0e7098e2cf58f59fcf026..0da49fbfa3c3bf2e68358f6a332ce00642f536af 100755 (executable)
@@ -278,6 +278,37 @@ static int rk818_ldo_suspend_disable(struct regulator_dev *dev)
                return rk818_set_bits(rk818, RK818_SLEEP_SET_OFF_REG2, 1 << ldo, 1 << ldo);
 
 }
+
+int rk818_ldo_slp_enable(int ldo_id)
+{
+       int ldo = ldo_id - 1;
+
+       if (ldo == 8)
+               return rk818_set_bits(g_rk818, RK818_SLEEP_SET_OFF_REG1,
+                                     1 << 5, 0); /*ldo9*/
+       else if (ldo == 9)
+               return rk818_set_bits(g_rk818, RK818_SLEEP_SET_OFF_REG1,
+                                     1 << 6, 0); /*ldo10 switch*/
+       else
+               return rk818_set_bits(g_rk818, RK818_SLEEP_SET_OFF_REG2,
+                                     1 << ldo, 0);
+}
+
+int rk818_ldo_slp_disable(int ldo_id)
+{
+       int ldo = ldo_id - 1;
+
+       if (ldo == 8)
+               return rk818_set_bits(g_rk818, RK818_SLEEP_SET_OFF_REG1,
+                                     1 << 5, 1 << 5); /*ldo9*/
+       else if (ldo == 9)
+               return rk818_set_bits(g_rk818, RK818_SLEEP_SET_OFF_REG1,
+                                     1 << 6, 1 << 6); /*ldo10 switch*/
+       else
+               return rk818_set_bits(g_rk818, RK818_SLEEP_SET_OFF_REG2,
+                                     1 << ldo, 1 << ldo);
+}
+
 static int rk818_ldo_set_sleep_voltage(struct regulator_dev *dev,
                                            int uV)
 {
@@ -926,7 +957,6 @@ static struct rk818_attribute rk818_attrs[] = {
 #endif
 
 #if 0
-extern void rk_send_wakeup_key(void);
 static irqreturn_t rk818_vbat_lo_irq(int irq, void *data)
 {
         printk("rk818 vbat low %s:irq=%d\n",__func__,irq);
@@ -1029,6 +1059,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 +1096,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 +1167,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 +1179,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 +1187,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);
@@ -1136,15 +1199,28 @@ static int rk818_pre_init(struct rk818 *rk818)
        ret = rk818_clear_bits(rk818, RK818_INT_STS_MSK_REG1,(0x3<<5)); //open rtc int when power on
        ret = rk818_set_bits(rk818, RK818_RTC_INT_REG,(0x1<<3),(0x1<<3)); //open rtc int when power on
 
-       /*****disable otg and boost when in sleep mode****/
+       /*****disable otg when in sleep mode****/
        val = rk818_reg_read(rk818, RK818_SLEEP_SET_OFF_REG1);
-       val |= ((0x1 << 7) | (0x1 << 4));
+       val |= (0x1 << 7);
        ret =  rk818_reg_write(rk818, RK818_SLEEP_SET_OFF_REG1, val);
        if (ret < 0) {
                pr_err("Unable to write RK818_SLEEP_SET_OFF_REG1 reg\n");
                return ret;
        }
 
+       /*************** improve efficiency **********************/
+       ret =  rk818_reg_write(rk818, RK818_BUCK2_CONFIG_REG, 0x1c);
+       if (ret < 0) {
+               pr_err("Unable to write RK818_BUCK2_CONFIG_REG reg\n");
+               return ret;
+       }
+
+       ret =  rk818_reg_write(rk818, RK818_BUCK4_CONFIG_REG, 0x04);
+       if (ret < 0) {
+               pr_err("Unable to write RK818_BUCK4_CONFIG_REG reg\n");
+               return ret;
+       }
+
        return 0;
 }
  
@@ -1304,7 +1380,6 @@ static int  rk818_i2c_remove(struct i2c_client *i2c)
                if (rk818->rdev[i])
                        regulator_unregister(rk818->rdev[i]);
        i2c_set_clientdata(i2c, NULL);
-       kfree(rk818);
 
        return 0;
 }