drm/i915: fixup infoframe support for sdvo
[cascardo/linux.git] / drivers / gpu / drm / i915 / intel_sdvo.c
index 7d3f238..125228e 100644 (file)
@@ -887,17 +887,24 @@ static bool intel_sdvo_set_avi_infoframe(struct intel_sdvo *intel_sdvo)
        };
        uint8_t tx_rate = SDVO_HBUF_TX_VSYNC;
        uint8_t set_buf_index[2] = { 1, 0 };
-       uint64_t *data = (uint64_t *)&avi_if;
+       uint8_t sdvo_data[4 + sizeof(avi_if.body.avi)];
+       uint64_t *data = (uint64_t *)sdvo_data;
        unsigned i;
 
        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));
+
        if (!intel_sdvo_set_value(intel_sdvo,
                                  SDVO_CMD_SET_HBUF_INDEX,
                                  set_buf_index, 2))
                return false;
 
-       for (i = 0; i < sizeof(avi_if); i += 8) {
+       for (i = 0; i < sizeof(sdvo_data); i += 8) {
                if (!intel_sdvo_set_value(intel_sdvo,
                                          SDVO_CMD_SET_HBUF_DATA,
                                          data, 8))