mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-16 16:54:20 +08:00
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: Leo Yan <leo.yan@linaro.org> Link: https://lore.kernel.org/r/20220416031029.693211-3-leo.yan@linaro.org Signed-off-by: Georgi Djakov <djakov@kernel.org>
This commit is contained in:
parent
65fac3b349
commit
97f7d384ac
@ -274,20 +274,19 @@ static int qcom_icc_set(struct icc_node *src, struct icc_node *dst)
|
|||||||
do_div(rate, qn->buswidth);
|
do_div(rate, qn->buswidth);
|
||||||
rate = min_t(u64, rate, LONG_MAX);
|
rate = min_t(u64, rate, LONG_MAX);
|
||||||
|
|
||||||
if (qp->bus_clk_rate == rate)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
for (i = 0; i < qp->num_clks; i++) {
|
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);
|
ret = clk_set_rate(qp->bus_clks[i].clk, rate);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
pr_err("%s clk_set_rate error: %d\n",
|
pr_err("%s clk_set_rate error: %d\n",
|
||||||
qp->bus_clks[i].id, ret);
|
qp->bus_clks[i].id, ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
qp->bus_clk_rate[i] = rate;
|
||||||
}
|
}
|
||||||
|
|
||||||
qp->bus_clk_rate = rate;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -332,6 +331,11 @@ int qnoc_probe(struct platform_device *pdev)
|
|||||||
if (!qp)
|
if (!qp)
|
||||||
return -ENOMEM;
|
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),
|
data = devm_kzalloc(dev, struct_size(data, nodes, num_nodes),
|
||||||
GFP_KERNEL);
|
GFP_KERNEL);
|
||||||
if (!data)
|
if (!data)
|
||||||
|
@ -34,7 +34,7 @@ struct qcom_icc_provider {
|
|||||||
enum qcom_icc_type type;
|
enum qcom_icc_type type;
|
||||||
struct regmap *regmap;
|
struct regmap *regmap;
|
||||||
unsigned int qos_offset;
|
unsigned int qos_offset;
|
||||||
u64 bus_clk_rate;
|
u64 *bus_clk_rate;
|
||||||
struct clk_bulk_data bus_clks[];
|
struct clk_bulk_data bus_clks[];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user