|
@@ -4838,6 +4838,7 @@ drm_hdmi_avi_infoframe_from_display_mode(struct hdmi_avi_infoframe *frame,
|
|
|
const struct drm_display_mode *mode,
|
|
|
bool is_hdmi2_sink)
|
|
|
{
|
|
|
+ enum hdmi_picture_aspect picture_aspect;
|
|
|
int err;
|
|
|
|
|
|
if (!frame || !mode)
|
|
@@ -4880,13 +4881,23 @@ drm_hdmi_avi_infoframe_from_display_mode(struct hdmi_avi_infoframe *frame,
|
|
|
* Populate picture aspect ratio from either
|
|
|
* user input (if specified) or from the CEA mode list.
|
|
|
*/
|
|
|
- if (mode->picture_aspect_ratio == HDMI_PICTURE_ASPECT_4_3 ||
|
|
|
- mode->picture_aspect_ratio == HDMI_PICTURE_ASPECT_16_9)
|
|
|
- frame->picture_aspect = mode->picture_aspect_ratio;
|
|
|
- else if (frame->video_code > 0)
|
|
|
- frame->picture_aspect = drm_get_cea_aspect_ratio(
|
|
|
- frame->video_code);
|
|
|
+ picture_aspect = mode->picture_aspect_ratio;
|
|
|
+ if (picture_aspect == HDMI_PICTURE_ASPECT_NONE)
|
|
|
+ picture_aspect = drm_get_cea_aspect_ratio(frame->video_code);
|
|
|
|
|
|
+ /*
|
|
|
+ * The infoframe can't convey anything but none, 4:3
|
|
|
+ * and 16:9, so if the user has asked for anything else
|
|
|
+ * we can only satisfy it by specifying the right VIC.
|
|
|
+ */
|
|
|
+ if (picture_aspect > HDMI_PICTURE_ASPECT_16_9) {
|
|
|
+ if (picture_aspect !=
|
|
|
+ drm_get_cea_aspect_ratio(frame->video_code))
|
|
|
+ return -EINVAL;
|
|
|
+ picture_aspect = HDMI_PICTURE_ASPECT_NONE;
|
|
|
+ }
|
|
|
+
|
|
|
+ frame->picture_aspect = picture_aspect;
|
|
|
frame->active_aspect = HDMI_ACTIVE_ASPECT_PICTURE;
|
|
|
frame->scan_mode = HDMI_SCAN_MODE_UNDERSCAN;
|
|
|
|