From: Zheng Yang Date: Wed, 6 May 2015 09:15:24 +0000 (+0800) Subject: HDMI: improve EDID parse. X-Git-Tag: firefly_0821_release~4201 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=3848053c4afd0ea9fea1aacbdfec6c3d1acff11e;p=firefly-linux-kernel-4.4.55.git HDMI: improve EDID parse. 1. For some sink device, there is no available video mode in EDID. hdmi driver will crash under such case. 2. There are some video mode is not defined in EDID extend block, so we need to check first block data. Signed-off-by: Zheng Yang --- diff --git a/drivers/video/rockchip/hdmi/rockchip-hdmi-lcdc.c b/drivers/video/rockchip/hdmi/rockchip-hdmi-lcdc.c index 8a10edb91bb9..bcf45c87862b 100644 --- a/drivers/video/rockchip/hdmi/rockchip-hdmi-lcdc.c +++ b/drivers/video/rockchip/hdmi/rockchip-hdmi-lcdc.c @@ -508,10 +508,14 @@ static void hdmi_sort_modelist(struct hdmi_edid *edid, int feature) } } fb_destroy_modelist(head); - - edid->modelist = head_new; - edid->modelist.prev->next = &edid->modelist; - edid->modelist.next->prev = &edid->modelist; + if (head_new.next == &head_new) { + pr_info("There is no available video mode in EDID.\n"); + INIT_LIST_HEAD(&edid->modelist); + } else { + edid->modelist = head_new; + edid->modelist.prev->next = &edid->modelist; + edid->modelist.next->prev = &edid->modelist; + } } /** @@ -585,6 +589,16 @@ int hdmi_ouputmode_select(struct hdmi *hdmi, int edid_ok) hdmi_add_videomode(mode, head); } } else { + /* There are some video mode is not defined in EDID extend + block, so we need to check first block data.*/ + if (specs && specs->modedb_len) { + for (i = 0; i < specs->modedb_len; i++) { + modedb = &specs->modedb[0]; + pixclock = hdmi_videomode_to_vic(modedb); + if (pixclock) + hdmi_add_vic(pixclock, head); + } + } hdmi_sort_modelist(&hdmi->edid, hdmi->property->feature); } hdmi_show_sink_info(hdmi);