sunxi: video: Give hotplug-detect (hpd) signal some time to show up
authorHans de Goede <hdegoede@redhat.com>
Sat, 20 Dec 2014 14:15:23 +0000 (15:15 +0100)
committerHans de Goede <hdegoede@redhat.com>
Wed, 14 Jan 2015 13:56:38 +0000 (14:56 +0100)
When using a hdmi powered hdmi to vga dongle, and cold booting a sunxi
device, the hpd detect code would not see the dongle (until a warm reboot),
because the dongle needs some time to boot.

Testing has shown that this dongle needs 213ms to respond on a cold boot,
so wait up to 300ms for a hpd signal to show up before giving up.

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 795835de8e008645dadc7419dd4e7c689f1677ae..5a14785666c662e674bcadeb3b9be3d586837977 100644 (file)
@@ -48,6 +48,7 @@ static int sunxi_hdmi_hpd_detect(void)
                (struct sunxi_ccm_reg *)SUNXI_CCM_BASE;
        struct sunxi_hdmi_reg * const hdmi =
                (struct sunxi_hdmi_reg *)SUNXI_HDMI_BASE;
+       unsigned long tmo = timer_get_us() + 300000;
 
        /* Set pll3 to 300MHz */
        clock_set_pll3(300000000);
@@ -68,9 +69,12 @@ static int sunxi_hdmi_hpd_detect(void)
        writel(SUNXI_HDMI_CTRL_ENABLE, &hdmi->ctrl);
        writel(SUNXI_HDMI_PAD_CTRL0_HDP, &hdmi->pad_ctrl0);
 
-       udelay(1000);
+       while (timer_get_us() < tmo) {
+               if (readl(&hdmi->hpd) & SUNXI_HDMI_HPD_DETECT)
+                       return 1;
+       }
 
-       return (readl(&hdmi->hpd) & SUNXI_HDMI_HPD_DETECT) ? 1 : 0;
+       return 0;
 }
 
 static void sunxi_hdmi_shutdown(void)