summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorTomasz Figa <t.figa@samsung.com>2013-06-26 15:42:14 +0200
committerChanho Park <chanho61.park@samsung.com>2014-11-18 11:43:17 +0900
commit35b3163adbae75a7d026e0f071fd6c287f077da5 (patch)
tree1a871c69ca35808ff6537ddd6951bcb405333bb4 /drivers
parent5c5d6a2414c1bae6ec6ab62f5e2f9b699cd0a935 (diff)
downloadlinux-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.c22
-rw-r--r--drivers/media/platform/exynos4-is/fimc-is.h3
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,