diff mbox

[v2,1/3] drm: Add drm_plane_force_disable()

Message ID 1370265042-13969-2-git-send-email-ville.syrjala@linux.intel.com (mailing list archive)
State Accepted
Headers show

Commit Message

Ville Syrjälä June 3, 2013, 1:10 p.m. UTC
From: Ville Syrjälä <ville.syrjala@linux.intel.com>

drm_plane_force_disable() will forcibly disable the plane even if user
had previously requested the plane to be enabled.

This can be used to force planes to be off when restoring the fbdev
mode.

The code was simply pulled from drm_framebuffer_remove(), which now
calls the new function as well.

v2: Check plane->fb in drm_plane_force_disable(), drop bogus comment
    about disabling crtc

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
 drivers/gpu/drm/drm_crtc.c | 29 +++++++++++++++++++----------
 include/drm/drm_crtc.h     |  1 +
 2 files changed, 20 insertions(+), 10 deletions(-)

Comments

Laurent Pinchart June 4, 2013, 1:37 a.m. UTC | #1
Hi Ville,

Thanks for the patch.

On Monday 03 June 2013 16:10:40 ville.syrjala@linux.intel.com wrote:
> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
> 
> drm_plane_force_disable() will forcibly disable the plane even if user
> had previously requested the plane to be enabled.
> 
> This can be used to force planes to be off when restoring the fbdev
> mode.
> 
> The code was simply pulled from drm_framebuffer_remove(), which now
> calls the new function as well.
> 
> v2: Check plane->fb in drm_plane_force_disable(), drop bogus comment
>     about disabling crtc
> 
> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> ---
>  drivers/gpu/drm/drm_crtc.c | 29 +++++++++++++++++++----------
>  include/drm/drm_crtc.h     |  1 +
>  2 files changed, 20 insertions(+), 10 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
> index e7e9242..865ebfe 100644
> --- a/drivers/gpu/drm/drm_crtc.c
> +++ b/drivers/gpu/drm/drm_crtc.c
> @@ -569,16 +569,8 @@ void drm_framebuffer_remove(struct drm_framebuffer *fb)
> }
> 
>  		list_for_each_entry(plane, &dev->mode_config.plane_list, head) {
> -			if (plane->fb == fb) {
> -				/* should turn off the crtc */
> -				ret = plane->funcs->disable_plane(plane);
> -				if (ret)
> -					DRM_ERROR("failed to disable plane with busy fb\n");
> -				/* disconnect the plane from the fb and crtc: */
> -				__drm_framebuffer_unreference(plane->fb);
> -				plane->fb = NULL;
> -				plane->crtc = NULL;
> -			}
> +			if (plane->fb == fb)
> +				drm_plane_force_disable(plane);
>  		}
>  		drm_modeset_unlock_all(dev);
>  	}
> @@ -867,6 +859,23 @@ void drm_plane_cleanup(struct drm_plane *plane)
>  }
>  EXPORT_SYMBOL(drm_plane_cleanup);

What about adding kerneldoc ? :-)

> +void drm_plane_force_disable(struct drm_plane *plane)
> +{
> +	int ret;
> +
> +	if (!plane->fb)
> +		return;
> +
> +	ret = plane->funcs->disable_plane(plane);
> +	if (ret)
> +		DRM_ERROR("failed to disable plane with busy fb\n");
> +	/* disconnect the plane from the fb and crtc: */
> +	__drm_framebuffer_unreference(plane->fb);
> +	plane->fb = NULL;
> +	plane->crtc = NULL;
> +}
> +EXPORT_SYMBOL(drm_plane_force_disable);
> +
>  /**
>   * drm_mode_create - create a new display mode
>   * @dev: DRM device
> diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
> index adb3f9b..db7a885 100644
> --- a/include/drm/drm_crtc.h
> +++ b/include/drm/drm_crtc.h
> @@ -894,6 +894,7 @@ extern int drm_plane_init(struct drm_device *dev,
>  			  const uint32_t *formats, uint32_t format_count,
>  			  bool priv);
>  extern void drm_plane_cleanup(struct drm_plane *plane);
> +extern void drm_plane_force_disable(struct drm_plane *plane);
> 
>  extern void drm_encoder_cleanup(struct drm_encoder *encoder);
diff mbox

Patch

diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
index e7e9242..865ebfe 100644
--- a/drivers/gpu/drm/drm_crtc.c
+++ b/drivers/gpu/drm/drm_crtc.c
@@ -569,16 +569,8 @@  void drm_framebuffer_remove(struct drm_framebuffer *fb)
 		}
 
 		list_for_each_entry(plane, &dev->mode_config.plane_list, head) {
-			if (plane->fb == fb) {
-				/* should turn off the crtc */
-				ret = plane->funcs->disable_plane(plane);
-				if (ret)
-					DRM_ERROR("failed to disable plane with busy fb\n");
-				/* disconnect the plane from the fb and crtc: */
-				__drm_framebuffer_unreference(plane->fb);
-				plane->fb = NULL;
-				plane->crtc = NULL;
-			}
+			if (plane->fb == fb)
+				drm_plane_force_disable(plane);
 		}
 		drm_modeset_unlock_all(dev);
 	}
@@ -867,6 +859,23 @@  void drm_plane_cleanup(struct drm_plane *plane)
 }
 EXPORT_SYMBOL(drm_plane_cleanup);
 
+void drm_plane_force_disable(struct drm_plane *plane)
+{
+	int ret;
+
+	if (!plane->fb)
+		return;
+
+	ret = plane->funcs->disable_plane(plane);
+	if (ret)
+		DRM_ERROR("failed to disable plane with busy fb\n");
+	/* disconnect the plane from the fb and crtc: */
+	__drm_framebuffer_unreference(plane->fb);
+	plane->fb = NULL;
+	plane->crtc = NULL;
+}
+EXPORT_SYMBOL(drm_plane_force_disable);
+
 /**
  * drm_mode_create - create a new display mode
  * @dev: DRM device
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
index adb3f9b..db7a885 100644
--- a/include/drm/drm_crtc.h
+++ b/include/drm/drm_crtc.h
@@ -894,6 +894,7 @@  extern int drm_plane_init(struct drm_device *dev,
 			  const uint32_t *formats, uint32_t format_count,
 			  bool priv);
 extern void drm_plane_cleanup(struct drm_plane *plane);
+extern void drm_plane_force_disable(struct drm_plane *plane);
 
 extern void drm_encoder_cleanup(struct drm_encoder *encoder);