Skip to content

Commit

Permalink
bus: mhi: ep: Power up/down MHI stack during MHI RESET
Browse files Browse the repository at this point in the history
During graceful shutdown scenario, host will issue MHI RESET to the
endpoint device before initiating shutdown. In that case, it makes sense
to completely power down the MHI stack as sooner or later the access to
MMIO registers will be prohibited. Also, the stack needs to be powered
up in the case of SYS_ERR to recover the device.

Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Reviewed-by: Jeffrey Hugo <quic_jhugo@quicinc.com>
Link: https://lore.kernel.org/r/20221228161704.255268-2-manivannan.sadhasivam@linaro.org
Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
  • Loading branch information
Manivannan Sadhasivam committed Jan 27, 2023
1 parent a33ca17 commit 47a1dca
Showing 1 changed file with 7 additions and 28 deletions.
35 changes: 7 additions & 28 deletions drivers/bus/mhi/ep/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -973,11 +973,9 @@ static void mhi_ep_abort_transfer(struct mhi_ep_cntrl *mhi_cntrl)
static void mhi_ep_reset_worker(struct work_struct *work)
{
struct mhi_ep_cntrl *mhi_cntrl = container_of(work, struct mhi_ep_cntrl, reset_work);
struct device *dev = &mhi_cntrl->mhi_dev->dev;
enum mhi_state cur_state;
int ret;

mhi_ep_abort_transfer(mhi_cntrl);
mhi_ep_power_down(mhi_cntrl);

spin_lock_bh(&mhi_cntrl->state_lock);
/* Reset MMIO to signal host that the MHI_RESET is completed in endpoint */
Expand All @@ -990,27 +988,8 @@ static void mhi_ep_reset_worker(struct work_struct *work)
* issue reset during shutdown also and we don't need to do re-init in
* that case.
*/
if (cur_state == MHI_STATE_SYS_ERR) {
mhi_ep_mmio_init(mhi_cntrl);

/* Set AMSS EE before signaling ready state */
mhi_ep_mmio_set_env(mhi_cntrl, MHI_EE_AMSS);

/* All set, notify the host that we are ready */
ret = mhi_ep_set_ready_state(mhi_cntrl);
if (ret)
return;

dev_dbg(dev, "READY state notification sent to the host\n");

ret = mhi_ep_enable(mhi_cntrl);
if (ret) {
dev_err(dev, "Failed to enable MHI endpoint: %d\n", ret);
return;
}

enable_irq(mhi_cntrl->irq);
}
if (cur_state == MHI_STATE_SYS_ERR)
mhi_ep_power_up(mhi_cntrl);
}

/*
Expand Down Expand Up @@ -1089,11 +1068,11 @@ EXPORT_SYMBOL_GPL(mhi_ep_power_up);

void mhi_ep_power_down(struct mhi_ep_cntrl *mhi_cntrl)
{
if (mhi_cntrl->enabled)
if (mhi_cntrl->enabled) {
mhi_ep_abort_transfer(mhi_cntrl);

kfree(mhi_cntrl->mhi_event);
disable_irq(mhi_cntrl->irq);
kfree(mhi_cntrl->mhi_event);
disable_irq(mhi_cntrl->irq);
}
}
EXPORT_SYMBOL_GPL(mhi_ep_power_down);

Expand Down

0 comments on commit 47a1dca

Please sign in to comment.