sunxi: display: Implement fallback to ddc probe when hpd fails
There are HDMI displays where hpd pin is not connected, thus we cannot get it to work unless we specifically set the resolution. Rework the display probing, so hotplug detect failure causes fallback to probing ddc for EDID data. Signed-off-by: Priit Laes <priit.laes@paf.com>
This commit is contained in:
parent
361604d658
commit
0220f8c223
1 changed files with 21 additions and 7 deletions
|
@ -210,7 +210,8 @@ static int sunxi_hdmi_edid_get_block(int block, u8 *buf)
|
|||
return r;
|
||||
}
|
||||
|
||||
static int sunxi_hdmi_edid_get_mode(struct ctfb_res_modes *mode)
|
||||
static int sunxi_hdmi_edid_get_mode(struct ctfb_res_modes *mode,
|
||||
bool verbose_mode)
|
||||
{
|
||||
struct edid1_info edid1;
|
||||
struct edid_cea861_info cea681[4];
|
||||
|
@ -241,6 +242,7 @@ static int sunxi_hdmi_edid_get_mode(struct ctfb_res_modes *mode)
|
|||
if (r == 0) {
|
||||
r = edid_check_info(&edid1);
|
||||
if (r) {
|
||||
if (verbose_mode)
|
||||
printf("EDID: invalid EDID data\n");
|
||||
r = -EINVAL;
|
||||
}
|
||||
|
@ -1082,7 +1084,8 @@ void *video_hw_init(void)
|
|||
struct ctfb_res_modes custom;
|
||||
const char *options;
|
||||
#ifdef CONFIG_VIDEO_HDMI
|
||||
int ret, hpd, hpd_delay, edid;
|
||||
int hpd, hpd_delay, edid;
|
||||
bool hdmi_present;
|
||||
#endif
|
||||
int i, overscan_offset, overscan_x, overscan_y;
|
||||
unsigned int fb_dma_addr;
|
||||
|
@ -1118,12 +1121,23 @@ void *video_hw_init(void)
|
|||
if (sunxi_display.monitor == sunxi_monitor_dvi ||
|
||||
sunxi_display.monitor == sunxi_monitor_hdmi) {
|
||||
/* Always call hdp_detect, as it also enables clocks, etc. */
|
||||
ret = sunxi_hdmi_hpd_detect(hpd_delay);
|
||||
if (ret) {
|
||||
hdmi_present = (sunxi_hdmi_hpd_detect(hpd_delay) == 1);
|
||||
if (hdmi_present && edid) {
|
||||
printf("HDMI connected: ");
|
||||
if (edid && sunxi_hdmi_edid_get_mode(&custom) == 0)
|
||||
if (sunxi_hdmi_edid_get_mode(&custom, true) == 0)
|
||||
mode = &custom;
|
||||
} else if (hpd) {
|
||||
else
|
||||
hdmi_present = false;
|
||||
}
|
||||
/* Fall back to EDID in case HPD failed */
|
||||
if (edid && !hdmi_present) {
|
||||
if (sunxi_hdmi_edid_get_mode(&custom, false) == 0) {
|
||||
mode = &custom;
|
||||
hdmi_present = true;
|
||||
}
|
||||
}
|
||||
/* Shut down when display was not found */
|
||||
if ((hpd || edid) && !hdmi_present) {
|
||||
sunxi_hdmi_shutdown();
|
||||
sunxi_display.monitor = sunxi_get_default_mon(false);
|
||||
} /* else continue with hdmi/dvi without a cable connected */
|
||||
|
|
Loading…
Reference in a new issue