drm/edid: add iterator for EDID base and extension blocks
Add an iterator abstraction for going through all the EDID blocks. Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> Signed-off-by: Jani Nikula <jani.nikula@intel.com> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/ce02778b353b906c928268de9d7569d493a9be5d.1651569697.git.jani.nikula@intel.com
This commit is contained in:
parent
9d72b7e2d2
commit
94afc53826
@ -1599,6 +1599,54 @@ static const void *edid_extension_block_data(const struct edid *edid, int index)
|
||||
return edid_block_data(edid, index + 1);
|
||||
}
|
||||
|
||||
/*
|
||||
* EDID base and extension block iterator.
|
||||
*
|
||||
* struct drm_edid_iter iter;
|
||||
* const u8 *block;
|
||||
*
|
||||
* drm_edid_iter_begin(edid, &iter);
|
||||
* drm_edid_iter_for_each(block, &iter) {
|
||||
* // do stuff with block
|
||||
* }
|
||||
* drm_edid_iter_end(&iter);
|
||||
*/
|
||||
struct drm_edid_iter {
|
||||
const struct edid *edid;
|
||||
|
||||
/* Current block index. */
|
||||
int index;
|
||||
};
|
||||
|
||||
static void drm_edid_iter_begin(const struct edid *edid,
|
||||
struct drm_edid_iter *iter)
|
||||
{
|
||||
memset(iter, 0, sizeof(*iter));
|
||||
|
||||
iter->edid = edid;
|
||||
}
|
||||
|
||||
static const void *__drm_edid_iter_next(struct drm_edid_iter *iter)
|
||||
{
|
||||
const void *block = NULL;
|
||||
|
||||
if (!iter->edid)
|
||||
return NULL;
|
||||
|
||||
if (iter->index < edid_block_count(iter->edid))
|
||||
block = edid_block_data(iter->edid, iter->index++);
|
||||
|
||||
return block;
|
||||
}
|
||||
|
||||
#define drm_edid_iter_for_each(__block, __iter) \
|
||||
while (((__block) = __drm_edid_iter_next(__iter)))
|
||||
|
||||
static void drm_edid_iter_end(struct drm_edid_iter *iter)
|
||||
{
|
||||
memset(iter, 0, sizeof(*iter));
|
||||
}
|
||||
|
||||
static const u8 edid_header[] = {
|
||||
0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user