summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLoic Poulain <loic.poulain@linaro.org>2021-04-28 10:12:15 +0200
committerLoic Poulain <loic.poulain@linaro.org>2021-04-28 10:12:15 +0200
commit26f8c232392534449e7f31cf47489d048af36977 (patch)
tree4fb014c5e99311354fa3b63480715a9c3bdcd93c
parent7c7f90349e8dda3755d83c718e3b0436c763ee08 (diff)
bus: mhi: core: Fix power down latencymhi-dev
On gracefull power-down/disable transition, a MHI reset is performed, the MHI device then looses its context, including interrupt config. However the current implementation is waiting for event(irq) driven state change to confirm reset has been completed, which never happens, and causes reset timeout, leading to unexpected high latency of the mhi_power_down procedure. Fix that by moving to the recently introduced poll_reg_field method, waiting for the reset bit to be cleared, in the same way as the power_on procedure. Signed-off-by: Loic Poulain <loic.poulain@linaro.org>
-rw-r--r--drivers/bus/mhi/core/pm.c17
1 files changed, 5 insertions, 12 deletions
diff --git a/drivers/bus/mhi/core/pm.c b/drivers/bus/mhi/core/pm.c
index e2e59a341fef..9c61d3f880ba 100644
--- a/drivers/bus/mhi/core/pm.c
+++ b/drivers/bus/mhi/core/pm.c
@@ -3,7 +3,6 @@
* Copyright (c) 2018-2020, The Linux Foundation. All rights reserved.
*
*/
-
#include <linux/delay.h>
#include <linux/device.h>
#include <linux/dma-direction.h>
@@ -471,17 +470,11 @@ static void mhi_pm_disable_transition(struct mhi_controller *mhi_cntrl)
dev_dbg(dev, "Triggering MHI Reset in device\n");
mhi_set_mhi_state(mhi_cntrl, MHI_STATE_RESET);
- /* Wait for the reset bit to be cleared by the device */
- ret = wait_event_timeout(mhi_cntrl->state_event,
- mhi_read_reg_field(mhi_cntrl,
- mhi_cntrl->regs,
- MHICTRL,
- MHICTRL_RESET_MASK,
- MHICTRL_RESET_SHIFT,
- &in_reset) ||
- !in_reset, timeout);
- if (!ret || in_reset)
- dev_err(dev, "Device failed to exit MHI Reset state\n");
+ ret = mhi_poll_reg_field(mhi_cntrl, mhi_cntrl->regs, MHICTRL,
+ MHICTRL_RESET_MASK, MHICTRL_RESET_SHIFT, 0,
+ 25000);
+ if (ret)
+ dev_err(dev, "Device failed to clear MHI Reset\n");
/*
* Device will clear BHI_INTVEC as a part of RESET processing,