sunxi: video: Add sunxi_hdmi_edid_get_block helper function
authorHans de Goede <hdegoede@redhat.com>
Sat, 20 Dec 2014 13:01:48 +0000 (14:01 +0100)
committerHans de Goede <hdegoede@redhat.com>
Wed, 14 Jan 2015 13:56:38 +0000 (14:56 +0100)
Add a sunxi_hdmi_edid_get_block helper function, this is a preparation patch
for adding support for parsing EDID extension blocks.

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 394153a34d849c115e932c6eb4c3abe0364244fd..3048410441521f1112ca7b88c3efc7eb5ad94d28 100644 (file)
@@ -137,6 +137,24 @@ static int sunxi_hdmi_ddc_read(int offset, u8 *buf, int count)
        return 0;
 }
 
+static int sunxi_hdmi_edid_get_block(int block, u8 *buf)
+{
+       int r, retries = 2;
+
+       do {
+               r = sunxi_hdmi_ddc_read(block * 128, buf, 128);
+               if (r)
+                       continue;
+               r = edid_check_checksum(buf);
+               if (r) {
+                       printf("EDID block %d: checksum error%s\n",
+                              block, retries ? ", retrying" : "");
+               }
+       } while (r && retries--);
+
+       return r;
+}
+
 static int sunxi_hdmi_edid_get_mode(struct ctfb_res_modes *mode)
 {
        struct edid1_info edid1;
@@ -146,7 +164,7 @@ static int sunxi_hdmi_edid_get_mode(struct ctfb_res_modes *mode)
                (struct sunxi_hdmi_reg *)SUNXI_HDMI_BASE;
        struct sunxi_ccm_reg * const ccm =
                (struct sunxi_ccm_reg *)SUNXI_CCM_BASE;
-       int i, r, retries = 2;
+       int i, r;
 
        /* SUNXI_HDMI_CTRL_ENABLE & PAD_CTRL0 are already set by hpd_detect */
        writel(SUNXI_HDMI_PAD_CTRL1 | SUNXI_HDMI_PAD_CTRL1_HALVE,
@@ -170,16 +188,7 @@ static int sunxi_hdmi_edid_get_mode(struct ctfb_res_modes *mode)
               SUNXI_HMDI_DDC_LINE_CTRL_SCL_ENABLE, &hdmi->ddc_line_ctrl);
 #endif
 
-       do {
-               r = sunxi_hdmi_ddc_read(0, (u8 *)&edid1, 128);
-               if (r)
-                       continue;
-               r = edid_check_checksum((u8 *)&edid1);
-               if (r) {
-                       printf("EDID: checksum error%s\n",
-                              retries ? ", retrying" : "");
-               }
-       } while (r && retries--);
+       r = sunxi_hdmi_edid_get_block(0, (u8 *)&edid1);
 
        /* Disable DDC engine, no longer needed */
        clrbits_le32(&hdmi->ddc_ctrl, SUNXI_HMDI_DDC_CTRL_ENABLE);