|
@@ -118,6 +118,28 @@ static struct variant_data variant_ux500v2 = {
|
|
|
.signal_direction = true,
|
|
|
};
|
|
|
|
|
|
+/*
|
|
|
+ * This must be called with host->lock held
|
|
|
+ */
|
|
|
+static void mmci_write_clkreg(struct mmci_host *host, u32 clk)
|
|
|
+{
|
|
|
+ if (host->clk_reg != clk) {
|
|
|
+ host->clk_reg = clk;
|
|
|
+ writel(clk, host->base + MMCICLOCK);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+ * This must be called with host->lock held
|
|
|
+ */
|
|
|
+static void mmci_write_pwrreg(struct mmci_host *host, u32 pwr)
|
|
|
+{
|
|
|
+ if (host->pwr_reg != pwr) {
|
|
|
+ host->pwr_reg = pwr;
|
|
|
+ writel(pwr, host->base + MMCIPOWER);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* This must be called with host->lock held
|
|
|
*/
|
|
@@ -165,7 +187,7 @@ static void mmci_set_clkreg(struct mmci_host *host, unsigned int desired)
|
|
|
if (host->mmc->ios.bus_width == MMC_BUS_WIDTH_8)
|
|
|
clk |= MCI_ST_8BIT_BUS;
|
|
|
|
|
|
- writel(clk, host->base + MMCICLOCK);
|
|
|
+ mmci_write_clkreg(host, clk);
|
|
|
}
|
|
|
|
|
|
static void
|
|
@@ -846,14 +868,13 @@ static int mmci_pio_write(struct mmci_host *host, char *buffer, unsigned int rem
|
|
|
*/
|
|
|
if (variant->sdio &&
|
|
|
mmc_card_sdio(host->mmc->card)) {
|
|
|
+ u32 clk;
|
|
|
if (count < 8)
|
|
|
- writel(readl(host->base + MMCICLOCK) &
|
|
|
- ~variant->clkreg_enable,
|
|
|
- host->base + MMCICLOCK);
|
|
|
+ clk = host->clk_reg & ~variant->clkreg_enable;
|
|
|
else
|
|
|
- writel(readl(host->base + MMCICLOCK) |
|
|
|
- variant->clkreg_enable,
|
|
|
- host->base + MMCICLOCK);
|
|
|
+ clk = host->clk_reg | variant->clkreg_enable;
|
|
|
+
|
|
|
+ mmci_write_clkreg(host, clk);
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -1114,11 +1135,7 @@ static void mmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
|
|
|
spin_lock_irqsave(&host->lock, flags);
|
|
|
|
|
|
mmci_set_clkreg(host, ios->clock);
|
|
|
-
|
|
|
- if (host->pwr != pwr) {
|
|
|
- host->pwr = pwr;
|
|
|
- writel(pwr, host->base + MMCIPOWER);
|
|
|
- }
|
|
|
+ mmci_write_pwrreg(host, pwr);
|
|
|
|
|
|
spin_unlock_irqrestore(&host->lock, flags);
|
|
|
|