[U-Boot] [PATCH 10/17] sunxi: video: Add suppport SoCs without HDMI, e.g. the A13 and A23

Hans de Goede
2014-12-24T19:06:22Z

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

Signed-off-by: Hans de Goede <hdegoede@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