Hi Maxime On Wed, 7 Jul 2021 at 10:23, Maxime Ripard <maxime@xxxxxxxxxx> wrote: > > In the bind hook, we actually need the device to have the HSM clock > running during the final part of the display initialisation where we > reset the controller and initialise the CEC component. > > Failing to do so will result in a complete, silent, hang of the CPU. > > Fixes: 411efa18e4b0 ("drm/vc4: hdmi: Move the HSM clock enable to runtime_pm") > Signed-off-by: Maxime Ripard <maxime@xxxxxxxxxx> > --- > drivers/gpu/drm/vc4/vc4_hdmi.c | 17 +++++++++++++++-- > 1 file changed, 15 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c > index aab1b36ceb3c..dac47b100b8b 100644 > --- a/drivers/gpu/drm/vc4/vc4_hdmi.c > +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c > @@ -2176,6 +2176,18 @@ static int vc4_hdmi_bind(struct device *dev, struct device *master, void *data) > vc4_hdmi->disable_4kp60 = true; > } > > + /* > + * We need to have the device powered up at this point to call > + * our reset hook and for the CEC init. > + */ > + ret = vc4_hdmi_runtime_resume(dev); vc4_hdmi_runtime_resume is within a #ifdef CONFIG_PM block, so potentially isn't defined. Admittedly we "select PM" in Kconfig so it should always be enabled, so perhaps it's better to just remove the #ifdef CONFIG_PM around the resume and suspend functions. That's possibly a separate issue to the issue that this patch is addressing, but may explain the test bot's failure. Otherwise Reviewed-by: Dave Stevenson <dave.stevenson@xxxxxxxxxxxxxxx> > + if (ret) > + goto err_put_ddc; > + > + pm_runtime_get_noresume(dev); > + pm_runtime_set_active(dev); > + pm_runtime_enable(dev); > + > if (vc4_hdmi->variant->reset) > vc4_hdmi->variant->reset(vc4_hdmi); > > @@ -2187,8 +2199,6 @@ static int vc4_hdmi_bind(struct device *dev, struct device *master, void *data) > clk_prepare_enable(vc4_hdmi->pixel_bvb_clock); > } > > - pm_runtime_enable(dev); > - > drm_simple_encoder_init(drm, encoder, DRM_MODE_ENCODER_TMDS); > drm_encoder_helper_add(encoder, &vc4_hdmi_encoder_helper_funcs); > > @@ -2208,6 +2218,8 @@ static int vc4_hdmi_bind(struct device *dev, struct device *master, void *data) > vc4_hdmi_debugfs_regs, > vc4_hdmi); > > + pm_runtime_put_sync(dev); > + > return 0; > > err_free_cec: > @@ -2216,6 +2228,7 @@ static int vc4_hdmi_bind(struct device *dev, struct device *master, void *data) > vc4_hdmi_connector_destroy(&vc4_hdmi->connector); > err_destroy_encoder: > drm_encoder_cleanup(encoder); > + pm_runtime_put_sync(dev); > pm_runtime_disable(dev); > err_put_ddc: > put_device(&vc4_hdmi->ddc->dev); > -- > 2.31.1 >