interconnect: qcom: icc-rpmh: separate the qos configuration

Separate out the qos configuration functionality so that
we can re-use the same for hibernation restore use-case.

Change-Id: I91f390a09807b8eb7e57a5431fc5aaae8d2c04a7
Signed-off-by: Veera Vegivada <quic_vvegivad@quicinc.com>
This commit is contained in:
Veera Vegivada 2023-02-24 17:36:14 +05:30
parent 888ef98cc5
commit 8ba060468f
2 changed files with 37 additions and 13 deletions

View File

@ -323,6 +323,31 @@ static void disable_qos_deps(struct qcom_icc_provider *qp)
}
}
int qcom_icc_rpmh_configure_qos(struct qcom_icc_provider *qp)
{
struct qcom_icc_node *qnode;
size_t i;
int ret;
ret = enable_qos_deps(qp);
if (ret)
return ret;
for (i = 0; i < qp->num_nodes; i++) {
qnode = qp->nodes[i];
if (!qnode)
continue;
if (qnode->qosbox)
qnode->noc_ops->set_qos(qnode);
}
disable_qos_deps(qp);
return ret;
}
EXPORT_SYMBOL(qcom_icc_rpmh_configure_qos);
static struct regmap *qcom_icc_rpmh_map(struct platform_device *pdev,
const struct qcom_icc_desc *desc)
{
@ -383,6 +408,8 @@ int qcom_icc_rpmh_probe(struct platform_device *pdev)
qp->dev = dev;
qp->bcms = desc->bcms;
qp->nodes = desc->nodes;
qp->num_nodes = desc->num_nodes;
if (!qp->stub) {
qp->num_bcms = desc->num_bcms;
@ -416,12 +443,6 @@ int qcom_icc_rpmh_probe(struct platform_device *pdev)
for (i = 0; i < qp->num_bcms; i++)
qcom_icc_bcm_init(qp, qp->bcms[i], dev);
if (!qp->skip_qos) {
ret = enable_qos_deps(qp);
if (ret)
return ret;
}
for (i = 0; i < num_nodes; i++) {
qn = qnodes[i];
if (!qn)
@ -446,9 +467,6 @@ int qcom_icc_rpmh_probe(struct platform_device *pdev)
}
}
if (qn->qosbox && !qp->skip_qos)
qn->noc_ops->set_qos(qn);
node->name = qn->name;
node->data = qn;
icc_node_add(node, provider);
@ -459,10 +477,14 @@ int qcom_icc_rpmh_probe(struct platform_device *pdev)
data->nodes[i] = node;
}
if (!qp->skip_qos)
disable_qos_deps(qp);
data->num_nodes = num_nodes;
if (!qp->skip_qos) {
ret = qcom_icc_rpmh_configure_qos(qp);
if (ret)
goto err;
}
platform_set_drvdata(pdev, qp);
if (!qp->stub) {
@ -483,7 +505,6 @@ int qcom_icc_rpmh_probe(struct platform_device *pdev)
return 0;
err:
clk_bulk_disable_unprepare(qp->num_clks, qp->clks);
clk_bulk_put_all(qp->num_clks, qp->clks);
icc_nodes_remove(provider);
icc_provider_del(provider);

View File

@ -26,6 +26,8 @@ struct qcom_icc_provider {
struct device *dev;
struct qcom_icc_bcm * const *bcms;
size_t num_bcms;
struct qcom_icc_node * const *nodes;
size_t num_nodes;
struct list_head probe_list;
struct regmap *regmap;
struct clk_bulk_data *clks;
@ -179,4 +181,5 @@ int qcom_icc_rpmh_probe(struct platform_device *pdev);
int qcom_icc_rpmh_remove(struct platform_device *pdev);
void qcom_icc_rpmh_sync_state(struct device *dev);
int qcom_icc_get_bw_stub(struct icc_node *node, u32 *avg, u32 *peak);
int qcom_icc_rpmh_configure_qos(struct qcom_icc_provider *qp);
#endif