Message ID | 20210922125419.4125779-6-maxime@cerno.tech (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | drm/vc4: hdmi: Remove CPU hangs, take 2 | expand |
On Wed, 2021-09-22 at 14:54 +0200, Maxime Ripard wrote: > If the HPD GPIO is not available and drm_probe_ddc fails, we end up > reading the HDMI_HOTPLUG register, but the controller might be powered > off resulting in a CPU hang. Make sure we have the power domain and the > HSM clock powered during the detect cycle to prevent the hang from > happening. > > Fixes: 4f6e3d66ac52 ("drm/vc4: Add runtime PM support to the HDMI encoder driver") > Signed-off-by: Maxime Ripard <maxime@cerno.tech> > Reviewed-by: Dave Stevenson <dave.stevenson@raspberrypi.com> > --- Reviewed-by: Nicolas Saenz Julienne <nsaenz@kernel.org> Tested-by: Nicolas Saenz Julienne <nsaenz@kernel.org> Regards, Nicolas
On Wed, 22 Sep 2021 14:54:19 +0200, Maxime Ripard wrote: > If the HPD GPIO is not available and drm_probe_ddc fails, we end up > reading the HDMI_HOTPLUG register, but the controller might be powered > off resulting in a CPU hang. Make sure we have the power domain and the > HSM clock powered during the detect cycle to prevent the hang from > happening. > > > [...] Applied to drm/drm-misc (drm-misc-fixes). Thanks! Maxime
diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c index 630b84ab73a2..8e6d7e1af200 100644 --- a/drivers/gpu/drm/vc4/vc4_hdmi.c +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c @@ -168,6 +168,8 @@ vc4_hdmi_connector_detect(struct drm_connector *connector, bool force) struct vc4_hdmi *vc4_hdmi = connector_to_vc4_hdmi(connector); bool connected = false; + WARN_ON(pm_runtime_resume_and_get(&vc4_hdmi->pdev->dev)); + if (vc4_hdmi->hpd_gpio && gpiod_get_value_cansleep(vc4_hdmi->hpd_gpio)) { connected = true; @@ -188,10 +190,12 @@ vc4_hdmi_connector_detect(struct drm_connector *connector, bool force) } } + pm_runtime_put(&vc4_hdmi->pdev->dev); return connector_status_connected; } cec_phys_addr_invalidate(vc4_hdmi->cec_adap); + pm_runtime_put(&vc4_hdmi->pdev->dev); return connector_status_disconnected; }