Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'icc-rpm' into icc-next

This patch set is to address two clock rate setting issues.

The first patch is to fix a potential cached clock rate mismatching
issue, the issue can lead to the clock rate is missed to be set. Note,
since this potential issue requires specific time window and certain
condition (consumers need to request the same bandwidth) to produce,
the patch is based on analysis but not a real trace log.

The second patch is an extension to cache clock rates for active and
sleep clocks separately, with this change it gives us possibility to set
active and sleep clock with different clock rates.

* icc-rpm
interconnect: qcom: icc-rpm: Fix for cached clock rate
interconnect: qcom: icc-rpm: Cache every clock rate

Link: https://lore.kernel.org/r/20220416031029.693211-1-leo.yan@linaro.org
Signed-off-by: Georgi Djakov <djakov@kernel.org>

+11 -7
+9 -5
drivers/interconnect/qcom/icc-rpm.c
··· 274 274 do_div(rate, qn->buswidth); 275 275 rate = min_t(u64, rate, LONG_MAX); 276 276 277 - if (qn->rate == rate) 278 - return 0; 279 - 280 277 for (i = 0; i < qp->num_clks; i++) { 278 + if (qp->bus_clk_rate[i] == rate) 279 + continue; 280 + 281 281 ret = clk_set_rate(qp->bus_clks[i].clk, rate); 282 282 if (ret) { 283 283 pr_err("%s clk_set_rate error: %d\n", 284 284 qp->bus_clks[i].id, ret); 285 285 return ret; 286 286 } 287 + qp->bus_clk_rate[i] = rate; 287 288 } 288 - 289 - qn->rate = rate; 290 289 291 290 return 0; 292 291 } ··· 329 330 330 331 qp = devm_kzalloc(dev, struct_size(qp, bus_clks, cd_num), GFP_KERNEL); 331 332 if (!qp) 333 + return -ENOMEM; 334 + 335 + qp->bus_clk_rate = devm_kcalloc(dev, cd_num, sizeof(*qp->bus_clk_rate), 336 + GFP_KERNEL); 337 + if (!qp->bus_clk_rate) 332 338 return -ENOMEM; 333 339 334 340 data = devm_kzalloc(dev, struct_size(data, nodes, num_nodes),
+2 -2
drivers/interconnect/qcom/icc-rpm.h
··· 26 26 * @type: the ICC provider type 27 27 * @qos_offset: offset to QoS registers 28 28 * @regmap: regmap for QoS registers read/write access 29 + * @bus_clk_rate: bus clock rate in Hz 29 30 */ 30 31 struct qcom_icc_provider { 31 32 struct icc_provider provider; ··· 34 33 enum qcom_icc_type type; 35 34 struct regmap *regmap; 36 35 unsigned int qos_offset; 36 + u64 *bus_clk_rate; 37 37 struct clk_bulk_data bus_clks[]; 38 38 }; 39 39 ··· 68 66 * @mas_rpm_id: RPM id for devices that are bus masters 69 67 * @slv_rpm_id: RPM id for devices that are bus slaves 70 68 * @qos: NoC QoS setting parameters 71 - * @rate: current bus clock rate in Hz 72 69 */ 73 70 struct qcom_icc_node { 74 71 unsigned char *name; ··· 78 77 int mas_rpm_id; 79 78 int slv_rpm_id; 80 79 struct qcom_icc_qos qos; 81 - u64 rate; 82 80 }; 83 81 84 82 struct qcom_icc_desc {