Fix wrong sdhci host control register read and write
authorJuhyun \(Justin\) Oh <Juhyun_Oh@sigmadesigns.com>
Fri, 13 Sep 2013 18:06:00 +0000 (18:06 +0000)
committerPantelis Antoniou <panto@antoniou-consulting.com>
Fri, 20 Sep 2013 16:02:29 +0000 (19:02 +0300)
The patch fixes the improper read and write of sdhci
host control register for sdma transfer.

The problem comes when reading and writing 1 byte long
host control register with the sdhci_readl() and
sdhci_writel(). The misuse of these functions overwrite
the value of the next registers which are in 4 bytes boundary.

This patch replaces four byte register read/write functions
with one byte read/write ones. Beside, it eliminates
unnecessary bit operation. i.e. or-ing zero against a variable.

Signed-off-by: Juhyun (Justin) Oh <Juhyun_Oh@sigmadesigns.com>
drivers/mmc/sdhci.c

index 14fe41f6c4cc91aa2e300a203eb0f62fe8635100..dfb2eeeb4de8321004afeddf8358ea9909ed62b1 100644 (file)
@@ -68,10 +68,9 @@ static int sdhci_transfer_data(struct sdhci_host *host, struct mmc_data *data,
        unsigned int stat, rdy, mask, timeout, block = 0;
 #ifdef CONFIG_MMC_SDMA
        unsigned char ctrl;
-       ctrl = sdhci_readl(host, SDHCI_HOST_CONTROL);
+       ctrl = sdhci_readb(host, SDHCI_HOST_CONTROL);
        ctrl &= ~SDHCI_CTRL_DMA_MASK;
-       ctrl |= SDHCI_CTRL_SDMA;
-       sdhci_writel(host, ctrl, SDHCI_HOST_CONTROL);
+       sdhci_writeb(host, ctrl, SDHCI_HOST_CONTROL);
 #endif
 
        timeout = 1000000;