diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_dvo.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_dvo.c | 61 |
1 files changed, 28 insertions, 33 deletions
diff --git a/drivers/gpu/drm/i915/intel_dvo.c b/drivers/gpu/drm/i915/intel_dvo.c index eb2020eb2b7e..406303b509c1 100644 --- a/drivers/gpu/drm/i915/intel_dvo.c +++ b/drivers/gpu/drm/i915/intel_dvo.c | |||
@@ -100,15 +100,14 @@ struct intel_dvo { | |||
100 | bool panel_wants_dither; | 100 | bool panel_wants_dither; |
101 | }; | 101 | }; |
102 | 102 | ||
103 | static struct intel_dvo *enc_to_intel_dvo(struct drm_encoder *encoder) | 103 | static struct intel_dvo *enc_to_dvo(struct intel_encoder *encoder) |
104 | { | 104 | { |
105 | return container_of(encoder, struct intel_dvo, base.base); | 105 | return container_of(encoder, struct intel_dvo, base); |
106 | } | 106 | } |
107 | 107 | ||
108 | static struct intel_dvo *intel_attached_dvo(struct drm_connector *connector) | 108 | static struct intel_dvo *intel_attached_dvo(struct drm_connector *connector) |
109 | { | 109 | { |
110 | return container_of(intel_attached_encoder(connector), | 110 | return enc_to_dvo(intel_attached_encoder(connector)); |
111 | struct intel_dvo, base); | ||
112 | } | 111 | } |
113 | 112 | ||
114 | static bool intel_dvo_connector_get_hw_state(struct intel_connector *connector) | 113 | static bool intel_dvo_connector_get_hw_state(struct intel_connector *connector) |
@@ -123,7 +122,7 @@ static bool intel_dvo_get_hw_state(struct intel_encoder *encoder, | |||
123 | { | 122 | { |
124 | struct drm_device *dev = encoder->base.dev; | 123 | struct drm_device *dev = encoder->base.dev; |
125 | struct drm_i915_private *dev_priv = dev->dev_private; | 124 | struct drm_i915_private *dev_priv = dev->dev_private; |
126 | struct intel_dvo *intel_dvo = enc_to_intel_dvo(&encoder->base); | 125 | struct intel_dvo *intel_dvo = enc_to_dvo(encoder); |
127 | u32 tmp; | 126 | u32 tmp; |
128 | 127 | ||
129 | tmp = I915_READ(intel_dvo->dev.dvo_reg); | 128 | tmp = I915_READ(intel_dvo->dev.dvo_reg); |
@@ -140,7 +139,7 @@ static void intel_dvo_get_config(struct intel_encoder *encoder, | |||
140 | struct intel_crtc_config *pipe_config) | 139 | struct intel_crtc_config *pipe_config) |
141 | { | 140 | { |
142 | struct drm_i915_private *dev_priv = encoder->base.dev->dev_private; | 141 | struct drm_i915_private *dev_priv = encoder->base.dev->dev_private; |
143 | struct intel_dvo *intel_dvo = enc_to_intel_dvo(&encoder->base); | 142 | struct intel_dvo *intel_dvo = enc_to_dvo(encoder); |
144 | u32 tmp, flags = 0; | 143 | u32 tmp, flags = 0; |
145 | 144 | ||
146 | tmp = I915_READ(intel_dvo->dev.dvo_reg); | 145 | tmp = I915_READ(intel_dvo->dev.dvo_reg); |
@@ -159,7 +158,7 @@ static void intel_dvo_get_config(struct intel_encoder *encoder, | |||
159 | static void intel_disable_dvo(struct intel_encoder *encoder) | 158 | static void intel_disable_dvo(struct intel_encoder *encoder) |
160 | { | 159 | { |
161 | struct drm_i915_private *dev_priv = encoder->base.dev->dev_private; | 160 | struct drm_i915_private *dev_priv = encoder->base.dev->dev_private; |
162 | struct intel_dvo *intel_dvo = enc_to_intel_dvo(&encoder->base); | 161 | struct intel_dvo *intel_dvo = enc_to_dvo(encoder); |
163 | u32 dvo_reg = intel_dvo->dev.dvo_reg; | 162 | u32 dvo_reg = intel_dvo->dev.dvo_reg; |
164 | u32 temp = I915_READ(dvo_reg); | 163 | u32 temp = I915_READ(dvo_reg); |
165 | 164 | ||
@@ -171,7 +170,7 @@ static void intel_disable_dvo(struct intel_encoder *encoder) | |||
171 | static void intel_enable_dvo(struct intel_encoder *encoder) | 170 | static void intel_enable_dvo(struct intel_encoder *encoder) |
172 | { | 171 | { |
173 | struct drm_i915_private *dev_priv = encoder->base.dev->dev_private; | 172 | struct drm_i915_private *dev_priv = encoder->base.dev->dev_private; |
174 | struct intel_dvo *intel_dvo = enc_to_intel_dvo(&encoder->base); | 173 | struct intel_dvo *intel_dvo = enc_to_dvo(encoder); |
175 | u32 dvo_reg = intel_dvo->dev.dvo_reg; | 174 | u32 dvo_reg = intel_dvo->dev.dvo_reg; |
176 | u32 temp = I915_READ(dvo_reg); | 175 | u32 temp = I915_READ(dvo_reg); |
177 | 176 | ||
@@ -241,11 +240,11 @@ static int intel_dvo_mode_valid(struct drm_connector *connector, | |||
241 | return intel_dvo->dev.dev_ops->mode_valid(&intel_dvo->dev, mode); | 240 | return intel_dvo->dev.dev_ops->mode_valid(&intel_dvo->dev, mode); |
242 | } | 241 | } |
243 | 242 | ||
244 | static bool intel_dvo_mode_fixup(struct drm_encoder *encoder, | 243 | static bool intel_dvo_compute_config(struct intel_encoder *encoder, |
245 | const struct drm_display_mode *mode, | 244 | struct intel_crtc_config *pipe_config) |
246 | struct drm_display_mode *adjusted_mode) | ||
247 | { | 245 | { |
248 | struct intel_dvo *intel_dvo = enc_to_intel_dvo(encoder); | 246 | struct intel_dvo *intel_dvo = enc_to_dvo(encoder); |
247 | struct drm_display_mode *adjusted_mode = &pipe_config->adjusted_mode; | ||
249 | 248 | ||
250 | /* If we have timings from the BIOS for the panel, put them in | 249 | /* If we have timings from the BIOS for the panel, put them in |
251 | * to the adjusted mode. The CRTC will be set up for this mode, | 250 | * to the adjusted mode. The CRTC will be set up for this mode, |
@@ -267,23 +266,23 @@ static bool intel_dvo_mode_fixup(struct drm_encoder *encoder, | |||
267 | } | 266 | } |
268 | 267 | ||
269 | if (intel_dvo->dev.dev_ops->mode_fixup) | 268 | if (intel_dvo->dev.dev_ops->mode_fixup) |
270 | return intel_dvo->dev.dev_ops->mode_fixup(&intel_dvo->dev, mode, adjusted_mode); | 269 | return intel_dvo->dev.dev_ops->mode_fixup(&intel_dvo->dev, |
270 | &pipe_config->requested_mode, | ||
271 | adjusted_mode); | ||
271 | 272 | ||
272 | return true; | 273 | return true; |
273 | } | 274 | } |
274 | 275 | ||
275 | static void intel_dvo_mode_set(struct drm_encoder *encoder, | 276 | static void intel_dvo_mode_set(struct intel_encoder *encoder) |
276 | struct drm_display_mode *mode, | ||
277 | struct drm_display_mode *adjusted_mode) | ||
278 | { | 277 | { |
279 | struct drm_device *dev = encoder->dev; | 278 | struct drm_device *dev = encoder->base.dev; |
280 | struct drm_i915_private *dev_priv = dev->dev_private; | 279 | struct drm_i915_private *dev_priv = dev->dev_private; |
281 | struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc); | 280 | struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc); |
282 | struct intel_dvo *intel_dvo = enc_to_intel_dvo(encoder); | 281 | struct drm_display_mode *adjusted_mode = &crtc->config.adjusted_mode; |
283 | int pipe = intel_crtc->pipe; | 282 | struct intel_dvo *intel_dvo = enc_to_dvo(encoder); |
283 | int pipe = crtc->pipe; | ||
284 | u32 dvo_val; | 284 | u32 dvo_val; |
285 | u32 dvo_reg = intel_dvo->dev.dvo_reg, dvo_srcdim_reg; | 285 | u32 dvo_reg = intel_dvo->dev.dvo_reg, dvo_srcdim_reg; |
286 | int dpll_reg = DPLL(pipe); | ||
287 | 286 | ||
288 | switch (dvo_reg) { | 287 | switch (dvo_reg) { |
289 | case DVOA: | 288 | case DVOA: |
@@ -298,7 +297,9 @@ static void intel_dvo_mode_set(struct drm_encoder *encoder, | |||
298 | break; | 297 | break; |
299 | } | 298 | } |
300 | 299 | ||
301 | intel_dvo->dev.dev_ops->mode_set(&intel_dvo->dev, mode, adjusted_mode); | 300 | intel_dvo->dev.dev_ops->mode_set(&intel_dvo->dev, |
301 | &crtc->config.requested_mode, | ||
302 | adjusted_mode); | ||
302 | 303 | ||
303 | /* Save the data order, since I don't know what it should be set to. */ | 304 | /* Save the data order, since I don't know what it should be set to. */ |
304 | dvo_val = I915_READ(dvo_reg) & | 305 | dvo_val = I915_READ(dvo_reg) & |
@@ -314,8 +315,6 @@ static void intel_dvo_mode_set(struct drm_encoder *encoder, | |||
314 | if (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC) | 315 | if (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC) |
315 | dvo_val |= DVO_VSYNC_ACTIVE_HIGH; | 316 | dvo_val |= DVO_VSYNC_ACTIVE_HIGH; |
316 | 317 | ||
317 | I915_WRITE(dpll_reg, I915_READ(dpll_reg) | DPLL_DVO_HIGH_SPEED); | ||
318 | |||
319 | /*I915_WRITE(DVOB_SRCDIM, | 318 | /*I915_WRITE(DVOB_SRCDIM, |
320 | (adjusted_mode->hdisplay << DVO_SRCDIM_HORIZONTAL_SHIFT) | | 319 | (adjusted_mode->hdisplay << DVO_SRCDIM_HORIZONTAL_SHIFT) | |
321 | (adjusted_mode->VDisplay << DVO_SRCDIM_VERTICAL_SHIFT));*/ | 320 | (adjusted_mode->VDisplay << DVO_SRCDIM_VERTICAL_SHIFT));*/ |
@@ -335,6 +334,8 @@ static enum drm_connector_status | |||
335 | intel_dvo_detect(struct drm_connector *connector, bool force) | 334 | intel_dvo_detect(struct drm_connector *connector, bool force) |
336 | { | 335 | { |
337 | struct intel_dvo *intel_dvo = intel_attached_dvo(connector); | 336 | struct intel_dvo *intel_dvo = intel_attached_dvo(connector); |
337 | DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n", | ||
338 | connector->base.id, drm_get_connector_name(connector)); | ||
338 | return intel_dvo->dev.dev_ops->detect(&intel_dvo->dev); | 339 | return intel_dvo->dev.dev_ops->detect(&intel_dvo->dev); |
339 | } | 340 | } |
340 | 341 | ||
@@ -372,11 +373,6 @@ static void intel_dvo_destroy(struct drm_connector *connector) | |||
372 | kfree(connector); | 373 | kfree(connector); |
373 | } | 374 | } |
374 | 375 | ||
375 | static const struct drm_encoder_helper_funcs intel_dvo_helper_funcs = { | ||
376 | .mode_fixup = intel_dvo_mode_fixup, | ||
377 | .mode_set = intel_dvo_mode_set, | ||
378 | }; | ||
379 | |||
380 | static const struct drm_connector_funcs intel_dvo_connector_funcs = { | 376 | static const struct drm_connector_funcs intel_dvo_connector_funcs = { |
381 | .dpms = intel_dvo_dpms, | 377 | .dpms = intel_dvo_dpms, |
382 | .detect = intel_dvo_detect, | 378 | .detect = intel_dvo_detect, |
@@ -392,7 +388,7 @@ static const struct drm_connector_helper_funcs intel_dvo_connector_helper_funcs | |||
392 | 388 | ||
393 | static void intel_dvo_enc_destroy(struct drm_encoder *encoder) | 389 | static void intel_dvo_enc_destroy(struct drm_encoder *encoder) |
394 | { | 390 | { |
395 | struct intel_dvo *intel_dvo = enc_to_intel_dvo(encoder); | 391 | struct intel_dvo *intel_dvo = enc_to_dvo(to_intel_encoder(encoder)); |
396 | 392 | ||
397 | if (intel_dvo->dev.dev_ops->destroy) | 393 | if (intel_dvo->dev.dev_ops->destroy) |
398 | intel_dvo->dev.dev_ops->destroy(&intel_dvo->dev); | 394 | intel_dvo->dev.dev_ops->destroy(&intel_dvo->dev); |
@@ -471,6 +467,8 @@ void intel_dvo_init(struct drm_device *dev) | |||
471 | intel_encoder->enable = intel_enable_dvo; | 467 | intel_encoder->enable = intel_enable_dvo; |
472 | intel_encoder->get_hw_state = intel_dvo_get_hw_state; | 468 | intel_encoder->get_hw_state = intel_dvo_get_hw_state; |
473 | intel_encoder->get_config = intel_dvo_get_config; | 469 | intel_encoder->get_config = intel_dvo_get_config; |
470 | intel_encoder->compute_config = intel_dvo_compute_config; | ||
471 | intel_encoder->mode_set = intel_dvo_mode_set; | ||
474 | intel_connector->get_hw_state = intel_dvo_connector_get_hw_state; | 472 | intel_connector->get_hw_state = intel_dvo_connector_get_hw_state; |
475 | 473 | ||
476 | /* Now, try to find a controller */ | 474 | /* Now, try to find a controller */ |
@@ -537,9 +535,6 @@ void intel_dvo_init(struct drm_device *dev) | |||
537 | connector->interlace_allowed = false; | 535 | connector->interlace_allowed = false; |
538 | connector->doublescan_allowed = false; | 536 | connector->doublescan_allowed = false; |
539 | 537 | ||
540 | drm_encoder_helper_add(&intel_encoder->base, | ||
541 | &intel_dvo_helper_funcs); | ||
542 | |||
543 | intel_connector_attach_encoder(intel_connector, intel_encoder); | 538 | intel_connector_attach_encoder(intel_connector, intel_encoder); |
544 | if (dvo->type == INTEL_DVO_CHIP_LVDS) { | 539 | if (dvo->type == INTEL_DVO_CHIP_LVDS) { |
545 | /* For our LVDS chipsets, we should hopefully be able | 540 | /* For our LVDS chipsets, we should hopefully be able |