From 49d2703dd88d5d68d63b52cd4811ed853408ea4c Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Thu, 25 Dec 2014 13:52:04 +0100 Subject: sunxi: video: Fallback from HDMI to VGA on boards with VGA If a board has no LCD, but does have VGA fallback to VGA when no HDMI cable is connected (unless hpd=0). Signed-off-by: Hans de Goede Acked-by: Ian Campbell --- doc/README.video | 3 +-- drivers/video/sunxi_display.c | 51 ++++++++++++++++++++++++------------------- 2 files changed, 30 insertions(+), 24 deletions(-) diff --git a/doc/README.video b/doc/README.video index cfe6318..2c55d6a 100644 --- a/doc/README.video +++ b/doc/README.video @@ -50,8 +50,7 @@ The sunxi u-boot driver supports the following video-mode options: - hpd=[0|1] - Enable use of the hdmi HotPlug Detect feature 0: Disabled. Configure dvi/hdmi output even if no cable is detected - 1: Enabled. If a LCD has been configured fallback to the LCD when no cable is - detected, if no LCD is configured, disable video ouput. + 1: Enabled. Fallback to the lcd / vga / none in that order (if available) Defaults to hpd=1. - edid=[0|1] - Enable use of DDC + EDID to get monitor info diff --git a/drivers/video/sunxi_display.c b/drivers/video/sunxi_display.c index eda04f7..5d5efd6 100644 --- a/drivers/video/sunxi_display.c +++ b/drivers/video/sunxi_display.c @@ -846,36 +846,43 @@ void *video_hw_init(void) printf("Unknown monitor: '%s', falling back to '%s'\n", mon, sunxi_get_mon_desc(sunxi_display.monitor)); +#ifdef CONFIG_VIDEO_HDMI + /* If HDMI/DVI is selected do HPD & EDID, and handle fallback */ + 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(); + if (ret) { + printf("HDMI connected: "); + if (edid && sunxi_hdmi_edid_get_mode(&custom) == 0) + mode = &custom; + } else if (hpd) { + sunxi_hdmi_shutdown(); + /* Fallback to lcd / vga / none */ + if (lcd_mode[0]) { + sunxi_display.monitor = sunxi_monitor_lcd; + } else { +#ifdef CONFIG_VIDEO_VGA_VIA_LCD + sunxi_display.monitor = sunxi_monitor_vga; +#else + sunxi_display.monitor = sunxi_monitor_none; +#endif + } + } /* else continue with hdmi/dvi without a cable connected */ + } +#endif + switch (sunxi_display.monitor) { case sunxi_monitor_none: return NULL; case sunxi_monitor_dvi: case sunxi_monitor_hdmi: -#ifndef CONFIG_VIDEO_HDMI +#ifdef CONFIG_VIDEO_HDMI + break; +#else printf("HDMI/DVI not supported on this board\n"); sunxi_display.monitor = sunxi_monitor_none; return NULL; -#else - /* Always call hdp_detect, as it also enables clocks, etc. */ - ret = sunxi_hdmi_hpd_detect(); - if (ret) { - printf("HDMI connected: "); - if (edid && sunxi_hdmi_edid_get_mode(&custom) == 0) - mode = &custom; - break; - } - if (!hpd) - break; /* User has requested to ignore hpd */ - - sunxi_hdmi_shutdown(); - - if (lcd_mode[0] == 0) { - sunxi_display.monitor = sunxi_monitor_none; - return NULL; /* No LCD, bail */ - } - - /* Fall back / through to LCD */ - sunxi_display.monitor = sunxi_monitor_lcd; #endif case sunxi_monitor_lcd: if (lcd_mode[0]) { -- cgit v1.1