
On Sat, 6 Mar 2021 20:54:22 +0100 Jernej Skrabec jernej.skrabec@siol.net wrote:
Code which searches for valid detailed timing entry will be used in more places. Extract it.
No functional change is made. However, descriptors are casted to edid_detailed_timing instead of edid_monitor_descriptor. Descriptor can be of either type, but since we're interested only in DTD, it is more fitting to cast to edid_detailed_timing.
Thanks for adding the explanation!
Signed-off-by: Jernej Skrabec jernej.skrabec@siol.net
Reviewed-by: Andre Przywara andre.przywara@arm.com
common/edid.c | 49 ++++++++++++++++++++++++++++--------------------- 1 file changed, 28 insertions(+), 21 deletions(-)
diff --git a/common/edid.c b/common/edid.c index 1cb7177742e8..a6c875d9c8e8 100644 --- a/common/edid.c +++ b/common/edid.c @@ -169,6 +169,29 @@ static bool cea_is_hdmi_vsdb_present(struct edid_cea861_info *info) return false; }
+static bool edid_find_valid_timing(void *buf, int count,
struct display_timing *timing,
bool (*mode_valid)(void *priv,
const struct display_timing *timing),
void *mode_valid_priv)
+{
- struct edid_detailed_timing *t = buf;
- bool found = false;
- int i;
- for (i = 0; i < count && !found; i++, t++)
if (EDID_DETAILED_TIMING_PIXEL_CLOCK(*t) != 0) {
decode_timing((u8 *)t, timing);
if (mode_valid)
found = mode_valid(mode_valid_priv,
timing);
else
found = true;
}
- return found;
+}
int edid_get_timing_validate(u8 *buf, int buf_size, struct display_timing *timing, int *panel_bits_per_colourp, @@ -177,8 +200,7 @@ int edid_get_timing_validate(u8 *buf, int buf_size, void *mode_valid_priv) { struct edid1_info *edid = (struct edid1_info *)buf;
- bool timing_done;
- int i;
bool found;
if (buf_size < sizeof(*edid) || edid_check_info(edid)) { debug("%s: Invalid buffer\n", __func__);
@@ -195,25 +217,10 @@ int edid_get_timing_validate(u8 *buf, int buf_size, return -ENOENT; }
- /* Look for detailed timing */
- timing_done = false;
- for (i = 0; i < 4; i++) {
struct edid_monitor_descriptor *desc;
desc = &edid->monitor_details.descriptor[i];
if (desc->zero_flag_1 != 0) {
decode_timing((u8 *)desc, timing);
if (mode_valid)
timing_done = mode_valid(mode_valid_priv,
timing);
else
timing_done = true;
if (timing_done)
break;
}
- }
- if (!timing_done)
/* Look for detailed timing in base EDID */
found = edid_find_valid_timing(edid->monitor_details.descriptor, 4,
timing, mode_valid, mode_valid_priv);
if (!found) return -EINVAL;
if (edid->version != 1 || edid->revision < 4) {