
Changelog: https://cdn.kernel.org/pub/linux/kernel/v6.x/ChangeLog-6.6.76 Manually rebased: bcm27xx/patches-6.6/950-0519-usb-dwc3-Set-DMA-and-coherent-masks-early.patch imx/patches-6.6/600-PCI-imx6-Start-link-at-max-gen-first-for-IMX8MM-and-IMX8MP.patch Removed upstreamed: bcm27xx/patches-6.6/950-1446-media-i2c-ov9282-Correct-the-exposure-offset.patch[1] bcm47xx/patches-6.6/701-bgmac-reduce-max-frame-size-to-support-just-MTU-1500.patch[2] bcm53xx/patches-6.6/700-bgmac-reduce-max-frame-size-to-support-just-MTU-1500.patch[3] ramips/patches-6.6/003-v6.14-clk-ralink-mtmips-remove-duplicated-xtal-clock-for-Ralink.patch[4] All other patches automatically rebased. 1. https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v6.6.76&id=11c7649c9ec3dcaf0a7760551ad30747d9e02d81 2, 3. https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v6.6.76&id=5e6e723675e54ced5200bcc367e2526badc4070c 4. https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v6.6.76&id=d0edcd0d18d700d76c61c091a24568b8b8c3b387 Build system: x86/64 Build-tested: bcm27xx/bcm2712, flogic/xiaomi_redmi-router-ax6000-ubootmod, ramips/tplink_archer-a6-v3 Run-tested: bcm27xx/bcm2712, flogic/xiaomi_redmi-router-ax6000-ubootmod, ramips/tplink_archer-a6-v3 Signed-off-by: John Audia <therealgraysky@proton.me> Link: https://github.com/openwrt/openwrt/pull/17822 Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
109 lines
3.2 KiB
Diff
109 lines
3.2 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(-)
|
|
|
|
--- 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>
|
|
|
|
@@ -250,6 +251,38 @@ static struct clk_hw *qcom_cc_clk_hw_get
|
|
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)
|
|
{
|
|
@@ -318,7 +351,7 @@ int qcom_cc_really_probe(struct device *
|
|
if (ret)
|
|
return ret;
|
|
|
|
- return 0;
|
|
+ return qcom_cc_icc_register(dev, desc);
|
|
}
|
|
EXPORT_SYMBOL_GPL(qcom_cc_really_probe);
|
|
|
|
--- 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;
|
|
};
|
|
|
|
/**
|