sunxi: video: Add hpd option
authorHans de Goede <hdegoede@redhat.com>
Fri, 19 Dec 2014 14:13:57 +0000 (15:13 +0100)
committerHans de Goede <hdegoede@redhat.com>
Wed, 14 Jan 2015 13:56:38 +0000 (14:56 +0100)
Allow the user to specify hpd=0 as option in the video-mode env. variable,
if hpd is set to 0 then the hdmi output will be brought up even if no cable
is connected.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Acked-by: Ian Campbell <ijc@hellion.org.uk>
Acked-by: Anatolij Gustschin <agust@denx.de>
drivers/video/sunxi_display.c

index cf81e452c7a6ea1414bc743315499d5423a30f32..18fa83dcedf9a576c43d98339def12067fe6b24e 100644 (file)
@@ -53,10 +53,16 @@ static int sunxi_hdmi_hpd_detect(void)
 
        udelay(1000);
 
-       if (readl(&hdmi->hpd) & SUNXI_HDMI_HPD_DETECT)
-               return 1;
+       return (readl(&hdmi->hpd) & SUNXI_HDMI_HPD_DETECT) ? 1 : 0;
+}
+
+static void sunxi_hdmi_shutdown(void)
+{
+       struct sunxi_ccm_reg * const ccm =
+               (struct sunxi_ccm_reg *)SUNXI_CCM_BASE;
+       struct sunxi_hdmi_reg * const hdmi =
+               (struct sunxi_hdmi_reg *)SUNXI_HDMI_BASE;
 
-       /* No need to keep these running */
        clrbits_le32(&hdmi->ctrl, SUNXI_HDMI_CTRL_ENABLE);
        clrbits_le32(&ccm->hdmi_clk_cfg, CCM_HDMI_CTRL_GATE);
        clrbits_le32(&ccm->ahb_gate1, 1 << AHB_GATE_OFFSET_HDMI);
@@ -64,8 +70,6 @@ static int sunxi_hdmi_hpd_detect(void)
        clrbits_le32(&ccm->ahb_reset1_cfg, 1 << AHB_RESET_OFFSET_HDMI);
 #endif
        clock_set_pll3(0);
-
-       return 0;
 }
 
 /*
@@ -361,7 +365,7 @@ void *video_hw_init(void)
        const struct ctfb_res_modes *mode;
        const char *options;
        unsigned int depth;
-       int ret;
+       int ret, hpd;
 
        memset(&sunxi_display, 0, sizeof(struct sunxi_display));
 
@@ -370,12 +374,16 @@ void *video_hw_init(void)
        gd->fb_base = gd->ram_top;
 
        video_get_ctfb_res_modes(RES_MODE_1024x768, 24, &mode, &depth, &options);
+       hpd = video_get_option_int(options, "hpd", 1);
 
+       /* Always call hdp_detect, as it also enables various clocks, etc. */
        ret = sunxi_hdmi_hpd_detect();
-       if (!ret)
+       if (hpd && !ret) {
+               sunxi_hdmi_shutdown();
                return NULL;
-
-       printf("HDMI connected.\n");
+       }
+       if (ret)
+               printf("HDMI connected: ");
 
        if (mode->vmode != FB_VMODE_NONINTERLACED) {
                printf("Only non-interlaced modes supported, falling back to 1024x768\n");