media: fimc: fix clock management in suspend/resume path
authorMarek Szyprowski <m.szyprowski@samsung.com>
Thu, 10 Oct 2013 08:05:06 +0000 (10:05 +0200)
committerChanho Park <chanho61.park@samsung.com>
Tue, 18 Nov 2014 02:44:54 +0000 (11:44 +0900)
Standard suspend/resume path is called after runtime resume of the given
device, so suspend/resume callbacks must do all clock management done also
by runtime pm to allow proper power domain shutdown.

Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
drivers/media/platform/exynos4-is/fimc-core.c

index 6823ce0..8108334 100644 (file)
@@ -1088,6 +1088,8 @@ static int fimc_resume(struct device *dev)
        struct fimc_dev *fimc = dev_get_drvdata(dev);
        unsigned long flags;
 
+       clk_enable(fimc->clock[CLK_GATE]);
+
        dbg("fimc%d: state: 0x%lx", fimc->id, fimc->state);
 
        /* Do not resume if the device was idle before system suspend */
@@ -1109,15 +1111,20 @@ static int fimc_resume(struct device *dev)
 static int fimc_suspend(struct device *dev)
 {
        struct fimc_dev *fimc = dev_get_drvdata(dev);
+       int ret = 0;
 
        dbg("fimc%d: state: 0x%lx", fimc->id, fimc->state);
 
        if (test_and_set_bit(ST_LPM, &fimc->state))
-               return 0;
+               ret = 0;
        if (fimc_capture_busy(fimc))
-               return fimc_capture_suspend(fimc);
+               ret = fimc_capture_suspend(fimc);
+
+       ret = fimc_m2m_suspend(fimc);
 
-       return fimc_m2m_suspend(fimc);
+       clk_disable(fimc->clock[CLK_GATE]);
+
+       return ret;
 }
 #endif /* CONFIG_PM_SLEEP */