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

Reply via email to