drm/i915/sdvo: Port the infoframe code to the shared infrastructure
authorDamien Lespiau <damien.lespiau@intel.com>
Tue, 6 Aug 2013 19:32:20 +0000 (20:32 +0100)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Thu, 8 Aug 2013 12:04:49 +0000 (14:04 +0200)
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Damien Lespiau <damien.lespiau@intel.com>
Signed-off-by: Paulo Zanoni <paulo.r.zanoni at intel.com>
Signed-off-by: Thierry Reding <thierry.reding at avionic-design.de>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/i915/intel_sdvo.c

index 47423f31f82be3e335ae0bf4081c4c256afa8d91..02f220b4e4a114acdff7d0a6e765400736d76ccc 100644 (file)
@@ -963,30 +963,32 @@ static bool intel_sdvo_write_infoframe(struct intel_sdvo *intel_sdvo,
 static bool intel_sdvo_set_avi_infoframe(struct intel_sdvo *intel_sdvo,
                                         const struct drm_display_mode *adjusted_mode)
 {
-       struct dip_infoframe avi_if = {
-               .type = DIP_TYPE_AVI,
-               .ver = DIP_VERSION_AVI,
-               .len = DIP_LEN_AVI,
-       };
-       uint8_t sdvo_data[4 + sizeof(avi_if.body.avi)];
-       struct intel_crtc *intel_crtc = to_intel_crtc(intel_sdvo->base.base.crtc);
+       uint8_t sdvo_data[HDMI_INFOFRAME_SIZE(AVI)];
+       struct drm_crtc *crtc = intel_sdvo->base.base.crtc;
+       struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
+       union hdmi_infoframe frame;
+       int ret;
+       ssize_t len;
+
+       ret = drm_hdmi_avi_infoframe_from_display_mode(&frame.avi,
+                                                      adjusted_mode);
+       if (ret < 0) {
+               DRM_ERROR("couldn't fill AVI infoframe\n");
+               return false;
+       }
 
        if (intel_sdvo->rgb_quant_range_selectable) {
                if (intel_crtc->config.limited_color_range)
-                       avi_if.body.avi.ITC_EC_Q_SC |= DIP_AVI_RGB_QUANT_RANGE_LIMITED;
+                       frame.avi.quantization_range =
+                               HDMI_QUANTIZATION_RANGE_LIMITED;
                else
-                       avi_if.body.avi.ITC_EC_Q_SC |= DIP_AVI_RGB_QUANT_RANGE_FULL;
+                       frame.avi.quantization_range =
+                               HDMI_QUANTIZATION_RANGE_FULL;
        }
 
-       avi_if.body.avi.VIC = drm_match_cea_mode(adjusted_mode);
-
-       intel_dip_infoframe_csum(&avi_if);
-
-       /* sdvo spec says that the ecc is handled by the hw, and it looks like
-        * we must not send the ecc field, either. */
-       memcpy(sdvo_data, &avi_if, 3);
-       sdvo_data[3] = avi_if.checksum;
-       memcpy(&sdvo_data[4], &avi_if.body, sizeof(avi_if.body.avi));
+       len = hdmi_infoframe_pack(&frame, sdvo_data, sizeof(sdvo_data));
+       if (len < 0)
+               return false;
 
        return intel_sdvo_write_infoframe(intel_sdvo, SDVO_HBUF_INDEX_AVI_IF,
                                          SDVO_HBUF_TX_VSYNC,