Commit c982bd90 authored by Daniel Vetter's avatar Daniel Vetter

drm/atomic-helpers: make mode_set hooks optional

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: default avatarLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@intel.com>
parent 1af434a9
...@@ -723,7 +723,7 @@ crtc_set_mode(struct drm_device *dev, struct drm_atomic_state *old_state) ...@@ -723,7 +723,7 @@ crtc_set_mode(struct drm_device *dev, struct drm_atomic_state *old_state)
funcs = crtc->helper_private; funcs = crtc->helper_private;
if (crtc->state->enable) { if (crtc->state->enable && funcs->mode_set_nofb) {
DRM_DEBUG_ATOMIC("modeset on [CRTC:%d]\n", DRM_DEBUG_ATOMIC("modeset on [CRTC:%d]\n",
crtc->base.id); crtc->base.id);
...@@ -759,6 +759,7 @@ crtc_set_mode(struct drm_device *dev, struct drm_atomic_state *old_state) ...@@ -759,6 +759,7 @@ crtc_set_mode(struct drm_device *dev, struct drm_atomic_state *old_state)
* Each encoder has at most one connector (since we always steal * Each encoder has at most one connector (since we always steal
* it away), so we won't call call mode_set hooks twice. * it away), so we won't call call mode_set hooks twice.
*/ */
if (funcs->mode_set)
funcs->mode_set(encoder, mode, adjusted_mode); funcs->mode_set(encoder, mode, adjusted_mode);
if (encoder->bridge && encoder->bridge->funcs->mode_set) if (encoder->bridge && encoder->bridge->funcs->mode_set)
......
...@@ -89,6 +89,7 @@ struct drm_crtc_helper_funcs { ...@@ -89,6 +89,7 @@ struct drm_crtc_helper_funcs {
int (*mode_set)(struct drm_crtc *crtc, struct drm_display_mode *mode, int (*mode_set)(struct drm_crtc *crtc, struct drm_display_mode *mode,
struct drm_display_mode *adjusted_mode, int x, int y, struct drm_display_mode *adjusted_mode, int x, int y,
struct drm_framebuffer *old_fb); struct drm_framebuffer *old_fb);
/* Actually set the mode for atomic helpers, optional */
void (*mode_set_nofb)(struct drm_crtc *crtc); void (*mode_set_nofb)(struct drm_crtc *crtc);
/* Move the crtc on the current fb to the given position *optional* */ /* Move the crtc on the current fb to the given position *optional* */
...@@ -119,7 +120,7 @@ struct drm_crtc_helper_funcs { ...@@ -119,7 +120,7 @@ struct drm_crtc_helper_funcs {
* @mode_fixup: try to fixup proposed mode for this connector * @mode_fixup: try to fixup proposed mode for this connector
* @prepare: part of the disable sequence, called before the CRTC modeset * @prepare: part of the disable sequence, called before the CRTC modeset
* @commit: called after 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 * @get_crtc: return CRTC that the encoder is currently attached to
* @detect: connection status detection * @detect: connection status detection
* @disable: disable encoder when not in use (overrides DPMS off) * @disable: disable encoder when not in use (overrides DPMS off)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment