mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2025-01-20 06:29:49 +07:00
drm/panfrost: add regulators to devfreq
Some OPP tables specify voltage for each frequency. Devfreq can handle these regulators but they should be get only 1 time to avoid issue and know who is in charge. If OPP table is probe don't init regulator. Reviewed-by: Steven Price <steven.price@arm.com> Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com> Signed-off-by: Clément Péron <peron.clem@gmail.com> Signed-off-by: Rob Herring <robh@kernel.org> Link: https://patchwork.freedesktop.org/patch/msgid/20200710095409.407087-11-peron.clem@gmail.com
This commit is contained in:
parent
512f21227f
commit
fd587ff01d
@ -93,14 +93,30 @@ int panfrost_devfreq_init(struct panfrost_device *pfdev)
|
||||
unsigned long cur_freq;
|
||||
struct device *dev = &pfdev->pdev->dev;
|
||||
struct devfreq *devfreq;
|
||||
struct opp_table *opp_table;
|
||||
struct thermal_cooling_device *cooling;
|
||||
struct panfrost_devfreq *pfdevfreq = &pfdev->pfdevfreq;
|
||||
|
||||
opp_table = dev_pm_opp_set_regulators(dev, pfdev->comp->supply_names,
|
||||
pfdev->comp->num_supplies);
|
||||
if (IS_ERR(opp_table)) {
|
||||
ret = PTR_ERR(opp_table);
|
||||
/* Continue if the optional regulator is missing */
|
||||
if (ret != -ENODEV) {
|
||||
DRM_DEV_ERROR(dev, "Couldn't set OPP regulators\n");
|
||||
goto err_fini;
|
||||
}
|
||||
} else {
|
||||
pfdevfreq->regulators_opp_table = opp_table;
|
||||
}
|
||||
|
||||
ret = dev_pm_opp_of_add_table(dev);
|
||||
if (ret == -ENODEV) /* Optional, continue without devfreq */
|
||||
return 0;
|
||||
else if (ret)
|
||||
return ret;
|
||||
if (ret) {
|
||||
/* Optional, continue without devfreq */
|
||||
if (ret == -ENODEV)
|
||||
ret = 0;
|
||||
goto err_fini;
|
||||
}
|
||||
pfdevfreq->opp_of_table_added = true;
|
||||
|
||||
spin_lock_init(&pfdevfreq->lock);
|
||||
@ -153,6 +169,11 @@ void panfrost_devfreq_fini(struct panfrost_device *pfdev)
|
||||
dev_pm_opp_of_remove_table(&pfdev->pdev->dev);
|
||||
pfdevfreq->opp_of_table_added = false;
|
||||
}
|
||||
|
||||
if (pfdevfreq->regulators_opp_table) {
|
||||
dev_pm_opp_put_regulators(pfdevfreq->regulators_opp_table);
|
||||
pfdevfreq->regulators_opp_table = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void panfrost_devfreq_resume(struct panfrost_device *pfdev)
|
||||
|
@ -8,12 +8,14 @@
|
||||
#include <linux/ktime.h>
|
||||
|
||||
struct devfreq;
|
||||
struct opp_table;
|
||||
struct thermal_cooling_device;
|
||||
|
||||
struct panfrost_device;
|
||||
|
||||
struct panfrost_devfreq {
|
||||
struct devfreq *devfreq;
|
||||
struct opp_table *regulators_opp_table;
|
||||
struct thermal_cooling_device *cooling;
|
||||
bool opp_of_table_added;
|
||||
|
||||
|
@ -225,9 +225,12 @@ int panfrost_device_init(struct panfrost_device *pfdev)
|
||||
goto out_clk;
|
||||
}
|
||||
|
||||
err = panfrost_regulator_init(pfdev);
|
||||
if (err)
|
||||
goto out_devfreq;
|
||||
/* OPP will handle regulators */
|
||||
if (!pfdev->pfdevfreq.opp_of_table_added) {
|
||||
err = panfrost_regulator_init(pfdev);
|
||||
if (err)
|
||||
goto out_devfreq;
|
||||
}
|
||||
|
||||
err = panfrost_reset_init(pfdev);
|
||||
if (err) {
|
||||
|
Loading…
Reference in New Issue
Block a user