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 <arindam.nath@xxxxxxx> > Acked-by: Philip Rakity <prakity@xxxxxxxxxxx> > Tested-by: Philip Rakity <prakity@xxxxxxxxxxx> 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 <cjb@xxxxxxxxxx> <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 majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html