diff options
Diffstat (limited to 'drivers/gpu/drm/drm_atomic_helper.c')
-rw-r--r-- | drivers/gpu/drm/drm_atomic_helper.c | 49 |
1 files changed, 34 insertions, 15 deletions
diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c index 997fd21e5388..43a0b3dfa846 100644 --- a/drivers/gpu/drm/drm_atomic_helper.c +++ b/drivers/gpu/drm/drm_atomic_helper.c | |||
@@ -384,8 +384,6 @@ mode_fixup(struct drm_atomic_state *state) | |||
384 | */ | 384 | */ |
385 | encoder = conn_state->best_encoder; | 385 | encoder = conn_state->best_encoder; |
386 | funcs = encoder->helper_private; | 386 | funcs = encoder->helper_private; |
387 | if (!funcs) | ||
388 | continue; | ||
389 | 387 | ||
390 | ret = drm_bridge_mode_fixup(encoder->bridge, &crtc_state->mode, | 388 | ret = drm_bridge_mode_fixup(encoder->bridge, &crtc_state->mode, |
391 | &crtc_state->adjusted_mode); | 389 | &crtc_state->adjusted_mode); |
@@ -394,7 +392,7 @@ mode_fixup(struct drm_atomic_state *state) | |||
394 | return -EINVAL; | 392 | return -EINVAL; |
395 | } | 393 | } |
396 | 394 | ||
397 | if (funcs->atomic_check) { | 395 | if (funcs && funcs->atomic_check) { |
398 | ret = funcs->atomic_check(encoder, crtc_state, | 396 | ret = funcs->atomic_check(encoder, crtc_state, |
399 | conn_state); | 397 | conn_state); |
400 | if (ret) { | 398 | if (ret) { |
@@ -402,7 +400,7 @@ mode_fixup(struct drm_atomic_state *state) | |||
402 | encoder->base.id, encoder->name); | 400 | encoder->base.id, encoder->name); |
403 | return ret; | 401 | return ret; |
404 | } | 402 | } |
405 | } else if (funcs->mode_fixup) { | 403 | } else if (funcs && funcs->mode_fixup) { |
406 | ret = funcs->mode_fixup(encoder, &crtc_state->mode, | 404 | ret = funcs->mode_fixup(encoder, &crtc_state->mode, |
407 | &crtc_state->adjusted_mode); | 405 | &crtc_state->adjusted_mode); |
408 | if (!ret) { | 406 | if (!ret) { |
@@ -707,12 +705,14 @@ disable_outputs(struct drm_device *dev, struct drm_atomic_state *old_state) | |||
707 | drm_bridge_disable(encoder->bridge); | 705 | drm_bridge_disable(encoder->bridge); |
708 | 706 | ||
709 | /* Right function depends upon target state. */ | 707 | /* Right function depends upon target state. */ |
710 | if (connector->state->crtc && funcs->prepare) | 708 | if (funcs) { |
711 | funcs->prepare(encoder); | 709 | if (connector->state->crtc && funcs->prepare) |
712 | else if (funcs->disable) | 710 | funcs->prepare(encoder); |
713 | funcs->disable(encoder); | 711 | else if (funcs->disable) |
714 | else | 712 | funcs->disable(encoder); |
715 | funcs->dpms(encoder, DRM_MODE_DPMS_OFF); | 713 | else if (funcs->dpms) |
714 | funcs->dpms(encoder, DRM_MODE_DPMS_OFF); | ||
715 | } | ||
716 | 716 | ||
717 | drm_bridge_post_disable(encoder->bridge); | 717 | drm_bridge_post_disable(encoder->bridge); |
718 | } | 718 | } |
@@ -873,7 +873,7 @@ crtc_set_mode(struct drm_device *dev, struct drm_atomic_state *old_state) | |||
873 | * Each encoder has at most one connector (since we always steal | 873 | * Each encoder has at most one connector (since we always steal |
874 | * it away), so we won't call mode_set hooks twice. | 874 | * it away), so we won't call mode_set hooks twice. |
875 | */ | 875 | */ |
876 | if (funcs->mode_set) | 876 | if (funcs && funcs->mode_set) |
877 | funcs->mode_set(encoder, mode, adjusted_mode); | 877 | funcs->mode_set(encoder, mode, adjusted_mode); |
878 | 878 | ||
879 | drm_bridge_mode_set(encoder->bridge, mode, adjusted_mode); | 879 | drm_bridge_mode_set(encoder->bridge, mode, adjusted_mode); |
@@ -974,10 +974,12 @@ void drm_atomic_helper_commit_modeset_enables(struct drm_device *dev, | |||
974 | */ | 974 | */ |
975 | drm_bridge_pre_enable(encoder->bridge); | 975 | drm_bridge_pre_enable(encoder->bridge); |
976 | 976 | ||
977 | if (funcs->enable) | 977 | if (funcs) { |
978 | funcs->enable(encoder); | 978 | if (funcs->enable) |
979 | else | 979 | funcs->enable(encoder); |
980 | funcs->commit(encoder); | 980 | else if (funcs->commit) |
981 | funcs->commit(encoder); | ||
982 | } | ||
981 | 983 | ||
982 | drm_bridge_enable(encoder->bridge); | 984 | drm_bridge_enable(encoder->bridge); |
983 | } | 985 | } |
@@ -2481,6 +2483,23 @@ backoff: | |||
2481 | EXPORT_SYMBOL(drm_atomic_helper_connector_dpms); | 2483 | EXPORT_SYMBOL(drm_atomic_helper_connector_dpms); |
2482 | 2484 | ||
2483 | /** | 2485 | /** |
2486 | * drm_atomic_helper_best_encoder - Helper for &drm_connector_helper_funcs | ||
2487 | * ->best_encoder callback | ||
2488 | * @connector: Connector control structure | ||
2489 | * | ||
2490 | * This is a &drm_connector_helper_funcs ->best_encoder callback helper for | ||
2491 | * connectors that support exactly 1 encoder, statically determined at driver | ||
2492 | * init time. | ||
2493 | */ | ||
2494 | struct drm_encoder * | ||
2495 | drm_atomic_helper_best_encoder(struct drm_connector *connector) | ||
2496 | { | ||
2497 | WARN_ON(connector->encoder_ids[1]); | ||
2498 | return drm_encoder_find(connector->dev, connector->encoder_ids[0]); | ||
2499 | } | ||
2500 | EXPORT_SYMBOL(drm_atomic_helper_best_encoder); | ||
2501 | |||
2502 | /** | ||
2484 | * DOC: atomic state reset and initialization | 2503 | * DOC: atomic state reset and initialization |
2485 | * | 2504 | * |
2486 | * Both the drm core and the atomic helpers assume that there is always the full | 2505 | * Both the drm core and the atomic helpers assume that there is always the full |