sunxi: video: Fallback from HDMI to VGA on boards with VGA
authorHans de Goede <hdegoede@redhat.com>
Thu, 25 Dec 2014 12:52:04 +0000 (13:52 +0100)
committerHans de Goede <hdegoede@redhat.com>
Wed, 14 Jan 2015 13:56:39 +0000 (14:56 +0100)
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 <hdegoede@redhat.com>
Acked-by: Ian Campbell <ijc@hellion.org.uk>
doc/README.video
drivers/video/sunxi_display.c

index cfe6318e127ba8f6b6b830b17add92736b8b5481..2c55d6a47262abe7a9296d47081498bf40f8a43d 100644 (file)
@@ -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
index eda04f7280a2bdda48d8df944eaeed280854fed6..5d5efd63cff193c320da837d08476b7b72339525 100644 (file)
@@ -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]) {