diff options
author | Tomasz Figa <t.figa@samsung.com> | 2013-06-26 15:42:14 +0200 |
---|---|---|
committer | Chanho Park <chanho61.park@samsung.com> | 2014-11-18 11:43:17 +0900 |
commit | 35b3163adbae75a7d026e0f071fd6c287f077da5 (patch) | |
tree | 1a871c69ca35808ff6537ddd6951bcb405333bb4 /drivers | |
parent | 5c5d6a2414c1bae6ec6ab62f5e2f9b699cd0a935 (diff) | |
download | linux-3.10-35b3163adbae75a7d026e0f071fd6c287f077da5.tar.gz linux-3.10-35b3163adbae75a7d026e0f071fd6c287f077da5.tar.bz2 linux-3.10-35b3163adbae75a7d026e0f071fd6c287f077da5.zip |
exynos4-is: Ungate uart clocks on system suspend
Due to hardware requirements, several ISP clocks must be enabled when
suspending the system. This patch adds ungating to suspend and
gating to resume callbacks to keep such clocks ungated.
Signed-off-by: Tomasz Figa <t.figa@samsung.com>
Signed-off-by: Sylwester Nawrocki <s.nawrocki@samsung.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/media/platform/exynos4-is/fimc-is.c | 22 | ||||
-rw-r--r-- | drivers/media/platform/exynos4-is/fimc-is.h | 3 |
2 files changed, 24 insertions, 1 deletions
diff --git a/drivers/media/platform/exynos4-is/fimc-is.c b/drivers/media/platform/exynos4-is/fimc-is.c index 37dac120b18..0b641b51c93 100644 --- a/drivers/media/platform/exynos4-is/fimc-is.c +++ b/drivers/media/platform/exynos4-is/fimc-is.c @@ -905,17 +905,39 @@ static int fimc_is_runtime_suspend(struct device *dev) static int fimc_is_resume(struct device *dev) { /* TODO: */ + struct fimc_is *is = dev_get_drvdata(dev); + int i; + + for (i = ISS_GATE_CLKS_SUSPEND; i < ISS_GATE_CLKS_MAX; i++) + if (!IS_ERR(is->clocks[i])) + clk_disable_unprepare(is->clocks[i]); + return 0; } static int fimc_is_suspend(struct device *dev) { struct fimc_is *is = dev_get_drvdata(dev); + int i, ret; /* TODO: */ if (test_bit(IS_ST_A5_PWR_ON, &is->state)) return -EBUSY; + for (i = ISS_GATE_CLKS_SUSPEND; i < ISS_GATE_CLKS_MAX; i++) { + if (IS_ERR(is->clocks[i])) + continue; + + ret = clk_prepare_enable(is->clocks[i]); + if (ret < 0) { + dev_err(&is->pdev->dev, "clock %s enable failed\n", + fimc_is_clocks[i]); + for (--i; i >= ISS_GATE_CLKS_SUSPEND; i--) + clk_disable_unprepare(is->clocks[i]); + return ret; + } + } + return 0; } #endif /* CONFIG_PM_SLEEP */ diff --git a/drivers/media/platform/exynos4-is/fimc-is.h b/drivers/media/platform/exynos4-is/fimc-is.h index 1a97e09429c..fc6d1130818 100644 --- a/drivers/media/platform/exynos4-is/fimc-is.h +++ b/drivers/media/platform/exynos4-is/fimc-is.h @@ -77,7 +77,8 @@ enum { ISS_CLK_DRC, ISS_CLK_FD, ISS_CLK_MCUISP, - ISS_CLK_UART, + ISS_GATE_CLKS_SUSPEND, + ISS_CLK_UART = ISS_GATE_CLKS_SUSPEND, ISS_GATE_CLKS_MAX, ISS_CLK_ISP_DIV0 = ISS_GATE_CLKS_MAX, ISS_CLK_ISP_DIV1, |