summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Olbrich <m.olbrich@pengutronix.de>2016-09-02 10:50:37 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2016-09-05 08:53:24 +0200
commitfaf2ec64e7442fda2e2330c0df047bcd902c5927 (patch)
treedfbae594b963acda405764d18829b7da3b192cb0
parenta1109d78ddcb3a070acfdb1c9567a8d3a7cbca6a (diff)
downloadbarebox-faf2ec64e7442fda2e2330c0df047bcd902c5927.tar.gz
barebox-faf2ec64e7442fda2e2330c0df047bcd902c5927.tar.xz
mci: mmci: Fix read FIFO handling
According to the Linux kernel and the qemu code, the MMCIFIFOCNT contains the remaining number of words to read, excluding those that are already in the FIFO. So the current number of bytes in the FIFO is host_remain - (readl(base + MMCIFIFOCNT) << 2). Also writing to MMCIDATACTRL will reset the read counter. As a result, MCI_DATABLOCKEND is never set and read_bytes() waits forever. With this change, SD-Card support on qemu vexpress works correctly. Signed-off-by: Michael Olbrich <m.olbrich@pengutronix.de> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r--drivers/mci/mmci.c3
1 files changed, 1 insertions, 2 deletions
diff --git a/drivers/mci/mmci.c b/drivers/mci/mmci.c
index 9d1e858917..7489ee03a1 100644
--- a/drivers/mci/mmci.c
+++ b/drivers/mci/mmci.c
@@ -212,7 +212,7 @@ static u64 mmci_pio_read(struct mmci_host *host, char *buffer, unsigned int host
struct variant_data *variant = host->variant;
do {
- int count = readl(base + MMCIFIFOCNT) << 2;
+ int count = host_remain - (readl(base + MMCIFIFOCNT) << 2);
if (count > host_remain)
count = host_remain;
@@ -264,7 +264,6 @@ static int read_bytes(struct mci_host *mci, char *dest, unsigned int blkcount, u
dev_dbg(host->hw_dev, "read_bytes: blkcount=%u blksize=%u\n", blkcount, blksize);
do {
- mmci_writel(host, MMCIDATACTRL, mmci_readl(host, MMCIDATACTRL));
len = mmci_pio_read(host, dest, xfercount);
xfercount -= len;
dest += len;