Devicetree
 help / color / mirror / Atom feed
From: Michal Wilczynski <m.wilczynski@samsung.com>
To: mturquette@baylibre.com, sboyd@kernel.org, robh@kernel.org,
	krzk+dt@kernel.org, conor+dt@kernel.org, drew@pdp7.com,
	guoren@kernel.org, wefu@redhat.com, jassisinghbrar@gmail.com,
	paul.walmsley@sifive.com, palmer@dabbelt.com,
	aou@eecs.berkeley.edu, frank.binns@imgtec.com,
	matt.coster@imgtec.com, maarten.lankhorst@linux.intel.com,
	mripard@kernel.org, tzimmermann@suse.de, airlied@gmail.com,
	simona@ffwll.ch, ulf.hansson@linaro.org, jszhang@kernel.org,
	p.zabel@pengutronix.de, m.szyprowski@samsung.com
Cc: linux-clk@vger.kernel.org, devicetree@vger.kernel.org,
	linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org,
	dri-devel@lists.freedesktop.org, linux-pm@vger.kernel.org,
	Michal Wilczynski <m.wilczynski@samsung.com>
Subject: [RFC PATCH v2 02/19] clk: thead: Add clock support for VO subsystem in T-Head TH1520 SoC
Date: Mon, 23 Dec 2024 13:55:36 +0100	[thread overview]
Message-ID: <20241223125553.3527812-3-m.wilczynski@samsung.com> (raw)
In-Reply-To: <20241223125553.3527812-1-m.wilczynski@samsung.com>

The T-Head TH1520 SoC integrates a variety of clocks for its subsystems,
including the Application Processor (AP) and the Video Output (VO) [1].
Up until now, the T-Head clock driver only supported AP clocks.

This commit extends the driver to provide clock functionality for the VO
subsystem. At this stage, the focus is on implementing the VO clock
gates, as these are currently the most relevant and required components
for enabling and disabling the VO subsystem functionality. Future
enhancements may introduce additional VO-related clocks as necessary.

Link: https://openbeagle.org/beaglev-ahead/beaglev-ahead/-/blob/main/docs/TH1520%20System%20User%20Manual.pdf [1]

Signed-off-by: Michal Wilczynski <m.wilczynski@samsung.com>
---
 drivers/clk/thead/clk-th1520-ap.c | 160 ++++++++++++++++++++++++++----
 1 file changed, 142 insertions(+), 18 deletions(-)

diff --git a/drivers/clk/thead/clk-th1520-ap.c b/drivers/clk/thead/clk-th1520-ap.c
index 17e32ae08720..b3c719d4f4ac 100644
--- a/drivers/clk/thead/clk-th1520-ap.c
+++ b/drivers/clk/thead/clk-th1520-ap.c
@@ -840,6 +840,67 @@ static CCU_GATE(CLK_SRAM1, sram1_clk, "sram1", axi_aclk_pd, 0x20c, BIT(3), 0);
 static CCU_GATE(CLK_SRAM2, sram2_clk, "sram2", axi_aclk_pd, 0x20c, BIT(2), 0);
 static CCU_GATE(CLK_SRAM3, sram3_clk, "sram3", axi_aclk_pd, 0x20c, BIT(1), 0);
 
