@@ -654,6 +654,17 @@ static u32 ux500v2_get_dctrl_cfg(struct mmci_host *host)
return MCI_DPSM_ENABLE | (host->data->blksz << 16);
}
+static void ux500_busy_clear_mask_done(struct mmci_host *host)
+{
+ void __iomem *base = host->base;
+
+ writel(host->variant->busy_detect_mask, base + MMCICLEAR);
+ writel(readl(base + MMCIMASK0) &
+ ~host->variant->busy_detect_mask, base + MMCIMASK0);
+ host->busy_state = MMCI_BUSY_DONE;
+ host->busy_status = 0;
+}
+
/*
* ux500_busy_complete() - this will wait until the busy status
* goes off, saving any status that occur in the meantime into
@@ -668,11 +679,7 @@ static bool ux500_busy_complete(struct mmci_host *host, u32 status, u32 err_msk)
if (status & err_msk) {
/* Stop any ongoing busy detection if an error occurs */
- writel(host->variant->busy_detect_mask, base + MMCICLEAR);
- writel(readl(base + MMCIMASK0) &
- ~host->variant->busy_detect_mask, base + MMCIMASK0);
- host->busy_state = MMCI_BUSY_DONE;
- host->busy_status = 0;
+ ux500_busy_clear_mask_done(host);
goto out_ret_state;
}
@@ -715,10 +722,7 @@ static bool ux500_busy_complete(struct mmci_host *host, u32 status, u32 err_msk)
retries--;
}
dev_dbg(mmc_dev(host->mmc), "no busy signalling in time\n");
- writel(host->variant->busy_detect_mask, base + MMCICLEAR);
- writel(readl(base + MMCIMASK0) &
- ~host->variant->busy_detect_mask, base + MMCIMASK0);
- host->busy_state = MMCI_BUSY_DONE;
+ ux500_busy_clear_mask_done(host);
break;
/*
@@ -740,11 +744,7 @@ static bool ux500_busy_complete(struct mmci_host *host, u32 status, u32 err_msk)
} else {
dev_dbg(mmc_dev(host->mmc),
"lost busy status when waiting for busy start IRQ\n");
- writel(host->variant->busy_detect_mask, base + MMCICLEAR);
- writel(readl(base + MMCIMASK0) &
- ~host->variant->busy_detect_mask, base + MMCIMASK0);
- host->busy_state = MMCI_BUSY_DONE;
- host->busy_status = 0;
+ ux500_busy_clear_mask_done(host);
}
break;
@@ -756,11 +756,7 @@ static bool ux500_busy_complete(struct mmci_host *host, u32 status, u32 err_msk)
} else {
dev_dbg(mmc_dev(host->mmc),
"lost busy status when waiting for busy end IRQ\n");
- writel(host->variant->busy_detect_mask, base + MMCICLEAR);
- writel(readl(base + MMCIMASK0) &
- ~host->variant->busy_detect_mask, base + MMCIMASK0);
- host->busy_state = MMCI_BUSY_DONE;
- host->busy_status = 0;
+ ux500_busy_clear_mask_done(host);
}
break;
@@ -775,13 +771,7 @@ static bool ux500_busy_complete(struct mmci_host *host, u32 status, u32 err_msk)
/* We should just get two IRQs for busy detect */
dev_err(mmc_dev(host->mmc), "spurious busy detect IRQ\n");
}
-
- writel(host->variant->busy_detect_mask, base + MMCICLEAR);
- writel(readl(base + MMCIMASK0) &
- ~host->variant->busy_detect_mask, base + MMCIMASK0);
-
- host->busy_state = MMCI_BUSY_DONE;
- host->busy_status = 0;
+ ux500_busy_clear_mask_done(host);
break;
case MMCI_BUSY_DONE:
These four lines clearing, masking and resetting the state of the busy detect state machine is repeated five times in the code so break this out to a small helper so things are easier to read. Signed-off-by: Linus Walleij <linus.walleij@linaro.org> --- ChangeLog v1->v2: - No changes --- drivers/mmc/host/mmci.c | 42 ++++++++++++++++-------------------------- 1 file changed, 16 insertions(+), 26 deletions(-)