From f7691a0281c87118be84350108aba7a536423170 Mon Sep 17 00:00:00 2001 From: hjc Date: Wed, 8 Oct 2014 17:01:33 +0800 Subject: [PATCH] rk hdmi: identify diff SOC HDMI support video mode --- .../hdmi/chips/rk3036/rk3036_hdmi_hw.c | 15 ++++++++++++++- .../hdmi/chips/rk3288/rk3288_hdmi_hw.c | 15 +++++++++++++++ drivers/video/rockchip/hdmi/rk_hdmi.h | 2 ++ drivers/video/rockchip/hdmi/rk_hdmi_lcdc.c | 19 ++++++++++++++++++- 4 files changed, 49 insertions(+), 2 deletions(-) diff --git a/drivers/video/rockchip/hdmi/chips/rk3036/rk3036_hdmi_hw.c b/drivers/video/rockchip/hdmi/chips/rk3036/rk3036_hdmi_hw.c index 4940df820284..d4ee596fe1a9 100755 --- a/drivers/video/rockchip/hdmi/chips/rk3036/rk3036_hdmi_hw.c +++ b/drivers/video/rockchip/hdmi/chips/rk3036/rk3036_hdmi_hw.c @@ -4,7 +4,18 @@ #include #include "rk3036_hdmi.h" #include "rk3036_hdmi_hw.h" - +static unsigned int rk3036_hdmi_support_vic[] = { + HDMI_720X480P_60HZ_VIC, + HDMI_720X480I_60HZ_VIC, + HDMI_720X576P_50HZ_VIC, + HDMI_720X576I_50HZ_VIC, + HDMI_1280X720P_50HZ_VIC, + HDMI_1280X720P_60HZ_VIC, + HDMI_1920X1080P_50HZ_VIC, + HDMI_1920X1080I_50HZ_VIC, + HDMI_1920X1080P_60HZ_VIC, + HDMI_1920X1080I_60HZ_VIC +}; static int __maybe_unused rk3036_hdmi_show_reg(struct hdmi *hdmi_drv) { int i = 0; @@ -840,6 +851,8 @@ int rk3036_hdmi_initial(struct hdmi *hdmi_drv) hdmi_drv->read_edid = rk3036_hdmi_read_edid; hdmi_drv->insert = rk3036_hdmi_insert; hdmi_drv->ops = &hdmi_drv_ops; + hdmi_drv->support_vic = rk3036_hdmi_support_vic; + hdmi_drv->support_vic_num = ARRAY_SIZE(rk3036_hdmi_support_vic); if (!hdmi_drv->uboot_logo) { rk3036_hdmi_reset_pclk(); diff --git a/drivers/video/rockchip/hdmi/chips/rk3288/rk3288_hdmi_hw.c b/drivers/video/rockchip/hdmi/chips/rk3288/rk3288_hdmi_hw.c index c599106076c7..4fce93bc457d 100755 --- a/drivers/video/rockchip/hdmi/chips/rk3288/rk3288_hdmi_hw.c +++ b/drivers/video/rockchip/hdmi/chips/rk3288/rk3288_hdmi_hw.c @@ -2,6 +2,19 @@ #include #include "rk3288_hdmi_hw.h" +static unsigned int rk3288_hdmi_support_vic[] = { + HDMI_720X480P_60HZ_VIC, + HDMI_720X576P_50HZ_VIC, + HDMI_1280X720P_50HZ_VIC, + HDMI_1280X720P_60HZ_VIC, + HDMI_1920X1080P_50HZ_VIC, + HDMI_1920X1080P_60HZ_VIC, + HDMI_3840X2160P_24HZ_VIC, + HDMI_3840X2160P_25HZ_VIC, + HDMI_3840X2160P_30HZ_VIC, + HDMI_3840X2160P_50HZ_VIC, + HDMI_3840X2160P_60HZ_VIC +}; static const struct phy_mpll_config_tab PHY_MPLL_TABLE[] = { /* opmode: 0:HDMI1.4 1:HDMI2.0 */ /* pixclock pixrepet colordepth prepdiv tmdsmhl opmode fbdiv2 fbdiv1 ref_cntrl nctrl propctrl intctrl gmpctrl */ {27000000, 0, HDMI_COLOR_DEPTH_8BIT, 0, 0, 0, 2, 3, 0, 3, 7, 0, 3}, @@ -1334,6 +1347,8 @@ int rk3288_hdmi_initial(struct hdmi *hdmi_drv) hdmi_drv->config_audio = rk3288_hdmi_config_audio; hdmi_drv->detect_hotplug = rk3288_hdmi_detect_hotplug; hdmi_drv->read_edid = rk3288_hdmi_read_edid; + hdmi_drv->support_vic = rk3288_hdmi_support_vic; + hdmi_drv->support_vic_num = ARRAY_SIZE(rk3288_hdmi_support_vic); rk3288_hdmi_reset(hdmi_drv); diff --git a/drivers/video/rockchip/hdmi/rk_hdmi.h b/drivers/video/rockchip/hdmi/rk_hdmi.h index ff5bb3d9553b..d13bed5da637 100755 --- a/drivers/video/rockchip/hdmi/rk_hdmi.h +++ b/drivers/video/rockchip/hdmi/rk_hdmi.h @@ -391,6 +391,8 @@ struct hdmi { void (*cec_set_device_pa)(int); int (*cec_enumerate)(void); struct rk_hdmi_drv_ops *ops; + unsigned int *support_vic; + int support_vic_num; }; #define hdmi_err(dev, format, arg...) \ diff --git a/drivers/video/rockchip/hdmi/rk_hdmi_lcdc.c b/drivers/video/rockchip/hdmi/rk_hdmi_lcdc.c index f41a73a19fab..aa6f9ffbc83d 100755 --- a/drivers/video/rockchip/hdmi/rk_hdmi_lcdc.c +++ b/drivers/video/rockchip/hdmi/rk_hdmi_lcdc.c @@ -377,6 +377,22 @@ static int hdmi_videomode_compare(const struct fb_videomode *mode1, } return -1; } +int hdmi_check_support_videomode(int vic) +{ + int i, support = 0; + if (m_hdmi_drv->support_vic_num == 0) + return 1; + + for (i=0; isupport_vic_num; i++) { + if (m_hdmi_drv->support_vic[i] == vic) { + support = 1; + break; + } + } + if(i >= m_hdmi_drv->support_vic_num) + support = 0; + return support; +} /** * hdmi_add_videomode: adds videomode entry to modelist @@ -396,7 +412,8 @@ int hdmi_add_videomode(const struct fb_videomode *mode, struct list_head *head) for (i = 0; i < ARRAY_SIZE(hdmi_mode); i++) { m = (struct fb_videomode *)&hdmi_mode[i]; if (fb_mode_is_equal(m, mode)) { - found = 1; + if(hdmi_check_support_videomode(m->flag)) + found = 1; break; } } -- 2.34.1