aboutsummaryrefslogtreecommitdiff
path: root/linux-core/drm_crtc_helper.c
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2008-06-02 11:44:35 +1000
committerDave Airlie <airlied@redhat.com>2008-06-02 11:44:35 +1000
commit46c78a2223802b9105a87b7125fd4872ab69c4ca (patch)
tree522ace3dc84b245e3eb3a0b2615bfe351441f0a9 /linux-core/drm_crtc_helper.c
parent0dd000b578adec6ff101c957bce7dc9a32b76713 (diff)
drm/modesetting: add best encoder finding for modesetting
This asks the driver to suggest the best encoder for the connector during the pick crtcs stage. Need to also do this during mode setting stages
Diffstat (limited to 'linux-core/drm_crtc_helper.c')
-rw-r--r--linux-core/drm_crtc_helper.c28
1 files changed, 21 insertions, 7 deletions
diff --git a/linux-core/drm_crtc_helper.c b/linux-core/drm_crtc_helper.c
index f1a72707..a4168f68 100644
--- a/linux-core/drm_crtc_helper.c
+++ b/linux-core/drm_crtc_helper.c
@@ -208,10 +208,17 @@ static void drm_pick_crtcs (struct drm_device *dev)
struct drm_encoder *encoder, *encoder_equal;
struct drm_crtc *crtc;
struct drm_display_mode *des_mode = NULL, *modes, *modes_equal;
+ struct drm_connector_helper_funcs *connector_funcs;
int found;
+ /* clean out all the encoder/crtc combos */
+ list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
+ encoder->crtc = NULL;
+ }
+
list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
- connector->encoder->crtc = NULL;
+ connector_funcs = connector->helper_private;
+ connector->encoder = NULL;
/* Don't hook up connectors that are disconnected ??
*
@@ -249,7 +256,11 @@ static void drm_pick_crtcs (struct drm_device *dev)
}
}
- encoder = connector->encoder;
+ encoder = connector_funcs->best_encoder(connector);
+ if (!encoder)
+ continue;
+
+ connector->encoder = encoder;
c = -1;
list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
@@ -259,12 +270,12 @@ static void drm_pick_crtcs (struct drm_device *dev)
if ((encoder->possible_crtcs & (1 << c)) == 0)
continue;
- list_for_each_entry(connector_equal, &dev->mode_config.connector_list, head) {
- if (connector->id == connector_equal->id)
+ list_for_each_entry(encoder_equal, &dev->mode_config.encoder_list, head) {
+ if (encoder->id == encoder_equal->id)
continue;
/* Find out if crtc has been assigned before */
- if (connector_equal->encoder->crtc == crtc)
+ if (encoder_equal->crtc == crtc)
assigned = 1;
}
@@ -281,6 +292,9 @@ static void drm_pick_crtcs (struct drm_device *dev)
encoder_equal = connector_equal->encoder;
+ if (!encoder_equal)
+ continue;
+
list_for_each_entry(modes, &connector->modes, head) {
list_for_each_entry(modes_equal, &connector_equal->modes, head) {
if (drm_mode_equal (modes, modes_equal)) {
@@ -301,8 +315,8 @@ clone:
continue;
/* Found a CRTC to attach to, do it ! */
- connector->encoder->crtc = crtc;
- connector->encoder->crtc->desired_mode = des_mode;
+ encoder->crtc = crtc;
+ encoder->crtc->desired_mode = des_mode;
connector->initial_x = 0;
connector->initial_y = 0;
DRM_DEBUG("Desired mode for CRTC %d is 0x%x:%s\n",c,des_mode->mode_id, des_mode->name);