diff --git a/drivers/interconnect/qcom/holi.c b/drivers/interconnect/qcom/holi.c index 77c85a11d554..c487c6940e6a 100644 --- a/drivers/interconnect/qcom/holi.c +++ b/drivers/interconnect/qcom/holi.c @@ -1240,6 +1240,10 @@ static int qnoc_probe(struct platform_device *pdev) qp->init = true; qp->keepalive = of_property_read_bool(dev->of_node, "qcom,keepalive"); + if (of_property_read_u32(dev->of_node, "qcom,util-factor", + &qp->util_factor)) + qp->util_factor = DEFAULT_UTIL_FACTOR; + qp->regmap = qcom_icc_map(pdev, desc); if (IS_ERR(qp->regmap)) return PTR_ERR(qp->regmap); diff --git a/drivers/interconnect/qcom/icc-rpm.c b/drivers/interconnect/qcom/icc-rpm.c index 90bfdd16e2c4..68ce1b375f8f 100644 --- a/drivers/interconnect/qcom/icc-rpm.c +++ b/drivers/interconnect/qcom/icc-rpm.c @@ -118,6 +118,10 @@ int qcom_icc_rpm_set(struct icc_node *src, struct icc_node *dst) qn = n->data; for (i = 0; i < RPM_NUM_CXT; i++) { sum_avg = icc_units_to_bps(qn->sum_avg[i]); + + sum_avg *= qp->util_factor; + do_div(sum_avg, DEFAULT_UTIL_FACTOR); + do_div(sum_avg, qn->channels); max_peak = icc_units_to_bps(qn->max_peak[i]); diff --git a/drivers/interconnect/qcom/icc-rpm.h b/drivers/interconnect/qcom/icc-rpm.h index a87af7d34c8a..7b1e89c7e077 100644 --- a/drivers/interconnect/qcom/icc-rpm.h +++ b/drivers/interconnect/qcom/icc-rpm.h @@ -20,6 +20,8 @@ #define RPM_CLK_MAX_LEVEL INT_MAX #define RPM_CLK_MIN_LEVEL 19200000 +#define DEFAULT_UTIL_FACTOR 100 + #define to_qcom_provider(_provider) \ container_of(_provider, struct qcom_icc_provider, provider) @@ -57,6 +59,7 @@ struct qcom_icc_provider { struct list_head probe_list; struct clk_bulk_data *bus_clks; int num_clks; + u32 util_factor; u64 bus_clk_cur_rate[RPM_NUM_CXT]; bool keepalive; bool init;