aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_dvo.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/i915/intel_dvo.c')
-rw-r--r--drivers/gpu/drm/i915/intel_dvo.c41
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)
122static bool intel_dvo_connector_get_hw_state(struct intel_connector *connector) 122static 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,
155static void intel_dvo_get_config(struct intel_encoder *encoder, 155static 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
177static void intel_disable_dvo(struct intel_encoder *encoder) 177static 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
189static void intel_enable_dvo(struct intel_encoder *encoder) 189static 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,
256static void intel_dvo_pre_enable(struct intel_encoder *encoder) 256static 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
306static int intel_dvo_get_modes(struct drm_connector *connector) 306static 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)
341static const struct drm_connector_funcs intel_dvo_connector_funcs = { 341static 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 = {
351static const struct drm_connector_helper_funcs intel_dvo_connector_helper_funcs = { 353static 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
357static void intel_dvo_enc_destroy(struct drm_encoder *encoder) 358static void intel_dvo_enc_destroy(struct drm_encoder *encoder)
@@ -378,7 +379,7 @@ static struct drm_display_mode *
378intel_dvo_get_current_mode(struct drm_connector *connector) 379intel_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
410static 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
409void intel_dvo_init(struct drm_device *dev) 422void 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