From: root Date: Tue, 2 Aug 2011 09:12:20 +0000 (+0800) Subject: rk29 phone:add wake lock support if SYSVDD under voltage X-Git-Tag: firefly_0821_release~9775^2~3^2~20 X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=4e5e35cefe66f4c90cb0dbae7f70dbf8b88d3710;p=firefly-linux-kernel-4.4.55.git rk29 phone:add wake lock support if SYSVDD under voltage --- diff --git a/drivers/power/wm831x_power.c b/drivers/power/wm831x_power.c index 4b19d339da98..6d37030d25f8 100755 --- a/drivers/power/wm831x_power.c +++ b/drivers/power/wm831x_power.c @@ -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);