| From 592d5b17e606b05aee5c02e7a7fcd025c8008245 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 4 Sep 2018 17:18:58 +0200 |
| Subject: usb: chipidea: Fix otg event handler |
| |
| From: Loic Poulain <loic.poulain@linaro.org> |
| |
| [ Upstream commit 59739131e0ca06db7560f9073fff2fb83f6bc2a5 ] |
| |
| At OTG work running time, it's possible that several events need to be |
| addressed (e.g. ID and VBUS events). The current implementation handles |
| only one event at a time which leads to ignoring the other one. Fix it. |
| |
| Signed-off-by: Loic Poulain <loic.poulain@linaro.org> |
| Signed-off-by: Peter Chen <peter.chen@nxp.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/usb/chipidea/otg.c | 9 ++++++--- |
| 1 file changed, 6 insertions(+), 3 deletions(-) |
| |
| diff --git a/drivers/usb/chipidea/otg.c b/drivers/usb/chipidea/otg.c |
| index db4ceffcf2a61..f25d4827fd49c 100644 |
| --- a/drivers/usb/chipidea/otg.c |
| +++ b/drivers/usb/chipidea/otg.c |
| @@ -203,14 +203,17 @@ static void ci_otg_work(struct work_struct *work) |
| } |
| |
| pm_runtime_get_sync(ci->dev); |
| + |
| if (ci->id_event) { |
| ci->id_event = false; |
| ci_handle_id_switch(ci); |
| - } else if (ci->b_sess_valid_event) { |
| + } |
| + |
| + if (ci->b_sess_valid_event) { |
| ci->b_sess_valid_event = false; |
| ci_handle_vbus_change(ci); |
| - } else |
| - dev_err(ci->dev, "unexpected event occurs at %s\n", __func__); |
| + } |
| + |
| pm_runtime_put_sync(ci->dev); |
| |
| enable_irq(ci->irq); |
| -- |
| 2.20.1 |
| |