diff options
Diffstat (limited to 'drivers/mmc')
| -rw-r--r-- | drivers/mmc/core/mmc_ops.c | 25 | ||||
| -rw-r--r-- | drivers/mmc/host/meson-gx-mmc.c | 8 | ||||
| -rw-r--r-- | drivers/mmc/host/mxs-mmc.c | 6 | ||||
| -rw-r--r-- | drivers/mmc/host/sdhci-acpi.c | 3 | 
4 files changed, 23 insertions, 19 deletions
| diff --git a/drivers/mmc/core/mmc_ops.c b/drivers/mmc/core/mmc_ops.c index b11c3455b040..e6ea8503f40c 100644 --- a/drivers/mmc/core/mmc_ops.c +++ b/drivers/mmc/core/mmc_ops.c @@ -506,9 +506,6 @@ static int mmc_poll_for_busy(struct mmc_card *card, unsigned int timeout_ms,  		}  	} while (busy); -	if (host->ops->card_busy && send_status) -		return mmc_switch_status(card); -  	return 0;  } @@ -577,24 +574,26 @@ int __mmc_switch(struct mmc_card *card, u8 set, u8 index, u8 value,  	if (!use_busy_signal)  		goto out; -	/* Switch to new timing before poll and check switch status. */ -	if (timing) -		mmc_set_timing(host, timing); -  	/*If SPI or used HW busy detection above, then we don't need to poll. */  	if (((host->caps & MMC_CAP_WAIT_WHILE_BUSY) && use_r1b_resp) || -		mmc_host_is_spi(host)) { -		if (send_status) -			err = mmc_switch_status(card); +		mmc_host_is_spi(host))  		goto out_tim; -	}  	/* Let's try to poll to find out when the command is completed. */  	err = mmc_poll_for_busy(card, timeout_ms, send_status, retry_crc_err); +	if (err) +		goto out;  out_tim: -	if (err && timing) -		mmc_set_timing(host, old_timing); +	/* Switch to new timing before check switch status. */ +	if (timing) +		mmc_set_timing(host, timing); + +	if (send_status) { +		err = mmc_switch_status(card); +		if (err && timing) +			mmc_set_timing(host, old_timing); +	}  out:  	mmc_retune_release(host); diff --git a/drivers/mmc/host/meson-gx-mmc.c b/drivers/mmc/host/meson-gx-mmc.c index b352760c041e..09739352834c 100644 --- a/drivers/mmc/host/meson-gx-mmc.c +++ b/drivers/mmc/host/meson-gx-mmc.c @@ -578,13 +578,15 @@ static irqreturn_t meson_mmc_irq(int irq, void *dev_id)  {  	struct meson_host *host = dev_id;  	struct mmc_request *mrq; -	struct mmc_command *cmd = host->cmd; +	struct mmc_command *cmd;  	u32 irq_en, status, raw_status;  	irqreturn_t ret = IRQ_HANDLED;  	if (WARN_ON(!host))  		return IRQ_NONE; +	cmd = host->cmd; +  	mrq = host->mrq;  	if (WARN_ON(!mrq)) @@ -670,10 +672,10 @@ static irqreturn_t meson_mmc_irq_thread(int irq, void *dev_id)  	int ret = IRQ_HANDLED;  	if (WARN_ON(!mrq)) -		ret = IRQ_NONE; +		return IRQ_NONE;  	if (WARN_ON(!cmd)) -		ret = IRQ_NONE; +		return IRQ_NONE;  	data = cmd->data;  	if (data) { diff --git a/drivers/mmc/host/mxs-mmc.c b/drivers/mmc/host/mxs-mmc.c index 44ecebd1ea8c..c8b8ac66ff7e 100644 --- a/drivers/mmc/host/mxs-mmc.c +++ b/drivers/mmc/host/mxs-mmc.c @@ -309,6 +309,9 @@ static void mxs_mmc_ac(struct mxs_mmc_host *host)  	cmd0 = BF_SSP(cmd->opcode, CMD0_CMD);  	cmd1 = cmd->arg; +	if (cmd->opcode == MMC_STOP_TRANSMISSION) +		cmd0 |= BM_SSP_CMD0_APPEND_8CYC; +  	if (host->sdio_irq_en) {  		ctrl0 |= BM_SSP_CTRL0_SDIO_IRQ_CHECK;  		cmd0 |= BM_SSP_CMD0_CONT_CLKING_EN | BM_SSP_CMD0_SLOW_CLKING_EN; @@ -417,8 +420,7 @@ static void mxs_mmc_adtc(struct mxs_mmc_host *host)  		       ssp->base + HW_SSP_BLOCK_SIZE);  	} -	if ((cmd->opcode == MMC_STOP_TRANSMISSION) || -	    (cmd->opcode == SD_IO_RW_EXTENDED)) +	if (cmd->opcode == SD_IO_RW_EXTENDED)  		cmd0 |= BM_SSP_CMD0_APPEND_8CYC;  	cmd1 = cmd->arg; diff --git a/drivers/mmc/host/sdhci-acpi.c b/drivers/mmc/host/sdhci-acpi.c index 160f695cc09c..278a5a435ab7 100644 --- a/drivers/mmc/host/sdhci-acpi.c +++ b/drivers/mmc/host/sdhci-acpi.c @@ -395,7 +395,8 @@ static int sdhci_acpi_probe(struct platform_device *pdev)  	/* Power on the SDHCI controller and its children */  	acpi_device_fix_up_power(device);  	list_for_each_entry(child, &device->children, node) -		acpi_device_fix_up_power(child); +		if (child->status.present && child->status.enabled) +			acpi_device_fix_up_power(child);  	if (acpi_bus_get_status(device) || !device->status.present)  		return -ENODEV; | 
