| From 8a9dbb779fe882325b9a0238494a7afaff2eb444 Mon Sep 17 00:00:00 2001 |
| From: Chanwoo Choi <cw00.choi@samsung.com> |
| Date: Thu, 14 Jun 2018 11:16:29 +0900 |
| Subject: extcon: Release locking when sending the notification of connector state |
| |
| From: Chanwoo Choi <cw00.choi@samsung.com> |
| |
| commit 8a9dbb779fe882325b9a0238494a7afaff2eb444 upstream. |
| |
| 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: ab11af049f88 ("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: Chanwoo Choi <cw00.choi@samsung.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/extcon/extcon.c | 3 ++- |
| 1 file changed, 2 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/extcon/extcon.c |
| +++ b/drivers/extcon/extcon.c |
| @@ -433,8 +433,8 @@ int extcon_sync(struct extcon_dev *edev, |
| return index; |
| |
| spin_lock_irqsave(&edev->lock, flags); |
| - |
| state = !!(edev->state & BIT(index)); |
| + spin_unlock_irqrestore(&edev->lock, flags); |
| |
| /* |
| * Call functions in a raw notifier chain for the specific one |
| @@ -448,6 +448,7 @@ int extcon_sync(struct extcon_dev *edev, |
| */ |
| raw_notifier_call_chain(&edev->nh_all, state, edev); |
| |
| + spin_lock_irqsave(&edev->lock, flags); |
| /* This could be in interrupt handler */ |
| prop_buf = (char *)get_zeroed_page(GFP_ATOMIC); |
| if (!prop_buf) { |