+static CCU_GATE(CLK_AXI4_VO_ACLK, axi4_vo_aclk, "axi4-vo-aclk",
+		video_pll_clk_pd, 0x0, BIT(0), 0);
+static CCU_GATE(CLK_GPU_CORE, gpu_core_clk, "gpu-core-clk", video_pll_clk_pd,
+		0x0, BIT(3), 0);
+static CCU_GATE(CLK_GPU_CFG_ACLK, gpu_cfg_aclk, "gpu-cfg-aclk",
+		video_pll_clk_pd, 0x0, BIT(4), 0);
+static CCU_GATE(CLK_DPU_PIXELCLK0, dpu0_pixelclk, "dpu0-pixelclk",
+		video_pll_clk_pd, 0x0, BIT(5), 0);
+static CCU_GATE(CLK_DPU_PIXELCLK1, dpu1_pixelclk, "dpu1-pixelclk",
+		video_pll_clk_pd, 0x0, BIT(6), 0);
+static CCU_GATE(CLK_DPU_HCLK, dpu_hclk, "dpu-hclk", video_pll_clk_pd, 0x0,
+		BIT(7), 0);
+static CCU_GATE(CLK_DPU_ACLK, dpu_aclk, "dpu-aclk", video_pll_clk_pd, 0x0,
+		BIT(8), 0);
+static CCU_GATE(CLK_DPU_CCLK, dpu_cclk, "dpu-cclk", video_pll_clk_pd, 0x0,
+		BIT(9), 0);
+static CCU_GATE(CLK_HDMI_SFR, hdmi_sfr_clk, "hdmi-sfr-clk", video_pll_clk_pd,
+		0x0, BIT(10), 0);
+static CCU_GATE(CLK_HDMI_PCLK, hdmi_pclk, "hdmi-pclk", video_pll_clk_pd, 0x0,
+		BIT(11), 0);
+static CCU_GATE(CLK_HDMI_CEC, hdmi_cec_clk, "hdmi-cec-clk", video_pll_clk_pd,
+		0x0, BIT(12), 0);
+static CCU_GATE(CLK_MIPI_DSI0_PCLK, mipi_dsi0_pclk, "mipi-dsi0-pclk",
+		video_pll_clk_pd, 0x0, BIT(13), 0);
+static CCU_GATE(CLK_MIPI_DSI1_PCLK, mipi_dsi1_pclk, "mipi-dsi1-pclk",
+		video_pll_clk_pd, 0x0, BIT(14), 0);
+static CCU_GATE(CLK_MIPI_DSI0_CFG, mipi_dsi0_cfg_clk, "mipi-dsi0-cfg-clk",
+		video_pll_clk_pd, 0x0, BIT(15), 0);
+static CCU_GATE(CLK_MIPI_DSI1_CFG, mipi_dsi1_cfg_clk, "mipi-dsi1-cfg-clk",
+		video_pll_clk_pd, 0x0, BIT(16), 0);
+static CCU_GATE(CLK_MIPI_DSI0_REFCLK, mipi_dsi0_refclk, "mipi-dsi0-refclk",
+		video_pll_clk_pd, 0x0, BIT(17), 0);
+static CCU_GATE(CLK_MIPI_DSI1_REFCLK, mipi_dsi1_refclk, "mipi-dsi1-refclk",
+		video_pll_clk_pd, 0x0, BIT(18), 0);
+static CCU_GATE(CLK_HDMI_I2S, hdmi_i2c_clk, "hdmi-i2c-clk", video_pll_clk_pd,
+		0x0, BIT(19), 0);
+static CCU_GATE(CLK_X2H_DPU1_ACLK, x2h_dpu1_aclk, "x2h-dpu1-aclk",
+		video_pll_clk_pd, 0x0, BIT(20), 0);
+static CCU_GATE(CLK_X2H_DPU_ACLK, x2h_dpu_aclk, "x2h-dpu-aclk",
+		video_pll_clk_pd, 0x0, BIT(21), 0);
+static CCU_GATE(CLK_AXI4_VO_PCLK, axi4_vo_pclk, "axi4-vo-pclk",
+		video_pll_clk_pd, 0x0, BIT(22), 0);
+static CCU_GATE(CLK_IOPMP_VOSYS_DPU_PCLK, iopmp_vosys_dpu_pclk,
+		"iopmp-vosys-dpu-pclk", video_pll_clk_pd, 0x0, BIT(23), 0);
+static CCU_GATE(CLK_IOPMP_VOSYS_DPU1_PCLK, iopmp_vosys_dpu1_pclk,
+		"iopmp-vosys-dpu1-pclk", video_pll_clk_pd, 0x0, BIT(24), 0);
+static CCU_GATE(CLK_IOPMP_VOSYS_GPU_PCLK, iopmp_vosys_gpu_pclk,
+		"iopmp-vosys-gpu-pclk", video_pll_clk_pd, 0x0, BIT(25), 0);
+static CCU_GATE(CLK_IOPMP_DPU1_ACLK, iopmp_dpu1_aclk, "iopmp-dpu1-aclk",
+		video_pll_clk_pd, 0x0, BIT(27), 0);
+static CCU_GATE(CLK_IOPMP_DPU_ACLK, iopmp_dpu_aclk, "iopmp-dpu-aclk",
+		video_pll_clk_pd, 0x0, BIT(28), 0);
+static CCU_GATE(CLK_IOPMP_GPU_ACLK, iopmp_gpu_aclk, "iopmp-gpu-aclk",
+		video_pll_clk_pd, 0x0, BIT(29), 0);
+static CCU_GATE(CLK_MIPIDSI0_PIXCLK, mipi_dsi0_pixclk, "mipi-dsi0-pixclk",
+		video_pll_clk_pd, 0x0, BIT(30), 0);
+static CCU_GATE(CLK_MIPIDSI1_PIXCLK, mipi_dsi1_pixclk, "mipi-dsi1-pixclk",
+		video_pll_clk_pd, 0x0, BIT(31), 0);
+static CCU_GATE(CLK_HDMI_PIXCLK, hdmi_pixclk, "hdmi-pixclk", video_pll_clk_pd,
+		0x4, BIT(0), 0);
+
 static CLK_FIXED_FACTOR_HW(gmac_pll_clk_100m, "gmac-pll-clk-100m",
 			   &gmac_pll_clk.common.hw, 10, 1, 0);
 
