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