diff options
Diffstat (limited to 'drivers/mmc/host/sdhci.c')
| -rw-r--r-- | drivers/mmc/host/sdhci.c | 42 | 
1 files changed, 27 insertions, 15 deletions
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index 7922adb4238..c7851c0aabc 100644 --- a/drivers/mmc/host/sdhci.c +++ b/drivers/mmc/host/sdhci.c @@ -1315,16 +1315,19 @@ static void sdhci_request(struct mmc_host *mmc, struct mmc_request *mrq)  		 */  		if ((host->flags & SDHCI_NEEDS_RETUNING) &&  		    !(present_state & (SDHCI_DOING_WRITE | SDHCI_DOING_READ))) { -			/* eMMC uses cmd21 while sd and sdio use cmd19 */ -			tuning_opcode = mmc->card->type == MMC_TYPE_MMC ? -				MMC_SEND_TUNING_BLOCK_HS200 : -				MMC_SEND_TUNING_BLOCK; -			spin_unlock_irqrestore(&host->lock, flags); -			sdhci_execute_tuning(mmc, tuning_opcode); -			spin_lock_irqsave(&host->lock, flags); +			if (mmc->card) { +				/* eMMC uses cmd21 but sd and sdio use cmd19 */ +				tuning_opcode = +					mmc->card->type == MMC_TYPE_MMC ? +					MMC_SEND_TUNING_BLOCK_HS200 : +					MMC_SEND_TUNING_BLOCK; +				spin_unlock_irqrestore(&host->lock, flags); +				sdhci_execute_tuning(mmc, tuning_opcode); +				spin_lock_irqsave(&host->lock, flags); -			/* Restore original mmc_request structure */ -			host->mrq = mrq; +				/* Restore original mmc_request structure */ +				host->mrq = mrq; +			}  		}  		if (mrq->sbc && !(host->flags & SDHCI_AUTO_CMD23)) @@ -2837,6 +2840,9 @@ int sdhci_add_host(struct sdhci_host *host)  	if (!(host->quirks & SDHCI_QUIRK_FORCE_1_BIT_DATA))  		mmc->caps |= MMC_CAP_4_BIT_DATA; +	if (host->quirks2 & SDHCI_QUIRK2_HOST_NO_CMD23) +		mmc->caps &= ~MMC_CAP_CMD23; +  	if (caps[0] & SDHCI_CAN_DO_HISPD)  		mmc->caps |= MMC_CAP_SD_HIGHSPEED | MMC_CAP_MMC_HIGHSPEED; @@ -2846,9 +2852,12 @@ int sdhci_add_host(struct sdhci_host *host)  	/* If vqmmc regulator and no 1.8V signalling, then there's no UHS */  	host->vqmmc = regulator_get(mmc_dev(mmc), "vqmmc"); -	if (IS_ERR(host->vqmmc)) { -		pr_info("%s: no vqmmc regulator found\n", mmc_hostname(mmc)); -		host->vqmmc = NULL; +	if (IS_ERR_OR_NULL(host->vqmmc)) { +		if (PTR_ERR(host->vqmmc) < 0) { +			pr_info("%s: no vqmmc regulator found\n", +				mmc_hostname(mmc)); +			host->vqmmc = NULL; +		}  	}  	else if (regulator_is_supported_voltage(host->vqmmc, 1800000, 1800000))  		regulator_enable(host->vqmmc); @@ -2904,9 +2913,12 @@ int sdhci_add_host(struct sdhci_host *host)  	ocr_avail = 0;  	host->vmmc = regulator_get(mmc_dev(mmc), "vmmc"); -	if (IS_ERR(host->vmmc)) { -		pr_info("%s: no vmmc regulator found\n", mmc_hostname(mmc)); -		host->vmmc = NULL; +	if (IS_ERR_OR_NULL(host->vmmc)) { +		if (PTR_ERR(host->vmmc) < 0) { +			pr_info("%s: no vmmc regulator found\n", +				mmc_hostname(mmc)); +			host->vmmc = NULL; +		}  	} else  		regulator_enable(host->vmmc);  |