Message ID | 1370265042-13969-2-git-send-email-ville.syrjala@linux.intel.com (mailing list archive) |
---|---|
State | Accepted |
Headers | show |
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 --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);