drm/vc4: hdmi: switch to struct drm_edid
authorJani Nikula <jani.nikula@intel.com>
Tue, 16 Apr 2024 13:22:21 +0000 (16:22 +0300)
committerJani Nikula <jani.nikula@intel.com>
Mon, 22 Apr 2024 18:44:30 +0000 (21:44 +0300)
Prefer struct drm_edid based functions over struct edid.

Acked-by: Maxime Ripard <mripard@kernel.org>
Link: https://patchwork.freedesktop.org/patch/msgid/eabece3ca7fae28395dcad0d2c221113cd924180.1713273659.git.jani.nikula@intel.com
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
drivers/gpu/drm/vc4/vc4_hdmi.c

index 5f8d51b..d30f8e8 100644 (file)
@@ -412,15 +412,14 @@ static void vc4_hdmi_handle_hotplug(struct vc4_hdmi *vc4_hdmi,
                                    enum drm_connector_status status)
 {
        struct drm_connector *connector = &vc4_hdmi->connector;
-       struct edid *edid;
+       const struct drm_edid *drm_edid;
        int ret;
 
        /*
-        * NOTE: This function should really be called with
-        * vc4_hdmi->mutex held, but doing so results in reentrancy
-        * issues since cec_s_phys_addr_from_edid might call
-        * .adap_enable, which leads to that funtion being called with
-        * our mutex held.
+        * NOTE: This function should really be called with vc4_hdmi->mutex
+        * held, but doing so results in reentrancy issues since
+        * cec_s_phys_addr() might call .adap_enable, which leads to that
+        * funtion being called with our mutex held.
         *
         * A similar situation occurs with vc4_hdmi_reset_link() that
         * will call into our KMS hooks if the scrambling was enabled.
@@ -435,12 +434,16 @@ static void vc4_hdmi_handle_hotplug(struct vc4_hdmi *vc4_hdmi,
                return;
        }
 
-       edid = drm_get_edid(connector, vc4_hdmi->ddc);
-       if (!edid)
+       drm_edid = drm_edid_read_ddc(connector, vc4_hdmi->ddc);
+
+       drm_edid_connector_update(connector, drm_edid);
+       cec_s_phys_addr(vc4_hdmi->cec_adap,
+                       connector->display_info.source_physical_address, false);
+
+       if (!drm_edid)
                return;
 
-       cec_s_phys_addr_from_edid(vc4_hdmi->cec_adap, edid);
-       kfree(edid);
+       drm_edid_free(drm_edid);
 
        for (;;) {
                ret = vc4_hdmi_reset_link(connector, ctx);
@@ -492,28 +495,29 @@ static int vc4_hdmi_connector_get_modes(struct drm_connector *connector)
 {
        struct vc4_hdmi *vc4_hdmi = connector_to_vc4_hdmi(connector);
        struct vc4_dev *vc4 = to_vc4_dev(connector->dev);
+       const struct drm_edid *drm_edid;
        int ret = 0;
-       struct edid *edid;
 
        /*
-        * NOTE: This function should really take vc4_hdmi->mutex, but
-        * doing so results in reentrancy issues since
-        * cec_s_phys_addr_from_edid might call .adap_enable, which
-        * leads to that funtion being called with our mutex held.
+        * NOTE: This function should really take vc4_hdmi->mutex, but doing so
+        * results in reentrancy issues since cec_s_phys_addr() might call
+        * .adap_enable, which leads to that funtion being called with our mutex
+        * held.
         *
         * Concurrency isn't an issue at the moment since we don't share
         * any state with any of the other frameworks so we can ignore
         * the lock for now.
         */
 
-       edid = drm_get_edid(connector, vc4_hdmi->ddc);
-       cec_s_phys_addr_from_edid(vc4_hdmi->cec_adap, edid);
-       if (!edid)
+       drm_edid = drm_edid_read_ddc(connector, vc4_hdmi->ddc);
+       drm_edid_connector_update(connector, drm_edid);
+       cec_s_phys_addr(vc4_hdmi->cec_adap,
+                       connector->display_info.source_physical_address, false);
+       if (!drm_edid)
                return 0;
 
-       drm_connector_update_edid_property(connector, edid);
-       ret = drm_add_edid_modes(connector, edid);
-       kfree(edid);
+       ret = drm_edid_connector_add_modes(connector);
+       drm_edid_free(drm_edid);
 
        if (!vc4->hvs->vc5_hdmi_enable_hdmi_20) {
                struct drm_device *drm = connector->dev;