summaryrefslogtreecommitdiff
path: root/drivers/power/ab8500_charger.c
diff options
context:
space:
mode:
authorKalle Komierowski <kalle.komierowski@gmail.com>2011-05-18 16:31:50 +0200
committerUlf Hansson <ulf.hansson@stericsson.com>2011-09-19 15:15:26 +0200
commit8de0877b60dcbd1bcc81667578bde1d427550c43 (patch)
tree8c2f6d602493697a44938dea3ca35b32edc48267 /drivers/power/ab8500_charger.c
parent319c9264310cb0f04ce6bcb94fc823fb2c097696 (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.c11
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 */