Commit 8a9dbb77 authored by Chanwoo Choi's avatar Chanwoo Choi

extcon: Release locking when sending the notification of connector state

Previously, extcon used the spinlock before calling the notifier_call_chain
to prevent the scheduled out of task and to prevent the notification delay.
When spinlock is locked for sending the notification, deadlock issue
occured on the side of extcon consumer device. To fix this issue,
extcon consumer device should always use the work. it is always not
reasonable to use work.

To fix this issue on extcon consumer device, release locking when sending
the notification of connector state.

Fixes: ab11af04 ("extcon: Add the synchronization extcon APIs to support the notification")
Cc: stable@vger.kernel.org
Cc: Roger Quadros <rogerq@ti.com>
Cc: Kishon Vijay Abraham I <kishon@ti.com>
Signed-off-by: default avatarChanwoo Choi <cw00.choi@samsung.com>
parent 11bab5a2
...@@ -433,8 +433,8 @@ int extcon_sync(struct extcon_dev *edev, unsigned int id) ...@@ -433,8 +433,8 @@ int extcon_sync(struct extcon_dev *edev, unsigned int id)
return index; return index;
spin_lock_irqsave(&edev->lock, flags); spin_lock_irqsave(&edev->lock, flags);
state = !!(edev->state & BIT(index)); state = !!(edev->state & BIT(index));
spin_unlock_irqrestore(&edev->lock, flags);
/* /*
* Call functions in a raw notifier chain for the specific one * Call functions in a raw notifier chain for the specific one
...@@ -448,6 +448,7 @@ int extcon_sync(struct extcon_dev *edev, unsigned int id) ...@@ -448,6 +448,7 @@ int extcon_sync(struct extcon_dev *edev, unsigned int id)
*/ */
raw_notifier_call_chain(&edev->nh_all, state, edev); raw_notifier_call_chain(&edev->nh_all, state, edev);
spin_lock_irqsave(&edev->lock, flags);
/* This could be in interrupt handler */ /* This could be in interrupt handler */
prop_buf = (char *)get_zeroed_page(GFP_ATOMIC); prop_buf = (char *)get_zeroed_page(GFP_ATOMIC);
if (!prop_buf) { if (!prop_buf) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment