
On 03/30/2012 02:24 PM, Lei Wen wrote:
Hi Jaehoon,
On Fri, Mar 30, 2012 at 12:36 PM, Jaehoon Chung jh80.chung@samsung.com wrote:
Hi Lei.
First, thanks for implemented the generic sdhci controller.
It is my pleasure to share this common code, and I'm glad that it is used for other platforms now. :)
On 03/30/2012 12:33 PM, Lei Wen wrote:
Hi Jaehoon,
On Fri, Mar 30, 2012 at 10:39 AM, Jaehoon Chung jh80.chung@samsung.com wrote:
When response type is R1b, mask value is added the SDHCI_INT_DAT_END. but in while(), didn't check that flag. So sdhci controller didn't work fine. CMD6 didn't always complete.
Could you elaborate it more in details? do { stat = sdhci_readl(host, SDHCI_INT_STATUS); if (stat & SDHCI_INT_ERROR) break; } while ((stat & mask) != mask); Here in the while condition, if the status read out don't contain all mask, then the looping would continue. Do you mean you just need a retry max time set here?
I found that didn't initialize the eMMC card. Because when send CMD6, running infinite loop in there. CMD6's mask is set to SDHCI_INT_RESPONSE and SDHCI_INT_DATA_END. (Because response type is R1B). Then mask value maybe is 0x3... stat = sdhci_readl(host, SDHCI_INT_STATUS); stat is 0x1.(cmd is done response). but in while(), stat & mask is 0x1, and mask is 0x3. ...doing while(). If just add the timeout, then always produced the timeout error.
I see your problems. Your silicon only provide SDHCI_INT_RESPONSE for r1b, while the standard sdhci spec require both the flag is set when the r1b command is finished. So my point is you could add a quirk condition check in the previously endless loop checking. If the quirk is true, and timeout count is met, then you could jump out of original looping. And for later checking, this timeout could be regarded as no error, since the controller would never return the SDHCI_INT_DATA_END in your case.
Anyway it's need that use the timeout value. right? And in our case, It's means that use the quirks? I didn't find that the sdhci spec require the flag is set when the r1b command is finished. where is specified? I just understand that the transfer complete bit should be set to 1, when send the command with busy flag or read/write with data. Is this means?
If you want to use the quirks, i will test with applied your opinion.
Best Regards, Jaehoon Chung
How did you test? Is initialize the eMMC card? (I tested with eMMC4.41 (exynos4).)
I test on many Marvell platforms, with sd, mmc, emmc, they all works fine.