| From 6aaad58c872db062f7ea2761421ca748bd0931cc Mon Sep 17 00:00:00 2001 |
| From: Krzysztof Kozlowski <krzk@kernel.org> |
| Date: Mon, 17 Aug 2020 09:00:00 +0200 |
| Subject: extcon: ptn5150: Fix usage of atomic GPIO with sleeping GPIO chips |
| |
| From: Krzysztof Kozlowski <krzk@kernel.org> |
| |
| commit 6aaad58c872db062f7ea2761421ca748bd0931cc upstream. |
| |
| The driver uses atomic version of gpiod_set_value() without any real |
| reason. It is called in a workqueue under mutex so it could sleep |
| there. Changing it to "can_sleep" flavor allows to use the driver with |
| all GPIO chips. |
| |
| Fixes: 4ed754de2d66 ("extcon: Add support for ptn5150 extcon driver") |
| Cc: <stable@vger.kernel.org> |
| Signed-off-by: Krzysztof Kozlowski <krzk@kernel.org> |
| Reviewed-by: Vijai Kumar K <vijaikumar.kanagarajan@gmail.com> |
| Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/extcon/extcon-ptn5150.c | 8 ++++---- |
| 1 file changed, 4 insertions(+), 4 deletions(-) |
| |
| --- a/drivers/extcon/extcon-ptn5150.c |
| +++ b/drivers/extcon/extcon-ptn5150.c |
| @@ -127,7 +127,7 @@ static void ptn5150_irq_work(struct work |
| case PTN5150_DFP_ATTACHED: |
| extcon_set_state_sync(info->edev, |
| EXTCON_USB_HOST, false); |
| - gpiod_set_value(info->vbus_gpiod, 0); |
| + gpiod_set_value_cansleep(info->vbus_gpiod, 0); |
| extcon_set_state_sync(info->edev, EXTCON_USB, |
| true); |
| break; |
| @@ -138,9 +138,9 @@ static void ptn5150_irq_work(struct work |
| PTN5150_REG_CC_VBUS_DETECTION_MASK) >> |
| PTN5150_REG_CC_VBUS_DETECTION_SHIFT); |
| if (vbus) |
| - gpiod_set_value(info->vbus_gpiod, 0); |
| + gpiod_set_value_cansleep(info->vbus_gpiod, 0); |
| else |
| - gpiod_set_value(info->vbus_gpiod, 1); |
| + gpiod_set_value_cansleep(info->vbus_gpiod, 1); |
| |
| extcon_set_state_sync(info->edev, |
| EXTCON_USB_HOST, true); |
| @@ -156,7 +156,7 @@ static void ptn5150_irq_work(struct work |
| EXTCON_USB_HOST, false); |
| extcon_set_state_sync(info->edev, |
| EXTCON_USB, false); |
| - gpiod_set_value(info->vbus_gpiod, 0); |
| + gpiod_set_value_cansleep(info->vbus_gpiod, 0); |
| } |
| } |
| |