rk29 phone:add wake lock support if SYSVDD under voltage
authorroot <root@lw.(none)>
Tue, 2 Aug 2011 09:12:20 +0000 (17:12 +0800)
committerroot <root@lw.(none)>
Tue, 2 Aug 2011 14:53:42 +0000 (22:53 +0800)
drivers/power/wm831x_power.c

index 4b19d339da980d9c16a298968225f45b327cc6ae..6d37030d25f8f262c46831ddc544f0c2f82d800f 100755 (executable)
@@ -95,6 +95,7 @@ struct wm831x_power {
        struct work_struct batt_work;
        struct timer_list timer;
        struct wm_batt_priv_data batt_info;
+       struct wake_lock        syslo_wake;
        int interval;
 };
 
@@ -699,7 +700,8 @@ static irqreturn_t wm831x_syslo_irq(int irq, void *data)
 
        /* Not much we can actually *do* but tell people for
         * posterity, we're probably about to run out of power. */
-       dev_crit(wm831x->dev, "SYSVDD under voltage\n");
+       dev_crit(wm831x->dev, "SYSVDD under voltage and wake lock 60s\n");
+       wake_lock_timeout(&wm831x_power->syslo_wake,60*HZ);//wait for android closing system
        return IRQ_HANDLED;
 }
 
@@ -730,8 +732,8 @@ void wm831x_batt_vol_level(struct wm831x_power *wm831x_power, int batt_vol, int
 {
        int i, ret, status;
        static int count = 0;
-       static int disp_plus = 100;
-       static int disp_minus = 100;
+       static int disp_plus = 1000;
+       static int disp_minus = 1000;
        static int disp_curr = 0;
 
        *level = wm831x_power->batt_info.level;
@@ -789,7 +791,7 @@ void wm831x_batt_vol_level(struct wm831x_power *wm831x_power, int batt_vol, int
                        *level = 100;
 
                // ³õʼ״̬
-               if ((disp_plus == 100) && (disp_minus == 100))
+               if ((disp_plus == 1000) && (disp_minus == 1000))
                {
                        *level = *level;
                        disp_plus = 0;
@@ -798,14 +800,14 @@ void wm831x_batt_vol_level(struct wm831x_power *wm831x_power, int batt_vol, int
                }
                else
                {
-                       if (*level <= (wm831x_power->batt_info.level-3))        
+                       if (*level <= (wm831x_power->batt_info.level-1))        
                        {
                                disp_plus = 0;
                                disp_curr = 0;
                                
-                               if (++disp_minus > 4)
+                               if (++disp_minus > 50)
                                {
-                                       *level = wm831x_power->batt_info.level - 3;
+                                       *level = wm831x_power->batt_info.level - 1;
                                        disp_minus = 0;
                                }
                                else
@@ -818,7 +820,7 @@ void wm831x_batt_vol_level(struct wm831x_power *wm831x_power, int batt_vol, int
                                disp_plus = 0;
                                disp_minus = 0;
 
-                               if (++disp_curr > 4)
+                               if (++disp_curr > 50)
                                {
                                        *level = *level;
                                        disp_curr = 0;
@@ -828,14 +830,14 @@ void wm831x_batt_vol_level(struct wm831x_power *wm831x_power, int batt_vol, int
                                        *level = wm831x_power->batt_info.level;
                                }
                        }
-                       else if (*level >= (wm831x_power->batt_info.level+3))
+                       else if (*level >= (wm831x_power->batt_info.level+1))
                        {
                                disp_minus = 0;
                                disp_curr = 0;
                                
-                               if (++disp_plus > 10)
+                               if (++disp_plus > 100)
                                {
-                                       *level = wm831x_power->batt_info.level + 3;
+                                       *level = wm831x_power->batt_info.level + 1;
                                        disp_plus = 0;
                                }
                                else
@@ -1003,6 +1005,7 @@ static __devinit int wm831x_power_probe(struct platform_device *pdev)
        power->batt_info.status    = POWER_SUPPLY_STATUS_DISCHARGING;
        power->batt_info.health    = POWER_SUPPLY_HEALTH_GOOD;
 
+       wake_lock_init(&power->syslo_wake, WAKE_LOCK_SUSPEND, "wm831x_syslo_wake");
        INIT_WORK(&power->batt_work, wm831x_batt_work);
        setup_timer(&power->timer, wm831x_batt_timer_handler, (unsigned long)power);
        power->timer.expires = jiffies + msecs_to_jiffies(1000);