interconnect: qcom: icc-rpmh: Vote for keepalive BCMs during init

Place initial votes for BCMs marked as keepalive during initialization
such that we force the BCMs on even in the absence of explicit client
votes.

Change-Id: I0cf1b2f2a76d5fc094329520ce2a9f1691a3f681
Signed-off-by: Mike Tipton <quic_mdtipton@quicinc.com>
This commit is contained in:
Mike Tipton 2022-03-24 16:04:42 -07:00
parent d2d4f6d777
commit 2fbcc44e15
2 changed files with 18 additions and 3 deletions

View File

@ -167,11 +167,14 @@ EXPORT_SYMBOL_GPL(qcom_icc_xlate_extended);
*
* Return: 0 on success, or an error code otherwise
*/
int qcom_icc_bcm_init(struct qcom_icc_bcm *bcm, struct device *dev)
int qcom_icc_bcm_init(struct qcom_icc_provider *qp, struct qcom_icc_bcm *bcm,
struct device *dev)
{
struct qcom_icc_node *qn;
const struct bcm_db *data;
struct bcm_voter *voter;
size_t data_count;
int ret;
int i;
/* BCM is already initialised*/
@ -214,6 +217,18 @@ int qcom_icc_bcm_init(struct qcom_icc_bcm *bcm, struct device *dev)
qn->num_bcms++;
}
if (bcm->keepalive || bcm->keepalive_early) {
voter = qp->voters[bcm->voter_idx];
qcom_icc_bcm_voter_add(voter, bcm);
ret = qcom_icc_bcm_voter_commit(voter);
if (ret) {
dev_err(dev, "failed to place initial vote for %s\n",
bcm->name);
return ret;
}
}
return 0;
}
EXPORT_SYMBOL_GPL(qcom_icc_bcm_init);
@ -378,7 +393,7 @@ int qcom_icc_rpmh_probe(struct platform_device *pdev)
return qp->num_clks;
for (i = 0; i < qp->num_bcms; i++)
qcom_icc_bcm_init(qp->bcms[i], dev);
qcom_icc_bcm_init(qp, qp->bcms[i], dev);
if (!qp->skip_qos) {
ret = enable_qos_deps(qp);

View File

@ -162,7 +162,7 @@ int qcom_icc_aggregate_stub(struct icc_node *node, u32 tag, u32 avg_bw,
int qcom_icc_set(struct icc_node *src, struct icc_node *dst);
int qcom_icc_set_stub(struct icc_node *src, struct icc_node *dst);
struct icc_node_data *qcom_icc_xlate_extended(struct of_phandle_args *spec, void *data);
int qcom_icc_bcm_init(struct qcom_icc_bcm *bcm, struct device *dev);
int qcom_icc_bcm_init(struct qcom_icc_provider *qp, struct qcom_icc_bcm *bcm, struct device *dev);
void qcom_icc_pre_aggregate(struct icc_node *node);
int qcom_icc_rpmh_probe(struct platform_device *pdev);
int qcom_icc_rpmh_remove(struct platform_device *pdev);