This patch is set the send_auto_stop bit in CMD register. If use DW_MCI_QUIRK_SEND_AUTO_STOP, helps to send an exact number of data bytes. Signed-off-by: Jaehoon Chung <jh80.chung@xxxxxxxxxxx> Signed-off-by: Kyungmin Park <kyungmin.park@xxxxxxxxxxx> --- drivers/mmc/host/dw_mmc.c | 10 ++++++++++ include/linux/mmc/dw_mmc.h | 2 ++ 2 files changed, 12 insertions(+), 0 deletions(-) diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c index 87e1f57..6c4cb46 100644 --- a/drivers/mmc/host/dw_mmc.c +++ b/drivers/mmc/host/dw_mmc.c @@ -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); } diff --git a/include/linux/mmc/dw_mmc.h b/include/linux/mmc/dw_mmc.h index c0207a7..b98aafa 100644 --- a/include/linux/mmc/dw_mmc.h +++ b/include/linux/mmc/dw_mmc.h @@ -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; -- To unsubscribe from this list: send the line "unsubscribe linux-mmc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html