aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/firmware/arm_scmi/perf.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/firmware/arm_scmi/perf.c')
-rw-r--r--drivers/firmware/arm_scmi/perf.c25
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;
}