diff options
author | Kalle Komierowski <kalle.komierowski@gmail.com> | 2011-05-18 16:31:50 +0200 |
---|---|---|
committer | Ulf Hansson <ulf.hansson@stericsson.com> | 2011-09-19 15:15:26 +0200 |
commit | 8de0877b60dcbd1bcc81667578bde1d427550c43 (patch) | |
tree | 8c2f6d602493697a44938dea3ca35b32edc48267 /drivers/power/ab8500_charger.c | |
parent | 319c9264310cb0f04ce6bcb94fc823fb2c097696 (diff) |
power: ab8500_bm: Fix for inconsistent lock state
Debug prove locking warns about inconsistent lock state, this patch fixes that warning
ST-Ericsson Linux next: Not tested
ST-Ericsson ID: ER329423
ST-Ericsson FOSS-OUT ID: Trivial
Change-Id: I8ebc082ea590f512ad71b197c88a6e6bb80e92bf
Signed-off-by: Kalle Komierowski <kalle.komierowski@gmail.com>
Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/23366
Reviewed-by: QATEST
Tested-by: Karl KOMIEROWSKI <karl.komierowski@stericsson.com>
Reviewed-by: Jonas ABERG <jonas.aberg@stericsson.com>
Diffstat (limited to 'drivers/power/ab8500_charger.c')
-rw-r--r-- | drivers/power/ab8500_charger.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/power/ab8500_charger.c b/drivers/power/ab8500_charger.c index 96859456ef7..2f9f14d10bb 100644 --- a/drivers/power/ab8500_charger.c +++ b/drivers/power/ab8500_charger.c @@ -160,6 +160,7 @@ struct ab8500_charger_usb_state { bool usb_changed; int usb_current; enum ab8500_usb_state state; + spinlock_t usb_lock; }; /** @@ -1492,13 +1493,17 @@ static void ab8500_charger_usb_link_status_work(struct work_struct *work) static void ab8500_charger_usb_state_changed_work(struct work_struct *work) { int ret; + unsigned long flags; + struct ab8500_charger *di = container_of(work, struct ab8500_charger, usb_state_changed_work); if (!di->vbus_detected) return; + spin_lock_irqsave(&di->usb_state.usb_lock, flags); di->usb_state.usb_changed = false; + spin_unlock_irqrestore(&di->usb_state.usb_lock, flags); /* * wait for some time until you get updates from the usb stack @@ -2198,7 +2203,10 @@ static int ab8500_charger_usb_notifier_call(struct notifier_block *nb, dev_dbg(di->dev, "%s usb_state: 0x%02x mA: %d\n", __func__, bm_usb_state, mA); + spin_lock(&di->usb_state.usb_lock); di->usb_state.usb_changed = true; + spin_unlock(&di->usb_state.usb_lock); + di->usb_state.state = bm_usb_state; di->usb_state.usb_current = mA; @@ -2318,6 +2326,9 @@ static int __devinit ab8500_charger_probe(struct platform_device *pdev) di->parent = dev_get_drvdata(pdev->dev.parent); di->gpadc = ab8500_gpadc_get(); + /* initialize lock */ + spin_lock_init(&di->usb_state.usb_lock); + plat = dev_get_platdata(di->parent->dev); /* get charger specific platform data */ |