forked from Minki/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>
This commit is contained in:
commit
3a4c63f5d9
@ -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 (qn->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;
|
||||
}
|
||||
|
||||
qn->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)
|
||||
|
@ -26,6 +26,7 @@ enum qcom_icc_type {
|
||||
* @type: the ICC provider type
|
||||
* @qos_offset: offset to QoS registers
|
||||
* @regmap: regmap for QoS registers read/write access
|
||||
* @bus_clk_rate: bus clock rate in Hz
|
||||
*/
|
||||
struct qcom_icc_provider {
|
||||
struct icc_provider provider;
|
||||
@ -33,6 +34,7 @@ struct qcom_icc_provider {
|
||||
enum qcom_icc_type type;
|
||||
struct regmap *regmap;
|
||||
unsigned int qos_offset;
|
||||
u64 *bus_clk_rate;
|
||||
struct clk_bulk_data bus_clks[];
|
||||
};
|
||||
|
||||
@ -66,7 +68,6 @@ struct qcom_icc_qos {
|
||||
* @mas_rpm_id: RPM id for devices that are bus masters
|
||||
* @slv_rpm_id: RPM id for devices that are bus slaves
|
||||
* @qos: NoC QoS setting parameters
|
||||
* @rate: current bus clock rate in Hz
|
||||
*/
|
||||
struct qcom_icc_node {
|
||||
unsigned char *name;
|
||||
@ -77,7 +78,6 @@ struct qcom_icc_node {
|
||||
int mas_rpm_id;
|
||||
int slv_rpm_id;
|
||||
struct qcom_icc_qos qos;
|
||||
u64 rate;
|
||||
};
|
||||
|
||||
struct qcom_icc_desc {
|
||||
|
Loading…
Reference in New Issue
Block a user