Commit 8865dd75 authored by Dave Airlie's avatar Dave Airlie

Merge tag 'drm-misc-fixes-2022-10-13' of git://anongit.freedesktop.org/drm/drm-misc into drm-fixes

Short summary of fixes pull:

 * vc4: HDMI fixes
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>

From: Thomas Zimmermann <tzimmermann@suse.de>
Link: https://patchwork.freedesktop.org/patch/msgid/Y0gGdlujszCstDeP@linux-uq9g
parents 9abf2313 4190e8bb
...@@ -490,6 +490,7 @@ module_init(vc4_drm_register); ...@@ -490,6 +490,7 @@ module_init(vc4_drm_register);
module_exit(vc4_drm_unregister); module_exit(vc4_drm_unregister);
MODULE_ALIAS("platform:vc4-drm"); MODULE_ALIAS("platform:vc4-drm");
MODULE_SOFTDEP("pre: snd-soc-hdmi-codec");
MODULE_DESCRIPTION("Broadcom VC4 DRM Driver"); MODULE_DESCRIPTION("Broadcom VC4 DRM Driver");
MODULE_AUTHOR("Eric Anholt <eric@anholt.net>"); MODULE_AUTHOR("Eric Anholt <eric@anholt.net>");
MODULE_LICENSE("GPL v2"); MODULE_LICENSE("GPL v2");
...@@ -3318,12 +3318,37 @@ static int vc4_hdmi_runtime_resume(struct device *dev) ...@@ -3318,12 +3318,37 @@ static int vc4_hdmi_runtime_resume(struct device *dev)
struct vc4_hdmi *vc4_hdmi = dev_get_drvdata(dev); struct vc4_hdmi *vc4_hdmi = dev_get_drvdata(dev);
unsigned long __maybe_unused flags; unsigned long __maybe_unused flags;
u32 __maybe_unused value; u32 __maybe_unused value;
unsigned long rate;
int ret; int ret;
/*
* The HSM clock is in the HDMI power domain, so we need to set
* its frequency while the power domain is active so that it
* keeps its rate.
*/
ret = clk_set_min_rate(vc4_hdmi->hsm_clock, HSM_MIN_CLOCK_FREQ);
if (ret)
return ret;
ret = clk_prepare_enable(vc4_hdmi->hsm_clock); ret = clk_prepare_enable(vc4_hdmi->hsm_clock);
if (ret) if (ret)
return ret; return ret;
/*
* Whenever the RaspberryPi boots without an HDMI monitor
* plugged in, the firmware won't have initialized the HSM clock
* rate and it will be reported as 0.
*
* If we try to access a register of the controller in such a
* case, it will lead to a silent CPU stall. Let's make sure we
* prevent such a case.
*/
rate = clk_get_rate(vc4_hdmi->hsm_clock);
if (!rate) {
ret = -EINVAL;
goto err_disable_clk;
}
if (vc4_hdmi->variant->reset) if (vc4_hdmi->variant->reset)
vc4_hdmi->variant->reset(vc4_hdmi); vc4_hdmi->variant->reset(vc4_hdmi);
...@@ -3345,6 +3370,10 @@ static int vc4_hdmi_runtime_resume(struct device *dev) ...@@ -3345,6 +3370,10 @@ static int vc4_hdmi_runtime_resume(struct device *dev)
#endif #endif
return 0; return 0;
err_disable_clk:
clk_disable_unprepare(vc4_hdmi->hsm_clock);
return ret;
} }
static void vc4_hdmi_put_ddc_device(void *ptr) static void vc4_hdmi_put_ddc_device(void *ptr)
......
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