]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/vc4: fix infinite EPROBE_DEFER loop
authorGabriel Dalimonte <gabriel.dalimonte@gmail.com>
Sun, 1 Jun 2025 16:45:36 +0000 (12:45 -0400)
committerMaxime Ripard <mripard@kernel.org>
Tue, 10 Jun 2025 08:47:04 +0000 (10:47 +0200)
`vc4_hdmi_audio_init` calls `devm_snd_dmaengine_pcm_register` which may
return EPROBE_DEFER. Calling `drm_connector_hdmi_audio_init` adds a
child device. The driver model docs[1] state that adding a child device
prior to returning EPROBE_DEFER may result in an infinite loop.

[1] https://www.kernel.org/doc/html/v6.14/driver-api/driver-model/driver.html

Fixes: 9640f1437a88 ("drm/vc4: hdmi: switch to using generic HDMI Codec infrastructure")
Signed-off-by: Gabriel Dalimonte <gabriel.dalimonte@gmail.com>
Link: https://lore.kernel.org/r/20250601-vc4-audio-inf-probe-v2-1-9ad43c7b6147@gmail.com
Signed-off-by: Maxime Ripard <mripard@kernel.org>
drivers/gpu/drm/vc4/vc4_hdmi.c

index a29a6ef266f9a5952af53030a9a2d313e2ecdfce..163d092bd973bb3dfc5ea61187ec5fdf4f4f6029 100644 (file)
@@ -560,12 +560,6 @@ static int vc4_hdmi_connector_init(struct drm_device *dev,
        if (ret)
                return ret;
 
-       ret = drm_connector_hdmi_audio_init(connector, dev->dev,
-                                           &vc4_hdmi_audio_funcs,
-                                           8, false, -1);
-       if (ret)
-               return ret;
-
        drm_connector_helper_add(connector, &vc4_hdmi_connector_helper_funcs);
 
        /*
@@ -2291,6 +2285,12 @@ static int vc4_hdmi_audio_init(struct vc4_hdmi *vc4_hdmi)
                return ret;
        }
 
+       ret = drm_connector_hdmi_audio_init(&vc4_hdmi->connector, dev,
+                                           &vc4_hdmi_audio_funcs, 8, false,
+                                           -1);
+       if (ret)
+               return ret;
+
        dai_link->cpus          = &vc4_hdmi->audio.cpu;
        dai_link->codecs        = &vc4_hdmi->audio.codec;
        dai_link->platforms     = &vc4_hdmi->audio.platform;