Merge tag 'lsk-android-14.03' into develop-3.10
[firefly-linux-kernel-4.4.55.git] / drivers / mfd / rt5025-irq.c
index 8bf1bea23b37655900a434ea43858e147ed7f8df..7a324c251a340422b532108a42809dc2a9e74a70 100644 (file)
@@ -38,6 +38,8 @@ struct rt5025_irq_info {
        int intr_pin;
        int irq;
        int suspend;
+       int acin_cnt;
+       int usbin_cnt;
 };
 
 static void rt5025_work_func(struct work_struct *work)
@@ -74,6 +76,9 @@ static void rt5025_work_func(struct work_struct *work)
                irq_enable[3] = rt5025_reg_read(ii->i2c, RT5025_REG_IRQEN4);
                irq_enable[4] = rt5025_reg_read(ii->i2c, RT5025_REG_IRQEN5);
                irq_enable[5] = rt5025_reg_read(ii->i2c, RT5025_REG_GAUGEIRQEN);
+               #if 1
+               rt5025_reg_write(ii->i2c, RT5025_REG_IRQEN2, irq_enable[1]&(~RT5025_CHTERMI_MASK));
+               #else
                /* disable all irq enable bit first */
                rt5025_reg_write(ii->i2c, RT5025_REG_IRQEN1, irq_enable[0]&RT5025_ADAPIRQ_MASK);
                rt5025_reg_write(ii->i2c, RT5025_REG_IRQEN2, 0x00);
@@ -81,6 +86,7 @@ static void rt5025_work_func(struct work_struct *work)
                rt5025_reg_write(ii->i2c, RT5025_REG_IRQEN4, 0x00);
                rt5025_reg_write(ii->i2c, RT5025_REG_IRQEN5, 0x00);
                rt5025_reg_write(ii->i2c, RT5025_REG_GAUGEIRQEN, 0x00);
+               #endif //#if 0
                /* read irq status bit */
                irq_stat[0] = rt5025_reg_read(ii->i2c, RT5025_REG_IRQSTATUS1);
                irq_stat[1] = rt5025_reg_read(ii->i2c, RT5025_REG_IRQSTATUS2);
@@ -95,7 +101,7 @@ static void rt5025_work_func(struct work_struct *work)
                chg_event = irq_stat[0]<<16 | irq_stat[1]<<8 | irq_stat[2];
                pwr_event = irq_stat[3]<<8 | irq_stat[4];
                #ifdef CONFIG_POWER_RT5025
-               if ((chg_event & CHARGER_DETECT_MASK) && ii->chip->power_info->otg_en == 0)
+               if ((chg_event & CHARGER_DETECT_MASK))
                {
                        if (chg_event & CHG_EVENT_CHTERMI)
                        {
@@ -110,18 +116,40 @@ static void rt5025_work_func(struct work_struct *work)
                        if (chg_event & (CHG_EVENT_CHSLPI_INAC | CHG_EVENT_CHSLPI_INUSB))
                        {
                                ii->chip->power_info->chg_term = 0;
+                               if (chg_event & CHG_EVENT_CHSLPI_INAC)
+                                       ii->acin_cnt = 0;
+                               if (chg_event & CHG_EVENT_CHSLPI_INUSB)
+                                       ii->usbin_cnt = 0;
+                               
                        }
 
                        if (chg_event & (CHG_EVENT_INAC_PLUGIN | CHG_EVENT_INUSB_PLUGIN))
                        {
-                               rt5025_set_charging_buck(ii->i2c, 0);
-                               mdelay(50);
-                               rt5025_set_charging_buck(ii->i2c, 1);
-                               mdelay(100);
-                               rt5025_set_charging_buck(ii->i2c, 0);
-                               mdelay(50);
-                               rt5025_set_charging_buck(ii->i2c, 1);
-                               mdelay(200);
+                               RTINFO("acin_cnt %d, usbin_cnt %d\n", ii->acin_cnt, ii->usbin_cnt);
+                               if (ii->acin_cnt == 0 && ii->usbin_cnt == 0)
+                               {
+                                       #if 1
+                                       rt5025_charger_reset_and_reinit(ii->chip->power_info);
+                                       rt5025_reg_write(ii->i2c, RT5025_REG_IRQEN1, irq_enable[0]);
+                                       rt5025_reg_write(ii->i2c, RT5025_REG_IRQEN2, irq_enable[1]&(~RT5025_CHTERMI_MASK));
+                                       rt5025_reg_write(ii->i2c, RT5025_REG_IRQEN3, irq_enable[2]);
+                                       #else
+                                       rt5025_set_charging_buck(ii->i2c, 0);
+                                       mdelay(50);
+                                       rt5025_set_charging_buck(ii->i2c, 1);
+                                       mdelay(100);
+                                       rt5025_set_charging_buck(ii->i2c, 0);
+                                       mdelay(50);
+                                       rt5025_set_charging_buck(ii->i2c, 1);
+                                       mdelay(400);
+                                       #endif /* #if 1 */
+                               }
+
+                               if (chg_event & CHG_EVENT_INAC_PLUGIN)
+                                       ii->acin_cnt = 1;
+                               if (chg_event & CHG_EVENT_INUSB_PLUGIN)
+                                       ii->usbin_cnt = 1;
+                               RTINFO("acin_cnt %d, usbin_cnt %d\n", ii->acin_cnt, ii->usbin_cnt);
                        }
 
                        if (ii->chip->power_info->chg_term <= 3)
@@ -150,6 +178,9 @@ static void rt5025_work_func(struct work_struct *work)
                rt5025_gauge_irq_handler(ii->chip->battery_info, irq_stat[5] & RT5025_FLG_VOLT);
        #endif /* CONFIG_POWER_RT5025 */
 
+       #if 1
+       rt5025_reg_write(ii->i2c, RT5025_REG_IRQEN2, irq_enable[1]);
+       #else
        /* restore all irq enable bit */
        rt5025_reg_write(ii->i2c, RT5025_REG_IRQEN1, irq_enable[0]);
        rt5025_reg_write(ii->i2c, RT5025_REG_IRQEN2, irq_enable[1]);
@@ -158,6 +189,7 @@ static void rt5025_work_func(struct work_struct *work)
        rt5025_reg_write(ii->i2c, RT5025_REG_IRQEN5, irq_enable[4]);
        if (rt5025_reg_read(ii->i2c, RT5025_REG_GAUGEIRQEN) == 0)
                rt5025_reg_write(ii->i2c, RT5025_REG_GAUGEIRQEN, irq_enable[5]);
+       #endif //#if 0
 
        //enable_irq(ii->irq);
 }