Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/vc4: hdmi: Make sure the device is powered with CEC

Similarly to what we encountered with the detect hook with DRM, nothing
actually prevents any of the CEC callback from being run while the HDMI
output is disabled.

However, this is an issue since any register access to the controller
when it's powered down will result in a silent hang.

Let's make sure we run the runtime_pm hooks when the CEC adapter is
opened and closed by the userspace to avoid that issue.

Fixes: 15b4511a4af6 ("drm/vc4: add HDMI CEC support")
Reviewed-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
Signed-off-by: Maxime Ripard <maxime@cerno.tech>
Link: https://patchwork.freedesktop.org/patch/msgid/20210819135931.895976-6-maxime@cerno.tech

+9 -1
+9 -1
drivers/gpu/drm/vc4/vc4_hdmi.c
··· 1741 1741 struct vc4_hdmi *vc4_hdmi = cec_get_drvdata(adap); 1742 1742 /* clock period in microseconds */ 1743 1743 const u32 usecs = 1000000 / CEC_CLOCK_FREQ; 1744 - u32 val = HDMI_READ(HDMI_CEC_CNTRL_5); 1744 + u32 val; 1745 + int ret; 1745 1746 1747 + ret = pm_runtime_resume_and_get(&vc4_hdmi->pdev->dev); 1748 + if (ret) 1749 + return ret; 1750 + 1751 + val = HDMI_READ(HDMI_CEC_CNTRL_5); 1746 1752 val &= ~(VC4_HDMI_CEC_TX_SW_RESET | VC4_HDMI_CEC_RX_SW_RESET | 1747 1753 VC4_HDMI_CEC_CNT_TO_4700_US_MASK | 1748 1754 VC4_HDMI_CEC_CNT_TO_4500_US_MASK); ··· 1790 1784 1791 1785 HDMI_WRITE(HDMI_CEC_CNTRL_5, HDMI_READ(HDMI_CEC_CNTRL_5) | 1792 1786 VC4_HDMI_CEC_TX_SW_RESET | VC4_HDMI_CEC_RX_SW_RESET); 1787 + 1788 + pm_runtime_put(&vc4_hdmi->pdev->dev); 1793 1789 1794 1790 return 0; 1795 1791 }