From 1f6f4c0a2a5e4257598cd149719bdefe8c008c40 Mon Sep 17 00:00:00 2001 From: David Dai Date: Fri, 17 Jan 2020 14:24:13 -0800 Subject: [PATCH] interconnect: qcom: Add multiple voter support Add support for targeting alternate bcm-voters which live under different RSC devices. Change-Id: Ia1ad8a4c6c6b8531f0dae67cc7b22e2faa55c418 Signed-off-by: David Dai Signed-off-by: Georgi Djakov Signed-off-by: Mike Tipton --- drivers/interconnect/qcom/icc-rpmh.c | 22 +++++++++++++++++----- drivers/interconnect/qcom/icc-rpmh.h | 6 +++++- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/drivers/interconnect/qcom/icc-rpmh.c b/drivers/interconnect/qcom/icc-rpmh.c index 03b58e2cb8ad..6b49599c69fe 100644 --- a/drivers/interconnect/qcom/icc-rpmh.c +++ b/drivers/interconnect/qcom/icc-rpmh.c @@ -38,7 +38,8 @@ void qcom_icc_pre_aggregate(struct icc_node *node) } for (i = 0; i < qn->num_bcms; i++) - qcom_icc_bcm_voter_add(qp->voter, qn->bcms[i]); + qcom_icc_bcm_voter_add(qp->voters[qn->bcms[i]->voter_idx], + qn->bcms[i]); } EXPORT_SYMBOL_GPL(qcom_icc_pre_aggregate); @@ -92,6 +93,7 @@ int qcom_icc_set(struct icc_node *src, struct icc_node *dst) { struct qcom_icc_provider *qp; struct icc_node *node; + int i; if (!src) node = dst; @@ -100,7 +102,8 @@ int qcom_icc_set(struct icc_node *src, struct icc_node *dst) qp = to_qcom_provider(node->provider); - qcom_icc_bcm_voter_commit(qp->voter); + for (i = 0; i < qp->num_voters; i++) + qcom_icc_bcm_voter_commit(qp->voters[i]); return 0; } @@ -247,9 +250,18 @@ int qcom_icc_rpmh_probe(struct platform_device *pdev) qp->bcms = desc->bcms; qp->num_bcms = desc->num_bcms; - qp->voter = of_bcm_voter_get(qp->dev, NULL); - if (IS_ERR(qp->voter)) - return PTR_ERR(qp->voter); + qp->num_voters = desc->num_voters; + qp->voters = devm_kcalloc(&pdev->dev, qp->num_voters, + sizeof(*qp->voters), GFP_KERNEL); + + if (!qp->voters) + return -ENOMEM; + + for (i = 0; i < qp->num_voters; i++) { + qp->voters[i] = of_bcm_voter_get(qp->dev, desc->voters[i]); + if (IS_ERR(qp->voters[i])) + return PTR_ERR(qp->voters[i]); + } qp->regmap = qcom_icc_rpmh_map(pdev, desc); if (IS_ERR(qp->regmap)) diff --git a/drivers/interconnect/qcom/icc-rpmh.h b/drivers/interconnect/qcom/icc-rpmh.h index 387e2e69228e..f033c1f6521e 100644 --- a/drivers/interconnect/qcom/icc-rpmh.h +++ b/drivers/interconnect/qcom/icc-rpmh.h @@ -26,11 +26,12 @@ struct qcom_icc_provider { struct device *dev; struct qcom_icc_bcm **bcms; size_t num_bcms; - struct bcm_voter *voter; struct list_head probe_list; struct regmap *regmap; struct clk_bulk_data *clks; int num_clks; + struct bcm_voter **voters; + size_t num_voters; }; /** @@ -111,6 +112,7 @@ struct qcom_icc_bcm { struct bcm_db aux_data; struct list_head list; struct list_head ws_list; + int voter_idx; size_t num_nodes; struct qcom_icc_node *nodes[]; }; @@ -126,6 +128,8 @@ struct qcom_icc_desc { size_t num_nodes; struct qcom_icc_bcm **bcms; size_t num_bcms; + char **voters; + size_t num_voters; }; #define DEFINE_QNODE(_name, _id, _channels, _buswidth, ...) \