[RFC PATCH 08/18] drm/panthor: Skip devfreq when no OPP table is present

From: Karunika Choo

Date: Thu May 28 2026 - 11:19:41 EST


On Mali v15 AM systems, frequency scaling is handled outside panthor by
the AM_GOVERNOR block, so the GPU DT node may not provide an OPP table.

Make panthor_devfreq_init() return early when operating-points-v2 is
absent, and guard the devfreq helper paths against a missing devfreq
instance.

This keeps devfreq enabled for existing platforms while allowing v15 AM
systems to probe without a local devfreq setup.

Signed-off-by: Karunika Choo <karunika.choo@xxxxxxx>
---
drivers/gpu/drm/panthor/panthor_devfreq.c | 13 ++++++++-----
1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/panthor/panthor_devfreq.c b/drivers/gpu/drm/panthor/panthor_devfreq.c
index 2249b41ca4af..c3252ce54437 100644
--- a/drivers/gpu/drm/panthor/panthor_devfreq.c
+++ b/drivers/gpu/drm/panthor/panthor_devfreq.c
@@ -148,6 +148,9 @@ int panthor_devfreq_init(struct panthor_device *ptdev)
unsigned long freq = ULONG_MAX;
int ret;

+ if (!device_property_read_bool(ptdev->base.dev, "operating-points-v2"))
+ return 0;
+
pdevfreq = drmm_kzalloc(&ptdev->base, sizeof(*ptdev->devfreq), GFP_KERNEL);
if (!pdevfreq)
return -ENOMEM;
@@ -267,7 +270,7 @@ void panthor_devfreq_resume(struct panthor_device *ptdev)
{
struct panthor_devfreq *pdevfreq = ptdev->devfreq;

- if (!pdevfreq->devfreq)
+ if (!pdevfreq || !pdevfreq->devfreq)
return;

panthor_devfreq_reset(pdevfreq);
@@ -279,7 +282,7 @@ void panthor_devfreq_suspend(struct panthor_device *ptdev)
{
struct panthor_devfreq *pdevfreq = ptdev->devfreq;

- if (!pdevfreq->devfreq)
+ if (!pdevfreq || !pdevfreq->devfreq)
return;

drm_WARN_ON(&ptdev->base, devfreq_suspend_device(pdevfreq->devfreq));
@@ -290,7 +293,7 @@ void panthor_devfreq_record_busy(struct panthor_device *ptdev)
struct panthor_devfreq *pdevfreq = ptdev->devfreq;
unsigned long irqflags;

- if (!pdevfreq->devfreq)
+ if (!pdevfreq || !pdevfreq->devfreq)
return;

spin_lock_irqsave(&pdevfreq->lock, irqflags);
@@ -306,7 +309,7 @@ void panthor_devfreq_record_idle(struct panthor_device *ptdev)
struct panthor_devfreq *pdevfreq = ptdev->devfreq;
unsigned long irqflags;

- if (!pdevfreq->devfreq)
+ if (!pdevfreq || !pdevfreq->devfreq)
return;

spin_lock_irqsave(&pdevfreq->lock, irqflags);
@@ -323,7 +326,7 @@ unsigned long panthor_devfreq_get_freq(struct panthor_device *ptdev)
unsigned long freq = 0;
int ret;

- if (!pdevfreq->devfreq)
+ if (!pdevfreq || !pdevfreq->devfreq)
return 0;

ret = pdevfreq->devfreq->profile->get_cur_freq(ptdev->base.dev, &freq);
--
2.43.0