lkml.org 
[lkml]   [2009]   [May]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: [PATCH] da9030_battery: fix race between event handler and monitor
On Tue, 12 May 2009 10:20:09 +0300
Mike Rapoport <mike@compulab.co.il> wrote:

> Signed-off-by: Mike Rapoport <mike@compulab.co.il>

We seem to be missing a changelog.

>
> diff --git a/drivers/power/da9030_battery.c b/drivers/power/da9030_battery.c
> index 1662bb0..3364198 100644
> --- a/drivers/power/da9030_battery.c
> +++ b/drivers/power/da9030_battery.c
> @@ -22,8 +22,6 @@
> #include <linux/debugfs.h>
> #include <linux/seq_file.h>
>
> -#define DA9030_STATUS_CHDET (1 << 3)
> -
> #define DA9030_FAULT_LOG 0x0a
> #define DA9030_FAULT_LOG_OVER_TEMP (1 << 7)
> #define DA9030_FAULT_LOG_VBAT_OVER (1 << 4)
> @@ -244,6 +242,8 @@ static void da9030_set_charge(struct da9030_charger *charger, int on)
> }
>
> da903x_write(charger->master, DA9030_CHARGE_CONTROL, val);
> +
> + power_supply_changed(&charger->psy);
> }
>
> static void da9030_charger_check_state(struct da9030_charger *charger)
> @@ -258,6 +258,12 @@ static void da9030_charger_check_state(struct da9030_charger *charger)
> da9030_set_charge(charger, 1);
> }
> } else {
> + /* Charger has been pulled out */
> + if (!charger->chdet) {
> + da9030_set_charge(charger, 0);
> + return;
> + }
> +
> if (charger->adc.vbat_res >=
> charger->thresholds.vbat_charge_stop) {
> da9030_set_charge(charger, 0);
> @@ -395,13 +401,11 @@ static int da9030_battery_event(struct notifier_block *nb, unsigned long event,
> {
> struct da9030_charger *charger =
> container_of(nb, struct da9030_charger, nb);
> - int status;
>
> switch (event) {
> case DA9030_EVENT_CHDET:
> - status = da903x_query_status(charger->master,
> - DA9030_STATUS_CHDET);
> - da9030_set_charge(charger, status);
> + cancel_delayed_work_sync(&charger->work);
> + schedule_work(&charger->work.work);
> break;
> case DA9030_EVENT_VBATMON:
> da9030_battery_vbat_event(charger);
> @@ -565,7 +569,8 @@ static int da9030_battery_remove(struct platform_device *dev)
> da903x_unregister_notifier(charger->master, &charger->nb,
> DA9030_EVENT_CHDET | DA9030_EVENT_VBATMON |
> DA9030_EVENT_CHIOVER | DA9030_EVENT_TBAT);
> - cancel_delayed_work(&charger->work);
> + cancel_delayed_work_sync(&charger->work);
> + da9030_set_charge(charger, 0);
> power_supply_unregister(&charger->psy);
>
> kfree(charger);

What is this race? What are the user-visible effects when it occurs?
How does the patch fix the race?



\
 
 \ /
  Last update: 2009-05-13 20:45    [W:0.043 / U:0.100 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site