mmc: host: rk_sdmmc:

Fix clk enable/disable mismatch issue and disable clk when controller
doesn't been used ever for better power consumption.
This commit is contained in:
lintao
2014-05-26 17:05:06 +08:00
parent 50fa88d460
commit 67f4bf0667

View File

@@ -1203,7 +1203,7 @@ static void dw_mci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
EXIT_POWER: EXIT_POWER:
switch (ios->power_mode) { switch (ios->power_mode) {
case MMC_POWER_UP: case MMC_POWER_UP:
set_bit(DW_MMC_CARD_NEED_INIT, &slot->flags); set_bit(DW_MMC_CARD_NEED_INIT, &slot->flags);
/* Power up slot */ /* Power up slot */
if (slot->host->pdata->setpower) if (slot->host->pdata->setpower)
slot->host->pdata->setpower(slot->id, mmc->ocr_avail); slot->host->pdata->setpower(slot->id, mmc->ocr_avail);
@@ -1218,6 +1218,11 @@ EXIT_POWER:
regs = mci_readl(slot->host, PWREN); regs = mci_readl(slot->host, PWREN);
regs &= ~(1 << slot->id); regs &= ~(1 << slot->id);
mci_writel(slot->host, PWREN, regs); mci_writel(slot->host, PWREN, regs);
/* SD card should wake clk system for CD int */
if(!(mmc->restrict_caps & RESTRICT_CARD_TYPE_SD)){
clk_disable_unprepare(slot->host->clk_mmc);
clk_disable_unprepare(slot->host->hclk_mmc);
}
break; break;
default: default:
break; break;
@@ -1256,11 +1261,13 @@ static int dw_mci_set_sdio_status(struct mmc_host *mmc, int val)
return 0; return 0;
spin_lock_bh(&host->lock); spin_lock_bh(&host->lock);
if(val) if(val){
set_bit(DW_MMC_CARD_PRESENT, &slot->flags); set_bit(DW_MMC_CARD_PRESENT, &slot->flags);
else clk_prepare_enable(host->hclk_mmc);
clk_prepare_enable(host->clk_mmc);
}else{
clear_bit(DW_MMC_CARD_PRESENT, &slot->flags); clear_bit(DW_MMC_CARD_PRESENT, &slot->flags);
}
spin_unlock_bh(&host->lock); spin_unlock_bh(&host->lock);
mmc_detect_change(slot->mmc, 20); mmc_detect_change(slot->mmc, 20);
@@ -3201,6 +3208,7 @@ int dw_mci_probe(struct dw_mci *host)
ret = PTR_ERR(host->hclk_mmc); ret = PTR_ERR(host->hclk_mmc);
goto err_hclk_mmc; goto err_hclk_mmc;
} }
clk_prepare_enable(host->hclk_mmc); clk_prepare_enable(host->hclk_mmc);
//mmc clk enable //mmc clk enable