drm/atomic-helpers: make mode_set hooks optional
authorDaniel Vetter <daniel.vetter@ffwll.ch>
Sun, 22 Feb 2015 11:24:20 +0000 (12:24 +0100)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Tue, 24 Feb 2015 00:58:15 +0000 (01:58 +0100)
With runtime PM the hw might still be off while doing the ->mode_set
callbacks - runtime PM get/put should only happen in the
enable/disable hooks to properly support DPMS. Which essentially makes
these callbacks useless for drivers support runtime PM, so make them
optional. Again motivated by discussions with Laurent.

Cc: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Acked-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
drivers/gpu/drm/drm_atomic_helper.c
include/drm/drm_crtc_helper.h

index 9c528bbcd8d25965bb095c408d56ec050bf0bb0b..28aa875105510b788b0b1f78d78aac916ee70913 100644 (file)
@@ -723,7 +723,7 @@ crtc_set_mode(struct drm_device *dev, struct drm_atomic_state *old_state)
 
                funcs = crtc->helper_private;
 
-               if (crtc->state->enable) {
+               if (crtc->state->enable && funcs->mode_set_nofb) {
                        DRM_DEBUG_ATOMIC("modeset on [CRTC:%d]\n",
                                         crtc->base.id);
 
@@ -759,7 +759,8 @@ crtc_set_mode(struct drm_device *dev, struct drm_atomic_state *old_state)
                 * Each encoder has at most one connector (since we always steal
                 * it away), so we won't call call mode_set hooks twice.
                 */
-               funcs->mode_set(encoder, mode, adjusted_mode);
+               if (funcs->mode_set)
+                       funcs->mode_set(encoder, mode, adjusted_mode);
 
                if (encoder->bridge && encoder->bridge->funcs->mode_set)
                        encoder->bridge->funcs->mode_set(encoder->bridge,
index c250a22b39aba09a58aa4d7843e6ae4e7033c524..92d5135b55d214e54cdff5bf83a33ceea7e83e2f 100644 (file)
@@ -89,6 +89,7 @@ struct drm_crtc_helper_funcs {
        int (*mode_set)(struct drm_crtc *crtc, struct drm_display_mode *mode,
                        struct drm_display_mode *adjusted_mode, int x, int y,
                        struct drm_framebuffer *old_fb);
+       /* Actually set the mode for atomic helpers, optional */
        void (*mode_set_nofb)(struct drm_crtc *crtc);
 
        /* Move the crtc on the current fb to the given position *optional* */
@@ -119,7 +120,7 @@ struct drm_crtc_helper_funcs {
  * @mode_fixup: try to fixup proposed mode for this connector
  * @prepare: part of the disable sequence, called before the CRTC modeset
  * @commit: called after the CRTC modeset
- * @mode_set: set this mode
+ * @mode_set: set this mode, optional for atomic helpers
  * @get_crtc: return CRTC that the encoder is currently attached to
  * @detect: connection status detection
  * @disable: disable encoder when not in use (overrides DPMS off)