interconnect: icc-clk: Specify master/slave ids
authorVaradarajan Narayanan <quic_varada@quicinc.com>
Tue, 30 Apr 2024 06:42:09 +0000 (12:12 +0530)
committerBjorn Andersson <andersson@kernel.org>
Mon, 8 Jul 2024 16:40:57 +0000 (11:40 -0500)
Presently, icc-clk driver autogenerates the master and slave ids.
However, devices with multiple nodes on the interconnect could
have other constraints and may not match with the auto generated
node ids.

Hence, modify the driver to use the master/slave ids provided by
the caller instead of auto generating.

Also, update clk-cbf-8996 accordingly.

Acked-by: Georgi Djakov <djakov@kernel.org>
Signed-off-by: Varadarajan Narayanan <quic_varada@quicinc.com>
Link: https://lore.kernel.org/r/20240430064214.2030013-2-quic_varada@quicinc.com
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
drivers/clk/qcom/clk-cbf-8996.c
drivers/interconnect/icc-clk.c
include/linux/interconnect-clk.h

index 76bf523..f5fd1ff 100644 (file)
@@ -226,7 +226,12 @@ static int qcom_msm8996_cbf_icc_register(struct platform_device *pdev, struct cl
        struct device *dev = &pdev->dev;
        struct clk *clk = devm_clk_hw_get_clk(dev, cbf_hw, "cbf");
        const struct icc_clk_data data[] = {
-               { .clk = clk, .name = "cbf", },
+               {
+                       .clk = clk,
+                       .name = "cbf",
+                       .master_id = MASTER_CBF_M4M,
+                       .slave_id = SLAVE_CBF_M4M,
+               },
        };
        struct icc_provider *provider;
 
index d787f2e..2be193f 100644 (file)
@@ -108,7 +108,7 @@ struct icc_provider *icc_clk_register(struct device *dev,
        for (i = 0, j = 0; i < num_clocks; i++) {
                qp->clocks[i].clk = data[i].clk;
 
-               node = icc_node_create(first_id + j);
+               node = icc_node_create(first_id + data[i].master_id);
                if (IS_ERR(node)) {
                        ret = PTR_ERR(node);
                        goto err;
@@ -118,10 +118,10 @@ struct icc_provider *icc_clk_register(struct device *dev,
                node->data = &qp->clocks[i];
                icc_node_add(node, provider);
                /* link to the next node, slave */
-               icc_link_create(node, first_id + j + 1);
+               icc_link_create(node, first_id + data[i].slave_id);
                onecell->nodes[j++] = node;
 
-               node = icc_node_create(first_id + j);
+               node = icc_node_create(first_id + data[i].slave_id);
                if (IS_ERR(node)) {
                        ret = PTR_ERR(node);
                        goto err;
index 0cd8011..170898f 100644 (file)
@@ -11,6 +11,8 @@ struct device;
 struct icc_clk_data {
        struct clk *clk;
        const char *name;
+       unsigned int master_id;
+       unsigned int slave_id;
 };
 
 struct icc_provider *icc_clk_register(struct device *dev,