video: rockchip: add auto dp support for vr product
[firefly-linux-kernel-4.4.55.git] / drivers / video / rockchip / hdmi / rockchip-hdmi-edid.c
index b8c4b3949549b2cfbb459c2ecd5bf37296e7f4a7..70564716dd7138f73da38b89e9a68849e86987fc 100644 (file)
@@ -78,7 +78,30 @@ static int hdmi_edid_parse_dtd(unsigned char *block, struct fb_videomode *mode)
        return E_HDMI_EDID_SUCCESS;
 }
 
-int hdmi_edid_parse_base(unsigned char *buf,
+static int edid_parse_prop_value(unsigned char *buf,
+                                struct hdmi_edid *pedid)
+{
+       unsigned char *block = &buf[0x36];
+
+       pedid->value.vid = ((buf[ID_MANUFACTURER_NAME_END] << 8) |
+                               (buf[ID_MANUFACTURER_NAME]));
+       pedid->value.pid = ((buf[ID_MODEL + 1] << 8) |
+                               (buf[ID_MODEL]));
+       pedid->value.sn = ((buf[ID_SERIAL_NUMBER + 3] << 24) |
+                               (buf[ID_SERIAL_NUMBER + 2] << 16) |
+                               (buf[ID_SERIAL_NUMBER + 1] << 8) |
+                               buf[ID_SERIAL_NUMBER]);
+       pedid->value.xres = H_ACTIVE;
+       pedid->value.yres = V_ACTIVE;
+
+       pr_info("%s:read:vid=0x%x,pid=0x%x,sn=0x%x,xres=%d,yres=%d\n",
+               __func__, pedid->value.vid, pedid->value.pid,
+               pedid->value.sn, pedid->value.xres, pedid->value.yres);
+
+       return 0;
+}
+
+int hdmi_edid_parse_base(struct hdmi *hdmi, unsigned char *buf,
                         int *extend_num, struct hdmi_edid *pedid)
 {
        int rc = E_HDMI_EDID_SUCCESS;
@@ -119,6 +142,9 @@ int hdmi_edid_parse_base(unsigned char *buf,
 
        fb_edid_to_monspecs(buf, pedid->specs);
 
+       if (hdmi->edid_auto_support)
+               edid_parse_prop_value(buf, pedid);
+
 out:
        /* For some sink, edid checksum is failed because several
         * byte is wrong. To fix this case, we think it is a good