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

Commit 7ff27609 authored by Adrian Hunter's avatar Adrian Hunter Committed by Ulf Hansson
Browse files

mmc: core: Add a facility to "pause" re-tuning



Re-tuning is not possible when switched to the RPMB
partition.  However re-tuning should not be needed
if re-tuning is done immediately before switching,
a small set of operations is done, and then we
immediately switch back to the main partition.

To ensure that re-tuning can't be done for a short
while, add a facility to "pause" re-tuning.

The existing facility to hold / release re-tuning
is used but it also flags re-tuning as needed to cause
re-tuning before the next command (which will be the
switch to RPMB).

We also need to "unpause" in the recovery path, which
is catered for by adding it to mmc_retune_disable().

Signed-off-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
parent 16490980
Loading
Loading
Loading
Loading
+24 −0
Original line number Original line Diff line number Diff line
@@ -68,8 +68,32 @@ void mmc_retune_enable(struct mmc_host *host)
			  jiffies + host->retune_period * HZ);
			  jiffies + host->retune_period * HZ);
}
}


/*
 * Pause re-tuning for a small set of operations.  The pause begins after the
 * next command and after first doing re-tuning.
 */
void mmc_retune_pause(struct mmc_host *host)
{
	if (!host->retune_paused) {
		host->retune_paused = 1;
		mmc_retune_needed(host);
		mmc_retune_hold(host);
	}
}
EXPORT_SYMBOL(mmc_retune_pause);

void mmc_retune_unpause(struct mmc_host *host)
{
	if (host->retune_paused) {
		host->retune_paused = 0;
		mmc_retune_release(host);
	}
}
EXPORT_SYMBOL(mmc_retune_unpause);

void mmc_retune_disable(struct mmc_host *host)
void mmc_retune_disable(struct mmc_host *host)
{
{
	mmc_retune_unpause(host);
	host->can_retune = 0;
	host->can_retune = 0;
	del_timer_sync(&host->retune_timer);
	del_timer_sync(&host->retune_timer);
	host->retune_now = 0;
	host->retune_now = 0;
+4 −0
Original line number Original line Diff line number Diff line
@@ -329,6 +329,7 @@ struct mmc_host {
	unsigned int		can_retune:1;	/* re-tuning can be used */
	unsigned int		can_retune:1;	/* re-tuning can be used */
	unsigned int		doing_retune:1;	/* re-tuning in progress */
	unsigned int		doing_retune:1;	/* re-tuning in progress */
	unsigned int		retune_now:1;	/* do re-tuning at next req */
	unsigned int		retune_now:1;	/* do re-tuning at next req */
	unsigned int		retune_paused:1; /* re-tuning is temporarily disabled */


	int			rescan_disable;	/* disable card detection */
	int			rescan_disable;	/* disable card detection */
	int			rescan_entered;	/* used with nonremovable devices */
	int			rescan_entered;	/* used with nonremovable devices */
@@ -526,4 +527,7 @@ static inline void mmc_retune_recheck(struct mmc_host *host)
		host->retune_now = 1;
		host->retune_now = 1;
}
}


void mmc_retune_pause(struct mmc_host *host);
void mmc_retune_unpause(struct mmc_host *host);

#endif /* LINUX_MMC_HOST_H */
#endif /* LINUX_MMC_HOST_H */