Maria Johansen wrote:
-----Original Message-----
From: Tonyliu [mailto:bo....@windriver.com] <snip>
Could this be a problem related the eSDHC controller (or the driver), or is it the memory card? (a 4GB SanDisk Extreme SDHC card, which unfortunately is the only card I have available at the moment.) I will keep digging into drivers/mmc/host/sdhci.c in search of a solution, and any tips to how I should proceed would be greatly appreciated!
Hi,
Try the patch in attatchment. By default, on some e300 platforms such as mpc8308_rdb, the 
entry "clock-frequency" of section sdchi in DTB is not fixed by u-boot, so has to 
>caculate the input clock for sdhci controller explicitly in driver.

Tony

Thanks, the missing clock-frequency was part of my problem. The rest was solved 
by adding some more quirks to the esdhc-driver (SDHCI_QUIRK_FORCE_1_BIT_DATA 
and SDHCI_QUIRK_RESET_AFTER_REQUEST). Why it is necessary to force 1-bit data 
transfers I am a bit unsure about, since the mpc8308 reference manual clearly 
states that 4-bit transfers are supported.
Actually, I did use 4-bit mode. You can try another 2 quicks:

+   if (of_get_property(np, "sdhci,auto-cmd12", NULL))
+       host->quirks |= SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12;
+
+   if (of_get_property(np, "sdhci,broken-timeout", NULL))
+       host->quirks |= SDHCI_QUIRK_BROKEN_TIMEOUT_VAL;
+

===================================================
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
index 9d4fdfa..b7a1ce4 100644
--- a/drivers/mmc/host/sdhci.c
+++ b/drivers/mmc/host/sdhci.c
@@ -807,8 +807,12 @@ static void sdhci_set_transfer_mode(struct sdhci_host *host,
   WARN_ON(!host->data);

   mode = SDHCI_TRNS_BLK_CNT_EN;
-   if (data->blocks > 1)
+   if (data->blocks > 1) {
+       if (host->quirks & SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12)
+           mode |= SDHCI_TRNS_MULTI | SDHCI_TRNS_ACMD12;
+       else
       mode |= SDHCI_TRNS_MULTI;
+   }
   if (data->flags & MMC_DATA_READ)
       mode |= SDHCI_TRNS_READ;
   if (host->flags & SDHCI_REQ_USE_DMA)
@@ -1099,6 +1103,13 @@ static void sdhci_request(struct mmc_host *mmc, struct mmc_request *mrq)
   sdhci_activate_led(host);
#endif

+   if (host->quirks & SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12) {
+       if (mrq->stop) {
+           mrq->data->stop = NULL;
+           mrq->stop = NULL;
+       }
+   }
+
   host->mrq = mrq;


I don't have patch for upstream, you can add them manually.

Tony
Thanks for your help :)

--
Maria





_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Reply via email to