
Add initial support for new target with the initial patch for ethernet support using pending upstream patches for PCS UNIPHY, PPE and EDMA. Only initramfs currently working as support for new SPI/NAND implementation, USB, CPUFreq and other devices is still unfinished and needs to be evaluated. Link: https://github.com/openwrt/openwrt/pull/17725 Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
116 lines
3.4 KiB
Diff
116 lines
3.4 KiB
Diff
From 8737ec830ee32162858af7c1504169b05b313ab1 Mon Sep 17 00:00:00 2001
|
|
From: Varadarajan Narayanan <quic_varada@quicinc.com>
|
|
Date: Tue, 30 Apr 2024 12:12:12 +0530
|
|
Subject: [PATCH] clk: qcom: common: Add interconnect clocks support
|
|
|
|
Unlike MSM platforms that manage NoC related clocks and scaling
|
|
from RPM, IPQ SoCs dont involve RPM in managing NoC related
|
|
clocks and there is no NoC scaling.
|
|
|
|
However, there is a requirement to enable some NoC interface
|
|
clocks for accessing the peripheral controllers present on
|
|
these NoCs. Though exposing these as normal clocks would work,
|
|
having a minimalistic interconnect driver to handle these clocks
|
|
would make it consistent with other Qualcomm platforms resulting
|
|
in common code paths. This is similar to msm8996-cbf's usage of
|
|
icc-clk framework.
|
|
|
|
Signed-off-by: Varadarajan Narayanan <quic_varada@quicinc.com>
|
|
Link: https://lore.kernel.org/r/20240430064214.2030013-5-quic_varada@quicinc.com
|
|
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
|
---
|
|
drivers/clk/qcom/common.c | 35 ++++++++++++++++++++++++++++++++++-
|
|
drivers/clk/qcom/common.h | 9 +++++++++
|
|
2 files changed, 43 insertions(+), 1 deletion(-)
|
|
|
|
diff --git a/drivers/clk/qcom/common.c b/drivers/clk/qcom/common.c
|
|
index c92e10c60322..ea3788ba46f7 100644
|
|
--- a/drivers/clk/qcom/common.c
|
|
+++ b/drivers/clk/qcom/common.c
|
|
@@ -8,6 +8,7 @@
|
|
#include <linux/regmap.h>
|
|
#include <linux/platform_device.h>
|
|
#include <linux/clk-provider.h>
|
|
+#include <linux/interconnect-clk.h>
|
|
#include <linux/reset-controller.h>
|
|
#include <linux/of.h>
|
|
|
|
@@ -252,6 +253,38 @@ static struct clk_hw *qcom_cc_clk_hw_get(struct of_phandle_args *clkspec,
|
|
return cc->rclks[idx] ? &cc->rclks[idx]->hw : NULL;
|
|
}
|
|
|
|
+static int qcom_cc_icc_register(struct device *dev,
|
|
+ const struct qcom_cc_desc *desc)
|
|
+{
|
|
+ struct icc_clk_data *icd;
|
|
+ struct clk_hw *hws;
|
|
+ int i;
|
|
+
|
|
+ if (!IS_ENABLED(CONFIG_INTERCONNECT_CLK))
|
|
+ return 0;
|
|
+
|
|
+ if (!desc->icc_hws)
|
|
+ return 0;
|
|
+
|
|
+ icd = devm_kcalloc(dev, desc->num_icc_hws, sizeof(*icd), GFP_KERNEL);
|
|
+ if (!icd)
|
|
+ return -ENOMEM;
|
|
+
|
|
+ for (i = 0; i < desc->num_icc_hws; i++) {
|
|
+ icd[i].master_id = desc->icc_hws[i].master_id;
|
|
+ icd[i].slave_id = desc->icc_hws[i].slave_id;
|
|
+ hws = &desc->clks[desc->icc_hws[i].clk_id]->hw;
|
|
+ icd[i].clk = devm_clk_hw_get_clk(dev, hws, "icc");
|
|
+ if (!icd[i].clk)
|
|
+ return dev_err_probe(dev, -ENOENT,
|
|
+ "(%d) clock entry is null\n", i);
|
|
+ icd[i].name = clk_hw_get_name(hws);
|
|
+ }
|
|
+
|
|
+ return devm_icc_clk_register(dev, desc->icc_first_node_id,
|
|
+ desc->num_icc_hws, icd);
|
|
+}
|
|
+
|
|
int qcom_cc_really_probe(struct device *dev,
|
|
const struct qcom_cc_desc *desc, struct regmap *regmap)
|
|
{
|
|
@@ -320,7 +353,7 @@ int qcom_cc_really_probe(struct device *dev,
|
|
if (ret)
|
|
return ret;
|
|
|
|
- return 0;
|
|
+ return qcom_cc_icc_register(dev, desc);
|
|
}
|
|
EXPORT_SYMBOL_GPL(qcom_cc_really_probe);
|
|
|
|
diff --git a/drivers/clk/qcom/common.h b/drivers/clk/qcom/common.h
|
|
index d048bdeeba10..7e57f8fe8ea6 100644
|
|
--- a/drivers/clk/qcom/common.h
|
|
+++ b/drivers/clk/qcom/common.h
|
|
@@ -19,6 +19,12 @@ struct clk_hw;
|
|
#define PLL_VOTE_FSM_ENA BIT(20)
|
|
#define PLL_VOTE_FSM_RESET BIT(21)
|
|
|
|
+struct qcom_icc_hws_data {
|
|
+ int master_id;
|
|
+ int slave_id;
|
|
+ int clk_id;
|
|
+};
|
|
+
|
|
struct qcom_cc_desc {
|
|
const struct regmap_config *config;
|
|
struct clk_regmap **clks;
|
|
@@ -29,6 +35,9 @@ struct qcom_cc_desc {
|
|
size_t num_gdscs;
|
|
struct clk_hw **clk_hws;
|
|
size_t num_clk_hws;
|
|
+ struct qcom_icc_hws_data *icc_hws;
|
|
+ size_t num_icc_hws;
|
|
+ unsigned int icc_first_node_id;
|
|
};
|
|
|
|
/**
|
|
--
|
|
2.45.2
|
|
|