Commit 46154152 authored by Shirish S's avatar Shirish S Committed by Inki Dae

drm/exynos: set the active aspect ratio as per mode

Now that the drm_display_mode also provides aspect
ratio for all resolutions, this patch adds its usage
to set the active aspect ratio of AVI info frame
packets as per CEA-861-D standard's Table 9.

This is also needed to abide by the 7-27
compliance test of HDMI.
Signed-off-by: default avatarShirish S <s.shirish@samsung.com>
Reviewed-by: default avatarTomasz Figa <t.figa@samsung.com>
Signed-off-by: default avatarInki Dae <inki.dae@samsung.com>
parent e1d883c0
...@@ -53,12 +53,13 @@ ...@@ -53,12 +53,13 @@
/* AVI header and aspect ratio */ /* AVI header and aspect ratio */
#define HDMI_AVI_VERSION 0x02 #define HDMI_AVI_VERSION 0x02
#define HDMI_AVI_LENGTH 0x0D #define HDMI_AVI_LENGTH 0x0D
#define AVI_PIC_ASPECT_RATIO_16_9 (2 << 4)
#define AVI_SAME_AS_PIC_ASPECT_RATIO 8
/* AUI header info */ /* AUI header info */
#define HDMI_AUI_VERSION 0x01 #define HDMI_AUI_VERSION 0x01
#define HDMI_AUI_LENGTH 0x0A #define HDMI_AUI_LENGTH 0x0A
#define AVI_SAME_AS_PIC_ASPECT_RATIO 0x8
#define AVI_4_3_CENTER_RATIO 0x9
#define AVI_16_9_CENTER_RATIO 0xa
enum hdmi_type { enum hdmi_type {
HDMI_TYPE13, HDMI_TYPE13,
...@@ -162,6 +163,7 @@ struct hdmi_v14_conf { ...@@ -162,6 +163,7 @@ struct hdmi_v14_conf {
struct hdmi_conf_regs { struct hdmi_conf_regs {
int pixel_clock; int pixel_clock;
int cea_video_id; int cea_video_id;
enum hdmi_picture_aspect aspect_ratio;
union { union {
struct hdmi_v13_conf v13_conf; struct hdmi_v13_conf v13_conf;
struct hdmi_v14_conf v14_conf; struct hdmi_v14_conf v14_conf;
...@@ -713,7 +715,6 @@ static void hdmi_reg_infoframe(struct hdmi_context *hdata, ...@@ -713,7 +715,6 @@ static void hdmi_reg_infoframe(struct hdmi_context *hdata,
{ {
u32 hdr_sum; u32 hdr_sum;
u8 chksum; u8 chksum;
u32 aspect_ratio;
u32 mod; u32 mod;
u32 vic; u32 vic;
...@@ -742,10 +743,28 @@ static void hdmi_reg_infoframe(struct hdmi_context *hdata, ...@@ -742,10 +743,28 @@ static void hdmi_reg_infoframe(struct hdmi_context *hdata,
AVI_ACTIVE_FORMAT_VALID | AVI_ACTIVE_FORMAT_VALID |
AVI_UNDERSCANNED_DISPLAY_VALID); AVI_UNDERSCANNED_DISPLAY_VALID);
aspect_ratio = AVI_PIC_ASPECT_RATIO_16_9; /*
* Set the aspect ratio as per the mode, mentioned in
hdmi_reg_writeb(hdata, HDMI_AVI_BYTE(2), aspect_ratio | * Table 9 AVI InfoFrame Data Byte 2 of CEA-861-D Standard
AVI_SAME_AS_PIC_ASPECT_RATIO); */
switch (hdata->mode_conf.aspect_ratio) {
case HDMI_PICTURE_ASPECT_4_3:
hdmi_reg_writeb(hdata, HDMI_AVI_BYTE(2),
hdata->mode_conf.aspect_ratio |
AVI_4_3_CENTER_RATIO);
break;
case HDMI_PICTURE_ASPECT_16_9:
hdmi_reg_writeb(hdata, HDMI_AVI_BYTE(2),
hdata->mode_conf.aspect_ratio |
AVI_16_9_CENTER_RATIO);
break;
case HDMI_PICTURE_ASPECT_NONE:
default:
hdmi_reg_writeb(hdata, HDMI_AVI_BYTE(2),
hdata->mode_conf.aspect_ratio |
AVI_SAME_AS_PIC_ASPECT_RATIO);
break;
}
vic = hdata->mode_conf.cea_video_id; vic = hdata->mode_conf.cea_video_id;
hdmi_reg_writeb(hdata, HDMI_AVI_BYTE(4), vic); hdmi_reg_writeb(hdata, HDMI_AVI_BYTE(4), vic);
...@@ -1466,6 +1485,7 @@ static void hdmi_v13_mode_set(struct hdmi_context *hdata, ...@@ -1466,6 +1485,7 @@ static void hdmi_v13_mode_set(struct hdmi_context *hdata,
hdata->mode_conf.cea_video_id = hdata->mode_conf.cea_video_id =
drm_match_cea_mode((struct drm_display_mode *)m); drm_match_cea_mode((struct drm_display_mode *)m);
hdata->mode_conf.pixel_clock = m->clock * 1000; hdata->mode_conf.pixel_clock = m->clock * 1000;
hdata->mode_conf.aspect_ratio = m->picture_aspect_ratio;
hdmi_set_reg(core->h_blank, 2, m->htotal - m->hdisplay); hdmi_set_reg(core->h_blank, 2, m->htotal - m->hdisplay);
hdmi_set_reg(core->h_v_line, 3, (m->htotal << 12) | m->vtotal); hdmi_set_reg(core->h_v_line, 3, (m->htotal << 12) | m->vtotal);
...@@ -1562,6 +1582,7 @@ static void hdmi_v14_mode_set(struct hdmi_context *hdata, ...@@ -1562,6 +1582,7 @@ static void hdmi_v14_mode_set(struct hdmi_context *hdata,
hdata->mode_conf.cea_video_id = hdata->mode_conf.cea_video_id =
drm_match_cea_mode((struct drm_display_mode *)m); drm_match_cea_mode((struct drm_display_mode *)m);
hdata->mode_conf.pixel_clock = m->clock * 1000; hdata->mode_conf.pixel_clock = m->clock * 1000;
hdata->mode_conf.aspect_ratio = m->picture_aspect_ratio;
hdmi_set_reg(core->h_blank, 2, m->htotal - m->hdisplay); hdmi_set_reg(core->h_blank, 2, m->htotal - m->hdisplay);
hdmi_set_reg(core->v_line, 2, m->vtotal); hdmi_set_reg(core->v_line, 2, m->vtotal);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment