diff options
author | Hans de Goede <hdegoede@redhat.com> | 2014-12-20 14:01:48 +0100 |
---|---|---|
committer | Hans de Goede <hdegoede@redhat.com> | 2015-01-14 14:56:38 +0100 |
commit | 63c5fbdfb9f4c4f735f5f8d21f2c6156cc5c6546 (patch) | |
tree | 3a05ce2a7fa2499d64055fa8ed3c7e36fc231b6a | |
parent | 5ee0bea49ab8a150fc3c1f4def7b72df101db662 (diff) |
sunxi: video: Add sunxi_hdmi_edid_get_block helper function
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>
-rw-r--r-- | drivers/video/sunxi_display.c | 31 |
1 files changed, 20 insertions, 11 deletions
diff --git a/drivers/video/sunxi_display.c b/drivers/video/sunxi_display.c index 394153a34d..3048410441 100644 --- a/drivers/video/sunxi_display.c +++ b/drivers/video/sunxi_display.c @@ -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); |