rk hdmi: identify diff SOC HDMI support video mode
authorhjc <hjc@rock-chips.com>
Wed, 8 Oct 2014 09:01:33 +0000 (17:01 +0800)
committerhjc <hjc@rock-chips.com>
Wed, 8 Oct 2014 09:02:07 +0000 (17:02 +0800)
drivers/video/rockchip/hdmi/chips/rk3036/rk3036_hdmi_hw.c
drivers/video/rockchip/hdmi/chips/rk3288/rk3288_hdmi_hw.c
drivers/video/rockchip/hdmi/rk_hdmi.h
drivers/video/rockchip/hdmi/rk_hdmi_lcdc.c

index 4940df82028444aabeec437cfb38a4883ec8b321..d4ee596fe1a962e79088ebcee620d4ee89e18e40 100755 (executable)
@@ -4,7 +4,18 @@
 #include <linux/of_irq.h>
 #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();
index c599106076c7fa61f653534a85d4dd3e9cc8a6c2..4fce93bc457d82700580b4b556ad0873a48473d4 100755 (executable)
@@ -2,6 +2,19 @@
 #include <linux/interrupt.h>
 #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);
 
index ff5bb3d9553b3201ba9487d2eff092cde188014c..d13bed5da6373c6fb3dd553066b22eb6ed1f7c59 100755 (executable)
@@ -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...)          \
index f41a73a19fabebf9060cf998fc55229fd58f667b..aa6f9ffbc83deaaaf668f971b24cca7967b142b1 100755 (executable)
@@ -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; i<m_hdmi_drv->support_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;
                }
        }