Commit 97f7d384 authored by Leo Yan's avatar Leo Yan Committed by Georgi Djakov
Browse files

interconnect: qcom: icc-rpm: Cache every clock rate



The cached clock rate is used for all bus clocks, thus it has the
assumption that all interconnect clock rates are always same, this
causes trouble if we want to set different clock rates separately.

This patch is to allocate a clock rate array to cache every clock
rate.

Signed-off-by: default avatarLeo Yan <leo.yan@linaro.org>
Link: https://lore.kernel.org/r/20220416031029.693211-3-leo.yan@linaro.org


Signed-off-by: default avatarGeorgi Djakov <djakov@kernel.org>
parent 65fac3b3
Loading
Loading
Loading
Loading
+9 −5
Original line number Diff line number Diff line
@@ -274,20 +274,19 @@ static int qcom_icc_set(struct icc_node *src, struct icc_node *dst)
	do_div(rate, qn->buswidth);
	rate = min_t(u64, rate, LONG_MAX);

	if (qp->bus_clk_rate == rate)
		return 0;

	for (i = 0; i < qp->num_clks; i++) {
		if (qp->bus_clk_rate[i] == rate)
			continue;

		ret = clk_set_rate(qp->bus_clks[i].clk, rate);
		if (ret) {
			pr_err("%s clk_set_rate error: %d\n",
			       qp->bus_clks[i].id, ret);
			return ret;
		}
		qp->bus_clk_rate[i] = rate;
	}

	qp->bus_clk_rate = rate;

	return 0;
}

@@ -332,6 +331,11 @@ int qnoc_probe(struct platform_device *pdev)
	if (!qp)
		return -ENOMEM;

	qp->bus_clk_rate = devm_kcalloc(dev, cd_num, sizeof(*qp->bus_clk_rate),
					GFP_KERNEL);
	if (!qp->bus_clk_rate)
		return -ENOMEM;

	data = devm_kzalloc(dev, struct_size(data, nodes, num_nodes),
			    GFP_KERNEL);
	if (!data)
+1 −1
Original line number Diff line number Diff line
@@ -34,7 +34,7 @@ struct qcom_icc_provider {
	enum qcom_icc_type type;
	struct regmap *regmap;
	unsigned int qos_offset;
	u64 bus_clk_rate;
	u64 *bus_clk_rate;
	struct clk_bulk_data bus_clks[];
};