diff --git a/board/qca/arm/ipq6018/ipq6018.c b/board/qca/arm/ipq6018/ipq6018.c index a04dcdd82a..795319e8c6 100644 --- a/board/qca/arm/ipq6018/ipq6018.c +++ b/board/qca/arm/ipq6018/ipq6018.c @@ -246,6 +246,14 @@ void mmc_iopad_config(struct sdhci_host *host) writel(val, host->ioaddr + SDHCI_VENDOR_IOPAD); } +void sdhci_bus_pwr_off(struct sdhci_host *host) +{ + u32 val; + + val = sdhci_readb(host, SDHCI_HOST_CONTROL); + sdhci_writeb(host,(val & (~SDHCI_POWER_ON)), SDHCI_POWER_CONTROL); +} + void emmc_clock_disable(void) { /* Clear divider */ diff --git a/drivers/mmc/sdhci.c b/drivers/mmc/sdhci.c index d51c36f146..b1fcd926fa 100644 --- a/drivers/mmc/sdhci.c +++ b/drivers/mmc/sdhci.c @@ -21,10 +21,18 @@ void *aligned_buffer; #define CACHE_LINE_SIZE (CONFIG_SYS_CACHELINE_SIZE) +__weak void sdhci_bus_pwr_off(struct sdhci_host *host) +{ + return; +} + static void sdhci_reset(struct sdhci_host *host, u8 mask) { unsigned long timeout; + if (mask & SDHCI_RESET_ALL) { + sdhci_bus_pwr_off(host); + } /* Wait max 100 ms */ timeout = 100; sdhci_writeb(host, mask, SDHCI_SOFTWARE_RESET);