[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: Pierre Ossman <drzeus@drzeus.cx> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:
		
							parent
							
								
									1d676e0297
								
							
						
					
					
						commit
						fd2208d7c7
					
				| @ -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; | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user