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

Commit fd2208d7 authored by Pierre Ossman's avatar Pierre Ossman Committed by Russell King
Browse files

[MMC] sdhci: check only relevant inhibit bits



Conform to the sdhci specification as to which inhibit bits should be checked
at different times.

Signed-off-by: default avatarPierre Ossman <drzeus@drzeus.cx>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent 1d676e02
Loading
Loading
Loading
Loading
+13 −3
Original line number Diff line number Diff line
@@ -465,6 +465,7 @@ static void sdhci_finish_data(struct sdhci_host *host)
static void sdhci_send_command(struct sdhci_host *host, struct mmc_command *cmd)
{
	int flags;
	u32 mask;
	unsigned long timeout;

	WARN_ON(host->cmd);
@@ -473,11 +474,20 @@ static void sdhci_send_command(struct sdhci_host *host, struct mmc_command *cmd)

	/* Wait max 10 ms */
	timeout = 10;
	while (readl(host->ioaddr + SDHCI_PRESENT_STATE) &
		(SDHCI_CMD_INHIBIT | SDHCI_DATA_INHIBIT)) {

	mask = SDHCI_CMD_INHIBIT;
	if ((cmd->data != NULL) || (cmd->flags & MMC_RSP_BUSY))
		mask |= SDHCI_DATA_INHIBIT;

	/* We shouldn't wait for data inihibit for stop commands, even
	   though they might use busy signaling */
	if (host->mrq->data && (cmd == host->mrq->data->stop))
		mask &= ~SDHCI_DATA_INHIBIT;

	while (readl(host->ioaddr + SDHCI_PRESENT_STATE) & mask) {
		if (timeout == 0) {
			printk(KERN_ERR "%s: Controller never released "
				"inhibit bits. Please report this to "
				"inhibit bit(s). Please report this to "
				BUGMAIL ".\n", mmc_hostname(host->mmc));
			sdhci_dumpregs(host);
			cmd->error = MMC_ERR_FAILED;