summaryrefslogtreecommitdiff
path: root/patches.tizen/0805-drm-exynos-support-drm-backlight-dpms-on-off.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches.tizen/0805-drm-exynos-support-drm-backlight-dpms-on-off.patch')
-rw-r--r--patches.tizen/0805-drm-exynos-support-drm-backlight-dpms-on-off.patch204
1 files changed, 204 insertions, 0 deletions
diff --git a/patches.tizen/0805-drm-exynos-support-drm-backlight-dpms-on-off.patch b/patches.tizen/0805-drm-exynos-support-drm-backlight-dpms-on-off.patch
new file mode 100644
index 00000000000..2e56628ce1a
--- /dev/null
+++ b/patches.tizen/0805-drm-exynos-support-drm-backlight-dpms-on-off.patch
@@ -0,0 +1,204 @@
+From 3c2bf23d79422b1703253248a4e7642a5d8d8a00 Mon Sep 17 00:00:00 2001
+From: Donghwa Lee <dh09.lee@samsung.com>
+Date: Thu, 26 Sep 2013 14:38:02 +0900
+Subject: [PATCH 0805/1302] drm: exynos: support drm backlight dpms on/off
+
+Signed-off-by: Donghwa Lee <dh09.lee@samsung.com>
+Signed-off-by: MyungJoo Ham <myungjoo.ham@samsung.com>
+---
+ drivers/gpu/drm/Makefile | 2 +-
+ drivers/gpu/drm/exynos/exynos_drm_fimd.c | 122 +++++++++++++++++++------------
+ 2 files changed, 76 insertions(+), 48 deletions(-)
+
+diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile
+index 1c9f2439..5d4273d 100644
+--- a/drivers/gpu/drm/Makefile
++++ b/drivers/gpu/drm/Makefile
+@@ -12,7 +12,7 @@ drm-y := drm_auth.o drm_buffer.o drm_bufs.o drm_cache.o \
+ drm_platform.o drm_sysfs.o drm_hashtab.o drm_mm.o \
+ drm_crtc.o drm_modes.o drm_edid.o \
+ drm_info.o drm_debugfs.o drm_encoder_slave.o \
+- drm_trace_points.o drm_global.o drm_prime.o
++ drm_trace_points.o drm_global.o drm_prime.o drm_backlight.o
+
+ drm-$(CONFIG_COMPAT) += drm_ioc32.o
+ drm-$(CONFIG_DRM_GEM_CMA_HELPER) += drm_gem_cma_helper.o
+diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c b/drivers/gpu/drm/exynos/exynos_drm_fimd.c
+index ec060cb..e3cfa07 100644
+--- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c
++++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c
+@@ -23,6 +23,7 @@
+ #include <video/of_display_timing.h>
+ #include <video/samsung_fimd.h>
+ #include <drm/exynos_drm.h>
++#include <drm/drm_backlight.h>
+
+ #include "exynos_drm_drv.h"
+ #include "exynos_drm_fbdev.h"
+@@ -173,52 +174,33 @@ static int fimd_check_mode(struct device *dev, struct drm_display_mode *mode)
+
+ static int fimd_display_power_on(struct device *dev, int mode)
+ {
+- /* TODO */
+-
+- return 0;
+-}
+-
+-static struct exynos_drm_display_ops fimd_display_ops = {
+- .type = EXYNOS_DISPLAY_TYPE_LCD,
+- .is_connected = fimd_display_is_connected,
+- .get_panel = fimd_get_panel,
+- .check_mode = fimd_check_mode,
+- .power_on = fimd_display_power_on,
+-};
+-
+-static void fimd_dpms(struct device *subdrv_dev, int mode)
+-{
+- struct fimd_context *ctx = get_fimd_context(subdrv_dev);
+-
+- DRM_DEBUG_KMS("%d\n", mode);
+-
+- mutex_lock(&ctx->lock);
++ DRM_INFO("%s:mode[%d]\n", __func__, mode);
+
+ switch (mode) {
+ case DRM_MODE_DPMS_ON:
+- /*
+- * enable fimd hardware only if suspended status.
+- *
+- * P.S. fimd_dpms function would be called at booting time so
+- * clk_enable could be called double time.
+- */
+- if (ctx->suspended)
+- pm_runtime_get_sync(subdrv_dev);
++ drm_bl_dpms(mode);
+ break;
+ case DRM_MODE_DPMS_STANDBY:
+ case DRM_MODE_DPMS_SUSPEND:
+ case DRM_MODE_DPMS_OFF:
+- if (!ctx->suspended)
+- pm_runtime_put_sync(subdrv_dev);
++ drm_bl_dpms(mode);
+ break;
+ default:
+ DRM_DEBUG_KMS("unspecified mode %d\n", mode);
+ break;
+ }
+
+- mutex_unlock(&ctx->lock);
++ return 0;
+ }
+
++static struct exynos_drm_display_ops fimd_display_ops = {
++ .type = EXYNOS_DISPLAY_TYPE_LCD,
++ .is_connected = fimd_display_is_connected,
++ .get_panel = fimd_get_panel,
++ .check_mode = fimd_check_mode,
++ .power_on = fimd_display_power_on,
++};
++
+ static void fimd_apply(struct device *subdrv_dev)
+ {
+ struct fimd_context *ctx = get_fimd_context(subdrv_dev);
+@@ -356,15 +338,6 @@ static void fimd_wait_for_vblank(struct device *dev)
+ DRM_DEBUG_KMS("vblank wait timed out.\n");
+ }
+
+-static struct exynos_drm_manager_ops fimd_manager_ops = {
+- .dpms = fimd_dpms,
+- .apply = fimd_apply,
+- .commit = fimd_commit,
+- .enable_vblank = fimd_enable_vblank,
+- .disable_vblank = fimd_disable_vblank,
+- .wait_for_vblank = fimd_wait_for_vblank,
+-};
+-
+ static void fimd_win_mode_set(struct device *dev,
+ struct exynos_drm_overlay *overlay)
+ {
+@@ -680,13 +653,6 @@ static struct exynos_drm_overlay_ops fimd_overlay_ops = {
+ .disable = fimd_win_disable,
+ };
+
+-static struct exynos_drm_manager fimd_manager = {
+- .pipe = -1,
+- .ops = &fimd_manager_ops,
+- .overlay_ops = &fimd_overlay_ops,
+- .display_ops = &fimd_display_ops,
+-};
+-
+ static irqreturn_t fimd_irq_handler(int irq, void *dev_id)
+ {
+ struct fimd_context *ctx = (struct fimd_context *)dev_id;
+@@ -907,6 +873,68 @@ static int fimd_activate(struct fimd_context *ctx, bool enable)
+ return 0;
+ }
+
++static void fimd_dpms(struct device *subdrv_dev, int mode)
++{
++ struct fimd_context *ctx = get_fimd_context(subdrv_dev);
++ int ret;
++
++ DRM_DEBUG_KMS("%d\n", mode);
++
++ mutex_lock(&ctx->lock);
++
++ switch (mode) {
++ case DRM_MODE_DPMS_ON:
++ /*
++ * enable fimd hardware only if suspended status.
++ *
++ * P.S. fimd_dpms function would be called at booting time so
++ * clk_enable could be called double time.
++ */
++ if (ctx->suspended) {
++ pm_runtime_get_sync(subdrv_dev);
++
++ ret = fimd_activate(ctx, true);
++ if (ret < 0) {
++ DRM_ERROR("failed to activate.\n");
++ pm_runtime_put_sync(subdrv_dev);
++ }
++ }
++ break;
++ case DRM_MODE_DPMS_STANDBY:
++ case DRM_MODE_DPMS_SUSPEND:
++ case DRM_MODE_DPMS_OFF:
++ if (!ctx->suspended) {
++ ret = fimd_activate(ctx, false);
++ if (ret < 0)
++ DRM_ERROR("failed to deactivate.\n");
++
++ pm_runtime_put_sync(subdrv_dev);
++ }
++ break;
++ default:
++ DRM_DEBUG_KMS("unspecified mode %d\n", mode);
++ break;
++ }
++
++ mutex_unlock(&ctx->lock);
++}
++
++static struct exynos_drm_manager_ops fimd_manager_ops = {
++ .dpms = fimd_dpms,
++ .apply = fimd_apply,
++ .commit = fimd_commit,
++ .enable_vblank = fimd_enable_vblank,
++ .disable_vblank = fimd_disable_vblank,
++ .wait_for_vblank = fimd_wait_for_vblank,
++};
++
++static struct exynos_drm_manager fimd_manager = {
++ .pipe = -1,
++ .ops = &fimd_manager_ops,
++ .overlay_ops = &fimd_overlay_ops,
++ .display_ops = &fimd_display_ops,
++};
++
+ static int fimd_probe(struct platform_device *pdev)
+ {
+ struct device *dev = &pdev->dev;
+--
+1.8.3.2
+