Commit 221bc779 authored by Steven Price's avatar Steven Price Committed by Rob Herring

drm/panfrost: Use generic code for devfreq

Use dev_pm_opp_set_rate() instead of open coding the devfreq
integration, simplifying the code.
Reviewed-by: default avatarMark Brown <broonie@kernel.org>
Reviewed-by: default avatarTomeu Vizoso <tomeu.vizoso@collabora.com>
Acked-by: default avatarAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Signed-off-by: default avatarSteven Price <steven.price@arm.com>
Signed-off-by: default avatarRob Herring <robh@kernel.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20191025134143.14324-2-steven.price@arm.com
parent 86d35f87
...@@ -18,55 +18,14 @@ static void panfrost_devfreq_update_utilization(struct panfrost_device *pfdev, i ...@@ -18,55 +18,14 @@ static void panfrost_devfreq_update_utilization(struct panfrost_device *pfdev, i
static int panfrost_devfreq_target(struct device *dev, unsigned long *freq, static int panfrost_devfreq_target(struct device *dev, unsigned long *freq,
u32 flags) u32 flags)
{ {
struct panfrost_device *pfdev = platform_get_drvdata(to_platform_device(dev)); struct panfrost_device *pfdev = dev_get_drvdata(dev);
struct dev_pm_opp *opp;
unsigned long old_clk_rate = pfdev->devfreq.cur_freq;
unsigned long target_volt, target_rate;
int err; int err;
opp = devfreq_recommended_opp(dev, freq, flags); err = dev_pm_opp_set_rate(dev, *freq);
if (IS_ERR(opp))
return PTR_ERR(opp);
target_rate = dev_pm_opp_get_freq(opp);
target_volt = dev_pm_opp_get_voltage(opp);
dev_pm_opp_put(opp);
if (old_clk_rate == target_rate)
return 0;
/*
* If frequency scaling from low to high, adjust voltage first.
* If frequency scaling from high to low, adjust frequency first.
*/
if (old_clk_rate < target_rate) {
err = regulator_set_voltage(pfdev->regulator, target_volt,
target_volt);
if (err) {
dev_err(dev, "Cannot set voltage %lu uV\n",
target_volt);
return err;
}
}
err = clk_set_rate(pfdev->clock, target_rate);
if (err) {
dev_err(dev, "Cannot set frequency %lu (%d)\n", target_rate,
err);
regulator_set_voltage(pfdev->regulator, pfdev->devfreq.cur_volt,
pfdev->devfreq.cur_volt);
return err;
}
if (old_clk_rate > target_rate) {
err = regulator_set_voltage(pfdev->regulator, target_volt,
target_volt);
if (err) if (err)
dev_err(dev, "Cannot set voltage %lu uV\n", target_volt); return err;
}
pfdev->devfreq.cur_freq = target_rate; *freq = clk_get_rate(pfdev->clock);
pfdev->devfreq.cur_volt = target_volt;
return 0; return 0;
} }
...@@ -86,7 +45,7 @@ static void panfrost_devfreq_reset(struct panfrost_device *pfdev) ...@@ -86,7 +45,7 @@ static void panfrost_devfreq_reset(struct panfrost_device *pfdev)
static int panfrost_devfreq_get_dev_status(struct device *dev, static int panfrost_devfreq_get_dev_status(struct device *dev,
struct devfreq_dev_status *status) struct devfreq_dev_status *status)
{ {
struct panfrost_device *pfdev = platform_get_drvdata(to_platform_device(dev)); struct panfrost_device *pfdev = dev_get_drvdata(dev);
int i; int i;
for (i = 0; i < NUM_JOB_SLOTS; i++) { for (i = 0; i < NUM_JOB_SLOTS; i++) {
...@@ -119,7 +78,7 @@ static int panfrost_devfreq_get_cur_freq(struct device *dev, unsigned long *freq ...@@ -119,7 +78,7 @@ static int panfrost_devfreq_get_cur_freq(struct device *dev, unsigned long *freq
{ {
struct panfrost_device *pfdev = platform_get_drvdata(to_platform_device(dev)); struct panfrost_device *pfdev = platform_get_drvdata(to_platform_device(dev));
*freq = pfdev->devfreq.cur_freq; *freq = clk_get_rate(pfdev->clock);
return 0; return 0;
} }
...@@ -135,6 +94,7 @@ int panfrost_devfreq_init(struct panfrost_device *pfdev) ...@@ -135,6 +94,7 @@ int panfrost_devfreq_init(struct panfrost_device *pfdev)
{ {
int ret; int ret;
struct dev_pm_opp *opp; struct dev_pm_opp *opp;
unsigned long cur_freq;
ret = dev_pm_opp_of_add_table(&pfdev->pdev->dev); ret = dev_pm_opp_of_add_table(&pfdev->pdev->dev);
if (ret == -ENODEV) /* Optional, continue without devfreq */ if (ret == -ENODEV) /* Optional, continue without devfreq */
...@@ -144,13 +104,13 @@ int panfrost_devfreq_init(struct panfrost_device *pfdev) ...@@ -144,13 +104,13 @@ int panfrost_devfreq_init(struct panfrost_device *pfdev)
panfrost_devfreq_reset(pfdev); panfrost_devfreq_reset(pfdev);
pfdev->devfreq.cur_freq = clk_get_rate(pfdev->clock); cur_freq = clk_get_rate(pfdev->clock);
opp = devfreq_recommended_opp(&pfdev->pdev->dev, &pfdev->devfreq.cur_freq, 0); opp = devfreq_recommended_opp(&pfdev->pdev->dev, &cur_freq, 0);
if (IS_ERR(opp)) if (IS_ERR(opp))
return PTR_ERR(opp); return PTR_ERR(opp);
panfrost_devfreq_profile.initial_freq = pfdev->devfreq.cur_freq; panfrost_devfreq_profile.initial_freq = cur_freq;
dev_pm_opp_put(opp); dev_pm_opp_put(opp);
pfdev->devfreq.devfreq = devm_devfreq_add_device(&pfdev->pdev->dev, pfdev->devfreq.devfreq = devm_devfreq_add_device(&pfdev->pdev->dev,
......
...@@ -93,8 +93,6 @@ struct panfrost_device { ...@@ -93,8 +93,6 @@ struct panfrost_device {
struct { struct {
struct devfreq *devfreq; struct devfreq *devfreq;
struct thermal_cooling_device *cooling; struct thermal_cooling_device *cooling;
unsigned long cur_freq;
unsigned long cur_volt;
struct panfrost_devfreq_slot slot[NUM_JOB_SLOTS]; struct panfrost_devfreq_slot slot[NUM_JOB_SLOTS];
} devfreq; } devfreq;
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment