summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorNeil Armstrong <narmstrong@baylibre.com>2019-07-04 15:52:06 +0200
committerAnatolij Gustschin <agust@denx.de>2019-07-29 00:21:40 +0200
commit1c1ed441b0d1d7d5fbf02cf89a390c04b18f8ba3 (patch)
tree9cbc29594340cd3961a60ed1800d6ef7dc5053f7 /common
parent245b1029e1af8b2e71c6d7aebc7d68bdebd644d3 (diff)
downloadu-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.c22
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.
*