exynos/mfc: add sysmmu power on/off calls
authorPrathyush K <prathyush.k@samsung.com>
Tue, 31 Jul 2012 07:50:52 +0000 (13:20 +0530)
committerGerrit <chrome-bot@google.com>
Fri, 17 Aug 2012 08:48:29 +0000 (01:48 -0700)
This patch calls the sysmmu driver helper functions for resuming
and suspending its two sysmmus during mfc power on/off. This is required
for the sysmmus to resume/suspend along with the parent mfc device.

BUG=chrome-os-partner:11793
Test=MFC/GSC/Sysmmu get suspended after probe and resume upon
video playback. Tested on Daisy.

Change-Id: I2dacc0a2bcd11e53ba8811db75ed05acb2c344c8
Signed-off-by: Prathyush K <prathyush.k@samsung.com>
Reviewed-on: https://gerrit.chromium.org/gerrit/29165
Tested-by: Prathyush Kalashwaram <prathyush@chromium.org>
Reviewed-by: Olof Johansson <olofj@chromium.org>
Commit-Ready: Olof Johansson <olofj@chromium.org>

drivers/media/video/s5p-mfc/s5p_mfc_pm.c

index b30830f..a0659d1 100644 (file)
@@ -16,6 +16,7 @@
 #ifdef CONFIG_PM_RUNTIME
 #include <linux/pm_runtime.h>
 #endif
+#include <mach/sysmmu.h>
 #include "s5p_mfc_common.h"
 #include "s5p_mfc_debug.h"
 #include "s5p_mfc_pm.h"
@@ -116,7 +117,27 @@ void s5p_mfc_clock_off(void)
 int s5p_mfc_power_on(void)
 {
 #ifdef CONFIG_PM_RUNTIME
-       return pm_runtime_get_sync(pm->device);
+       int ret;
+       ret = pm_runtime_get_sync(pm->device);
+       if (ret < 0)
+               goto out;
+
+       ret = platform_sysmmu_on(p_dev->mem_dev_l);
+       if (ret < 0)
+               goto out_err;
+
+       ret = platform_sysmmu_on(p_dev->mem_dev_r);
+       if (ret < 0)
+               goto out_err2;
+
+       return ret;
+
+out_err2:
+       platform_sysmmu_off(p_dev->mem_dev_l);
+out_err:
+       pm_runtime_put_sync(pm->device);
+out:
+       return ret;
 #else
        atomic_set(&pm->power, 1);
        return 0;
@@ -126,7 +147,10 @@ int s5p_mfc_power_on(void)
 int s5p_mfc_power_off(void)
 {
 #ifdef CONFIG_PM_RUNTIME
-       return pm_runtime_put_sync(pm->device);
+       pm_runtime_put_sync(pm->device);
+       platform_sysmmu_off(p_dev->mem_dev_l);
+       platform_sysmmu_off(p_dev->mem_dev_r);
+       return 0;
 #else
        atomic_set(&pm->power, 0);
        return 0;