@@ -229,6 +229,8 @@ static void dw_mci_set_timeout(struct dw_mci *host)
static u32 dw_mci_prepare_command(struct mmc_host *mmc, struct mmc_command *cmd)
{
+ struct dw_mci_slot *slot = mmc_priv(mmc);
+ struct dw_mci *host = slot->host;
struct mmc_data *data;
u32 cmdr;
cmd->error = -EINPROGRESS;
@@ -257,6 +259,9 @@ static u32 dw_mci_prepare_command(struct mmc_host *mmc, struct mmc_command *cmd)
cmdr |= SDMMC_CMD_STRM_MODE;
if (data->flags & MMC_DATA_WRITE)
cmdr |= SDMMC_CMD_DAT_WR;
+ if ((host->quirks & DW_MCI_QUIRK_SEND_AUTO_STOP) &&
+ (data->blocks > 1))
+ cmdr |= SDMMC_CMD_SEND_STOP;
}
return cmdr;
@@ -656,6 +661,11 @@ static void dw_mci_request(struct mmc_host *mmc, struct mmc_request *mrq)
return;
}
+ if ((host->quirks & DW_MCI_QUIRK_SEND_AUTO_STOP) && mrq->stop) {
+ mrq->data->stop = NULL;
+ mrq->stop = NULL;
+ }
+
/* We don't support multiple blocks of weird lengths. */
dw_mci_queue_request(host, slot, mrq);
}
@@ -176,6 +176,8 @@ struct dw_mci_dma_ops {
#define DW_MCI_QUIRK_HIGHSPEED BIT(2)
/* Unreliable card detection */
#define DW_MCI_QUIRK_BROKEN_CARD_DETECTION BIT(3)
+/* Use Auto_Send_Stop Command */
+#define DW_MCI_QUIRK_SEND_AUTO_STOP BIT(4)
struct dma_pdata;