diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_sdvo.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_sdvo.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c index 7d3f238e8265..125228e77c50 100644 --- a/drivers/gpu/drm/i915/intel_sdvo.c +++ b/drivers/gpu/drm/i915/intel_sdvo.c | |||
@@ -887,17 +887,24 @@ static bool intel_sdvo_set_avi_infoframe(struct intel_sdvo *intel_sdvo) | |||
887 | }; | 887 | }; |
888 | uint8_t tx_rate = SDVO_HBUF_TX_VSYNC; | 888 | uint8_t tx_rate = SDVO_HBUF_TX_VSYNC; |
889 | uint8_t set_buf_index[2] = { 1, 0 }; | 889 | uint8_t set_buf_index[2] = { 1, 0 }; |
890 | uint64_t *data = (uint64_t *)&avi_if; | 890 | uint8_t sdvo_data[4 + sizeof(avi_if.body.avi)]; |
891 | uint64_t *data = (uint64_t *)sdvo_data; | ||
891 | unsigned i; | 892 | unsigned i; |
892 | 893 | ||
893 | intel_dip_infoframe_csum(&avi_if); | 894 | intel_dip_infoframe_csum(&avi_if); |
894 | 895 | ||
896 | /* sdvo spec says that the ecc is handled by the hw, and it looks like | ||
897 | * we must not send the ecc field, either. */ | ||
898 | memcpy(sdvo_data, &avi_if, 3); | ||
899 | sdvo_data[3] = avi_if.checksum; | ||
900 | memcpy(&sdvo_data[4], &avi_if.body, sizeof(avi_if.body.avi)); | ||
901 | |||
895 | if (!intel_sdvo_set_value(intel_sdvo, | 902 | if (!intel_sdvo_set_value(intel_sdvo, |
896 | SDVO_CMD_SET_HBUF_INDEX, | 903 | SDVO_CMD_SET_HBUF_INDEX, |
897 | set_buf_index, 2)) | 904 | set_buf_index, 2)) |
898 | return false; | 905 | return false; |
899 | 906 | ||
900 | for (i = 0; i < sizeof(avi_if); i += 8) { | 907 | for (i = 0; i < sizeof(sdvo_data); i += 8) { |
901 | if (!intel_sdvo_set_value(intel_sdvo, | 908 | if (!intel_sdvo_set_value(intel_sdvo, |
902 | SDVO_CMD_SET_HBUF_DATA, | 909 | SDVO_CMD_SET_HBUF_DATA, |
903 | data, 8)) | 910 | data, 8)) |