Messages in this thread Patch in this message | | | From | Chaithrika U S <> | Subject | [PATCH 2/2] davinci: MMC: updates to suspend/resume implementation | Date | Thu, 17 Dec 2009 17:45:01 +0530 |
| |
Improve the suspend and resume callbacks in DaVinci MMC host controller driver.
Tested on DA850/OMAP-L138 EVM. This testing requires patches which add suspend-to-RAM support to DA850/OMAP-L138 SoC[1].
[1]http://linux.davincidsp.com/pipermail/davinci-linux-open-source/ 2009-September/016118.html
Signed-off-by: Chaithrika U S <chaithrika@ti.com> --- Applies to Linus' kernel tree.
drivers/mmc/host/davinci_mmc.c | 31 +++++++++++++++++++++++++++++-- 1 files changed, 29 insertions(+), 2 deletions(-)
diff --git a/drivers/mmc/host/davinci_mmc.c b/drivers/mmc/host/davinci_mmc.c index 25645bf..7d05cc1 100644 --- a/drivers/mmc/host/davinci_mmc.c +++ b/drivers/mmc/host/davinci_mmc.c @@ -170,6 +170,7 @@ struct mmc_davinci_host { #define DAVINCI_MMC_DATADIR_READ 1 #define DAVINCI_MMC_DATADIR_WRITE 2 unsigned char data_dir; + unsigned char suspended; /* buffer is used during PIO of one scatterlist segment, and * is updated along with buffer_bytes_left. bytes_left applies @@ -1300,15 +1301,41 @@ static int __exit davinci_mmcsd_remove(struct platform_device *pdev) static int davinci_mmcsd_suspend(struct platform_device *pdev, pm_message_t msg) { struct mmc_davinci_host *host = platform_get_drvdata(pdev); + int ret; - return mmc_suspend_host(host->mmc, msg); + mmc_host_enable(host->mmc); + ret = mmc_suspend_host(host->mmc, msg); + if (!ret) { + writel(0, host->base + DAVINCI_MMCIM); + mmc_davinci_reset_ctrl(host, 1); + mmc_host_disable(host->mmc); + clk_disable(host->clk); + host->suspended = 1; + } else { + host->suspended = 0; + mmc_host_disable(host->mmc); + } + + return ret; } static int davinci_mmcsd_resume(struct platform_device *pdev) { struct mmc_davinci_host *host = platform_get_drvdata(pdev); + int ret; - return mmc_resume_host(host->mmc); + if (!host->suspended) + return 0; + + clk_enable(host->clk); + mmc_host_enable(host->mmc); + + mmc_davinci_reset_ctrl(host, 0); + ret = mmc_resume_host(host->mmc); + if (!ret) + host->suspended = 0; + + return ret; } #else #define davinci_mmcsd_suspend NULL -- 1.5.6
| |