* [PATCH v2 0/2] clk: qcom: Add GPUCC and GXCLK support for Hawi
@ 2026-07-31 5:53 Dongfang Zhao
2026-07-31 5:53 ` [PATCH v2 1/2] dt-bindings: clock: qcom: Add Hawi GPU clock controllers Dongfang Zhao
` (3 more replies)
0 siblings, 4 replies; 6+ messages in thread
From: Dongfang Zhao @ 2026-07-31 5:53 UTC (permalink / raw)
To: mturquette, robh, andersson, conor+dt, sboyd, krzk+dt
Cc: linux-kernel, konrad.dybcio, linux-arm-msm, devicetree, linux-clk,
taniya.das, bmasney
Add GPU clock controller (GPUCC) and GX clock controller (GXCLKCTL)
support for the Qualcomm Hawi SoC.
The GPUCC provides clocks, resets and power domains for the GPU
subsystem. The GXCLKCTL manages only the GX GDSC; remaining resources
are handled by firmware. Hawi's GX clock controller reuses the existing
gxclkctl-kaanapali driver via a fallback compatible
("qcom,hawi-gxclkctl", "qcom,kaanapali-gxclkctl"), so no driver change
is needed unless Hawi-specific behaviour is required later.
Changes in v2:
- dt-bindings: qcom,hawi-gpucc: reorder power-domains and required-opps
to MX, CX, GMXC to match existing GPUCC bindings (suggested by
Krzysztof Kozlowski)
- dt-bindings: qcom,hawi-gpucc: shorten required-opps item descriptions
(suggested by Krzysztof Kozlowski)
- clk: qcom: gpucc-hawi: collect Reviewed-by from Taniya Das
- Rebased onto linux-next (20260730)
---
Dongfang Zhao (2):
dt-bindings: clock: qcom: Add Hawi GPU clock controllers
clk: qcom: Add support for Hawi GPUCC
.../devicetree/bindings/clock/qcom,hawi-gpucc.yaml | 78 ++++
.../bindings/clock/qcom,kaanapali-gxclkctl.yaml | 22 +-
drivers/clk/qcom/Kconfig | 12 +
drivers/clk/qcom/Makefile | 1 +
drivers/clk/qcom/gpucc-hawi.c | 461 +++++++++++++++++++++
include/dt-bindings/clock/qcom,hawi-gpucc.h | 47 +++
6 files changed, 613 insertions(+), 8 deletions(-)
---
base-commit: 95d6a9ccef99117115e41e9adb271243bd5e985b
change-id: 20260705-gpucc-hawi-8c35e13866fc
Best regards,
--
Dongfang Zhao <dongfang.zhao@oss.qualcomm.com>
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v2 1/2] dt-bindings: clock: qcom: Add Hawi GPU clock controllers
2026-07-31 5:53 [PATCH v2 0/2] clk: qcom: Add GPUCC and GXCLK support for Hawi Dongfang Zhao
@ 2026-07-31 5:53 ` Dongfang Zhao
2026-08-03 9:26 ` Krzysztof Kozlowski
2026-07-31 5:53 ` [PATCH v2 2/2] clk: qcom: Add support for Hawi GPUCC Dongfang Zhao
` (2 subsequent siblings)
3 siblings, 1 reply; 6+ messages in thread
From: Dongfang Zhao @ 2026-07-31 5:53 UTC (permalink / raw)
To: mturquette, robh, andersson, conor+dt, sboyd, krzk+dt
Cc: linux-kernel, konrad.dybcio, linux-arm-msm, devicetree, linux-clk,
taniya.das, bmasney
Add the device tree binding and clock, reset and power-domain IDs for the
Hawi graphics clock controller. This lets Hawi device trees describe the
GPU clocks, resets and power domains, and lets dtbs_check validate those
nodes.
Add the qcom,hawi-gxclkctl compatible for the Hawi GX clock controller,
using qcom,kaanapali-gxclkctl as the fallback because the register layout
is identical.
Signed-off-by: Dongfang Zhao <dongfang.zhao@oss.qualcomm.com>
---
.../devicetree/bindings/clock/qcom,hawi-gpucc.yaml | 78 ++++++++++++++++++++++
.../bindings/clock/qcom,kaanapali-gxclkctl.yaml | 22 +++---
include/dt-bindings/clock/qcom,hawi-gpucc.h | 47 +++++++++++++
3 files changed, 139 insertions(+), 8 deletions(-)
diff --git a/Documentation/devicetree/bindings/clock/qcom,hawi-gpucc.yaml b/Documentation/devicetree/bindings/clock/qcom,hawi-gpucc.yaml
new file mode 100644
index 000000000000..3e40bc3c061d
--- /dev/null
+++ b/Documentation/devicetree/bindings/clock/qcom,hawi-gpucc.yaml
@@ -0,0 +1,78 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/qcom,hawi-gpucc.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Qualcomm Graphics Clock & Reset Controller on Hawi
+
+maintainers:
+ - Dongfang Zhao <dongfang.zhao@oss.qualcomm.com>
+
+description: |
+ Qualcomm graphics clock control module provides the clocks, resets and power
+ domains on Qualcomm SoCs.
+
+ See also: include/dt-bindings/clock/qcom,hawi-gpucc.h
+
+properties:
+ compatible:
+ const: qcom,hawi-gpucc
+
+ clocks:
+ items:
+ - description: Board XO source
+ - description: GPLL0 main branch source
+ - description: GPLL0 div branch source
+
+ power-domains:
+ items:
+ - description: A phandle to the MX power-domain
+ - description: A phandle to the CX power-domain
+ - description: A phandle to the GMXC power-domain
+
+ required-opps:
+ items:
+ - description: MX performance points
+ - description: CX performance points
+ - description: GMXC performance points
+
+required:
+ - compatible
+ - clocks
+ - power-domains
+ - required-opps
+ - '#power-domain-cells'
+
+allOf:
+ - $ref: qcom,gcc.yaml#
+
+unevaluatedProperties: false
+
+examples:
+ - |
+ #include <dt-bindings/clock/qcom,hawi-gcc.h>
+ #include <dt-bindings/power/qcom,rpmhpd.h>
+
+ soc {
+ #address-cells = <2>;
+ #size-cells = <2>;
+
+ clock-controller@3d90000 {
+ compatible = "qcom,hawi-gpucc";
+ reg = <0x0 0x03d90000 0x0 0x9800>;
+ clocks = <&bi_tcxo_div2>,
+ <&gcc GCC_GPU_GPLL0_CLK_SRC>,
+ <&gcc GCC_GPU_GPLL0_DIV_CLK_SRC>;
+ power-domains = <&rpmhpd RPMHPD_MX>,
+ <&rpmhpd RPMHPD_CX>,
+ <&rpmhpd RPMHPD_GMXC>;
+ required-opps = <&rpmhpd_opp_low_svs>,
+ <&rpmhpd_opp_low_svs>,
+ <&rpmhpd_opp_low_svs_d3>;
+ #clock-cells = <1>;
+ #reset-cells = <1>;
+ #power-domain-cells = <1>;
+ };
+ };
+...
diff --git a/Documentation/devicetree/bindings/clock/qcom,kaanapali-gxclkctl.yaml b/Documentation/devicetree/bindings/clock/qcom,kaanapali-gxclkctl.yaml
index e868963f659b..28b653f6b64d 100644
--- a/Documentation/devicetree/bindings/clock/qcom,kaanapali-gxclkctl.yaml
+++ b/Documentation/devicetree/bindings/clock/qcom,kaanapali-gxclkctl.yaml
@@ -4,25 +4,31 @@
$id: http://devicetree.org/schemas/clock/qcom,kaanapali-gxclkctl.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#
-title: Qualcomm Graphics power domain Controller on Kaanapali
+title: Qualcomm Graphics GX Power Domain Controller
maintainers:
- Taniya Das <taniya.das@oss.qualcomm.com>
description: |
- Qualcomm GX(graphics) is a clock controller which has PLLs, clocks and
- Power domains (GDSC). This module provides the power domains control
- of gxclkctl on Qualcomm SoCs which helps the recovery of Graphics subsystem.
+ The Qualcomm graphics GX clock controller (GXCLKCTL) contains PLLs, clocks
+ and power domains (GDSC). This module provides the power domain control of
+ GXCLKCTL on Qualcomm SoCs, which helps the recovery of the graphics
+ subsystem.
See also:
include/dt-bindings/clock/qcom,kaanapali-gxclkctl.h
properties:
compatible:
- enum:
- - qcom,glymur-gxclkctl
- - qcom,kaanapali-gxclkctl
- - qcom,sm8750-gxclkctl
+ oneOf:
+ - enum:
+ - qcom,glymur-gxclkctl
+ - qcom,kaanapali-gxclkctl
+ - qcom,sm8750-gxclkctl
+ - items:
+ - enum:
+ - qcom,hawi-gxclkctl
+ - const: qcom,kaanapali-gxclkctl
power-domains:
description:
diff --git a/include/dt-bindings/clock/qcom,hawi-gpucc.h b/include/dt-bindings/clock/qcom,hawi-gpucc.h
new file mode 100644
index 000000000000..181534771b10
--- /dev/null
+++ b/include/dt-bindings/clock/qcom,hawi-gpucc.h
@@ -0,0 +1,47 @@
+/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
+/*
+ * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
+ */
+
+#ifndef _DT_BINDINGS_CLK_QCOM_GPU_CC_HAWI_H
+#define _DT_BINDINGS_CLK_QCOM_GPU_CC_HAWI_H
+
+/* GPU_CC clocks */
+#define GPU_CC_AHB_CLK 0
+#define GPU_CC_CB_CLK 1
+#define GPU_CC_CX_ACCU_SHIFT_CLK 2
+#define GPU_CC_CX_GMU_CLK 3
+#define GPU_CC_CXO_AON_CLK 4
+#define GPU_CC_CXO_CLK 5
+#define GPU_CC_DEMET_CLK 6
+#define GPU_CC_DPM_CLK 7
+#define GPU_CC_FREQ_MEASURE_CLK 8
+#define GPU_CC_GMU_CLK_SRC 9
+#define GPU_CC_GPU_SMMU_VOTE_CLK 10
+#define GPU_CC_GX_ACCU_SHIFT_CLK 11
+#define GPU_CC_HUB_AON_CLK 12
+#define GPU_CC_HUB_CLK_SRC 13
+#define GPU_CC_HUB_CX_INT_CLK 14
+#define GPU_CC_HUB_DIV_CLK_SRC 15
+#define GPU_CC_MEMNOC_GFX_CLK 16
+#define GPU_CC_MXG_AHB_CLK 17
+#define GPU_CC_MXG_XO_CLK 18
+#define GPU_CC_PLL0 19
+#define GPU_CC_RSCC_HUB_AON_CLK 20
+#define GPU_CC_RSCC_XO_AON_CLK 21
+#define GPU_CC_SLEEP_CLK 22
+
+/* GPU_CC power domains */
+#define GPU_CC_CX_GDSC 0
+#define GPU_CC_MXG_GDSC 1
+
+/* GPU_CC resets */
+#define GPU_CC_CB_BCR 0
+#define GPU_CC_CX_BCR 1
+#define GPU_CC_FAST_HUB_BCR 2
+#define GPU_CC_GMU_BCR 3
+#define GPU_CC_GX_BCR 4
+#define GPU_CC_MXG_BCR 5
+#define GPU_CC_XO_BCR 6
+
+#endif
--
2.43.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v2 2/2] clk: qcom: Add support for Hawi GPUCC
2026-07-31 5:53 [PATCH v2 0/2] clk: qcom: Add GPUCC and GXCLK support for Hawi Dongfang Zhao
2026-07-31 5:53 ` [PATCH v2 1/2] dt-bindings: clock: qcom: Add Hawi GPU clock controllers Dongfang Zhao
@ 2026-07-31 5:53 ` Dongfang Zhao
2026-08-10 18:45 ` [PATCH v2 0/2] clk: qcom: Add GPUCC and GXCLK support for Hawi Bjorn Andersson
2026-08-31 20:21 ` (subset) " Bjorn Andersson
3 siblings, 0 replies; 6+ messages in thread
From: Dongfang Zhao @ 2026-07-31 5:53 UTC (permalink / raw)
To: mturquette, robh, andersson, conor+dt, sboyd, krzk+dt
Cc: linux-kernel, konrad.dybcio, linux-arm-msm, devicetree, linux-clk,
taniya.das, bmasney
Add the graphics clock controller driver for Hawi. This provides the
clocks, resets and power domains required by the GPU driver to enable the
graphics subsystem.
Reuse the existing gxclkctl-kaanapali driver for GX clock controller
support and build it with the Hawi GPUCC driver.
Signed-off-by: Dongfang Zhao <dongfang.zhao@oss.qualcomm.com>
Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
Reviewed-by: Taniya Das <taniya.das@oss.qualcomm.com>
---
drivers/clk/qcom/Kconfig | 12 ++
drivers/clk/qcom/Makefile | 1 +
drivers/clk/qcom/gpucc-hawi.c | 461 ++++++++++++++++++++++++++++++++++++++++++
3 files changed, 474 insertions(+)
diff --git a/drivers/clk/qcom/Kconfig b/drivers/clk/qcom/Kconfig
index 63f271aff177..498d94837afe 100644
--- a/drivers/clk/qcom/Kconfig
+++ b/drivers/clk/qcom/Kconfig
@@ -391,6 +391,18 @@ config CLK_HAWI_GCC
Say Y if you want to use peripheral devices such as UART, SPI,
I2C, USB, UFS, SD/eMMC, PCIe, etc.
+config CLK_HAWI_GPUCC
+ tristate "Hawi Graphics Clock Controller"
+ depends on ARM64 || COMPILE_TEST
+ select CLK_HAWI_GCC
+ default m if ARCH_QCOM
+ help
+ Support for the graphics clock controller on Hawi devices.
+ Say Y if you want to support graphics controller devices and
+ functionality such as 3D graphics. It also provides GX clock
+ domain control required for GPU power management on Hawi-based
+ devices.
+
config CLK_HAWI_TCSRCC
tristate "Hawi TCSR Clock Controller"
depends on ARM64 || COMPILE_TEST
diff --git a/drivers/clk/qcom/Makefile b/drivers/clk/qcom/Makefile
index fff069da16de..dd4e2700ee5f 100644
--- a/drivers/clk/qcom/Makefile
+++ b/drivers/clk/qcom/Makefile
@@ -33,6 +33,7 @@ obj-$(CONFIG_CLK_GLYMUR_GPUCC) += gpucc-glymur.o gxclkctl-kaanapali.o
obj-$(CONFIG_CLK_GLYMUR_TCSRCC) += tcsrcc-glymur.o
obj-$(CONFIG_CLK_GLYMUR_VIDEOCC) += videocc-glymur.o
obj-$(CONFIG_CLK_HAWI_GCC) += gcc-hawi.o
+obj-$(CONFIG_CLK_HAWI_GPUCC) += gpucc-hawi.o gxclkctl-kaanapali.o
obj-$(CONFIG_CLK_HAWI_TCSRCC) += tcsrcc-hawi.o
obj-$(CONFIG_CLK_HAWI_VIDEOCC) += videocc-hawi.o
obj-$(CONFIG_CLK_KAANAPALI_CAMCC) += cambistmclkcc-kaanapali.o camcc-kaanapali.o
diff --git a/drivers/clk/qcom/gpucc-hawi.c b/drivers/clk/qcom/gpucc-hawi.c
new file mode 100644
index 000000000000..30b3ffb0638f
--- /dev/null
+++ b/drivers/clk/qcom/gpucc-hawi.c
@@ -0,0 +1,461 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
+ */
+
+#include <linux/clk-provider.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/regmap.h>
+
+#include <dt-bindings/clock/qcom,hawi-gpucc.h>
+
+#include "clk-alpha-pll.h"
+#include "clk-branch.h"
+#include "clk-rcg.h"
+#include "clk-regmap.h"
+#include "clk-regmap-divider.h"
+#include "common.h"
+#include "gdsc.h"
+#include "reset.h"
+
+enum {
+ DT_BI_TCXO,
+ DT_GPLL0_OUT_MAIN,
+ DT_GPLL0_OUT_MAIN_DIV,
+};
+
+enum {
+ P_BI_TCXO,
+ P_GPLL0_OUT_MAIN,
+ P_GPLL0_OUT_MAIN_DIV,
+ P_GPU_CC_PLL0_OUT_EVEN,
+ P_GPU_CC_PLL0_OUT_MAIN,
+ P_GPU_CC_PLL0_OUT_ODD,
+};
+
+static const struct pll_vco taycan_eha_t_vco[] = {
+ { 249600000, 2500000000, 0 },
+};
+
+/* 788.0 MHz Configuration */
+static const struct alpha_pll_config gpu_cc_pll0_config = {
+ .l = 0x29,
+ .alpha = 0xaaa,
+ .config_ctl_val = 0xa5c400e7,
+ .config_ctl_hi_val = 0x0a8060e0,
+ .config_ctl_hi1_val = 0xf51dea20,
+ .user_ctl_val = 0x00000000,
+ .user_ctl_hi_val = 0x00000002,
+};
+
+static struct clk_alpha_pll gpu_cc_pll0 = {
+ .offset = 0x0,
+ .config = &gpu_cc_pll0_config,
+ .vco_table = taycan_eha_t_vco,
+ .num_vco = ARRAY_SIZE(taycan_eha_t_vco),
+ .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_TAYCAN_EHA_T],
+ .clkr = {
+ .hw.init = &(const struct clk_init_data) {
+ .name = "gpu_cc_pll0",
+ .parent_data = &(const struct clk_parent_data) {
+ .index = DT_BI_TCXO,
+ },
+ .num_parents = 1,
+ .ops = &clk_alpha_pll_taycan_eha_t_ops,
+ },
+ },
+};
+
+static const struct parent_map gpu_cc_parent_map_1[] = {
+ { P_BI_TCXO, 0 },
+ { P_GPU_CC_PLL0_OUT_MAIN, 1 },
+ { P_GPU_CC_PLL0_OUT_EVEN, 2 },
+ { P_GPU_CC_PLL0_OUT_ODD, 3 },
+ { P_GPLL0_OUT_MAIN, 5 },
+ { P_GPLL0_OUT_MAIN_DIV, 6 },
+};
+
+static const struct clk_parent_data gpu_cc_parent_data_1[] = {
+ { .index = DT_BI_TCXO },
+ { .hw = &gpu_cc_pll0.clkr.hw },
+ { .hw = &gpu_cc_pll0.clkr.hw },
+ { .hw = &gpu_cc_pll0.clkr.hw },
+ { .index = DT_GPLL0_OUT_MAIN },
+ { .index = DT_GPLL0_OUT_MAIN_DIV },
+};
+
+static const struct freq_tbl ftbl_gpu_cc_gmu_clk_src[] = {
+ F(19200000, P_BI_TCXO, 1, 0, 0),
+ F(788000000, P_GPU_CC_PLL0_OUT_MAIN, 1, 0, 0),
+ F(825000000, P_GPU_CC_PLL0_OUT_MAIN, 1, 0, 0),
+ F(880000000, P_GPU_CC_PLL0_OUT_MAIN, 1, 0, 0),
+ F(917000000, P_GPU_CC_PLL0_OUT_MAIN, 1, 0, 0),
+ { }
+};
+
+static struct clk_rcg2 gpu_cc_gmu_clk_src = {
+ .cmd_rcgr = 0x9318,
+ .mnd_width = 0,
+ .hid_width = 5,
+ .parent_map = gpu_cc_parent_map_1,
+ .freq_tbl = ftbl_gpu_cc_gmu_clk_src,
+ .hw_clk_ctrl = true,
+ .clkr.hw.init = &(const struct clk_init_data) {
+ .name = "gpu_cc_gmu_clk_src",
+ .parent_data = gpu_cc_parent_data_1,
+ .num_parents = ARRAY_SIZE(gpu_cc_parent_data_1),
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_rcg2_shared_ops,
+ },
+};
+
+static const struct freq_tbl ftbl_gpu_cc_hub_clk_src[] = {
+ F(150000000, P_GPLL0_OUT_MAIN_DIV, 2, 0, 0),
+ F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0),
+ F(300000000, P_GPLL0_OUT_MAIN, 2, 0, 0),
+ F(400000000, P_GPLL0_OUT_MAIN, 1.5, 0, 0),
+ { }
+};
+
+static struct clk_rcg2 gpu_cc_hub_clk_src = {
+ .cmd_rcgr = 0x93f0,
+ .mnd_width = 0,
+ .hid_width = 5,
+ .parent_map = gpu_cc_parent_map_1,
+ .freq_tbl = ftbl_gpu_cc_hub_clk_src,
+ .hw_clk_ctrl = true,
+ .clkr.hw.init = &(const struct clk_init_data) {
+ .name = "gpu_cc_hub_clk_src",
+ .parent_data = gpu_cc_parent_data_1,
+ .num_parents = ARRAY_SIZE(gpu_cc_parent_data_1),
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_rcg2_shared_ops,
+ },
+};
+
+static struct clk_regmap_div gpu_cc_hub_div_clk_src = {
+ .reg = 0x9430,
+ .shift = 0,
+ .width = 4,
+ .clkr.hw.init = &(const struct clk_init_data) {
+ .name = "gpu_cc_hub_div_clk_src",
+ .parent_hws = (const struct clk_hw *[]) {
+ &gpu_cc_hub_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_regmap_div_ro_ops,
+ },
+};
+
+static struct clk_branch gpu_cc_ahb_clk = {
+ .halt_reg = 0x90bc,
+ .halt_check = BRANCH_HALT_DELAY,
+ .clkr = {
+ .enable_reg = 0x90bc,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data) {
+ .name = "gpu_cc_ahb_clk",
+ .parent_hws = (const struct clk_hw *[]) {
+ &gpu_cc_hub_div_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_branch gpu_cc_cx_accu_shift_clk = {
+ .halt_reg = 0x9104,
+ .halt_check = BRANCH_HALT_VOTED,
+ .clkr = {
+ .enable_reg = 0x9104,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data) {
+ .name = "gpu_cc_cx_accu_shift_clk",
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_branch gpu_cc_cx_gmu_clk = {
+ .halt_reg = 0x90d4,
+ .halt_check = BRANCH_HALT_VOTED,
+ .hwcg_reg = 0x90d4,
+ .hwcg_bit = 1,
+ .clkr = {
+ .enable_reg = 0x90d4,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data) {
+ .name = "gpu_cc_cx_gmu_clk",
+ .parent_hws = (const struct clk_hw *[]) {
+ &gpu_cc_gmu_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_aon_ops,
+ },
+ },
+};
+
+static struct clk_branch gpu_cc_demet_clk = {
+ .halt_reg = 0x9010,
+ .halt_check = BRANCH_HALT_VOTED,
+ .clkr = {
+ .enable_reg = 0x9010,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data) {
+ .name = "gpu_cc_demet_clk",
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_branch gpu_cc_dpm_clk = {
+ .halt_reg = 0x9108,
+ .halt_check = BRANCH_HALT,
+ .clkr = {
+ .enable_reg = 0x9108,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data) {
+ .name = "gpu_cc_dpm_clk",
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_branch gpu_cc_freq_measure_clk = {
+ .halt_reg = 0x900c,
+ .halt_check = BRANCH_HALT,
+ .clkr = {
+ .enable_reg = 0x900c,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data) {
+ .name = "gpu_cc_freq_measure_clk",
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_branch gpu_cc_gpu_smmu_vote_clk = {
+ .halt_reg = 0x7000,
+ .halt_check = BRANCH_HALT_VOTED,
+ .clkr = {
+ .enable_reg = 0x7000,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data) {
+ .name = "gpu_cc_gpu_smmu_vote_clk",
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_branch gpu_cc_gx_accu_shift_clk = {
+ .halt_reg = 0x9070,
+ .halt_check = BRANCH_HALT_VOTED,
+ .clkr = {
+ .enable_reg = 0x9070,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data) {
+ .name = "gpu_cc_gx_accu_shift_clk",
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_branch gpu_cc_hub_aon_clk = {
+ .halt_reg = 0x93ec,
+ .halt_check = BRANCH_HALT_VOTED,
+ .clkr = {
+ .enable_reg = 0x93ec,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data) {
+ .name = "gpu_cc_hub_aon_clk",
+ .parent_hws = (const struct clk_hw *[]) {
+ &gpu_cc_hub_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_aon_ops,
+ },
+ },
+};
+
+static struct clk_branch gpu_cc_hub_cx_int_clk = {
+ .halt_reg = 0x90e8,
+ .halt_check = BRANCH_HALT_VOTED,
+ .hwcg_reg = 0x90e8,
+ .hwcg_bit = 1,
+ .clkr = {
+ .enable_reg = 0x90e8,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data) {
+ .name = "gpu_cc_hub_cx_int_clk",
+ .parent_hws = (const struct clk_hw *[]) {
+ &gpu_cc_hub_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_aon_ops,
+ },
+ },
+};
+
+static struct clk_branch gpu_cc_memnoc_gfx_clk = {
+ .halt_reg = 0x90ec,
+ .halt_check = BRANCH_HALT_VOTED,
+ .hwcg_reg = 0x90ec,
+ .hwcg_bit = 1,
+ .clkr = {
+ .enable_reg = 0x90ec,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data) {
+ .name = "gpu_cc_memnoc_gfx_clk",
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct clk_branch gpu_cc_mxg_ahb_clk = {
+ .halt_reg = 0x9744,
+ .halt_check = BRANCH_HALT_VOTED,
+ .clkr = {
+ .enable_reg = 0x9744,
+ .enable_mask = BIT(0),
+ .hw.init = &(const struct clk_init_data) {
+ .name = "gpu_cc_mxg_ahb_clk",
+ .parent_hws = (const struct clk_hw *[]) {
+ &gpu_cc_hub_div_clk_src.clkr.hw,
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ .ops = &clk_branch2_ops,
+ },
+ },
+};
+
+static struct gdsc gpu_cc_cx_gdsc = {
+ .gdscr = 0x9080,
+ .gds_hw_ctrl = 0x9094,
+ .en_rest_wait_val = 0x2,
+ .en_few_wait_val = 0x2,
+ .clk_dis_wait_val = 0xf,
+ .pd = {
+ .name = "gpu_cc_cx_gdsc",
+ },
+ .pwrsts = PWRSTS_OFF_ON,
+ .flags = VOTABLE | POLL_CFG_GDSCR | RETAIN_FF_ENABLE,
+};
+
+static struct gdsc gpu_cc_mxg_gdsc = {
+ .gdscr = 0x961c,
+ .en_rest_wait_val = 0x2,
+ .en_few_wait_val = 0x2,
+ .clk_dis_wait_val = 0xf,
+ .pd = {
+ .name = "gpu_cc_mxg_gdsc",
+ },
+ .pwrsts = PWRSTS_OFF_ON,
+ .flags = POLL_CFG_GDSCR | RETAIN_FF_ENABLE,
+};
+
+static struct clk_regmap *gpu_cc_hawi_clocks[] = {
+ [GPU_CC_AHB_CLK] = &gpu_cc_ahb_clk.clkr,
+ [GPU_CC_CX_ACCU_SHIFT_CLK] = &gpu_cc_cx_accu_shift_clk.clkr,
+ [GPU_CC_CX_GMU_CLK] = &gpu_cc_cx_gmu_clk.clkr,
+ [GPU_CC_DEMET_CLK] = &gpu_cc_demet_clk.clkr,
+ [GPU_CC_DPM_CLK] = &gpu_cc_dpm_clk.clkr,
+ [GPU_CC_FREQ_MEASURE_CLK] = &gpu_cc_freq_measure_clk.clkr,
+ [GPU_CC_GMU_CLK_SRC] = &gpu_cc_gmu_clk_src.clkr,
+ [GPU_CC_GPU_SMMU_VOTE_CLK] = &gpu_cc_gpu_smmu_vote_clk.clkr,
+ [GPU_CC_GX_ACCU_SHIFT_CLK] = &gpu_cc_gx_accu_shift_clk.clkr,
+ [GPU_CC_HUB_AON_CLK] = &gpu_cc_hub_aon_clk.clkr,
+ [GPU_CC_HUB_CLK_SRC] = &gpu_cc_hub_clk_src.clkr,
+ [GPU_CC_HUB_CX_INT_CLK] = &gpu_cc_hub_cx_int_clk.clkr,
+ [GPU_CC_HUB_DIV_CLK_SRC] = &gpu_cc_hub_div_clk_src.clkr,
+ [GPU_CC_MEMNOC_GFX_CLK] = &gpu_cc_memnoc_gfx_clk.clkr,
+ [GPU_CC_MXG_AHB_CLK] = &gpu_cc_mxg_ahb_clk.clkr,
+ [GPU_CC_PLL0] = &gpu_cc_pll0.clkr,
+};
+
+static struct gdsc *gpu_cc_hawi_gdscs[] = {
+ [GPU_CC_CX_GDSC] = &gpu_cc_cx_gdsc,
+ [GPU_CC_MXG_GDSC] = &gpu_cc_mxg_gdsc,
+};
+
+static const struct qcom_reset_map gpu_cc_hawi_resets[] = {
+ [GPU_CC_CB_BCR] = { 0x93a0 },
+ [GPU_CC_CX_BCR] = { 0x907c },
+ [GPU_CC_FAST_HUB_BCR] = { 0x93e4 },
+ [GPU_CC_GMU_BCR] = { 0x9314 },
+ [GPU_CC_GX_BCR] = { 0x905c },
+ [GPU_CC_MXG_BCR] = { 0x9618 },
+ [GPU_CC_XO_BCR] = { 0x9000 },
+};
+
+static struct clk_alpha_pll *gpu_cc_hawi_plls[] = {
+ &gpu_cc_pll0,
+};
+
+static u32 gpu_cc_hawi_critical_cbcrs[] = {
+ 0x93a4, /* GPU_CC_CB_CLK */
+ 0x9704, /* GPU_CC_MXG_XO_CLK */
+ 0x90e4, /* GPU_CC_CXO_CLK */
+ 0x9008, /* GPU_CC_CXO_AON_CLK */
+ 0x93e8, /* GPU_CC_RSCC_HUB_AON_CLK */
+ 0x9004, /* GPU_CC_RSCC_XO_AON_CLK */
+ 0x90cc, /* GPU_CC_SLEEP_CLK */
+};
+
+static const struct regmap_config gpu_cc_hawi_regmap_config = {
+ .reg_bits = 32,
+ .reg_stride = 4,
+ .val_bits = 32,
+ .max_register = 0x9744,
+ .fast_io = true,
+};
+
+static struct qcom_cc_driver_data gpu_cc_hawi_driver_data = {
+ .alpha_plls = gpu_cc_hawi_plls,
+ .num_alpha_plls = ARRAY_SIZE(gpu_cc_hawi_plls),
+ .clk_cbcrs = gpu_cc_hawi_critical_cbcrs,
+ .num_clk_cbcrs = ARRAY_SIZE(gpu_cc_hawi_critical_cbcrs),
+};
+
+static const struct qcom_cc_desc gpu_cc_hawi_desc = {
+ .config = &gpu_cc_hawi_regmap_config,
+ .clks = gpu_cc_hawi_clocks,
+ .num_clks = ARRAY_SIZE(gpu_cc_hawi_clocks),
+ .resets = gpu_cc_hawi_resets,
+ .num_resets = ARRAY_SIZE(gpu_cc_hawi_resets),
+ .gdscs = gpu_cc_hawi_gdscs,
+ .num_gdscs = ARRAY_SIZE(gpu_cc_hawi_gdscs),
+ .use_rpm = true,
+ .driver_data = &gpu_cc_hawi_driver_data,
+};
+
+static const struct of_device_id gpu_cc_hawi_match_table[] = {
+ { .compatible = "qcom,hawi-gpucc" },
+ { }
+};
+MODULE_DEVICE_TABLE(of, gpu_cc_hawi_match_table);
+
+static int gpu_cc_hawi_probe(struct platform_device *pdev)
+{
+ return qcom_cc_probe(pdev, &gpu_cc_hawi_desc);
+}
+
+static struct platform_driver gpu_cc_hawi_driver = {
+ .probe = gpu_cc_hawi_probe,
+ .driver = {
+ .name = "gpucc-hawi",
+ .of_match_table = gpu_cc_hawi_match_table,
+ },
+};
+
+module_platform_driver(gpu_cc_hawi_driver);
+
+MODULE_DESCRIPTION("QTI GPUCC HAWI Driver");
+MODULE_LICENSE("GPL");
--
2.43.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v2 1/2] dt-bindings: clock: qcom: Add Hawi GPU clock controllers
2026-07-31 5:53 ` [PATCH v2 1/2] dt-bindings: clock: qcom: Add Hawi GPU clock controllers Dongfang Zhao
@ 2026-08-03 9:26 ` Krzysztof Kozlowski
0 siblings, 0 replies; 6+ messages in thread
From: Krzysztof Kozlowski @ 2026-08-03 9:26 UTC (permalink / raw)
To: Dongfang Zhao
Cc: mturquette, robh, andersson, conor+dt, sboyd, krzk+dt,
linux-kernel, konrad.dybcio, linux-arm-msm, devicetree, linux-clk,
taniya.das, bmasney
On Thu, Jul 30, 2026 at 10:53:48PM -0700, Dongfang Zhao wrote:
> Add the device tree binding and clock, reset and power-domain IDs for the
> Hawi graphics clock controller. This lets Hawi device trees describe the
> GPU clocks, resets and power domains, and lets dtbs_check validate those
> nodes.
>
> Add the qcom,hawi-gxclkctl compatible for the Hawi GX clock controller,
> using qcom,kaanapali-gxclkctl as the fallback because the register layout
> is identical.
>
> Signed-off-by: Dongfang Zhao <dongfang.zhao@oss.qualcomm.com>
> ---
> .../devicetree/bindings/clock/qcom,hawi-gpucc.yaml | 78 ++++++++++++++++++++++
> .../bindings/clock/qcom,kaanapali-gxclkctl.yaml | 22 +++---
> include/dt-bindings/clock/qcom,hawi-gpucc.h | 47 +++++++++++++
> 3 files changed, 139 insertions(+), 8 deletions(-)
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com>
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2 0/2] clk: qcom: Add GPUCC and GXCLK support for Hawi
2026-07-31 5:53 [PATCH v2 0/2] clk: qcom: Add GPUCC and GXCLK support for Hawi Dongfang Zhao
2026-07-31 5:53 ` [PATCH v2 1/2] dt-bindings: clock: qcom: Add Hawi GPU clock controllers Dongfang Zhao
2026-07-31 5:53 ` [PATCH v2 2/2] clk: qcom: Add support for Hawi GPUCC Dongfang Zhao
@ 2026-08-10 18:45 ` Bjorn Andersson
2026-08-31 20:21 ` (subset) " Bjorn Andersson
3 siblings, 0 replies; 6+ messages in thread
From: Bjorn Andersson @ 2026-08-10 18:45 UTC (permalink / raw)
To: mturquette, robh, conor+dt, sboyd, krzk+dt, Dongfang Zhao
Cc: linux-kernel, konrad.dybcio, linux-arm-msm, devicetree, linux-clk,
taniya.das, bmasney
On Thu, 30 Jul 2026 22:53:47 -0700, Dongfang Zhao wrote:
> Add GPU clock controller (GPUCC) and GX clock controller (GXCLKCTL)
> support for the Qualcomm Hawi SoC.
>
> The GPUCC provides clocks, resets and power domains for the GPU
> subsystem. The GXCLKCTL manages only the GX GDSC; remaining resources
> are handled by firmware. Hawi's GX clock controller reuses the existing
> gxclkctl-kaanapali driver via a fallback compatible
> ("qcom,hawi-gxclkctl", "qcom,kaanapali-gxclkctl"), so no driver change
> is needed unless Hawi-specific behaviour is required later.
>
> [...]
Applied, thanks!
[1/2] dt-bindings: clock: qcom: Add Hawi GPU clock controllers
commit: bfe412a7a3ffc01abe84549f7851c32c81574340
[2/2] clk: qcom: Add support for Hawi GPUCC
commit: 21e33a757766223ceb82648ac41c00c29939aa53
Best regards,
--
Bjorn Andersson <andersson@kernel.org>
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: (subset) [PATCH v2 0/2] clk: qcom: Add GPUCC and GXCLK support for Hawi
2026-07-31 5:53 [PATCH v2 0/2] clk: qcom: Add GPUCC and GXCLK support for Hawi Dongfang Zhao
` (2 preceding siblings ...)
2026-08-10 18:45 ` [PATCH v2 0/2] clk: qcom: Add GPUCC and GXCLK support for Hawi Bjorn Andersson
@ 2026-08-31 20:21 ` Bjorn Andersson
3 siblings, 0 replies; 6+ messages in thread
From: Bjorn Andersson @ 2026-08-31 20:21 UTC (permalink / raw)
To: mturquette, robh, conor+dt, sboyd, krzk+dt, Dongfang Zhao
Cc: linux-kernel, konrad.dybcio, linux-arm-msm, devicetree, linux-clk,
taniya.das, bmasney
On Thu, 30 Jul 2026 22:53:47 -0700, Dongfang Zhao wrote:
> Add GPU clock controller (GPUCC) and GX clock controller (GXCLKCTL)
> support for the Qualcomm Hawi SoC.
>
> The GPUCC provides clocks, resets and power domains for the GPU
> subsystem. The GXCLKCTL manages only the GX GDSC; remaining resources
> are handled by firmware. Hawi's GX clock controller reuses the existing
> gxclkctl-kaanapali driver via a fallback compatible
> ("qcom,hawi-gxclkctl", "qcom,kaanapali-gxclkctl"), so no driver change
> is needed unless Hawi-specific behaviour is required later.
>
> [...]
Applied, thanks!
[2/2] clk: qcom: Add support for Hawi GPUCC
commit: 1450a68f30a163d5cc2b1f1009797b357bec33e3
Best regards,
--
Bjorn Andersson <andersson@kernel.org>
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2026-08-31 20:21 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-31 5:53 [PATCH v2 0/2] clk: qcom: Add GPUCC and GXCLK support for Hawi Dongfang Zhao
2026-07-31 5:53 ` [PATCH v2 1/2] dt-bindings: clock: qcom: Add Hawi GPU clock controllers Dongfang Zhao
2026-08-03 9:26 ` Krzysztof Kozlowski
2026-07-31 5:53 ` [PATCH v2 2/2] clk: qcom: Add support for Hawi GPUCC Dongfang Zhao
2026-08-10 18:45 ` [PATCH v2 0/2] clk: qcom: Add GPUCC and GXCLK support for Hawi Bjorn Andersson
2026-08-31 20:21 ` (subset) " Bjorn Andersson
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox