[PATCH RFC/DO NOT MERGE 08/12] drm/msm/hdmi: Add support for PM OPP table
From: Krzysztof Kozlowski
Date: Fri Aug 28 2026 - 10:07:21 EST
Allow scaling the domain rails with PM OPP, which uses the pixclock
("extp"). This allows proper votes depending on requested HDMI pixel
rate.
Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@xxxxxxxxxxxxxxxx>
---
drivers/gpu/drm/msm/hdmi/hdmi.c | 8 ++++++++
drivers/gpu/drm/msm/hdmi/hdmi_bridge.c | 10 +++++++---
2 files changed, 15 insertions(+), 3 deletions(-)
diff --git a/drivers/gpu/drm/msm/hdmi/hdmi.c b/drivers/gpu/drm/msm/hdmi/hdmi.c
index 474006084633..c46f30063f14 100644
--- a/drivers/gpu/drm/msm/hdmi/hdmi.c
+++ b/drivers/gpu/drm/msm/hdmi/hdmi.c
@@ -368,6 +368,14 @@ static int msm_hdmi_dev_probe(struct platform_device *pdev)
goto err_put_bridge;
}
+ ret = devm_pm_opp_set_clkname(dev, "extp");
+ if (ret)
+ return ret;
+
+ ret = devm_pm_opp_of_add_table(dev);
+ if (ret && ret != -ENODEV)
+ return dev_err_probe(dev, ret, "invalid OPP table in device tree\n");
+
if (!hdmi->hpd_gpiod)
DBG("failed to get HPD gpio");
diff --git a/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c b/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c
index d0e3b27644fe..621083a97b37 100644
--- a/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c
+++ b/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c
@@ -5,6 +5,7 @@
*/
#include <linux/delay.h>
+#include <linux/pm_opp.h>
#include <drm/drm_bridge_connector.h>
#include <drm/drm_edid.h>
#include <drm/display/drm_hdmi_helper.h>
@@ -30,9 +31,10 @@ static void msm_hdmi_clk_prepare(struct drm_bridge *bridge)
if (hdmi->extp_clk) {
DBG("pixclock: %lu", hdmi->pixclock);
- ret = clk_set_rate(hdmi->extp_clk, hdmi->pixclock);
+
+ ret = dev_pm_opp_set_rate(&hdmi->pdev->dev, hdmi->pixclock);
if (ret)
- DRM_DEV_ERROR(dev->dev, "failed to set extp clk rate: %d\n", ret);
+ DRM_DEV_ERROR(dev->dev, "failed to set OPP rate: %d\n", ret);
ret = clk_prepare_enable(hdmi->extp_clk);
if (ret)
@@ -58,8 +60,10 @@ static void msm_hdmi_clk_unprepare(struct drm_bridge *bridge)
struct hdmi_bridge *hdmi_bridge = to_hdmi_bridge(bridge);
struct hdmi *hdmi = hdmi_bridge->hdmi;
- if (hdmi->extp_clk)
+ if (hdmi->extp_clk) {
clk_disable_unprepare(hdmi->extp_clk);
+ dev_pm_opp_set_rate(&hdmi->pdev->dev, 0);
+ }
}
#define AVI_IFRAME_LINE_NUMBER 1
--
2.53.0