Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f6afabd1 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "mhi: core: Extend mhi_device_get_sync_atomic() for panic cases"

parents 633c0a1c b20f4619
Loading
Loading
Loading
Loading
+16 −6
Original line number Diff line number Diff line
@@ -1675,7 +1675,8 @@ int mhi_device_get_sync(struct mhi_device *mhi_dev, int vote)
}
EXPORT_SYMBOL(mhi_device_get_sync);

int mhi_device_get_sync_atomic(struct mhi_device *mhi_dev, int timeout_us)
int mhi_device_get_sync_atomic(struct mhi_device *mhi_dev, int timeout_us,
			       bool in_panic)
{
	struct mhi_controller *mhi_cntrl = mhi_dev->mhi_cntrl;

@@ -1701,12 +1702,21 @@ int mhi_device_get_sync_atomic(struct mhi_device *mhi_dev, int timeout_us)
		return 0;
	}

	if (in_panic) {
		while (mhi_get_mhi_state(mhi_cntrl) != MHI_STATE_M0 &&
		       !MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state) &&
		       timeout_us > 0) {
			udelay(MHI_FORCE_WAKE_DELAY_US);
			timeout_us -= MHI_FORCE_WAKE_DELAY_US;
		}
	} else {
		while (mhi_cntrl->pm_state != MHI_PM_M0 &&
		       !MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state) &&
		       timeout_us > 0) {
			udelay(MHI_FORCE_WAKE_DELAY_US);
			timeout_us -= MHI_FORCE_WAKE_DELAY_US;
		}
	}

	if (MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state) || timeout_us <= 0) {
		MHI_ERR("Did not enter M0 state, cur_state:%s pm_state:%s\n",
+1 −1
Original line number Diff line number Diff line
@@ -3045,7 +3045,7 @@ int cnss_pci_force_wake_request_sync(struct device *dev, int timeout_us)
	if (test_bit(CNSS_DEV_ERR_NOTIFY, &plat_priv->driver_state))
		return -EAGAIN;

	return mhi_device_get_sync_atomic(mhi_ctrl->mhi_dev, timeout_us);
	return mhi_device_get_sync_atomic(mhi_ctrl->mhi_dev, timeout_us, false);
}
EXPORT_SYMBOL(cnss_pci_force_wake_request_sync);

+6 −1
Original line number Diff line number Diff line
@@ -618,6 +618,7 @@ int mhi_device_get_sync(struct mhi_device *mhi_dev, int vote);
 * mhi_device_get_sync_atomic - Asserts device_wait and moves device to M0
 * @mhi_dev: Device associated with the channels
 * @timeout_us: timeout, in micro-seconds
 * @in_panic: If requested while kernel is in panic state and no ISRs expected
 *
 * The device_wake is asserted to keep device in M0 or bring it to M0.
 * If device is not in M0 state, then this function will wait for device to
@@ -629,6 +630,8 @@ int mhi_device_get_sync(struct mhi_device *mhi_dev, int vote);
 * Clients can ignore that transition after this function returns as the device
 * is expected to immediately  move from M2 to M0 as wake is asserted and
 * wouldn't enter low power state.
 * If in_panic boolean is set, no ISRs are expected, hence this API will have to
 * resort to reading the MHI status register and poll on M0 state change.
 *
 * Returns:
 * 0 if operation was successful (however, M0 -> M2 -> M0 is possible later) as
@@ -636,7 +639,9 @@ int mhi_device_get_sync(struct mhi_device *mhi_dev, int vote);
 * -ETIMEDOUT is device faled to move to M0 before @timeout_us elapsed
 * -EIO if the MHI state is one of the ERROR states.
 */
int mhi_device_get_sync_atomic(struct mhi_device *mhi_dev, int timeout_us);
int mhi_device_get_sync_atomic(struct mhi_device *mhi_dev,
			       int timeout_us,
			       bool in_panic);

/**
 * mhi_device_put - re-enable low power modes