Messages in this thread | | | Subject | Re: [PATCH v2 1/5] bus: mhi: core: Handle syserr during power_up | From | Hemant Kumar <> | Date | Thu, 9 Apr 2020 17:55:27 -0700 |
| |
On 4/7/20 9:50 AM, Jeffrey Hugo wrote: > The MHI device may be in the syserr state when we attempt to init it in > power_up(). Since we have no local state, the handling is simple - > reset the device and wait for it to transition out of the reset state. > > Signed-off-by: Jeffrey Hugo <jhugo@codeaurora.org> > --- > drivers/bus/mhi/core/pm.c | 20 ++++++++++++++++++++ > 1 file changed, 20 insertions(+) > > diff --git a/drivers/bus/mhi/core/pm.c b/drivers/bus/mhi/core/pm.c > index 52690cb..3285c9e 100644 > --- a/drivers/bus/mhi/core/pm.c > +++ b/drivers/bus/mhi/core/pm.c > @@ -9,6 +9,7 @@ > #include <linux/dma-direction.h> > #include <linux/dma-mapping.h> > #include <linux/interrupt.h> > +#include <linux/iopoll.h> > #include <linux/list.h> > #include <linux/mhi.h> > #include <linux/module.h> > @@ -760,6 +761,7 @@ static void mhi_deassert_dev_wake(struct mhi_controller *mhi_cntrl, > > int mhi_async_power_up(struct mhi_controller *mhi_cntrl) > { > + enum mhi_state state; > enum mhi_ee_type current_ee; > enum dev_st_transition next_state; > struct device *dev = &mhi_cntrl->mhi_dev->dev; > @@ -829,6 +831,24 @@ int mhi_async_power_up(struct mhi_controller *mhi_cntrl) > goto error_bhi_offset; > } > > + state = mhi_get_mhi_state(mhi_cntrl); > + if (state == MHI_STATE_SYS_ERR) { > + mhi_set_mhi_state(mhi_cntrl, MHI_STATE_RESET); > + ret = readl_poll_timeout(mhi_cntrl->regs + MHICTRL, val, > + !(val & MHICTRL_RESET_MASK), 1000, > + mhi_cntrl->timeout_ms * 1000); can we use this instead of polling because MSI is configures and int_vec handler is registered
wait_event_timeout(mhi_cntrl->state_event, MHI_PM_IN_FATAL_STATE(mhi_cntrl->pm_state) || mhi_read_reg_field(mhi_cntrl, base, MHICTRL, MHICTRL_RESET_MASK, MHICTRL_RESET_SHIFT, &reset) || !reset , msecs_to_jiffies(mhi_cntrl->timeout_ms));
1) In case of MHI_PM_IN_FATAL_STATE we would not be accessing MHI reg 2) Consistent with current MHI driver code. > + if (ret) { > + dev_info(dev, "Failed to reset MHI due to syserr state\n"); > + goto error_bhi_offset; > + } > + > + /* > + * device cleares INTVEC as part of RESET processing, > + * re-program it > + */ > + mhi_write_reg(mhi_cntrl, mhi_cntrl->bhi, BHI_INTVEC, 0); > + } > + > /* Transition to next state */ > next_state = MHI_IN_PBL(current_ee) ? > DEV_ST_TRANSITION_PBL : DEV_ST_TRANSITION_READY;
-- The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project
| |