Some SoCs, specifically the A13 (sun5i variant) and the A23 (sun8i) only have
lcd output support.

Signed-off-by: Hans de Goede <hdego...@redhat.com>
---
 board/sunxi/Kconfig           |  7 +++++++
 drivers/video/sunxi_display.c | 30 ++++++++++++++++++++++++++----
 2 files changed, 33 insertions(+), 4 deletions(-)

diff --git a/board/sunxi/Kconfig b/board/sunxi/Kconfig
index 35c59e9..7a8503b 100644
--- a/board/sunxi/Kconfig
+++ b/board/sunxi/Kconfig
@@ -246,6 +246,13 @@ config VIDEO
        or VGA output found on most sunxi devices. See doc/README.video for
        info on how to select the video output and mode.
 
+config VIDEO_HDMI
+       boolean "HDMI output support"
+       depends on VIDEO && !MACH_SUN8I
+       default y
+       ---help---
+       Say Y here to add support for outputting video over HDMI.
+
 config VIDEO_LCD_MODE
        string "LCD panel timing details"
        depends on VIDEO
diff --git a/drivers/video/sunxi_display.c b/drivers/video/sunxi_display.c
index bfcfd3f..2822cc6 100644
--- a/drivers/video/sunxi_display.c
+++ b/drivers/video/sunxi_display.c
@@ -38,6 +38,8 @@ struct sunxi_display {
        unsigned int depth;
 } sunxi_display;
 
+#ifdef CONFIG_VIDEO_HDMI
+
 /*
  * Wait up to 200ms for value to be set in given part of reg.
  */
@@ -266,6 +268,8 @@ static int sunxi_hdmi_edid_get_mode(struct ctfb_res_modes 
*mode)
        return 0;
 }
 
+#endif /* CONFIG_VIDEO_HDMI */
+
 /*
  * This is the entity that mixes and matches the different layers and inputs.
  * Allwinner calls it the back-end, but i like composer better.
@@ -278,7 +282,7 @@ static void sunxi_composer_init(void)
                (struct sunxi_de_be_reg *)SUNXI_DE_BE0_BASE;
        int i;
 
-#ifdef CONFIG_MACH_SUN6I
+#if defined CONFIG_MACH_SUN6I || defined CONFIG_MACH_SUN8I
        /* Reset off */
        setbits_le32(&ccm->ahb_reset1_cfg, 1 << AHB_RESET_OFFSET_DE_BE0);
 #endif
@@ -408,7 +412,7 @@ static void sunxi_lcdc_init(void)
                (struct sunxi_lcdc_reg *)SUNXI_LCD0_BASE;
 
        /* Reset off */
-#ifdef CONFIG_MACH_SUN6I
+#if defined CONFIG_MACH_SUN6I || defined CONFIG_MACH_SUN8I
        setbits_le32(&ccm->ahb_reset1_cfg, 1 << AHB_RESET_OFFSET_LCD0);
 #else
        setbits_le32(&ccm->lcd0_ch0_clk_cfg, CCM_LCD_CH0_CTRL_RST);
@@ -567,6 +571,8 @@ static void sunxi_lcdc_tcon0_mode_set(const struct 
ctfb_res_modes *mode)
        writel(0, &lcdc->tcon0_io_tristate);
 }
 
+#ifdef CONFIG_VIDEO_HDMI
+
 static void sunxi_lcdc_tcon1_mode_set(const struct ctfb_res_modes *mode,
                                      int *clk_div, int *clk_double)
 {
@@ -713,9 +719,11 @@ static void sunxi_hdmi_enable(void)
        setbits_le32(&hdmi->video_ctrl, SUNXI_HDMI_VIDEO_CTRL_ENABLE);
 }
 
+#endif /* CONFIG_VIDEO_HDMI */
+
 static void sunxi_drc_init(void)
 {
-#ifdef CONFIG_MACH_SUN6I
+#if defined CONFIG_MACH_SUN6I || defined CONFIG_MACH_SUN8I
        struct sunxi_ccm_reg * const ccm =
                (struct sunxi_ccm_reg *)SUNXI_CCM_BASE;
 
@@ -740,6 +748,7 @@ static void sunxi_mode_set(const struct ctfb_res_modes 
*mode,
                break;
        case sunxi_monitor_dvi:
        case sunxi_monitor_hdmi: {
+#ifdef CONFIG_VIDEO_HDMI
                int clk_div, clk_double;
                sunxi_composer_mode_set(mode, address);
                sunxi_lcdc_tcon1_mode_set(mode, &clk_div, &clk_double);
@@ -747,6 +756,7 @@ static void sunxi_mode_set(const struct ctfb_res_modes 
*mode,
                sunxi_composer_enable();
                sunxi_lcdc_enable();
                sunxi_hdmi_enable();
+#endif
                }
                break;
        case sunxi_monitor_lcd:
@@ -768,10 +778,13 @@ void *video_hw_init(void)
        const struct ctfb_res_modes *mode;
        struct ctfb_res_modes custom;
        const char *options;
-       int i, ret, hpd, edid;
+#ifdef CONFIG_VIDEO_HDMI
+       int ret, hpd, edid;
+#endif
        char mon[16];
        const char *mon_desc[] = { "none", "dvi", "hdmi", "lcd", "vga" };
        char *lcd_mode = CONFIG_VIDEO_LCD_MODE;
+       int i;
 
        memset(&sunxi_display, 0, sizeof(struct sunxi_display));
 
@@ -781,9 +794,13 @@ void *video_hw_init(void)
 
        video_get_ctfb_res_modes(RES_MODE_1024x768, 24, &mode,
                                 &sunxi_display.depth, &options);
+#ifdef CONFIG_VIDEO_HDMI
        hpd = video_get_option_int(options, "hpd", 1);
        edid = video_get_option_int(options, "edid", 1);
        sunxi_display.monitor = sunxi_monitor_dvi;
+#else
+       sunxi_display.monitor = sunxi_monitor_lcd;
+#endif
        video_get_option_string(options, "monitor", mon, sizeof(mon),
                                mon_desc[sunxi_display.monitor]);
        for (i = 0; i < ARRAY_SIZE(mon_desc); i++) {
@@ -801,6 +818,10 @@ void *video_hw_init(void)
                return NULL;
        case sunxi_monitor_dvi:
        case sunxi_monitor_hdmi:
+#ifndef CONFIG_VIDEO_HDMI
+               printf("HDMI/DVI not supported on this board\n");
+               return NULL;
+#else
                /* Always call hdp_detect, as it also enables clocks, etc. */
                ret = sunxi_hdmi_hpd_detect();
                if (ret) {
@@ -819,6 +840,7 @@ void *video_hw_init(void)
 
                /* Fall back / through to LCD */
                sunxi_display.monitor = sunxi_monitor_lcd;
+#endif
        case sunxi_monitor_lcd:
                if (lcd_mode[0]) {
                        sunxi_display.depth = video_get_params(&custom, 
lcd_mode);
-- 
2.1.0

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to