mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
drm/panthor: Use existing OPP table if present
On SoCs where the GPU's power-domain is in charge of setting performance levels, the OPP table of the GPU node will have already been populated during said power-domain's attach_dev operation. To avoid initialising an OPP table twice, only set the OPP regulator and the OPPs from DT if there's no OPP table present. Reviewed-by: Chia-I Wu <olvaffe@gmail.com> Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com> Reviewed-by: Steven Price <steven.price@arm.com> Reviewed-by: Liviu Dudau <liviu.dudau@arm.com> Signed-off-by: Nicolas Frattaroli <nicolas.frattaroli@collabora.com> Link: https://patch.msgid.link/20251017-mt8196-gpufreq-v8-4-98fc1cc566a1@collabora.com Signed-off-by: Liviu Dudau <liviu.dudau@arm.com>
This commit is contained in:
committed by
Liviu Dudau
parent
3dd4844ba0
commit
3668133e11
@@ -142,6 +142,7 @@ int panthor_devfreq_init(struct panthor_device *ptdev)
|
|||||||
struct thermal_cooling_device *cooling;
|
struct thermal_cooling_device *cooling;
|
||||||
struct device *dev = ptdev->base.dev;
|
struct device *dev = ptdev->base.dev;
|
||||||
struct panthor_devfreq *pdevfreq;
|
struct panthor_devfreq *pdevfreq;
|
||||||
|
struct opp_table *table;
|
||||||
struct dev_pm_opp *opp;
|
struct dev_pm_opp *opp;
|
||||||
unsigned long cur_freq;
|
unsigned long cur_freq;
|
||||||
unsigned long freq = ULONG_MAX;
|
unsigned long freq = ULONG_MAX;
|
||||||
@@ -153,16 +154,29 @@ int panthor_devfreq_init(struct panthor_device *ptdev)
|
|||||||
|
|
||||||
ptdev->devfreq = pdevfreq;
|
ptdev->devfreq = pdevfreq;
|
||||||
|
|
||||||
ret = devm_pm_opp_set_regulators(dev, reg_names);
|
/*
|
||||||
if (ret && ret != -ENODEV) {
|
* The power domain associated with the GPU may have already added an
|
||||||
if (ret != -EPROBE_DEFER)
|
* OPP table, complete with OPPs, as part of the platform bus
|
||||||
DRM_DEV_ERROR(dev, "Couldn't set OPP regulators\n");
|
* initialization. If this is the case, the power domain is in charge of
|
||||||
return ret;
|
* also controlling the performance, with a set_performance callback.
|
||||||
}
|
* Only add a new OPP table from DT if there isn't such a table present
|
||||||
|
* already.
|
||||||
|
*/
|
||||||
|
table = dev_pm_opp_get_opp_table(dev);
|
||||||
|
if (IS_ERR_OR_NULL(table)) {
|
||||||
|
ret = devm_pm_opp_set_regulators(dev, reg_names);
|
||||||
|
if (ret && ret != -ENODEV) {
|
||||||
|
if (ret != -EPROBE_DEFER)
|
||||||
|
DRM_DEV_ERROR(dev, "Couldn't set OPP regulators\n");
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
ret = devm_pm_opp_of_add_table(dev);
|
ret = devm_pm_opp_of_add_table(dev);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
} else {
|
||||||
|
dev_pm_opp_put_opp_table(table);
|
||||||
|
}
|
||||||
|
|
||||||
spin_lock_init(&pdevfreq->lock);
|
spin_lock_init(&pdevfreq->lock);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user