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.c61
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
103static struct intel_dvo *enc_to_intel_dvo(struct drm_encoder *encoder) 103static 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
108static struct intel_dvo *intel_attached_dvo(struct drm_connector *connector) 108static 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
114static bool intel_dvo_connector_get_hw_state(struct intel_connector *connector) 113static 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,
159static void intel_disable_dvo(struct intel_encoder *encoder) 158static 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)
171static void intel_enable_dvo(struct intel_encoder *encoder) 170static 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
244static bool intel_dvo_mode_fixup(struct drm_encoder *encoder, 243static 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
275static void intel_dvo_mode_set(struct drm_encoder *encoder, 276static 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
335intel_dvo_detect(struct drm_connector *connector, bool force) 334intel_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
375static 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
380static const struct drm_connector_funcs intel_dvo_connector_funcs = { 376static 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
393static void intel_dvo_enc_destroy(struct drm_encoder *encoder) 389static 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