Commit 53565c28 authored by Maxime Ripard's avatar Maxime Ripard

drm/vc4: hdmi: Rework power up

The current code tries to handle the case where CONFIG_PM isn't selected
by first calling our runtime_resume implementation and then properly
report the power state to the runtime_pm core.

This allows to have a functionning device even if pm_runtime_get_*
functions are nops.

However, the device power state if CONFIG_PM is enabled is
RPM_SUSPENDED, and thus our vc4_hdmi_write() and vc4_hdmi_read() calls
in the runtime_pm hooks will now report a warning since the device might
not be properly powered.

Even more so, we need CONFIG_PM enabled since the previous RaspberryPi
have a power domain that needs to be powered up for the HDMI controller
to be usable.

The previous patch has created a dependency on CONFIG_PM, now we can
just assume it's there and only call pm_runtime_resume_and_get() to make
sure our device is powered in bind.

Link: https://lore.kernel.org/r/20220629123510.1915022-39-maxime@cerno.techAcked-by: default avatarThomas Zimmermann <tzimmermann@suse.de>
Tested-by: default avatarStefan Wahren <stefan.wahren@i2se.com>
Signed-off-by: default avatarMaxime Ripard <maxime@cerno.tech>
parent f1bc386b
...@@ -2971,17 +2971,15 @@ static int vc4_hdmi_bind(struct device *dev, struct device *master, void *data) ...@@ -2971,17 +2971,15 @@ static int vc4_hdmi_bind(struct device *dev, struct device *master, void *data)
vc4_hdmi->disable_4kp60 = true; vc4_hdmi->disable_4kp60 = true;
} }
pm_runtime_enable(dev);
/* /*
* We need to have the device powered up at this point to call * We need to have the device powered up at this point to call
* our reset hook and for the CEC init. * our reset hook and for the CEC init.
*/ */
ret = vc4_hdmi_runtime_resume(dev); ret = pm_runtime_resume_and_get(dev);
if (ret) if (ret)
goto err_put_ddc; goto err_disable_runtime_pm;
pm_runtime_get_noresume(dev);
pm_runtime_set_active(dev);
pm_runtime_enable(dev);
if ((of_device_is_compatible(dev->of_node, "brcm,bcm2711-hdmi0") || if ((of_device_is_compatible(dev->of_node, "brcm,bcm2711-hdmi0") ||
of_device_is_compatible(dev->of_node, "brcm,bcm2711-hdmi1")) && of_device_is_compatible(dev->of_node, "brcm,bcm2711-hdmi1")) &&
...@@ -3027,6 +3025,7 @@ static int vc4_hdmi_bind(struct device *dev, struct device *master, void *data) ...@@ -3027,6 +3025,7 @@ static int vc4_hdmi_bind(struct device *dev, struct device *master, void *data)
err_destroy_encoder: err_destroy_encoder:
drm_encoder_cleanup(encoder); drm_encoder_cleanup(encoder);
pm_runtime_put_sync(dev); pm_runtime_put_sync(dev);
err_disable_runtime_pm:
pm_runtime_disable(dev); pm_runtime_disable(dev);
err_put_ddc: err_put_ddc:
put_device(&vc4_hdmi->ddc->dev); put_device(&vc4_hdmi->ddc->dev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment