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 <daidavid1@codeaurora.org>
Signed-off-by: Georgi Djakov <gdjako@codeaurora.org>
Signed-off-by: Mike Tipton <mdtipton@codeaurora.org>
This commit is contained in:
David Dai 2020-01-17 14:24:13 -08:00 committed by Mike Tipton
parent a4165efa30
commit 1f6f4c0a2a
2 changed files with 22 additions and 6 deletions

View File

@ -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))

View File

@ -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, ...) \