aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_hdmi.c
diff options
context:
space:
mode:
authorPaulo Zanoni <paulo.r.zanoni@intel.com>2012-05-04 16:18:24 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2012-05-08 08:23:34 -0400
commitfdf1250aaae12625ee2abaf2ef22def0a4cdf71b (patch)
tree733ff97b4760f27e8e3be39f91058578c0c5c582 /drivers/gpu/drm/i915/intel_hdmi.c
parentd47d7cb824ce54af33110a02164e9471a8a9c560 (diff)
drm/i915: split ironlake_write_infoframe into ibx_ and cpt_
The registers are on the PCH, so use the PCH name instead of the CPU name. Also, the way this function is implemented is really only for CPT and PPT. For now, both functions have the same implementations: the next patch will fix ibx_write_infoframe. Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915/intel_hdmi.c')
-rw-r--r--drivers/gpu/drm/i915/intel_hdmi.c52
1 files changed, 48 insertions, 4 deletions
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c
index 4a4ee8b25f2f..e65ebc2d3ad9 100644
--- a/drivers/gpu/drm/i915/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/intel_hdmi.c
@@ -170,8 +170,48 @@ static void i9xx_write_infoframe(struct drm_encoder *encoder,
170 I915_WRITE(VIDEO_DIP_CTL, val); 170 I915_WRITE(VIDEO_DIP_CTL, val);
171} 171}
172 172
173static void ironlake_write_infoframe(struct drm_encoder *encoder, 173static void ibx_write_infoframe(struct drm_encoder *encoder,
174 struct dip_infoframe *frame) 174 struct dip_infoframe *frame)
175{
176 uint32_t *data = (uint32_t *)frame;
177 struct drm_device *dev = encoder->dev;
178 struct drm_i915_private *dev_priv = dev->dev_private;
179 struct drm_crtc *crtc = encoder->crtc;
180 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
181 int reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
182 unsigned i, len = DIP_HEADER_SIZE + frame->len;
183 u32 val = I915_READ(reg);
184
185 intel_wait_for_vblank(dev, intel_crtc->pipe);
186
187 val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
188 val |= intel_infoframe_index(frame);
189
190 /* The DIP control register spec says that we need to update the AVI
191 * infoframe without clearing its enable bit */
192 if (frame->type == DIP_TYPE_AVI)
193 val |= VIDEO_DIP_ENABLE_AVI;
194 else
195 val &= ~intel_infoframe_enable(frame);
196
197 val |= VIDEO_DIP_ENABLE;
198
199 I915_WRITE(reg, val);
200
201 for (i = 0; i < len; i += 4) {
202 I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), *data);
203 data++;
204 }
205
206 val |= intel_infoframe_enable(frame);
207 val &= ~VIDEO_DIP_FREQ_MASK;
208 val |= intel_infoframe_frequency(frame);
209
210 I915_WRITE(reg, val);
211}
212
213static void cpt_write_infoframe(struct drm_encoder *encoder,
214 struct dip_infoframe *frame)
175{ 215{
176 uint32_t *data = (uint32_t *)frame; 216 uint32_t *data = (uint32_t *)frame;
177 struct drm_device *dev = encoder->dev; 217 struct drm_device *dev = encoder->dev;
@@ -627,8 +667,12 @@ void intel_hdmi_init(struct drm_device *dev, int sdvox_reg)
627 intel_hdmi->write_infoframe = vlv_write_infoframe; 667 intel_hdmi->write_infoframe = vlv_write_infoframe;
628 for_each_pipe(i) 668 for_each_pipe(i)
629 I915_WRITE(VLV_TVIDEO_DIP_CTL(i), 0); 669 I915_WRITE(VLV_TVIDEO_DIP_CTL(i), 0);
630 } else { 670 } else if (HAS_PCH_IBX(dev)) {
631 intel_hdmi->write_infoframe = ironlake_write_infoframe; 671 intel_hdmi->write_infoframe = ibx_write_infoframe;
672 for_each_pipe(i)
673 I915_WRITE(TVIDEO_DIP_CTL(i), 0);
674 } else {
675 intel_hdmi->write_infoframe = cpt_write_infoframe;
632 for_each_pipe(i) 676 for_each_pipe(i)
633 I915_WRITE(TVIDEO_DIP_CTL(i), 0); 677 I915_WRITE(TVIDEO_DIP_CTL(i), 0);
634 } 678 }