[PATCH v3 16/32] drm/exynos: Disable unused crtc planes from crtc

2013-11-10 Thread Tomasz Figa
On Tuesday 29 of October 2013 12:13:02 Sean Paul wrote:
> This patch moves the code which disables unused crtc planes from the
> encoder to the crtc. Since there is a 1:1 encoder/crtc mapping in
> exynos, the only valid crtc change the pre-existing code could catch is
> disconnecting an active crtc from the encoder. Thus it is functionally
> equivalent to just disable all planes attached to a crtc when the crtc
> is disabled.
> 
> Signed-off-by: Sean Paul 
> ---
> 
> Changes in v2: None
> Changes in v3: None
> 
>  drivers/gpu/drm/exynos/exynos_drm_crtc.c| 13 +-
>  drivers/gpu/drm/exynos/exynos_drm_encoder.c | 65 
> ++---
>  2 files changed, 15 insertions(+), 63 deletions(-)

Reviewed-by: Tomasz Figa 

Best regards,
Tomasz



[PATCH v3 16/32] drm/exynos: Disable unused crtc planes from crtc

2013-10-29 Thread Sean Paul
This patch moves the code which disables unused crtc planes from the
encoder to the crtc. Since there is a 1:1 encoder/crtc mapping in
exynos, the only valid crtc change the pre-existing code could catch is
disconnecting an active crtc from the encoder. Thus it is functionally
equivalent to just disable all planes attached to a crtc when the crtc
is disabled.

Signed-off-by: Sean Paul 
---

Changes in v2: None
Changes in v3: None

 drivers/gpu/drm/exynos/exynos_drm_crtc.c| 13 +-
 drivers/gpu/drm/exynos/exynos_drm_encoder.c | 65 ++---
 2 files changed, 15 insertions(+), 63 deletions(-)

diff --git a/drivers/gpu/drm/exynos/exynos_drm_crtc.c 
b/drivers/gpu/drm/exynos/exynos_drm_crtc.c
index 347d62d..d019385 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_crtc.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_crtc.c
@@ -176,10 +176,19 @@ static int exynos_drm_crtc_mode_set_base(struct drm_crtc 
*crtc, int x, int y,

 static void exynos_drm_crtc_disable(struct drm_crtc *crtc)
 {
-   struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(crtc);
+   struct drm_plane *plane;
+   int ret;

-   exynos_plane_dpms(exynos_crtc->plane, DRM_MODE_DPMS_OFF);
exynos_drm_crtc_dpms(crtc, DRM_MODE_DPMS_OFF);
+
+   list_for_each_entry(plane, >dev->mode_config.plane_list, head) {
+   if (plane->crtc != crtc)
+   continue;
+
+   ret = plane->funcs->disable_plane(plane);
+   if (ret)
+   DRM_ERROR("Failed to disable plane %d\n", ret);
+   }
 }

 static struct drm_crtc_helper_funcs exynos_crtc_helper_funcs = {
diff --git a/drivers/gpu/drm/exynos/exynos_drm_encoder.c 
b/drivers/gpu/drm/exynos/exynos_drm_encoder.c
index d4ae664..bfa2f17 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_encoder.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_encoder.c
@@ -29,7 +29,6 @@
  * @display: the display structure that maps to this encoder
  */
 struct exynos_drm_encoder {
-   struct drm_crtc *old_crtc;
struct drm_encoder  drm_encoder;
struct exynos_drm_display   *display;
 };
@@ -67,71 +66,15 @@ exynos_drm_encoder_mode_fixup(struct drm_encoder *encoder,
return true;
 }

-static void disable_plane_to_crtc(struct drm_device *dev,
-   struct drm_crtc *old_crtc,
-   struct drm_crtc *new_crtc)
-{
-   struct drm_plane *plane;
-
-   /*
-* if old_crtc isn't same as encoder->crtc then it means that
-* user changed crtc id to another one so the plane to old_crtc
-* should be disabled and plane->crtc should be set to new_crtc
-* (encoder->crtc)
-*/
-   list_for_each_entry(plane, >mode_config.plane_list, head) {
-   if (plane->crtc == old_crtc) {
-   /*
-* do not change below call order.
-*
-* plane->funcs->disable_plane call checks
-* if encoder->crtc is same as plane->crtc and if same
-* then manager_ops->win_disable callback will be called
-* to diasble current hw overlay so plane->crtc should
-* have new_crtc because new_crtc was set to
-* encoder->crtc in advance.
-*/
-   plane->crtc = new_crtc;
-   plane->funcs->disable_plane(plane);
-   }
-   }
-}
-
 static void exynos_drm_encoder_mode_set(struct drm_encoder *encoder,
 struct drm_display_mode *mode,
 struct drm_display_mode *adjusted_mode)
 {
-   struct drm_device *dev = encoder->dev;
-   struct drm_connector *connector;
-   struct exynos_drm_display *display;
-
-   list_for_each_entry(connector, >mode_config.connector_list, head) {
-   if (connector->encoder == encoder) {
-   struct exynos_drm_encoder *exynos_encoder;
-
-   exynos_encoder = to_exynos_encoder(encoder);
-
-   if (exynos_encoder->old_crtc != encoder->crtc &&
-   exynos_encoder->old_crtc) {
-
-   /*
-* disable a plane to old crtc and change
-* crtc of the plane to new one.
-*/
-   disable_plane_to_crtc(dev,
-   exynos_encoder->old_crtc,
-   encoder->crtc);
-   }
-
-   display = exynos_encoder->display;
-
-   if (display->ops->mode_set)
-   display->ops->mode_set(display,
-