@@ -956,7 +1017,40 @@ static struct ccu_common *th1520_gate_clks[] = {
 	&sram3_clk.common,
 };
 
-#define NR_CLKS	(CLK_UART_SCLK + 1)
+static struct ccu_common *th1520_vo_gate_clks[] = {
+	&axi4_vo_aclk.common,
+	&gpu_core_clk.common,
+	&gpu_cfg_aclk.common,
+	&dpu0_pixelclk.common,
+	&dpu1_pixelclk.common,
+	&dpu_hclk.common,
+	&dpu_aclk.common,
+	&dpu_cclk.common,
+	&hdmi_sfr_clk.common,
+	&hdmi_pclk.common,
+	&hdmi_cec_clk.common,
+	&mipi_dsi0_pclk.common,
+	&mipi_dsi1_pclk.common,
+	&mipi_dsi0_cfg_clk.common,
+	&mipi_dsi1_cfg_clk.common,
+	&mipi_dsi0_refclk.common,
+	&mipi_dsi1_refclk.common,
+	&hdmi_i2c_clk.common,
+	&x2h_dpu1_aclk.common,
+	&x2h_dpu_aclk.common,
+	&axi4_vo_pclk.common,
+	&iopmp_vosys_dpu_pclk.common,
+	&iopmp_vosys_dpu1_pclk.common,
+	&iopmp_vosys_gpu_pclk.common,
+	&iopmp_dpu1_aclk.common,
+	&iopmp_dpu_aclk.common,
+	&iopmp_gpu_aclk.common,
+	&mipi_dsi0_pixclk.common,
+	&mipi_dsi1_pixclk.common,
+	&hdmi_pixclk.common
+};
+
+#define NR_CLKS	(CLK_HDMI_PIXCLK + 1)
 
 static const struct regmap_config th1520_clk_regmap_config = {
 	.reg_bits = 32,
@@ -965,13 +1059,40 @@ static const struct regmap_config th1520_clk_regmap_config = {
 	.fast_io = true,
 };
 
+static int th1520_add_gate_clocks(struct device *dev,
+				  struct clk_hw_onecell_data *priv,
+				  struct regmap *map, void __iomem *base,
+				  struct ccu_common **gate_clks,
+				  size_t gate_clks_size)
+{
+	struct clk_hw *hw;
+	int i;
+
+	for (i = 0; i < gate_clks_size; i++) {
+		struct ccu_gate *cg = hw_to_ccu_gate(&gate_clks[i]->hw);
+
+		gate_clks[i]->map = map;
+
+		hw = devm_clk_hw_register_gate_parent_data(
+			dev, cg->common.hw.init->name,
+			cg->common.hw.init->parent_data, 0,
+			base + cg->common.cfg0, ffs(cg->enable) - 1, 0, NULL);
+		if (IS_ERR(hw))
+			return PTR_ERR(hw);
+
+		priv->hws[cg->common.clkid] = hw;
+	}
+
+	return 0;
+}
+
 static int th1520_clk_probe(struct platform_device *pdev)
 {
 	struct device *dev = &pdev->dev;
 	struct clk_hw_onecell_data *priv;
 
-	struct regmap *map;
-	void __iomem *base;
+	struct regmap *map, *map_vosys;
+	void __iomem *base, *base_vosys;
 	struct clk_hw *hw;
 	int ret, i;
 
@@ -981,14 +1102,22 @@ static int th1520_clk_probe(struct platform_device *pdev)
 
 	priv->num = NR_CLKS;
 
-	base = devm_platform_ioremap_resource(pdev, 0);
+	base = devm_platform_ioremap_resource_byname(pdev, "ap-clks");
 	if (IS_ERR(base))
 		return PTR_ERR(base);
 
+	base_vosys = devm_platform_ioremap_resource_byname(pdev, "vo-clks");
+	if (IS_ERR(base_vosys))
+		return PTR_ERR(base_vosys);
+
 	map = devm_regmap_init_mmio(dev, base, &th1520_clk_regmap_config);
 	if (IS_ERR(map))
 		return PTR_ERR(map);
 
+	map_vosys = devm_regmap_init_mmio(dev, base_vosys, &th1520_clk_regmap_config);
+	if (IS_ERR(map_vosys))
+		return PTR_ERR(map_vosys);
+
 	for (i = 0; i < ARRAY_SIZE(th1520_pll_clks); i++) {
 		struct ccu_pll *cp = hw_to_ccu_pll(&th1520_pll_clks[i]->hw);
 
@@ -1033,21 +1162,16 @@ static int th1520_clk_probe(struct platform_device *pdev)
 		priv->hws[cm->common.clkid] = hw;
 	}
 
-	for (i = 0; i < ARRAY_SIZE(th1520_gate_clks); i++) {
-		struct ccu_gate *cg = hw_to_ccu_gate(&th1520_gate_clks[i]->hw);
-
-		th1520_gate_clks[i]->map = map;
-
-		hw = devm_clk_hw_register_gate_parent_data(dev,
-							   cg->common.hw.init->name,
-							   cg->common.hw.init->parent_data,
-							   0, base + cg->common.cfg0,
-							   ffs(cg->enable) - 1, 0, NULL);
-		if (IS_ERR(hw))
-			return PTR_ERR(hw);
+	ret = th1520_add_gate_clocks(dev, priv, map, base, th1520_gate_clks,
+				     ARRAY_SIZE(th1520_gate_clks));
+	if (ret)
+		return ret;
 
-		priv->hws[cg->common.clkid] = hw;
-	}
+	ret = th1520_add_gate_clocks(dev, priv, map_vosys, base_vosys,
+				     th1520_vo_gate_clks,
+				     ARRAY_SIZE(th1520_vo_gate_clks));
+	if (ret)
+		return ret;
 
 	ret = devm_clk_hw_register(dev, &osc12m_clk.hw);
 	if (ret)
-- 
2.34.1


  parent reply	other threads:[~2024-12-23 12:56 UTC|newest]

Thread overview: 39+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <CGME20241223125600eucas1p22d9257e92c798e9f4346a76d1d0fc73d@eucas1p2.samsung.com>
2024-12-23 12:55 ` [RFC PATCH v2 00/19] Enable drm/imagination BXM-4-64 Support for LicheePi 4A Michal Wilczynski
2024-12-23 12:55   ` [RFC PATCH v2 01/19] dt-bindings: clock: Add VO subsystem clocks and update address requirements Michal Wilczynski
2024-12-23 16:05     ` Krzysztof Kozlowski
2024-12-23 20:50     ` Stephen Boyd
2024-12-24  8:53       ` Krzysztof Kozlowski
2024-12-24  9:23         ` Michal Wilczynski
2024-12-24 13:33           ` Krzysztof Kozlowski
2024-12-23 12:55   ` Michal Wilczynski [this message]
2024-12-23 12:55   ` [RFC PATCH v2 03/19] dt-bindings: power: thead,th1520: Add support for power domains Michal Wilczynski
2024-12-23 15:16     ` Rob Herring (Arm)
2024-12-23 16:02       ` Michal Wilczynski
2024-12-23 16:06         ` Krzysztof Kozlowski
2024-12-23 16:09     ` Krzysztof Kozlowski
2024-12-24  9:31       ` Michal Wilczynski
2024-12-24 13:32         ` Krzysztof Kozlowski
2024-12-23 12:55   ` [RFC PATCH v2 04/19] dt-bindings: firmware: thead,th1520: Add support for firmware node Michal Wilczynski
2024-12-23 16:11     ` Krzysztof Kozlowski
2024-12-23 12:55   ` [RFC PATCH v2 05/19] firmware: thead: Add AON firmware protocol driver Michal Wilczynski
2024-12-23 16:17     ` Krzysztof Kozlowski
2024-12-23 12:55   ` [RFC PATCH v2 06/19] soc: thead: power-domain: Add power-domain driver for TH1520 Michal Wilczynski
2024-12-23 16:20     ` Krzysztof Kozlowski
2024-12-23 16:26     ` Krzysztof Kozlowski
2024-12-23 12:55   ` [RFC PATCH v2 07/19] riscv: Enable PM_GENERIC_DOMAINS for T-Head SoCs Michal Wilczynski
2024-12-23 12:55   ` [RFC PATCH v2 08/19] dt-bindings: reset: Add T-HEAD TH1520 SoC Reset Controller Michal Wilczynski
2024-12-23 16:22     ` Krzysztof Kozlowski
2024-12-23 12:55   ` [RFC PATCH v2 09/19] reset: thead: Add TH1520 reset controller driver Michal Wilczynski
2024-12-23 16:25     ` Krzysztof Kozlowski
2024-12-23 12:55   ` [RFC PATCH v2 10/19] drm/imagination: Add reset controller support for GPU initialization Michal Wilczynski
2024-12-23 12:55   ` [RFC PATCH v2 11/19] dt-bindings: gpu: Add 'resets' property " Michal Wilczynski
2024-12-23 16:29     ` Krzysztof Kozlowski
2024-12-23 12:55   ` [RFC PATCH v2 12/19] dt-bindings: gpu: Add compatibles for T-HEAD TH1520 GPU Michal Wilczynski
2024-12-23 16:31     ` Krzysztof Kozlowski
2024-12-23 12:55   ` [RFC PATCH v2 13/19] drm/imagination: Add support for IMG BXM-4-64 GPU Michal Wilczynski
2024-12-23 12:55   ` [RFC PATCH v2 14/19] drm/imagination: Enable PowerVR driver for RISC-V Michal Wilczynski
2024-12-23 12:55   ` [RFC PATCH v2 15/19] riscv: dts: thead: Extend device tree clk with VO reg Michal Wilczynski
2024-12-23 12:55   ` [RFC PATCH v2 16/19] riscv: dts: thead: Add mailbox node Michal Wilczynski
2024-12-23 12:55   ` [RFC PATCH v2 17/19] riscv: dts: thead: Introduce power domain nodes with aon firmware Michal Wilczynski
2024-12-23 12:55   ` [RFC PATCH v2 18/19] riscv: dts: thead: Introduce reset controller node Michal Wilczynski
2024-12-23 12:55   ` [RFC PATCH v2 19/19] riscv: dts: thead: Add GPU node to TH1520 device tree Michal Wilczynski

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20241223125553.3527812-3-m.wilczynski@samsung.com \
    --to=m.wilczynski@samsung.com \
    --cc=airlied@gmail.com \
    --cc=aou@eecs.berkeley.edu \
    --cc=conor+dt@kernel.org \
    --cc=devicetree@vger.kernel.org \
    --cc=drew@pdp7.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=frank.binns@imgtec.com \
    --cc=guoren@kernel.org \
    --cc=jassisinghbrar@gmail.com \
    --cc=jszhang@kernel.org \
    --cc=krzk+dt@kernel.org \
    --cc=linux-clk@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=linux-riscv@lists.infradead.org \
    --cc=m.szyprowski@samsung.com \
    --cc=maarten.lankhorst@linux.intel.com \
    --cc=matt.coster@imgtec.com \
    --cc=mripard@kernel.org \
    --cc=mturquette@baylibre.com \
    --cc=p.zabel@pengutronix.de \
    --cc=palmer@dabbelt.com \
    --cc=paul.walmsley@sifive.com \
    --cc=robh@kernel.org \
    --cc=sboyd@kernel.org \
    --cc=simona@ffwll.ch \
    --cc=tzimmermann@suse.de \
    --cc=ulf.hansson@linaro.org \
    --cc=wefu@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox