* [PATCH v9 0/3] Add driver support for ESWIN eic700 SoC clock controller
@ 2025-12-29 10:58 dongxuyang
2025-12-29 10:59 ` [PATCH v9 1/3] dt-bindings: clock: eswin: Documentation for eic7700 SoC dongxuyang
` (2 more replies)
0 siblings, 3 replies; 7+ messages in thread
From: dongxuyang @ 2025-12-29 10:58 UTC (permalink / raw)
To: mturquette, sboyd, robh, krzk+dt, conor+dt, linux-clk, devicetree,
linux-kernel, troy.mitchell, bmasney
Cc: ningyu, linmin, huangyifeng, pinkesh.vaghela, ganboing,
Xuyang Dong
From: Xuyang Dong <dongxuyang@eswincomputing.com>
The link [1] provides the official documentation for the EIC7700. Section 3.2
covers the clock subsystem.
[1] https://www.sifive.com/document-file/eic7700x-datasheet
Updates:
Changes in v9:
- Updated driver file
- Checked return values of eswin_clk_register_*() in the probe function.
- Removed binding IDs check from pll functions in clk.c, as these functions
were exclusively used by pll clocks and did not require ID validation.
- The PLL structure has been extended with max_rate and min_rate fields to
explicitly define the frequency operating range of the PLL. These limits
were now utilized by the clk_pll_determine_rate() function.
- Removed __clk_lookup() in clk_pll_set_rate. Added clk_notifier support
in clk-eic7700.c.
- Added five previously missing clocks from [1].
- Link to v8: https://lore.kernel.org/all/20251113013637.1109-1-dongxuyang@eswincomputing.com/
Changes in v8:
- Updated YAML file
- Added "Acked-by: Troy Mitchell <troy.mitchell@linux.dev>"
- Updated driver file
- Changed Kconfig from bool to tristate.
- Updated MAINTAINERS file
- Added "ESWIN SOC SERIES CLOCK DRIVER"
- Link to v7: https://lore.kernel.org/all/20251023071658.455-1-dongxuyang@eswincomputing.com/
Changes in v7:
- Updated YAML file
- Added "Acked-by: Conor Dooley <conor.dooley@microchip.com>" for bindings.
- Updated driver file
- Added description for clk of eswin_calc_pll().
- Added macro EIC7700_MUX_TBL to manage mux clock-tree.
- Added eswin_clk_register_mux_tbl() to register mux clocks with
discontinuous parent indexes.
- Link to v6: https://lore.kernel.org/all/20251009092029.140-1-dongxuyang@eswincomputing.com/
Changes in v6:
- Removed config option patch dependency from cover letter, because the patch
was applied.
- Updated YAML file
- Added an oscillator as the clock input, named xtal24m.
- Added clocks property.
- Updated driver file
- Replaced fixed_rate_clk_xtal_24m with xtal24m.
- Dropped fixed_rate_clk_xtal_24m from driver. Because clock xtal24m was
registered by fixed-clock as oscillator.
- Link to v5: https://lore.kernel.org/all/20250923084637.1223-1-dongxuyang@eswincomputing.com/
Changes in v5:
- Removed vendor prefix patch dependency from cover letter, because the patch
was applied.
- Updated YAML file
- Placed the required after all properties.
- Removed patternProperties. Also removed compatible of eswin,pll-clock,
eswin,mux-clock, eswin,divider-clock and eswin,gate-clock as we have moved
clock tree from DTS to Linux driver.
- Removed the clock tree from DTS. Used clock-controller to manage all
clock. Removed all child nodes in clock-controller.
- Removed '#address-cells' and '#size-cells' properties, because the clock
controller did not need to define these properties.
- Removed eic7700-clocks.dtsi.
- Added dt-bindings header for clock IDs. Because used the IDs to register
clocks.
- Updated driver file
- Modified the commit for clock driver. Dropped indentation in commit.
- Removed CLK_OF_DECLARE(). Used *clk_hw_register* to register clocks. Used
devm_of_clk_add_hw_provider.
- Dropped singletons.
- Checked the value right after obtaining it.
- Removed the definitions of macro frequency in clk.h like CLK_FREQ_24M.
- Modified description of help in Kconfig.
- Added COMPILE_TEST. Added COMMON_CLK_ESWIN for clk.o. And added
"select COMMON_CLK_ESWIN" for clk-eic7700.c. Without COMMON_CLK_EIC7700,
clk.c could not be compiled.
- Used .determined_rate.
- Added macro definitions of EIC7700_DIV, EIC7700_FIXED, EIC7700_FACTOR,
EIC7700_MUX and EIC7700_PLL to manage clock tree.
- Added clk-eic7700.h to place eic7700 SoC clock registers.
- Removed refdiv_val and postdiv1_val from clk_pll_recalc_rate(). Because
these values were unused.
- Link to v4: https://lore.kernel.org/all/20250815093539.975-1-dongxuyang@eswincomputing.com/
Changes in v4:
- Updated YAML file
- Changed name from cpu-default-frequency to cpu-default-freq-hz.
- Dropped $ref of cpu-default-frequency.
- Added cpu-default-frequency for required.
- Removed cpu-default-frequency in updated file, because there was no
need to add cpu-default-frequency.
- Moved DIVIDER to DIV.
- Arranged the IDs in order.
- Dropped EIC7700_NR_CLKS.
- Removed dt-bindings eswin,eic7700-clock.h. Because IDs was not used,
and used clock device nodes.
- According to the updated driver codes, the YAML has been updated.
- Updated driver file
- Remove undocumented parameters "cpu_no_boost_1_6ghz" and
"cpu-default-frequency".
- Modified the comment and used the correct Linux coding style.
- Removed codes of voltage, because it was not the clock driver.
- Updated the formula of clock frequency calculation. Removed the logic
that only used register selection.
- Used CLK_OF_DECLARE() to register clocks. Registered pll-clock,
mux-clock, divider-clock, and gate-clock in clk-eic7700.c.
The specific implementation of clock registration was in clk.c.
- Added eic7700-clocks.dtsi.
- Moved device information to DTS. Put all clocks' node in the
eic7700-clocks.dtsi.
- Link to v3: https://lore.kernel.org/all/20250624103212.287-1-dongxuyang@eswincomputing.com/
Changes in v3:
- Update example, drop child node and add '#clock-cells' to the parent
node.
- Change parent node from sys-crg to clock-controller for this yaml.
- Drop "syscon", "simple-mfd" to clear warnings/errors by using "make
dt_binding_check". And these are not necessary.
- Add "cpu-default-frequency" definition in yaml for "undocumented ABI".
- Drop Reviewed-by, this is misunderstanding. We have not received such
an email.
- Link to v2: https://lore.kernel.org/all/20250523090747.1830-1-dongxuyang@eswincomputing.com/
Changes in v2:
- Update example, drop child node.
- Clear warnings/errors for using "make dt_binding_check".
- Change to the correct format.
- Drop some non-stanard code.
- Use dev_err_probe() in probe functions.
- Link to v1: https://lore.kernel.org/all/20250514002233.187-1-dongxuyang@eswincomputing.com/
Xuyang Dong (3):
dt-bindings: clock: eswin: Documentation for eic7700 SoC
clock: eswin: Add eic7700 clock driver
MAINTAINERS: Add entry for ESWIN EIC7700 clock driver
.../bindings/clock/eswin,eic7700-clock.yaml | 46 +
MAINTAINERS | 8 +
drivers/clk/Kconfig | 1 +
drivers/clk/Makefile | 1 +
drivers/clk/eswin/Kconfig | 15 +
drivers/clk/eswin/Makefile | 8 +
drivers/clk/eswin/clk-eic7700.c | 1110 +++++++++++++++++
drivers/clk/eswin/clk-eic7700.h | 122 ++
drivers/clk/eswin/clk.c | 396 ++++++
drivers/clk/eswin/clk.h | 266 ++++
.../dt-bindings/clock/eswin,eic7700-clock.h | 285 +++++
11 files changed, 2258 insertions(+)
create mode 100644 Documentation/devicetree/bindings/clock/eswin,eic7700-clock.yaml
create mode 100644 drivers/clk/eswin/Kconfig
create mode 100644 drivers/clk/eswin/Makefile
create mode 100644 drivers/clk/eswin/clk-eic7700.c
create mode 100644 drivers/clk/eswin/clk-eic7700.h
create mode 100644 drivers/clk/eswin/clk.c
create mode 100644 drivers/clk/eswin/clk.h
create mode 100644 include/dt-bindings/clock/eswin,eic7700-clock.h
--
2.43.0
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v9 1/3] dt-bindings: clock: eswin: Documentation for eic7700 SoC
2025-12-29 10:58 [PATCH v9 0/3] Add driver support for ESWIN eic700 SoC clock controller dongxuyang
@ 2025-12-29 10:59 ` dongxuyang
2025-12-29 10:59 ` [PATCH v9 2/3] clock: eswin: Add eic7700 clock driver dongxuyang
2025-12-29 11:00 ` [PATCH v9 3/3] MAINTAINERS: Add entry for ESWIN EIC7700 " dongxuyang
2 siblings, 0 replies; 7+ messages in thread
From: dongxuyang @ 2025-12-29 10:59 UTC (permalink / raw)
To: mturquette, sboyd, robh, krzk+dt, conor+dt, linux-clk, devicetree,
linux-kernel, troy.mitchell, bmasney
Cc: ningyu, linmin, huangyifeng, pinkesh.vaghela, ganboing,
Xuyang Dong, Conor Dooley
From: Xuyang Dong <dongxuyang@eswincomputing.com>
Add device tree binding documentation for the ESWIN eic7700
clock controller module.
Signed-off-by: Yifeng Huang <huangyifeng@eswincomputing.com>
Acked-by: Conor Dooley <conor.dooley@microchip.com>
Acked-by: Troy Mitchell <troy.mitchell@linux.dev>
Signed-off-by: Xuyang Dong <dongxuyang@eswincomputing.com>
---
.../bindings/clock/eswin,eic7700-clock.yaml | 46 +++
.../dt-bindings/clock/eswin,eic7700-clock.h | 285 ++++++++++++++++++
2 files changed, 331 insertions(+)
create mode 100644 Documentation/devicetree/bindings/clock/eswin,eic7700-clock.yaml
create mode 100644 include/dt-bindings/clock/eswin,eic7700-clock.h
diff --git a/Documentation/devicetree/bindings/clock/eswin,eic7700-clock.yaml b/Documentation/devicetree/bindings/clock/eswin,eic7700-clock.yaml
new file mode 100644
index 000000000000..3125ae52bde6
--- /dev/null
+++ b/Documentation/devicetree/bindings/clock/eswin,eic7700-clock.yaml
@@ -0,0 +1,46 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/eswin,eic7700-clock.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Eswin EIC7700 SoC clock controller
+
+maintainers:
+ - Yifeng Huang <huangyifeng@eswincomputing.com>
+ - Xuyang Dong <dongxuyang@eswincomputing.com>
+
+description:
+ The clock controller generates and supplies clock to all the modules
+ for eic7700 SoC.
+
+properties:
+ compatible:
+ const: eswin,eic7700-clock
+
+ reg:
+ maxItems: 1
+
+ clocks:
+ items:
+ - description: External 24MHz oscillator clock
+
+ '#clock-cells':
+ const: 1
+
+required:
+ - compatible
+ - reg
+ - clocks
+ - '#clock-cells'
+
+additionalProperties: false
+
+examples:
+ - |
+ clock-controller@51828000 {
+ compatible = "eswin,eic7700-clock";
+ reg = <0x51828000 0x300>;
+ clocks = <&xtal24m>;
+ #clock-cells = <1>;
+ };
diff --git a/include/dt-bindings/clock/eswin,eic7700-clock.h b/include/dt-bindings/clock/eswin,eic7700-clock.h
new file mode 100644
index 000000000000..87ccf72eda37
--- /dev/null
+++ b/include/dt-bindings/clock/eswin,eic7700-clock.h
@@ -0,0 +1,285 @@
+/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
+/*
+ * Copyright 2025, Beijing ESWIN Computing Technology Co., Ltd..
+ * All rights reserved.
+ *
+ * Device Tree binding constants for EIC7700 clock controller.
+ *
+ * Authors:
+ * Yifeng Huang <huangyifeng@eswincomputing.com>
+ * Xuyang Dong <dongxuyang@eswincomputing.com>
+ */
+
+#ifndef _DT_BINDINGS_ESWIN_EIC7700_CLOCK_H_
+#define _DT_BINDINGS_ESWIN_EIC7700_CLOCK_H_
+
+#define EIC7700_CLK_XTAL_32K 0
+#define EIC7700_CLK_PLL_CPU 1
+#define EIC7700_CLK_SPLL0_FOUT1 2
+#define EIC7700_CLK_SPLL0_FOUT2 3
+#define EIC7700_CLK_SPLL0_FOUT3 4
+#define EIC7700_CLK_SPLL1_FOUT1 5
+#define EIC7700_CLK_SPLL1_FOUT2 6
+#define EIC7700_CLK_SPLL1_FOUT3 7
+#define EIC7700_CLK_SPLL2_FOUT1 8
+#define EIC7700_CLK_SPLL2_FOUT2 9
+#define EIC7700_CLK_SPLL2_FOUT3 10
+#define EIC7700_CLK_VPLL_FOUT1 11
+#define EIC7700_CLK_VPLL_FOUT2 12
+#define EIC7700_CLK_VPLL_FOUT3 13
+#define EIC7700_CLK_APLL_FOUT1 14
+#define EIC7700_CLK_APLL_FOUT2 15
+#define EIC7700_CLK_APLL_FOUT3 16
+#define EIC7700_CLK_EXT_MCLK 17
+#define EIC7700_CLK_LPDDR_REF_BAK 18
+#define EIC7700_CLK_MUX_CPU_ROOT_3MUX1_GFREE 19
+#define EIC7700_CLK_MUX_CPU_ACLK_2MUX1_GFREE 20
+#define EIC7700_CLK_MUX_DSP_ACLK_ROOT_2MUX1_GFREE 21
+#define EIC7700_CLK_MUX_D2D_ACLK_ROOT_2MUX1_GFREE 22
+#define EIC7700_CLK_MUX_MSHCORE_ROOT_3MUX1_0 23
+#define EIC7700_CLK_MUX_MSHCORE_ROOT_3MUX1_1 24
+#define EIC7700_CLK_MUX_MSHCORE_ROOT_3MUX1_2 25
+#define EIC7700_CLK_MUX_NPU_LLCLK_3MUX1_GFREE 26
+#define EIC7700_CLK_MUX_NPU_CORE_3MUX1_GFREE 27
+#define EIC7700_CLK_MUX_VI_ACLK_ROOT_2MUX1_GFREE 28
+#define EIC7700_CLK_MUX_VI_DVP_ROOT_2MUX1_GFREE 29
+#define EIC7700_CLK_MUX_VI_DIG_ISP_ROOT_2MUX1_GFREE 30
+#define EIC7700_CLK_MUX_VO_ACLK_ROOT_2MUX1_GFREE 31
+#define EIC7700_CLK_MUX_VO_PIXEL_ROOT_2MUX1 32
+#define EIC7700_CLK_MUX_VCDEC_ROOT_2MUX1_GFREE 33
+#define EIC7700_CLK_MUX_VCACLK_ROOT_2MUX1_GFREE 34
+#define EIC7700_CLK_MUX_SATA_PHY_2MUX1 35
+#define EIC7700_CLK_MUX_BOOTSPI_CLK_2MUX1_GFREE 36
+#define EIC7700_CLK_MUX_SCPU_CORE_CLK_2MUX1_GFREE 37
+#define EIC7700_CLK_MUX_LPCPU_CORE_CLK_2MUX1_GFREE 38
+#define EIC7700_CLK_MUX_VO_MCLK_2MUX_EXT_MCLK 39
+#define EIC7700_CLK_MUX_SYSCFG_CLK_ROOT_2MUX1_GFREE 40
+#define EIC7700_CLK_MUX_AONDMA_AXI2MUX1_GFREE 41
+#define EIC7700_CLK_MUX_RMII_REF_2MUX 42
+#define EIC7700_CLK_MUX_ETH_CORE_2MUX1 43
+#define EIC7700_CLK_MUX_VI_DW_ROOT_2MUX1 44
+#define EIC7700_CLK_MUX_NPU_E31_3MUX1_GFREE 45
+#define EIC7700_CLK_MUX_DDR_ACLK_ROOT_2MUX1_GFREE 46
+#define EIC7700_CLK_DIV_SYS_CFG_DYNM 47
+#define EIC7700_CLK_DIV_NOC_NSP_DYNM 48
+#define EIC7700_CLK_DIV_BOOTSPI_DYNM 49
+#define EIC7700_CLK_DIV_SCPU_CORE_DYNM 50
+#define EIC7700_CLK_DIV_LPCPU_CORE_DYNM 51
+#define EIC7700_CLK_DIV_GPU_ACLK_DYNM 52
+#define EIC7700_CLK_DIV_DSP_ACLK_DYNM 53
+#define EIC7700_CLK_DIV_D2D_ACLK_DYNM 54
+#define EIC7700_CLK_DIV_HSP_ACLK_DYNM 55
+#define EIC7700_CLK_DIV_ETH_TXCLK_DYNM_0 56
+#define EIC7700_CLK_DIV_ETH_TXCLK_DYNM_1 57
+#define EIC7700_CLK_DIV_MSHC_CORE_DYNM_0 58
+#define EIC7700_CLK_DIV_MSHC_CORE_DYNM_1 59
+#define EIC7700_CLK_DIV_MSHC_CORE_DYNM_2 60
+#define EIC7700_CLK_DIV_PCIE_ACLK_DYNM 61
+#define EIC7700_CLK_DIV_NPU_ACLK_DYNM 62
+#define EIC7700_CLK_DIV_NPU_LLC_SRC0_DYNM 63
+#define EIC7700_CLK_DIV_NPU_LLC_SRC1_DYNM 64
+#define EIC7700_CLK_DIV_NPU_CORECLK_DYNM 65
+#define EIC7700_CLK_DIV_VI_ACLK_DYNM 66
+#define EIC7700_CLK_DIV_VI_DVP_DYNM 67
+#define EIC7700_CLK_DIV_VI_DIG_ISP_DYNM 68
+#define EIC7700_CLK_DIV_VI_SHUTTER_DYNM_0 69
+#define EIC7700_CLK_DIV_VI_SHUTTER_DYNM_1 70
+#define EIC7700_CLK_DIV_VI_SHUTTER_DYNM_2 71
+#define EIC7700_CLK_DIV_VI_SHUTTER_DYNM_3 72
+#define EIC7700_CLK_DIV_VI_SHUTTER_DYNM_4 73
+#define EIC7700_CLK_DIV_VI_SHUTTER_DYNM_5 74
+#define EIC7700_CLK_DIV_VO_ACLK_DYNM 75
+#define EIC7700_CLK_DIV_IESMCLK_DYNM 76
+#define EIC7700_CLK_DIV_VO_PIXEL_DYNM 77
+#define EIC7700_CLK_DIV_VO_MCLK_DYNM 78
+#define EIC7700_CLK_DIV_VC_ACLK_DYNM 79
+#define EIC7700_CLK_DIV_JD_DYNM 80
+#define EIC7700_CLK_DIV_JE_DYNM 81
+#define EIC7700_CLK_DIV_VE_DYNM 82
+#define EIC7700_CLK_DIV_VD_DYNM 83
+#define EIC7700_CLK_DIV_G2D_DYNM 84
+#define EIC7700_CLK_DIV_AONDMA_AXI_DYNM 85
+#define EIC7700_CLK_DIV_CRYPTO_DYNM 86
+#define EIC7700_CLK_DIV_VI_DW_DYNM 87
+#define EIC7700_CLK_DIV_NPU_E31_DYNM 88
+#define EIC7700_CLK_DIV_SATA_PHY_REF_DYNM 89
+#define EIC7700_CLK_DIV_DSP_0_ACLK_DYNM 90
+#define EIC7700_CLK_DIV_DSP_1_ACLK_DYNM 91
+#define EIC7700_CLK_DIV_DSP_2_ACLK_DYNM 92
+#define EIC7700_CLK_DIV_DSP_3_ACLK_DYNM 93
+#define EIC7700_CLK_DIV_DDR_ACLK_DYNM 94
+#define EIC7700_CLK_DIV_AON_RTC_DYNM 95
+#define EIC7700_CLK_DIV_U84_RTC_TOGGLE_DYNM 96
+#define EIC7700_CLK_DIV_VO_CEC_DYNM 97
+#define EIC7700_CLK_GATE_CPU_EXT_SRC_CORE_CLK_0 98
+#define EIC7700_CLK_GATE_CPU_EXT_SRC_CORE_CLK_1 99
+#define EIC7700_CLK_GATE_CPU_EXT_SRC_CORE_CLK_2 100
+#define EIC7700_CLK_GATE_CPU_EXT_SRC_CORE_CLK_3 101
+#define EIC7700_CLK_GATE_CPU_TRACE_CLK_0 102
+#define EIC7700_CLK_GATE_CPU_TRACE_CLK_1 103
+#define EIC7700_CLK_GATE_CPU_TRACE_CLK_2 104
+#define EIC7700_CLK_GATE_CPU_TRACE_CLK_3 105
+#define EIC7700_CLK_GATE_CPU_TRACE_COM_CLK 106
+#define EIC7700_CLK_GATE_SPLL0_FOUT2 107
+#define EIC7700_CLK_GATE_NOC_NSP_CLK 108
+#define EIC7700_CLK_GATE_BOOTSPI 109
+#define EIC7700_CLK_GATE_BOOTSPI_CFG 110
+#define EIC7700_CLK_GATE_SCPU_CORE 111
+#define EIC7700_CLK_GATE_SCPU_BUS 112
+#define EIC7700_CLK_GATE_LPCPU_CORE 113
+#define EIC7700_CLK_GATE_LPCPU_BUS 114
+#define EIC7700_CLK_GATE_GPU_ACLK 115
+#define EIC7700_CLK_GATE_GPU_GRAY_CLK 116
+#define EIC7700_CLK_GATE_GPU_CFG_CLK 117
+#define EIC7700_CLK_GATE_DSPT_ACLK 118
+#define EIC7700_CLK_GATE_DSPT_CFG_CLK 119
+#define EIC7700_CLK_GATE_D2D_ACLK 120
+#define EIC7700_CLK_GATE_D2D_CFG_CLK 121
+#define EIC7700_CLK_GATE_TCU_ACLK 122
+#define EIC7700_CLK_GATE_TCU_CFG_CLK 123
+#define EIC7700_CLK_GATE_DDRT_CFG_CLK 124
+#define EIC7700_CLK_GATE_DDRT0_P0_ACLK 125
+#define EIC7700_CLK_GATE_DDRT0_P1_ACLK 126
+#define EIC7700_CLK_GATE_DDRT0_P2_ACLK 127
+#define EIC7700_CLK_GATE_DDRT0_P3_ACLK 128
+#define EIC7700_CLK_GATE_DDRT0_P4_ACLK 129
+#define EIC7700_CLK_GATE_DDRT1_P0_ACLK 130
+#define EIC7700_CLK_GATE_DDRT1_P1_ACLK 131
+#define EIC7700_CLK_GATE_DDRT1_P2_ACLK 132
+#define EIC7700_CLK_GATE_DDRT1_P3_ACLK 133
+#define EIC7700_CLK_GATE_DDRT1_P4_ACLK 134
+#define EIC7700_CLK_GATE_TIMER_CLK_0 135
+#define EIC7700_CLK_GATE_TIMER_CLK_1 136
+#define EIC7700_CLK_GATE_TIMER_CLK_2 137
+#define EIC7700_CLK_GATE_TIMER_CLK_3 138
+#define EIC7700_CLK_GATE_TIMER_PCLK_0 139
+#define EIC7700_CLK_GATE_TIMER_PCLK_1 140
+#define EIC7700_CLK_GATE_TIMER_PCLK_2 141
+#define EIC7700_CLK_GATE_TIMER_PCLK_3 142
+#define EIC7700_CLK_GATE_TIMER3_CLK8 143
+#define EIC7700_CLK_GATE_PCIET_ACLK 144
+#define EIC7700_CLK_GATE_PCIET_CFG_CLK 145
+#define EIC7700_CLK_GATE_PCIET_CR_CLK 146
+#define EIC7700_CLK_GATE_PCIET_AUX_CLK 147
+#define EIC7700_CLK_GATE_NPU_ACLK 148
+#define EIC7700_CLK_GATE_NPU_CFG_CLK 149
+#define EIC7700_CLK_GATE_NPU_LLC_ACLK 150
+#define EIC7700_CLK_GATE_NPU_CLK 151
+#define EIC7700_CLK_GATE_NPU_E31_CLK 152
+#define EIC7700_CLK_GATE_VI_ACLK 153
+#define EIC7700_CLK_GATE_VI_DVP_CLK 154
+#define EIC7700_CLK_GATE_VI_CFG_CLK 155
+#define EIC7700_CLK_GATE_VI_DIG_DW_CLK 156
+#define EIC7700_CLK_GATE_VI_DIG_ISP_CLK 157
+#define EIC7700_CLK_GATE_VI_SHUTTER_0 158
+#define EIC7700_CLK_GATE_VI_SHUTTER_1 159
+#define EIC7700_CLK_GATE_VI_SHUTTER_2 160
+#define EIC7700_CLK_GATE_VI_SHUTTER_3 161
+#define EIC7700_CLK_GATE_VI_SHUTTER_4 162
+#define EIC7700_CLK_GATE_VI_SHUTTER_5 163
+#define EIC7700_CLK_GATE_VI_PHY_TXCLKESC 164
+#define EIC7700_CLK_GATE_VI_PHY_CFG 165
+#define EIC7700_CLK_GATE_VO_ACLK 166
+#define EIC7700_CLK_GATE_VO_CFG_CLK 167
+#define EIC7700_CLK_GATE_VO_HDMI_IESMCLK 168
+#define EIC7700_CLK_GATE_VO_PIXEL_CLK 169
+#define EIC7700_CLK_GATE_VO_I2S_MCLK 170
+#define EIC7700_CLK_GATE_HSP_CFG_CLK 171
+#define EIC7700_CLK_GATE_VC_ACLK 172
+#define EIC7700_CLK_GATE_VC_CFG_CLK 173
+#define EIC7700_CLK_GATE_VC_JE_CLK 174
+#define EIC7700_CLK_GATE_VC_JD_CLK 175
+#define EIC7700_CLK_GATE_VC_VE_CLK 176
+#define EIC7700_CLK_GATE_VC_VD_CLK 177
+#define EIC7700_CLK_GATE_G2D_CFG_CLK 178
+#define EIC7700_CLK_GATE_G2D_CLK 179
+#define EIC7700_CLK_GATE_G2D_ACLK 180
+#define EIC7700_CLK_GATE_AONDMA_CFG 181
+#define EIC7700_CLK_GATE_AONDMA_ACLK 182
+#define EIC7700_CLK_GATE_AON_ACLK 183
+#define EIC7700_CLK_GATE_HSP_SATA_RBC_CLK 184
+#define EIC7700_CLK_GATE_VO_CR_CLK 185
+#define EIC7700_CLK_GATE_HSP_ACLK 186
+#define EIC7700_CLK_GATE_HSP_SATA_OOB_CLK 187
+#define EIC7700_CLK_GATE_RTC_CFG 188
+#define EIC7700_CLK_GATE_RTC 189
+#define EIC7700_CLK_GATE_HSP_MSHC0_CORE_CLK 190
+#define EIC7700_CLK_GATE_HSP_MSHC1_CORE_CLK 191
+#define EIC7700_CLK_GATE_HSP_MSHC2_CORE_CLK 192
+#define EIC7700_CLK_GATE_HSP_ETH0_CORE_CLK 193
+#define EIC7700_CLK_GATE_HSP_ETH1_CORE_CLK 194
+#define EIC7700_CLK_GATE_HSP_RMII_REF_0 195
+#define EIC7700_CLK_GATE_HSP_RMII_REF_1 196
+#define EIC7700_CLK_GATE_PKA_CFG 197
+#define EIC7700_CLK_GATE_SPACC_CFG 198
+#define EIC7700_CLK_GATE_CRYPTO 199
+#define EIC7700_CLK_GATE_TRNG_CFG 200
+#define EIC7700_CLK_GATE_OTP_CFG 201
+#define EIC7700_CLK_GATE_MAILBOX_0 202
+#define EIC7700_CLK_GATE_MAILBOX_1 203
+#define EIC7700_CLK_GATE_MAILBOX_2 204
+#define EIC7700_CLK_GATE_MAILBOX_3 205
+#define EIC7700_CLK_GATE_MAILBOX_4 206
+#define EIC7700_CLK_GATE_MAILBOX_5 207
+#define EIC7700_CLK_GATE_MAILBOX_6 208
+#define EIC7700_CLK_GATE_MAILBOX_7 209
+#define EIC7700_CLK_GATE_MAILBOX_8 210
+#define EIC7700_CLK_GATE_MAILBOX_9 211
+#define EIC7700_CLK_GATE_MAILBOX_10 212
+#define EIC7700_CLK_GATE_MAILBOX_11 213
+#define EIC7700_CLK_GATE_MAILBOX_12 214
+#define EIC7700_CLK_GATE_MAILBOX_13 215
+#define EIC7700_CLK_GATE_MAILBOX_14 216
+#define EIC7700_CLK_GATE_MAILBOX_15 217
+#define EIC7700_CLK_GATE_LSP_I2C0_PCLK 218
+#define EIC7700_CLK_GATE_LSP_I2C1_PCLK 219
+#define EIC7700_CLK_GATE_LSP_I2C2_PCLK 220
+#define EIC7700_CLK_GATE_LSP_I2C3_PCLK 221
+#define EIC7700_CLK_GATE_LSP_I2C4_PCLK 222
+#define EIC7700_CLK_GATE_LSP_I2C5_PCLK 223
+#define EIC7700_CLK_GATE_LSP_I2C6_PCLK 224
+#define EIC7700_CLK_GATE_LSP_I2C7_PCLK 225
+#define EIC7700_CLK_GATE_LSP_I2C8_PCLK 226
+#define EIC7700_CLK_GATE_LSP_I2C9_PCLK 227
+#define EIC7700_CLK_GATE_LSP_WDT0_PCLK 228
+#define EIC7700_CLK_GATE_LSP_WDT1_PCLK 229
+#define EIC7700_CLK_GATE_LSP_WDT2_PCLK 230
+#define EIC7700_CLK_GATE_LSP_WDT3_PCLK 231
+#define EIC7700_CLK_GATE_LSP_SSI0_PCLK 232
+#define EIC7700_CLK_GATE_LSP_SSI1_PCLK 233
+#define EIC7700_CLK_GATE_LSP_PVT_PCLK 234
+#define EIC7700_CLK_GATE_AON_I2C0_PCLK 235
+#define EIC7700_CLK_GATE_AON_I2C1_PCLK 236
+#define EIC7700_CLK_GATE_LSP_UART0_PCLK 237
+#define EIC7700_CLK_GATE_LSP_UART1_PCLK 238
+#define EIC7700_CLK_GATE_LSP_UART2_PCLK 239
+#define EIC7700_CLK_GATE_LSP_UART3_PCLK 240
+#define EIC7700_CLK_GATE_LSP_UART4_PCLK 241
+#define EIC7700_CLK_GATE_LSP_TIMER_PCLK 242
+#define EIC7700_CLK_GATE_LSP_FAN_PCLK 243
+#define EIC7700_CLK_GATE_LSP_PVT0_CLK 244
+#define EIC7700_CLK_GATE_LSP_PVT1_CLK 245
+#define EIC7700_CLK_GATE_VC_JE_PCLK 246
+#define EIC7700_CLK_GATE_VC_JD_PCLK 247
+#define EIC7700_CLK_GATE_VC_VE_PCLK 248
+#define EIC7700_CLK_GATE_VC_VD_PCLK 249
+#define EIC7700_CLK_GATE_VC_MON_PCLK 250
+#define EIC7700_CLK_GATE_HSP_DMA0_CLK 251
+#define EIC7700_CLK_GATE_HSP_DMA0_CLK_TEST 252
+#define EIC7700_CLK_FIXED_FACTOR_CPU_DIV2 253
+#define EIC7700_CLK_FIXED_FACTOR_CLK_1M_DIV24 254
+#define EIC7700_CLK_FIXED_FACTOR_MIPI_TXESC_DIV10 255
+#define EIC7700_CLK_FIXED_FACTOR_U84_CORE_LP_DIV2 256
+#define EIC7700_CLK_FIXED_FACTOR_SCPU_BUS_DIV2 257
+#define EIC7700_CLK_FIXED_FACTOR_LPCPU_BUS_DIV2 258
+#define EIC7700_CLK_FIXED_FACTOR_PCIE_CR_DIV2 259
+#define EIC7700_CLK_FIXED_FACTOR_PCIE_AUX_DIV4 260
+#define EIC7700_CLK_FIXED_FACTOR_PVT_DIV20 261
+#define EIC7700_CLK_FIXED_FACTOR_HSP_RMII_REF_DIV6 262
+#define EIC7700_CLK_DIV_NOC_WDREF_DYNM 263
+#define EIC7700_CLK_GATE_DDR0_TRACE 264
+#define EIC7700_CLK_GATE_DDR1_TRACE 265
+#define EIC7700_CLK_GATE_RNOC_NSP 266
+#define EIC7700_CLK_GATE_NOC_WDREF 267
+
+#endif /* _DT_BINDINGS_ESWIN_EIC7700_CLOCK_H_ */
--
2.43.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v9 2/3] clock: eswin: Add eic7700 clock driver
2025-12-29 10:58 [PATCH v9 0/3] Add driver support for ESWIN eic700 SoC clock controller dongxuyang
2025-12-29 10:59 ` [PATCH v9 1/3] dt-bindings: clock: eswin: Documentation for eic7700 SoC dongxuyang
@ 2025-12-29 10:59 ` dongxuyang
2025-12-31 9:34 ` Marcel Ziswiler
2025-12-29 11:00 ` [PATCH v9 3/3] MAINTAINERS: Add entry for ESWIN EIC7700 " dongxuyang
2 siblings, 1 reply; 7+ messages in thread
From: dongxuyang @ 2025-12-29 10:59 UTC (permalink / raw)
To: mturquette, sboyd, robh, krzk+dt, conor+dt, linux-clk, devicetree,
linux-kernel, troy.mitchell, bmasney
Cc: ningyu, linmin, huangyifeng, pinkesh.vaghela, ganboing,
Xuyang Dong
From: Xuyang Dong <dongxuyang@eswincomputing.com>
Add clock drivers for the EIC7700 SoC. The clock controller on the ESWIN
EIC7700 provides various clocks to different IP blocks within the SoC.
Signed-off-by: Yifeng Huang <huangyifeng@eswincomputing.com>
Signed-off-by: Xuyang Dong <dongxuyang@eswincomputing.com>
---
drivers/clk/Kconfig | 1 +
drivers/clk/Makefile | 1 +
drivers/clk/eswin/Kconfig | 15 +
drivers/clk/eswin/Makefile | 8 +
drivers/clk/eswin/clk-eic7700.c | 1110 +++++++++++++++++++++++++++++++
drivers/clk/eswin/clk-eic7700.h | 122 ++++
drivers/clk/eswin/clk.c | 396 +++++++++++
drivers/clk/eswin/clk.h | 266 ++++++++
8 files changed, 1919 insertions(+)
create mode 100644 drivers/clk/eswin/Kconfig
create mode 100644 drivers/clk/eswin/Makefile
create mode 100644 drivers/clk/eswin/clk-eic7700.c
create mode 100644 drivers/clk/eswin/clk-eic7700.h
create mode 100644 drivers/clk/eswin/clk.c
create mode 100644 drivers/clk/eswin/clk.h
diff --git a/drivers/clk/Kconfig b/drivers/clk/Kconfig
index 3a1611008e48..2a9056d41093 100644
--- a/drivers/clk/Kconfig
+++ b/drivers/clk/Kconfig
@@ -515,6 +515,7 @@ source "drivers/clk/actions/Kconfig"
source "drivers/clk/analogbits/Kconfig"
source "drivers/clk/baikal-t1/Kconfig"
source "drivers/clk/bcm/Kconfig"
+source "drivers/clk/eswin/Kconfig"
source "drivers/clk/hisilicon/Kconfig"
source "drivers/clk/imgtec/Kconfig"
source "drivers/clk/imx/Kconfig"
diff --git a/drivers/clk/Makefile b/drivers/clk/Makefile
index 61ec08404442..37f6070a342e 100644
--- a/drivers/clk/Makefile
+++ b/drivers/clk/Makefile
@@ -121,6 +121,7 @@ obj-$(CONFIG_CLK_BAIKAL_T1) += baikal-t1/
obj-y += bcm/
obj-$(CONFIG_ARCH_BERLIN) += berlin/
obj-$(CONFIG_ARCH_DAVINCI) += davinci/
+obj-$(CONFIG_ARCH_ESWIN) += eswin/
obj-$(CONFIG_ARCH_HISI) += hisilicon/
obj-y += imgtec/
obj-y += imx/
diff --git a/drivers/clk/eswin/Kconfig b/drivers/clk/eswin/Kconfig
new file mode 100644
index 000000000000..86af60f852c2
--- /dev/null
+++ b/drivers/clk/eswin/Kconfig
@@ -0,0 +1,15 @@
+# SPDX-License-Identifier: GPL-2.0
+
+config COMMON_CLK_ESWIN
+ bool
+
+config COMMON_CLK_EIC7700
+ tristate "EIC7700 Clock Driver"
+ depends on ARCH_ESWIN || COMPILE_TEST
+ select COMMON_CLK_ESWIN
+ default ARCH_ESWIN
+ help
+ This driver provides support for clock controller on ESWIN EIC7700
+ SoC. The clock controller can generates and supplies clock to various
+ peripherals within the SoC.
+ Say yes here to support the clock controller on the EIC7700 SoC.
diff --git a/drivers/clk/eswin/Makefile b/drivers/clk/eswin/Makefile
new file mode 100644
index 000000000000..4a7c2af82164
--- /dev/null
+++ b/drivers/clk/eswin/Makefile
@@ -0,0 +1,8 @@
+# SPDX-License-Identifier: GPL-2.0
+#
+# Eswin Clock specific Makefile
+#
+
+obj-$(CONFIG_COMMON_CLK_ESWIN) += clk.o
+
+obj-$(CONFIG_COMMON_CLK_EIC7700) += clk-eic7700.o
diff --git a/drivers/clk/eswin/clk-eic7700.c b/drivers/clk/eswin/clk-eic7700.c
new file mode 100644
index 000000000000..0693a4ae8510
--- /dev/null
+++ b/drivers/clk/eswin/clk-eic7700.c
@@ -0,0 +1,1110 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright 2025, Beijing ESWIN Computing Technology Co., Ltd..
+ * All rights reserved.
+ *
+ * ESWIN EIC7700 Clk Provider Driver
+ *
+ * Authors:
+ * Yifeng Huang <huangyifeng@eswincomputing.com>
+ * Xuyang Dong <dongxuyang@eswincomputing.com>
+ */
+
+#include <linux/clk.h>
+#include <linux/clk-provider.h>
+#include <linux/kernel.h>
+
+#include <dt-bindings/clock/eswin,eic7700-clock.h>
+
+#include "clk.h"
+#include "clk-eic7700.h"
+
+#define EIC7700_NR_CLKS (EIC7700_CLK_GATE_NOC_WDREF + 1)
+
+/* clock parent list */
+PNAME(mux_cpu_root_3mux1_gfree_p) = { "clk_pll_cpu",
+ "fixed_factor_u84_core_lp_div2",
+ "xtal24m" };
+PNAME(mux_cpu_aclk_2mux1_gfree_p) = { "fixed_factor_cpu_div2",
+ "mux_cpu_root_3mux1_gfree" };
+PNAME(dsp_aclk_root_2mux1_gfree_mux_p) = { "fixed_rate_clk_spll2_fout1",
+ "fixed_rate_clk_spll0_fout1" };
+PNAME(d2d_aclk_root_2mux1_gfree_mux_p) = { "fixed_rate_clk_spll2_fout1",
+ "fixed_rate_clk_spll0_fout1" };
+PNAME(ddr_aclk_root_2mux1_gfree_mux_p) = { "fixed_rate_clk_spll2_fout1",
+ "fixed_rate_clk_spll0_fout1" };
+PNAME(mshcore_root_3mux1_0_mux_p) = { "fixed_rate_clk_spll0_fout3",
+ "fixed_rate_clk_spll2_fout3" };
+PNAME(mshcore_root_3mux1_1_mux_p) = { "fixed_rate_clk_spll0_fout3",
+ "fixed_rate_clk_spll2_fout3" };
+PNAME(mshcore_root_3mux1_2_mux_p) = { "fixed_rate_clk_spll0_fout3",
+ "fixed_rate_clk_spll2_fout3" };
+PNAME(npu_llclk_3mux1_gfree_mux_p) = { "divider_npu_llc_src0_div_dynm",
+ "divider_npu_llc_src1_div_dynm",
+ "fixed_rate_clk_vpll_fout1" };
+PNAME(npu_core_3mux1_gfree_mux_p) = { "fixed_rate_clk_spll1_fout1",
+ "fixed_rate_clk_vpll_fout1",
+ "fixed_rate_clk_spll2_fout2" };
+PNAME(npu_e31_3mux1_gfree_mux_p) = { "fixed_rate_clk_spll1_fout1",
+ "fixed_rate_clk_vpll_fout1",
+ "fixed_rate_clk_spll2_fout2" };
+PNAME(vi_aclk_root_2mux1_gfree_mux_p) = { "fixed_rate_clk_spll0_fout1",
+ "fixed_rate_clk_spll2_fout1" };
+PNAME(mux_vi_dw_root_2mux1_p) = { "fixed_rate_clk_vpll_fout1",
+ "fixed_rate_clk_spll0_fout1" };
+PNAME(mux_vi_dvp_root_2mux1_gfree_p) = { "fixed_rate_clk_vpll_fout1",
+ "fixed_rate_clk_spll0_fout1" };
+PNAME(mux_vi_dig_isp_root_2mux1_gfree_p) = { "fixed_rate_clk_vpll_fout1",
+ "fixed_rate_clk_spll0_fout1" };
+PNAME(mux_vo_aclk_root_2mux1_gfree_p) = { "fixed_rate_clk_spll0_fout1",
+ "fixed_rate_clk_spll2_fout1" };
+PNAME(mux_vo_pixel_root_2mux1_p) = { "fixed_rate_clk_vpll_fout1",
+ "fixed_rate_clk_spll2_fout2" };
+PNAME(mux_vcdec_root_2mux1_gfree_p) = { "fixed_rate_clk_spll0_fout1",
+ "fixed_rate_clk_spll2_fout1" };
+PNAME(mux_vcaclk_root_2mux1_gfree_p) = { "fixed_rate_clk_spll0_fout1",
+ "fixed_rate_clk_spll2_fout1" };
+PNAME(mux_syscfg_clk_root_2mux1_gfree_p) = { "divider_sys_cfg_div_dynm",
+ "xtal24m" };
+PNAME(mux_bootspi_clk_2mux1_gfree_p) = { "divider_bootspi_div_dynm",
+ "xtal24m" };
+PNAME(mux_scpu_core_clk_2mux1_gfree_p) = { "divider_scpu_core_div_dynm",
+ "xtal24m" };
+PNAME(mux_lpcpu_core_clk_2mux1_gfree_p) = { "divider_lpcpu_core_div_dynm",
+ "xtal24m" };
+PNAME(mux_vo_mclk_2mux_ext_mclk_p) = { "divider_vo_mclk_div_dynm",
+ "fixed_rate_ext_mclk" };
+PNAME(mux_aondma_axi2mux1_gfree_p) = { "divider_aondma_axi_div_dynm",
+ "xtal24m" };
+PNAME(mux_rmii_ref_2mux1_p) = { "fixed_factor_hsp_rmii_ref_div6",
+ "fixed_rate_lpddr_ref_bak" };
+PNAME(mux_eth_core_2mux1_p) = { "fixed_rate_clk_spll1_fout3",
+ "fixed_rate_lpddr_ref_bak" };
+PNAME(mux_sata_phy_2mux1_p) = { "divider_sata_phy_ref_div_dynm",
+ "fixed_rate_lpddr_ref_bak" };
+
+/* fixed rate clocks */
+static struct eswin_fixed_rate_clock eic7700_fixed_rate_clks[] = {
+ EIC7700_FIXED(EIC7700_CLK_XTAL_32K, "fixed_rate_clk_xtal_32k", NULL, 0,
+ 32768),
+ EIC7700_FIXED(EIC7700_CLK_SPLL0_FOUT1, "fixed_rate_clk_spll0_fout1",
+ NULL, 0, 1600000000),
+ EIC7700_FIXED(EIC7700_CLK_SPLL0_FOUT2, "fixed_rate_clk_spll0_fout2",
+ NULL, 0, 800000000),
+ EIC7700_FIXED(EIC7700_CLK_SPLL0_FOUT3, "fixed_rate_clk_spll0_fout3",
+ NULL, 0, 400000000),
+ EIC7700_FIXED(EIC7700_CLK_SPLL1_FOUT1, "fixed_rate_clk_spll1_fout1",
+ NULL, 0, 1500000000),
+ EIC7700_FIXED(EIC7700_CLK_SPLL1_FOUT2, "fixed_rate_clk_spll1_fout2",
+ NULL, 0, 300000000),
+ EIC7700_FIXED(EIC7700_CLK_SPLL1_FOUT3, "fixed_rate_clk_spll1_fout3",
+ NULL, 0, 250000000),
+ EIC7700_FIXED(EIC7700_CLK_SPLL2_FOUT1, "fixed_rate_clk_spll2_fout1",
+ NULL, 0, 2080000000),
+ EIC7700_FIXED(EIC7700_CLK_SPLL2_FOUT2, "fixed_rate_clk_spll2_fout2",
+ NULL, 0, 1040000000),
+ EIC7700_FIXED(EIC7700_CLK_SPLL2_FOUT3, "fixed_rate_clk_spll2_fout3",
+ NULL, 0, 416000000),
+ EIC7700_FIXED(EIC7700_CLK_VPLL_FOUT1, "fixed_rate_clk_vpll_fout1",
+ NULL, 0, 1188000000),
+ EIC7700_FIXED(EIC7700_CLK_VPLL_FOUT2, "fixed_rate_clk_vpll_fout2",
+ NULL, 0, 594000000),
+ EIC7700_FIXED(EIC7700_CLK_VPLL_FOUT3, "fixed_rate_clk_vpll_fout3",
+ NULL, 0, 49500000),
+ EIC7700_FIXED(EIC7700_CLK_APLL_FOUT2, "fixed_rate_clk_apll_fout2",
+ NULL, 0, 0),
+ EIC7700_FIXED(EIC7700_CLK_APLL_FOUT3, "fixed_rate_clk_apll_fout3",
+ NULL, 0, 0),
+ EIC7700_FIXED(EIC7700_CLK_EXT_MCLK, "fixed_rate_ext_mclk", NULL, 0, 0),
+ EIC7700_FIXED(EIC7700_CLK_LPDDR_REF_BAK, "fixed_rate_lpddr_ref_bak",
+ NULL, 0, 50000000),
+};
+
+/* pll clocks */
+static struct eswin_pll_clock eic7700_pll_clks[] = {
+ EIC7700_PLL(EIC7700_CLK_APLL_FOUT1, "clk_apll_fout1", NULL,
+ EIC7700_REG_OFFSET_APLL_CFG_0, 0, 1, 12, 6, 20, 12,
+ EIC7700_REG_OFFSET_APLL_CFG_1, 4, 24,
+ EIC7700_REG_OFFSET_APLL_CFG_2, 1, 3, 16, 3,
+ EIC7700_REG_OFFSET_PLL_STATUS, 4, 1, APLL_HIGH_FREQ,
+ APLL_LOW_FREQ),
+ EIC7700_PLL(EIC7700_CLK_PLL_CPU, "clk_pll_cpu", NULL,
+ EIC7700_REG_OFFSET_MCPUT_PLL_CFG_0, 0, 1, 12, 6, 20, 12,
+ EIC7700_REG_OFFSET_MCPUT_PLL_CFG_1, 4, 24,
+ EIC7700_REG_OFFSET_MCPUT_PLL_CFG_2, 1, 3, 16, 3,
+ EIC7700_REG_OFFSET_PLL_STATUS, 5, 1, PLL_HIGH_FREQ,
+ PLL_LOW_FREQ),
+};
+
+/* fixed factor clocks */
+static struct eswin_fixed_factor_clock eic7700_fixed_factor_clks[] = {
+ EIC7700_FACTOR(EIC7700_CLK_FIXED_FACTOR_CPU_DIV2,
+ "fixed_factor_cpu_div2", "mux_cpu_root_3mux1_gfree", 1,
+ 2, 0),
+ EIC7700_FACTOR(EIC7700_CLK_FIXED_FACTOR_CLK_1M_DIV24,
+ "fixed_factor_clk_1m_div24", "xtal24m", 1, 24, 0),
+ EIC7700_FACTOR(EIC7700_CLK_FIXED_FACTOR_MIPI_TXESC_DIV10,
+ "fixed_factor_mipi_txesc_div10",
+ "mux_syscfg_clk_root_2mux1_gfree", 1, 10, 0),
+ EIC7700_FACTOR(EIC7700_CLK_FIXED_FACTOR_U84_CORE_LP_DIV2,
+ "fixed_factor_u84_core_lp_div2", "gate_clk_spll0_fout2",
+ 1, 2, 0),
+ EIC7700_FACTOR(EIC7700_CLK_FIXED_FACTOR_SCPU_BUS_DIV2,
+ "fixed_factor_scpu_bus_div2",
+ "mux_scpu_core_clk_2mux1_gfree", 1, 2, 0),
+ EIC7700_FACTOR(EIC7700_CLK_FIXED_FACTOR_LPCPU_BUS_DIV2,
+ "fixed_factor_lpcpu_bus_div2",
+ "mux_lpcpu_core_clk_2mux1_gfree", 1, 2, 0),
+ EIC7700_FACTOR(EIC7700_CLK_FIXED_FACTOR_PCIE_CR_DIV2,
+ "fixed_factor_pcie_cr_div2",
+ "mux_syscfg_clk_root_2mux1_gfree", 1, 2, 0),
+ EIC7700_FACTOR(EIC7700_CLK_FIXED_FACTOR_PCIE_AUX_DIV4,
+ "fixed_factor_pcie_aux_div4",
+ "mux_syscfg_clk_root_2mux1_gfree", 1, 4, 0),
+ EIC7700_FACTOR(EIC7700_CLK_FIXED_FACTOR_PVT_DIV20,
+ "fixed_factor_pvt_div20", "xtal24m", 1, 20, 0),
+ EIC7700_FACTOR(EIC7700_CLK_FIXED_FACTOR_HSP_RMII_REF_DIV6,
+ "fixed_factor_hsp_rmii_ref_div6",
+ "fixed_rate_clk_spll1_fout2", 1, 6, 0),
+};
+
+/* mux clocks */
+static struct eswin_mux_clock eic7700_mux_clks[] = {
+ EIC7700_MUX(EIC7700_CLK_MUX_CPU_ROOT_3MUX1_GFREE,
+ "mux_cpu_root_3mux1_gfree", mux_cpu_root_3mux1_gfree_p,
+ ARRAY_SIZE(mux_cpu_root_3mux1_gfree_p),
+ CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_U84_CTRL, 0, 2, 0),
+ EIC7700_MUX(EIC7700_CLK_MUX_CPU_ACLK_2MUX1_GFREE,
+ "mux_cpu_aclk_2mux1_gfree", mux_cpu_aclk_2mux1_gfree_p,
+ ARRAY_SIZE(mux_cpu_aclk_2mux1_gfree_p),
+ CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_U84_CTRL, 20, 1, 0),
+ EIC7700_MUX(EIC7700_CLK_MUX_DSP_ACLK_ROOT_2MUX1_GFREE,
+ "mux_dsp_aclk_root_2mux1_gfree",
+ dsp_aclk_root_2mux1_gfree_mux_p,
+ ARRAY_SIZE(dsp_aclk_root_2mux1_gfree_mux_p),
+ CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_DSP_ACLK_CTRL, 0, 1,
+ 0),
+ EIC7700_MUX(EIC7700_CLK_MUX_D2D_ACLK_ROOT_2MUX1_GFREE,
+ "mux_d2d_aclk_root_2mux1_gfree",
+ d2d_aclk_root_2mux1_gfree_mux_p,
+ ARRAY_SIZE(d2d_aclk_root_2mux1_gfree_mux_p),
+ CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_D2D_ACLK_CTRL, 0,
+ 1, 0),
+ EIC7700_MUX(EIC7700_CLK_MUX_DDR_ACLK_ROOT_2MUX1_GFREE,
+ "mux_ddr_aclk_root_2mux1_gfree",
+ ddr_aclk_root_2mux1_gfree_mux_p,
+ ARRAY_SIZE(ddr_aclk_root_2mux1_gfree_mux_p),
+ CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_DDR_CTRL, 16, 1, 0),
+ EIC7700_MUX(EIC7700_CLK_MUX_MSHCORE_ROOT_3MUX1_0,
+ "mux_mshcore_root_3mux1_0", mshcore_root_3mux1_0_mux_p,
+ ARRAY_SIZE(mshcore_root_3mux1_0_mux_p), CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_MSHC0_CORE_CTRL, 0, 1, 0),
+ EIC7700_MUX(EIC7700_CLK_MUX_MSHCORE_ROOT_3MUX1_1,
+ "mux_mshcore_root_3mux1_1", mshcore_root_3mux1_1_mux_p,
+ ARRAY_SIZE(mshcore_root_3mux1_1_mux_p), CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_MSHC1_CORE_CTRL, 0, 1, 0),
+ EIC7700_MUX(EIC7700_CLK_MUX_MSHCORE_ROOT_3MUX1_2,
+ "mux_mshcore_root_3mux1_2", mshcore_root_3mux1_2_mux_p,
+ ARRAY_SIZE(mshcore_root_3mux1_2_mux_p), CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_MSHC2_CORE_CTRL, 0, 1, 0),
+ EIC7700_MUX(EIC7700_CLK_MUX_NPU_LLCLK_3MUX1_GFREE,
+ "mux_npu_llclk_3mux1_gfree", npu_llclk_3mux1_gfree_mux_p,
+ ARRAY_SIZE(npu_llclk_3mux1_gfree_mux_p),
+ CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_NPU_LLC_CTRL, 0, 2,
+ 0),
+ EIC7700_MUX(EIC7700_CLK_MUX_NPU_CORE_3MUX1_GFREE,
+ "mux_npu_core_3mux1_gfree", npu_core_3mux1_gfree_mux_p,
+ ARRAY_SIZE(npu_core_3mux1_gfree_mux_p), CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_NPU_CORE_CTRL, 0, 2, 0),
+ EIC7700_MUX(EIC7700_CLK_MUX_NPU_E31_3MUX1_GFREE,
+ "mux_npu_e31_3mux1_gfree", npu_e31_3mux1_gfree_mux_p,
+ ARRAY_SIZE(npu_e31_3mux1_gfree_mux_p), CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_NPU_CORE_CTRL, 8, 2, 0),
+ EIC7700_MUX(EIC7700_CLK_MUX_VI_ACLK_ROOT_2MUX1_GFREE,
+ "mux_vi_aclk_root_2mux1_gfree",
+ vi_aclk_root_2mux1_gfree_mux_p,
+ ARRAY_SIZE(vi_aclk_root_2mux1_gfree_mux_p),
+ CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_VI_ACLK_CTRL, 0, 1,
+ 0),
+ EIC7700_MUX(EIC7700_CLK_MUX_VI_DW_ROOT_2MUX1, "mux_vi_dw_root_2mux1",
+ mux_vi_dw_root_2mux1_p, ARRAY_SIZE(mux_vi_dw_root_2mux1_p),
+ CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_VI_DWCLK_CTRL, 0,
+ 1, 0),
+ EIC7700_MUX(EIC7700_CLK_MUX_VI_DVP_ROOT_2MUX1_GFREE,
+ "mux_vi_dvp_root_2mux1_gfree",
+ mux_vi_dvp_root_2mux1_gfree_p,
+ ARRAY_SIZE(mux_vi_dvp_root_2mux1_gfree_p),
+ CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_VI_DVP_CTRL, 0, 1,
+ 0),
+ EIC7700_MUX(EIC7700_CLK_MUX_VI_DIG_ISP_ROOT_2MUX1_GFREE,
+ "mux_vi_dig_isp_root_2mux1_gfree",
+ mux_vi_dig_isp_root_2mux1_gfree_p,
+ ARRAY_SIZE(mux_vi_dig_isp_root_2mux1_gfree_p),
+ CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_VI_DIG_ISP_CTRL, 0,
+ 1, 0),
+ EIC7700_MUX(EIC7700_CLK_MUX_VO_ACLK_ROOT_2MUX1_GFREE,
+ "mux_vo_aclk_root_2mux1_gfree",
+ mux_vo_aclk_root_2mux1_gfree_p,
+ ARRAY_SIZE(mux_vo_aclk_root_2mux1_gfree_p),
+ CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_VO_ACLK_CTRL, 0, 1,
+ 0),
+ EIC7700_MUX(EIC7700_CLK_MUX_VO_PIXEL_ROOT_2MUX1,
+ "mux_vo_pixel_root_2mux1", mux_vo_pixel_root_2mux1_p,
+ ARRAY_SIZE(mux_vo_pixel_root_2mux1_p), CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_VO_PIXEL_CTRL, 0, 1, 0),
+ EIC7700_MUX(EIC7700_CLK_MUX_VCDEC_ROOT_2MUX1_GFREE,
+ "mux_vcdec_root_2mux1_gfree", mux_vcdec_root_2mux1_gfree_p,
+ ARRAY_SIZE(mux_vcdec_root_2mux1_gfree_p),
+ CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_VCDEC_ROOT_CTRL, 0,
+ 1, 0),
+ EIC7700_MUX(EIC7700_CLK_MUX_VCACLK_ROOT_2MUX1_GFREE,
+ "mux_vcaclk_root_2mux1_gfree",
+ mux_vcaclk_root_2mux1_gfree_p,
+ ARRAY_SIZE(mux_vcaclk_root_2mux1_gfree_p),
+ CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_VC_ACLK_CTRL, 0, 1,
+ 0),
+ EIC7700_MUX(EIC7700_CLK_MUX_SYSCFG_CLK_ROOT_2MUX1_GFREE,
+ "mux_syscfg_clk_root_2mux1_gfree",
+ mux_syscfg_clk_root_2mux1_gfree_p,
+ ARRAY_SIZE(mux_syscfg_clk_root_2mux1_gfree_p),
+ CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_SYSCFG_CTRL, 0, 1,
+ 0),
+ EIC7700_MUX(EIC7700_CLK_MUX_BOOTSPI_CLK_2MUX1_GFREE,
+ "mux_bootspi_clk_2mux1_gfree",
+ mux_bootspi_clk_2mux1_gfree_p,
+ ARRAY_SIZE(mux_bootspi_clk_2mux1_gfree_p),
+ CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_BOOTSPI_CTRL, 0, 1,
+ 0),
+ EIC7700_MUX(EIC7700_CLK_MUX_SCPU_CORE_CLK_2MUX1_GFREE,
+ "mux_scpu_core_clk_2mux1_gfree",
+ mux_scpu_core_clk_2mux1_gfree_p,
+ ARRAY_SIZE(mux_scpu_core_clk_2mux1_gfree_p),
+ CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_SCPU_CORE_CTRL, 0,
+ 1, 0),
+ EIC7700_MUX(EIC7700_CLK_MUX_LPCPU_CORE_CLK_2MUX1_GFREE,
+ "mux_lpcpu_core_clk_2mux1_gfree",
+ mux_lpcpu_core_clk_2mux1_gfree_p,
+ ARRAY_SIZE(mux_lpcpu_core_clk_2mux1_gfree_p),
+ CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_LPCPU_CORE_CTRL, 0,
+ 1, 0),
+ EIC7700_MUX(EIC7700_CLK_MUX_VO_MCLK_2MUX_EXT_MCLK,
+ "mux_vo_mclk_2mux_ext_mclk", mux_vo_mclk_2mux_ext_mclk_p,
+ ARRAY_SIZE(mux_vo_mclk_2mux_ext_mclk_p),
+ CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_VO_MCLK_CTRL, 0, 1,
+ 0),
+ EIC7700_MUX(EIC7700_CLK_MUX_AONDMA_AXI2MUX1_GFREE,
+ "mux_aondma_axi2mux1_gfree", mux_aondma_axi2mux1_gfree_p,
+ ARRAY_SIZE(mux_aondma_axi2mux1_gfree_p),
+ CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_AON_DMA_CTRL, 20,
+ 1, 0),
+ EIC7700_MUX(EIC7700_CLK_MUX_RMII_REF_2MUX, "mux_rmii_ref_2mux1",
+ mux_rmii_ref_2mux1_p, ARRAY_SIZE(mux_rmii_ref_2mux1_p),
+ CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_ETH0_CTRL, 2, 1, 0),
+ EIC7700_MUX(EIC7700_CLK_MUX_ETH_CORE_2MUX1, "mux_eth_core_2mux1",
+ mux_eth_core_2mux1_p, ARRAY_SIZE(mux_eth_core_2mux1_p),
+ CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_ETH0_CTRL, 1, 1, 0),
+ EIC7700_MUX(EIC7700_CLK_MUX_SATA_PHY_2MUX1, "mux_sata_phy_2mux1",
+ mux_sata_phy_2mux1_p, ARRAY_SIZE(mux_sata_phy_2mux1_p),
+ CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_SATA_OOB_CTRL, 9,
+ 1, 0),
+};
+
+/* divider clocks */
+static struct eswin_divider_clock eic7700_div_clks[] = {
+ EIC7700_DIV(EIC7700_CLK_DIV_SYS_CFG_DYNM, "divider_sys_cfg_div_dynm",
+ "fixed_rate_clk_spll0_fout3", 0,
+ EIC7700_REG_OFFSET_SYSCFG_CTRL, 4, 3,
+ CLK_DIVIDER_ONE_BASED),
+ EIC7700_DIV(EIC7700_CLK_DIV_NOC_NSP_DYNM, "divider_noc_nsp_div_dynm",
+ "fixed_rate_clk_spll2_fout1", 0,
+ EIC7700_REG_OFFSET_NOC_CTRL, 0, 3, CLK_DIVIDER_ONE_BASED),
+ EIC7700_DIV(EIC7700_CLK_DIV_BOOTSPI_DYNM, "divider_bootspi_div_dynm",
+ "gate_clk_spll0_fout2", 0, EIC7700_REG_OFFSET_BOOTSPI_CTRL,
+ 4, 6, CLK_DIVIDER_ONE_BASED),
+ EIC7700_DIV(EIC7700_CLK_DIV_SCPU_CORE_DYNM,
+ "divider_scpu_core_div_dynm", "fixed_rate_clk_spll0_fout1",
+ 0, EIC7700_REG_OFFSET_SCPU_CORE_CTRL, 4, 4,
+ CLK_DIVIDER_ONE_BASED),
+ EIC7700_DIV(EIC7700_CLK_DIV_LPCPU_CORE_DYNM,
+ "divider_lpcpu_core_div_dynm", "fixed_rate_clk_spll0_fout1",
+ 0, EIC7700_REG_OFFSET_LPCPU_CORE_CTRL, 4, 4,
+ CLK_DIVIDER_ONE_BASED),
+ EIC7700_DIV(EIC7700_CLK_DIV_GPU_ACLK_DYNM, "divider_gpu_aclk_div_dynm",
+ "fixed_rate_clk_spll0_fout1", 0,
+ EIC7700_REG_OFFSET_GPU_ACLK_CTRL, 4, 4,
+ CLK_DIVIDER_ONE_BASED),
+ EIC7700_DIV(EIC7700_CLK_DIV_D2D_ACLK_DYNM, "divider_d2d_aclk_div_dynm",
+ "mux_d2d_aclk_root_2mux1_gfree", 0,
+ EIC7700_REG_OFFSET_D2D_ACLK_CTRL, 4, 4,
+ CLK_DIVIDER_ONE_BASED),
+ EIC7700_DIV(EIC7700_CLK_DIV_DSP_ACLK_DYNM, "divider_dsp_aclk_div_dynm",
+ "mux_d2d_aclk_root_2mux1_gfree", 0,
+ EIC7700_REG_OFFSET_D2D_ACLK_CTRL, 4, 4,
+ CLK_DIVIDER_ONE_BASED),
+ EIC7700_DIV(EIC7700_CLK_DIV_DDR_ACLK_DYNM, "divider_ddr_aclk_div_dynm",
+ "mux_ddr_aclk_root_2mux1_gfree", 0,
+ EIC7700_REG_OFFSET_DDR_CTRL, 20, 4, CLK_DIVIDER_ONE_BASED),
+ EIC7700_DIV(EIC7700_CLK_DIV_HSP_ACLK_DYNM, "divider_hsp_aclk_div_dynm",
+ "fixed_rate_clk_spll0_fout1", 0,
+ EIC7700_REG_OFFSET_HSP_ACLK_CTRL, 4, 4,
+ CLK_DIVIDER_ONE_BASED),
+ EIC7700_DIV(EIC7700_CLK_DIV_ETH_TXCLK_DYNM_0,
+ "divider_eth_txclk_div_dynm_0", "mux_eth_core_2mux1", 0,
+ EIC7700_REG_OFFSET_ETH0_CTRL, 4, 7, CLK_DIVIDER_ONE_BASED),
+ EIC7700_DIV(EIC7700_CLK_DIV_ETH_TXCLK_DYNM_1,
+ "divider_eth_txclk_div_dynm_1", "mux_eth_core_2mux1", 0,
+ EIC7700_REG_OFFSET_ETH1_CTRL, 4, 7, CLK_DIVIDER_ONE_BASED),
+ EIC7700_DIV(EIC7700_CLK_DIV_MSHC_CORE_DYNM_0,
+ "divider_mshc_core_div_dynm_0", "mux_mshcore_root_3mux1_0",
+ 0, EIC7700_REG_OFFSET_MSHC0_CORE_CTRL, 4, 12,
+ CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ROUND_CLOSEST),
+ EIC7700_DIV(EIC7700_CLK_DIV_MSHC_CORE_DYNM_1,
+ "divider_mshc_core_div_dynm_1", "mux_mshcore_root_3mux1_1",
+ 0, EIC7700_REG_OFFSET_MSHC1_CORE_CTRL, 4, 12,
+ CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ROUND_CLOSEST),
+ EIC7700_DIV(EIC7700_CLK_DIV_MSHC_CORE_DYNM_2,
+ "divider_mshc_core_div_dynm_2", "mux_mshcore_root_3mux1_2",
+ 0, EIC7700_REG_OFFSET_MSHC2_CORE_CTRL, 4, 12,
+ CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ROUND_CLOSEST),
+ EIC7700_DIV(EIC7700_CLK_DIV_PCIE_ACLK_DYNM,
+ "divider_pcie_aclk_div_dynm", "fixed_rate_clk_spll2_fout2",
+ 0, EIC7700_REG_OFFSET_PCIE_ACLK_CTRL, 4, 4,
+ CLK_DIVIDER_ONE_BASED),
+ EIC7700_DIV(EIC7700_CLK_DIV_NPU_ACLK_DYNM, "divider_npu_aclk_div_dynm",
+ "fixed_rate_clk_spll0_fout1", 0,
+ EIC7700_REG_OFFSET_NPU_ACLK_CTRL, 4, 4,
+ CLK_DIVIDER_ONE_BASED),
+ EIC7700_DIV(EIC7700_CLK_DIV_NPU_LLC_SRC0_DYNM,
+ "divider_npu_llc_src0_div_dynm",
+ "fixed_rate_clk_spll0_fout1", 0,
+ EIC7700_REG_OFFSET_NPU_LLC_CTRL, 4, 4,
+ CLK_DIVIDER_ONE_BASED),
+ EIC7700_DIV(EIC7700_CLK_DIV_NPU_LLC_SRC1_DYNM,
+ "divider_npu_llc_src1_div_dynm",
+ "fixed_rate_clk_spll2_fout1", 0,
+ EIC7700_REG_OFFSET_NPU_LLC_CTRL, 8, 4,
+ CLK_DIVIDER_ONE_BASED),
+ EIC7700_DIV(EIC7700_CLK_DIV_NPU_CORECLK_DYNM,
+ "divider_npu_coreclk_div_dynm", "mux_npu_core_3mux1_gfree",
+ 0, EIC7700_REG_OFFSET_NPU_CORE_CTRL, 4, 4,
+ CLK_DIVIDER_ONE_BASED),
+ EIC7700_DIV(EIC7700_CLK_DIV_NPU_E31_DYNM, "divider_npu_e31_div_dynm",
+ "mux_npu_e31_3mux1_gfree", 0,
+ EIC7700_REG_OFFSET_NPU_CORE_CTRL, 12, 4,
+ CLK_DIVIDER_ONE_BASED),
+ EIC7700_DIV(EIC7700_CLK_DIV_VI_ACLK_DYNM, "divider_vi_aclk_div_dynm",
+ "mux_vi_aclk_root_2mux1_gfree", 0,
+ EIC7700_REG_OFFSET_VI_ACLK_CTRL, 4, 4,
+ CLK_DIVIDER_ONE_BASED),
+ EIC7700_DIV(EIC7700_CLK_DIV_VI_DW_DYNM, "divider_vi_dw_div_dynm",
+ "mux_vi_dw_root_2mux1", 0,
+ EIC7700_REG_OFFSET_VI_DWCLK_CTRL, 4, 4,
+ CLK_DIVIDER_ONE_BASED),
+ EIC7700_DIV(EIC7700_CLK_DIV_VI_DVP_DYNM, "divider_vi_dvp_div_dynm",
+ "mux_vi_dvp_root_2mux1_gfree", 0,
+ EIC7700_REG_OFFSET_VI_DVP_CTRL, 4, 4,
+ CLK_DIVIDER_ONE_BASED),
+ EIC7700_DIV(EIC7700_CLK_DIV_VI_DIG_ISP_DYNM,
+ "divider_vi_dig_isp_div_dynm",
+ "mux_vi_dig_isp_root_2mux1_gfree", 0,
+ EIC7700_REG_OFFSET_VI_DIG_ISP_CTRL, 4, 4,
+ CLK_DIVIDER_ONE_BASED),
+ EIC7700_DIV(EIC7700_CLK_DIV_VI_SHUTTER_DYNM_0,
+ "divider_vi_shutter_div_dynm_0",
+ "fixed_rate_clk_vpll_fout2", 0,
+ EIC7700_REG_OFFSET_VI_SHUTTER0, 4, 7,
+ CLK_DIVIDER_ONE_BASED),
+ EIC7700_DIV(EIC7700_CLK_DIV_VI_SHUTTER_DYNM_1,
+ "divider_vi_shutter_div_dynm_1",
+ "fixed_rate_clk_vpll_fout2", 0,
+ EIC7700_REG_OFFSET_VI_SHUTTER1, 4, 7,
+ CLK_DIVIDER_ONE_BASED),
+ EIC7700_DIV(EIC7700_CLK_DIV_VI_SHUTTER_DYNM_2,
+ "divider_vi_shutter_div_dynm_2",
+ "fixed_rate_clk_vpll_fout2", 0,
+ EIC7700_REG_OFFSET_VI_SHUTTER2, 4, 7,
+ CLK_DIVIDER_ONE_BASED),
+ EIC7700_DIV(EIC7700_CLK_DIV_VI_SHUTTER_DYNM_3,
+ "divider_vi_shutter_div_dynm_3",
+ "fixed_rate_clk_vpll_fout2", 0,
+ EIC7700_REG_OFFSET_VI_SHUTTER3, 4, 7,
+ CLK_DIVIDER_ONE_BASED),
+ EIC7700_DIV(EIC7700_CLK_DIV_VI_SHUTTER_DYNM_4,
+ "divider_vi_shutter_div_dynm_4",
+ "fixed_rate_clk_vpll_fout2", 0,
+ EIC7700_REG_OFFSET_VI_SHUTTER4, 4, 7,
+ CLK_DIVIDER_ONE_BASED),
+ EIC7700_DIV(EIC7700_CLK_DIV_VI_SHUTTER_DYNM_5,
+ "divider_vi_shutter_div_dynm_5",
+ "fixed_rate_clk_vpll_fout2", 0,
+ EIC7700_REG_OFFSET_VI_SHUTTER5, 4, 7,
+ CLK_DIVIDER_ONE_BASED),
+ EIC7700_DIV(EIC7700_CLK_DIV_VO_ACLK_DYNM, "divider_vo_aclk_div_dynm",
+ "mux_vo_aclk_root_2mux1_gfree", 0,
+ EIC7700_REG_OFFSET_VO_ACLK_CTRL, 4, 4,
+ CLK_DIVIDER_ONE_BASED),
+ EIC7700_DIV(EIC7700_CLK_DIV_IESMCLK_DYNM, "divider_iesmclk_div_dynm",
+ "fixed_rate_clk_spll0_fout3", 0,
+ EIC7700_REG_OFFSET_VO_IESMCLK_CTRL, 4, 4,
+ CLK_DIVIDER_ONE_BASED),
+ EIC7700_DIV(EIC7700_CLK_DIV_VO_PIXEL_DYNM, "divider_vo_pixel_div_dynm",
+ "mux_vo_pixel_root_2mux1", 0,
+ EIC7700_REG_OFFSET_VO_PIXEL_CTRL, 4, 6,
+ CLK_DIVIDER_ONE_BASED),
+ EIC7700_DIV(EIC7700_CLK_DIV_VO_MCLK_DYNM, "divider_vo_mclk_div_dynm",
+ "clk_apll_fout1", 0, EIC7700_REG_OFFSET_VO_MCLK_CTRL, 4, 8,
+ CLK_DIVIDER_ONE_BASED),
+ EIC7700_DIV(EIC7700_CLK_DIV_VO_CEC_DYNM, "divider_vo_cec_div_dynm",
+ "fixed_rate_clk_vpll_fout2", 0,
+ EIC7700_REG_OFFSET_VO_PHY_CLKCTRL, 16, 16,
+ CLK_DIVIDER_ROUND_CLOSEST),
+ EIC7700_DIV(EIC7700_CLK_DIV_VC_ACLK_DYNM, "divider_vc_aclk_div_dynm",
+ "mux_vcaclk_root_2mux1_gfree", 0,
+ EIC7700_REG_OFFSET_VC_ACLK_CTRL, 4, 4,
+ CLK_DIVIDER_ONE_BASED),
+ EIC7700_DIV(EIC7700_CLK_DIV_JD_DYNM, "divider_jd_div_dynm",
+ "mux_vcdec_root_2mux1_gfree", 0, EIC7700_REG_OFFSET_JD_CTRL,
+ 4, 4, CLK_DIVIDER_ONE_BASED),
+ EIC7700_DIV(EIC7700_CLK_DIV_JE_DYNM, "divider_je_div_dynm",
+ "mux_vcdec_root_2mux1_gfree", 0, EIC7700_REG_OFFSET_JE_CTRL,
+ 4, 4, CLK_DIVIDER_ONE_BASED),
+ EIC7700_DIV(EIC7700_CLK_DIV_VE_DYNM, "divider_ve_div_dynm",
+ "mux_vcdec_root_2mux1_gfree", 0, EIC7700_REG_OFFSET_VE_CTRL,
+ 4, 4, CLK_DIVIDER_ONE_BASED),
+ EIC7700_DIV(EIC7700_CLK_DIV_VD_DYNM, "divider_vd_div_dynm",
+ "mux_vcdec_root_2mux1_gfree", 0, EIC7700_REG_OFFSET_VD_CTRL,
+ 4, 4, CLK_DIVIDER_ONE_BASED),
+ EIC7700_DIV(EIC7700_CLK_DIV_G2D_DYNM, "divider_g2d_div_dynm",
+ "mux_dsp_aclk_root_2mux1_gfree", 0,
+ EIC7700_REG_OFFSET_G2D_CTRL, 4, 4, CLK_DIVIDER_ONE_BASED),
+ EIC7700_DIV(EIC7700_CLK_DIV_AONDMA_AXI_DYNM,
+ "divider_aondma_axi_div_dynm", "fixed_rate_clk_spll0_fout1",
+ 0, EIC7700_REG_OFFSET_AON_DMA_CTRL, 4, 4,
+ CLK_DIVIDER_ONE_BASED),
+ EIC7700_DIV(EIC7700_CLK_DIV_CRYPTO_DYNM, "divider_crypto_div_dynm",
+ "fixed_rate_clk_spll0_fout1", 0,
+ EIC7700_REG_OFFSET_SPACC_CTRL, 4, 4, CLK_DIVIDER_ONE_BASED),
+ EIC7700_DIV(EIC7700_CLK_DIV_SATA_PHY_REF_DYNM,
+ "divider_sata_phy_ref_div_dynm",
+ "fixed_rate_clk_spll1_fout2", 0,
+ EIC7700_REG_OFFSET_SATA_OOB_CTRL, 0, 4,
+ CLK_DIVIDER_ONE_BASED),
+ EIC7700_DIV(EIC7700_CLK_DIV_DSP_0_ACLK_DYNM,
+ "divider_dsp_0_aclk_div_dynm", "gate_dspt_aclk", 0,
+ EIC7700_REG_OFFSET_DSP_CFG_CTRL, 19, 1, 0),
+ EIC7700_DIV(EIC7700_CLK_DIV_DSP_1_ACLK_DYNM,
+ "divider_dsp_1_aclk_div_dynm", "gate_dspt_aclk", 0,
+ EIC7700_REG_OFFSET_DSP_CFG_CTRL, 20, 1, 0),
+ EIC7700_DIV(EIC7700_CLK_DIV_DSP_2_ACLK_DYNM,
+ "divider_dsp_2_aclk_div_dynm", "gate_dspt_aclk", 0,
+ EIC7700_REG_OFFSET_DSP_CFG_CTRL, 21, 1, 0),
+ EIC7700_DIV(EIC7700_CLK_DIV_DSP_3_ACLK_DYNM,
+ "divider_dsp_3_aclk_div_dynm", "gate_dspt_aclk", 0,
+ EIC7700_REG_OFFSET_DSP_CFG_CTRL, 22, 1, 0),
+ EIC7700_DIV(EIC7700_CLK_DIV_AON_RTC_DYNM, "divider_aon_rtc_div_dynm",
+ "fixed_factor_clk_1m_div24", 0, EIC7700_REG_OFFSET_RTC_CTRL,
+ 21, 11, CLK_DIVIDER_ONE_BASED),
+ EIC7700_DIV(EIC7700_CLK_DIV_U84_RTC_TOGGLE_DYNM,
+ "divider_u84_rtc_toggle_dynm", "xtal24m", 0,
+ EIC7700_REG_OFFSET_RTC_CTRL, 16, 5,
+ CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ROUND_CLOSEST),
+ EIC7700_DIV(EIC7700_CLK_DIV_NOC_WDREF_DYNM, "divider_noc_wdref_dynm",
+ "xtal24m", 0, EIC7700_REG_OFFSET_NOC_CTRL, 4, 16,
+ CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ROUND_CLOSEST),
+};
+
+/* gate clocks */
+static struct eswin_gate_clock eic7700_gate_clks[] = {
+ EIC7700_GATE(EIC7700_CLK_GATE_CPU_EXT_SRC_CORE_CLK_0,
+ "gate_clk_cpu_ext_src_core_clk_0",
+ "mux_cpu_root_3mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_U84_CTRL, 28, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_CPU_EXT_SRC_CORE_CLK_1,
+ "gate_clk_cpu_ext_src_core_clk_1",
+ "mux_cpu_root_3mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_U84_CTRL, 29, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_CPU_EXT_SRC_CORE_CLK_2,
+ "gate_clk_cpu_ext_src_core_clk_2",
+ "mux_cpu_root_3mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_U84_CTRL, 30, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_CPU_EXT_SRC_CORE_CLK_3,
+ "gate_clk_cpu_ext_src_core_clk_3",
+ "mux_cpu_root_3mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_U84_CTRL, 31, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_CPU_TRACE_CLK_0,
+ "gate_clk_cpu_trace_clk_0", "mux_cpu_root_3mux1_gfree",
+ CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_U84_CTRL, 24, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_CPU_TRACE_CLK_1,
+ "gate_clk_cpu_trace_clk_1", "mux_cpu_root_3mux1_gfree",
+ CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_U84_CTRL, 25, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_CPU_TRACE_CLK_2,
+ "gate_clk_cpu_trace_clk_2", "mux_cpu_root_3mux1_gfree",
+ CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_U84_CTRL, 26, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_CPU_TRACE_CLK_3,
+ "gate_clk_cpu_trace_clk_3", "mux_cpu_root_3mux1_gfree",
+ CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_U84_CTRL, 27, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_CPU_TRACE_COM_CLK,
+ "gate_clk_cpu_trace_com_clk", "mux_cpu_aclk_2mux1_gfree",
+ CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_U84_CTRL, 23, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_SPLL0_FOUT2, "gate_clk_spll0_fout2",
+ "fixed_rate_clk_spll0_fout2", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_SPLL0_CFG_2, 31, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_NOC_NSP_CLK, "gate_noc_nsp_clk",
+ "divider_noc_nsp_div_dynm", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_NOC_CTRL, 31, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_BOOTSPI, "gate_clk_bootspi",
+ "mux_bootspi_clk_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_BOOTSPI_CTRL, 31, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_BOOTSPI_CFG, "gate_clk_bootspi_cfg",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_BOOTSPI_CFGCLK_CTRL, 31, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_SCPU_CORE, "gate_clk_scpu_core",
+ "mux_scpu_core_clk_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_SCPU_CORE_CTRL, 31, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_SCPU_BUS, "gate_clk_scpu_bus",
+ "fixed_factor_scpu_bus_div2", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_SCPU_BUSCLK_CTRL, 31, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_LPCPU_CORE, "gate_clk_lpcpu_core",
+ "mux_lpcpu_core_clk_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_LPCPU_CORE_CTRL, 31, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_LPCPU_BUS, "gate_clk_lpcpu_bus",
+ "fixed_factor_lpcpu_bus_div2", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_LPCPU_BUSCLK_CTRL, 31, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_GPU_ACLK, "gate_gpu_aclk",
+ "divider_gpu_aclk_div_dynm", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_GPU_ACLK_CTRL, 31, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_GPU_GRAY_CLK, "gate_gpu_gray_clk",
+ "xtal24m", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_GPU_GRAY_CTRL, 31, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_GPU_CFG_CLK, "gate_gpu_cfg_clk",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_GPU_CFG_CTRL, 31, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_DSPT_ACLK, "gate_dspt_aclk",
+ "divider_dsp_aclk_div_dynm", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_DSP_ACLK_CTRL, 31, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_DSPT_CFG_CLK, "gate_dspt_cfg_clk",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_DSP_CFG_CTRL, 31, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_D2D_ACLK, "gate_d2d_aclk",
+ "divider_d2d_aclk_div_dynm", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_D2D_ACLK_CTRL, 31, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_D2D_CFG_CLK, "gate_d2d_cfg_clk",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_D2D_CFG_CTRL, 31, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_TCU_ACLK, "gate_tcu_aclk",
+ "divider_ddr_aclk_div_dynm", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_TCU_ACLK_CTRL, 31, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_TCU_CFG_CLK, "gate_tcu_cfg_clk",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_TCU_CFG_CTRL, 31, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_DDRT_CFG_CLK, "gate_ddrt_cfg_clk",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_DDR_CTRL, 9, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_DDRT0_P0_ACLK, "gate_ddrt0_p0_aclk",
+ "divider_ddr_aclk_div_dynm", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_DDR_CTRL, 4, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_DDRT0_P1_ACLK, "gate_ddrt0_p1_aclk",
+ "divider_ddr_aclk_div_dynm", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_DDR_CTRL, 5, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_DDRT0_P2_ACLK, "gate_ddrt0_p2_aclk",
+ "divider_ddr_aclk_div_dynm", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_DDR_CTRL, 6, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_DDRT0_P3_ACLK, "gate_ddrt0_p3_aclk",
+ "divider_ddr_aclk_div_dynm", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_DDR_CTRL, 7, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_DDRT0_P4_ACLK, "gate_ddrt0_p4_aclk",
+ "divider_ddr_aclk_div_dynm", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_DDR_CTRL, 8, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_DDRT1_P0_ACLK, "gate_ddrt1_p0_aclk",
+ "divider_ddr_aclk_div_dynm", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_DDR1_CTRL, 4, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_DDRT1_P1_ACLK, "gate_ddrt1_p1_aclk",
+ "divider_ddr_aclk_div_dynm", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_DDR1_CTRL, 5, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_DDRT1_P2_ACLK, "gate_ddrt1_p2_aclk",
+ "divider_ddr_aclk_div_dynm", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_DDR1_CTRL, 6, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_DDRT1_P3_ACLK, "gate_ddrt1_p3_aclk",
+ "divider_ddr_aclk_div_dynm", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_DDR1_CTRL, 7, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_DDRT1_P4_ACLK, "gate_ddrt1_p4_aclk",
+ "divider_ddr_aclk_div_dynm", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_DDR1_CTRL, 8, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_HSP_ACLK, "gate_clk_hsp_aclk",
+ "divider_hsp_aclk_div_dynm", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_HSP_ACLK_CTRL, 31, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_HSP_CFG_CLK, "gate_clk_hsp_cfg_clk",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_HSP_CFG_CTRL, 31, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_PCIET_ACLK, "gate_pciet_aclk",
+ "divider_pcie_aclk_div_dynm", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_PCIE_ACLK_CTRL, 31, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_PCIET_CFG_CLK, "gate_pciet_cfg_clk",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_PCIE_CFG_CTRL, 31, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_PCIET_CR_CLK, "gate_pciet_cr_clk",
+ "fixed_factor_pcie_cr_div2", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_PCIE_CFG_CTRL, 0, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_PCIET_AUX_CLK, "gate_pciet_aux_clk",
+ "fixed_factor_pcie_aux_div4", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_PCIE_CFG_CTRL, 1, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_NPU_ACLK, "gate_npu_aclk",
+ "divider_npu_aclk_div_dynm", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_NPU_ACLK_CTRL, 31, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_NPU_CFG_CLK, "gate_npu_cfg_clk",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_NPU_ACLK_CTRL, 30, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_NPU_LLC_ACLK, "gate_npu_llc_aclk",
+ "mux_npu_llclk_3mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_NPU_LLC_CTRL, 31, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_NPU_CLK, "gate_npu_clk",
+ "divider_npu_coreclk_div_dynm", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_NPU_CORE_CTRL, 31, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_NPU_E31_CLK, "gate_npu_e31_clk",
+ "divider_npu_e31_div_dynm", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_NPU_CORE_CTRL, 30, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_VI_ACLK, "gate_vi_aclk",
+ "divider_vi_aclk_div_dynm", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_VI_ACLK_CTRL, 31, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_VI_CFG_CLK, "gate_vi_cfg_clk",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_VI_ACLK_CTRL, 30, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_VI_DIG_DW_CLK, "gate_vi_dig_dw_clk",
+ "divider_vi_dw_div_dynm", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_VI_DWCLK_CTRL, 31, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_VI_DVP_CLK, "gate_vi_dvp_clk",
+ "divider_vi_dvp_div_dynm", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_VI_DVP_CTRL, 31, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_VI_DIG_ISP_CLK, "gate_vi_dig_isp_clk",
+ "divider_vi_dig_isp_div_dynm", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_VI_DIG_ISP_CTRL, 31, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_VI_SHUTTER_0, "gate_vi_shutter_0",
+ "divider_vi_shutter_div_dynm_0", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_VI_SHUTTER0, 31, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_VI_SHUTTER_1, "gate_vi_shutter_1",
+ "divider_vi_shutter_div_dynm_1", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_VI_SHUTTER1, 31, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_VI_SHUTTER_2, "gate_vi_shutter_2",
+ "divider_vi_shutter_div_dynm_2", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_VI_SHUTTER2, 31, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_VI_SHUTTER_3, "gate_vi_shutter_3",
+ "divider_vi_shutter_div_dynm_3", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_VI_SHUTTER3, 31, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_VI_SHUTTER_4, "gate_vi_shutter_4",
+ "divider_vi_shutter_div_dynm_4", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_VI_SHUTTER4, 31, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_VI_SHUTTER_5, "gate_vi_shutter_5",
+ "divider_vi_shutter_div_dynm_5", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_VI_SHUTTER5, 31, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_VI_PHY_TXCLKESC, "gate_vi_phy_txclkesc",
+ "fixed_factor_mipi_txesc_div10", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_VI_PHY_CTRL, 0, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_VI_PHY_CFG, "gate_vi_phy_cfg", "xtal24m",
+ CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_VI_PHY_CTRL, 1, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_VO_ACLK, "gate_vo_aclk",
+ "divider_vo_aclk_div_dynm", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_VO_ACLK_CTRL, 31, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_VO_CFG_CLK, "gate_vo_cfg_clk",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_VO_ACLK_CTRL, 30, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_VO_HDMI_IESMCLK, "gate_vo_hdmi_iesmclk",
+ "divider_iesmclk_div_dynm", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_VO_IESMCLK_CTRL, 31, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_VO_PIXEL_CLK, "gate_vo_pixel_clk",
+ "divider_vo_pixel_div_dynm", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_VO_PIXEL_CTRL, 31, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_VO_I2S_MCLK, "gate_vo_i2s_mclk",
+ "mux_vo_mclk_2mux_ext_mclk", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_VO_MCLK_CTRL, 31, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_VO_CR_CLK, "gate_vo_cr_clk",
+ "fixed_factor_mipi_txesc_div10", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_VO_PHY_CLKCTRL, 1, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_VC_ACLK, "gate_vc_aclk",
+ "divider_vc_aclk_div_dynm", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_VC_ACLK_CTRL, 31, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_VC_CFG_CLK, "gate_vc_cfg_clk",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_VC_CLKEN_CTRL, 0, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_VC_JE_CLK, "gate_vc_je_clk",
+ "divider_je_div_dynm", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_JE_CTRL, 31, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_VC_JD_CLK, "gate_vc_jd_clk",
+ "divider_jd_div_dynm", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_JD_CTRL, 31, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_VC_VE_CLK, "gate_vc_ve_clk",
+ "divider_ve_div_dynm", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_VE_CTRL, 31, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_VC_VD_CLK, "gate_vc_vd_clk",
+ "divider_vd_div_dynm", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_VD_CTRL, 31, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_G2D_CFG_CLK, "gate_g2d_cfg_clk",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_G2D_CTRL, 28, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_G2D_CLK, "gate_g2d_clk",
+ "divider_g2d_div_dynm", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_G2D_CTRL, 30, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_G2D_ACLK, "gate_g2d_aclk",
+ "divider_g2d_div_dynm", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_G2D_CTRL, 31, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_AONDMA_CFG, "gate_clk_aondma_cfg",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_AON_DMA_CTRL, 30, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_AONDMA_ACLK, "gate_aondma_aclk",
+ "mux_aondma_axi2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_AON_DMA_CTRL, 31, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_AON_ACLK, "gate_aon_aclk",
+ "mux_aondma_axi2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_AON_DMA_CTRL, 29, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_TIMER_CLK_0, "gate_time_clk_0", "xtal24m",
+ CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_TIMER_CTRL, 0, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_TIMER_CLK_1, "gate_time_clk_1", "xtal24m",
+ CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_TIMER_CTRL, 1, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_TIMER_CLK_2, "gate_time_clk_2", "xtal24m",
+ CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_TIMER_CTRL, 2, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_TIMER_CLK_3, "gate_time_clk_3", "xtal24m",
+ CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_TIMER_CTRL, 3, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_TIMER_PCLK_0, "gate_timer_pclk_0",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_TIMER_CTRL, 4, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_TIMER_PCLK_1, "gate_timer_pclk_1",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_TIMER_CTRL, 5, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_TIMER_PCLK_2, "gate_timer_pclk_2",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_TIMER_CTRL, 6, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_TIMER_PCLK_3, "gate_timer_pclk_3",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_TIMER_CTRL, 7, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_TIMER3_CLK8, "gate_timer3_clk8",
+ "fixed_rate_clk_vpll_fout3", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_TIMER_CTRL, 8, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_RTC_CFG, "gate_clk_rtc_cfg",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_RTC_CTRL, 2, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_RTC, "gate_clk_rtc",
+ "divider_aon_rtc_div_dynm", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_RTC_CTRL, 1, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_PKA_CFG, "gate_clk_pka_cfg",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_PKA_CTRL, 31, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_SPACC_CFG, "gate_clk_spacc_cfg",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_SPACC_CTRL, 31, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_CRYPTO, "gate_clk_crypto",
+ "divider_crypto_div_dynm", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_SPACC_CTRL, 30, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_TRNG_CFG, "gate_clk_trng_cfg",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_TRNG_CTRL, 31, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_OTP_CFG, "gate_clk_otp_cfg",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_OTP_CTRL, 31, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_MAILBOX_0, "gate_clk_mailbox_0",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_LSP_EN1, 0, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_MAILBOX_1, "gate_clk_mailbox_1",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_LSP_EN1, 1, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_MAILBOX_2, "gate_clk_mailbox_2",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_LSP_EN1, 2, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_MAILBOX_3, "gate_clk_mailbox_3",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_LSP_EN1, 3, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_MAILBOX_4, "gate_clk_mailbox_4",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_LSP_EN1, 4, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_MAILBOX_5, "gate_clk_mailbox_5",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_LSP_EN1, 5, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_MAILBOX_6, "gate_clk_mailbox_6",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_LSP_EN1, 6, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_MAILBOX_7, "gate_clk_mailbox_7",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_LSP_EN1, 7, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_MAILBOX_8, "gate_clk_mailbox_8",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_LSP_EN1, 8, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_MAILBOX_9, "gate_clk_mailbox_9",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_LSP_EN1, 9, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_MAILBOX_10, "gate_clk_mailbox_10",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_LSP_EN1, 10, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_MAILBOX_11, "gate_clk_mailbox_11",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_LSP_EN1, 11, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_MAILBOX_12, "gate_clk_mailbox_12",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_LSP_EN1, 12, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_MAILBOX_13, "gate_clk_mailbox_13",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_LSP_EN1, 13, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_MAILBOX_14, "gate_clk_mailbox_14",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_LSP_EN1, 14, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_MAILBOX_15, "gate_clk_mailbox_15",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_LSP_EN1, 15, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_LSP_I2C0_PCLK, "gate_i2c0_pclk",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_LSP_EN0, 7, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_LSP_I2C1_PCLK, "gate_i2c1_pclk",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_LSP_EN0, 8, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_LSP_I2C2_PCLK, "gate_i2c2_pclk",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_LSP_EN0, 9, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_LSP_I2C3_PCLK, "gate_i2c3_pclk",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_LSP_EN0, 10, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_LSP_I2C4_PCLK, "gate_i2c4_pclk",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_LSP_EN0, 11, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_LSP_I2C5_PCLK, "gate_i2c5_pclk",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_LSP_EN0, 12, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_LSP_I2C6_PCLK, "gate_i2c6_pclk",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_LSP_EN0, 13, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_LSP_I2C7_PCLK, "gate_i2c7_pclk",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_LSP_EN0, 14, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_LSP_I2C8_PCLK, "gate_i2c8_pclk",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_LSP_EN0, 15, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_LSP_I2C9_PCLK, "gate_i2c9_pclk",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_LSP_EN0, 16, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_LSP_WDT0_PCLK, "gate_lsp_wdt0_pclk",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_LSP_EN0, 28, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_LSP_WDT1_PCLK, "gate_lsp_wdt1_pclk",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_LSP_EN0, 29, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_LSP_WDT2_PCLK, "gate_lsp_wdt2_pclk",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_LSP_EN0, 30, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_LSP_WDT3_PCLK, "gate_lsp_wdt3_pclk",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_LSP_EN0, 31, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_LSP_SSI0_PCLK, "gate_lsp_ssi0_pclk",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_LSP_EN0, 26, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_LSP_SSI1_PCLK, "gate_lsp_ssi1_pclk",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_LSP_EN0, 27, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_LSP_UART0_PCLK, "gate_lsp_uart0_pclk",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_LSP_EN0, 17, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_LSP_UART1_PCLK, "gate_lsp_uart1_pclk",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_LSP_EN0, 18, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_LSP_UART2_PCLK, "gate_lsp_uart2_pclk",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_LSP_EN0, 19, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_LSP_UART3_PCLK, "gate_lsp_uart3_pclk",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_LSP_EN0, 20, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_LSP_UART4_PCLK, "gate_lsp_uart4_pclk",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_LSP_EN0, 21, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_LSP_TIMER_PCLK, "gate_lsp_timer_pclk",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_LSP_EN0, 25, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_LSP_FAN_PCLK, "gate_lsp_fan_pclk",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_LSP_EN0, 0, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_LSP_PVT_PCLK, "gate_lsp_pvt_pclk",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_LSP_EN0, 1, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_LSP_PVT0_CLK, "gate_pvt0_clk",
+ "fixed_factor_pvt_div20", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_LSP_EN1, 16, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_LSP_PVT1_CLK, "gate_pvt1_clk",
+ "fixed_factor_pvt_div20", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_LSP_EN1, 17, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_VC_JE_PCLK, "gate_vc_je_pclk",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_VC_CLKEN_CTRL, 2, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_VC_JD_PCLK, "gate_vc_jd_pclk",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_VC_CLKEN_CTRL, 1, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_VC_VE_PCLK, "gate_vc_ve_pclk",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_VC_CLKEN_CTRL, 5, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_VC_VD_PCLK, "gate_vc_vd_pclk",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_VC_CLKEN_CTRL, 4, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_VC_MON_PCLK, "gate_vc_mon_pclk",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_VC_CLKEN_CTRL, 3, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_HSP_MSHC0_CORE_CLK,
+ "gate_hsp_mshc0_core_clk", "divider_mshc_core_div_dynm_0",
+ CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_MSHC0_CORE_CTRL,
+ 16, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_HSP_MSHC1_CORE_CLK,
+ "gate_hsp_mshc1_core_clk", "divider_mshc_core_div_dynm_1",
+ CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_MSHC1_CORE_CTRL,
+ 16, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_HSP_MSHC2_CORE_CLK,
+ "gate_hsp_mshc2_core_clk", "divider_mshc_core_div_dynm_2",
+ CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_MSHC2_CORE_CTRL,
+ 16, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_HSP_SATA_RBC_CLK, "gate_hsp_sata_rbc_clk",
+ "fixed_rate_clk_spll1_fout2", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_SATA_RBC_CTRL, 0, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_HSP_SATA_OOB_CLK, "gate_hsp_sata_oob_clk",
+ "mux_sata_phy_2mux1", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_SATA_OOB_CTRL, 31, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_HSP_DMA0_CLK_TEST,
+ "gate_hsp_dma0_clk_test", "gate_clk_hsp_aclk",
+ CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_HSP_ACLK_CTRL, 1,
+ 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_HSP_DMA0_CLK, "gate_hsp_dma0_clk",
+ "gate_clk_hsp_aclk", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_HSP_ACLK_CTRL, 0, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_HSP_ETH0_CORE_CLK,
+ "gate_hsp_eth0_core_clk", "divider_eth_txclk_div_dynm_0",
+ CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_ETH0_CTRL, 0, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_HSP_ETH1_CORE_CLK,
+ "gate_hsp_eth1_core_clk", "divider_eth_txclk_div_dynm_1",
+ CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_ETH1_CTRL, 0, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_HSP_RMII_REF_0, "gate_hsp_rmii_ref_0",
+ "mux_rmii_ref_2mux1", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_ETH0_CTRL, 31, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_HSP_RMII_REF_1, "gate_hsp_rmii_ref_1",
+ "mux_rmii_ref_2mux1", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_ETH1_CTRL, 31, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_AON_I2C0_PCLK, "gate_aon_i2c0_pclk",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_I2C0_CTRL, 31, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_AON_I2C1_PCLK, "gate_aon_i2c1_pclk",
+ "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_I2C1_CTRL, 31, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_DDR0_TRACE, "gate_ddr0_trace",
+ "divider_ddr_aclk_div_dynm", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_DDR_CTRL, 0, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_DDR1_TRACE, "gate_ddr1_trace",
+ "divider_ddr_aclk_div_dynm", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_DDR1_CTRL, 0, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_RNOC_NSP, "gate_rnoc_nsp",
+ "divider_noc_nsp_div_dynm", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_NOC_CTRL, 29, 0),
+ EIC7700_GATE(EIC7700_CLK_GATE_NOC_WDREF, "gate_noc_wdref",
+ "divider_noc_wdref_dynm", CLK_SET_RATE_PARENT,
+ EIC7700_REG_OFFSET_NOC_CTRL, 30, 0),
+};
+
+/*
+ * This clock notifier is called when the rate of clk_pll_cpu clock is to be
+ * changed. The mux_cpu_root_3mux1_gfree clock should save the current parent
+ * clock and switch its parent clock to fixed_factor_u84_core_lp_div2 before
+ * clk_pll_cpu rate will be changed. Then switch its parent clock back after
+ * the clk_pll_cpu rate is completed.
+ */
+static int eic7700_clk_pll_cpu_notifier_cb(struct notifier_block *nb,
+ unsigned long action, void *data)
+{
+ struct eswin_clock_data *pdata;
+ struct clk_hw *mux_clk;
+ struct clk_hw *lp_clk;
+ int ret = 0;
+
+ pdata = container_of(nb, struct eswin_clock_data, pll_nb);
+ mux_clk = pdata->clk_data.hws[EIC7700_CLK_MUX_CPU_ROOT_3MUX1_GFREE];
+ lp_clk = pdata->clk_data.hws[EIC7700_CLK_FIXED_FACTOR_U84_CORE_LP_DIV2];
+
+ if (action == PRE_RATE_CHANGE) {
+ pdata->original_clk = clk_hw_get_parent(mux_clk);
+ ret = clk_hw_set_parent(mux_clk, lp_clk);
+ } else if (action == POST_RATE_CHANGE) {
+ ret = clk_hw_set_parent(mux_clk, pdata->original_clk);
+ }
+
+ return notifier_from_errno(ret);
+}
+
+static int eic7700_clk_probe(struct platform_device *pdev)
+{
+ struct eswin_clock_data *clk_data;
+ struct device *dev = &pdev->dev;
+ struct clk *pll_clk;
+ int ret;
+
+ clk_data = eswin_clk_init(dev, EIC7700_NR_CLKS);
+ if (!clk_data)
+ return dev_err_probe(dev, -EAGAIN, "failed to get clk data!\n");
+
+ ret = eswin_clk_register_fixed_rate(eic7700_fixed_rate_clks,
+ ARRAY_SIZE(eic7700_fixed_rate_clks),
+ clk_data, dev);
+ if (ret)
+ return ret;
+
+ ret = eswin_clk_register_pll(eic7700_pll_clks,
+ ARRAY_SIZE(eic7700_pll_clks),
+ clk_data, dev);
+ if (ret)
+ return ret;
+
+ pll_clk = devm_clk_hw_get_clk
+ (dev, clk_data->clk_data.hws[EIC7700_CLK_PLL_CPU],
+ "clk_pll_cpu");
+ if (IS_ERR(pll_clk))
+ return dev_err_probe(dev, PTR_ERR(pll_clk),
+ "failed to get pll clock\n");
+
+ clk_data->pll_nb.notifier_call = eic7700_clk_pll_cpu_notifier_cb;
+ ret = devm_clk_notifier_register(dev, pll_clk, &clk_data->pll_nb);
+ if (ret)
+ return ret;
+
+ ret = eswin_clk_register_fixed_factor
+ (eic7700_fixed_factor_clks,
+ ARRAY_SIZE(eic7700_fixed_factor_clks), clk_data, dev);
+ if (ret)
+ return ret;
+
+ ret = eswin_clk_register_mux(eic7700_mux_clks,
+ ARRAY_SIZE(eic7700_mux_clks), clk_data,
+ dev);
+ if (ret)
+ return ret;
+
+ ret = eswin_clk_register_divider(eic7700_div_clks,
+ ARRAY_SIZE(eic7700_div_clks),
+ clk_data, dev);
+ if (ret)
+ return ret;
+
+ ret = eswin_clk_register_gate(eic7700_gate_clks,
+ ARRAY_SIZE(eic7700_gate_clks), clk_data,
+ dev);
+ if (ret)
+ return ret;
+
+ return devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get,
+ &clk_data->clk_data);
+}
+
+static const struct of_device_id eic7700_clock_dt_ids[] = {
+ { .compatible = "eswin,eic7700-clock", },
+ { /* sentinel */ }
+};
+MODULE_DEVICE_TABLE(of, eic7700_clock_dt_ids);
+
+static struct platform_driver eic7700_clock_driver = {
+ .probe = eic7700_clk_probe,
+ .driver = {
+ .name = "eic7700-clock",
+ .of_match_table = eic7700_clock_dt_ids,
+ },
+};
+module_platform_driver(eic7700_clock_driver);
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Yifeng Huang<huangyifeng@eswincomputing.com>");
+MODULE_AUTHOR("Xuyang Dong<dongxuyang@eswincomputing.com>");
+MODULE_DESCRIPTION("ESWIN EIC7700 clock controller driver");
diff --git a/drivers/clk/eswin/clk-eic7700.h b/drivers/clk/eswin/clk-eic7700.h
new file mode 100644
index 000000000000..625b12306aa3
--- /dev/null
+++ b/drivers/clk/eswin/clk-eic7700.h
@@ -0,0 +1,122 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright 2025, Beijing ESWIN Computing Technology Co., Ltd..
+ * All rights reserved.
+ *
+ * Authors:
+ * Yifeng Huang <huangyifeng@eswincomputing.com>
+ * xuyang Dong <dongxuyang@eswincomputing.com>
+ */
+
+#ifndef __CLK_EIC7700_H__
+#define __CLK_EIC7700_H__
+
+/* REG OFFSET OF SYS-CRG */
+#define EIC7700_REG_OFFSET_SPLL0_CFG_0 0x0
+#define EIC7700_REG_OFFSET_SPLL0_CFG_1 0x4
+#define EIC7700_REG_OFFSET_SPLL0_CFG_2 0x8
+#define EIC7700_REG_OFFSET_SPLL0_DSKEWCAL 0xC
+#define EIC7700_REG_OFFSET_SPLL0_SSC 0x10
+#define EIC7700_REG_OFFSET_SPLL1_CFG_0 0x14
+#define EIC7700_REG_OFFSET_SPLL1_CFG_1 0x18
+#define EIC7700_REG_OFFSET_SPLL1_CFG_2 0x1C
+#define EIC7700_REG_OFFSET_SPLL1_DSKEWCAL 0x20
+#define EIC7700_REG_OFFSET_SPLL1_SSC 0x24
+#define EIC7700_REG_OFFSET_SPLL2_CFG_0 0x28
+#define EIC7700_REG_OFFSET_SPLL2_CFG_1 0x2C
+#define EIC7700_REG_OFFSET_SPLL2_CFG_2 0x30
+#define EIC7700_REG_OFFSET_SPLL2_DSKEWCAL 0x34
+#define EIC7700_REG_OFFSET_SPLL2_SSC 0x38
+#define EIC7700_REG_OFFSET_VPLL_CFG_0 0x3C
+#define EIC7700_REG_OFFSET_VPLL_CFG_1 0x40
+#define EIC7700_REG_OFFSET_VPLL_CFG_2 0x44
+#define EIC7700_REG_OFFSET_VPLL_DSKEWCAL 0x48
+#define EIC7700_REG_OFFSET_VPLL_SSC 0x4C
+#define EIC7700_REG_OFFSET_APLL_CFG_0 0x50
+#define EIC7700_REG_OFFSET_APLL_CFG_1 0x54
+#define EIC7700_REG_OFFSET_APLL_CFG_2 0x58
+#define EIC7700_REG_OFFSET_APLL_DSKEWCAL 0x5C
+#define EIC7700_REG_OFFSET_APLL_SSC 0x60
+#define EIC7700_REG_OFFSET_MCPUT_PLL_CFG_0 0x64
+#define EIC7700_REG_OFFSET_MCPUT_PLL_CFG_1 0x68
+#define EIC7700_REG_OFFSET_MCPUT_PLL_CFG_2 0x6C
+#define EIC7700_REG_OFFSET_MCPUT_PLL_DSKEWCAL 0x70
+#define EIC7700_REG_OFFSET_MCPUT_PLL_SSC 0x74
+#define EIC7700_REG_OFFSET_DDRT_PLL_CFG_0 0x78
+#define EIC7700_REG_OFFSET_DDRT_PLL_CFG_1 0x7C
+#define EIC7700_REG_OFFSET_DDRT_PLL_CFG_2 0x80
+#define EIC7700_REG_OFFSET_DDRT_PLL_DSKEWCAL 0x84
+#define EIC7700_REG_OFFSET_DDRT_PLL_SSC 0x88
+#define EIC7700_REG_OFFSET_PLL_STATUS 0xA4
+#define EIC7700_REG_OFFSET_NOC_CTRL 0x100
+#define EIC7700_REG_OFFSET_BOOTSPI_CTRL 0x104
+#define EIC7700_REG_OFFSET_BOOTSPI_CFGCLK_CTRL 0x108
+#define EIC7700_REG_OFFSET_SCPU_CORE_CTRL 0x10C
+#define EIC7700_REG_OFFSET_SCPU_BUSCLK_CTRL 0x110
+#define EIC7700_REG_OFFSET_LPCPU_CORE_CTRL 0x114
+#define EIC7700_REG_OFFSET_LPCPU_BUSCLK_CTRL 0x118
+#define EIC7700_REG_OFFSET_TCU_ACLK_CTRL 0x11C
+#define EIC7700_REG_OFFSET_TCU_CFG_CTRL 0x120
+#define EIC7700_REG_OFFSET_DDR_CTRL 0x124
+#define EIC7700_REG_OFFSET_DDR1_CTRL 0x128
+#define EIC7700_REG_OFFSET_GPU_ACLK_CTRL 0x12C
+#define EIC7700_REG_OFFSET_GPU_CFG_CTRL 0x130
+#define EIC7700_REG_OFFSET_GPU_GRAY_CTRL 0x134
+#define EIC7700_REG_OFFSET_DSP_ACLK_CTRL 0x138
+#define EIC7700_REG_OFFSET_DSP_CFG_CTRL 0x13C
+#define EIC7700_REG_OFFSET_D2D_ACLK_CTRL 0x140
+#define EIC7700_REG_OFFSET_D2D_CFG_CTRL 0x144
+#define EIC7700_REG_OFFSET_HSP_ACLK_CTRL 0x148
+#define EIC7700_REG_OFFSET_HSP_CFG_CTRL 0x14C
+#define EIC7700_REG_OFFSET_SATA_RBC_CTRL 0x150
+#define EIC7700_REG_OFFSET_SATA_OOB_CTRL 0x154
+#define EIC7700_REG_OFFSET_ETH0_CTRL 0x158
+#define EIC7700_REG_OFFSET_ETH1_CTRL 0x15C
+#define EIC7700_REG_OFFSET_MSHC0_CORE_CTRL 0x160
+#define EIC7700_REG_OFFSET_MSHC1_CORE_CTRL 0x164
+#define EIC7700_REG_OFFSET_MSHC2_CORE_CTRL 0x168
+#define EIC7700_REG_OFFSET_MSHC_USB_SLWCLK 0x16C
+#define EIC7700_REG_OFFSET_PCIE_ACLK_CTRL 0x170
+#define EIC7700_REG_OFFSET_PCIE_CFG_CTRL 0x174
+#define EIC7700_REG_OFFSET_NPU_ACLK_CTRL 0x178
+#define EIC7700_REG_OFFSET_NPU_LLC_CTRL 0x17C
+#define EIC7700_REG_OFFSET_NPU_CORE_CTRL 0x180
+#define EIC7700_REG_OFFSET_VI_DWCLK_CTRL 0x184
+#define EIC7700_REG_OFFSET_VI_ACLK_CTRL 0x188
+#define EIC7700_REG_OFFSET_VI_DIG_ISP_CTRL 0x18C
+#define EIC7700_REG_OFFSET_VI_DVP_CTRL 0x190
+#define EIC7700_REG_OFFSET_VI_SHUTTER0 0x194
+#define EIC7700_REG_OFFSET_VI_SHUTTER1 0x198
+#define EIC7700_REG_OFFSET_VI_SHUTTER2 0x19C
+#define EIC7700_REG_OFFSET_VI_SHUTTER3 0x1A0
+#define EIC7700_REG_OFFSET_VI_SHUTTER4 0x1A4
+#define EIC7700_REG_OFFSET_VI_SHUTTER5 0x1A8
+#define EIC7700_REG_OFFSET_VI_PHY_CTRL 0x1AC
+#define EIC7700_REG_OFFSET_VO_ACLK_CTRL 0x1B0
+#define EIC7700_REG_OFFSET_VO_IESMCLK_CTRL 0x1B4
+#define EIC7700_REG_OFFSET_VO_PIXEL_CTRL 0x1B8
+#define EIC7700_REG_OFFSET_VO_MCLK_CTRL 0x1BC
+#define EIC7700_REG_OFFSET_VO_PHY_CLKCTRL 0x1C0
+#define EIC7700_REG_OFFSET_VC_ACLK_CTRL 0x1C4
+#define EIC7700_REG_OFFSET_VCDEC_ROOT_CTRL 0x1C8
+#define EIC7700_REG_OFFSET_G2D_CTRL 0x1CC
+#define EIC7700_REG_OFFSET_VC_CLKEN_CTRL 0x1D0
+#define EIC7700_REG_OFFSET_JE_CTRL 0x1D4
+#define EIC7700_REG_OFFSET_JD_CTRL 0x1D8
+#define EIC7700_REG_OFFSET_VD_CTRL 0x1DC
+#define EIC7700_REG_OFFSET_VE_CTRL 0x1E0
+#define EIC7700_REG_OFFSET_AON_DMA_CTRL 0x1E4
+#define EIC7700_REG_OFFSET_TIMER_CTRL 0x1E8
+#define EIC7700_REG_OFFSET_RTC_CTRL 0x1EC
+#define EIC7700_REG_OFFSET_PKA_CTRL 0x1F0
+#define EIC7700_REG_OFFSET_SPACC_CTRL 0x1F4
+#define EIC7700_REG_OFFSET_TRNG_CTRL 0x1F8
+#define EIC7700_REG_OFFSET_OTP_CTRL 0x1FC
+#define EIC7700_REG_OFFSET_LSP_EN0 0x200
+#define EIC7700_REG_OFFSET_LSP_EN1 0x204
+#define EIC7700_REG_OFFSET_U84_CTRL 0x208
+#define EIC7700_REG_OFFSET_SYSCFG_CTRL 0x20C
+#define EIC7700_REG_OFFSET_I2C0_CTRL 0x210
+#define EIC7700_REG_OFFSET_I2C1_CTRL 0x214
+
+#endif /* __CLK_EIC7700_H__ */
diff --git a/drivers/clk/eswin/clk.c b/drivers/clk/eswin/clk.c
new file mode 100644
index 000000000000..d05cdc82c0a1
--- /dev/null
+++ b/drivers/clk/eswin/clk.c
@@ -0,0 +1,396 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright 2025, Beijing ESWIN Computing Technology Co., Ltd..
+ * All rights reserved.
+ *
+ * Authors:
+ * Yifeng Huang <huangyifeng@eswincomputing.com>
+ * Xuyang Dong <dongxuyang@eswincomputing.com>
+ */
+
+#include <linux/clk.h>
+#include <linux/clk-provider.h>
+#include <linux/delay.h>
+#include <linux/io.h>
+#include <linux/math.h>
+#include <linux/slab.h>
+
+#include "clk.h"
+
+struct eswin_clock_data *eswin_clk_init(struct device *dev, int nr_clks)
+{
+ struct eswin_clock_data *eclk_data;
+
+ eclk_data = devm_kzalloc(dev, struct_size(eclk_data, clk_data.hws,
+ nr_clks), GFP_KERNEL);
+ if (!eclk_data)
+ return NULL;
+
+ eclk_data->base = devm_of_iomap(dev, dev->of_node, 0, NULL);
+ if (IS_ERR(eclk_data->base)) {
+ dev_err(dev, "failed to map clock registers\n");
+ return NULL;
+ }
+
+ eclk_data->clk_data.num = nr_clks;
+ /* Avoid returning NULL for unused id */
+ memset_p((void **)eclk_data->clk_data.hws, ERR_PTR(-ENOENT), nr_clks);
+ spin_lock_init(&eclk_data->lock);
+
+ return eclk_data;
+}
+
+/**
+ * eswin_calc_pll - calculate PLL values
+ * @frac_val: fractional divider
+ * @fbdiv_val: feedback divider
+ * @rate: reference rate
+ *
+ * Calculate PLL values for frac and fbdiv
+ */
+static void eswin_calc_pll(u32 *frac_val, u32 *fbdiv_val, u64 rate)
+{
+ u64 rem = 0;
+ u32 tmp1 = 0, tmp2 = 0;
+
+ rate = rate * 4;
+ rem = do_div(rate, 1000);
+ if (rem)
+ tmp1 = rem;
+
+ rem = do_div(rate, 1000);
+ if (rem)
+ tmp2 = rem;
+
+ rem = do_div(rate, 24);
+ /* fbdiv = rate * 4 / 24000000 */
+ *fbdiv_val = rate;
+ /* frac = rate * 4 % 24000000 * (2 ^ 24) */
+ *frac_val = (u64)((1000 * (1000 * rem + tmp2) + tmp1) << 24) / 24
+ / 1000000;
+}
+
+static inline struct eswin_clk_pll *to_pll_clk(struct clk_hw *hw)
+{
+ return container_of(hw, struct eswin_clk_pll, hw);
+}
+
+static int clk_pll_set_rate(struct clk_hw *hw, unsigned long rate,
+ unsigned long parent_rate)
+{
+ struct eswin_clk_pll *clk = to_pll_clk(hw);
+ u32 postdiv1_val = 0, refdiv_val = 1;
+ u32 frac_val, fbdiv_val, val;
+ bool lock_flag = false;
+ int try_count = 0;
+
+ eswin_calc_pll(&frac_val, &fbdiv_val, (u64)rate);
+
+ /* First, disable pll */
+ val = readl_relaxed(clk->ctrl_reg0);
+ val &= ~(((1 << clk->pllen_width) - 1) << clk->pllen_shift);
+ val |= 0 << clk->pllen_shift;
+ writel_relaxed(val, clk->ctrl_reg0);
+
+ val = readl_relaxed(clk->ctrl_reg0);
+ val &= ~(((1 << clk->fbdiv_width) - 1) << clk->fbdiv_shift);
+ val &= ~(((1 << clk->refdiv_width) - 1) << clk->refdiv_shift);
+ val |= refdiv_val << clk->refdiv_shift;
+ val |= fbdiv_val << clk->fbdiv_shift;
+ writel_relaxed(val, clk->ctrl_reg0);
+
+ val = readl_relaxed(clk->ctrl_reg1);
+ val &= ~(((1 << clk->frac_width) - 1) << clk->frac_shift);
+ val |= frac_val << clk->frac_shift;
+ writel_relaxed(val, clk->ctrl_reg1);
+
+ val = readl_relaxed(clk->ctrl_reg2);
+ val &= ~(((1 << clk->postdiv1_width) - 1) << clk->postdiv1_shift);
+ val |= postdiv1_val << clk->postdiv1_shift;
+ writel_relaxed(val, clk->ctrl_reg2);
+
+ /* Last, enable pll */
+ val = readl_relaxed(clk->ctrl_reg0);
+ val &= ~(((1 << clk->pllen_width) - 1) << clk->pllen_shift);
+ val |= 1 << clk->pllen_shift;
+ writel_relaxed(val, clk->ctrl_reg0);
+
+ /* Usually the pll will lock in 50us */
+ do {
+ usleep_range(refdiv_val * 80, refdiv_val * 80 * 2);
+ val = readl_relaxed(clk->status_reg);
+ if (val & 1 << clk->lock_shift) {
+ lock_flag = true;
+ break;
+ }
+ } while (try_count++ < 10);
+
+ if (!lock_flag) {
+ pr_err("failed to lock the cpu pll!\n");
+ return -EBUSY;
+ }
+
+ return 0;
+}
+
+static unsigned long clk_pll_recalc_rate(struct clk_hw *hw,
+ unsigned long parent_rate)
+{
+ struct eswin_clk_pll *clk = to_pll_clk(hw);
+ u64 fbdiv_val, frac_val, rate, rem, tmp;
+ u32 val;
+
+ val = readl_relaxed(clk->ctrl_reg0);
+ val = val >> clk->fbdiv_shift;
+ val &= ((1 << clk->fbdiv_width) - 1);
+ fbdiv_val = val;
+
+ val = readl_relaxed(clk->ctrl_reg1);
+ val = val >> clk->frac_shift;
+ val &= ((1 << clk->frac_width) - 1);
+ frac_val = val;
+
+ /* rate = 24000000 * (fbdiv + frac / (2 ^ 24)) / 4 */
+ tmp = 1000 * frac_val;
+ rem = do_div(tmp, BIT(24));
+ if (rem)
+ rate = (u64)(6000 * (1000 * fbdiv_val + tmp) +
+ ((6000 * rem) >> 24) + 1);
+ else
+ rate = (u64)(6000 * 1000 * fbdiv_val);
+
+ return rate;
+}
+
+static int clk_pll_determine_rate(struct clk_hw *hw,
+ struct clk_rate_request *req)
+{
+ struct eswin_clk_pll *clk = to_pll_clk(hw);
+
+ req->rate = clamp(req->rate, clk->min_rate, clk->max_rate);
+ req->min_rate = clk->min_rate;
+ req->max_rate = clk->max_rate;
+
+ return 0;
+}
+
+int eswin_clk_register_fixed_rate(const struct eswin_fixed_rate_clock *clks,
+ int nums, struct eswin_clock_data *data,
+ struct device *dev)
+{
+ struct clk_hw *clk_hw;
+ int i;
+
+ for (i = 0; i < nums; i++) {
+ clk_hw = devm_clk_hw_register_fixed_rate(dev, clks[i].name,
+ clks[i].parent_name,
+ clks[i].flags,
+ clks[i].rate);
+ if (IS_ERR(clk_hw))
+ return dev_err_probe(dev, PTR_ERR(clk_hw),
+ "failed to register clock\n");
+
+ data->clk_data.hws[clks[i].id] = clk_hw;
+ }
+
+ return 0;
+}
+
+static const struct clk_ops eswin_clk_pll_ops = {
+ .set_rate = clk_pll_set_rate,
+ .recalc_rate = clk_pll_recalc_rate,
+ .determine_rate = clk_pll_determine_rate,
+};
+
+int eswin_clk_register_pll(const struct eswin_pll_clock *clks, int nums,
+ struct eswin_clock_data *data, struct device *dev)
+{
+ struct eswin_clk_pll *p_clk = NULL;
+ struct clk_init_data init;
+ struct clk_hw *clk_hw;
+ int i, ret;
+
+ p_clk = devm_kzalloc(dev, sizeof(*p_clk) * nums, GFP_KERNEL);
+ if (!p_clk)
+ return -ENOMEM;
+
+ for (i = 0; i < nums; i++) {
+ p_clk->id = clks[i].id;
+ p_clk->ctrl_reg0 = data->base + clks[i].ctrl_reg0;
+ p_clk->pllen_shift = clks[i].pllen_shift;
+ p_clk->pllen_width = clks[i].pllen_width;
+ p_clk->refdiv_shift = clks[i].refdiv_shift;
+ p_clk->refdiv_width = clks[i].refdiv_width;
+ p_clk->fbdiv_shift = clks[i].fbdiv_shift;
+ p_clk->fbdiv_width = clks[i].fbdiv_width;
+
+ p_clk->ctrl_reg1 = data->base + clks[i].ctrl_reg1;
+ p_clk->frac_shift = clks[i].frac_shift;
+ p_clk->frac_width = clks[i].frac_width;
+
+ p_clk->ctrl_reg2 = data->base + clks[i].ctrl_reg2;
+ p_clk->postdiv1_shift = clks[i].postdiv1_shift;
+ p_clk->postdiv1_width = clks[i].postdiv1_width;
+ p_clk->postdiv2_shift = clks[i].postdiv2_shift;
+ p_clk->postdiv2_width = clks[i].postdiv2_width;
+
+ p_clk->status_reg = data->base + clks[i].status_reg;
+ p_clk->lock_shift = clks[i].lock_shift;
+ p_clk->lock_width = clks[i].lock_width;
+
+ p_clk->max_rate = clks[i].max_rate;
+ p_clk->min_rate = clks[i].min_rate;
+
+ init.name = clks[i].name;
+ init.flags = 0;
+ init.parent_names = clks[i].parent_name ?
+ &clks[i].parent_name : NULL;
+ init.num_parents = clks[i].parent_name ? 1 : 0;
+ init.ops = &eswin_clk_pll_ops;
+ p_clk->hw.init = &init;
+
+ clk_hw = &p_clk->hw;
+ ret = devm_clk_hw_register(dev, clk_hw);
+ if (ret)
+ return dev_err_probe(dev, ret,
+ "failed to register clock\n");
+
+ data->clk_data.hws[clks[i].id] = clk_hw;
+ p_clk++;
+ }
+
+ return 0;
+}
+
+int eswin_clk_register_fixed_factor(const struct eswin_fixed_factor_clock *clks,
+ int nums, struct eswin_clock_data *data,
+ struct device *dev)
+{
+ struct clk_hw *clk_hw;
+ int i;
+
+ for (i = 0; i < nums; i++) {
+ clk_hw = devm_clk_hw_register_fixed_factor(dev, clks[i].name,
+ clks[i].parent_name,
+ clks[i].flags,
+ clks[i].mult,
+ clks[i].div);
+ if (IS_ERR(clk_hw))
+ return dev_err_probe(dev, PTR_ERR(clk_hw),
+ "failed to register clock\n");
+
+ data->clk_data.hws[clks[i].id] = clk_hw;
+ }
+
+ return 0;
+}
+
+int eswin_clk_register_mux(const struct eswin_mux_clock *clks, int nums,
+ struct eswin_clock_data *data, struct device *dev)
+{
+ struct clk_hw *clk_hw;
+ int i;
+
+ for (i = 0; i < nums; i++) {
+ clk_hw = devm_clk_hw_register_mux(dev, clks[i].name,
+ clks[i].parent_names,
+ clks[i].num_parents,
+ clks[i].flags,
+ data->base + clks[i].offset,
+ clks[i].shift,
+ clks[i].width,
+ clks[i].mux_flags,
+ &data->lock);
+ if (IS_ERR(clk_hw))
+ return dev_err_probe(dev, PTR_ERR(clk_hw),
+ "failed to register clock\n");
+
+ data->clk_data.hws[clks[i].id] = clk_hw;
+ }
+
+ return 0;
+}
+
+int eswin_clk_register_mux_tbl(const struct eswin_mux_clock *clks,
+ int nums, struct eswin_clock_data *data,
+ struct device *dev)
+{
+ struct clk_hw *clk_hw;
+ int i;
+
+ for (i = 0; i < nums; i++) {
+ clk_hw = clk_hw_register_mux_table(dev, clks[i].name,
+ clks[i].parent_names,
+ clks[i].num_parents,
+ clks[i].flags,
+ data->base + clks[i].offset,
+ clks[i].shift,
+ BIT(clks[i].width) - 1,
+ clks[i].mux_flags,
+ clks[i].table, &data->lock);
+
+ if (IS_ERR(clk_hw)) {
+ while (i--)
+ clk_hw_unregister_mux
+ (data->clk_data.hws[clks[i].id]);
+ return dev_err_probe(dev, PTR_ERR(clk_hw),
+ "failed to register clock\n");
+ }
+
+ data->clk_data.hws[clks[i].id] = clk_hw;
+ }
+
+ return 0;
+}
+
+int eswin_clk_register_divider(const struct eswin_divider_clock *clks,
+ int nums, struct eswin_clock_data *data,
+ struct device *dev)
+{
+ struct clk_hw *clk_hw;
+ int i;
+
+ for (i = 0; i < nums; i++) {
+ clk_hw = devm_clk_hw_register_divider(dev, clks[i].name,
+ clks[i].parent_name,
+ clks[i].flags,
+ data->base +
+ clks[i].offset,
+ clks[i].shift,
+ clks[i].width,
+ clks[i].div_flags,
+ &data->lock);
+ if (IS_ERR(clk_hw))
+ return dev_err_probe(dev, PTR_ERR(clk_hw),
+ "failed to register clock\n");
+
+ data->clk_data.hws[clks[i].id] = clk_hw;
+ }
+
+ return 0;
+}
+
+int eswin_clk_register_gate(const struct eswin_gate_clock *clks, int nums,
+ struct eswin_clock_data *data, struct device *dev)
+{
+ struct clk_hw *clk_hw;
+ int i;
+
+ for (i = 0; i < nums; i++) {
+ clk_hw = devm_clk_hw_register_gate(dev, clks[i].name,
+ clks[i].parent_name,
+ clks[i].flags,
+ data->base + clks[i].offset,
+ clks[i].bit_idx,
+ clks[i].gate_flags,
+ &data->lock);
+
+ if (IS_ERR(clk_hw))
+ return dev_err_probe(dev, PTR_ERR(clk_hw),
+ "failed to register clock\n");
+
+ data->clk_data.hws[clks[i].id] = clk_hw;
+ }
+
+ return 0;
+}
diff --git a/drivers/clk/eswin/clk.h b/drivers/clk/eswin/clk.h
new file mode 100644
index 000000000000..e6e0682ff39c
--- /dev/null
+++ b/drivers/clk/eswin/clk.h
@@ -0,0 +1,266 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright 2025, Beijing ESWIN Computing Technology Co., Ltd..
+ * All rights reserved.
+ *
+ * Authors:
+ * Yifeng Huang <huangyifeng@eswincomputing.com>
+ * Xuyang Dong <dongxuyang@eswincomputing.com>
+ */
+
+#ifndef __ESWIN_CLK_H__
+#define __ESWIN_CLK_H__
+
+#include <linux/clk-provider.h>
+#include <linux/platform_device.h>
+#include <linux/spinlock.h>
+
+#define APLL_HIGH_FREQ 983040000
+#define APLL_LOW_FREQ 225792000
+#define PLL_HIGH_FREQ 1800000000
+#define PLL_LOW_FREQ 24000000
+
+struct eswin_clock_data {
+ void __iomem *base;
+ struct clk_hw *original_clk;
+ struct notifier_block pll_nb;
+ spinlock_t lock; /* protect register read-modify-write cycle */
+ struct clk_hw_onecell_data clk_data;
+};
+
+struct eswin_divider_clock {
+ unsigned int id;
+ const char *name;
+ const char *parent_name;
+ unsigned long flags;
+ unsigned long offset;
+ u8 shift;
+ u8 width;
+ u8 div_flags;
+};
+
+struct eswin_fixed_rate_clock {
+ unsigned int id;
+ char *name;
+ const char *parent_name;
+ unsigned long flags;
+ unsigned long rate;
+};
+
+struct eswin_fixed_factor_clock {
+ unsigned int id;
+ char *name;
+ const char *parent_name;
+ unsigned long mult;
+ unsigned long div;
+ unsigned long flags;
+};
+
+struct eswin_gate_clock {
+ unsigned int id;
+ const char *name;
+ const char *parent_name;
+ unsigned long flags;
+ unsigned long offset;
+ u8 bit_idx;
+ u8 gate_flags;
+};
+
+struct eswin_mux_clock {
+ unsigned int id;
+ const char *name;
+ const char *const *parent_names;
+ u8 num_parents;
+ unsigned long flags;
+ unsigned long offset;
+ u8 shift;
+ u8 width;
+ u8 mux_flags;
+ u32 *table;
+};
+
+struct eswin_pll_clock {
+ u32 id;
+ const char *name;
+ const char *parent_name;
+ const u32 ctrl_reg0;
+ const u8 pllen_shift;
+ const u8 pllen_width;
+ const u8 refdiv_shift;
+ const u8 refdiv_width;
+ const u8 fbdiv_shift;
+ const u8 fbdiv_width;
+
+ const u32 ctrl_reg1;
+ const u8 frac_shift;
+ const u8 frac_width;
+
+ const u32 ctrl_reg2;
+ const u8 postdiv1_shift;
+ const u8 postdiv1_width;
+ const u8 postdiv2_shift;
+ const u8 postdiv2_width;
+
+ const u32 status_reg;
+ const u8 lock_shift;
+ const u8 lock_width;
+
+ const u64 max_rate;
+ const u64 min_rate;
+};
+
+struct eswin_clk_pll {
+ struct clk_hw hw;
+ u32 id;
+ void __iomem *ctrl_reg0;
+ u8 pllen_shift;
+ u8 pllen_width;
+ u8 refdiv_shift;
+ u8 refdiv_width;
+ u8 fbdiv_shift;
+ u8 fbdiv_width;
+
+ void __iomem *ctrl_reg1;
+ u8 frac_shift;
+ u8 frac_width;
+
+ void __iomem *ctrl_reg2;
+ u8 postdiv1_shift;
+ u8 postdiv1_width;
+ u8 postdiv2_shift;
+ u8 postdiv2_width;
+
+ void __iomem *status_reg;
+ u8 lock_shift;
+ u8 lock_width;
+
+ u64 max_rate;
+ u64 min_rate;
+};
+
+struct eswin_clock_data *eswin_clk_init(struct device *dev, int nr_clks);
+int eswin_clk_register_fixed_rate(const struct eswin_fixed_rate_clock *clks,
+ int nums, struct eswin_clock_data *data,
+ struct device *dev);
+int eswin_clk_register_pll(const struct eswin_pll_clock *clks, int nums,
+ struct eswin_clock_data *data, struct device *dev);
+int eswin_clk_register_fixed_factor(const struct eswin_fixed_factor_clock *clks,
+ int nums, struct eswin_clock_data *data,
+ struct device *dev);
+int eswin_clk_register_mux(const struct eswin_mux_clock *clks, int nums,
+ struct eswin_clock_data *data, struct device *dev);
+int eswin_clk_register_mux_tbl(const struct eswin_mux_clock *clks,
+ int nums, struct eswin_clock_data *data,
+ struct device *dev);
+int eswin_clk_register_divider(const struct eswin_divider_clock *clks,
+ int nums, struct eswin_clock_data *data,
+ struct device *dev);
+int eswin_clk_register_gate(const struct eswin_gate_clock *clks, int nums,
+ struct eswin_clock_data *data, struct device *dev);
+
+#define PNAME(x) static const char *const x[] __initconst
+
+#define EIC7700_DIV(_id, _name, _pname, _flags, _offset, _shift, _width, \
+ _dflags) \
+ { \
+ .id = _id, \
+ .name = _name, \
+ .parent_name = _pname, \
+ .flags = _flags, \
+ .offset = _offset, \
+ .shift = _shift, \
+ .width = _width, \
+ .div_flags = _dflags, \
+ }
+
+#define EIC7700_FACTOR(_id, _name, _pname, _mult, _div, _flags) \
+ { \
+ .id = _id, \
+ .name = _name, \
+ .parent_name = _pname, \
+ .mult = _mult, \
+ .div = _div, \
+ .flags = _flags, \
+ }
+
+#define EIC7700_FIXED(_id, _name, _pname, _flags, _rate) \
+{ \
+ .id = _id, \
+ .name = _name, \
+ .parent_name = _pname, \
+ .flags = _flags, \
+ .rate = _rate, \
+}
+
+#define EIC7700_GATE(_id, _name, _pname, _flags, _offset, _idx, _gflags) \
+ { \
+ .id = _id, \
+ .name = _name, \
+ .parent_name = _pname, \
+ .flags = _flags, \
+ .offset = _offset, \
+ .bit_idx = _idx, \
+ .gate_flags = _gflags, \
+ }
+
+#define EIC7700_MUX(_id, _name, _pnames, _num_parents, _flags, _offset, \
+ _shift, _width, _mflags) \
+ { \
+ .id = _id, \
+ .name = _name, \
+ .parent_names = _pnames, \
+ .num_parents = _num_parents, \
+ .flags = _flags, \
+ .offset = _offset, \
+ .shift = _shift, \
+ .width = _width, \
+ .mux_flags = _mflags, \
+ }
+
+#define EIC7700_MUX_TBL(_id, _name, _pnames, _num_parents, _flags, _offset, \
+ _shift, _width, _mflags, _table) \
+ { \
+ .id = _id, \
+ .name = _name, \
+ .parent_names = _pnames, \
+ .num_parents = _num_parents, \
+ .flags = _flags, \
+ .offset = _offset, \
+ .shift = _shift, \
+ .width = _width, \
+ .mux_flags = _mflags, \
+ .table = _table, \
+ }
+
+#define EIC7700_PLL(_id, _name, _pname, _reg0, _en_shift, _en_width, \
+ _ref_shift, _ref_width, _fb_shift, _fb_width, _reg1,\
+ _frac_shift, _frac_width, _reg2, _post1_shift, \
+ _post1_width, _post2_shift, _post2_width, _reg, \
+ _lock_shift, _lock_width, _max_rate, _min_rate) \
+ { \
+ .id = _id, \
+ .name = _name, \
+ .parent_name = _pname, \
+ .ctrl_reg0 = _reg0, \
+ .pllen_shift = _en_shift, \
+ .pllen_width = _en_width, \
+ .refdiv_shift = _ref_shift, \
+ .refdiv_width = _ref_width, \
+ .fbdiv_shift = _fb_shift, \
+ .fbdiv_width = _fb_width, \
+ .ctrl_reg1 = _reg1, \
+ .frac_shift = _frac_shift, \
+ .frac_width = _frac_width, \
+ .ctrl_reg2 = _reg2, \
+ .postdiv1_shift = _post1_shift, \
+ .postdiv1_width = _post1_width, \
+ .postdiv2_shift = _post2_shift, \
+ .postdiv2_width = _post2_width, \
+ .status_reg = _reg, \
+ .lock_shift = _lock_shift, \
+ .lock_width = _lock_width, \
+ .max_rate = _max_rate, \
+ .min_rate = _min_rate, \
+ }
+
+#endif /* __ESWIN_CLK_H__ */
--
2.43.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v9 3/3] MAINTAINERS: Add entry for ESWIN EIC7700 clock driver
2025-12-29 10:58 [PATCH v9 0/3] Add driver support for ESWIN eic700 SoC clock controller dongxuyang
2025-12-29 10:59 ` [PATCH v9 1/3] dt-bindings: clock: eswin: Documentation for eic7700 SoC dongxuyang
2025-12-29 10:59 ` [PATCH v9 2/3] clock: eswin: Add eic7700 clock driver dongxuyang
@ 2025-12-29 11:00 ` dongxuyang
2 siblings, 0 replies; 7+ messages in thread
From: dongxuyang @ 2025-12-29 11:00 UTC (permalink / raw)
To: mturquette, sboyd, robh, krzk+dt, conor+dt, linux-clk, devicetree,
linux-kernel, troy.mitchell, bmasney
Cc: ningyu, linmin, huangyifeng, pinkesh.vaghela, ganboing,
Xuyang Dong
From: Xuyang Dong <dongxuyang@eswincomputing.com>
Add myself as maintainer of ESWIN EIC7700 clock driver
Signed-off-by: Xuyang Dong <dongxuyang@eswincomputing.com>
---
MAINTAINERS | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/MAINTAINERS b/MAINTAINERS
index 12f49de7fe03..cea43d90e4ee 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -9364,6 +9364,14 @@ T: git https://github.com/eswincomputing/linux-next.git
F: Documentation/devicetree/bindings/riscv/eswin.yaml
F: arch/riscv/boot/dts/eswin/
+ESWIN EIC7700 CLOCK DRIVER
+M: Yifeng Huang <huangyifeng@eswincomputing.com>
+M: Xuyang Dong <dongxuyang@eswincomputing.com>
+S: Maintained
+F: Documentation/devicetree/bindings/clock/eswin,eic7700-clock.yaml
+F: drivers/clk/eswin/
+F: include/dt-bindings/clock/eswin,eic7700-clock.h
+
ET131X NETWORK DRIVER
M: Mark Einon <mark.einon@gmail.com>
S: Odd Fixes
--
2.43.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v9 2/3] clock: eswin: Add eic7700 clock driver
2025-12-29 10:59 ` [PATCH v9 2/3] clock: eswin: Add eic7700 clock driver dongxuyang
@ 2025-12-31 9:34 ` Marcel Ziswiler
2026-01-04 3:23 ` Xuyang Dong
0 siblings, 1 reply; 7+ messages in thread
From: Marcel Ziswiler @ 2025-12-31 9:34 UTC (permalink / raw)
To: dongxuyang, mturquette, sboyd, robh, krzk+dt, conor+dt, linux-clk,
devicetree, linux-kernel, troy.mitchell, bmasney
Cc: ningyu, linmin, huangyifeng, pinkesh.vaghela, ganboing
On Mon, 2025-12-29 at 18:59 +0800, dongxuyang@eswincomputing.com wrote:
> From: Xuyang Dong <dongxuyang@eswincomputing.com>
>
> Add clock drivers for the EIC7700 SoC. The clock controller on the ESWIN
> EIC7700 provides various clocks to different IP blocks within the SoC.
>
> Signed-off-by: Yifeng Huang <huangyifeng@eswincomputing.com>
> Signed-off-by: Xuyang Dong <dongxuyang@eswincomputing.com>
> ---
> drivers/clk/Kconfig | 1 +
> drivers/clk/Makefile | 1 +
> drivers/clk/eswin/Kconfig | 15 +
> drivers/clk/eswin/Makefile | 8 +
> drivers/clk/eswin/clk-eic7700.c | 1110 +++++++++++++++++++++++++++++++
> drivers/clk/eswin/clk-eic7700.h | 122 ++++
> drivers/clk/eswin/clk.c | 396 +++++++++++
> drivers/clk/eswin/clk.h | 266 ++++++++
> 8 files changed, 1919 insertions(+)
> create mode 100644 drivers/clk/eswin/Kconfig
> create mode 100644 drivers/clk/eswin/Makefile
> create mode 100644 drivers/clk/eswin/clk-eic7700.c
> create mode 100644 drivers/clk/eswin/clk-eic7700.h
> create mode 100644 drivers/clk/eswin/clk.c
> create mode 100644 drivers/clk/eswin/clk.h
>
> diff --git a/drivers/clk/Kconfig b/drivers/clk/Kconfig
> index 3a1611008e48..2a9056d41093 100644
> --- a/drivers/clk/Kconfig
> +++ b/drivers/clk/Kconfig
> @@ -515,6 +515,7 @@ source "drivers/clk/actions/Kconfig"
> source "drivers/clk/analogbits/Kconfig"
> source "drivers/clk/baikal-t1/Kconfig"
> source "drivers/clk/bcm/Kconfig"
> +source "drivers/clk/eswin/Kconfig"
> source "drivers/clk/hisilicon/Kconfig"
> source "drivers/clk/imgtec/Kconfig"
> source "drivers/clk/imx/Kconfig"
> diff --git a/drivers/clk/Makefile b/drivers/clk/Makefile
> index 61ec08404442..37f6070a342e 100644
> --- a/drivers/clk/Makefile
> +++ b/drivers/clk/Makefile
> @@ -121,6 +121,7 @@ obj-$(CONFIG_CLK_BAIKAL_T1) += baikal-t1/
> obj-y += bcm/
> obj-$(CONFIG_ARCH_BERLIN) += berlin/
> obj-$(CONFIG_ARCH_DAVINCI) += davinci/
> +obj-$(CONFIG_ARCH_ESWIN) += eswin/
> obj-$(CONFIG_ARCH_HISI) += hisilicon/
> obj-y += imgtec/
> obj-y += imx/
> diff --git a/drivers/clk/eswin/Kconfig b/drivers/clk/eswin/Kconfig
> new file mode 100644
> index 000000000000..86af60f852c2
> --- /dev/null
> +++ b/drivers/clk/eswin/Kconfig
> @@ -0,0 +1,15 @@
> +# SPDX-License-Identifier: GPL-2.0
> +
> +config COMMON_CLK_ESWIN
> + bool
> +
> +config COMMON_CLK_EIC7700
> + tristate "EIC7700 Clock Driver"
> + depends on ARCH_ESWIN || COMPILE_TEST
> + select COMMON_CLK_ESWIN
> + default ARCH_ESWIN
> + help
> + This driver provides support for clock controller on ESWIN EIC7700
> + SoC. The clock controller can generates and supplies clock to various
> + peripherals within the SoC.
> + Say yes here to support the clock controller on the EIC7700 SoC.
> diff --git a/drivers/clk/eswin/Makefile b/drivers/clk/eswin/Makefile
> new file mode 100644
> index 000000000000..4a7c2af82164
> --- /dev/null
> +++ b/drivers/clk/eswin/Makefile
> @@ -0,0 +1,8 @@
> +# SPDX-License-Identifier: GPL-2.0
> +#
> +# Eswin Clock specific Makefile
> +#
> +
> +obj-$(CONFIG_COMMON_CLK_ESWIN) += clk.o
> +
> +obj-$(CONFIG_COMMON_CLK_EIC7700) += clk-eic7700.o
> diff --git a/drivers/clk/eswin/clk-eic7700.c b/drivers/clk/eswin/clk-eic7700.c
> new file mode 100644
> index 000000000000..0693a4ae8510
> --- /dev/null
> +++ b/drivers/clk/eswin/clk-eic7700.c
> @@ -0,0 +1,1110 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * Copyright 2025, Beijing ESWIN Computing Technology Co., Ltd..
> + * All rights reserved.
> + *
> + * ESWIN EIC7700 Clk Provider Driver
> + *
> + * Authors:
> + * Yifeng Huang <huangyifeng@eswincomputing.com>
> + * Xuyang Dong <dongxuyang@eswincomputing.com>
> + */
> +
> +#include <linux/clk.h>
> +#include <linux/clk-provider.h>
> +#include <linux/kernel.h>
> +
> +#include <dt-bindings/clock/eswin,eic7700-clock.h>
> +
> +#include "clk.h"
> +#include "clk-eic7700.h"
> +
> +#define EIC7700_NR_CLKS (EIC7700_CLK_GATE_NOC_WDREF + 1)
> +
> +/* clock parent list */
> +PNAME(mux_cpu_root_3mux1_gfree_p) = { "clk_pll_cpu",
> + "fixed_factor_u84_core_lp_div2",
> + "xtal24m" };
> +PNAME(mux_cpu_aclk_2mux1_gfree_p) = { "fixed_factor_cpu_div2",
> + "mux_cpu_root_3mux1_gfree" };
> +PNAME(dsp_aclk_root_2mux1_gfree_mux_p) = { "fixed_rate_clk_spll2_fout1",
> + "fixed_rate_clk_spll0_fout1" };
> +PNAME(d2d_aclk_root_2mux1_gfree_mux_p) = { "fixed_rate_clk_spll2_fout1",
> + "fixed_rate_clk_spll0_fout1" };
> +PNAME(ddr_aclk_root_2mux1_gfree_mux_p) = { "fixed_rate_clk_spll2_fout1",
> + "fixed_rate_clk_spll0_fout1" };
> +PNAME(mshcore_root_3mux1_0_mux_p) = { "fixed_rate_clk_spll0_fout3",
> + "fixed_rate_clk_spll2_fout3" };
> +PNAME(mshcore_root_3mux1_1_mux_p) = { "fixed_rate_clk_spll0_fout3",
> + "fixed_rate_clk_spll2_fout3" };
> +PNAME(mshcore_root_3mux1_2_mux_p) = { "fixed_rate_clk_spll0_fout3",
> + "fixed_rate_clk_spll2_fout3" };
> +PNAME(npu_llclk_3mux1_gfree_mux_p) = { "divider_npu_llc_src0_div_dynm",
> + "divider_npu_llc_src1_div_dynm",
> + "fixed_rate_clk_vpll_fout1" };
> +PNAME(npu_core_3mux1_gfree_mux_p) = { "fixed_rate_clk_spll1_fout1",
> + "fixed_rate_clk_vpll_fout1",
> + "fixed_rate_clk_spll2_fout2" };
> +PNAME(npu_e31_3mux1_gfree_mux_p) = { "fixed_rate_clk_spll1_fout1",
> + "fixed_rate_clk_vpll_fout1",
> + "fixed_rate_clk_spll2_fout2" };
> +PNAME(vi_aclk_root_2mux1_gfree_mux_p) = { "fixed_rate_clk_spll0_fout1",
> + "fixed_rate_clk_spll2_fout1" };
> +PNAME(mux_vi_dw_root_2mux1_p) = { "fixed_rate_clk_vpll_fout1",
> + "fixed_rate_clk_spll0_fout1" };
> +PNAME(mux_vi_dvp_root_2mux1_gfree_p) = { "fixed_rate_clk_vpll_fout1",
> + "fixed_rate_clk_spll0_fout1" };
> +PNAME(mux_vi_dig_isp_root_2mux1_gfree_p) = { "fixed_rate_clk_vpll_fout1",
> + "fixed_rate_clk_spll0_fout1" };
> +PNAME(mux_vo_aclk_root_2mux1_gfree_p) = { "fixed_rate_clk_spll0_fout1",
> + "fixed_rate_clk_spll2_fout1" };
> +PNAME(mux_vo_pixel_root_2mux1_p) = { "fixed_rate_clk_vpll_fout1",
> + "fixed_rate_clk_spll2_fout2" };
> +PNAME(mux_vcdec_root_2mux1_gfree_p) = { "fixed_rate_clk_spll0_fout1",
> + "fixed_rate_clk_spll2_fout1" };
> +PNAME(mux_vcaclk_root_2mux1_gfree_p) = { "fixed_rate_clk_spll0_fout1",
> + "fixed_rate_clk_spll2_fout1" };
> +PNAME(mux_syscfg_clk_root_2mux1_gfree_p) = { "divider_sys_cfg_div_dynm",
> + "xtal24m" };
> +PNAME(mux_bootspi_clk_2mux1_gfree_p) = { "divider_bootspi_div_dynm",
> + "xtal24m" };
> +PNAME(mux_scpu_core_clk_2mux1_gfree_p) = { "divider_scpu_core_div_dynm",
> + "xtal24m" };
> +PNAME(mux_lpcpu_core_clk_2mux1_gfree_p) = { "divider_lpcpu_core_div_dynm",
> + "xtal24m" };
> +PNAME(mux_vo_mclk_2mux_ext_mclk_p) = { "divider_vo_mclk_div_dynm",
> + "fixed_rate_ext_mclk" };
> +PNAME(mux_aondma_axi2mux1_gfree_p) = { "divider_aondma_axi_div_dynm",
> + "xtal24m" };
> +PNAME(mux_rmii_ref_2mux1_p) = { "fixed_factor_hsp_rmii_ref_div6",
> + "fixed_rate_lpddr_ref_bak" };
> +PNAME(mux_eth_core_2mux1_p) = { "fixed_rate_clk_spll1_fout3",
> + "fixed_rate_lpddr_ref_bak" };
> +PNAME(mux_sata_phy_2mux1_p) = { "divider_sata_phy_ref_div_dynm",
> + "fixed_rate_lpddr_ref_bak" };
> +
> +/* fixed rate clocks */
> +static struct eswin_fixed_rate_clock eic7700_fixed_rate_clks[] = {
> + EIC7700_FIXED(EIC7700_CLK_XTAL_32K, "fixed_rate_clk_xtal_32k", NULL, 0,
> + 32768),
> + EIC7700_FIXED(EIC7700_CLK_SPLL0_FOUT1, "fixed_rate_clk_spll0_fout1",
> + NULL, 0, 1600000000),
> + EIC7700_FIXED(EIC7700_CLK_SPLL0_FOUT2, "fixed_rate_clk_spll0_fout2",
> + NULL, 0, 800000000),
> + EIC7700_FIXED(EIC7700_CLK_SPLL0_FOUT3, "fixed_rate_clk_spll0_fout3",
> + NULL, 0, 400000000),
> + EIC7700_FIXED(EIC7700_CLK_SPLL1_FOUT1, "fixed_rate_clk_spll1_fout1",
> + NULL, 0, 1500000000),
> + EIC7700_FIXED(EIC7700_CLK_SPLL1_FOUT2, "fixed_rate_clk_spll1_fout2",
> + NULL, 0, 300000000),
> + EIC7700_FIXED(EIC7700_CLK_SPLL1_FOUT3, "fixed_rate_clk_spll1_fout3",
> + NULL, 0, 250000000),
> + EIC7700_FIXED(EIC7700_CLK_SPLL2_FOUT1, "fixed_rate_clk_spll2_fout1",
> + NULL, 0, 2080000000),
> + EIC7700_FIXED(EIC7700_CLK_SPLL2_FOUT2, "fixed_rate_clk_spll2_fout2",
> + NULL, 0, 1040000000),
> + EIC7700_FIXED(EIC7700_CLK_SPLL2_FOUT3, "fixed_rate_clk_spll2_fout3",
> + NULL, 0, 416000000),
> + EIC7700_FIXED(EIC7700_CLK_VPLL_FOUT1, "fixed_rate_clk_vpll_fout1",
> + NULL, 0, 1188000000),
> + EIC7700_FIXED(EIC7700_CLK_VPLL_FOUT2, "fixed_rate_clk_vpll_fout2",
> + NULL, 0, 594000000),
> + EIC7700_FIXED(EIC7700_CLK_VPLL_FOUT3, "fixed_rate_clk_vpll_fout3",
> + NULL, 0, 49500000),
> + EIC7700_FIXED(EIC7700_CLK_APLL_FOUT2, "fixed_rate_clk_apll_fout2",
> + NULL, 0, 0),
> + EIC7700_FIXED(EIC7700_CLK_APLL_FOUT3, "fixed_rate_clk_apll_fout3",
> + NULL, 0, 0),
> + EIC7700_FIXED(EIC7700_CLK_EXT_MCLK, "fixed_rate_ext_mclk", NULL, 0, 0),
> + EIC7700_FIXED(EIC7700_CLK_LPDDR_REF_BAK, "fixed_rate_lpddr_ref_bak",
> + NULL, 0, 50000000),
> +};
> +
> +/* pll clocks */
> +static struct eswin_pll_clock eic7700_pll_clks[] = {
> + EIC7700_PLL(EIC7700_CLK_APLL_FOUT1, "clk_apll_fout1", NULL,
> + EIC7700_REG_OFFSET_APLL_CFG_0, 0, 1, 12, 6, 20, 12,
> + EIC7700_REG_OFFSET_APLL_CFG_1, 4, 24,
> + EIC7700_REG_OFFSET_APLL_CFG_2, 1, 3, 16, 3,
> + EIC7700_REG_OFFSET_PLL_STATUS, 4, 1, APLL_HIGH_FREQ,
> + APLL_LOW_FREQ),
> + EIC7700_PLL(EIC7700_CLK_PLL_CPU, "clk_pll_cpu", NULL,
> + EIC7700_REG_OFFSET_MCPUT_PLL_CFG_0, 0, 1, 12, 6, 20, 12,
> + EIC7700_REG_OFFSET_MCPUT_PLL_CFG_1, 4, 24,
> + EIC7700_REG_OFFSET_MCPUT_PLL_CFG_2, 1, 3, 16, 3,
> + EIC7700_REG_OFFSET_PLL_STATUS, 5, 1, PLL_HIGH_FREQ,
> + PLL_LOW_FREQ),
> +};
> +
> +/* fixed factor clocks */
> +static struct eswin_fixed_factor_clock eic7700_fixed_factor_clks[] = {
> + EIC7700_FACTOR(EIC7700_CLK_FIXED_FACTOR_CPU_DIV2,
> + "fixed_factor_cpu_div2", "mux_cpu_root_3mux1_gfree", 1,
> + 2, 0),
> + EIC7700_FACTOR(EIC7700_CLK_FIXED_FACTOR_CLK_1M_DIV24,
> + "fixed_factor_clk_1m_div24", "xtal24m", 1, 24, 0),
> + EIC7700_FACTOR(EIC7700_CLK_FIXED_FACTOR_MIPI_TXESC_DIV10,
> + "fixed_factor_mipi_txesc_div10",
> + "mux_syscfg_clk_root_2mux1_gfree", 1, 10, 0),
> + EIC7700_FACTOR(EIC7700_CLK_FIXED_FACTOR_U84_CORE_LP_DIV2,
> + "fixed_factor_u84_core_lp_div2", "gate_clk_spll0_fout2",
> + 1, 2, 0),
> + EIC7700_FACTOR(EIC7700_CLK_FIXED_FACTOR_SCPU_BUS_DIV2,
> + "fixed_factor_scpu_bus_div2",
> + "mux_scpu_core_clk_2mux1_gfree", 1, 2, 0),
> + EIC7700_FACTOR(EIC7700_CLK_FIXED_FACTOR_LPCPU_BUS_DIV2,
> + "fixed_factor_lpcpu_bus_div2",
> + "mux_lpcpu_core_clk_2mux1_gfree", 1, 2, 0),
> + EIC7700_FACTOR(EIC7700_CLK_FIXED_FACTOR_PCIE_CR_DIV2,
> + "fixed_factor_pcie_cr_div2",
> + "mux_syscfg_clk_root_2mux1_gfree", 1, 2, 0),
> + EIC7700_FACTOR(EIC7700_CLK_FIXED_FACTOR_PCIE_AUX_DIV4,
> + "fixed_factor_pcie_aux_div4",
> + "mux_syscfg_clk_root_2mux1_gfree", 1, 4, 0),
> + EIC7700_FACTOR(EIC7700_CLK_FIXED_FACTOR_PVT_DIV20,
> + "fixed_factor_pvt_div20", "xtal24m", 1, 20, 0),
> + EIC7700_FACTOR(EIC7700_CLK_FIXED_FACTOR_HSP_RMII_REF_DIV6,
> + "fixed_factor_hsp_rmii_ref_div6",
> + "fixed_rate_clk_spll1_fout2", 1, 6, 0),
> +};
> +
> +/* mux clocks */
> +static struct eswin_mux_clock eic7700_mux_clks[] = {
> + EIC7700_MUX(EIC7700_CLK_MUX_CPU_ROOT_3MUX1_GFREE,
> + "mux_cpu_root_3mux1_gfree", mux_cpu_root_3mux1_gfree_p,
> + ARRAY_SIZE(mux_cpu_root_3mux1_gfree_p),
> + CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_U84_CTRL, 0, 2, 0),
> + EIC7700_MUX(EIC7700_CLK_MUX_CPU_ACLK_2MUX1_GFREE,
> + "mux_cpu_aclk_2mux1_gfree", mux_cpu_aclk_2mux1_gfree_p,
> + ARRAY_SIZE(mux_cpu_aclk_2mux1_gfree_p),
> + CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_U84_CTRL, 20, 1, 0),
> + EIC7700_MUX(EIC7700_CLK_MUX_DSP_ACLK_ROOT_2MUX1_GFREE,
> + "mux_dsp_aclk_root_2mux1_gfree",
> + dsp_aclk_root_2mux1_gfree_mux_p,
> + ARRAY_SIZE(dsp_aclk_root_2mux1_gfree_mux_p),
> + CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_DSP_ACLK_CTRL, 0, 1,
> + 0),
> + EIC7700_MUX(EIC7700_CLK_MUX_D2D_ACLK_ROOT_2MUX1_GFREE,
> + "mux_d2d_aclk_root_2mux1_gfree",
> + d2d_aclk_root_2mux1_gfree_mux_p,
> + ARRAY_SIZE(d2d_aclk_root_2mux1_gfree_mux_p),
> + CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_D2D_ACLK_CTRL, 0,
> + 1, 0),
> + EIC7700_MUX(EIC7700_CLK_MUX_DDR_ACLK_ROOT_2MUX1_GFREE,
> + "mux_ddr_aclk_root_2mux1_gfree",
> + ddr_aclk_root_2mux1_gfree_mux_p,
> + ARRAY_SIZE(ddr_aclk_root_2mux1_gfree_mux_p),
> + CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_DDR_CTRL, 16, 1, 0),
> + EIC7700_MUX(EIC7700_CLK_MUX_MSHCORE_ROOT_3MUX1_0,
> + "mux_mshcore_root_3mux1_0", mshcore_root_3mux1_0_mux_p,
> + ARRAY_SIZE(mshcore_root_3mux1_0_mux_p), CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_MSHC0_CORE_CTRL, 0, 1, 0),
> + EIC7700_MUX(EIC7700_CLK_MUX_MSHCORE_ROOT_3MUX1_1,
> + "mux_mshcore_root_3mux1_1", mshcore_root_3mux1_1_mux_p,
> + ARRAY_SIZE(mshcore_root_3mux1_1_mux_p), CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_MSHC1_CORE_CTRL, 0, 1, 0),
> + EIC7700_MUX(EIC7700_CLK_MUX_MSHCORE_ROOT_3MUX1_2,
> + "mux_mshcore_root_3mux1_2", mshcore_root_3mux1_2_mux_p,
> + ARRAY_SIZE(mshcore_root_3mux1_2_mux_p), CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_MSHC2_CORE_CTRL, 0, 1, 0),
> + EIC7700_MUX(EIC7700_CLK_MUX_NPU_LLCLK_3MUX1_GFREE,
> + "mux_npu_llclk_3mux1_gfree", npu_llclk_3mux1_gfree_mux_p,
> + ARRAY_SIZE(npu_llclk_3mux1_gfree_mux_p),
> + CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_NPU_LLC_CTRL, 0, 2,
> + 0),
> + EIC7700_MUX(EIC7700_CLK_MUX_NPU_CORE_3MUX1_GFREE,
> + "mux_npu_core_3mux1_gfree", npu_core_3mux1_gfree_mux_p,
> + ARRAY_SIZE(npu_core_3mux1_gfree_mux_p), CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_NPU_CORE_CTRL, 0, 2, 0),
> + EIC7700_MUX(EIC7700_CLK_MUX_NPU_E31_3MUX1_GFREE,
> + "mux_npu_e31_3mux1_gfree", npu_e31_3mux1_gfree_mux_p,
> + ARRAY_SIZE(npu_e31_3mux1_gfree_mux_p), CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_NPU_CORE_CTRL, 8, 2, 0),
> + EIC7700_MUX(EIC7700_CLK_MUX_VI_ACLK_ROOT_2MUX1_GFREE,
> + "mux_vi_aclk_root_2mux1_gfree",
> + vi_aclk_root_2mux1_gfree_mux_p,
> + ARRAY_SIZE(vi_aclk_root_2mux1_gfree_mux_p),
> + CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_VI_ACLK_CTRL, 0, 1,
> + 0),
> + EIC7700_MUX(EIC7700_CLK_MUX_VI_DW_ROOT_2MUX1, "mux_vi_dw_root_2mux1",
> + mux_vi_dw_root_2mux1_p, ARRAY_SIZE(mux_vi_dw_root_2mux1_p),
> + CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_VI_DWCLK_CTRL, 0,
> + 1, 0),
> + EIC7700_MUX(EIC7700_CLK_MUX_VI_DVP_ROOT_2MUX1_GFREE,
> + "mux_vi_dvp_root_2mux1_gfree",
> + mux_vi_dvp_root_2mux1_gfree_p,
> + ARRAY_SIZE(mux_vi_dvp_root_2mux1_gfree_p),
> + CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_VI_DVP_CTRL, 0, 1,
> + 0),
> + EIC7700_MUX(EIC7700_CLK_MUX_VI_DIG_ISP_ROOT_2MUX1_GFREE,
> + "mux_vi_dig_isp_root_2mux1_gfree",
> + mux_vi_dig_isp_root_2mux1_gfree_p,
> + ARRAY_SIZE(mux_vi_dig_isp_root_2mux1_gfree_p),
> + CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_VI_DIG_ISP_CTRL, 0,
> + 1, 0),
> + EIC7700_MUX(EIC7700_CLK_MUX_VO_ACLK_ROOT_2MUX1_GFREE,
> + "mux_vo_aclk_root_2mux1_gfree",
> + mux_vo_aclk_root_2mux1_gfree_p,
> + ARRAY_SIZE(mux_vo_aclk_root_2mux1_gfree_p),
> + CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_VO_ACLK_CTRL, 0, 1,
> + 0),
> + EIC7700_MUX(EIC7700_CLK_MUX_VO_PIXEL_ROOT_2MUX1,
> + "mux_vo_pixel_root_2mux1", mux_vo_pixel_root_2mux1_p,
> + ARRAY_SIZE(mux_vo_pixel_root_2mux1_p), CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_VO_PIXEL_CTRL, 0, 1, 0),
> + EIC7700_MUX(EIC7700_CLK_MUX_VCDEC_ROOT_2MUX1_GFREE,
> + "mux_vcdec_root_2mux1_gfree", mux_vcdec_root_2mux1_gfree_p,
> + ARRAY_SIZE(mux_vcdec_root_2mux1_gfree_p),
> + CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_VCDEC_ROOT_CTRL, 0,
> + 1, 0),
> + EIC7700_MUX(EIC7700_CLK_MUX_VCACLK_ROOT_2MUX1_GFREE,
> + "mux_vcaclk_root_2mux1_gfree",
> + mux_vcaclk_root_2mux1_gfree_p,
> + ARRAY_SIZE(mux_vcaclk_root_2mux1_gfree_p),
> + CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_VC_ACLK_CTRL, 0, 1,
> + 0),
> + EIC7700_MUX(EIC7700_CLK_MUX_SYSCFG_CLK_ROOT_2MUX1_GFREE,
> + "mux_syscfg_clk_root_2mux1_gfree",
> + mux_syscfg_clk_root_2mux1_gfree_p,
> + ARRAY_SIZE(mux_syscfg_clk_root_2mux1_gfree_p),
> + CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_SYSCFG_CTRL, 0, 1,
> + 0),
> + EIC7700_MUX(EIC7700_CLK_MUX_BOOTSPI_CLK_2MUX1_GFREE,
> + "mux_bootspi_clk_2mux1_gfree",
> + mux_bootspi_clk_2mux1_gfree_p,
> + ARRAY_SIZE(mux_bootspi_clk_2mux1_gfree_p),
> + CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_BOOTSPI_CTRL, 0, 1,
> + 0),
> + EIC7700_MUX(EIC7700_CLK_MUX_SCPU_CORE_CLK_2MUX1_GFREE,
> + "mux_scpu_core_clk_2mux1_gfree",
> + mux_scpu_core_clk_2mux1_gfree_p,
> + ARRAY_SIZE(mux_scpu_core_clk_2mux1_gfree_p),
> + CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_SCPU_CORE_CTRL, 0,
> + 1, 0),
> + EIC7700_MUX(EIC7700_CLK_MUX_LPCPU_CORE_CLK_2MUX1_GFREE,
> + "mux_lpcpu_core_clk_2mux1_gfree",
> + mux_lpcpu_core_clk_2mux1_gfree_p,
> + ARRAY_SIZE(mux_lpcpu_core_clk_2mux1_gfree_p),
> + CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_LPCPU_CORE_CTRL, 0,
> + 1, 0),
> + EIC7700_MUX(EIC7700_CLK_MUX_VO_MCLK_2MUX_EXT_MCLK,
> + "mux_vo_mclk_2mux_ext_mclk", mux_vo_mclk_2mux_ext_mclk_p,
> + ARRAY_SIZE(mux_vo_mclk_2mux_ext_mclk_p),
> + CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_VO_MCLK_CTRL, 0, 1,
> + 0),
> + EIC7700_MUX(EIC7700_CLK_MUX_AONDMA_AXI2MUX1_GFREE,
> + "mux_aondma_axi2mux1_gfree", mux_aondma_axi2mux1_gfree_p,
> + ARRAY_SIZE(mux_aondma_axi2mux1_gfree_p),
> + CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_AON_DMA_CTRL, 20,
> + 1, 0),
> + EIC7700_MUX(EIC7700_CLK_MUX_RMII_REF_2MUX, "mux_rmii_ref_2mux1",
> + mux_rmii_ref_2mux1_p, ARRAY_SIZE(mux_rmii_ref_2mux1_p),
> + CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_ETH0_CTRL, 2, 1, 0),
> + EIC7700_MUX(EIC7700_CLK_MUX_ETH_CORE_2MUX1, "mux_eth_core_2mux1",
> + mux_eth_core_2mux1_p, ARRAY_SIZE(mux_eth_core_2mux1_p),
> + CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_ETH0_CTRL, 1, 1, 0),
> + EIC7700_MUX(EIC7700_CLK_MUX_SATA_PHY_2MUX1, "mux_sata_phy_2mux1",
> + mux_sata_phy_2mux1_p, ARRAY_SIZE(mux_sata_phy_2mux1_p),
> + CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_SATA_OOB_CTRL, 9,
> + 1, 0),
> +};
> +
> +/* divider clocks */
> +static struct eswin_divider_clock eic7700_div_clks[] = {
> + EIC7700_DIV(EIC7700_CLK_DIV_SYS_CFG_DYNM, "divider_sys_cfg_div_dynm",
> + "fixed_rate_clk_spll0_fout3", 0,
> + EIC7700_REG_OFFSET_SYSCFG_CTRL, 4, 3,
> + CLK_DIVIDER_ONE_BASED),
> + EIC7700_DIV(EIC7700_CLK_DIV_NOC_NSP_DYNM, "divider_noc_nsp_div_dynm",
> + "fixed_rate_clk_spll2_fout1", 0,
> + EIC7700_REG_OFFSET_NOC_CTRL, 0, 3, CLK_DIVIDER_ONE_BASED),
> + EIC7700_DIV(EIC7700_CLK_DIV_BOOTSPI_DYNM, "divider_bootspi_div_dynm",
> + "gate_clk_spll0_fout2", 0, EIC7700_REG_OFFSET_BOOTSPI_CTRL,
> + 4, 6, CLK_DIVIDER_ONE_BASED),
> + EIC7700_DIV(EIC7700_CLK_DIV_SCPU_CORE_DYNM,
> + "divider_scpu_core_div_dynm", "fixed_rate_clk_spll0_fout1",
> + 0, EIC7700_REG_OFFSET_SCPU_CORE_CTRL, 4, 4,
> + CLK_DIVIDER_ONE_BASED),
> + EIC7700_DIV(EIC7700_CLK_DIV_LPCPU_CORE_DYNM,
> + "divider_lpcpu_core_div_dynm", "fixed_rate_clk_spll0_fout1",
> + 0, EIC7700_REG_OFFSET_LPCPU_CORE_CTRL, 4, 4,
> + CLK_DIVIDER_ONE_BASED),
During testing on top of next-20251219 I got the following:
[ 0.126102] divider_lpcpu_core_div_dynm: Zero divisor and CLK_DIVIDER_ALLOW_ZERO not set
[ 0.126194] WARNING: drivers/clk/clk-divider.c:145 at divider_recalc_rate+0x8a/0x9c, CPU#0: swapper/0/1
Therefore I suggest for above line needing to be:
+ CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO),
> + EIC7700_DIV(EIC7700_CLK_DIV_GPU_ACLK_DYNM, "divider_gpu_aclk_div_dynm",
> + "fixed_rate_clk_spll0_fout1", 0,
> + EIC7700_REG_OFFSET_GPU_ACLK_CTRL, 4, 4,
> + CLK_DIVIDER_ONE_BASED),
> + EIC7700_DIV(EIC7700_CLK_DIV_D2D_ACLK_DYNM, "divider_d2d_aclk_div_dynm",
> + "mux_d2d_aclk_root_2mux1_gfree", 0,
> + EIC7700_REG_OFFSET_D2D_ACLK_CTRL, 4, 4,
> + CLK_DIVIDER_ONE_BASED),
> + EIC7700_DIV(EIC7700_CLK_DIV_DSP_ACLK_DYNM, "divider_dsp_aclk_div_dynm",
> + "mux_d2d_aclk_root_2mux1_gfree", 0,
> + EIC7700_REG_OFFSET_D2D_ACLK_CTRL, 4, 4,
> + CLK_DIVIDER_ONE_BASED),
> + EIC7700_DIV(EIC7700_CLK_DIV_DDR_ACLK_DYNM, "divider_ddr_aclk_div_dynm",
> + "mux_ddr_aclk_root_2mux1_gfree", 0,
> + EIC7700_REG_OFFSET_DDR_CTRL, 20, 4, CLK_DIVIDER_ONE_BASED),
> + EIC7700_DIV(EIC7700_CLK_DIV_HSP_ACLK_DYNM, "divider_hsp_aclk_div_dynm",
> + "fixed_rate_clk_spll0_fout1", 0,
> + EIC7700_REG_OFFSET_HSP_ACLK_CTRL, 4, 4,
> + CLK_DIVIDER_ONE_BASED),
> + EIC7700_DIV(EIC7700_CLK_DIV_ETH_TXCLK_DYNM_0,
> + "divider_eth_txclk_div_dynm_0", "mux_eth_core_2mux1", 0,
> + EIC7700_REG_OFFSET_ETH0_CTRL, 4, 7, CLK_DIVIDER_ONE_BASED),
> + EIC7700_DIV(EIC7700_CLK_DIV_ETH_TXCLK_DYNM_1,
> + "divider_eth_txclk_div_dynm_1", "mux_eth_core_2mux1", 0,
> + EIC7700_REG_OFFSET_ETH1_CTRL, 4, 7, CLK_DIVIDER_ONE_BASED),
> + EIC7700_DIV(EIC7700_CLK_DIV_MSHC_CORE_DYNM_0,
> + "divider_mshc_core_div_dynm_0", "mux_mshcore_root_3mux1_0",
> + 0, EIC7700_REG_OFFSET_MSHC0_CORE_CTRL, 4, 12,
> + CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ROUND_CLOSEST),
> + EIC7700_DIV(EIC7700_CLK_DIV_MSHC_CORE_DYNM_1,
> + "divider_mshc_core_div_dynm_1", "mux_mshcore_root_3mux1_1",
> + 0, EIC7700_REG_OFFSET_MSHC1_CORE_CTRL, 4, 12,
> + CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ROUND_CLOSEST),
> + EIC7700_DIV(EIC7700_CLK_DIV_MSHC_CORE_DYNM_2,
> + "divider_mshc_core_div_dynm_2", "mux_mshcore_root_3mux1_2",
> + 0, EIC7700_REG_OFFSET_MSHC2_CORE_CTRL, 4, 12,
> + CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ROUND_CLOSEST),
> + EIC7700_DIV(EIC7700_CLK_DIV_PCIE_ACLK_DYNM,
> + "divider_pcie_aclk_div_dynm", "fixed_rate_clk_spll2_fout2",
> + 0, EIC7700_REG_OFFSET_PCIE_ACLK_CTRL, 4, 4,
> + CLK_DIVIDER_ONE_BASED),
> + EIC7700_DIV(EIC7700_CLK_DIV_NPU_ACLK_DYNM, "divider_npu_aclk_div_dynm",
> + "fixed_rate_clk_spll0_fout1", 0,
> + EIC7700_REG_OFFSET_NPU_ACLK_CTRL, 4, 4,
> + CLK_DIVIDER_ONE_BASED),
> + EIC7700_DIV(EIC7700_CLK_DIV_NPU_LLC_SRC0_DYNM,
> + "divider_npu_llc_src0_div_dynm",
> + "fixed_rate_clk_spll0_fout1", 0,
> + EIC7700_REG_OFFSET_NPU_LLC_CTRL, 4, 4,
> + CLK_DIVIDER_ONE_BASED),
> + EIC7700_DIV(EIC7700_CLK_DIV_NPU_LLC_SRC1_DYNM,
> + "divider_npu_llc_src1_div_dynm",
> + "fixed_rate_clk_spll2_fout1", 0,
> + EIC7700_REG_OFFSET_NPU_LLC_CTRL, 8, 4,
> + CLK_DIVIDER_ONE_BASED),
> + EIC7700_DIV(EIC7700_CLK_DIV_NPU_CORECLK_DYNM,
> + "divider_npu_coreclk_div_dynm", "mux_npu_core_3mux1_gfree",
> + 0, EIC7700_REG_OFFSET_NPU_CORE_CTRL, 4, 4,
> + CLK_DIVIDER_ONE_BASED),
> + EIC7700_DIV(EIC7700_CLK_DIV_NPU_E31_DYNM, "divider_npu_e31_div_dynm",
> + "mux_npu_e31_3mux1_gfree", 0,
> + EIC7700_REG_OFFSET_NPU_CORE_CTRL, 12, 4,
> + CLK_DIVIDER_ONE_BASED),
> + EIC7700_DIV(EIC7700_CLK_DIV_VI_ACLK_DYNM, "divider_vi_aclk_div_dynm",
> + "mux_vi_aclk_root_2mux1_gfree", 0,
> + EIC7700_REG_OFFSET_VI_ACLK_CTRL, 4, 4,
> + CLK_DIVIDER_ONE_BASED),
> + EIC7700_DIV(EIC7700_CLK_DIV_VI_DW_DYNM, "divider_vi_dw_div_dynm",
> + "mux_vi_dw_root_2mux1", 0,
> + EIC7700_REG_OFFSET_VI_DWCLK_CTRL, 4, 4,
> + CLK_DIVIDER_ONE_BASED),
> + EIC7700_DIV(EIC7700_CLK_DIV_VI_DVP_DYNM, "divider_vi_dvp_div_dynm",
> + "mux_vi_dvp_root_2mux1_gfree", 0,
> + EIC7700_REG_OFFSET_VI_DVP_CTRL, 4, 4,
> + CLK_DIVIDER_ONE_BASED),
> + EIC7700_DIV(EIC7700_CLK_DIV_VI_DIG_ISP_DYNM,
> + "divider_vi_dig_isp_div_dynm",
> + "mux_vi_dig_isp_root_2mux1_gfree", 0,
> + EIC7700_REG_OFFSET_VI_DIG_ISP_CTRL, 4, 4,
> + CLK_DIVIDER_ONE_BASED),
> + EIC7700_DIV(EIC7700_CLK_DIV_VI_SHUTTER_DYNM_0,
> + "divider_vi_shutter_div_dynm_0",
> + "fixed_rate_clk_vpll_fout2", 0,
> + EIC7700_REG_OFFSET_VI_SHUTTER0, 4, 7,
> + CLK_DIVIDER_ONE_BASED),
> + EIC7700_DIV(EIC7700_CLK_DIV_VI_SHUTTER_DYNM_1,
> + "divider_vi_shutter_div_dynm_1",
> + "fixed_rate_clk_vpll_fout2", 0,
> + EIC7700_REG_OFFSET_VI_SHUTTER1, 4, 7,
> + CLK_DIVIDER_ONE_BASED),
> + EIC7700_DIV(EIC7700_CLK_DIV_VI_SHUTTER_DYNM_2,
> + "divider_vi_shutter_div_dynm_2",
> + "fixed_rate_clk_vpll_fout2", 0,
> + EIC7700_REG_OFFSET_VI_SHUTTER2, 4, 7,
> + CLK_DIVIDER_ONE_BASED),
> + EIC7700_DIV(EIC7700_CLK_DIV_VI_SHUTTER_DYNM_3,
> + "divider_vi_shutter_div_dynm_3",
> + "fixed_rate_clk_vpll_fout2", 0,
> + EIC7700_REG_OFFSET_VI_SHUTTER3, 4, 7,
> + CLK_DIVIDER_ONE_BASED),
> + EIC7700_DIV(EIC7700_CLK_DIV_VI_SHUTTER_DYNM_4,
> + "divider_vi_shutter_div_dynm_4",
> + "fixed_rate_clk_vpll_fout2", 0,
> + EIC7700_REG_OFFSET_VI_SHUTTER4, 4, 7,
> + CLK_DIVIDER_ONE_BASED),
> + EIC7700_DIV(EIC7700_CLK_DIV_VI_SHUTTER_DYNM_5,
> + "divider_vi_shutter_div_dynm_5",
> + "fixed_rate_clk_vpll_fout2", 0,
> + EIC7700_REG_OFFSET_VI_SHUTTER5, 4, 7,
> + CLK_DIVIDER_ONE_BASED),
> + EIC7700_DIV(EIC7700_CLK_DIV_VO_ACLK_DYNM, "divider_vo_aclk_div_dynm",
> + "mux_vo_aclk_root_2mux1_gfree", 0,
> + EIC7700_REG_OFFSET_VO_ACLK_CTRL, 4, 4,
> + CLK_DIVIDER_ONE_BASED),
> + EIC7700_DIV(EIC7700_CLK_DIV_IESMCLK_DYNM, "divider_iesmclk_div_dynm",
> + "fixed_rate_clk_spll0_fout3", 0,
> + EIC7700_REG_OFFSET_VO_IESMCLK_CTRL, 4, 4,
> + CLK_DIVIDER_ONE_BASED),
> + EIC7700_DIV(EIC7700_CLK_DIV_VO_PIXEL_DYNM, "divider_vo_pixel_div_dynm",
> + "mux_vo_pixel_root_2mux1", 0,
> + EIC7700_REG_OFFSET_VO_PIXEL_CTRL, 4, 6,
> + CLK_DIVIDER_ONE_BASED),
> + EIC7700_DIV(EIC7700_CLK_DIV_VO_MCLK_DYNM, "divider_vo_mclk_div_dynm",
> + "clk_apll_fout1", 0, EIC7700_REG_OFFSET_VO_MCLK_CTRL, 4, 8,
> + CLK_DIVIDER_ONE_BASED),
> + EIC7700_DIV(EIC7700_CLK_DIV_VO_CEC_DYNM, "divider_vo_cec_div_dynm",
> + "fixed_rate_clk_vpll_fout2", 0,
> + EIC7700_REG_OFFSET_VO_PHY_CLKCTRL, 16, 16,
> + CLK_DIVIDER_ROUND_CLOSEST),
> + EIC7700_DIV(EIC7700_CLK_DIV_VC_ACLK_DYNM, "divider_vc_aclk_div_dynm",
> + "mux_vcaclk_root_2mux1_gfree", 0,
> + EIC7700_REG_OFFSET_VC_ACLK_CTRL, 4, 4,
> + CLK_DIVIDER_ONE_BASED),
> + EIC7700_DIV(EIC7700_CLK_DIV_JD_DYNM, "divider_jd_div_dynm",
> + "mux_vcdec_root_2mux1_gfree", 0, EIC7700_REG_OFFSET_JD_CTRL,
> + 4, 4, CLK_DIVIDER_ONE_BASED),
> + EIC7700_DIV(EIC7700_CLK_DIV_JE_DYNM, "divider_je_div_dynm",
> + "mux_vcdec_root_2mux1_gfree", 0, EIC7700_REG_OFFSET_JE_CTRL,
> + 4, 4, CLK_DIVIDER_ONE_BASED),
> + EIC7700_DIV(EIC7700_CLK_DIV_VE_DYNM, "divider_ve_div_dynm",
> + "mux_vcdec_root_2mux1_gfree", 0, EIC7700_REG_OFFSET_VE_CTRL,
> + 4, 4, CLK_DIVIDER_ONE_BASED),
> + EIC7700_DIV(EIC7700_CLK_DIV_VD_DYNM, "divider_vd_div_dynm",
> + "mux_vcdec_root_2mux1_gfree", 0, EIC7700_REG_OFFSET_VD_CTRL,
> + 4, 4, CLK_DIVIDER_ONE_BASED),
> + EIC7700_DIV(EIC7700_CLK_DIV_G2D_DYNM, "divider_g2d_div_dynm",
> + "mux_dsp_aclk_root_2mux1_gfree", 0,
> + EIC7700_REG_OFFSET_G2D_CTRL, 4, 4, CLK_DIVIDER_ONE_BASED),
> + EIC7700_DIV(EIC7700_CLK_DIV_AONDMA_AXI_DYNM,
> + "divider_aondma_axi_div_dynm", "fixed_rate_clk_spll0_fout1",
> + 0, EIC7700_REG_OFFSET_AON_DMA_CTRL, 4, 4,
> + CLK_DIVIDER_ONE_BASED),
> + EIC7700_DIV(EIC7700_CLK_DIV_CRYPTO_DYNM, "divider_crypto_div_dynm",
> + "fixed_rate_clk_spll0_fout1", 0,
> + EIC7700_REG_OFFSET_SPACC_CTRL, 4, 4, CLK_DIVIDER_ONE_BASED),
> + EIC7700_DIV(EIC7700_CLK_DIV_SATA_PHY_REF_DYNM,
> + "divider_sata_phy_ref_div_dynm",
> + "fixed_rate_clk_spll1_fout2", 0,
> + EIC7700_REG_OFFSET_SATA_OOB_CTRL, 0, 4,
> + CLK_DIVIDER_ONE_BASED),
> + EIC7700_DIV(EIC7700_CLK_DIV_DSP_0_ACLK_DYNM,
> + "divider_dsp_0_aclk_div_dynm", "gate_dspt_aclk", 0,
> + EIC7700_REG_OFFSET_DSP_CFG_CTRL, 19, 1, 0),
> + EIC7700_DIV(EIC7700_CLK_DIV_DSP_1_ACLK_DYNM,
> + "divider_dsp_1_aclk_div_dynm", "gate_dspt_aclk", 0,
> + EIC7700_REG_OFFSET_DSP_CFG_CTRL, 20, 1, 0),
> + EIC7700_DIV(EIC7700_CLK_DIV_DSP_2_ACLK_DYNM,
> + "divider_dsp_2_aclk_div_dynm", "gate_dspt_aclk", 0,
> + EIC7700_REG_OFFSET_DSP_CFG_CTRL, 21, 1, 0),
> + EIC7700_DIV(EIC7700_CLK_DIV_DSP_3_ACLK_DYNM,
> + "divider_dsp_3_aclk_div_dynm", "gate_dspt_aclk", 0,
> + EIC7700_REG_OFFSET_DSP_CFG_CTRL, 22, 1, 0),
> + EIC7700_DIV(EIC7700_CLK_DIV_AON_RTC_DYNM, "divider_aon_rtc_div_dynm",
> + "fixed_factor_clk_1m_div24", 0, EIC7700_REG_OFFSET_RTC_CTRL,
> + 21, 11, CLK_DIVIDER_ONE_BASED),
> + EIC7700_DIV(EIC7700_CLK_DIV_U84_RTC_TOGGLE_DYNM,
> + "divider_u84_rtc_toggle_dynm", "xtal24m", 0,
> + EIC7700_REG_OFFSET_RTC_CTRL, 16, 5,
> + CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ROUND_CLOSEST),
> + EIC7700_DIV(EIC7700_CLK_DIV_NOC_WDREF_DYNM, "divider_noc_wdref_dynm",
> + "xtal24m", 0, EIC7700_REG_OFFSET_NOC_CTRL, 4, 16,
> + CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ROUND_CLOSEST),
> +};
> +
> +/* gate clocks */
> +static struct eswin_gate_clock eic7700_gate_clks[] = {
> + EIC7700_GATE(EIC7700_CLK_GATE_CPU_EXT_SRC_CORE_CLK_0,
> + "gate_clk_cpu_ext_src_core_clk_0",
> + "mux_cpu_root_3mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_U84_CTRL, 28, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_CPU_EXT_SRC_CORE_CLK_1,
> + "gate_clk_cpu_ext_src_core_clk_1",
> + "mux_cpu_root_3mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_U84_CTRL, 29, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_CPU_EXT_SRC_CORE_CLK_2,
> + "gate_clk_cpu_ext_src_core_clk_2",
> + "mux_cpu_root_3mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_U84_CTRL, 30, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_CPU_EXT_SRC_CORE_CLK_3,
> + "gate_clk_cpu_ext_src_core_clk_3",
> + "mux_cpu_root_3mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_U84_CTRL, 31, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_CPU_TRACE_CLK_0,
> + "gate_clk_cpu_trace_clk_0", "mux_cpu_root_3mux1_gfree",
> + CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_U84_CTRL, 24, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_CPU_TRACE_CLK_1,
> + "gate_clk_cpu_trace_clk_1", "mux_cpu_root_3mux1_gfree",
> + CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_U84_CTRL, 25, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_CPU_TRACE_CLK_2,
> + "gate_clk_cpu_trace_clk_2", "mux_cpu_root_3mux1_gfree",
> + CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_U84_CTRL, 26, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_CPU_TRACE_CLK_3,
> + "gate_clk_cpu_trace_clk_3", "mux_cpu_root_3mux1_gfree",
> + CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_U84_CTRL, 27, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_CPU_TRACE_COM_CLK,
> + "gate_clk_cpu_trace_com_clk", "mux_cpu_aclk_2mux1_gfree",
> + CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_U84_CTRL, 23, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_SPLL0_FOUT2, "gate_clk_spll0_fout2",
> + "fixed_rate_clk_spll0_fout2", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_SPLL0_CFG_2, 31, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_NOC_NSP_CLK, "gate_noc_nsp_clk",
> + "divider_noc_nsp_div_dynm", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_NOC_CTRL, 31, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_BOOTSPI, "gate_clk_bootspi",
> + "mux_bootspi_clk_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_BOOTSPI_CTRL, 31, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_BOOTSPI_CFG, "gate_clk_bootspi_cfg",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_BOOTSPI_CFGCLK_CTRL, 31, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_SCPU_CORE, "gate_clk_scpu_core",
> + "mux_scpu_core_clk_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_SCPU_CORE_CTRL, 31, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_SCPU_BUS, "gate_clk_scpu_bus",
> + "fixed_factor_scpu_bus_div2", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_SCPU_BUSCLK_CTRL, 31, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_LPCPU_CORE, "gate_clk_lpcpu_core",
> + "mux_lpcpu_core_clk_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_LPCPU_CORE_CTRL, 31, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_LPCPU_BUS, "gate_clk_lpcpu_bus",
> + "fixed_factor_lpcpu_bus_div2", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_LPCPU_BUSCLK_CTRL, 31, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_GPU_ACLK, "gate_gpu_aclk",
> + "divider_gpu_aclk_div_dynm", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_GPU_ACLK_CTRL, 31, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_GPU_GRAY_CLK, "gate_gpu_gray_clk",
> + "xtal24m", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_GPU_GRAY_CTRL, 31, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_GPU_CFG_CLK, "gate_gpu_cfg_clk",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_GPU_CFG_CTRL, 31, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_DSPT_ACLK, "gate_dspt_aclk",
> + "divider_dsp_aclk_div_dynm", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_DSP_ACLK_CTRL, 31, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_DSPT_CFG_CLK, "gate_dspt_cfg_clk",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_DSP_CFG_CTRL, 31, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_D2D_ACLK, "gate_d2d_aclk",
> + "divider_d2d_aclk_div_dynm", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_D2D_ACLK_CTRL, 31, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_D2D_CFG_CLK, "gate_d2d_cfg_clk",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_D2D_CFG_CTRL, 31, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_TCU_ACLK, "gate_tcu_aclk",
> + "divider_ddr_aclk_div_dynm", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_TCU_ACLK_CTRL, 31, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_TCU_CFG_CLK, "gate_tcu_cfg_clk",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_TCU_CFG_CTRL, 31, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_DDRT_CFG_CLK, "gate_ddrt_cfg_clk",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_DDR_CTRL, 9, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_DDRT0_P0_ACLK, "gate_ddrt0_p0_aclk",
> + "divider_ddr_aclk_div_dynm", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_DDR_CTRL, 4, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_DDRT0_P1_ACLK, "gate_ddrt0_p1_aclk",
> + "divider_ddr_aclk_div_dynm", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_DDR_CTRL, 5, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_DDRT0_P2_ACLK, "gate_ddrt0_p2_aclk",
> + "divider_ddr_aclk_div_dynm", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_DDR_CTRL, 6, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_DDRT0_P3_ACLK, "gate_ddrt0_p3_aclk",
> + "divider_ddr_aclk_div_dynm", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_DDR_CTRL, 7, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_DDRT0_P4_ACLK, "gate_ddrt0_p4_aclk",
> + "divider_ddr_aclk_div_dynm", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_DDR_CTRL, 8, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_DDRT1_P0_ACLK, "gate_ddrt1_p0_aclk",
> + "divider_ddr_aclk_div_dynm", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_DDR1_CTRL, 4, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_DDRT1_P1_ACLK, "gate_ddrt1_p1_aclk",
> + "divider_ddr_aclk_div_dynm", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_DDR1_CTRL, 5, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_DDRT1_P2_ACLK, "gate_ddrt1_p2_aclk",
> + "divider_ddr_aclk_div_dynm", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_DDR1_CTRL, 6, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_DDRT1_P3_ACLK, "gate_ddrt1_p3_aclk",
> + "divider_ddr_aclk_div_dynm", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_DDR1_CTRL, 7, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_DDRT1_P4_ACLK, "gate_ddrt1_p4_aclk",
> + "divider_ddr_aclk_div_dynm", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_DDR1_CTRL, 8, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_HSP_ACLK, "gate_clk_hsp_aclk",
> + "divider_hsp_aclk_div_dynm", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_HSP_ACLK_CTRL, 31, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_HSP_CFG_CLK, "gate_clk_hsp_cfg_clk",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_HSP_CFG_CTRL, 31, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_PCIET_ACLK, "gate_pciet_aclk",
> + "divider_pcie_aclk_div_dynm", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_PCIE_ACLK_CTRL, 31, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_PCIET_CFG_CLK, "gate_pciet_cfg_clk",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_PCIE_CFG_CTRL, 31, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_PCIET_CR_CLK, "gate_pciet_cr_clk",
> + "fixed_factor_pcie_cr_div2", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_PCIE_CFG_CTRL, 0, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_PCIET_AUX_CLK, "gate_pciet_aux_clk",
> + "fixed_factor_pcie_aux_div4", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_PCIE_CFG_CTRL, 1, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_NPU_ACLK, "gate_npu_aclk",
> + "divider_npu_aclk_div_dynm", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_NPU_ACLK_CTRL, 31, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_NPU_CFG_CLK, "gate_npu_cfg_clk",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_NPU_ACLK_CTRL, 30, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_NPU_LLC_ACLK, "gate_npu_llc_aclk",
> + "mux_npu_llclk_3mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_NPU_LLC_CTRL, 31, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_NPU_CLK, "gate_npu_clk",
> + "divider_npu_coreclk_div_dynm", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_NPU_CORE_CTRL, 31, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_NPU_E31_CLK, "gate_npu_e31_clk",
> + "divider_npu_e31_div_dynm", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_NPU_CORE_CTRL, 30, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_VI_ACLK, "gate_vi_aclk",
> + "divider_vi_aclk_div_dynm", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_VI_ACLK_CTRL, 31, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_VI_CFG_CLK, "gate_vi_cfg_clk",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_VI_ACLK_CTRL, 30, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_VI_DIG_DW_CLK, "gate_vi_dig_dw_clk",
> + "divider_vi_dw_div_dynm", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_VI_DWCLK_CTRL, 31, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_VI_DVP_CLK, "gate_vi_dvp_clk",
> + "divider_vi_dvp_div_dynm", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_VI_DVP_CTRL, 31, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_VI_DIG_ISP_CLK, "gate_vi_dig_isp_clk",
> + "divider_vi_dig_isp_div_dynm", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_VI_DIG_ISP_CTRL, 31, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_VI_SHUTTER_0, "gate_vi_shutter_0",
> + "divider_vi_shutter_div_dynm_0", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_VI_SHUTTER0, 31, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_VI_SHUTTER_1, "gate_vi_shutter_1",
> + "divider_vi_shutter_div_dynm_1", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_VI_SHUTTER1, 31, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_VI_SHUTTER_2, "gate_vi_shutter_2",
> + "divider_vi_shutter_div_dynm_2", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_VI_SHUTTER2, 31, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_VI_SHUTTER_3, "gate_vi_shutter_3",
> + "divider_vi_shutter_div_dynm_3", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_VI_SHUTTER3, 31, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_VI_SHUTTER_4, "gate_vi_shutter_4",
> + "divider_vi_shutter_div_dynm_4", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_VI_SHUTTER4, 31, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_VI_SHUTTER_5, "gate_vi_shutter_5",
> + "divider_vi_shutter_div_dynm_5", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_VI_SHUTTER5, 31, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_VI_PHY_TXCLKESC, "gate_vi_phy_txclkesc",
> + "fixed_factor_mipi_txesc_div10", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_VI_PHY_CTRL, 0, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_VI_PHY_CFG, "gate_vi_phy_cfg", "xtal24m",
> + CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_VI_PHY_CTRL, 1, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_VO_ACLK, "gate_vo_aclk",
> + "divider_vo_aclk_div_dynm", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_VO_ACLK_CTRL, 31, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_VO_CFG_CLK, "gate_vo_cfg_clk",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_VO_ACLK_CTRL, 30, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_VO_HDMI_IESMCLK, "gate_vo_hdmi_iesmclk",
> + "divider_iesmclk_div_dynm", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_VO_IESMCLK_CTRL, 31, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_VO_PIXEL_CLK, "gate_vo_pixel_clk",
> + "divider_vo_pixel_div_dynm", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_VO_PIXEL_CTRL, 31, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_VO_I2S_MCLK, "gate_vo_i2s_mclk",
> + "mux_vo_mclk_2mux_ext_mclk", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_VO_MCLK_CTRL, 31, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_VO_CR_CLK, "gate_vo_cr_clk",
> + "fixed_factor_mipi_txesc_div10", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_VO_PHY_CLKCTRL, 1, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_VC_ACLK, "gate_vc_aclk",
> + "divider_vc_aclk_div_dynm", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_VC_ACLK_CTRL, 31, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_VC_CFG_CLK, "gate_vc_cfg_clk",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_VC_CLKEN_CTRL, 0, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_VC_JE_CLK, "gate_vc_je_clk",
> + "divider_je_div_dynm", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_JE_CTRL, 31, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_VC_JD_CLK, "gate_vc_jd_clk",
> + "divider_jd_div_dynm", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_JD_CTRL, 31, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_VC_VE_CLK, "gate_vc_ve_clk",
> + "divider_ve_div_dynm", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_VE_CTRL, 31, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_VC_VD_CLK, "gate_vc_vd_clk",
> + "divider_vd_div_dynm", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_VD_CTRL, 31, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_G2D_CFG_CLK, "gate_g2d_cfg_clk",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_G2D_CTRL, 28, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_G2D_CLK, "gate_g2d_clk",
> + "divider_g2d_div_dynm", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_G2D_CTRL, 30, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_G2D_ACLK, "gate_g2d_aclk",
> + "divider_g2d_div_dynm", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_G2D_CTRL, 31, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_AONDMA_CFG, "gate_clk_aondma_cfg",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_AON_DMA_CTRL, 30, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_AONDMA_ACLK, "gate_aondma_aclk",
> + "mux_aondma_axi2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_AON_DMA_CTRL, 31, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_AON_ACLK, "gate_aon_aclk",
> + "mux_aondma_axi2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_AON_DMA_CTRL, 29, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_TIMER_CLK_0, "gate_time_clk_0", "xtal24m",
> + CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_TIMER_CTRL, 0, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_TIMER_CLK_1, "gate_time_clk_1", "xtal24m",
> + CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_TIMER_CTRL, 1, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_TIMER_CLK_2, "gate_time_clk_2", "xtal24m",
> + CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_TIMER_CTRL, 2, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_TIMER_CLK_3, "gate_time_clk_3", "xtal24m",
> + CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_TIMER_CTRL, 3, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_TIMER_PCLK_0, "gate_timer_pclk_0",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_TIMER_CTRL, 4, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_TIMER_PCLK_1, "gate_timer_pclk_1",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_TIMER_CTRL, 5, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_TIMER_PCLK_2, "gate_timer_pclk_2",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_TIMER_CTRL, 6, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_TIMER_PCLK_3, "gate_timer_pclk_3",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_TIMER_CTRL, 7, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_TIMER3_CLK8, "gate_timer3_clk8",
> + "fixed_rate_clk_vpll_fout3", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_TIMER_CTRL, 8, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_RTC_CFG, "gate_clk_rtc_cfg",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_RTC_CTRL, 2, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_RTC, "gate_clk_rtc",
> + "divider_aon_rtc_div_dynm", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_RTC_CTRL, 1, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_PKA_CFG, "gate_clk_pka_cfg",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_PKA_CTRL, 31, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_SPACC_CFG, "gate_clk_spacc_cfg",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_SPACC_CTRL, 31, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_CRYPTO, "gate_clk_crypto",
> + "divider_crypto_div_dynm", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_SPACC_CTRL, 30, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_TRNG_CFG, "gate_clk_trng_cfg",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_TRNG_CTRL, 31, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_OTP_CFG, "gate_clk_otp_cfg",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_OTP_CTRL, 31, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_MAILBOX_0, "gate_clk_mailbox_0",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_LSP_EN1, 0, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_MAILBOX_1, "gate_clk_mailbox_1",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_LSP_EN1, 1, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_MAILBOX_2, "gate_clk_mailbox_2",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_LSP_EN1, 2, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_MAILBOX_3, "gate_clk_mailbox_3",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_LSP_EN1, 3, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_MAILBOX_4, "gate_clk_mailbox_4",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_LSP_EN1, 4, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_MAILBOX_5, "gate_clk_mailbox_5",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_LSP_EN1, 5, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_MAILBOX_6, "gate_clk_mailbox_6",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_LSP_EN1, 6, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_MAILBOX_7, "gate_clk_mailbox_7",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_LSP_EN1, 7, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_MAILBOX_8, "gate_clk_mailbox_8",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_LSP_EN1, 8, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_MAILBOX_9, "gate_clk_mailbox_9",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_LSP_EN1, 9, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_MAILBOX_10, "gate_clk_mailbox_10",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_LSP_EN1, 10, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_MAILBOX_11, "gate_clk_mailbox_11",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_LSP_EN1, 11, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_MAILBOX_12, "gate_clk_mailbox_12",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_LSP_EN1, 12, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_MAILBOX_13, "gate_clk_mailbox_13",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_LSP_EN1, 13, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_MAILBOX_14, "gate_clk_mailbox_14",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_LSP_EN1, 14, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_MAILBOX_15, "gate_clk_mailbox_15",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_LSP_EN1, 15, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_LSP_I2C0_PCLK, "gate_i2c0_pclk",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_LSP_EN0, 7, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_LSP_I2C1_PCLK, "gate_i2c1_pclk",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_LSP_EN0, 8, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_LSP_I2C2_PCLK, "gate_i2c2_pclk",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_LSP_EN0, 9, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_LSP_I2C3_PCLK, "gate_i2c3_pclk",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_LSP_EN0, 10, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_LSP_I2C4_PCLK, "gate_i2c4_pclk",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_LSP_EN0, 11, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_LSP_I2C5_PCLK, "gate_i2c5_pclk",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_LSP_EN0, 12, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_LSP_I2C6_PCLK, "gate_i2c6_pclk",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_LSP_EN0, 13, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_LSP_I2C7_PCLK, "gate_i2c7_pclk",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_LSP_EN0, 14, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_LSP_I2C8_PCLK, "gate_i2c8_pclk",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_LSP_EN0, 15, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_LSP_I2C9_PCLK, "gate_i2c9_pclk",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_LSP_EN0, 16, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_LSP_WDT0_PCLK, "gate_lsp_wdt0_pclk",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_LSP_EN0, 28, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_LSP_WDT1_PCLK, "gate_lsp_wdt1_pclk",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_LSP_EN0, 29, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_LSP_WDT2_PCLK, "gate_lsp_wdt2_pclk",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_LSP_EN0, 30, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_LSP_WDT3_PCLK, "gate_lsp_wdt3_pclk",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_LSP_EN0, 31, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_LSP_SSI0_PCLK, "gate_lsp_ssi0_pclk",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_LSP_EN0, 26, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_LSP_SSI1_PCLK, "gate_lsp_ssi1_pclk",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_LSP_EN0, 27, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_LSP_UART0_PCLK, "gate_lsp_uart0_pclk",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_LSP_EN0, 17, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_LSP_UART1_PCLK, "gate_lsp_uart1_pclk",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_LSP_EN0, 18, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_LSP_UART2_PCLK, "gate_lsp_uart2_pclk",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_LSP_EN0, 19, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_LSP_UART3_PCLK, "gate_lsp_uart3_pclk",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_LSP_EN0, 20, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_LSP_UART4_PCLK, "gate_lsp_uart4_pclk",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_LSP_EN0, 21, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_LSP_TIMER_PCLK, "gate_lsp_timer_pclk",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_LSP_EN0, 25, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_LSP_FAN_PCLK, "gate_lsp_fan_pclk",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_LSP_EN0, 0, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_LSP_PVT_PCLK, "gate_lsp_pvt_pclk",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_LSP_EN0, 1, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_LSP_PVT0_CLK, "gate_pvt0_clk",
> + "fixed_factor_pvt_div20", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_LSP_EN1, 16, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_LSP_PVT1_CLK, "gate_pvt1_clk",
> + "fixed_factor_pvt_div20", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_LSP_EN1, 17, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_VC_JE_PCLK, "gate_vc_je_pclk",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_VC_CLKEN_CTRL, 2, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_VC_JD_PCLK, "gate_vc_jd_pclk",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_VC_CLKEN_CTRL, 1, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_VC_VE_PCLK, "gate_vc_ve_pclk",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_VC_CLKEN_CTRL, 5, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_VC_VD_PCLK, "gate_vc_vd_pclk",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_VC_CLKEN_CTRL, 4, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_VC_MON_PCLK, "gate_vc_mon_pclk",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_VC_CLKEN_CTRL, 3, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_HSP_MSHC0_CORE_CLK,
> + "gate_hsp_mshc0_core_clk", "divider_mshc_core_div_dynm_0",
> + CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_MSHC0_CORE_CTRL,
> + 16, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_HSP_MSHC1_CORE_CLK,
> + "gate_hsp_mshc1_core_clk", "divider_mshc_core_div_dynm_1",
> + CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_MSHC1_CORE_CTRL,
> + 16, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_HSP_MSHC2_CORE_CLK,
> + "gate_hsp_mshc2_core_clk", "divider_mshc_core_div_dynm_2",
> + CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_MSHC2_CORE_CTRL,
> + 16, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_HSP_SATA_RBC_CLK, "gate_hsp_sata_rbc_clk",
> + "fixed_rate_clk_spll1_fout2", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_SATA_RBC_CTRL, 0, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_HSP_SATA_OOB_CLK, "gate_hsp_sata_oob_clk",
> + "mux_sata_phy_2mux1", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_SATA_OOB_CTRL, 31, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_HSP_DMA0_CLK_TEST,
> + "gate_hsp_dma0_clk_test", "gate_clk_hsp_aclk",
> + CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_HSP_ACLK_CTRL, 1,
> + 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_HSP_DMA0_CLK, "gate_hsp_dma0_clk",
> + "gate_clk_hsp_aclk", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_HSP_ACLK_CTRL, 0, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_HSP_ETH0_CORE_CLK,
> + "gate_hsp_eth0_core_clk", "divider_eth_txclk_div_dynm_0",
> + CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_ETH0_CTRL, 0, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_HSP_ETH1_CORE_CLK,
> + "gate_hsp_eth1_core_clk", "divider_eth_txclk_div_dynm_1",
> + CLK_SET_RATE_PARENT, EIC7700_REG_OFFSET_ETH1_CTRL, 0, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_HSP_RMII_REF_0, "gate_hsp_rmii_ref_0",
> + "mux_rmii_ref_2mux1", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_ETH0_CTRL, 31, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_HSP_RMII_REF_1, "gate_hsp_rmii_ref_1",
> + "mux_rmii_ref_2mux1", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_ETH1_CTRL, 31, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_AON_I2C0_PCLK, "gate_aon_i2c0_pclk",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_I2C0_CTRL, 31, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_AON_I2C1_PCLK, "gate_aon_i2c1_pclk",
> + "mux_syscfg_clk_root_2mux1_gfree", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_I2C1_CTRL, 31, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_DDR0_TRACE, "gate_ddr0_trace",
> + "divider_ddr_aclk_div_dynm", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_DDR_CTRL, 0, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_DDR1_TRACE, "gate_ddr1_trace",
> + "divider_ddr_aclk_div_dynm", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_DDR1_CTRL, 0, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_RNOC_NSP, "gate_rnoc_nsp",
> + "divider_noc_nsp_div_dynm", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_NOC_CTRL, 29, 0),
> + EIC7700_GATE(EIC7700_CLK_GATE_NOC_WDREF, "gate_noc_wdref",
> + "divider_noc_wdref_dynm", CLK_SET_RATE_PARENT,
> + EIC7700_REG_OFFSET_NOC_CTRL, 30, 0),
> +};
> +
> +/*
> + * This clock notifier is called when the rate of clk_pll_cpu clock is to be
> + * changed. The mux_cpu_root_3mux1_gfree clock should save the current parent
> + * clock and switch its parent clock to fixed_factor_u84_core_lp_div2 before
> + * clk_pll_cpu rate will be changed. Then switch its parent clock back after
> + * the clk_pll_cpu rate is completed.
> + */
> +static int eic7700_clk_pll_cpu_notifier_cb(struct notifier_block *nb,
> + unsigned long action, void *data)
> +{
> + struct eswin_clock_data *pdata;
> + struct clk_hw *mux_clk;
> + struct clk_hw *lp_clk;
> + int ret = 0;
> +
> + pdata = container_of(nb, struct eswin_clock_data, pll_nb);
> + mux_clk = pdata->clk_data.hws[EIC7700_CLK_MUX_CPU_ROOT_3MUX1_GFREE];
> + lp_clk = pdata->clk_data.hws[EIC7700_CLK_FIXED_FACTOR_U84_CORE_LP_DIV2];
> +
> + if (action == PRE_RATE_CHANGE) {
> + pdata->original_clk = clk_hw_get_parent(mux_clk);
> + ret = clk_hw_set_parent(mux_clk, lp_clk);
> + } else if (action == POST_RATE_CHANGE) {
> + ret = clk_hw_set_parent(mux_clk, pdata->original_clk);
> + }
> +
> + return notifier_from_errno(ret);
> +}
> +
> +static int eic7700_clk_probe(struct platform_device *pdev)
> +{
> + struct eswin_clock_data *clk_data;
> + struct device *dev = &pdev->dev;
> + struct clk *pll_clk;
> + int ret;
> +
> + clk_data = eswin_clk_init(dev, EIC7700_NR_CLKS);
> + if (!clk_data)
> + return dev_err_probe(dev, -EAGAIN, "failed to get clk data!\n");
> +
> + ret = eswin_clk_register_fixed_rate(eic7700_fixed_rate_clks,
> + ARRAY_SIZE(eic7700_fixed_rate_clks),
> + clk_data, dev);
> + if (ret)
> + return ret;
> +
> + ret = eswin_clk_register_pll(eic7700_pll_clks,
> + ARRAY_SIZE(eic7700_pll_clks),
> + clk_data, dev);
> + if (ret)
> + return ret;
> +
> + pll_clk = devm_clk_hw_get_clk
> + (dev, clk_data->clk_data.hws[EIC7700_CLK_PLL_CPU],
> + "clk_pll_cpu");
> + if (IS_ERR(pll_clk))
> + return dev_err_probe(dev, PTR_ERR(pll_clk),
> + "failed to get pll clock\n");
> +
> + clk_data->pll_nb.notifier_call = eic7700_clk_pll_cpu_notifier_cb;
> + ret = devm_clk_notifier_register(dev, pll_clk, &clk_data->pll_nb);
> + if (ret)
> + return ret;
> +
> + ret = eswin_clk_register_fixed_factor
> + (eic7700_fixed_factor_clks,
> + ARRAY_SIZE(eic7700_fixed_factor_clks), clk_data, dev);
> + if (ret)
> + return ret;
> +
> + ret = eswin_clk_register_mux(eic7700_mux_clks,
> + ARRAY_SIZE(eic7700_mux_clks), clk_data,
> + dev);
> + if (ret)
> + return ret;
> +
> + ret = eswin_clk_register_divider(eic7700_div_clks,
> + ARRAY_SIZE(eic7700_div_clks),
> + clk_data, dev);
> + if (ret)
> + return ret;
> +
> + ret = eswin_clk_register_gate(eic7700_gate_clks,
> + ARRAY_SIZE(eic7700_gate_clks), clk_data,
> + dev);
> + if (ret)
> + return ret;
> +
> + return devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get,
> + &clk_data->clk_data);
> +}
> +
> +static const struct of_device_id eic7700_clock_dt_ids[] = {
> + { .compatible = "eswin,eic7700-clock", },
> + { /* sentinel */ }
> +};
> +MODULE_DEVICE_TABLE(of, eic7700_clock_dt_ids);
> +
> +static struct platform_driver eic7700_clock_driver = {
> + .probe = eic7700_clk_probe,
> + .driver = {
> + .name = "eic7700-clock",
> + .of_match_table = eic7700_clock_dt_ids,
> + },
> +};
> +module_platform_driver(eic7700_clock_driver);
> +
> +MODULE_LICENSE("GPL");
> +MODULE_AUTHOR("Yifeng Huang<huangyifeng@eswincomputing.com>");
> +MODULE_AUTHOR("Xuyang Dong<dongxuyang@eswincomputing.com>");
> +MODULE_DESCRIPTION("ESWIN EIC7700 clock controller driver");
> diff --git a/drivers/clk/eswin/clk-eic7700.h b/drivers/clk/eswin/clk-eic7700.h
> new file mode 100644
> index 000000000000..625b12306aa3
> --- /dev/null
> +++ b/drivers/clk/eswin/clk-eic7700.h
> @@ -0,0 +1,122 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
> +/*
> + * Copyright 2025, Beijing ESWIN Computing Technology Co., Ltd..
> + * All rights reserved.
> + *
> + * Authors:
> + * Yifeng Huang <huangyifeng@eswincomputing.com>
> + * xuyang Dong <dongxuyang@eswincomputing.com>
> + */
> +
> +#ifndef __CLK_EIC7700_H__
> +#define __CLK_EIC7700_H__
> +
> +/* REG OFFSET OF SYS-CRG */
> +#define EIC7700_REG_OFFSET_SPLL0_CFG_0 0x0
> +#define EIC7700_REG_OFFSET_SPLL0_CFG_1 0x4
> +#define EIC7700_REG_OFFSET_SPLL0_CFG_2 0x8
> +#define EIC7700_REG_OFFSET_SPLL0_DSKEWCAL 0xC
> +#define EIC7700_REG_OFFSET_SPLL0_SSC 0x10
> +#define EIC7700_REG_OFFSET_SPLL1_CFG_0 0x14
> +#define EIC7700_REG_OFFSET_SPLL1_CFG_1 0x18
> +#define EIC7700_REG_OFFSET_SPLL1_CFG_2 0x1C
> +#define EIC7700_REG_OFFSET_SPLL1_DSKEWCAL 0x20
> +#define EIC7700_REG_OFFSET_SPLL1_SSC 0x24
> +#define EIC7700_REG_OFFSET_SPLL2_CFG_0 0x28
> +#define EIC7700_REG_OFFSET_SPLL2_CFG_1 0x2C
> +#define EIC7700_REG_OFFSET_SPLL2_CFG_2 0x30
> +#define EIC7700_REG_OFFSET_SPLL2_DSKEWCAL 0x34
> +#define EIC7700_REG_OFFSET_SPLL2_SSC 0x38
> +#define EIC7700_REG_OFFSET_VPLL_CFG_0 0x3C
> +#define EIC7700_REG_OFFSET_VPLL_CFG_1 0x40
> +#define EIC7700_REG_OFFSET_VPLL_CFG_2 0x44
> +#define EIC7700_REG_OFFSET_VPLL_DSKEWCAL 0x48
> +#define EIC7700_REG_OFFSET_VPLL_SSC 0x4C
> +#define EIC7700_REG_OFFSET_APLL_CFG_0 0x50
> +#define EIC7700_REG_OFFSET_APLL_CFG_1 0x54
> +#define EIC7700_REG_OFFSET_APLL_CFG_2 0x58
> +#define EIC7700_REG_OFFSET_APLL_DSKEWCAL 0x5C
> +#define EIC7700_REG_OFFSET_APLL_SSC 0x60
> +#define EIC7700_REG_OFFSET_MCPUT_PLL_CFG_0 0x64
> +#define EIC7700_REG_OFFSET_MCPUT_PLL_CFG_1 0x68
> +#define EIC7700_REG_OFFSET_MCPUT_PLL_CFG_2 0x6C
> +#define EIC7700_REG_OFFSET_MCPUT_PLL_DSKEWCAL 0x70
> +#define EIC7700_REG_OFFSET_MCPUT_PLL_SSC 0x74
> +#define EIC7700_REG_OFFSET_DDRT_PLL_CFG_0 0x78
> +#define EIC7700_REG_OFFSET_DDRT_PLL_CFG_1 0x7C
> +#define EIC7700_REG_OFFSET_DDRT_PLL_CFG_2 0x80
> +#define EIC7700_REG_OFFSET_DDRT_PLL_DSKEWCAL 0x84
> +#define EIC7700_REG_OFFSET_DDRT_PLL_SSC 0x88
> +#define EIC7700_REG_OFFSET_PLL_STATUS 0xA4
> +#define EIC7700_REG_OFFSET_NOC_CTRL 0x100
> +#define EIC7700_REG_OFFSET_BOOTSPI_CTRL 0x104
> +#define EIC7700_REG_OFFSET_BOOTSPI_CFGCLK_CTRL 0x108
> +#define EIC7700_REG_OFFSET_SCPU_CORE_CTRL 0x10C
> +#define EIC7700_REG_OFFSET_SCPU_BUSCLK_CTRL 0x110
> +#define EIC7700_REG_OFFSET_LPCPU_CORE_CTRL 0x114
> +#define EIC7700_REG_OFFSET_LPCPU_BUSCLK_CTRL 0x118
> +#define EIC7700_REG_OFFSET_TCU_ACLK_CTRL 0x11C
> +#define EIC7700_REG_OFFSET_TCU_CFG_CTRL 0x120
> +#define EIC7700_REG_OFFSET_DDR_CTRL 0x124
> +#define EIC7700_REG_OFFSET_DDR1_CTRL 0x128
> +#define EIC7700_REG_OFFSET_GPU_ACLK_CTRL 0x12C
> +#define EIC7700_REG_OFFSET_GPU_CFG_CTRL 0x130
> +#define EIC7700_REG_OFFSET_GPU_GRAY_CTRL 0x134
> +#define EIC7700_REG_OFFSET_DSP_ACLK_CTRL 0x138
> +#define EIC7700_REG_OFFSET_DSP_CFG_CTRL 0x13C
> +#define EIC7700_REG_OFFSET_D2D_ACLK_CTRL 0x140
> +#define EIC7700_REG_OFFSET_D2D_CFG_CTRL 0x144
> +#define EIC7700_REG_OFFSET_HSP_ACLK_CTRL 0x148
> +#define EIC7700_REG_OFFSET_HSP_CFG_CTRL 0x14C
> +#define EIC7700_REG_OFFSET_SATA_RBC_CTRL 0x150
> +#define EIC7700_REG_OFFSET_SATA_OOB_CTRL 0x154
> +#define EIC7700_REG_OFFSET_ETH0_CTRL 0x158
> +#define EIC7700_REG_OFFSET_ETH1_CTRL 0x15C
> +#define EIC7700_REG_OFFSET_MSHC0_CORE_CTRL 0x160
> +#define EIC7700_REG_OFFSET_MSHC1_CORE_CTRL 0x164
> +#define EIC7700_REG_OFFSET_MSHC2_CORE_CTRL 0x168
> +#define EIC7700_REG_OFFSET_MSHC_USB_SLWCLK 0x16C
> +#define EIC7700_REG_OFFSET_PCIE_ACLK_CTRL 0x170
> +#define EIC7700_REG_OFFSET_PCIE_CFG_CTRL 0x174
> +#define EIC7700_REG_OFFSET_NPU_ACLK_CTRL 0x178
> +#define EIC7700_REG_OFFSET_NPU_LLC_CTRL 0x17C
> +#define EIC7700_REG_OFFSET_NPU_CORE_CTRL 0x180
> +#define EIC7700_REG_OFFSET_VI_DWCLK_CTRL 0x184
> +#define EIC7700_REG_OFFSET_VI_ACLK_CTRL 0x188
> +#define EIC7700_REG_OFFSET_VI_DIG_ISP_CTRL 0x18C
> +#define EIC7700_REG_OFFSET_VI_DVP_CTRL 0x190
> +#define EIC7700_REG_OFFSET_VI_SHUTTER0 0x194
> +#define EIC7700_REG_OFFSET_VI_SHUTTER1 0x198
> +#define EIC7700_REG_OFFSET_VI_SHUTTER2 0x19C
> +#define EIC7700_REG_OFFSET_VI_SHUTTER3 0x1A0
> +#define EIC7700_REG_OFFSET_VI_SHUTTER4 0x1A4
> +#define EIC7700_REG_OFFSET_VI_SHUTTER5 0x1A8
> +#define EIC7700_REG_OFFSET_VI_PHY_CTRL 0x1AC
> +#define EIC7700_REG_OFFSET_VO_ACLK_CTRL 0x1B0
> +#define EIC7700_REG_OFFSET_VO_IESMCLK_CTRL 0x1B4
> +#define EIC7700_REG_OFFSET_VO_PIXEL_CTRL 0x1B8
> +#define EIC7700_REG_OFFSET_VO_MCLK_CTRL 0x1BC
> +#define EIC7700_REG_OFFSET_VO_PHY_CLKCTRL 0x1C0
> +#define EIC7700_REG_OFFSET_VC_ACLK_CTRL 0x1C4
> +#define EIC7700_REG_OFFSET_VCDEC_ROOT_CTRL 0x1C8
> +#define EIC7700_REG_OFFSET_G2D_CTRL 0x1CC
> +#define EIC7700_REG_OFFSET_VC_CLKEN_CTRL 0x1D0
> +#define EIC7700_REG_OFFSET_JE_CTRL 0x1D4
> +#define EIC7700_REG_OFFSET_JD_CTRL 0x1D8
> +#define EIC7700_REG_OFFSET_VD_CTRL 0x1DC
> +#define EIC7700_REG_OFFSET_VE_CTRL 0x1E0
> +#define EIC7700_REG_OFFSET_AON_DMA_CTRL 0x1E4
> +#define EIC7700_REG_OFFSET_TIMER_CTRL 0x1E8
> +#define EIC7700_REG_OFFSET_RTC_CTRL 0x1EC
> +#define EIC7700_REG_OFFSET_PKA_CTRL 0x1F0
> +#define EIC7700_REG_OFFSET_SPACC_CTRL 0x1F4
> +#define EIC7700_REG_OFFSET_TRNG_CTRL 0x1F8
> +#define EIC7700_REG_OFFSET_OTP_CTRL 0x1FC
> +#define EIC7700_REG_OFFSET_LSP_EN0 0x200
> +#define EIC7700_REG_OFFSET_LSP_EN1 0x204
> +#define EIC7700_REG_OFFSET_U84_CTRL 0x208
> +#define EIC7700_REG_OFFSET_SYSCFG_CTRL 0x20C
> +#define EIC7700_REG_OFFSET_I2C0_CTRL 0x210
> +#define EIC7700_REG_OFFSET_I2C1_CTRL 0x214
> +
> +#endif /* __CLK_EIC7700_H__ */
> diff --git a/drivers/clk/eswin/clk.c b/drivers/clk/eswin/clk.c
> new file mode 100644
> index 000000000000..d05cdc82c0a1
> --- /dev/null
> +++ b/drivers/clk/eswin/clk.c
> @@ -0,0 +1,396 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * Copyright 2025, Beijing ESWIN Computing Technology Co., Ltd..
> + * All rights reserved.
> + *
> + * Authors:
> + * Yifeng Huang <huangyifeng@eswincomputing.com>
> + * Xuyang Dong <dongxuyang@eswincomputing.com>
> + */
> +
> +#include <linux/clk.h>
> +#include <linux/clk-provider.h>
> +#include <linux/delay.h>
> +#include <linux/io.h>
> +#include <linux/math.h>
> +#include <linux/slab.h>
> +
> +#include "clk.h"
> +
> +struct eswin_clock_data *eswin_clk_init(struct device *dev, int nr_clks)
> +{
> + struct eswin_clock_data *eclk_data;
> +
> + eclk_data = devm_kzalloc(dev, struct_size(eclk_data, clk_data.hws,
> + nr_clks), GFP_KERNEL);
> + if (!eclk_data)
> + return NULL;
> +
> + eclk_data->base = devm_of_iomap(dev, dev->of_node, 0, NULL);
> + if (IS_ERR(eclk_data->base)) {
> + dev_err(dev, "failed to map clock registers\n");
> + return NULL;
> + }
> +
> + eclk_data->clk_data.num = nr_clks;
> + /* Avoid returning NULL for unused id */
> + memset_p((void **)eclk_data->clk_data.hws, ERR_PTR(-ENOENT), nr_clks);
> + spin_lock_init(&eclk_data->lock);
> +
> + return eclk_data;
> +}
> +
> +/**
> + * eswin_calc_pll - calculate PLL values
> + * @frac_val: fractional divider
> + * @fbdiv_val: feedback divider
> + * @rate: reference rate
> + *
> + * Calculate PLL values for frac and fbdiv
> + */
> +static void eswin_calc_pll(u32 *frac_val, u32 *fbdiv_val, u64 rate)
> +{
> + u64 rem = 0;
> + u32 tmp1 = 0, tmp2 = 0;
> +
> + rate = rate * 4;
> + rem = do_div(rate, 1000);
> + if (rem)
> + tmp1 = rem;
> +
> + rem = do_div(rate, 1000);
> + if (rem)
> + tmp2 = rem;
> +
> + rem = do_div(rate, 24);
> + /* fbdiv = rate * 4 / 24000000 */
> + *fbdiv_val = rate;
> + /* frac = rate * 4 % 24000000 * (2 ^ 24) */
> + *frac_val = (u64)((1000 * (1000 * rem + tmp2) + tmp1) << 24) / 24
> + / 1000000;
> +}
> +
> +static inline struct eswin_clk_pll *to_pll_clk(struct clk_hw *hw)
> +{
> + return container_of(hw, struct eswin_clk_pll, hw);
> +}
> +
> +static int clk_pll_set_rate(struct clk_hw *hw, unsigned long rate,
> + unsigned long parent_rate)
> +{
> + struct eswin_clk_pll *clk = to_pll_clk(hw);
> + u32 postdiv1_val = 0, refdiv_val = 1;
> + u32 frac_val, fbdiv_val, val;
> + bool lock_flag = false;
> + int try_count = 0;
> +
> + eswin_calc_pll(&frac_val, &fbdiv_val, (u64)rate);
> +
> + /* First, disable pll */
> + val = readl_relaxed(clk->ctrl_reg0);
> + val &= ~(((1 << clk->pllen_width) - 1) << clk->pllen_shift);
> + val |= 0 << clk->pllen_shift;
> + writel_relaxed(val, clk->ctrl_reg0);
> +
> + val = readl_relaxed(clk->ctrl_reg0);
> + val &= ~(((1 << clk->fbdiv_width) - 1) << clk->fbdiv_shift);
> + val &= ~(((1 << clk->refdiv_width) - 1) << clk->refdiv_shift);
> + val |= refdiv_val << clk->refdiv_shift;
> + val |= fbdiv_val << clk->fbdiv_shift;
> + writel_relaxed(val, clk->ctrl_reg0);
> +
> + val = readl_relaxed(clk->ctrl_reg1);
> + val &= ~(((1 << clk->frac_width) - 1) << clk->frac_shift);
> + val |= frac_val << clk->frac_shift;
> + writel_relaxed(val, clk->ctrl_reg1);
> +
> + val = readl_relaxed(clk->ctrl_reg2);
> + val &= ~(((1 << clk->postdiv1_width) - 1) << clk->postdiv1_shift);
> + val |= postdiv1_val << clk->postdiv1_shift;
> + writel_relaxed(val, clk->ctrl_reg2);
> +
> + /* Last, enable pll */
> + val = readl_relaxed(clk->ctrl_reg0);
> + val &= ~(((1 << clk->pllen_width) - 1) << clk->pllen_shift);
> + val |= 1 << clk->pllen_shift;
> + writel_relaxed(val, clk->ctrl_reg0);
> +
> + /* Usually the pll will lock in 50us */
> + do {
> + usleep_range(refdiv_val * 80, refdiv_val * 80 * 2);
> + val = readl_relaxed(clk->status_reg);
> + if (val & 1 << clk->lock_shift) {
> + lock_flag = true;
> + break;
> + }
> + } while (try_count++ < 10);
> +
> + if (!lock_flag) {
> + pr_err("failed to lock the cpu pll!\n");
> + return -EBUSY;
> + }
> +
> + return 0;
> +}
> +
> +static unsigned long clk_pll_recalc_rate(struct clk_hw *hw,
> + unsigned long parent_rate)
> +{
> + struct eswin_clk_pll *clk = to_pll_clk(hw);
> + u64 fbdiv_val, frac_val, rate, rem, tmp;
> + u32 val;
> +
> + val = readl_relaxed(clk->ctrl_reg0);
> + val = val >> clk->fbdiv_shift;
> + val &= ((1 << clk->fbdiv_width) - 1);
> + fbdiv_val = val;
> +
> + val = readl_relaxed(clk->ctrl_reg1);
> + val = val >> clk->frac_shift;
> + val &= ((1 << clk->frac_width) - 1);
> + frac_val = val;
> +
> + /* rate = 24000000 * (fbdiv + frac / (2 ^ 24)) / 4 */
> + tmp = 1000 * frac_val;
> + rem = do_div(tmp, BIT(24));
> + if (rem)
> + rate = (u64)(6000 * (1000 * fbdiv_val + tmp) +
> + ((6000 * rem) >> 24) + 1);
> + else
> + rate = (u64)(6000 * 1000 * fbdiv_val);
> +
> + return rate;
> +}
> +
> +static int clk_pll_determine_rate(struct clk_hw *hw,
> + struct clk_rate_request *req)
> +{
> + struct eswin_clk_pll *clk = to_pll_clk(hw);
> +
> + req->rate = clamp(req->rate, clk->min_rate, clk->max_rate);
> + req->min_rate = clk->min_rate;
> + req->max_rate = clk->max_rate;
> +
> + return 0;
> +}
> +
> +int eswin_clk_register_fixed_rate(const struct eswin_fixed_rate_clock *clks,
> + int nums, struct eswin_clock_data *data,
> + struct device *dev)
> +{
> + struct clk_hw *clk_hw;
> + int i;
> +
> + for (i = 0; i < nums; i++) {
> + clk_hw = devm_clk_hw_register_fixed_rate(dev, clks[i].name,
> + clks[i].parent_name,
> + clks[i].flags,
> + clks[i].rate);
> + if (IS_ERR(clk_hw))
> + return dev_err_probe(dev, PTR_ERR(clk_hw),
> + "failed to register clock\n");
> +
> + data->clk_data.hws[clks[i].id] = clk_hw;
> + }
> +
> + return 0;
> +}
> +
> +static const struct clk_ops eswin_clk_pll_ops = {
> + .set_rate = clk_pll_set_rate,
> + .recalc_rate = clk_pll_recalc_rate,
> + .determine_rate = clk_pll_determine_rate,
> +};
> +
> +int eswin_clk_register_pll(const struct eswin_pll_clock *clks, int nums,
> + struct eswin_clock_data *data, struct device *dev)
> +{
> + struct eswin_clk_pll *p_clk = NULL;
> + struct clk_init_data init;
> + struct clk_hw *clk_hw;
> + int i, ret;
> +
> + p_clk = devm_kzalloc(dev, sizeof(*p_clk) * nums, GFP_KERNEL);
> + if (!p_clk)
> + return -ENOMEM;
> +
> + for (i = 0; i < nums; i++) {
> + p_clk->id = clks[i].id;
> + p_clk->ctrl_reg0 = data->base + clks[i].ctrl_reg0;
> + p_clk->pllen_shift = clks[i].pllen_shift;
> + p_clk->pllen_width = clks[i].pllen_width;
> + p_clk->refdiv_shift = clks[i].refdiv_shift;
> + p_clk->refdiv_width = clks[i].refdiv_width;
> + p_clk->fbdiv_shift = clks[i].fbdiv_shift;
> + p_clk->fbdiv_width = clks[i].fbdiv_width;
> +
> + p_clk->ctrl_reg1 = data->base + clks[i].ctrl_reg1;
> + p_clk->frac_shift = clks[i].frac_shift;
> + p_clk->frac_width = clks[i].frac_width;
> +
> + p_clk->ctrl_reg2 = data->base + clks[i].ctrl_reg2;
> + p_clk->postdiv1_shift = clks[i].postdiv1_shift;
> + p_clk->postdiv1_width = clks[i].postdiv1_width;
> + p_clk->postdiv2_shift = clks[i].postdiv2_shift;
> + p_clk->postdiv2_width = clks[i].postdiv2_width;
> +
> + p_clk->status_reg = data->base + clks[i].status_reg;
> + p_clk->lock_shift = clks[i].lock_shift;
> + p_clk->lock_width = clks[i].lock_width;
> +
> + p_clk->max_rate = clks[i].max_rate;
> + p_clk->min_rate = clks[i].min_rate;
> +
> + init.name = clks[i].name;
> + init.flags = 0;
> + init.parent_names = clks[i].parent_name ?
> + &clks[i].parent_name : NULL;
> + init.num_parents = clks[i].parent_name ? 1 : 0;
> + init.ops = &eswin_clk_pll_ops;
> + p_clk->hw.init = &init;
> +
> + clk_hw = &p_clk->hw;
> + ret = devm_clk_hw_register(dev, clk_hw);
> + if (ret)
> + return dev_err_probe(dev, ret,
> + "failed to register clock\n");
> +
> + data->clk_data.hws[clks[i].id] = clk_hw;
> + p_clk++;
> + }
> +
> + return 0;
> +}
> +
> +int eswin_clk_register_fixed_factor(const struct eswin_fixed_factor_clock *clks,
> + int nums, struct eswin_clock_data *data,
> + struct device *dev)
> +{
> + struct clk_hw *clk_hw;
> + int i;
> +
> + for (i = 0; i < nums; i++) {
> + clk_hw = devm_clk_hw_register_fixed_factor(dev, clks[i].name,
> + clks[i].parent_name,
> + clks[i].flags,
> + clks[i].mult,
> + clks[i].div);
> + if (IS_ERR(clk_hw))
> + return dev_err_probe(dev, PTR_ERR(clk_hw),
> + "failed to register clock\n");
> +
> + data->clk_data.hws[clks[i].id] = clk_hw;
> + }
> +
> + return 0;
> +}
> +
> +int eswin_clk_register_mux(const struct eswin_mux_clock *clks, int nums,
> + struct eswin_clock_data *data, struct device *dev)
> +{
> + struct clk_hw *clk_hw;
> + int i;
> +
> + for (i = 0; i < nums; i++) {
> + clk_hw = devm_clk_hw_register_mux(dev, clks[i].name,
> + clks[i].parent_names,
> + clks[i].num_parents,
> + clks[i].flags,
> + data->base + clks[i].offset,
> + clks[i].shift,
> + clks[i].width,
> + clks[i].mux_flags,
> + &data->lock);
> + if (IS_ERR(clk_hw))
> + return dev_err_probe(dev, PTR_ERR(clk_hw),
> + "failed to register clock\n");
> +
> + data->clk_data.hws[clks[i].id] = clk_hw;
> + }
> +
> + return 0;
> +}
> +
> +int eswin_clk_register_mux_tbl(const struct eswin_mux_clock *clks,
> + int nums, struct eswin_clock_data *data,
> + struct device *dev)
> +{
> + struct clk_hw *clk_hw;
> + int i;
> +
> + for (i = 0; i < nums; i++) {
> + clk_hw = clk_hw_register_mux_table(dev, clks[i].name,
> + clks[i].parent_names,
> + clks[i].num_parents,
> + clks[i].flags,
> + data->base + clks[i].offset,
> + clks[i].shift,
> + BIT(clks[i].width) - 1,
> + clks[i].mux_flags,
> + clks[i].table, &data->lock);
> +
> + if (IS_ERR(clk_hw)) {
> + while (i--)
> + clk_hw_unregister_mux
> + (data->clk_data.hws[clks[i].id]);
> + return dev_err_probe(dev, PTR_ERR(clk_hw),
> + "failed to register clock\n");
> + }
> +
> + data->clk_data.hws[clks[i].id] = clk_hw;
> + }
> +
> + return 0;
> +}
> +
> +int eswin_clk_register_divider(const struct eswin_divider_clock *clks,
> + int nums, struct eswin_clock_data *data,
> + struct device *dev)
> +{
> + struct clk_hw *clk_hw;
> + int i;
> +
> + for (i = 0; i < nums; i++) {
> + clk_hw = devm_clk_hw_register_divider(dev, clks[i].name,
> + clks[i].parent_name,
> + clks[i].flags,
> + data->base +
> + clks[i].offset,
> + clks[i].shift,
> + clks[i].width,
> + clks[i].div_flags,
> + &data->lock);
> + if (IS_ERR(clk_hw))
> + return dev_err_probe(dev, PTR_ERR(clk_hw),
> + "failed to register clock\n");
> +
> + data->clk_data.hws[clks[i].id] = clk_hw;
> + }
> +
> + return 0;
> +}
> +
> +int eswin_clk_register_gate(const struct eswin_gate_clock *clks, int nums,
> + struct eswin_clock_data *data, struct device *dev)
> +{
> + struct clk_hw *clk_hw;
> + int i;
> +
> + for (i = 0; i < nums; i++) {
> + clk_hw = devm_clk_hw_register_gate(dev, clks[i].name,
> + clks[i].parent_name,
> + clks[i].flags,
> + data->base + clks[i].offset,
> + clks[i].bit_idx,
> + clks[i].gate_flags,
> + &data->lock);
> +
> + if (IS_ERR(clk_hw))
> + return dev_err_probe(dev, PTR_ERR(clk_hw),
> + "failed to register clock\n");
> +
> + data->clk_data.hws[clks[i].id] = clk_hw;
> + }
> +
> + return 0;
> +}
> diff --git a/drivers/clk/eswin/clk.h b/drivers/clk/eswin/clk.h
> new file mode 100644
> index 000000000000..e6e0682ff39c
> --- /dev/null
> +++ b/drivers/clk/eswin/clk.h
> @@ -0,0 +1,266 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
> +/*
> + * Copyright 2025, Beijing ESWIN Computing Technology Co., Ltd..
> + * All rights reserved.
> + *
> + * Authors:
> + * Yifeng Huang <huangyifeng@eswincomputing.com>
> + * Xuyang Dong <dongxuyang@eswincomputing.com>
> + */
> +
> +#ifndef __ESWIN_CLK_H__
> +#define __ESWIN_CLK_H__
> +
> +#include <linux/clk-provider.h>
> +#include <linux/platform_device.h>
> +#include <linux/spinlock.h>
> +
> +#define APLL_HIGH_FREQ 983040000
> +#define APLL_LOW_FREQ 225792000
> +#define PLL_HIGH_FREQ 1800000000
> +#define PLL_LOW_FREQ 24000000
> +
> +struct eswin_clock_data {
> + void __iomem *base;
> + struct clk_hw *original_clk;
> + struct notifier_block pll_nb;
> + spinlock_t lock; /* protect register read-modify-write cycle */
> + struct clk_hw_onecell_data clk_data;
> +};
> +
> +struct eswin_divider_clock {
> + unsigned int id;
> + const char *name;
> + const char *parent_name;
> + unsigned long flags;
> + unsigned long offset;
> + u8 shift;
> + u8 width;
> + u8 div_flags;
> +};
> +
> +struct eswin_fixed_rate_clock {
> + unsigned int id;
> + char *name;
> + const char *parent_name;
> + unsigned long flags;
> + unsigned long rate;
> +};
> +
> +struct eswin_fixed_factor_clock {
> + unsigned int id;
> + char *name;
> + const char *parent_name;
> + unsigned long mult;
> + unsigned long div;
> + unsigned long flags;
> +};
> +
> +struct eswin_gate_clock {
> + unsigned int id;
> + const char *name;
> + const char *parent_name;
> + unsigned long flags;
> + unsigned long offset;
> + u8 bit_idx;
> + u8 gate_flags;
> +};
> +
> +struct eswin_mux_clock {
> + unsigned int id;
> + const char *name;
> + const char *const *parent_names;
> + u8 num_parents;
> + unsigned long flags;
> + unsigned long offset;
> + u8 shift;
> + u8 width;
> + u8 mux_flags;
> + u32 *table;
> +};
> +
> +struct eswin_pll_clock {
> + u32 id;
> + const char *name;
> + const char *parent_name;
> + const u32 ctrl_reg0;
> + const u8 pllen_shift;
> + const u8 pllen_width;
> + const u8 refdiv_shift;
> + const u8 refdiv_width;
> + const u8 fbdiv_shift;
> + const u8 fbdiv_width;
> +
> + const u32 ctrl_reg1;
> + const u8 frac_shift;
> + const u8 frac_width;
> +
> + const u32 ctrl_reg2;
> + const u8 postdiv1_shift;
> + const u8 postdiv1_width;
> + const u8 postdiv2_shift;
> + const u8 postdiv2_width;
> +
> + const u32 status_reg;
> + const u8 lock_shift;
> + const u8 lock_width;
> +
> + const u64 max_rate;
> + const u64 min_rate;
> +};
> +
> +struct eswin_clk_pll {
> + struct clk_hw hw;
> + u32 id;
> + void __iomem *ctrl_reg0;
> + u8 pllen_shift;
> + u8 pllen_width;
> + u8 refdiv_shift;
> + u8 refdiv_width;
> + u8 fbdiv_shift;
> + u8 fbdiv_width;
> +
> + void __iomem *ctrl_reg1;
> + u8 frac_shift;
> + u8 frac_width;
> +
> + void __iomem *ctrl_reg2;
> + u8 postdiv1_shift;
> + u8 postdiv1_width;
> + u8 postdiv2_shift;
> + u8 postdiv2_width;
> +
> + void __iomem *status_reg;
> + u8 lock_shift;
> + u8 lock_width;
> +
> + u64 max_rate;
> + u64 min_rate;
> +};
> +
> +struct eswin_clock_data *eswin_clk_init(struct device *dev, int nr_clks);
> +int eswin_clk_register_fixed_rate(const struct eswin_fixed_rate_clock *clks,
> + int nums, struct eswin_clock_data *data,
> + struct device *dev);
> +int eswin_clk_register_pll(const struct eswin_pll_clock *clks, int nums,
> + struct eswin_clock_data *data, struct device *dev);
> +int eswin_clk_register_fixed_factor(const struct eswin_fixed_factor_clock *clks,
> + int nums, struct eswin_clock_data *data,
> + struct device *dev);
> +int eswin_clk_register_mux(const struct eswin_mux_clock *clks, int nums,
> + struct eswin_clock_data *data, struct device *dev);
> +int eswin_clk_register_mux_tbl(const struct eswin_mux_clock *clks,
> + int nums, struct eswin_clock_data *data,
> + struct device *dev);
> +int eswin_clk_register_divider(const struct eswin_divider_clock *clks,
> + int nums, struct eswin_clock_data *data,
> + struct device *dev);
> +int eswin_clk_register_gate(const struct eswin_gate_clock *clks, int nums,
> + struct eswin_clock_data *data, struct device *dev);
> +
> +#define PNAME(x) static const char *const x[] __initconst
> +
> +#define EIC7700_DIV(_id, _name, _pname, _flags, _offset, _shift, _width, \
> + _dflags) \
> + { \
> + .id = _id, \
> + .name = _name, \
> + .parent_name = _pname, \
> + .flags = _flags, \
> + .offset = _offset, \
> + .shift = _shift, \
> + .width = _width, \
> + .div_flags = _dflags, \
> + }
> +
> +#define EIC7700_FACTOR(_id, _name, _pname, _mult, _div, _flags) \
> + { \
> + .id = _id, \
> + .name = _name, \
> + .parent_name = _pname, \
> + .mult = _mult, \
> + .div = _div, \
> + .flags = _flags, \
> + }
> +
> +#define EIC7700_FIXED(_id, _name, _pname, _flags, _rate) \
> +{ \
> + .id = _id, \
> + .name = _name, \
> + .parent_name = _pname, \
> + .flags = _flags, \
> + .rate = _rate, \
> +}
> +
> +#define EIC7700_GATE(_id, _name, _pname, _flags, _offset, _idx, _gflags) \
> + { \
> + .id = _id, \
> + .name = _name, \
> + .parent_name = _pname, \
> + .flags = _flags, \
> + .offset = _offset, \
> + .bit_idx = _idx, \
> + .gate_flags = _gflags, \
> + }
> +
> +#define EIC7700_MUX(_id, _name, _pnames, _num_parents, _flags, _offset, \
> + _shift, _width, _mflags) \
> + { \
> + .id = _id, \
> + .name = _name, \
> + .parent_names = _pnames, \
> + .num_parents = _num_parents, \
> + .flags = _flags, \
> + .offset = _offset, \
> + .shift = _shift, \
> + .width = _width, \
> + .mux_flags = _mflags, \
> + }
> +
> +#define EIC7700_MUX_TBL(_id, _name, _pnames, _num_parents, _flags, _offset, \
> + _shift, _width, _mflags, _table) \
> + { \
> + .id = _id, \
> + .name = _name, \
> + .parent_names = _pnames, \
> + .num_parents = _num_parents, \
> + .flags = _flags, \
> + .offset = _offset, \
> + .shift = _shift, \
> + .width = _width, \
> + .mux_flags = _mflags, \
> + .table = _table, \
> + }
> +
> +#define EIC7700_PLL(_id, _name, _pname, _reg0, _en_shift, _en_width, \
> + _ref_shift, _ref_width, _fb_shift, _fb_width, _reg1,\
> + _frac_shift, _frac_width, _reg2, _post1_shift, \
> + _post1_width, _post2_shift, _post2_width, _reg, \
> + _lock_shift, _lock_width, _max_rate, _min_rate) \
> + { \
> + .id = _id, \
> + .name = _name, \
> + .parent_name = _pname, \
> + .ctrl_reg0 = _reg0, \
> + .pllen_shift = _en_shift, \
> + .pllen_width = _en_width, \
> + .refdiv_shift = _ref_shift, \
> + .refdiv_width = _ref_width, \
> + .fbdiv_shift = _fb_shift, \
> + .fbdiv_width = _fb_width, \
> + .ctrl_reg1 = _reg1, \
> + .frac_shift = _frac_shift, \
> + .frac_width = _frac_width, \
> + .ctrl_reg2 = _reg2, \
> + .postdiv1_shift = _post1_shift, \
> + .postdiv1_width = _post1_width, \
> + .postdiv2_shift = _post2_shift, \
> + .postdiv2_width = _post2_width, \
> + .status_reg = _reg, \
> + .lock_shift = _lock_shift, \
> + .lock_width = _lock_width, \
> + .max_rate = _max_rate, \
> + .min_rate = _min_rate, \
> + }
> +
> +#endif /* __ESWIN_CLK_H__ */
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Re: [PATCH v9 2/3] clock: eswin: Add eic7700 clock driver
2025-12-31 9:34 ` Marcel Ziswiler
@ 2026-01-04 3:23 ` Xuyang Dong
2026-01-05 22:15 ` Marcel Ziswiler
0 siblings, 1 reply; 7+ messages in thread
From: Xuyang Dong @ 2026-01-04 3:23 UTC (permalink / raw)
To: Marcel Ziswiler, mturquette, sboyd, robh, krzk+dt, conor+dt,
linux-clk, devicetree, linux-kernel, troy.mitchell, bmasney
Cc: ningyu, linmin, huangyifeng, pinkesh.vaghela, ganboing
> > +
> > +/* divider clocks */
> > +static struct eswin_divider_clock eic7700_div_clks[] = {
> > + EIC7700_DIV(EIC7700_CLK_DIV_SYS_CFG_DYNM, "divider_sys_cfg_div_dynm",
> > + "fixed_rate_clk_spll0_fout3", 0,
> > + EIC7700_REG_OFFSET_SYSCFG_CTRL, 4, 3,
> > + CLK_DIVIDER_ONE_BASED),
> > + EIC7700_DIV(EIC7700_CLK_DIV_NOC_NSP_DYNM, "divider_noc_nsp_div_dynm",
> > + "fixed_rate_clk_spll2_fout1", 0,
> > + EIC7700_REG_OFFSET_NOC_CTRL, 0, 3, CLK_DIVIDER_ONE_BASED),
> > + EIC7700_DIV(EIC7700_CLK_DIV_BOOTSPI_DYNM, "divider_bootspi_div_dynm",
> > + "gate_clk_spll0_fout2", 0, EIC7700_REG_OFFSET_BOOTSPI_CTRL,
> > + 4, 6, CLK_DIVIDER_ONE_BASED),
> > + EIC7700_DIV(EIC7700_CLK_DIV_SCPU_CORE_DYNM,
> > + "divider_scpu_core_div_dynm", "fixed_rate_clk_spll0_fout1",
> > + 0, EIC7700_REG_OFFSET_SCPU_CORE_CTRL, 4, 4,
> > + CLK_DIVIDER_ONE_BASED),
> > + EIC7700_DIV(EIC7700_CLK_DIV_LPCPU_CORE_DYNM,
> > + "divider_lpcpu_core_div_dynm", "fixed_rate_clk_spll0_fout1",
> > + 0, EIC7700_REG_OFFSET_LPCPU_CORE_CTRL, 4, 4,
> > + CLK_DIVIDER_ONE_BASED),
>
> During testing on top of next-20251219 I got the following:
>
> [ 0.126102] divider_lpcpu_core_div_dynm: Zero divisor and CLK_DIVIDER_ALLOW_ZERO not set
> [ 0.126194] WARNING: drivers/clk/clk-divider.c:145 at divider_recalc_rate+0x8a/0x9c, CPU#0: swapper/0/1
>
> Therefore I suggest for above line needing to be:
>
> + CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO),
Hi Marcel,
Thank you! This is indeed a bug and will be fixed in the next version.
Could you please share the detailed testing methods with me so that I
can reproduce this issue on my side?
Best regards,
Xuyang Dong
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Re: [PATCH v9 2/3] clock: eswin: Add eic7700 clock driver
2026-01-04 3:23 ` Xuyang Dong
@ 2026-01-05 22:15 ` Marcel Ziswiler
0 siblings, 0 replies; 7+ messages in thread
From: Marcel Ziswiler @ 2026-01-05 22:15 UTC (permalink / raw)
To: Xuyang Dong, mturquette, sboyd, robh, krzk+dt, conor+dt,
linux-clk, devicetree, linux-kernel, troy.mitchell, bmasney
Cc: ningyu, linmin, huangyifeng, pinkesh.vaghela, ganboing
Hi Xuyang Dong
On Sun, 2026-01-04 at 11:23 +0800, Xuyang Dong wrote:
> > > +
> > > +/* divider clocks */
> > > +static struct eswin_divider_clock eic7700_div_clks[] = {
> > > + EIC7700_DIV(EIC7700_CLK_DIV_SYS_CFG_DYNM, "divider_sys_cfg_div_dynm",
> > > + "fixed_rate_clk_spll0_fout3", 0,
> > > + EIC7700_REG_OFFSET_SYSCFG_CTRL, 4, 3,
> > > + CLK_DIVIDER_ONE_BASED),
> > > + EIC7700_DIV(EIC7700_CLK_DIV_NOC_NSP_DYNM, "divider_noc_nsp_div_dynm",
> > > + "fixed_rate_clk_spll2_fout1", 0,
> > > + EIC7700_REG_OFFSET_NOC_CTRL, 0, 3, CLK_DIVIDER_ONE_BASED),
> > > + EIC7700_DIV(EIC7700_CLK_DIV_BOOTSPI_DYNM, "divider_bootspi_div_dynm",
> > > + "gate_clk_spll0_fout2", 0, EIC7700_REG_OFFSET_BOOTSPI_CTRL,
> > > + 4, 6, CLK_DIVIDER_ONE_BASED),
> > > + EIC7700_DIV(EIC7700_CLK_DIV_SCPU_CORE_DYNM,
> > > + "divider_scpu_core_div_dynm", "fixed_rate_clk_spll0_fout1",
> > > + 0, EIC7700_REG_OFFSET_SCPU_CORE_CTRL, 4, 4,
> > > + CLK_DIVIDER_ONE_BASED),
> > > + EIC7700_DIV(EIC7700_CLK_DIV_LPCPU_CORE_DYNM,
> > > + "divider_lpcpu_core_div_dynm", "fixed_rate_clk_spll0_fout1",
> > > + 0, EIC7700_REG_OFFSET_LPCPU_CORE_CTRL, 4, 4,
> > > + CLK_DIVIDER_ONE_BASED),
> >
> > During testing on top of next-20251219 I got the following:
> >
> > [ 0.126102] divider_lpcpu_core_div_dynm: Zero divisor and CLK_DIVIDER_ALLOW_ZERO not set
> > [ 0.126194] WARNING: drivers/clk/clk-divider.c:145 at divider_recalc_rate+0x8a/0x9c, CPU#0: swapper/0/1
> >
> > Therefore I suggest for above line needing to be:
> >
> > + CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO),
>
> Hi Marcel,
>
> Thank you! This is indeed a bug and will be fixed in the next version.
> Could you please share the detailed testing methods with me so that I
> can reproduce this issue on my side?
Sure, this was first tested on top of next-20251219, then I re-based it on top of next-20260105 and finally I
ported it to v6.19-rc4 as part of the yocto project integration for the eswin-ebc77-mainline machine [1].
I will further refine this for one of my talks at FOSDEM'26 [2].
Let me know if you have any further questions.
Thanks!
[1] https://github.com/ziswiler/meta-riscv/tree/add-eswin-ebc77-support
[2] https://fosdem.org/2026/schedule/event/LX3NNU-upstream-embedded-linux-on-risc-v-sbcs
> Best regards,
> Xuyang Dong
Cheers
Marcel
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2026-01-05 22:16 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-12-29 10:58 [PATCH v9 0/3] Add driver support for ESWIN eic700 SoC clock controller dongxuyang
2025-12-29 10:59 ` [PATCH v9 1/3] dt-bindings: clock: eswin: Documentation for eic7700 SoC dongxuyang
2025-12-29 10:59 ` [PATCH v9 2/3] clock: eswin: Add eic7700 clock driver dongxuyang
2025-12-31 9:34 ` Marcel Ziswiler
2026-01-04 3:23 ` Xuyang Dong
2026-01-05 22:15 ` Marcel Ziswiler
2025-12-29 11:00 ` [PATCH v9 3/3] MAINTAINERS: Add entry for ESWIN EIC7700 " dongxuyang
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).