aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorRahul Sharma <rahul.sharma@samsung.com>2012-11-28 01:00:24 -0500
committerInki Dae <inki.dae@samsung.com>2012-12-14 01:40:48 -0500
commit000f13083d38681eaa3038c65d499f6ad5d62625 (patch)
tree9acc0ed6d32e0161a6ab809f0dce3ceac1bea73f /drivers
parent64327cb35acea0e3046d7c08d90b84ab83d5e7d1 (diff)
drm/exynos: add runtime pm support for mixer
This patch adds support for runtime power management for drm mixer driver. Signed-off-by: Rahul Sharma <rahul.sharma@samsung.com> Signed-off-by: Shirish S <s.shirish@samsung.com> Signed-off-by: Inki Dae <inki.dae@samsung.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gpu/drm/exynos/exynos_mixer.c65
1 files changed, 58 insertions, 7 deletions
diff --git a/drivers/gpu/drm/exynos/exynos_mixer.c b/drivers/gpu/drm/exynos/exynos_mixer.c
index 632a941520ff..21db89530fc7 100644
--- a/drivers/gpu/drm/exynos/exynos_mixer.c
+++ b/drivers/gpu/drm/exynos/exynos_mixer.c
@@ -872,8 +872,6 @@ static void mixer_poweron(struct mixer_context *ctx)
872 ctx->powered = true; 872 ctx->powered = true;
873 mutex_unlock(&ctx->mixer_mutex); 873 mutex_unlock(&ctx->mixer_mutex);
874 874
875 pm_runtime_get_sync(ctx->dev);
876
877 clk_enable(res->mixer); 875 clk_enable(res->mixer);
878 if (ctx->vp_enabled) { 876 if (ctx->vp_enabled) {
879 clk_enable(res->vp); 877 clk_enable(res->vp);
@@ -907,8 +905,6 @@ static void mixer_poweroff(struct mixer_context *ctx)
907 clk_disable(res->sclk_mixer); 905 clk_disable(res->sclk_mixer);
908 } 906 }
909 907
910 pm_runtime_put_sync(ctx->dev);
911
912 mutex_lock(&ctx->mixer_mutex); 908 mutex_lock(&ctx->mixer_mutex);
913 ctx->powered = false; 909 ctx->powered = false;
914 910
@@ -924,12 +920,14 @@ static void mixer_dpms(void *ctx, int mode)
924 920
925 switch (mode) { 921 switch (mode) {
926 case DRM_MODE_DPMS_ON: 922 case DRM_MODE_DPMS_ON:
927 mixer_poweron(mixer_ctx); 923 if (pm_runtime_suspended(mixer_ctx->dev))
924 pm_runtime_get_sync(mixer_ctx->dev);
928 break; 925 break;
929 case DRM_MODE_DPMS_STANDBY: 926 case DRM_MODE_DPMS_STANDBY:
930 case DRM_MODE_DPMS_SUSPEND: 927 case DRM_MODE_DPMS_SUSPEND:
931 case DRM_MODE_DPMS_OFF: 928 case DRM_MODE_DPMS_OFF:
932 mixer_poweroff(mixer_ctx); 929 if (!pm_runtime_suspended(mixer_ctx->dev))
930 pm_runtime_put_sync(mixer_ctx->dev);
933 break; 931 break;
934 default: 932 default:
935 DRM_DEBUG_KMS("unknown dpms mode: %d\n", mode); 933 DRM_DEBUG_KMS("unknown dpms mode: %d\n", mode);
@@ -1249,13 +1247,66 @@ static int mixer_suspend(struct device *dev)
1249 struct exynos_drm_hdmi_context *drm_hdmi_ctx = get_mixer_context(dev); 1247 struct exynos_drm_hdmi_context *drm_hdmi_ctx = get_mixer_context(dev);
1250 struct mixer_context *ctx = drm_hdmi_ctx->ctx; 1248 struct mixer_context *ctx = drm_hdmi_ctx->ctx;
1251 1249
1250 DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__);
1251
1252 if (pm_runtime_suspended(dev)) {
1253 DRM_DEBUG_KMS("%s : Already suspended\n", __func__);
1254 return 0;
1255 }
1256
1252 mixer_poweroff(ctx); 1257 mixer_poweroff(ctx);
1253 1258
1254 return 0; 1259 return 0;
1255} 1260}
1261
1262static int mixer_resume(struct device *dev)
1263{
1264 struct exynos_drm_hdmi_context *drm_hdmi_ctx = get_mixer_context(dev);
1265 struct mixer_context *ctx = drm_hdmi_ctx->ctx;
1266
1267 DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__);
1268
1269 if (!pm_runtime_suspended(dev)) {
1270 DRM_DEBUG_KMS("%s : Already resumed\n", __func__);
1271 return 0;
1272 }
1273
1274 mixer_poweron(ctx);
1275
1276 return 0;
1277}
1256#endif 1278#endif
1257 1279
1258static SIMPLE_DEV_PM_OPS(mixer_pm_ops, mixer_suspend, NULL); 1280#ifdef CONFIG_PM_RUNTIME
1281static int mixer_runtime_suspend(struct device *dev)
1282{
1283 struct exynos_drm_hdmi_context *drm_hdmi_ctx = get_mixer_context(dev);
1284 struct mixer_context *ctx = drm_hdmi_ctx->ctx;
1285
1286 DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__);
1287
1288 mixer_poweroff(ctx);
1289
1290 return 0;
1291}
1292
1293static int mixer_runtime_resume(struct device *dev)
1294{
1295 struct exynos_drm_hdmi_context *drm_hdmi_ctx = get_mixer_context(dev);
1296 struct mixer_context *ctx = drm_hdmi_ctx->ctx;
1297
1298 DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__);
1299
1300 mixer_poweron(ctx);
1301
1302 return 0;
1303}
1304#endif
1305
1306static const struct dev_pm_ops mixer_pm_ops = {
1307 SET_SYSTEM_SLEEP_PM_OPS(mixer_suspend, mixer_resume)
1308 SET_RUNTIME_PM_OPS(mixer_runtime_suspend, mixer_runtime_resume, NULL)
1309};
1259 1310
1260struct platform_driver mixer_driver = { 1311struct platform_driver mixer_driver = {
1261 .driver = { 1312 .driver = {