Hi,
On Thu, May 05 2011, Arindam Nath wrote:
> Host Controller needs tuning during initialization to operate SDR50
> and SDR104 UHS-I cards. Whether SDR50 mode actually needs tuning is
> indicated by bit 45 of the Host Controller Capabilities register.
> A new command CMD19 has been defined in the Physical Layer spec
> v3.01 to request the card to send tuning pattern.
>
> We enable Buffer Read Ready interrupt at the very begining of tuning
> procedure, because that is the only interrupt generated by the Host
> Controller during tuning. We program the block size to 64 in the
> Block Size register. We make sure that DMA Enable and Multi Block
> Select in the Transfer Mode register are set to 0 before actually
> sending CMD19. The tuning block is sent by the card to the Host
> Controller using DAT lines, so we set Data Present Select (bit 5) in
> the Command register. The Host Controller is responsible for doing
> the verfication of tuning block sent by the card at the hardware
> level. After sending CMD19, we wait for Buffer Read Ready interrupt.
> In case we don't receive an interrupt after the specified timeout
> value, we fall back on fixed sampling clock by setting Execute
> Tuning (bit 6) and Sampling Clock Select (bit 7) of Host Control2
> register to 0. Before exiting the tuning procedure, we disable Buffer
> Read Ready interrupt and re-enable other interrupts.
>
> Signed-off-by: Arindam Nath <[email protected]>
> Acked-by: Philip Rakity <[email protected]>
> Tested-by: Philip Rakity <[email protected]>
Thanks, pushed to mmc-next for .40 with the trivial changes below:
(There's no need to memset cmd.resp separately, right?)
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
index 91173cd..39cceee 100644
--- a/drivers/mmc/host/sdhci.c
+++ b/drivers/mmc/host/sdhci.c
@@ -1557,24 +1557,19 @@ static int sdhci_execute_tuning(struct mmc_host *mmc)
*/
timeout = 150;
do {
- struct mmc_command cmd;
- struct mmc_request mrq;
+ struct mmc_command cmd = {0};
+ struct mmc_request mrq = {0};
if (!tuning_loop_counter && !timeout)
break;
- memset(&cmd, 0, sizeof(struct mmc_command));
cmd.opcode = MMC_SEND_TUNING_BLOCK;
cmd.arg = 0;
cmd.flags = MMC_RSP_R1 | MMC_CMD_ADTC;
-
- memset(&cmd.resp, 0, sizeof(cmd.resp));
cmd.retries = 0;
-
cmd.data = NULL;
cmd.error = 0;
- memset(&mrq, 0, sizeof(struct mmc_request));
mrq.cmd = &cmd;
host->mrq = &mrq;
@@ -1880,8 +1875,8 @@ static void sdhci_data_irq(struct sdhci_host *host, u32
intmask)
/* CMD19 generates _only_ Buffer Read Ready interrupt */
if (intmask & SDHCI_INT_DATA_AVAIL) {
- if (SDHCI_GET_CMD(sdhci_readw(host, SDHCI_COMMAND))
- == MMC_SEND_TUNING_BLOCK) {
+ if (SDHCI_GET_CMD(sdhci_readw(host, SDHCI_COMMAND)) ==
+ MMC_SEND_TUNING_BLOCK) {
host->tuning_done = 1;
wake_up(&host->buf_ready_int);
return;
- Chris.
--
Chris Ball <[email protected]> <http://printf.net/>
One Laptop Per Child
--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html