lkml.org 
[lkml]   [2010]   [May]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 8/8] power_supply: Block suspend while power supply change notifications are pending
    Date
    When connecting usb or the charger the device would often go back to sleep
    before the charge led and screen turned on.

    Signed-off-by: Arve Hjønnevåg <arve@android.com>
    ---
    drivers/power/power_supply_core.c | 9 ++++++---
    include/linux/power_supply.h | 3 ++-
    2 files changed, 8 insertions(+), 4 deletions(-)

    diff --git a/drivers/power/power_supply_core.c b/drivers/power/power_supply_core.c
    index cce75b4..577a131 100644
    --- a/drivers/power/power_supply_core.c
    +++ b/drivers/power/power_supply_core.c
    @@ -39,7 +39,7 @@ static int __power_supply_changed_work(struct device *dev, void *data)
    static void power_supply_changed_work(struct work_struct *work)
    {
    struct power_supply *psy = container_of(work, struct power_supply,
    - changed_work);
    + changed_work.work);

    dev_dbg(psy->dev, "%s\n", __func__);

    @@ -55,7 +55,7 @@ void power_supply_changed(struct power_supply *psy)
    {
    dev_dbg(psy->dev, "%s\n", __func__);

    - schedule_work(&psy->changed_work);
    + schedule_suspend_blocking_work(&psy->changed_work);
    }
    EXPORT_SYMBOL_GPL(power_supply_changed);

    @@ -155,7 +155,8 @@ int power_supply_register(struct device *parent, struct power_supply *psy)
    goto dev_create_failed;
    }

    - INIT_WORK(&psy->changed_work, power_supply_changed_work);
    + suspend_blocking_work_init(&psy->changed_work,
    + power_supply_changed_work, "power-supply");

    rc = power_supply_create_attrs(psy);
    if (rc)
    @@ -172,6 +173,7 @@ int power_supply_register(struct device *parent, struct power_supply *psy)
    create_triggers_failed:
    power_supply_remove_attrs(psy);
    create_attrs_failed:
    + suspend_blocking_work_destroy(&psy->changed_work);
    device_unregister(psy->dev);
    dev_create_failed:
    success:
    @@ -184,6 +186,7 @@ void power_supply_unregister(struct power_supply *psy)
    flush_scheduled_work();
    power_supply_remove_triggers(psy);
    power_supply_remove_attrs(psy);
    + suspend_blocking_work_destroy(&psy->changed_work);
    device_unregister(psy->dev);
    }
    EXPORT_SYMBOL_GPL(power_supply_unregister);
    diff --git a/include/linux/power_supply.h b/include/linux/power_supply.h
    index ebd2b8f..f6412c8 100644
    --- a/include/linux/power_supply.h
    +++ b/include/linux/power_supply.h
    @@ -14,6 +14,7 @@
    #define __LINUX_POWER_SUPPLY_H__

    #include <linux/device.h>
    +#include <linux/suspend.h>
    #include <linux/workqueue.h>
    #include <linux/leds.h>

    @@ -152,7 +153,7 @@ struct power_supply {

    /* private */
    struct device *dev;
    - struct work_struct changed_work;
    + struct suspend_blocking_work changed_work;

    #ifdef CONFIG_LEDS_TRIGGERS
    struct led_trigger *charging_full_trig;
    --
    1.6.5.1
    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2010-05-14 06:15    [W:0.024 / U:61.244 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site