video: rockchip: dp: get edid for discrete vr
authorwjh <wjh@rock-chips.com>
Mon, 7 Nov 2016 01:57:45 +0000 (09:57 +0800)
committerHuang, Tao <huangtao@rock-chips.com>
Wed, 9 Nov 2016 08:36:42 +0000 (16:36 +0800)
Change-Id: Id791e838e37e76f72202731e53afd2533e653069
Signed-off-by: wjh <wjh@rock-chips.com>
drivers/video/rockchip/dp/rockchip_dp.c
drivers/video/rockchip/dp/rockchip_dp_core.c

index 70c17c9449915c7cc500304a892a39b3e4b23147..d46f5eda4cab12112e1fb523a657eba81f336e65 100644 (file)
@@ -230,7 +230,10 @@ int cdn_dp_fb_register(struct platform_device *pdev, void *dp)
        rockchip_dp_dev_init_ops(rk_dp_ops);
        rk_cdn_dp_prop->videosrc = dp_dev->disp_info.vop_sel;
        rk_cdn_dp_prop->display = DISPLAY_MAIN;
        rockchip_dp_dev_init_ops(rk_dp_ops);
        rk_cdn_dp_prop->videosrc = dp_dev->disp_info.vop_sel;
        rk_cdn_dp_prop->display = DISPLAY_MAIN;
-       rk_cdn_dp_prop->defaultmode = HDMI_VIDEO_DEFAULT_MODE;
+       if (!of_property_read_u32(np, "dp_defaultmode", &val))
+               rk_cdn_dp_prop->defaultmode = val;
+       else
+               rk_cdn_dp_prop->defaultmode = HDMI_VIDEO_DEFAULT_MODE;
        rk_cdn_dp_prop->name = (char *)pdev->name;
        rk_cdn_dp_prop->priv = dp_dev;
        rk_cdn_dp_prop->feature |=
        rk_cdn_dp_prop->name = (char *)pdev->name;
        rk_cdn_dp_prop->priv = dp_dev;
        rk_cdn_dp_prop->feature |=
index 64e69d73a64e93abf73c57b8afe9d40d9e2d98b1..fbc95016faf551a510c34998ca2ec32cb00ec721 100644 (file)
@@ -131,9 +131,53 @@ int cdn_dp_get_edid(void *dp, u8 *buf, int block)
 {
        int ret;
        struct cdn_dp_device *dp_dev = dp;
 {
        int ret;
        struct cdn_dp_device *dp_dev = dp;
+       char guid[16];
+       char start_read_edid = -1;
+       u32 readed_size = 0;
+       u32 left_size = EDID_BLOCK_SIZE;
 
        mutex_lock(&dp_dev->lock);
 
        mutex_lock(&dp_dev->lock);
-       ret = cdn_dp_get_edid_block(dp_dev, buf, block, EDID_BLOCK_SIZE);
+       ret = cdn_dp_dpcd_read(dp, 0x0030, guid, 8);
+       if (ret == 0 && guid[0] == 'n' && guid[1] == 'a' &&
+           guid[2] == 'n' && guid[3] == 'o' && guid[4] == 'c') {
+               int try_times = 0;
+
+               cdn_dp_dpcd_write(dp, 0x0038, 0x55);
+               while (left_size > 0) {
+                       u32 length = (left_size > 8) ? 8 : left_size;
+
+                       ret = cdn_dp_dpcd_read(dp, 0x0038, &start_read_edid, 1);
+                       if (ret != 0) {
+                               dev_err(dp_dev->dev, "read edid sync number error!\n");
+                               break;
+                       } else if (start_read_edid == 0xaa) {
+                               try_times = 0;
+                               ret = cdn_dp_dpcd_read(dp, 0x0030,
+                                                      buf + readed_size,
+                                                      length);
+                               if (ret != 0) {
+                                       dev_err(dp_dev->dev,
+                                               "read edid bytes [%d~%d] error!\n",
+                                               readed_size,
+                                               readed_size + length);
+                                       break;
+                               }
+
+                               readed_size += length;
+                               left_size -= length;
+                               cdn_dp_dpcd_write(dp, 0x0038, 0x55);
+                       } else {
+                               if (try_times++ >= 100) {
+                                       dev_err(dp_dev->dev, "read edid from NanoC failed!\n");
+                                       break;
+                               }
+                               continue;
+                       }
+               }
+       } else {
+               ret = cdn_dp_get_edid_block(dp_dev, buf,
+                                           block, EDID_BLOCK_SIZE);
+       }
        mutex_unlock(&dp_dev->lock);
 
        return ret;
        mutex_unlock(&dp_dev->lock);
 
        return ret;