diff options
Diffstat (limited to 'drivers/firmware/arm_scmi/perf.c')
-rw-r--r-- | drivers/firmware/arm_scmi/perf.c | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/drivers/firmware/arm_scmi/perf.c b/drivers/firmware/arm_scmi/perf.c index 82fb3babff72..14fd2c1f179b 100644 --- a/drivers/firmware/arm_scmi/perf.c +++ b/drivers/firmware/arm_scmi/perf.c @@ -640,6 +640,23 @@ static int scmi_dev_domain_id(struct device *dev) return clkspec.args[0]; } +static uint32_t roundoff_to_nearest_100(uint32_t freq) +{ + uint32_t quotient, remainder; + uint32_t freq_mhz; + + freq_mhz = (freq / 1000000); + quotient = freq_mhz / 100; + remainder = freq_mhz % 100; + + if (remainder >= 50) + freq_mhz = quotient * 100 + 100; + else + freq_mhz = quotient * 100; + + return freq_mhz * 1000000; +} + static int scmi_dvfs_device_opps_add(const struct scmi_handle *handle, struct device *dev) { @@ -658,6 +675,12 @@ static int scmi_dvfs_device_opps_add(const struct scmi_handle *handle, for (opp = dom->opp, idx = 0; idx < dom->opp_count; idx++, opp++) { freq = opp->perf * dom->mult_factor; + /* + * marvell specific: need to round off to nearest hundered + * if the calcuated frequency is not a multiple of 100 in MHz + */ + freq = roundoff_to_nearest_100(freq); + ret = dev_pm_opp_add(dev, freq, 0); if (ret) { dev_warn(dev, "failed to add opp %luHz\n", freq); @@ -707,7 +730,7 @@ static int scmi_dvfs_freq_get(const struct scmi_handle *handle, u32 domain, ret = scmi_perf_level_get(handle, domain, &level, poll); if (!ret) - *freq = level * dom->mult_factor; + *freq = roundoff_to_nearest_100(level * dom->mult_factor); return ret; } |