diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_dvo.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_dvo.c | 41 |
1 files changed, 27 insertions, 14 deletions
diff --git a/drivers/gpu/drm/i915/intel_dvo.c b/drivers/gpu/drm/i915/intel_dvo.c index 286baec979c8..47bdf9dad0d3 100644 --- a/drivers/gpu/drm/i915/intel_dvo.c +++ b/drivers/gpu/drm/i915/intel_dvo.c | |||
@@ -122,7 +122,7 @@ static struct intel_dvo *intel_attached_dvo(struct drm_connector *connector) | |||
122 | static bool intel_dvo_connector_get_hw_state(struct intel_connector *connector) | 122 | static bool intel_dvo_connector_get_hw_state(struct intel_connector *connector) |
123 | { | 123 | { |
124 | struct drm_device *dev = connector->base.dev; | 124 | struct drm_device *dev = connector->base.dev; |
125 | struct drm_i915_private *dev_priv = dev->dev_private; | 125 | struct drm_i915_private *dev_priv = to_i915(dev); |
126 | struct intel_dvo *intel_dvo = intel_attached_dvo(&connector->base); | 126 | struct intel_dvo *intel_dvo = intel_attached_dvo(&connector->base); |
127 | u32 tmp; | 127 | u32 tmp; |
128 | 128 | ||
@@ -138,7 +138,7 @@ static bool intel_dvo_get_hw_state(struct intel_encoder *encoder, | |||
138 | enum pipe *pipe) | 138 | enum pipe *pipe) |
139 | { | 139 | { |
140 | struct drm_device *dev = encoder->base.dev; | 140 | struct drm_device *dev = encoder->base.dev; |
141 | struct drm_i915_private *dev_priv = dev->dev_private; | 141 | struct drm_i915_private *dev_priv = to_i915(dev); |
142 | struct intel_dvo *intel_dvo = enc_to_dvo(encoder); | 142 | struct intel_dvo *intel_dvo = enc_to_dvo(encoder); |
143 | u32 tmp; | 143 | u32 tmp; |
144 | 144 | ||
@@ -155,7 +155,7 @@ static bool intel_dvo_get_hw_state(struct intel_encoder *encoder, | |||
155 | static void intel_dvo_get_config(struct intel_encoder *encoder, | 155 | static void intel_dvo_get_config(struct intel_encoder *encoder, |
156 | struct intel_crtc_state *pipe_config) | 156 | struct intel_crtc_state *pipe_config) |
157 | { | 157 | { |
158 | struct drm_i915_private *dev_priv = encoder->base.dev->dev_private; | 158 | struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); |
159 | struct intel_dvo *intel_dvo = enc_to_dvo(encoder); | 159 | struct intel_dvo *intel_dvo = enc_to_dvo(encoder); |
160 | u32 tmp, flags = 0; | 160 | u32 tmp, flags = 0; |
161 | 161 | ||
@@ -176,7 +176,7 @@ static void intel_dvo_get_config(struct intel_encoder *encoder, | |||
176 | 176 | ||
177 | static void intel_disable_dvo(struct intel_encoder *encoder) | 177 | static void intel_disable_dvo(struct intel_encoder *encoder) |
178 | { | 178 | { |
179 | struct drm_i915_private *dev_priv = encoder->base.dev->dev_private; | 179 | struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); |
180 | struct intel_dvo *intel_dvo = enc_to_dvo(encoder); | 180 | struct intel_dvo *intel_dvo = enc_to_dvo(encoder); |
181 | i915_reg_t dvo_reg = intel_dvo->dev.dvo_reg; | 181 | i915_reg_t dvo_reg = intel_dvo->dev.dvo_reg; |
182 | u32 temp = I915_READ(dvo_reg); | 182 | u32 temp = I915_READ(dvo_reg); |
@@ -188,7 +188,7 @@ static void intel_disable_dvo(struct intel_encoder *encoder) | |||
188 | 188 | ||
189 | static void intel_enable_dvo(struct intel_encoder *encoder) | 189 | static void intel_enable_dvo(struct intel_encoder *encoder) |
190 | { | 190 | { |
191 | struct drm_i915_private *dev_priv = encoder->base.dev->dev_private; | 191 | struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); |
192 | struct intel_dvo *intel_dvo = enc_to_dvo(encoder); | 192 | struct intel_dvo *intel_dvo = enc_to_dvo(encoder); |
193 | struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc); | 193 | struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc); |
194 | i915_reg_t dvo_reg = intel_dvo->dev.dvo_reg; | 194 | i915_reg_t dvo_reg = intel_dvo->dev.dvo_reg; |
@@ -256,7 +256,7 @@ static bool intel_dvo_compute_config(struct intel_encoder *encoder, | |||
256 | static void intel_dvo_pre_enable(struct intel_encoder *encoder) | 256 | static void intel_dvo_pre_enable(struct intel_encoder *encoder) |
257 | { | 257 | { |
258 | struct drm_device *dev = encoder->base.dev; | 258 | struct drm_device *dev = encoder->base.dev; |
259 | struct drm_i915_private *dev_priv = dev->dev_private; | 259 | struct drm_i915_private *dev_priv = to_i915(dev); |
260 | struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc); | 260 | struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc); |
261 | const struct drm_display_mode *adjusted_mode = &crtc->config->base.adjusted_mode; | 261 | const struct drm_display_mode *adjusted_mode = &crtc->config->base.adjusted_mode; |
262 | struct intel_dvo *intel_dvo = enc_to_dvo(encoder); | 262 | struct intel_dvo *intel_dvo = enc_to_dvo(encoder); |
@@ -305,7 +305,7 @@ intel_dvo_detect(struct drm_connector *connector, bool force) | |||
305 | 305 | ||
306 | static int intel_dvo_get_modes(struct drm_connector *connector) | 306 | static int intel_dvo_get_modes(struct drm_connector *connector) |
307 | { | 307 | { |
308 | struct drm_i915_private *dev_priv = connector->dev->dev_private; | 308 | struct drm_i915_private *dev_priv = to_i915(connector->dev); |
309 | const struct drm_display_mode *fixed_mode = | 309 | const struct drm_display_mode *fixed_mode = |
310 | to_intel_connector(connector)->panel.fixed_mode; | 310 | to_intel_connector(connector)->panel.fixed_mode; |
311 | 311 | ||
@@ -341,6 +341,8 @@ static void intel_dvo_destroy(struct drm_connector *connector) | |||
341 | static const struct drm_connector_funcs intel_dvo_connector_funcs = { | 341 | static const struct drm_connector_funcs intel_dvo_connector_funcs = { |
342 | .dpms = drm_atomic_helper_connector_dpms, | 342 | .dpms = drm_atomic_helper_connector_dpms, |
343 | .detect = intel_dvo_detect, | 343 | .detect = intel_dvo_detect, |
344 | .late_register = intel_connector_register, | ||
345 | .early_unregister = intel_connector_unregister, | ||
344 | .destroy = intel_dvo_destroy, | 346 | .destroy = intel_dvo_destroy, |
345 | .fill_modes = drm_helper_probe_single_connector_modes, | 347 | .fill_modes = drm_helper_probe_single_connector_modes, |
346 | .atomic_get_property = intel_connector_atomic_get_property, | 348 | .atomic_get_property = intel_connector_atomic_get_property, |
@@ -351,7 +353,6 @@ static const struct drm_connector_funcs intel_dvo_connector_funcs = { | |||
351 | static const struct drm_connector_helper_funcs intel_dvo_connector_helper_funcs = { | 353 | static const struct drm_connector_helper_funcs intel_dvo_connector_helper_funcs = { |
352 | .mode_valid = intel_dvo_mode_valid, | 354 | .mode_valid = intel_dvo_mode_valid, |
353 | .get_modes = intel_dvo_get_modes, | 355 | .get_modes = intel_dvo_get_modes, |
354 | .best_encoder = intel_best_encoder, | ||
355 | }; | 356 | }; |
356 | 357 | ||
357 | static void intel_dvo_enc_destroy(struct drm_encoder *encoder) | 358 | static void intel_dvo_enc_destroy(struct drm_encoder *encoder) |
@@ -378,7 +379,7 @@ static struct drm_display_mode * | |||
378 | intel_dvo_get_current_mode(struct drm_connector *connector) | 379 | intel_dvo_get_current_mode(struct drm_connector *connector) |
379 | { | 380 | { |
380 | struct drm_device *dev = connector->dev; | 381 | struct drm_device *dev = connector->dev; |
381 | struct drm_i915_private *dev_priv = dev->dev_private; | 382 | struct drm_i915_private *dev_priv = to_i915(dev); |
382 | struct intel_dvo *intel_dvo = intel_attached_dvo(connector); | 383 | struct intel_dvo *intel_dvo = intel_attached_dvo(connector); |
383 | uint32_t dvo_val = I915_READ(intel_dvo->dev.dvo_reg); | 384 | uint32_t dvo_val = I915_READ(intel_dvo->dev.dvo_reg); |
384 | struct drm_display_mode *mode = NULL; | 385 | struct drm_display_mode *mode = NULL; |
@@ -406,9 +407,21 @@ intel_dvo_get_current_mode(struct drm_connector *connector) | |||
406 | return mode; | 407 | return mode; |
407 | } | 408 | } |
408 | 409 | ||
410 | static char intel_dvo_port_name(i915_reg_t dvo_reg) | ||
411 | { | ||
412 | if (i915_mmio_reg_equal(dvo_reg, DVOA)) | ||
413 | return 'A'; | ||
414 | else if (i915_mmio_reg_equal(dvo_reg, DVOB)) | ||
415 | return 'B'; | ||
416 | else if (i915_mmio_reg_equal(dvo_reg, DVOC)) | ||
417 | return 'C'; | ||
418 | else | ||
419 | return '?'; | ||
420 | } | ||
421 | |||
409 | void intel_dvo_init(struct drm_device *dev) | 422 | void intel_dvo_init(struct drm_device *dev) |
410 | { | 423 | { |
411 | struct drm_i915_private *dev_priv = dev->dev_private; | 424 | struct drm_i915_private *dev_priv = to_i915(dev); |
412 | struct intel_encoder *intel_encoder; | 425 | struct intel_encoder *intel_encoder; |
413 | struct intel_dvo *intel_dvo; | 426 | struct intel_dvo *intel_dvo; |
414 | struct intel_connector *intel_connector; | 427 | struct intel_connector *intel_connector; |
@@ -428,8 +441,6 @@ void intel_dvo_init(struct drm_device *dev) | |||
428 | intel_dvo->attached_connector = intel_connector; | 441 | intel_dvo->attached_connector = intel_connector; |
429 | 442 | ||
430 | intel_encoder = &intel_dvo->base; | 443 | intel_encoder = &intel_dvo->base; |
431 | drm_encoder_init(dev, &intel_encoder->base, | ||
432 | &intel_dvo_enc_funcs, encoder_type, NULL); | ||
433 | 444 | ||
434 | intel_encoder->disable = intel_disable_dvo; | 445 | intel_encoder->disable = intel_disable_dvo; |
435 | intel_encoder->enable = intel_enable_dvo; | 446 | intel_encoder->enable = intel_enable_dvo; |
@@ -438,7 +449,6 @@ void intel_dvo_init(struct drm_device *dev) | |||
438 | intel_encoder->compute_config = intel_dvo_compute_config; | 449 | intel_encoder->compute_config = intel_dvo_compute_config; |
439 | intel_encoder->pre_enable = intel_dvo_pre_enable; | 450 | intel_encoder->pre_enable = intel_dvo_pre_enable; |
440 | intel_connector->get_hw_state = intel_dvo_connector_get_hw_state; | 451 | intel_connector->get_hw_state = intel_dvo_connector_get_hw_state; |
441 | intel_connector->unregister = intel_connector_unregister; | ||
442 | 452 | ||
443 | /* Now, try to find a controller */ | 453 | /* Now, try to find a controller */ |
444 | for (i = 0; i < ARRAY_SIZE(intel_dvo_devices); i++) { | 454 | for (i = 0; i < ARRAY_SIZE(intel_dvo_devices); i++) { |
@@ -496,6 +506,10 @@ void intel_dvo_init(struct drm_device *dev) | |||
496 | if (!dvoinit) | 506 | if (!dvoinit) |
497 | continue; | 507 | continue; |
498 | 508 | ||
509 | drm_encoder_init(dev, &intel_encoder->base, | ||
510 | &intel_dvo_enc_funcs, encoder_type, | ||
511 | "DVO %c", intel_dvo_port_name(dvo->dvo_reg)); | ||
512 | |||
499 | intel_encoder->type = INTEL_OUTPUT_DVO; | 513 | intel_encoder->type = INTEL_OUTPUT_DVO; |
500 | intel_encoder->crtc_mask = (1 << 0) | (1 << 1); | 514 | intel_encoder->crtc_mask = (1 << 0) | (1 << 1); |
501 | switch (dvo->type) { | 515 | switch (dvo->type) { |
@@ -537,7 +551,6 @@ void intel_dvo_init(struct drm_device *dev) | |||
537 | intel_dvo->panel_wants_dither = true; | 551 | intel_dvo->panel_wants_dither = true; |
538 | } | 552 | } |
539 | 553 | ||
540 | drm_connector_register(connector); | ||
541 | return; | 554 | return; |
542 | } | 555 | } |
543 | 556 | ||