]> Pileus Git - ~andy/linux/commitdiff
ARM: 7725/1: mmc: mmci: Cache MMCIDATACTRL register
authorUlf Hansson <ulf.hansson@linaro.org>
Wed, 15 May 2013 19:48:23 +0000 (20:48 +0100)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Wed, 22 May 2013 23:09:15 +0000 (00:09 +0100)
Add a cache variable in the host struct that reflects the current data in
the MMCIDATACTRL register. This patch will not introduce any functional
change but instead provide an easy option to keep specific bits in the
register between each data transfer.

Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
drivers/mmc/host/mmci.c
drivers/mmc/host/mmci.h

index cb9e562b3571a560ea8e5b3a9eb2fb29242a055c..ccfe0bc62f78b795cdd2504cd24bb76d73fe3e91 100644 (file)
@@ -188,6 +188,17 @@ static void mmci_write_pwrreg(struct mmci_host *host, u32 pwr)
        }
 }
 
+/*
+ * This must be called with host->lock held
+ */
+static void mmci_write_datactrlreg(struct mmci_host *host, u32 datactrl)
+{
+       if (host->datactrl_reg != datactrl) {
+               host->datactrl_reg = datactrl;
+               writel(datactrl, host->base + MMCIDATACTRL);
+       }
+}
+
 /*
  * This must be called with host->lock held
  */
@@ -281,7 +292,7 @@ static void mmci_set_mask1(struct mmci_host *host, unsigned int mask)
 
 static void mmci_stop_data(struct mmci_host *host)
 {
-       writel(0, host->base + MMCIDATACTRL);
+       mmci_write_datactrlreg(host, 0);
        mmci_set_mask1(host, 0);
        host->data = NULL;
 }
@@ -559,7 +570,7 @@ static int mmci_dma_start_data(struct mmci_host *host, unsigned int datactrl)
        datactrl |= MCI_DPSM_DMAENABLE;
 
        /* Trigger the DMA transfer */
-       writel(datactrl, host->base + MMCIDATACTRL);
+       mmci_write_datactrlreg(host, datactrl);
 
        /*
         * Let the MMCI say when the data is ended and it's time
@@ -757,7 +768,7 @@ static void mmci_start_data(struct mmci_host *host, struct mmc_data *data)
                irqmask = MCI_TXFIFOHALFEMPTYMASK;
        }
 
-       writel(datactrl, base + MMCIDATACTRL);
+       mmci_write_datactrlreg(host, datactrl);
        writel(readl(base + MMCIMASK0) & ~MCI_DATAENDMASK, base + MMCIMASK0);
        mmci_set_mask1(host, irqmask);
 }
index 1383c9ce2646cc8192d34b8c9529039f5a4115fa..0b6cc54be966bf02786394efeffc55b82c886e67 100644 (file)
@@ -183,6 +183,7 @@ struct mmci_host {
        unsigned int            cclk;
        u32                     pwr_reg;
        u32                     clk_reg;
+       u32                     datactrl_reg;
        bool                    vqmmc_enabled;
        struct mmci_platform_data *plat;
        struct variant_data     *variant;