diff options
Diffstat (limited to 'drivers/bus')
| -rw-r--r-- | drivers/bus/mhi/core/pm.c | 35 | 
1 files changed, 12 insertions, 23 deletions
| diff --git a/drivers/bus/mhi/core/pm.c b/drivers/bus/mhi/core/pm.c index e70a3e3a0b46..4aae0baea008 100644 --- a/drivers/bus/mhi/core/pm.c +++ b/drivers/bus/mhi/core/pm.c @@ -1053,7 +1053,7 @@ int mhi_async_power_up(struct mhi_controller *mhi_cntrl)  	enum mhi_ee_type current_ee;  	enum dev_st_transition next_state;  	struct device *dev = &mhi_cntrl->mhi_dev->dev; -	u32 val; +	u32 interval_us = 25000; /* poll register field every 25 milliseconds */  	int ret;  	dev_info(dev, "Requested to power ON\n"); @@ -1070,10 +1070,6 @@ int mhi_async_power_up(struct mhi_controller *mhi_cntrl)  	mutex_lock(&mhi_cntrl->pm_mutex);  	mhi_cntrl->pm_state = MHI_PM_DISABLE; -	ret = mhi_init_irq_setup(mhi_cntrl); -	if (ret) -		goto error_setup_irq; -  	/* Setup BHI INTVEC */  	write_lock_irq(&mhi_cntrl->pm_lock);  	mhi_write_reg(mhi_cntrl, mhi_cntrl->bhi, BHI_INTVEC, 0); @@ -1087,7 +1083,7 @@ int mhi_async_power_up(struct mhi_controller *mhi_cntrl)  		dev_err(dev, "%s is not a valid EE for power on\n",  			TO_MHI_EXEC_STR(current_ee));  		ret = -EIO; -		goto error_async_power_up; +		goto error_exit;  	}  	state = mhi_get_mhi_state(mhi_cntrl); @@ -1096,20 +1092,12 @@ int mhi_async_power_up(struct mhi_controller *mhi_cntrl)  	if (state == MHI_STATE_SYS_ERR) {  		mhi_set_mhi_state(mhi_cntrl, MHI_STATE_RESET); -		ret = wait_event_timeout(mhi_cntrl->state_event, -				MHI_PM_IN_FATAL_STATE(mhi_cntrl->pm_state) || -					mhi_read_reg_field(mhi_cntrl, -							   mhi_cntrl->regs, -							   MHICTRL, -							   MHICTRL_RESET_MASK, -							   MHICTRL_RESET_SHIFT, -							   &val) || -					!val, -				msecs_to_jiffies(mhi_cntrl->timeout_ms)); -		if (!ret) { -			ret = -EIO; +		ret = mhi_poll_reg_field(mhi_cntrl, mhi_cntrl->regs, MHICTRL, +				 MHICTRL_RESET_MASK, MHICTRL_RESET_SHIFT, 0, +				 interval_us); +		if (ret) {  			dev_info(dev, "Failed to reset MHI due to syserr state\n"); -			goto error_async_power_up; +			goto error_exit;  		}  		/* @@ -1119,6 +1107,10 @@ int mhi_async_power_up(struct mhi_controller *mhi_cntrl)  		mhi_write_reg(mhi_cntrl, mhi_cntrl->bhi, BHI_INTVEC, 0);  	} +	ret = mhi_init_irq_setup(mhi_cntrl); +	if (ret) +		goto error_exit; +  	/* Transition to next state */  	next_state = MHI_IN_PBL(current_ee) ?  		DEV_ST_TRANSITION_PBL : DEV_ST_TRANSITION_READY; @@ -1131,10 +1123,7 @@ int mhi_async_power_up(struct mhi_controller *mhi_cntrl)  	return 0; -error_async_power_up: -	mhi_deinit_free_irq(mhi_cntrl); - -error_setup_irq: +error_exit:  	mhi_cntrl->pm_state = MHI_PM_DISABLE;  	mutex_unlock(&mhi_cntrl->pm_mutex); |