diff --git a/drivers/interconnect/qcom/icc-rpmh.c b/drivers/interconnect/qcom/icc-rpmh.c index a0f4924d7f7a..766b7fe95a90 100644 --- a/drivers/interconnect/qcom/icc-rpmh.c +++ b/drivers/interconnect/qcom/icc-rpmh.c @@ -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); diff --git a/drivers/interconnect/qcom/icc-rpmh.h b/drivers/interconnect/qcom/icc-rpmh.h index d3d74a69b7f7..01d52d8eb187 100644 --- a/drivers/interconnect/qcom/icc-rpmh.h +++ b/drivers/interconnect/qcom/icc-rpmh.h @@ -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);