Commit 20845bef authored by Adrian Hunter's avatar Adrian Hunter Committed by Ulf Hansson

mmc: sdhci: Support cap_cmd_during_tfr requests

Now SDHCI supports commands during transfer, enable support for the core
API.

There are 3 small changes needed:

First, auto-CMD12 cannot be used with a cap_cmd_during_tfr request because
the host controller cannot expect the command line to be available.

Secondly, a cap_cmd_during_tfr request must not send a stop command, again
because the host controller cannot expect the command line to be available.

Thirdly, when a cap_cmd_during_tfr command completes, use
mmc_command_complete() to notify the upper layers that the command line is
now available for further commands.
Signed-off-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
parent 4bbb9aac
...@@ -888,7 +888,8 @@ static void sdhci_prepare_data(struct sdhci_host *host, struct mmc_command *cmd) ...@@ -888,7 +888,8 @@ static void sdhci_prepare_data(struct sdhci_host *host, struct mmc_command *cmd)
static inline bool sdhci_auto_cmd12(struct sdhci_host *host, static inline bool sdhci_auto_cmd12(struct sdhci_host *host,
struct mmc_request *mrq) struct mmc_request *mrq)
{ {
return !mrq->sbc && (host->flags & SDHCI_AUTO_CMD12); return !mrq->sbc && (host->flags & SDHCI_AUTO_CMD12) &&
!mrq->cap_cmd_during_tfr;
} }
static void sdhci_set_transfer_mode(struct sdhci_host *host, static void sdhci_set_transfer_mode(struct sdhci_host *host,
...@@ -1031,9 +1032,18 @@ static void sdhci_finish_data(struct sdhci_host *host) ...@@ -1031,9 +1032,18 @@ static void sdhci_finish_data(struct sdhci_host *host)
sdhci_do_reset(host, SDHCI_RESET_DATA); sdhci_do_reset(host, SDHCI_RESET_DATA);
} }
/* Avoid triggering warning in sdhci_send_command() */ /*
host->cmd = NULL; * 'cap_cmd_during_tfr' request must not use the command line
sdhci_send_command(host, data->stop); * after mmc_command_done() has been called. It is upper layer's
* responsibility to send the stop command if required.
*/
if (data->mrq->cap_cmd_during_tfr) {
sdhci_finish_mrq(host, data->mrq);
} else {
/* Avoid triggering warning in sdhci_send_command() */
host->cmd = NULL;
sdhci_send_command(host, data->stop);
}
} else { } else {
sdhci_finish_mrq(host, data->mrq); sdhci_finish_mrq(host, data->mrq);
} }
...@@ -1165,6 +1175,9 @@ static void sdhci_finish_command(struct sdhci_host *host) ...@@ -1165,6 +1175,9 @@ static void sdhci_finish_command(struct sdhci_host *host)
} }
} }
if (cmd->mrq->cap_cmd_during_tfr && cmd == cmd->mrq->cmd)
mmc_command_done(host->mmc, cmd->mrq);
/* /*
* The host can send and interrupt when the busy state has * The host can send and interrupt when the busy state has
* ended, allowing us to wait without wasting CPU cycles. * ended, allowing us to wait without wasting CPU cycles.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment