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

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

Merge "mhi: core: ensure device wake gets cleared if unvote was forced"

parents b51ec806 4d2a31e8
Loading
Loading
Loading
Loading
+13 −6
Original line number Diff line number Diff line
@@ -202,10 +202,12 @@ void mhi_assert_dev_wake(struct mhi_controller *mhi_cntrl, bool force)
		spin_unlock_irqrestore(&mhi_cntrl->wlock, flags);
	} else {
		/* if resources requested already, then increment and exit */
		if (likely(atomic_add_unless(&mhi_cntrl->dev_wake, 1, 0)))
		spin_lock_irqsave(&mhi_cntrl->wlock, flags);
		if (likely(atomic_add_unless(&mhi_cntrl->dev_wake, 1, 0))) {
			spin_unlock_irqrestore(&mhi_cntrl->wlock, flags);
			return;
		}

		spin_lock_irqsave(&mhi_cntrl->wlock, flags);
		if ((atomic_inc_return(&mhi_cntrl->dev_wake) == 1) &&
		    MHI_WAKE_DB_SET_VALID(mhi_cntrl->pm_state) &&
		    !mhi_cntrl->wake_set) {
@@ -225,15 +227,20 @@ void mhi_deassert_dev_wake(struct mhi_controller *mhi_cntrl, bool override)
		   atomic_read(&mhi_cntrl->dev_wake) == 0), "dev_wake == 0");

	/* resources not dropping to 0, decrement and exit */
	if (likely(atomic_add_unless(&mhi_cntrl->dev_wake, -1, 1)))
	spin_lock_irqsave(&mhi_cntrl->wlock, flags);
	if (likely(atomic_add_unless(&mhi_cntrl->dev_wake, -1, 1))) {
		if (!override)
			mhi_cntrl->ignore_override = true;
		spin_unlock_irqrestore(&mhi_cntrl->wlock, flags);
		return;
	}

	spin_lock_irqsave(&mhi_cntrl->wlock, flags);
	if ((atomic_dec_return(&mhi_cntrl->dev_wake) == 0) &&
	    MHI_WAKE_DB_CLEAR_VALID(mhi_cntrl->pm_state) && !override &&
	    mhi_cntrl->wake_set) {
	    MHI_WAKE_DB_CLEAR_VALID(mhi_cntrl->pm_state) && (!override ||
	    mhi_cntrl->ignore_override) && mhi_cntrl->wake_set) {
		mhi_write_db(mhi_cntrl, mhi_cntrl->wake_db, 0);
		mhi_cntrl->wake_set = false;
		mhi_cntrl->ignore_override = false;
	}
	spin_unlock_irqrestore(&mhi_cntrl->wlock, flags);
}
+1 −0
Original line number Diff line number Diff line
@@ -313,6 +313,7 @@ struct mhi_controller {
	enum mhi_dev_state dev_state;
	enum mhi_dev_state saved_dev_state;
	bool wake_set;
	bool ignore_override;
	atomic_t dev_wake;
	atomic_t alloc_size;
	atomic_t pending_pkts;