diff options
author | Rahul Sharma <rahul.sharma@samsung.com> | 2012-11-28 01:00:24 -0500 |
---|---|---|
committer | Inki Dae <inki.dae@samsung.com> | 2012-12-14 01:40:48 -0500 |
commit | 000f13083d38681eaa3038c65d499f6ad5d62625 (patch) | |
tree | 9acc0ed6d32e0161a6ab809f0dce3ceac1bea73f /drivers/gpu/drm/exynos | |
parent | 64327cb35acea0e3046d7c08d90b84ab83d5e7d1 (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/gpu/drm/exynos')
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_mixer.c | 65 |
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 | |||
1262 | static 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 | ||
1258 | static SIMPLE_DEV_PM_OPS(mixer_pm_ops, mixer_suspend, NULL); | 1280 | #ifdef CONFIG_PM_RUNTIME |
1281 | static 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 | |||
1293 | static 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 | |||
1306 | static 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 | ||
1260 | struct platform_driver mixer_driver = { | 1311 | struct platform_driver mixer_driver = { |
1261 | .driver = { | 1312 | .driver = { |