Iterate through all CEA data blocks.

Cc: Ville Syrjälä <ville.syrj...@linux.intel.com>
Signed-off-by: Jani Nikula <jani.nik...@intel.com>
---
 drivers/gpu/drm/drm_edid.c | 23 +++++++++++++----------
 1 file changed, 13 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index b1fac281fd85..e47bbcd103e6 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -5190,10 +5190,10 @@ EXPORT_SYMBOL(drm_detect_hdmi_monitor);
  */
 bool drm_detect_monitor_audio(const struct edid *edid)
 {
+       const struct cea_db *db;
+       struct cea_db_iter iter;
        const u8 *edid_ext;
-       int i, j;
        bool has_audio = false;
-       int start_offset, end_offset;
 
        edid_ext = drm_find_cea_extension(edid);
        if (!edid_ext)
@@ -5207,18 +5207,21 @@ bool drm_detect_monitor_audio(const struct edid *edid)
                goto end;
        }
 
-       if (cea_db_offsets(edid_ext, &start_offset, &end_offset))
-               goto end;
+       cea_db_iter_edid_begin(edid, &iter);
+       cea_db_iter_for_each(db, &iter) {
+               if (cea_db_tag(db) == CTA_DB_AUDIO) {
+                       const u8 *data = cea_db_data(db);
+                       int i;
 
-       for_each_cea_db(edid_ext, i, start_offset, end_offset) {
-               if (cea_db_tag(&edid_ext[i]) == CTA_DB_AUDIO) {
-                       has_audio = true;
-                       for (j = 1; j < cea_db_payload_len(&edid_ext[i]) + 1; j 
+= 3)
+                       for (i = 0; i < cea_db_payload_len(db); i += 3)
                                DRM_DEBUG_KMS("CEA audio format %d\n",
-                                             (edid_ext[i + j] >> 3) & 0xf);
-                       goto end;
+                                             (data[i] >> 3) & 0xf);
+                       has_audio = true;
+                       break;
                }
        }
+       cea_db_iter_end(&iter);
+
 end:
        return has_audio;
 }
-- 
2.30.2

Reply via email to