aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/exynos/exynos_hdmi.c68
1 files changed, 24 insertions, 44 deletions
diff --git a/drivers/gpu/drm/exynos/exynos_hdmi.c b/drivers/gpu/drm/exynos/exynos_hdmi.c
index f9c4de16d91a..a3fe2f06b80c 100644
--- a/drivers/gpu/drm/exynos/exynos_hdmi.c
+++ b/drivers/gpu/drm/exynos/exynos_hdmi.c
@@ -169,14 +169,9 @@ struct hdmi_v14_conf {
169 struct hdmi_tg_regs tg; 169 struct hdmi_tg_regs tg;
170}; 170};
171 171
172struct hdmi_conf_regs { 172union hdmi_conf_regs {
173 int pixel_clock; 173 struct hdmi_v13_conf v13_conf;
174 int cea_video_id; 174 struct hdmi_v14_conf v14_conf;
175 enum hdmi_picture_aspect aspect_ratio;
176 union {
177 struct hdmi_v13_conf v13_conf;
178 struct hdmi_v14_conf v14_conf;
179 } conf;
180}; 175};
181 176
182struct hdmi_context { 177struct hdmi_context {
@@ -197,7 +192,8 @@ struct hdmi_context {
197 192
198 /* current hdmiphy conf regs */ 193 /* current hdmiphy conf regs */
199 struct drm_display_mode current_mode; 194 struct drm_display_mode current_mode;
200 struct hdmi_conf_regs mode_conf; 195 u8 cea_video_id;
196 union hdmi_conf_regs mode_conf;
201 197
202 struct hdmi_resources res; 198 struct hdmi_resources res;
203 const struct hdmi_driver_data *drv_data; 199 const struct hdmi_driver_data *drv_data;
@@ -951,7 +947,7 @@ static void hdmi_reg_infoframe(struct hdmi_context *hdata,
951 u32 hdr_sum; 947 u32 hdr_sum;
952 u8 chksum; 948 u8 chksum;
953 u32 mod; 949 u32 mod;
954 u32 vic; 950 u8 ar;
955 951
956 mod = hdmi_reg_read(hdata, HDMI_MODE_SEL); 952 mod = hdmi_reg_read(hdata, HDMI_MODE_SEL);
957 if (hdata->dvi_mode) { 953 if (hdata->dvi_mode) {
@@ -982,27 +978,22 @@ static void hdmi_reg_infoframe(struct hdmi_context *hdata,
982 * Set the aspect ratio as per the mode, mentioned in 978 * Set the aspect ratio as per the mode, mentioned in
983 * Table 9 AVI InfoFrame Data Byte 2 of CEA-861-D Standard 979 * Table 9 AVI InfoFrame Data Byte 2 of CEA-861-D Standard
984 */ 980 */
985 switch (hdata->mode_conf.aspect_ratio) { 981 ar = hdata->current_mode.picture_aspect_ratio;
982 switch (ar) {
986 case HDMI_PICTURE_ASPECT_4_3: 983 case HDMI_PICTURE_ASPECT_4_3:
987 hdmi_reg_writeb(hdata, HDMI_AVI_BYTE(2), 984 ar |= AVI_4_3_CENTER_RATIO;
988 hdata->mode_conf.aspect_ratio |
989 AVI_4_3_CENTER_RATIO);
990 break; 985 break;
991 case HDMI_PICTURE_ASPECT_16_9: 986 case HDMI_PICTURE_ASPECT_16_9:
992 hdmi_reg_writeb(hdata, HDMI_AVI_BYTE(2), 987 ar |= AVI_16_9_CENTER_RATIO;
993 hdata->mode_conf.aspect_ratio |
994 AVI_16_9_CENTER_RATIO);
995 break; 988 break;
996 case HDMI_PICTURE_ASPECT_NONE: 989 case HDMI_PICTURE_ASPECT_NONE:
997 default: 990 default:
998 hdmi_reg_writeb(hdata, HDMI_AVI_BYTE(2), 991 ar |= AVI_SAME_AS_PIC_ASPECT_RATIO;
999 hdata->mode_conf.aspect_ratio |
1000 AVI_SAME_AS_PIC_ASPECT_RATIO);
1001 break; 992 break;
1002 } 993 }
994 hdmi_reg_writeb(hdata, HDMI_AVI_BYTE(2), ar);
1003 995
1004 vic = hdata->mode_conf.cea_video_id; 996 hdmi_reg_writeb(hdata, HDMI_AVI_BYTE(4), hdata->cea_video_id);
1005 hdmi_reg_writeb(hdata, HDMI_AVI_BYTE(4), vic);
1006 997
1007 chksum = hdmi_chksum(hdata, HDMI_AVI_BYTE(1), 998 chksum = hdmi_chksum(hdata, HDMI_AVI_BYTE(1),
1008 infoframe->any.length, hdr_sum); 999 infoframe->any.length, hdr_sum);
@@ -1418,9 +1409,8 @@ static void hdmi_conf_init(struct hdmi_context *hdata)
1418 1409
1419static void hdmi_v13_mode_apply(struct hdmi_context *hdata) 1410static void hdmi_v13_mode_apply(struct hdmi_context *hdata)
1420{ 1411{
1421 const struct hdmi_tg_regs *tg = &hdata->mode_conf.conf.v13_conf.tg; 1412 const struct hdmi_tg_regs *tg = &hdata->mode_conf.v13_conf.tg;
1422 const struct hdmi_v13_core_regs *core = 1413 const struct hdmi_v13_core_regs *core = &hdata->mode_conf.v13_conf.core;
1423 &hdata->mode_conf.conf.v13_conf.core;
1424 int tries; 1414 int tries;
1425 1415
1426 /* setting core registers */ 1416 /* setting core registers */
@@ -1502,9 +1492,8 @@ static void hdmi_v13_mode_apply(struct hdmi_context *hdata)
1502 1492
1503static void hdmi_v14_mode_apply(struct hdmi_context *hdata) 1493static void hdmi_v14_mode_apply(struct hdmi_context *hdata)
1504{ 1494{
1505 const struct hdmi_tg_regs *tg = &hdata->mode_conf.conf.v14_conf.tg; 1495 const struct hdmi_tg_regs *tg = &hdata->mode_conf.v14_conf.tg;
1506 const struct hdmi_v14_core_regs *core = 1496 const struct hdmi_v14_core_regs *core = &hdata->mode_conf.v14_conf.core;
1507 &hdata->mode_conf.conf.v14_conf.core;
1508 int tries; 1497 int tries;
1509 1498
1510 /* setting core registers */ 1499 /* setting core registers */
@@ -1742,7 +1731,7 @@ static void hdmiphy_conf_apply(struct hdmi_context *hdata)
1742 int i; 1731 int i;
1743 1732
1744 /* pixel clock */ 1733 /* pixel clock */
1745 i = hdmi_find_phy_conf(hdata, hdata->mode_conf.pixel_clock); 1734 i = hdmi_find_phy_conf(hdata, hdata->current_mode.clock * 1000);
1746 if (i < 0) { 1735 if (i < 0) {
1747 DRM_ERROR("failed to find hdmiphy conf\n"); 1736 DRM_ERROR("failed to find hdmiphy conf\n");
1748 return; 1737 return;
@@ -1794,15 +1783,10 @@ static void hdmi_set_reg(u8 *reg_pair, int num_bytes, u32 value)
1794static void hdmi_v13_mode_set(struct hdmi_context *hdata, 1783static void hdmi_v13_mode_set(struct hdmi_context *hdata,
1795 struct drm_display_mode *m) 1784 struct drm_display_mode *m)
1796{ 1785{
1797 struct hdmi_v13_core_regs *core = &hdata->mode_conf.conf.v13_conf.core; 1786 struct hdmi_v13_core_regs *core = &hdata->mode_conf.v13_conf.core;
1798 struct hdmi_tg_regs *tg = &hdata->mode_conf.conf.v13_conf.tg; 1787 struct hdmi_tg_regs *tg = &hdata->mode_conf.v13_conf.tg;
1799 unsigned int val; 1788 unsigned int val;
1800 1789
1801 hdata->mode_conf.cea_video_id =
1802 drm_match_cea_mode((struct drm_display_mode *)m);
1803 hdata->mode_conf.pixel_clock = m->clock * 1000;
1804 hdata->mode_conf.aspect_ratio = m->picture_aspect_ratio;
1805
1806 hdmi_set_reg(core->h_blank, 2, m->htotal - m->hdisplay); 1790 hdmi_set_reg(core->h_blank, 2, m->htotal - m->hdisplay);
1807 hdmi_set_reg(core->h_v_line, 3, (m->htotal << 12) | m->vtotal); 1791 hdmi_set_reg(core->h_v_line, 3, (m->htotal << 12) | m->vtotal);
1808 1792
@@ -1891,14 +1875,8 @@ static void hdmi_v13_mode_set(struct hdmi_context *hdata,
1891static void hdmi_v14_mode_set(struct hdmi_context *hdata, 1875static void hdmi_v14_mode_set(struct hdmi_context *hdata,
1892 struct drm_display_mode *m) 1876 struct drm_display_mode *m)
1893{ 1877{
1894 struct hdmi_tg_regs *tg = &hdata->mode_conf.conf.v14_conf.tg; 1878 struct hdmi_tg_regs *tg = &hdata->mode_conf.v14_conf.tg;
1895 struct hdmi_v14_core_regs *core = 1879 struct hdmi_v14_core_regs *core = &hdata->mode_conf.v14_conf.core;
1896 &hdata->mode_conf.conf.v14_conf.core;
1897
1898 hdata->mode_conf.cea_video_id =
1899 drm_match_cea_mode((struct drm_display_mode *)m);
1900 hdata->mode_conf.pixel_clock = m->clock * 1000;
1901 hdata->mode_conf.aspect_ratio = m->picture_aspect_ratio;
1902 1880
1903 hdmi_set_reg(core->h_blank, 2, m->htotal - m->hdisplay); 1881 hdmi_set_reg(core->h_blank, 2, m->htotal - m->hdisplay);
1904 hdmi_set_reg(core->v_line, 2, m->vtotal); 1882 hdmi_set_reg(core->v_line, 2, m->vtotal);
@@ -2014,6 +1992,8 @@ static void hdmi_mode_set(struct exynos_drm_display *display,
2014 /* preserve mode information for later use. */ 1992 /* preserve mode information for later use. */
2015 drm_mode_copy(&hdata->current_mode, mode); 1993 drm_mode_copy(&hdata->current_mode, mode);
2016 1994
1995 hdata->cea_video_id = drm_match_cea_mode(mode);
1996
2017 if (hdata->drv_data->type == HDMI_TYPE13) 1997 if (hdata->drv_data->type == HDMI_TYPE13)
2018 hdmi_v13_mode_set(hdata, mode); 1998 hdmi_v13_mode_set(hdata, mode);
2019 else 1999 else