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>
This commit is contained in:
Neil Armstrong 2019-07-04 15:52:06 +02:00 committed by Anatolij Gustschin
parent 245b1029e1
commit 1c1ed441b0
2 changed files with 41 additions and 3 deletions

View file

@ -306,6 +306,28 @@ int edid_get_ranges(struct edid1_info *edid, unsigned int *hmin,
struct display_timing;
/**
* edid_get_timing_validate() - Get basic digital display parameters with
* mode selection callback
*
* @param buf Buffer containing EDID data
* @param buf_size Size of buffer in bytes
* @param timing Place to put preferring timing information
* @param panel_bits_per_colourp Place to put the number of bits per
* colour supported by the panel. This will be set to
* -1 if not available
* @param mode_valid Callback validating mode, returning true is mode is
* supported, false otherwise.
* @parem valid_priv Pointer to private data for mode_valid callback
* @return 0 if timings are OK, -ve on error
*/
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);
/**
* edid_get_timing() - Get basic digital display parameters
*