diff options
author | Neil Armstrong <narmstrong@baylibre.com> | 2019-07-04 15:52:06 +0200 |
---|---|---|
committer | Anatolij Gustschin <agust@denx.de> | 2019-07-29 00:21:40 +0200 |
commit | 1c1ed441b0d1d7d5fbf02cf89a390c04b18f8ba3 (patch) | |
tree | 9cbc29594340cd3961a60ed1800d6ef7dc5053f7 /common | |
parent | 245b1029e1af8b2e71c6d7aebc7d68bdebd644d3 (diff) | |
download | u-boot-1c1ed441b0d1d7d5fbf02cf89a390c04b18f8ba3.tar.gz u-boot-1c1ed441b0d1d7d5fbf02cf89a390c04b18f8ba3.tar.bz2 u-boot-1c1ed441b0d1d7d5fbf02cf89a390c04b18f8ba3.zip |
edid: add edid_get_timing_validate() variant to filter out edid modes
The original edid_get_timing() function returns the first valid timing,
but on some plaforms, we could only supports a subset of the listed
monitot's navite timing.
Let's introduce a edid_get_timing_validate() adding a mode_valid callback
including a private cookie pointer.
If the callback returns false, the current timing is discared and the next
one is checked. If no valid & supported timings are found, the function
would return an error.
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
Diffstat (limited to 'common')
-rw-r--r-- | common/edid.c | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/common/edid.c b/common/edid.c index 90d1167f6e..f244d26e04 100644 --- a/common/edid.c +++ b/common/edid.c @@ -168,8 +168,12 @@ static bool cea_is_hdmi_vsdb_present(struct edid_cea861_info *info) return false; } -int edid_get_timing(u8 *buf, int buf_size, struct display_timing *timing, - int *panel_bits_per_colourp) +int edid_get_timing_validate(u8 *buf, int buf_size, + struct display_timing *timing, + int *panel_bits_per_colourp, + bool (*mode_valid)(void *priv, + const struct display_timing *timing), + void *mode_valid_priv) { struct edid1_info *edid = (struct edid1_info *)buf; bool timing_done; @@ -193,7 +197,11 @@ int edid_get_timing(u8 *buf, int buf_size, struct display_timing *timing, desc = &edid->monitor_details.descriptor[i]; if (desc->zero_flag_1 != 0) { decode_timing((u8 *)desc, timing); - timing_done = true; + if (mode_valid) + timing_done = mode_valid(mode_valid_priv, + timing); + else + timing_done = true; break; } } @@ -225,6 +233,14 @@ int edid_get_timing(u8 *buf, int buf_size, struct display_timing *timing, return 0; } +int edid_get_timing(u8 *buf, int buf_size, struct display_timing *timing, + int *panel_bits_per_colourp) +{ + return edid_get_timing_validate(buf, buf_size, timing, + panel_bits_per_colourp, NULL, NULL); +} + + /** * Snip the tailing whitespace/return of a string. * |